/
Codename-Nik
/
WebApp
Обзор
Документация
Войти
/
Codename-Nik
/
WebApp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
backend/api/serializers.py
160 строк
6 KB
Nikolay Pokhodnya
first commit
03 ноя 2025, 19:47
03 ноя 2025, 19:47
a9fbdee
Код
Авторство
О чём код?
from rest_framework import serializers from django.contrib.auth import get_user_model from django.contrib.auth.password_validation import validate_password from django.db.models import Q from django.utils.timezone import now, timedelta from .models import Invitation, Task, Project, Comment User = get_user_model() class UserRegistrationSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True, required=True, validators=[validate_password]) password2 = serializers.CharField(write_only=True, required=True) class Meta: model = User fields = ('username', 'email', 'password', 'password2', 'first_name', 'last_name') def validate(self, attrs): if attrs['password'] != attrs['password2']: raise serializers.ValidationError({"password": "Password fields didn't match."}) if User.objects.filter(email=attrs['email']).exists(): raise serializers.ValidationError({"email": "User with this email already exists."}) return attrs def create(self, validated_data): validated_data.pop('password2') user = User.objects.create_user(**validated_data) return user class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email', 'first_name', 'last_name', 'bio', 'avatar', 'created_at') class UserProfileUpdateSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('first_name', 'last_name', 'email', 'bio') class ProjectSerializer(serializers.ModelSerializer): owner = UserSerializer(read_only=True) member_count = serializers.SerializerMethodField() task_count = serializers.SerializerMethodField() class Meta: model = Project fields = '__all__' read_only_fields = ('owner', 'created_at', 'updated_at') def get_member_count(self, obj): return obj.members.count() def get_task_count(self, obj): return obj.tasks.count() def create(self, validated_data): validated_data['owner'] = self.context['request'].user return super().create(validated_data) class ProjectCreateSerializer(serializers.ModelSerializer): class Meta: model = Project fields = ('name', 'description', 'color') def validate_name(self, value): if not value.strip(): raise serializers.ValidationError("Project name cannot be empty") return value class CommentSerializer(serializers.ModelSerializer): author = UserSerializer(read_only=True) author_id = serializers.HiddenField(default=serializers.CurrentUserDefault()) class Meta: model = Comment fields = '__all__' read_only_fields = ('created_at', 'updated_at') class TaskListSerializer(serializers.ModelSerializer): project_name = serializers.CharField(source='project.name', read_only=True) assigned_to_name = serializers.CharField(source='assigned_to.get_full_name', read_only=True) created_by_name = serializers.CharField(source='created_by.get_full_name', read_only=True) comment_count = serializers.SerializerMethodField() class Meta: model = Task fields = ('id', 'title', 'status', 'priority', 'due_date', 'project', 'project_name', 'assigned_to', 'assigned_to_name', 'created_by', 'created_by_name', 'created_at', 'comment_count') def get_comment_count(self, obj): return obj.comments.count() class TaskDetailSerializer(serializers.ModelSerializer): project = ProjectSerializer(read_only=True) assigned_to = UserSerializer(read_only=True) created_by = UserSerializer(read_only=True) comments = CommentSerializer(many=True, read_only=True) class Meta: model = Task fields = '__all__' read_only_fields = ('created_by', 'created_at', 'updated_at') class TaskCreateSerializer(serializers.ModelSerializer): class Meta: model = Task fields = ('title', 'description', 'status', 'priority', 'due_date', 'project', 'assigned_to') def validate_title(self, value): if not value.strip(): raise serializers.ValidationError("Title cannot be empty") return value class UserListSerializer(serializers.ModelSerializer): full_name = serializers.SerializerMethodField() class Meta: model = User fields = ('id', 'username', 'email', 'first_name', 'last_name', 'full_name') def get_full_name(self, obj): return f"{obj.first_name} {obj.last_name}".strip() or obj.username class InvitationSerializer(serializers.ModelSerializer): project_name = serializers.CharField(source='project.name', read_only=True) invited_by_name = serializers.CharField(source='invited_by.get_full_name', read_only=True) is_expired = serializers.BooleanField(read_only=True) class Meta: model = Invitation fields = '__all__' read_only_fields = ('token', 'invited_by', 'created_at', 'expires_at', 'status') class InvitationCreateSerializer(serializers.ModelSerializer): class Meta: model = Invitation fields = ('email', 'project') def validate(self, attrs): email = attrs['email'] project = attrs['project'] if self.context['request'].user.email == email: raise serializers.ValidationError({"email": "Вы не можете пригласить самого себя"}) if project.members.filter(email=email).exists(): raise serializers.ValidationError({"email": "Пользователь уже является участником проекта"}) if Invitation.objects.filter(email=email, project=project, status='pending').exists(): raise serializers.ValidationError({"email": "Приглашение уже отправлено этому пользователю"}) return attrs class InvitationAcceptSerializer(serializers.Serializer): token = serializers.CharField() class InvitationResponseSerializer(serializers.Serializer): accept = serializers.BooleanField()