fix: удален дубликат кода в CalendarSubscriptionSerializer

- Удалены повторяющиеся строки в методе validate()
- Fixes: IndentationError: unexpected indent на строке 487
This commit is contained in:
admin i 2026-02-11 12:33:06 +03:00
parent b03ef1308e
commit db69efb329

View File

@ -5,7 +5,8 @@ import re
from datetime import date, datetime, time, timedelta
from typing import Any, Dict, List, Optional
from calendar_app.models import Calendar, CalendarEvent, CalendarSubscription, Recurrence
from calendar_app.models import (Calendar, CalendarEvent, CalendarSubscription,
Recurrence)
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
@ -177,7 +178,7 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
def create(self, validated_data: Dict[str, Any]) -> CalendarEvent:
validated_data.pop("weekdays", None)
# Поддержка calendar_id (новая архитектура)
calendar_id = validated_data.pop("calendar_id", None)
if calendar_id is not None:
@ -189,11 +190,11 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"calendar_id": _("Календарь с ID {} не найден.").format(calendar_id)}
)
# Legacy поддержка department_id и employee_id
department_id = validated_data.pop("department_id", None)
employee_id = validated_data.pop("employee_id", None)
if department_id is not None:
from employees.models import Department
try:
@ -203,7 +204,7 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"department_id": _("Отдел с ID {} не найден.").format(department_id)}
)
if employee_id is not None:
from django.contrib.auth import get_user_model
User = get_user_model()
@ -214,12 +215,12 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"employee_id": _("Сотрудник с ID {} не найден.").format(employee_id)}
)
return CalendarEvent.objects.create(**validated_data)
def update(self, instance: CalendarEvent, validated_data: Dict[str, Any]) -> CalendarEvent:
validated_data.pop("weekdays", None)
# Поддержка calendar_id (новая архитектура)
calendar_id = validated_data.pop("calendar_id", None)
if calendar_id is not None:
@ -231,11 +232,11 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"calendar_id": _("Календарь с ID {} не найден.").format(calendar_id)}
)
# Legacy поддержка department_id и employee_id
department_id = validated_data.pop("department_id", None)
employee_id = validated_data.pop("employee_id", None)
if department_id is not None:
from employees.models import Department
try:
@ -245,7 +246,7 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"department_id": _("Отдел с ID {} не найден.").format(department_id)}
)
if employee_id is not None:
from django.contrib.auth import get_user_model
User = get_user_model()
@ -256,7 +257,7 @@ class CalendarEventWriteSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"employee_id": _("Сотрудник с ID {} не найден.").format(employee_id)}
)
for f, v in validated_data.items():
setattr(instance, f, v)
instance.save()
@ -289,19 +290,19 @@ class EventOccurrenceSerializer(serializers.Serializer):
class CalendarSerializer(serializers.ModelSerializer):
"""Сериализатор для календаря (чтение)."""
owner_user_name = serializers.SerializerMethodField()
owner_department_name = serializers.SerializerMethodField()
event_count = serializers.IntegerField(read_only=True, required=False)
subscriber_count = serializers.IntegerField(read_only=True, required=False)
is_subscribed = serializers.SerializerMethodField()
user_can_edit = serializers.SerializerMethodField()
# Computed-поля для типа календаря
is_personal = serializers.SerializerMethodField()
is_department = serializers.SerializerMethodField()
is_global = serializers.SerializerMethodField()
class Meta:
model = Calendar
fields = (
@ -329,63 +330,63 @@ class CalendarSerializer(serializers.ModelSerializer):
"is_global",
)
read_only_fields = ("id", "created_at", "updated_at")
def get_owner_user_name(self, obj):
"""Возвращает имя владельца-пользователя."""
if obj.owner_user:
return obj.owner_user.get_full_name() or obj.owner_user.username
return None
def get_owner_department_name(self, obj):
"""Возвращает название отдела-владельца."""
return obj.owner_department.name if obj.owner_department else None
def get_is_subscribed(self, obj):
"""Проверяет, подписан ли текущий пользователь."""
request = self.context.get("request")
if request and request.user.is_authenticated:
return obj.subscriptions.filter(user=request.user).exists()
return False
def get_is_personal(self, obj):
"""Проверяет, является ли календарь личным."""
return obj.owner_user_id is not None and obj.owner_department_id is None
def get_is_department(self, obj):
"""Проверяет, является ли календарь отдела."""
return obj.owner_department_id is not None and obj.owner_user_id is None
def get_is_global(self, obj):
"""Проверяет, является ли календарь глобальным."""
return obj.owner_user_id is None and obj.owner_department_id is None
def get_user_can_edit(self, obj):
"""Проверяет, может ли текущий пользователь редактировать календарь."""
request = self.context.get("request")
if not request or not request.user.is_authenticated:
return False
user = request.user
# Админы могут всё
if user.is_superuser or user.is_staff:
return True
# Владелец может редактировать
if obj.owner_user_id == user.id:
return True
# Проверяем подписку с правом редактирования
subscription = obj.subscriptions.filter(user=user).first()
if subscription and (subscription.can_edit or subscription.can_manage):
return True
return False
class CalendarWriteSerializer(serializers.ModelSerializer):
"""Сериализатор для создания/обновления календаря."""
class Meta:
model = Calendar
fields = (
@ -402,32 +403,32 @@ class CalendarWriteSerializer(serializers.ModelSerializer):
"is_active",
)
read_only_fields = ("id",)
def validate(self, attrs):
"""Валидация: нельзя одновременно указывать owner_user и owner_department."""
owner_user = attrs.get("owner_user")
owner_department = attrs.get("owner_department")
# Для update нужно учитывать существующие значения
if self.instance:
owner_user = owner_user if "owner_user" in attrs else self.instance.owner_user
owner_department = owner_department if "owner_department" in attrs else self.instance.owner_department
if owner_user and owner_department:
raise serializers.ValidationError(
_("Календарь не может одновременно принадлежать пользователю и отделу.")
)
return attrs
class CalendarSubscriptionSerializer(serializers.ModelSerializer):
"""Сериализатор для подписки на календарь (чтение)."""
calendar_title = serializers.CharField(source="calendar.title", read_only=True)
calendar_color = serializers.CharField(source="calendar.color", read_only=True)
user_name = serializers.SerializerMethodField()
class Meta:
model = CalendarSubscription
fields = (
@ -446,7 +447,7 @@ class CalendarSubscriptionSerializer(serializers.ModelSerializer):
"subscribed_at",
)
read_only_fields = ("id", "subscribed_at")
def get_user_name(self, obj):
"""Возвращает имя пользователя."""
return obj.user.get_full_name() or obj.user.username
@ -454,7 +455,7 @@ class CalendarSubscriptionSerializer(serializers.ModelSerializer):
class CalendarSubscriptionWriteSerializer(serializers.ModelSerializer):
"""Сериализатор для создания/обновления подписки."""
class Meta:
model = CalendarSubscription
fields = (
@ -469,16 +470,16 @@ class CalendarSubscriptionWriteSerializer(serializers.ModelSerializer):
"notify_on_event_change",
)
read_only_fields = ("id",)
def validate(self, attrs):
"""Валидация подписки."""
calendar = attrs.get("calendar") or (self.instance.calendar if self.instance else None)
user = attrs.get("user") or (self.instance.user if self.instance else None)
# Проверяем, что пользователь не подписывается на свой личный календарь дважды
if calendar and user and calendar.owner_user_id == user.id:
# Владелец может иметь подписку, но это optional
pass
return attrs