class WriteOnlyFieldsSerializer(serializers.ModelSerializer): form_titles = { 'table': 'Write only fields list', 'new': 'New write only fields object', 'edit': 'Editing write only fields object', } regex_field = fields.CharField(label='Hidden', write_only=True) choice_field = fields.CharField(label='Shown', write_only=True, display=DisplayMode.FULL) class Meta: model = AdvancedFields fields = ('id', 'regex_field', 'choice_field')
class RelationSerializer(serializers.ModelSerializer): form_titles = { 'table': 'Relation fields list', 'new': 'New relation object', 'edit': 'Editing relation object', } name = fields.CharField() class Meta: model = Relation exclude = ()
class BasicFieldsSerializer(serializers.ModelSerializer): form_titles = { 'table': 'Basic fields list', 'new': 'New basic fields object', 'edit': 'Editing basic fields object', } form_template = 'examples/form_cols.html' actions = Actions(TableAction(TablePosition.HEADER, _('Modal dialog'), title=_('Dialog test'), name='modal_dialog', action_js="examples.testModalDialog();"), add_default_crud=True, add_form_buttons=True) boolean_field = fields.BooleanField() nullboolean_field = fields.NullBooleanField() char_field = fields.CharField() email_field = fields.EmailField() slug_field = fields.SlugField() url_field = fields.URLField() uuid_field = fields.UUIDField() ipaddress_field = fields.IPAddressField() integer_field = fields.IntegerField() nullint_field = fields.IntegerField(allow_null=True) float_field = fields.FloatField() decimal_field = fields.DecimalField(max_digits=5, decimal_places=2) datetime_field = fields.DateTimeField(required=False) date_field = fields.DateField() time_field = fields.TimeField() duration_field = fields.DurationField() password_field = fields.CharField(password_field=True) class Meta: model = BasicFields exclude = ()
class UserSerializer(serializers.ModelSerializer): form_template = 'usereditor/user_item.html' form_titles = { 'table': _('Users'), 'new': _('New user'), 'edit': _('Editing user'), } actions = Actions(add_default_crud=True, add_default_filter=True) show_filter = True password = fields.CharField(label=_('Password'), write_only=True, display_table=fields.DisplayMode.SUPPRESS) full_name = fields.SerializerMethodField(label=_('Full name'), read_only=True, display_form=fields.DisplayMode.SUPPRESS) username = fields.CharField(label=_('Username'), display_table=fields.DisplayMode.SUPPRESS) email = UserEmailField(label=_('Email'), source='*', required=False, allow_blank=True) email_verified = fields.SerializerMethodField(display_table=fields.DisplayMode.SUPPRESS) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def suppress_action(self, action, request, viewset): if request and request.user and not request.user.is_staff and action.name in ('add', 'edit', 'delete'): return True return super().suppress_action(action, request, viewset) def get_email(self, obj): email = None if hasattr(obj, 'emailaddress_set'): for e in obj.emailaddress_set.all(): if e.verified and (not email or e.email == obj.email): # email mora biti verificiran, da povozi onega iz userja, # če pa je še enak za povrh, je pa sploh super email = e if email: return email.email, email.verified return None, False def get_full_name(self, obj): if not obj.id: return '' return obj.get_full_name() def validate(self, attrs): res = super().validate(attrs) email = attrs.get('email', None) if not email: return res from allauth.account.models import EmailAddress from rest_framework.exceptions import ValidationError qry = EmailAddress.objects.filter(email=email) if self.instance: qry = qry.exclude(user=self.instance) if qry.exists(): raise ValidationError(dict(email=_('This e-mail address is already associated with another account.'))) return res @transaction.atomic def create(self, validated_data): res = super().create(validated_data) self.update_user_settings(res, validated_data) return res @transaction.atomic def update(self, instance, validated_data): # noinspection PyTypeChecker self.update_user_settings(instance, validated_data) return super().update(instance, validated_data) @staticmethod def update_user_settings(instance, validated_data, *args, **kwargs): from allauth.account.models import EmailAddress email = validated_data.get('email', None) if email and not EmailAddress.objects.filter(user=instance, email=email).exists(): EmailAddress.objects.filter(user=instance).update(primary=False) EmailAddress.objects.create(user=instance, email=email, primary=True, verified=False) def get_email_verified(self, rec): return self.get_email(rec)[1] class Meta: model = get_user_model() fields = ('id', 'full_name', 'username', 'password', 'first_name', 'last_name', 'is_staff', 'is_superuser', 'is_active', 'email', 'email_verified') changed_flds = { 'id': dict(display=DisplayMode.HIDDEN), } for f in ['first_name', 'last_name', 'is_superuser', 'is_active']: # type: fields.RenderMixin changed_flds[f] = dict(display_table=DisplayMode.SUPPRESS)