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/models/flow.py

69 lines
2.2 KiB

# -*- coding: utf-8 -*-
#
from django.db import models
from django.utils.translation import gettext_lazy as _
from common.db.fields import JSONManyToManyField, RelatedManager
from common.db.models import JMSBaseModel
from orgs.mixins.models import OrgModelMixin
from orgs.models import Organization
from orgs.utils import tmp_to_org, current_org
from users.models import User
from ..const import TicketType, TicketLevel
__all__ = ['TicketFlow', 'ApprovalRule']
class ApprovalRule(JMSBaseModel):
level = models.SmallIntegerField(
default=TicketLevel.one,
choices=TicketLevel.choices,
verbose_name=_('Approve level')
)
users = JSONManyToManyField('users.User', default=dict, verbose_name=_('Users'))
class Meta:
verbose_name = _('Ticket flow approval rule')
def __str__(self):
return '{}({})'.format(self.id, self.level)
def get_assignees(self, org_id=None):
org = Organization.get_instance(org_id, default=current_org)
user_qs = User.get_org_users(org=org)
query = RelatedManager.get_to_filter_qs(self.users.value, user_qs.model)
assignees = user_qs.filter(*query).distinct()
return assignees
class TicketFlow(JMSBaseModel, OrgModelMixin):
type = models.CharField(
max_length=64, choices=TicketType.choices,
default=TicketType.general, verbose_name=_("Type")
)
approval_level = models.SmallIntegerField(
default=TicketLevel.one,
choices=TicketLevel.choices,
verbose_name=_('Approve level')
)
rules = models.ManyToManyField(ApprovalRule, related_name='ticket_flows')
class Meta:
verbose_name = _('Ticket flow')
def __str__(self):
return '{}'.format(self.type)
@classmethod
def get_org_related_flows(cls, org_id=None):
if org_id:
with tmp_to_org(org_id):
flows = cls.objects.all()
else:
flows = cls.objects.all()
cur_flow_types = flows.values_list('type', flat=True)
root_id = Organization.ROOT_ID
with tmp_to_org(root_id):
diff_global_flows = cls.objects.exclude(type__in=cur_flow_types).filter(org_id=root_id)
return flows | diff_global_flows