Skip to content
Snippets Groups Projects
invitation.py 2.18 KiB
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",)