diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index df0dea23028d5c12270fb00e674a8c1db58050d8..62f5281f5327828c2a26dd4c340d62fee69d9e54 100644 Binary files a/apps/locale/zh/LC_MESSAGES/django.mo and b/apps/locale/zh/LC_MESSAGES/django.mo differ diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 7a2caa34608b9ba774c45e4658ff789f39775e89..b3c6392c0b3222ede7901cdc659c9c727ff782ed 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-18 14:52+0800\n" +"POT-Creation-Date: 2021-01-18 16:42+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -2839,6 +2839,137 @@ msgstr "拒绝" msgid "Closed" msgstr "关闭" +#: tickets/handler/apply_application.py:55 +msgid "Applied category" +msgstr "申请的种类" + +#: tickets/handler/apply_application.py:56 +msgid "Applied type" +msgstr "申请的类型" + +#: tickets/handler/apply_application.py:57 +msgid "Applied application group" +msgstr "申请的应用组" + +#: tickets/handler/apply_application.py:58 tickets/handler/apply_asset.py:59 +msgid "Applied system user group" +msgstr "申请的系统用户组" + +#: tickets/handler/apply_application.py:59 tickets/handler/apply_asset.py:61 +msgid "Applied date start" +msgstr "申请的开始日期" + +#: tickets/handler/apply_application.py:60 tickets/handler/apply_asset.py:62 +msgid "Applied date expired" +msgstr "申请的失效日期" + +#: tickets/handler/apply_application.py:75 +msgid "Approved applications" +msgstr "批准的应用" + +#: tickets/handler/apply_application.py:76 tickets/handler/apply_asset.py:79 +msgid "Approved system users" +msgstr "批准的系统用户" + +#: tickets/handler/apply_application.py:77 tickets/handler/apply_asset.py:81 +msgid "Approved date start" +msgstr "批准的开始日期" + +#: tickets/handler/apply_application.py:78 tickets/handler/apply_asset.py:82 +msgid "Approved date expired" +msgstr "批准的失效日期" + +#: tickets/handler/apply_application.py:95 tickets/handler/apply_asset.py:98 +msgid "Created by ticket ({}) ({})" +msgstr "通过工单创建 ({}) ({})" + +#: tickets/handler/apply_application.py:99 tickets/handler/apply_asset.py:102 +msgid "" +"Created by the ticket, ticket title: {}, ticket applicant: {}, ticket " +"processor: {}, ticket ID: {}" +msgstr "" +"通过工单创建, 工单标题: {}, 工单申请人: {}, 工单处理人: {}, 工单 ID: {}" + +#: tickets/handler/apply_asset.py:57 +msgid "Applied IP group" +msgstr "申请的IP组" + +#: tickets/handler/apply_asset.py:58 +msgid "Applied hostname group" +msgstr "申请的主机名组" + +#: tickets/handler/apply_asset.py:60 +msgid "Applied actions" +msgstr "申请的动作" + +#: tickets/handler/apply_asset.py:78 +msgid "Approved assets" +msgstr "批准的资产" + +#: tickets/handler/apply_asset.py:80 +msgid "Approved actions" +msgstr "批准的动作" + +#: tickets/handler/base.py:62 +msgid "User {} {} the ticket" +msgstr "用户 {} {} 这个工单" + +#: tickets/handler/base.py:89 +msgid "Ticket basic info" +msgstr "工单基本信息" + +#: tickets/handler/base.py:90 +msgid "Ticket title" +msgstr "工单标题" + +#: tickets/handler/base.py:91 +msgid "Ticket type" +msgstr "工单类型" + +#: tickets/handler/base.py:92 +msgid "Ticket applicant" +msgstr "工单申请人" + +#: tickets/handler/base.py:93 +msgid "Ticket assignees" +msgstr "工单受理人" + +#: tickets/handler/base.py:94 +msgid "Ticket processor" +msgstr "工单处理人" + +#: tickets/handler/base.py:94 +msgid "No" +msgstr "无" + +#: tickets/handler/base.py:95 +msgid "Ticket action" +msgstr "工单动作" + +#: tickets/handler/base.py:96 +msgid "Ticket status" +msgstr "工单状态" + +#: tickets/handler/base.py:114 +msgid "Ticket applied info" +msgstr "工单申请信息" + +#: tickets/handler/base.py:124 +msgid "Ticket approved info" +msgstr "工单批准信息" + +#: tickets/handler/login_confirm.py:16 +msgid "Applied login IP" +msgstr "申请的登录IP" + +#: tickets/handler/login_confirm.py:17 +msgid "Applied login city" +msgstr "申请的登录城市" + +#: tickets/handler/login_confirm.py:18 +msgid "Applied login datetime" +msgstr "申请的登录日期" + #: tickets/models/comment.py:19 msgid "User display name" msgstr "用户显示名称" @@ -2974,65 +3105,23 @@ msgstr "所有受理人都不属于组织 `{}` 下的管理员" #: tickets/utils.py:21 msgid "New Ticket: {} ({})" -msgstr "新建工单: {} ({})" +msgstr "新工单: {} ({})" -#: tickets/utils.py:26 -#, python-brace-format -msgid "" -"
\n" -"

