66 lines
2.3 KiB
Python

"""Validated board template library input and output."""
from rest_framework import serializers
from tasks.access import task_board_access_q
from tasks.models import TaskBoard, TaskBoardTemplate
from tasks.templates import snapshot_board_structure
class TaskBoardTemplateSerializer(serializers.ModelSerializer):
source_board_id = serializers.IntegerField(write_only=True, required=False)
created_by_id = serializers.IntegerField(read_only=True)
class Meta:
model = TaskBoardTemplate
fields = [
"id",
"name",
"description",
"is_shared",
"created_by_id",
"source_board_id",
"layout",
"created_at",
"updated_at",
]
read_only_fields = ["id", "layout", "created_at", "updated_at", "created_by_id"]
def validate(self, attrs):
attrs = super().validate(attrs)
user = self.context["request"].user
if self.instance is None:
board_id = attrs.pop("source_board_id", None)
if board_id is None:
raise serializers.ValidationError(
{"source_board_id": "Выберите доску."}
)
board = (
TaskBoard.objects.filter(id=board_id, is_archived=False)
.filter(task_board_access_q(user))
.first()
)
if board is None:
raise serializers.ValidationError(
{"source_board_id": "Доска не найдена."}
)
self._source_board = board
if attrs.get(
"is_shared",
self.instance.is_shared if self.instance else False,
) and not (user.is_staff or user.is_superuser):
raise serializers.ValidationError(
{"is_shared": "Публиковать общие шаблоны может только администратор."}
)
return attrs
def create(self, validated_data):
return TaskBoardTemplate.objects.create(
layout=snapshot_board_structure(self._source_board),
**validated_data,
)
class TaskBoardTemplateInstantiateSerializer(serializers.Serializer):
name = serializers.CharField(max_length=255, required=False, trim_whitespace=True)