jumpserver/apps/common/drf/fields.py

62 lines
1.6 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
#
2022-08-09 08:53:43 +00:00
import six
2020-07-20 02:42:22 +00:00
2022-08-09 08:53:43 +00:00
from rest_framework.fields import ChoiceField
from rest_framework import serializers
2020-07-20 02:42:22 +00:00
from common.utils import decrypt_password
2020-07-20 02:42:22 +00:00
__all__ = [
2022-08-09 08:53:43 +00:00
'ReadableHiddenField', 'EncryptedField', 'ChoiceDisplayField'
]
# ReadableHiddenField
# -------------------
class ReadableHiddenField(serializers.HiddenField):
""" 可读的 HiddenField """
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.write_only = False
def to_representation(self, value):
if hasattr(value, 'id'):
return getattr(value, 'id')
return value
class EncryptedField(serializers.CharField):
2022-05-17 11:34:15 +00:00
def __init__(self, write_only=None, **kwargs):
if write_only is None:
write_only = True
kwargs['write_only'] = write_only
2022-05-13 09:10:29 +00:00
super().__init__(**kwargs)
def to_internal_value(self, value):
value = super().to_internal_value(value)
return decrypt_password(value)
2022-08-09 08:53:43 +00:00
class ChoiceDisplayField(ChoiceField):
def __init__(self, *args, **kwargs):
super(ChoiceDisplayField, self).__init__(*args, **kwargs)
self.choice_mapper = {
six.text_type(key): value for key, value in self.choices.items()
}
def to_representation(self, value):
if value in ('', None):
return value
return {
2022-08-18 09:58:59 +00:00
'value': value,
2022-08-09 08:53:43 +00:00
'label': self.choice_mapper.get(six.text_type(value), value),
}
def to_internal_value(self, data):
if isinstance(data, dict):
return data.get('value')
return super(ChoiceDisplayField, self).to_internal_value(data)