66 lines
2.3 KiB
Python
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)
|