You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jumpserver/apps/tickets/serializers/flow.py

75 lines
2.7 KiB

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