Skip to content

Commit

Permalink
feature:ieod支持moa和ticket
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeJamz committed Nov 12, 2021
1 parent e7acd0d commit 29f27b2
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 64 deletions.
69 changes: 48 additions & 21 deletions itsm/openapi/ticket/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,12 @@
from itsm.ticket.models import Ticket, TicketField, SignTask, TicketEventLog
from itsm.ticket.serializers import TicketList, TicketSerializer
from itsm.ticket.tasks import start_pipeline
from itsm.ticket.validators import terminate_validate, withdraw_validate, FieldSerializer, \
edit_field_validate
from itsm.ticket.validators import (
terminate_validate,
withdraw_validate,
FieldSerializer,
edit_field_validate,
)


def catch_ticket_operate_exception(view_func):
Expand Down Expand Up @@ -250,7 +254,7 @@ def get_tickets(self, request):
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

@action(detail=False, methods=['post'])
@action(detail=False, methods=["post"])
def edit_field(self, request, *args, **kwargs):
"""
单个修改字段值
Expand All @@ -264,28 +268,32 @@ def edit_field_tracker(field_instance, old):
old_field_instance = copy.deepcopy(field_instance)
old_field_instance._value = old
old_data = copy.deepcopy(FieldSerializer(old_field_instance).data)
old_data.update({"value_status": 'before'})
new_data.update({"value_status": 'after'})
old_data.update({"value_status": "before"})
new_data.update({"value_status": "after"})
form_data.extend([old_data, new_data])

field = request.data.get('field')
ticket_id = request.data.get('ticket_id')
field = request.data.get("field")
ticket_id = request.data.get("ticket_id")

try:
ticket = Ticket.objects.get(id=ticket_id)
except Exception:
raise ValidationError("ticket_id = {} 对应的单据不存在!".format(ticket_id))

# 如果ticket当前状态为:已完成/已终止/已撤销,则无法修改字段
if ticket.current_status in ['FINISHED', 'TERMINATED', 'REVOKED']:
raise ValidationError("current_status = {} 当前状态不可修改字段!".format(ticket.current_status))
if ticket.current_status in ["FINISHED", "TERMINATED", "REVOKED"]:
raise ValidationError(
"current_status = {} 当前状态不可修改字段!".format(ticket.current_status)
)

validate_data, field_obj = edit_field_validate(field, service=ticket.service_type)
field_value = validate_data['value']
validate_data, field_obj = edit_field_validate(
field, service=ticket.service_type
)
field_value = validate_data["value"]

update_data = {'_value': field_value}
if validate_data.get('choice'):
update_data.update(choice=validate_data['choice'])
update_data = {"_value": field_value}
if validate_data.get("choice"):
update_data.update(choice=validate_data["choice"])

old_value = field_obj.value

Expand All @@ -307,16 +315,21 @@ def edit_field_tracker(field_instance, old):
priority_data = ticket.update_priority(urgency, impact)
if priority_data:
# 存在优先级修改记录的时候才进行跟踪
edit_field_tracker(priority_data['instance'], priority_data['old_value'])
edit_field_tracker(
priority_data["instance"], priority_data["old_value"]
)

ticket.refresh_sla_task()

# 修改了工单状态
if field_obj.key == FIELD_STATUS and ticket.current_status != field_value:
if field_value in ticket.status_instance.to_over_status_keys:
# 如果是结束状态,直接结束
ticket.close(close_status=field_value, desc=request.data.get("desc"),
operator=request.user.username)
ticket.close(
close_status=field_value,
desc=request.data.get("desc"),
operator=request.user.username,
)
return Response()
ticket.update_current_status(field_value)

Expand All @@ -329,7 +342,7 @@ def edit_field_tracker(field_instance, old):
ticket,
0,
request.user.username,
'EDIT_FIELD',
"EDIT_FIELD",
message="{operator} 修改字段【{detail_message}】.",
detail_message=field_obj.name,
fields=form_data,
Expand Down Expand Up @@ -581,13 +594,27 @@ def proceed_approval(self, request):
raise OperateTicketError(res.message)
return Response()

@action(detail=False, methods=["post"])
@catch_ticket_operate_exception
def proceed_fast_approval(self, request):
"""
处理快速审批请求
"""
if settings.RUN_VER == "ieod":
from platform_config.ieod.bkchat.utils import proceed_fast_approval
else:
from platform_config.open.bkchat.utils import proceed_fast_approval
return proceed_fast_approval(request)

@action(detail=False, methods=["get"])
@catch_ticket_operate_exception
def get_tickets_by_user(self, request):
# 初始化serializer的上下文
username = request.query_params.get("username") if request.query_params.get(
"username", None) else request.query_params.get(
"user", None)
username = (
request.query_params.get("username")
if request.query_params.get("username", None)
else request.query_params.get("user", None)
)
if username is None:
raise ParamError("user 为必填项")
queryset = self.custom_filter_queryset(request, username)
Expand Down
32 changes: 0 additions & 32 deletions itsm/ticket/base.py

This file was deleted.

40 changes: 29 additions & 11 deletions itsm/ticket/models/ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,9 @@
get_department_info,
list_departments_info,
)
from platform_config import BaseTicket

from .basic import Model
from ..base import BaseTicket


class SignTask(Model):
Expand Down Expand Up @@ -890,9 +890,11 @@ def get_ticket_status_setting(self, service_type):
from_ticket_status = TicketStatus.objects.get(
service_type=service_type, key=self.ticket.current_status
)
to_ticket_status = TicketStatus.objects.filter(
service_type=service_type
).filter(key=setting.get("name")).first()
to_ticket_status = (
TicketStatus.objects.filter(service_type=service_type)
.filter(key=setting.get("name"))
.first()
)
# 是否满足单据状态流转设置
if (
to_ticket_status
Expand Down Expand Up @@ -2180,17 +2182,23 @@ def update_priority(self, urgency=None, impact=None):
if self.service_instance:
# 1.在关联表中拿到sla_id
try:
sla_id = ServiceSla.objects.get(service_id=self.service_instance.id).sla_id
sla_id = ServiceSla.objects.get(
service_id=self.service_instance.id
).sla_id
except ServiceSla.DoesNotExist as error:
logger.warning(
"Failed to get sla_id from ServiceSla, error is {}".format(error))
"Failed to get sla_id from ServiceSla, error is {}".format(
error
)
)
return {}
# 2.拿到sla实例
try:
sla_instance = Sla.objects.get(id=sla_id)
except Sla.DoesNotExist as error:
logger.warning(
"Failed to get sla_instance from Sla, error is {}".format(error))
"Failed to get sla_instance from Sla, error is {}".format(error)
)
return {}
default_priority = sla_instance.get_default_policy()
priorities = SysDict.list_data(
Expand Down Expand Up @@ -3421,6 +3429,10 @@ def do_before_enter_sign_state(self, state_id, **kwargs):

# Send notify
processor = node_status.get_processor_in_sign_state()
# 快速审批通知
self.notify_fast_approval(
state_id, processor, "", action=TRANSITION_OPERATE, kwargs=kwargs
)

# TODO 发送通知可用触发器替代
self.notify(
Expand Down Expand Up @@ -3615,14 +3627,20 @@ def do_before_exit_state(self, state_id, operator=None):
if self.is_sla_end_state(state_id):
self.stop_sla(state_id)

current_status = Status.objects.filter(ticket_id=self.id, state_id=state_id).first()
current_status = Status.objects.filter(
ticket_id=self.id, state_id=state_id
).first()
if current_status is None:
logger.info(
"get status object does not exist, param: ticket_id={}, state_id={}".format(self.id,
state_id))
"get status object does not exist, param: ticket_id={}, state_id={}".format(
self.id, state_id
)
)
raise ObjectNotExist(_("没有获取到当前节点处理状态"))
if current_status.status == FINISHED:
self.send_trigger_signal(LEAVE_STATE, state_id, context={"operator": operator})
self.send_trigger_signal(
LEAVE_STATE, state_id, context={"operator": operator}
)

def do_after_create(self, fields, from_ticket_id=None, source=WEB):
# 创建关联关系
Expand Down
12 changes: 12 additions & 0 deletions itsm/ticket/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

from common.log import logger
from common.mymako import render_mako_tostring
from config import RUN_VER
from config.default import AUTO_COMMENT_DAYS, CLOSE_NOTIFY

from itsm.component.constants import (
Expand Down Expand Up @@ -320,6 +321,17 @@ def notify_task(ticket, receivers, message, action, **kwargs):
logger.exception("send email exception: %s" % str(e))


@task
def notify_fast_approval_task(ticket, state_id, receivers, message, action, **kwargs):
"""发送快速审批通知"""
if RUN_VER == "ieod":
from platform_config.ieod.bkchat.utils import notify_fast_approval_message
else:
from platform_config.open.bkchat.utils import notify_fast_approval_message

notify_fast_approval_message(ticket, state_id, receivers, message, action, **kwargs)


@periodic_task(run_every=(crontab(minute="*/1")), ignore_result=True)
@share_lock()
def status_auto_transit():
Expand Down
24 changes: 24 additions & 0 deletions platform_config/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-

# ==============================================================================
# 加载环境差异化配置
# ==============================================================================

import importlib

from django.conf import settings

bkchat_config = importlib.import_module(
"platform_config.{}.bkchat.config".format(settings.RUN_VER)
)
moa_config = importlib.import_module(
"platform_config.{}.moa.config".format(settings.RUN_VER)
)


BaseBkchatConfig = bkchat_config.BaseBkchatConfig
BaseMoaConfig = moa_config.BaseMoaConfig


class BaseTicket(BaseMoaConfig, BaseBkchatConfig):
pass
1 change: 1 addition & 0 deletions platform_config/open/bkchat/aes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
8 changes: 8 additions & 0 deletions platform_config/open/bkchat/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-


class BaseBkchatConfig:
def notify_fast_approval(
self, state_id, receivers, message="", action="", **kwargs
):
pass
15 changes: 15 additions & 0 deletions platform_config/open/bkchat/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-


def notify_fast_approval_message(
ticket, state_id, receivers, message, action, **kwargs
):
pass


def send_fast_approval_message(title, content, receivers, ticket_id, state_id):
pass


def proceed_fast_approval(request):
pass
9 changes: 9 additions & 0 deletions platform_config/open/moa/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-


class BaseMoaConfig:
def create_moa_ticket(self, state_id):
pass

def close_moa_ticket(self, state_id, operator):
pass

0 comments on commit 29f27b2

Please sign in to comment.