from rest_framework import serializers from userausfall.models import TrustBridge, User from userausfall.views import get_authenticated_user class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ["id", "trust_bridge", "url"] class ActivateUserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ["id", "password", "url"] def validate(self, data): if not hasattr(self.instance, "trust_bridge") or not self.instance.trust_bridge.is_trusted: raise serializers.ValidationError("User has no trusted trust bridge") return data def validate_password(self, value): if not self.instance.check_password(value): raise serializers.ValidationError("Password does not match the user's password") return value class TrustBridgeUserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ["id", "url", "username"] # the UniqueValidator for username prevents successful validation for existing users extra_kwargs = {"username": {"validators": []}} class TrustBridgeSerializer(serializers.HyperlinkedModelSerializer): trust_giver = TrustBridgeUserSerializer() class Meta: model = TrustBridge fields = ["id", "is_trusted", "trust_giver", "url"] read_only_fields = ["is_trusted"] def create(self, validated_data): user = get_authenticated_user(self.context["request"]) trust_giver, _ = User.objects.get_or_create(username=validated_data["trust_giver"]["username"]) return TrustBridge.objects.create(trust_taker=user, trust_giver=trust_giver)