from django.contrib.auth.models import User from django.db import transaction from django.utils import timezone from rest_framework import serializers from .models import Invitation class UserSerializer(serializers.ModelSerializer): is_admin = serializers.SerializerMethodField() class Meta: model = User fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_admin', 'date_joined'] def get_is_admin(self, obj): return obj.is_superuser or obj.is_staff class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) invite = serializers.UUIDField(write_only=True) class Meta: model = User fields = ['username', 'password', 'email', 'first_name', 'last_name', 'invite'] def validate_invite(self, value): try: invitation = Invitation.objects.get(token=value) except Invitation.DoesNotExist as error: raise serializers.ValidationError('Ce lien d’invitation est invalide.') from error if not invitation.is_valid: raise serializers.ValidationError('Ce lien d’invitation est expire ou deja utilise.') return value def create(self, validated_data): invitation_token = validated_data.pop('invite') with transaction.atomic(): invitation = Invitation.objects.select_for_update().get(token=invitation_token) if not invitation.is_valid: raise serializers.ValidationError({'invite': 'Ce lien d’invitation est expire ou deja utilise.'}) user = User.objects.create_user(**validated_data) invitation.used_at = timezone.now() invitation.save(update_fields=['used_at']) return user