diff --git a/gregui/api/serializers/guest.py b/gregui/api/serializers/guest.py index 20a8759264756d36d231509342a3e864af683a46..b9081db704835ca41bd166b3828f3efab511ef11 100644 --- a/gregui/api/serializers/guest.py +++ b/gregui/api/serializers/guest.py @@ -1,13 +1,24 @@ from rest_framework import serializers from greg.models import Identity, Person +from greg.utils import is_valid_norwegian_national_id_number + + +def _validateNorwegianNationalIdNumber(value): + # Not excepted that D-numbers will be entered through the form, so only + # accept national ID numbers + if not is_valid_norwegian_national_id_number(value, False): + raise serializers.ValidationError("Not a valid Norwegian national ID number") class GuestRegisterSerializer(serializers.ModelSerializer): - first_name = serializers.CharField(required=True) - last_name = serializers.CharField(required=True) + first_name = serializers.CharField(required=False) + last_name = serializers.CharField(required=False) email = serializers.CharField(required=True) mobile_phone = serializers.CharField(required=True) + fnr = serializers.CharField( + required=False, validators=[_validateNorwegianNationalIdNumber] + ) def update(self, instance, validated_data): email = validated_data.pop("email") @@ -20,8 +31,15 @@ class GuestRegisterSerializer(serializers.ModelSerializer): value=email, ) else: - instance.private_email.value = email - instance.private_email.save() + # Only expecting one private e-mail + private_email = Identity.objects.get( + person_id=instance.id, type=Identity.IdentityType.PRIVATE_EMAIL + ) + private_email.value = email + private_email.save() + # TODO Figure out why the following did not work + # instance.private_email.value = email + # instance.private_email.save() if not instance.private_mobile: Identity.objects.create( @@ -33,6 +51,18 @@ class GuestRegisterSerializer(serializers.ModelSerializer): instance.private_mobile.value = mobile_phone instance.private_mobile.save() + if "fnr" in validated_data: + fnr = validated_data.pop("fnr") + if not instance.fnr: + Identity.objects.create( + person=instance, + type=Identity.IdentityType.NORWEGIAN_NATIONAL_ID_NUMBER, + value=fnr, + ) + else: + instance.fnr.value = fnr + instance.fnr.value.save() + # TODO: we only want to allow changing the name if we don't have one # from a reliable source (Feide/KORR) instance.first_name = validated_data["first_name"] @@ -42,5 +72,5 @@ class GuestRegisterSerializer(serializers.ModelSerializer): class Meta: model = Person - fields = ("id", "first_name", "last_name", "email", "mobile_phone") + fields = ("id", "first_name", "last_name", "email", "mobile_phone", "fnr") read_only_fields = ("id",)