tokens.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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(
  7. child=netfields_rf.CidrAddressField(), required=False
  8. )
  9. token = serializers.ReadOnlyField(source="plain")
  10. is_valid = serializers.ReadOnlyField()
  11. class Meta:
  12. model = Token
  13. fields = (
  14. "id",
  15. "created",
  16. "last_used",
  17. "max_age",
  18. "max_unused_period",
  19. "name",
  20. "perm_manage_tokens",
  21. "allowed_subnets",
  22. "is_valid",
  23. "token",
  24. )
  25. read_only_fields = ("id", "created", "last_used", "token")
  26. def __init__(self, *args, include_plain=False, **kwargs):
  27. self.include_plain = include_plain
  28. return super().__init__(*args, **kwargs)
  29. def get_fields(self):
  30. fields = super().get_fields()
  31. if not self.include_plain:
  32. fields.pop("token")
  33. return fields
  34. class DomainSlugRelatedField(serializers.SlugRelatedField):
  35. def get_queryset(self):
  36. return self.context["request"].user.domains
  37. class TokenDomainPolicySerializer(serializers.ModelSerializer):
  38. domain = DomainSlugRelatedField(allow_null=True, slug_field="name")
  39. class Meta:
  40. model = TokenDomainPolicy
  41. fields = (
  42. "domain",
  43. "perm_dyndns",
  44. "perm_rrsets",
  45. )
  46. def to_internal_value(self, data):
  47. return {
  48. **super().to_internal_value(data),
  49. "token": self.context["request"].user.token_set.get(
  50. id=self.context["view"].kwargs["token_id"]
  51. ),
  52. }
  53. def save(self, **kwargs):
  54. try:
  55. return super().save(**kwargs)
  56. except django.core.exceptions.ValidationError as exc:
  57. raise serializers.ValidationError(exc.message_dict, code="precedence")