ConceptPortal-public/rsconcept/backend/apps/users/serializers.py

165 lines
5.1 KiB
Python
Raw Normal View History

2023-12-26 14:23:51 +03:00
''' Serializers: User profile and Authorization. '''
2023-07-15 17:46:19 +03:00
from django.contrib.auth import authenticate
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from apps.library.models import Editor
2024-07-19 19:29:27 +03:00
from shared import messages as msg
2024-05-24 18:31:14 +03:00
from . import models
2023-07-15 17:46:19 +03:00
class NonFieldErrorSerializer(serializers.Serializer):
''' Serializer: list of non-field errors. '''
non_field_errors = serializers.ListField(
child=serializers.CharField()
)
2023-07-15 17:46:19 +03:00
class LoginSerializer(serializers.Serializer):
2023-12-26 14:23:51 +03:00
''' Serializer: User authentication by login/password. '''
2023-07-15 17:46:19 +03:00
username = serializers.CharField(
label='Имя пользователя',
write_only=True
)
password = serializers.CharField(
label='Пароль',
style={'input_type': 'password'},
trim_whitespace=False,
write_only=True
)
def validate(self, attrs):
2024-05-28 15:29:35 +03:00
username = attrs['username']
if '@' in username:
user = models.User.objects.filter(email=username)
if not user.exists() or user.count() > 1:
raise serializers.ValidationError(
msg.passwordAuthFailed(),
code='authorization'
)
username = user.first().username
password = attrs['password']
authenticated = authenticate(
2023-07-27 22:04:25 +03:00
request=self.context.get('request'),
username=username,
password=password
)
2024-05-28 15:29:35 +03:00
if not authenticated:
raise serializers.ValidationError(
msg.passwordAuthFailed(),
code='authorization'
)
2024-05-28 15:29:35 +03:00
attrs['user'] = authenticated
2023-07-15 17:46:19 +03:00
return attrs
2023-08-26 17:26:49 +03:00
class AuthSerializer(serializers.Serializer):
2023-12-26 14:23:51 +03:00
''' Serializer: Authorization data. '''
id = serializers.IntegerField()
username = serializers.CharField()
is_staff = serializers.BooleanField()
2023-08-26 17:26:49 +03:00
def to_representation(self, instance: models.User) -> dict:
if instance.is_anonymous:
return {
'id': None,
'username': '',
'is_staff': False,
2024-06-03 01:17:27 +03:00
'editor': []
2023-08-26 17:26:49 +03:00
}
else:
return {
'id': instance.pk,
'username': instance.username,
'is_staff': instance.is_staff,
2024-06-03 01:17:27 +03:00
'editor': [edit.item.pk for edit in Editor.objects.filter(editor=instance)]
2023-08-26 17:26:49 +03:00
}
2023-07-15 17:46:19 +03:00
class UserInfoSerializer(serializers.ModelSerializer):
''' Serializer: User data. '''
2023-07-15 17:46:19 +03:00
class Meta:
''' serializer metadata. '''
2023-07-15 17:46:19 +03:00
model = models.User
fields = [
'id',
'first_name',
'last_name',
]
class UserSerializer(serializers.ModelSerializer):
''' Serializer: User data. '''
2023-07-15 17:46:19 +03:00
id = serializers.IntegerField(read_only=True)
class Meta:
''' serializer metadata. '''
2023-07-15 17:46:19 +03:00
model = models.User
fields = [
'id',
'username',
'email',
'first_name',
'last_name',
]
def validate(self, attrs):
attrs = super().validate(attrs)
if 'email' in attrs:
maybe_user = models.User.objects.filter(email=attrs['email'])
if maybe_user.exists():
if maybe_user.count() > 1 or maybe_user.first().pk != self.context['request'].user.pk:
raise serializers.ValidationError({
'email': msg.emailAlreadyTaken()
})
return attrs
2023-08-10 13:53:19 +03:00
class ChangePasswordSerializer(serializers.Serializer):
''' Serializer: Change password. '''
2023-08-10 13:53:19 +03:00
old_password = serializers.CharField(required=True)
new_password = serializers.CharField(required=True)
2023-07-15 17:46:19 +03:00
class SignupSerializer(serializers.ModelSerializer):
''' Serializer: Create user profile. '''
2023-07-15 17:46:19 +03:00
id = serializers.IntegerField(read_only=True)
password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
password2 = serializers.CharField(write_only=True, required=True)
class Meta:
''' serializer metadata. '''
2023-07-15 17:46:19 +03:00
model = models.User
fields = [
'id',
'username',
'email',
'first_name',
'last_name',
'password',
'password2'
]
def validate(self, attrs):
if attrs['password'] != attrs['password2']:
raise serializers.ValidationError({
'password': msg.passwordsNotMatch()
})
if models.User.objects.filter(email=attrs['email']).exists():
raise serializers.ValidationError({
'email': msg.emailAlreadyTaken()
})
2023-07-15 17:46:19 +03:00
return attrs
def create(self, validated_data):
user = models.User.objects.create_user(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password']
2023-07-15 17:46:19 +03:00
)
user.first_name = validated_data['first_name']
user.last_name = validated_data['last_name']
user.save()
return user