import datetime from django.conf import settings from django.db import transaction from django.utils import timezone from rest_framework import serializers from greg.models import Invitation, InvitationLink, Person, Role, Identity from greg.utils import is_identity_duplicate from gregui.api.serializers.identity import IdentityDuplicateError from gregui.api.serializers.role import InviteRoleSerializerUi from gregui.models import GregUserProfile class InviteGuestSerializer(serializers.ModelSerializer): email = serializers.EmailField(required=True) role = InviteRoleSerializerUi(required=True) uuid = serializers.UUIDField(read_only=True) def create(self, validated_data): email = validated_data.pop("email") role_data = validated_data.pop("role") user = GregUserProfile.objects.get(user=self.context["request"].user) # Create objects with transaction.atomic(): person = Person.objects.create(**validated_data) Identity.objects.create( person=person, type=Identity.IdentityType.PRIVATE_EMAIL, value=email, source=settings.DEFAULT_IDENTITY_SOURCE, ) role_data["person"] = person role_data["sponsor"] = user.sponsor role = Role.objects.create(**role_data) invitation = Invitation.objects.create(role=role) InvitationLink.objects.create( invitation=invitation, expire=timezone.now() + datetime.timedelta(days=30), ) return person def validate_email(self, email): # The e-mail in the invite is the private e-mail if is_identity_duplicate(Identity.IdentityType.PRIVATE_EMAIL, email): raise IdentityDuplicateError( Identity.IdentityType.PRIVATE_EMAIL, "duplicate_private_email" ) # Return the validated data return email class Meta: model = Person fields = ( "id", "first_name", "last_name", "email", "date_of_birth", "role", "uuid", ) read_only_field = ("uuid",)