Your has a new ticket

\n" -"
\n" -" Ticket: \n" -"
\n" -" {body}\n" -"
\n" -" click here to review \n" -"
\n" -"
\n" -" " -msgstr "" -"
\n" -"

你有一个新工单

\n" -"
\n" -" 工单: \n" -"
\n" -" {body}\n" -"
\n" -" 点击查看 \n" -"
\n" -"
\n" -" " +#: tickets/utils.py:33 +msgid "Your has a new ticket, from applicant - {}" +msgstr "你有一个新的工单, 来自申请人 - {}" -#: tickets/utils.py:51 +#: tickets/utils.py:35 +msgid "click here to review" +msgstr "点击查看" + +#: tickets/utils.py:48 msgid "Ticket has processed: {} ({})" msgstr "工单已处理: {} ({})" -#: tickets/utils.py:53 -#, python-brace-format -msgid "" -"\n" -"
\n" -"

Your ticket has been processed

\n" -"
\n" -" Ticket: \n" -"
\n" -" {body}\n" -"
\n" -"
\n" -"
\n" -" " -msgstr "" -"\n" -"
\n" -"

你的工单已被处理

\n" -"
\n" -" 工单: \n" -"
\n" -" {body}\n" -"
\n" -"
\n" -"
\n" -" " +#: tickets/utils.py:57 +msgid "Your ticket has been ({}) processed" +msgstr "你的工单已被 ({}) 处理" #: users/api/user.py:199 msgid "Could not reset self otp, use profile reset instead" diff --git a/apps/tickets/handler/apply_application.py b/apps/tickets/handler/apply_application.py index 28eb8269771307b246e6421d8cdbc376c6081993..d9c72e2bf75a34de03e3fb34fe49c110729d2342 100644 --- a/apps/tickets/handler/apply_application.py +++ b/apps/tickets/handler/apply_application.py @@ -1,4 +1,4 @@ -from django.utils.translation import ugettext as __ +from django.utils.translation import ugettext as _ from orgs.utils import tmp_to_org, tmp_to_root_org from applications.models import Application from applications.const import ApplicationCategoryChoices, ApplicationTypeChoices @@ -52,12 +52,12 @@ class Handler(BaseHandler): {}: {}, {}: {}, '''.format( - __('Applied category'), apply_category_display, - __('Applied type'), apply_type_display, - __('Applied application group'), apply_application_group, - __('Applied system user group'), apply_system_user_group, - __('Applied date start'), apply_date_start, - __('Applied date expired'), apply_date_expired, + _('Applied category'), apply_category_display, + _('Applied type'), apply_type_display, + _('Applied application group'), apply_application_group, + _('Applied system user group'), apply_system_user_group, + _('Applied date start'), apply_date_start, + _('Applied date expired'), apply_date_expired, ) return applied_body @@ -72,10 +72,10 @@ class Handler(BaseHandler): {}: {}, {}: {}, '''.format( - __('Approved applications'), approve_applications_display, - __('Approved system users'), approve_system_users_display, - __('Approved date start'), approve_date_start, - __('Approved date expired'), approve_date_expired + _('Approved applications'), approve_applications_display, + _('Approved system users'), approve_system_users_display, + _('Approved date start'), approve_date_start, + _('Approved date expired'), approve_date_expired ) return approved_body @@ -92,10 +92,10 @@ class Handler(BaseHandler): approve_system_users_id = self.ticket.meta.get('approve_system_users', []) approve_date_start = self.ticket.meta.get('approve_date_start') approve_date_expired = self.ticket.meta.get('approve_date_expired') - permission_name = '{}({})'.format( - __('Created by ticket ({})'.format(self.ticket.title)), str(self.ticket.id)[:4] + permission_name = _('Created by ticket ({}) ({})'.format( + self.ticket.title, str(self.ticket.id)[:4]) ) - permission_comment = __( + permission_comment = _( 'Created by the ticket, ' 'ticket title: {}, ' 'ticket applicant: {}, ' @@ -108,10 +108,10 @@ class Handler(BaseHandler): ) permissions_data = { 'id': self.ticket.id, - 'name': permission_name, + 'name': str(permission_name), 'category': apply_category, 'type': apply_type, - 'comment': permission_comment, + 'comment': str(permission_comment), 'created_by': '{}:{}'.format(str(self.__class__.__name__), str(self.ticket.id)), 'date_start': approve_date_start, 'date_expired': approve_date_expired, diff --git a/apps/tickets/handler/apply_asset.py b/apps/tickets/handler/apply_asset.py index 4114c04b39ba6f1e292896bce0b39208b5c15727..d01a5c6b1e207df8e224cb95934de8fd81221bc9 100644 --- a/apps/tickets/handler/apply_asset.py +++ b/apps/tickets/handler/apply_asset.py @@ -1,5 +1,5 @@ from .base import BaseHandler -from django.utils.translation import ugettext as __ +from django.utils.translation import ugettext as _ from perms.models import AssetPermission, Action from assets.models import Asset, SystemUser @@ -54,12 +54,12 @@ class Handler(BaseHandler): {}: {}, {}: {} '''.format( - __('Applied IP group'), apply_ip_group, - __("Applied hostname group"), apply_hostname_group, - __("Applied system user group"), apply_system_user_group, - __("Applied actions"), apply_actions_display, - __('Applied date start'), apply_date_start, - __('Applied date expired'), apply_date_expired, + _('Applied IP group'), apply_ip_group, + _("Applied hostname group"), apply_hostname_group, + _("Applied system user group"), apply_system_user_group, + _("Applied actions"), apply_actions_display, + _('Applied date start'), apply_date_start, + _('Applied date expired'), apply_date_expired, ) return applied_body @@ -75,11 +75,11 @@ class Handler(BaseHandler): {}: {}, {}: {} '''.format( - __('Approved assets'), approve_assets_display, - __('Approved system users'), approve_system_users_display, - __('Approved actions'), ', '.join(approve_actions_display), - __('Approved date start'), approve_date_start, - __('Approved date expired'), approve_date_expired, + _('Approved assets'), approve_assets_display, + _('Approved system users'), approve_system_users_display, + _('Approved actions'), ', '.join(approve_actions_display), + _('Approved date start'), approve_date_start, + _('Approved date expired'), approve_date_expired, ) return approved_body @@ -95,23 +95,25 @@ class Handler(BaseHandler): approve_actions = self.ticket.meta.get('approve_actions', Action.NONE) approve_date_start = self.ticket.meta.get('approve_date_start') approve_date_expired = self.ticket.meta.get('approve_date_expired') - permission_name = '{}({})'.format( - __('Created by ticket ({})'.format(self.ticket.title)), str(self.ticket.id)[:4] + permission_name = _('Created by ticket ({}) ({})'.format( + self.ticket.title, str(self.ticket.id)[:4]) ) - permission_comment = __( + permission_comment = _( 'Created by the ticket, ' 'ticket title: {}, ' 'ticket applicant: {}, ' 'ticket processor: {}, ' 'ticket ID: {}' ''.format( - self.ticket.title, self.ticket.applicant_display, self.ticket.processor_display, + self.ticket.title, + self.ticket.applicant_display, + self.ticket.processor_display, str(self.ticket.id) ) ) permission_data = { 'id': self.ticket.id, - 'name': permission_name, + 'name': str(permission_name), 'comment': permission_comment, 'created_by': '{}:{}'.format(str(self.__class__.__name__), str(self.ticket.id)), 'actions': approve_actions, diff --git a/apps/tickets/handler/base.py b/apps/tickets/handler/base.py index e1820dc0b85efada20b2fc4cc95b18af1e36deff..f55b51a37f66238494739ee76822fc8ddccef1f3 100644 --- a/apps/tickets/handler/base.py +++ b/apps/tickets/handler/base.py @@ -1,6 +1,8 @@ -from django.utils.translation import ugettext as __ +from django.utils.translation import ugettext as _ from common.utils import get_logger -from tickets.utils import send_ticket_processed_mail_to_applicant +from tickets.utils import ( + send_ticket_processed_mail_to_applicant, send_ticket_applied_mail_to_assignees +) logger = get_logger(__name__) @@ -14,9 +16,11 @@ class BaseHandler(object): # on action def _on_open(self): self.ticket.applicant_display = str(self.ticket.applicant) + self.ticket.assignees_display = [str(assignee) for assignee in self.ticket.assignees.all()] meta_display = getattr(self, '_construct_meta_display_of_open', lambda: {})() self.ticket.meta.update(meta_display) self.ticket.save() + self._send_applied_mail_to_assignees() def _on_approve(self): meta_display = getattr(self, '_construct_meta_display_of_approve', lambda: {})() @@ -41,11 +45,12 @@ class BaseHandler(object): return method() # email + def _send_applied_mail_to_assignees(self): + logger.debug('Send applied email to assignees: {}'.format(self.ticket.assignees_display)) + send_ticket_applied_mail_to_assignees(self.ticket) + def _send_processed_mail_to_applicant(self): - msg = 'Ticket ({}) has processed, send mail to applicant ({})'.format( - self.ticket.title, self.ticket.applicant_display - ) - logger.debug(msg) + logger.debug('Send processed mail to applicant: {}'.format(self.ticket.applicant_display)) send_ticket_processed_mail_to_applicant(self.ticket) # comments @@ -54,13 +59,18 @@ class BaseHandler(object): user_display = str(user) action_display = self.ticket.get_action_display() data = { - 'body': __('User {} {} the ticket'.format(user_display, action_display)), + 'body': _('User {} {} the ticket'.format(user_display, action_display)), 'user': user, 'user_display': user_display } return self.ticket.comments.create(**data) # body + body_html_format = ''' + {}: +
{}
+ ''' + def get_body(self): old_body = self.ticket.meta.get('body') if old_body: @@ -71,9 +81,7 @@ class BaseHandler(object): return basic_body + meta_body def _construct_basic_body(self): - body = ''' - {}: - {}: {}, + basic_body = '''{}: {}, {}: {}, {}: {}, {}: {}, @@ -81,15 +89,15 @@ class BaseHandler(object): {}: {}, {}: {} '''.format( - __("Ticket basic info"), - __('Ticket title'), self.ticket.title, - __('Ticket type'), self.ticket.get_type_display(), - __('Ticket applicant'), self.ticket.applicant_display, - __('Ticket assignees'), self.ticket.assignees_display, - __('Ticket processor'), self.ticket.processor_display, - __('Ticket action'), self.ticket.get_action_display(), - __('Ticket status'), self.ticket.get_status_display() + _('Ticket title'), self.ticket.title, + _('Ticket type'), self.ticket.get_type_display(), + _('Ticket applicant'), self.ticket.applicant_display, + _('Ticket assignees'), self.ticket.assignees_display, + _('Ticket processor'), self.ticket.processor_display or _('No'), + _('Ticket action'), self.ticket.get_action_display(), + _('Ticket status'), self.ticket.get_status_display() ) + body = self.body_html_format.format(_("Ticket basic info"), basic_body) return body def _construct_meta_body(self): @@ -102,21 +110,11 @@ class BaseHandler(object): return body def _base_construct_meta_body_of_open(self): - open_body = ''' - {}: - {} - '''.format( - __('Ticket applied info'), - getattr(self, '_construct_meta_body_of_open', lambda: 'No')() - ) - return open_body + meta_body_of_open = getattr(self, '_construct_meta_body_of_open', lambda: 'No')() + body = self.body_html_format.format(_('Ticket applied info'), meta_body_of_open) + return body def _base_construct_meta_body_of_approve(self): - approve_body = ''' - {}: - {} - '''.format( - __('Ticket approved info'), - getattr(self, '_construct_meta_body_of_approve', lambda: 'No')() - ) - return approve_body + meta_body_of_approve = getattr(self, '_construct_meta_body_of_approve', lambda: 'No')() + body = self.body_html_format.format(_('Ticket approved info'), meta_body_of_approve) + return body diff --git a/apps/tickets/handler/login_confirm.py b/apps/tickets/handler/login_confirm.py index 21419022fb627dff0a90b93023e4ee24e313e484..b1d491cfc1dbf2e67f1e7a830fab29645f00aa8f 100644 --- a/apps/tickets/handler/login_confirm.py +++ b/apps/tickets/handler/login_confirm.py @@ -1,4 +1,4 @@ -from django.utils.translation import ugettext as __ +from django.utils.translation import ugettext as _ from .base import BaseHandler @@ -13,8 +13,8 @@ class Handler(BaseHandler): {}: {}, {}: {} '''.format( - __("Applied login IP"), apply_login_ip, - __("Applied login city"), apply_login_city, - __("Applied login datetime"), apply_login_datetime, + _("Applied login IP"), apply_login_ip, + _("Applied login city"), apply_login_city, + _("Applied login datetime"), apply_login_datetime, ) return applied_body diff --git a/apps/tickets/signals_handler/ticket.py b/apps/tickets/signals_handler/ticket.py index 7e8bc8d5d11eedfc46e259ee4422c2d44bf0e364..aae620295e99ac03f4c11f209702f68596781efb 100644 --- a/apps/tickets/signals_handler/ticket.py +++ b/apps/tickets/signals_handler/ticket.py @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- # from django.dispatch import receiver -from django.db.models.signals import m2m_changed from common.utils import get_logger from tickets.models import Ticket -from tickets.utils import send_ticket_applied_mail_to_assignees from ..signals import post_change_ticket_action @@ -15,19 +13,3 @@ logger = get_logger(__name__) @receiver(post_change_ticket_action, sender=Ticket) def on_post_change_ticket_action(sender, ticket, action, **kwargs): ticket.handler.dispatch(action) - - -@receiver(m2m_changed, sender=Ticket.assignees.through) -def on_ticket_assignees_changed(sender, instance, action, reverse, model, pk_set, **kwargs): - if reverse: - return - if action != 'post_add': - return - logger.debug('Receives ticket and assignees changed signal, ticket: {}'.format(instance.title)) - instance.assignees_display = [str(assignee) for assignee in instance.assignees.all()] - instance.save() - assignees = model.objects.filter(pk__in=pk_set) - assignees_display = [str(assignee) for assignee in assignees] - logger.debug('Send applied email to assignees: {}'.format(assignees_display)) - send_ticket_applied_mail_to_assignees(instance, assignees) - diff --git a/apps/tickets/utils.py b/apps/tickets/utils.py index ebd4c22b8feb20075adf1df4cb2936ae0fc35d8f..523d0f1022f2f50f618ee01e1b9c4c063162fb18 100644 --- a/apps/tickets/utils.py +++ b/apps/tickets/utils.py @@ -11,10 +11,10 @@ from . import const logger = get_logger(__file__) -def send_ticket_applied_mail_to_assignees(ticket, assignees): - if not assignees: +def send_ticket_applied_mail_to_assignees(ticket): + if not ticket.assignees: logger.debug("Not found assignees, ticket: {}({}), assignees: {}".format( - ticket, str(ticket.id), assignees) + ticket, str(ticket.id), ticket.assignees) ) return @@ -22,25 +22,22 @@ def send_ticket_applied_mail_to_assignees(ticket, assignees): ticket_detail_url = urljoin( settings.SITE_URL, const.TICKET_DETAIL_URL.format(id=str(ticket.id)) ) - message = _( - """
-

Your has a new ticket

+ message = """ +
+

{title} {ticket_detail_url_description}

- Ticket: -
- {body} -
- click here to review + {body}
""".format( + title=_('Your has a new ticket, from applicant - {}').format(str(ticket.applicant)), + ticket_detail_url=ticket_detail_url, + ticket_detail_url_description=_('click here to review'), body=ticket.body.replace('\n', '
'), - ticket_detail_url=ticket_detail_url - ) ) if settings.DEBUG: logger.debug(message) - recipient_list = [assignee.email for assignee in assignees] + recipient_list = [assignee.email for assignee in ticket.assignees.all()] send_mail_async.delay(subject, message, recipient_list, html_message=message) @@ -48,22 +45,18 @@ def send_ticket_processed_mail_to_applicant(ticket): if not ticket.applicant: logger.error("Not found applicant: {}({})".format(ticket.title, ticket.id)) return - subject = _('Ticket has processed: {} ({})').format(ticket.title, ticket.get_type_display()) - message = _( - """ + subject = _('Ticket has processed: {} ({})').format(ticket.title, ticket.processor_display) + message = """
-

Your ticket has been processed

+

{title}

- Ticket: -
- {body} -
+ {body}
""".format( + title=_('Your ticket has been ({}) processed').format(ticket.processor_display), body=ticket.body.replace('\n', '
'), ) - ) if settings.DEBUG: logger.debug(message) recipient_list = [ticket.applicant.email]