-
Jonas Braathen authoredJonas Braathen authored
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",)