import django.core.exceptions from netfields import rest_framework as netfields_rf from rest_framework import serializers from desecapi.models import Token, TokenDomainPolicy class TokenSerializer(serializers.ModelSerializer): allowed_subnets = serializers.ListField( child=netfields_rf.CidrAddressField(), required=False ) token = serializers.ReadOnlyField(source="plain") is_valid = serializers.ReadOnlyField() class Meta: model = Token fields = ( "id", "created", "last_used", "max_age", "max_unused_period", "name", "perm_manage_tokens", "allowed_subnets", "is_valid", "token", ) read_only_fields = ("id", "created", "last_used", "token") def __init__(self, *args, include_plain=False, **kwargs): self.include_plain = include_plain return super().__init__(*args, **kwargs) def get_fields(self): fields = super().get_fields() if not self.include_plain: fields.pop("token") return fields class DomainSlugRelatedField(serializers.SlugRelatedField): def get_queryset(self): return self.context["request"].user.domains class TokenDomainPolicySerializer(serializers.ModelSerializer): domain = DomainSlugRelatedField(allow_null=True, slug_field="name") class Meta: model = TokenDomainPolicy fields = ( "domain", "perm_dyndns", "perm_rrsets", ) def to_internal_value(self, data): return { **super().to_internal_value(data), "token": self.context["request"].user.token_set.get( id=self.context["view"].kwargs["token_id"] ), } def save(self, **kwargs): try: return super().save(**kwargs) except django.core.exceptions.ValidationError as exc: raise serializers.ValidationError(exc.message_dict, code="precedence")