47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
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
|