tokens.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import django.core.exceptions
  2. from netfields import rest_framework as netfields_rf
  3. from rest_framework import serializers
  4. from desecapi.models import Token, TokenDomainPolicy
  5. class TokenSerializer(serializers.ModelSerializer):
  6. allowed_subnets = serializers.ListField(child=netfields_rf.CidrAddressField(), required=False)
  7. token = serializers.ReadOnlyField(source='plain')
  8. is_valid = serializers.ReadOnlyField()
  9. class Meta:
  10. model = Token
  11. fields = ('id', 'created', 'last_used', 'max_age', 'max_unused_period', 'name', 'perm_manage_tokens',
  12. 'allowed_subnets', 'is_valid', 'token',)
  13. read_only_fields = ('id', 'created', 'last_used', 'token')
  14. def __init__(self, *args, include_plain=False, **kwargs):
  15. self.include_plain = include_plain
  16. return super().__init__(*args, **kwargs)
  17. def get_fields(self):
  18. fields = super().get_fields()
  19. if not self.include_plain:
  20. fields.pop('token')
  21. return fields
  22. class DomainSlugRelatedField(serializers.SlugRelatedField):
  23. def get_queryset(self):
  24. return self.context['request'].user.domains
  25. class TokenDomainPolicySerializer(serializers.ModelSerializer):
  26. domain = DomainSlugRelatedField(allow_null=True, slug_field='name')
  27. class Meta:
  28. model = TokenDomainPolicy
  29. fields = ('domain', 'perm_dyndns', 'perm_rrsets',)
  30. def to_internal_value(self, data):
  31. return {**super().to_internal_value(data),
  32. 'token': self.context['request'].user.token_set.get(id=self.context['view'].kwargs['token_id'])}
  33. def save(self, **kwargs):
  34. try:
  35. return super().save(**kwargs)
  36. except django.core.exceptions.ValidationError as exc:
  37. raise serializers.ValidationError(exc.message_dict, code='precedence')