tokens.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import django.core.exceptions
  2. from netfields.rest_framework import CidrAddressField
  3. from rest_framework import serializers
  4. from desecapi.models import Token, TokenDomainPolicy
  5. class TokenSerializer(serializers.ModelSerializer):
  6. allowed_subnets = serializers.ListField(child=CidrAddressField(), required=False)
  7. token = serializers.ReadOnlyField(source="plain")
  8. is_valid = serializers.ReadOnlyField()
  9. class Meta:
  10. model = Token
  11. fields = (
  12. "id",
  13. "created",
  14. "last_used",
  15. "max_age",
  16. "max_unused_period",
  17. "name",
  18. "perm_manage_tokens",
  19. "allowed_subnets",
  20. "is_valid",
  21. "token",
  22. )
  23. read_only_fields = ("id", "created", "last_used", "token")
  24. def __init__(self, *args, include_plain=False, **kwargs):
  25. self.include_plain = include_plain
  26. super().__init__(*args, **kwargs)
  27. def get_fields(self):
  28. fields = super().get_fields()
  29. if not self.include_plain:
  30. fields.pop("token")
  31. return fields
  32. class DomainSlugRelatedField(serializers.SlugRelatedField):
  33. def get_queryset(self):
  34. return self.context["request"].user.domains
  35. class TokenDomainPolicySerializer(serializers.ModelSerializer):
  36. domain = DomainSlugRelatedField(allow_null=True, slug_field="name")
  37. class Meta:
  38. model = TokenDomainPolicy
  39. fields = (
  40. "id",
  41. "domain",
  42. "subname",
  43. "type",
  44. "perm_write",
  45. )
  46. extra_kwargs = {
  47. "subname": {"required": True},
  48. "type": {"required": True},
  49. }
  50. def to_internal_value(self, data):
  51. return {
  52. **super().to_internal_value(data),
  53. # TODO may raise Token.DoesNotExist
  54. "token": self.context["request"].user.token_set.get(
  55. id=self.context["view"].kwargs["token_id"]
  56. ),
  57. }
  58. def save(self, **kwargs):
  59. try:
  60. return super().save(**kwargs)
  61. except django.core.exceptions.ValidationError as exc:
  62. raise serializers.ValidationError(exc.message_dict, code="precedence")