serializers.py 2.9 KB

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