serializers.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from rest_framework import serializers
  2. from desecapi.models import Domain, Donation, User, RRset
  3. from djoser import serializers as djoserSerializers
  4. import json
  5. class JSONSerializer(serializers.Field):
  6. def to_representation(self, obj):
  7. return json.loads(obj)
  8. def to_internal_value(self, data):
  9. return json.dumps(data)
  10. class RecordsSerializer(JSONSerializer):
  11. def to_internal_value(self, records):
  12. if isinstance(records, str) or not all(isinstance(record, str) for record in records):
  13. msg = 'Incorrect type. Expected a list of strings'
  14. raise serializers.ValidationError(msg)
  15. # https://lists.isc.org/pipermail/bind-users/2008-April/070148.html
  16. if not len(records) < 4092:
  17. msg = 'Records too long. Must be less than 4092 characters, but was %d'
  18. raise serializers.ValidationError(msg % len(records))
  19. return super().to_internal_value(records)
  20. class GenericRRsetSerializer(serializers.ModelSerializer):
  21. subname = serializers.CharField(allow_blank=True, required=False)
  22. type = serializers.CharField(required=False)
  23. records = RecordsSerializer()
  24. class Meta:
  25. model = RRset
  26. fields = ('domain', 'subname', 'name', 'records', 'ttl', 'type',)
  27. class RRsetSerializer(GenericRRsetSerializer):
  28. # The value of this field is set in RRsetList.perform_create()
  29. domain = serializers.SlugRelatedField(read_only=True, slug_field='name')
  30. class DomainSerializer(serializers.ModelSerializer):
  31. owner = serializers.ReadOnlyField(source='owner.email')
  32. name = serializers.RegexField(regex=r'^[A-Za-z0-9_.-]+$', trim_whitespace=False)
  33. class Meta:
  34. model = Domain
  35. fields = ('name', 'owner', 'arecord', 'aaaarecord', 'created', 'updated', 'acme_challenge')
  36. read_only_fields = ('created', 'updated',)
  37. class DonationSerializer(serializers.ModelSerializer):
  38. class Meta:
  39. model = Donation
  40. fields = ('name', 'iban', 'bic', 'amount', 'message', 'email')
  41. class UserSerializer(djoserSerializers.UserSerializer):
  42. class Meta(djoserSerializers.UserSerializer.Meta):
  43. fields = tuple(User.REQUIRED_FIELDS) + (
  44. User.USERNAME_FIELD,
  45. )
  46. class UserRegistrationSerializer(djoserSerializers.UserRegistrationSerializer):
  47. class Meta(djoserSerializers.UserRegistrationSerializer.Meta):
  48. fields = tuple(User.REQUIRED_FIELDS) + (
  49. User.USERNAME_FIELD,
  50. 'password',
  51. )