from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from common.serializers.fields import LabeledChoiceField, JSONManyToManyField from orgs.mixins.serializers import OrgResourceModelSerializerMixin from orgs.models import Organization from orgs.utils import get_current_org_id from tickets.const import TicketType from tickets.models import TicketFlow, ApprovalRule __all__ = ['TicketFlowSerializer'] class TicketFlowApproveSerializer(serializers.ModelSerializer): users = JSONManyToManyField(label=_('User')) class Meta: model = ApprovalRule fields = ['level', 'users'] read_only_fields = ['level'] class TicketFlowSerializer(OrgResourceModelSerializerMixin): type = LabeledChoiceField( choices=TicketType.choices, required=True, label=_('Type') ) rules = TicketFlowApproveSerializer(many=True, required=True) class Meta: model = TicketFlow fields_mini = ['id', 'type'] fields_small = fields_mini + [ 'approval_level', 'created_by', 'date_created', 'date_updated', 'org_id', 'org_name' ] fields = fields_small + ['rules'] read_only_fields = ['created_by', 'date_created', 'date_updated'] extra_kwargs = { 'approval_level': {'required': True} } def validate_type(self, value): if not self.instance or (self.instance and self.instance.type != value): if self.Meta.model.objects.filter(type=value).exists(): error = _('The current organization type already exists') raise serializers.ValidationError(error) return value def create_or_update(self, action, validated_data, instance=None): children = validated_data.pop('rules', []) if instance is None: instance = getattr(super(), action)(validated_data) else: instance = getattr(super(), action)(instance, validated_data) instance.rules.all().delete() child_instances = [ instance.rules.model.objects.create(**data, level=level) for level, data in enumerate(children, 1) ] instance.rules.set(child_instances) return instance def create(self, validated_data): return self.create_or_update('create', validated_data) def update(self, instance, validated_data): current_org_id = get_current_org_id() root_org_id = Organization.ROOT_ID if instance.org_id == root_org_id and current_org_id != root_org_id: instance = self.create(validated_data) else: instance = self.create_or_update('update', validated_data, instance) return instance