mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-22 03:47:38 +00:00
perf: 重构 ticket (#8281)
* perf: 重构 ticket * perf: 优化 tickets * perf: 暂存 * perf: 建立 ticket model * perf: 暂存一下 * perf: 修改 tickets * perf: 修改 import * perf: 修改model * perf: 暂存一波 * perf: 修改... * del process_map field * 工单重构 * 资产 应用对接前端 * perf: 修改 ticket * fix: bug * 修改迁移文件 * 添加其他api * 去掉process_map * perf: 优化去掉 signal * perf: 修改这里 * 修改一点 * perf: 修改工单 * perf: 修改状态 * perf: 修改工单流转 * step 状态切换 * perf: 修改 ticket open * perf: 修改流程 * perf: stash it * 改又改 * stash it * perf: stash * stash * migrate * perf migrate * 调整一下 * 修复bug * 修改一点 * 修改一点 * 优化一波 * perf: ticket migrations Co-authored-by: ibuler <ibuler@qq.com> Co-authored-by: feng626 <1304903146@qq.com>
This commit is contained in:
@@ -1,13 +1,17 @@
|
||||
from urllib.parse import urljoin
|
||||
import json
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.shortcuts import reverse
|
||||
from django.db.models.fields import related
|
||||
from django.template.loader import render_to_string
|
||||
from django.forms import model_to_dict
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from notifications.notifications import UserMessage
|
||||
from common.utils import get_logger, random_string
|
||||
from common.db.encoder import ModelJSONFieldEncoder
|
||||
from .models import Ticket
|
||||
from . import const
|
||||
|
||||
@@ -41,8 +45,8 @@ class BaseTicketMessage(UserMessage):
|
||||
def get_html_msg(self) -> dict:
|
||||
context = dict(
|
||||
title=self.content_title,
|
||||
ticket_detail_url=self.ticket_detail_url,
|
||||
body=self.ticket.body.replace('\n', '<br/>'),
|
||||
content=self.content,
|
||||
ticket_detail_url=self.ticket_detail_url
|
||||
)
|
||||
message = render_to_string('tickets/_msg_ticket.html', context)
|
||||
return {
|
||||
@@ -54,8 +58,48 @@ class BaseTicketMessage(UserMessage):
|
||||
def gen_test_msg(cls):
|
||||
return None
|
||||
|
||||
@property
|
||||
def content(self):
|
||||
content = [
|
||||
{'title': _('Ticket basic info'), 'content': self.basic_items},
|
||||
{'title': _('Ticket applied info'), 'content': self.spec_items},
|
||||
]
|
||||
return content
|
||||
|
||||
class TicketAppliedToAssignee(BaseTicketMessage):
|
||||
def _get_fields_items(self, item_names):
|
||||
fields = self.ticket._meta._forward_fields_map
|
||||
json_data = json.dumps(model_to_dict(self.ticket), cls=ModelJSONFieldEncoder)
|
||||
data = json.loads(json_data)
|
||||
items = []
|
||||
|
||||
for name in item_names:
|
||||
field = fields[name]
|
||||
item = {'name': name, 'title': field.verbose_name}
|
||||
value = data.get(name)
|
||||
if hasattr(self.ticket, f'get_{name}_display'):
|
||||
value = getattr(self.ticket, f'get_{name}_display')()
|
||||
elif isinstance(field, related.ForeignKey):
|
||||
value = self.ticket.rel_snapshot[name]
|
||||
elif isinstance(field, related.ManyToManyField):
|
||||
value = ', '.join(self.ticket.rel_snapshot[name])
|
||||
item['value'] = value
|
||||
items.append(item)
|
||||
return items
|
||||
|
||||
@property
|
||||
def basic_items(self):
|
||||
item_names = ['serial_num', 'title', 'type', 'state', 'applicant', 'comment']
|
||||
return self._get_fields_items(item_names)
|
||||
|
||||
@property
|
||||
def spec_items(self):
|
||||
fields = self.ticket._meta.local_fields + self.ticket._meta.local_many_to_many
|
||||
excludes = ['ticket_ptr']
|
||||
item_names = [field.name for field in fields if field.name not in excludes]
|
||||
return self._get_fields_items(item_names)
|
||||
|
||||
|
||||
class TicketAppliedToAssigneeMessage(BaseTicketMessage):
|
||||
def __init__(self, user, ticket):
|
||||
self.ticket = ticket
|
||||
super().__init__(user)
|
||||
@@ -69,14 +113,14 @@ class TicketAppliedToAssignee(BaseTicketMessage):
|
||||
|
||||
@property
|
||||
def content_title(self):
|
||||
return _('Your has a new ticket, applicant - {}').format(
|
||||
str(self.ticket.applicant_display)
|
||||
)
|
||||
return _('Your has a new ticket')
|
||||
|
||||
@property
|
||||
def subject(self):
|
||||
title = _('New Ticket - {} ({})').format(
|
||||
self.ticket.title, self.ticket.get_type_display()
|
||||
title = _('{}: New Ticket - {} ({})').format(
|
||||
self.ticket.applicant,
|
||||
self.ticket.title,
|
||||
self.ticket.get_type_display()
|
||||
)
|
||||
return title
|
||||
|
||||
@@ -85,19 +129,16 @@ class TicketAppliedToAssignee(BaseTicketMessage):
|
||||
return urljoin(settings.SITE_URL, url)
|
||||
|
||||
def get_html_msg(self) -> dict:
|
||||
body = self.ticket.body.replace('\n', '<br/>')
|
||||
context = dict(
|
||||
title=self.content_title,
|
||||
ticket_detail_url=self.ticket_detail_url,
|
||||
body=body,
|
||||
content=self.content,
|
||||
ticket_detail_url=self.ticket_detail_url
|
||||
)
|
||||
|
||||
ticket_approval_url = self.get_ticket_approval_url()
|
||||
context.update({'ticket_approval_url': ticket_approval_url})
|
||||
message = render_to_string('tickets/_msg_ticket.html', context)
|
||||
cache.set(self.token, {
|
||||
'body': body, 'ticket_id': self.ticket.id
|
||||
}, 3600)
|
||||
cache.set(self.token, {'ticket_id': self.ticket.id, 'content': self.content}, 3600)
|
||||
return {
|
||||
'subject': self.subject,
|
||||
'message': message
|
||||
@@ -112,7 +153,7 @@ class TicketAppliedToAssignee(BaseTicketMessage):
|
||||
return cls(user, ticket)
|
||||
|
||||
|
||||
class TicketProcessedToApplicant(BaseTicketMessage):
|
||||
class TicketProcessedToApplicantMessage(BaseTicketMessage):
|
||||
def __init__(self, user, ticket, processor):
|
||||
self.ticket = ticket
|
||||
self.processor = processor
|
||||
|
Reference in New Issue
Block a user