jumpserver/apps/assets/serializers/account/account.py

96 lines
3.2 KiB
Python
Raw Normal View History

2022-08-24 08:36:42 +00:00
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from common.drf.serializers import SecretReadableMixin
2022-09-13 13:18:04 +00:00
from common.drf.fields import ObjectRelatedField
from assets.models import Account, AccountTemplate, Asset
2022-09-06 11:57:03 +00:00
from assets.serializers.base import AuthValidateMixin
from .common import AccountFieldsSerializerMixin
2022-09-06 11:57:03 +00:00
class AccountSerializerCreateMixin(serializers.ModelSerializer):
template = serializers.UUIDField(
required=False, allow_null=True, write_only=True,
label=_('Account template')
)
2022-09-13 13:07:20 +00:00
push_now = serializers.BooleanField(
default=False, label=_("Push now"), write_only=True
)
2022-09-06 11:57:03 +00:00
@staticmethod
def validate_template(value):
try:
2022-09-19 09:00:03 +00:00
return AccountTemplate.objects.get(id=value)
2022-09-06 11:57:03 +00:00
except AccountTemplate.DoesNotExist:
raise serializers.ValidationError(_('Account template not found'))
@staticmethod
def replace_attrs(account_template: AccountTemplate, attrs: dict):
exclude_fields = [
2022-09-19 09:00:03 +00:00
'_state', 'org_id', 'id', 'date_created', 'date_updated'
2022-09-06 11:57:03 +00:00
]
2022-09-19 09:00:03 +00:00
template_attrs = {
k: v for k, v in account_template.__dict__.items()
if k not in exclude_fields
}
2022-09-06 11:57:03 +00:00
for k, v in template_attrs.items():
attrs.setdefault(k, v)
def validate(self, attrs):
account_template = attrs.pop('template', None)
if account_template:
self.replace_attrs(account_template, attrs)
2022-09-13 13:07:20 +00:00
self.push_now = attrs.pop('push_now', False)
2022-09-06 11:57:03 +00:00
return super().validate(attrs)
2022-09-13 13:07:20 +00:00
def create(self, validated_data):
instance = super().create(validated_data)
if self.push_now:
# Todo: push it
2022-09-19 09:00:03 +00:00
print("Start push account to asset")
2022-09-13 13:07:20 +00:00
return instance
2022-09-06 11:57:03 +00:00
2022-09-19 09:00:03 +00:00
class AccountSerializer(
AuthValidateMixin, AccountSerializerCreateMixin,
AccountFieldsSerializerMixin, BulkOrgResourceModelSerializer
):
asset = ObjectRelatedField(
required=False, queryset=Asset.objects,
label=_('Asset'), attrs=('id', 'name', 'ip')
)
platform = serializers.ReadOnlyField(label=_("Platform"))
2022-09-06 11:57:03 +00:00
class Meta(AccountFieldsSerializerMixin.Meta):
2022-07-15 10:03:32 +00:00
model = Account
2022-09-06 11:57:03 +00:00
fields = AccountFieldsSerializerMixin.Meta.fields \
2022-09-13 13:07:20 +00:00
+ ['template', 'push_now']
2022-02-15 02:46:16 +00:00
@classmethod
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
2022-09-14 12:55:14 +00:00
queryset = queryset.prefetch_related('asset')
return queryset
class AccountSecretSerializer(SecretReadableMixin, AccountSerializer):
class Meta(AccountSerializer.Meta):
fields_backup = [
2022-08-11 07:45:03 +00:00
'name', 'ip', 'platform', 'protocols', 'username', 'password',
'private_key', 'public_key', 'date_created', 'date_updated', 'version'
]
extra_kwargs = {
'password': {'write_only': False},
'private_key': {'write_only': False},
'public_key': {'write_only': False},
}
class AccountTaskSerializer(serializers.Serializer):
ACTION_CHOICES = (
('test', 'test'),
)
action = serializers.ChoiceField(choices=ACTION_CHOICES, write_only=True)
task = serializers.CharField(read_only=True)