"""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)