serializers.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from rest_framework import serializers
  2. from desecapi.models import Domain, Donation, User, RR, RRset
  3. from djoser import serializers as djoserSerializers
  4. class RRSerializer(serializers.ModelSerializer):
  5. class Meta:
  6. model = RR
  7. fields = ('content',)
  8. class RRsetSerializer(serializers.ModelSerializer):
  9. domain = serializers.StringRelatedField()
  10. subname = serializers.CharField(allow_blank=True, required=False)
  11. type = serializers.CharField(required=False)
  12. records = serializers.SerializerMethodField()
  13. class Meta:
  14. model = RRset
  15. fields = ('domain', 'subname', 'name', 'records', 'ttl', 'type',)
  16. def _inject_records_data(self, validated_data):
  17. records_data = [{'content': x}
  18. for x in self.context['request'].data['records']]
  19. rrs = RRSerializer(data=records_data, many=True, allow_empty=False)
  20. if not rrs.is_valid():
  21. errors = rrs.errors
  22. if 'non_field_errors' in errors:
  23. errors['records'] = errors.pop('non_field_errors')
  24. raise serializers.ValidationError(errors)
  25. return {'records_data': rrs.validated_data, **validated_data}
  26. def create(self, validated_data):
  27. validated_data = self._inject_records_data(validated_data)
  28. return super().create(validated_data)
  29. def update(self, instance, validated_data):
  30. validated_data = self._inject_records_data(validated_data)
  31. return super().update(instance, validated_data)
  32. def get_records(self, obj):
  33. return list(obj.records.values_list('content', flat=True))
  34. def validate_type(self, value):
  35. if value in RRset.RESTRICTED_TYPES:
  36. raise serializers.ValidationError(
  37. "You cannot tinker with the %s RRset." % value)
  38. return value
  39. class DomainSerializer(serializers.ModelSerializer):
  40. owner = serializers.ReadOnlyField(source='owner.email')
  41. name = serializers.RegexField(regex=r'^[A-Za-z0-9_.-]+$', trim_whitespace=False)
  42. class Meta:
  43. model = Domain
  44. fields = ('name', 'owner', 'keys')
  45. class DonationSerializer(serializers.ModelSerializer):
  46. class Meta:
  47. model = Donation
  48. fields = ('name', 'iban', 'bic', 'amount', 'message', 'email')
  49. class UserSerializer(djoserSerializers.UserSerializer):
  50. class Meta(djoserSerializers.UserSerializer.Meta):
  51. fields = tuple(User.REQUIRED_FIELDS) + (
  52. User.USERNAME_FIELD,
  53. )
  54. class UserRegistrationSerializer(djoserSerializers.UserRegistrationSerializer):
  55. class Meta(djoserSerializers.UserRegistrationSerializer.Meta):
  56. fields = tuple(User.REQUIRED_FIELDS) + (
  57. User.USERNAME_FIELD,
  58. 'password',
  59. 'dyn',
  60. )