From 2f4096bf3d95b7877777eacb9ae56ffb18ac2338 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 18 Nov 2019 11:54:12 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9ticket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/models.py | 3 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 83668 -> 83709 bytes apps/locale/zh/LC_MESSAGES/django.po | 40 ++++++++++-------- apps/tickets/models/ticket.py | 8 +++- apps/tickets/serializers/ticket.py | 4 +- .../templates/tickets/ticket_detail.html | 2 +- apps/tickets/views.py | 5 ++- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/apps/authentication/models.py b/apps/authentication/models.py index 614906c73..e8d4b6114 100644 --- a/apps/authentication/models.py +++ b/apps/authentication/models.py @@ -54,13 +54,14 @@ class LoginConfirmSetting(CommonModelMixin): if request: remote_addr = get_request_ip(request) city = get_ip_city(remote_addr) + datetime = timezone.now().strftime('%Y-%m-%d %H:%M:%S') body = __("{user_key}: {username}
" "IP: {ip}
" "{city_key}: {city}
" "{date_key}: {date}
").format( user_key=__("User"), username=self.user, ip=remote_addr, city_key=_("City"), city=city, - date_key=__("Datetime"), date=timezone.now() + date_key=__("Datetime"), date=datetime ) else: body = '' diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 83f364a18af06aa7f630844ce5858cc1d5fafa79..e5c3a3820ec71f35c73971cfbe1bf5647cd32b21 100644 GIT binary patch delta 18393 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 aVC41f^R8@K_1DI){+c>_&ggnU?f(yX!Y3F2 delta 18337 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\n" "Language-Team: Jumpserver team\n" @@ -259,7 +259,7 @@ msgstr "创建日期" #: perms/templates/perms/remote_app_permission_detail.html:94 #: settings/models.py:34 terminal/models.py:33 #: terminal/templates/terminal/terminal_detail.html:63 -#: tickets/templates/tickets/ticket_detail.html:106 users/models/group.py:15 +#: tickets/templates/tickets/ticket_detail.html:104 users/models/group.py:15 #: users/models/user.py:443 users/templates/users/user_detail.html:130 #: users/templates/users/user_group_detail.html:67 #: users/templates/users/user_group_list.html:37 @@ -527,7 +527,7 @@ msgstr "创建远程应用" #: settings/templates/settings/terminal_setting.html:107 #: terminal/templates/terminal/session_list.html:36 #: terminal/templates/terminal/terminal_list.html:36 -#: tickets/templates/tickets/ticket_list.html:93 +#: tickets/templates/tickets/ticket_list.html:94 #: users/templates/users/_granted_assets.html:34 #: users/templates/users/user_group_list.html:38 #: users/templates/users/user_list.html:41 @@ -1127,9 +1127,9 @@ msgstr "默认资产组" #: terminal/templates/terminal/command_list.html:65 #: terminal/templates/terminal/session_list.html:27 #: terminal/templates/terminal/session_list.html:71 tickets/models/ticket.py:32 -#: tickets/models/ticket.py:85 tickets/templates/tickets/ticket_detail.html:32 +#: tickets/models/ticket.py:104 tickets/templates/tickets/ticket_detail.html:32 #: tickets/templates/tickets/ticket_list.html:22 -#: tickets/templates/tickets/ticket_list.html:88 users/forms.py:339 +#: tickets/templates/tickets/ticket_list.html:89 users/forms.py:339 #: users/models/user.py:149 users/models/user.py:165 users/models/user.py:537 #: users/serializers/group.py:21 #: users/templates/users/user_group_detail.html:78 @@ -2306,7 +2306,7 @@ msgstr "原因" #: audits/models.py:88 audits/templates/audits/login_log_list.html:64 #: tickets/templates/tickets/ticket_detail.html:34 #: tickets/templates/tickets/ticket_list.html:24 -#: tickets/templates/tickets/ticket_list.html:89 +#: tickets/templates/tickets/ticket_list.html:90 #: xpack/plugins/cloud/models.py:275 xpack/plugins/cloud/models.py:310 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:70 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:65 @@ -2366,7 +2366,7 @@ msgstr "ID" msgid "UA" msgstr "Agent" -#: audits/templates/audits/login_log_list.html:61 authentication/models.py:62 +#: audits/templates/audits/login_log_list.html:61 authentication/models.py:63 msgid "City" msgstr "城市" @@ -4208,7 +4208,7 @@ msgstr "批量命令" msgid "Task monitor" msgstr "任务监控" -#: templates/_nav.html:128 tickets/views.py:17 tickets/views.py:32 +#: templates/_nav.html:128 tickets/views.py:17 tickets/views.py:34 msgid "Tickets" msgstr "工单管理" @@ -4562,7 +4562,8 @@ msgid "Accept" msgstr "接受" #: terminal/templates/terminal/terminal_list.html:80 -#: tickets/models/ticket.py:30 tickets/templates/tickets/ticket_list.html:95 +#: tickets/models/ticket.py:30 tickets/templates/tickets/ticket_detail.html:101 +#: tickets/templates/tickets/ticket_list.html:96 msgid "Reject" msgstr "拒绝" @@ -4600,11 +4601,11 @@ msgid "" msgstr "你可以使用ssh客户端工具连接终端" #: tickets/models/ticket.py:17 tickets/models/ticket.py:69 -#: tickets/templates/tickets/ticket_list.html:90 +#: tickets/templates/tickets/ticket_list.html:91 msgid "Open" msgstr "开启" -#: tickets/models/ticket.py:18 tickets/templates/tickets/ticket_list.html:91 +#: tickets/models/ticket.py:18 tickets/templates/tickets/ticket_list.html:92 msgid "Closed" msgstr "关闭" @@ -4616,20 +4617,21 @@ msgstr "一般" msgid "Login confirm" msgstr "登录复核" -#: tickets/models/ticket.py:29 tickets/templates/tickets/ticket_list.html:94 +#: tickets/models/ticket.py:29 tickets/templates/tickets/ticket_detail.html:100 +#: tickets/templates/tickets/ticket_list.html:95 msgid "Approve" msgstr "同意" -#: tickets/models/ticket.py:33 tickets/models/ticket.py:86 +#: tickets/models/ticket.py:33 tickets/models/ticket.py:105 msgid "User display name" msgstr "用户显示名称" #: tickets/models/ticket.py:35 tickets/templates/tickets/ticket_list.html:21 -#: tickets/templates/tickets/ticket_list.html:87 +#: tickets/templates/tickets/ticket_list.html:88 msgid "Title" msgstr "标题" -#: tickets/models/ticket.py:36 tickets/models/ticket.py:87 +#: tickets/models/ticket.py:36 tickets/models/ticket.py:106 msgid "Body" msgstr "内容" @@ -4657,8 +4659,12 @@ msgstr "待处理人名称" msgid "{} {} this ticket" msgstr "{} {} 这个工单" +#: tickets/models/ticket.py:81 +msgid "this ticket" +msgstr "这个工单" + #: tickets/templates/tickets/ticket_detail.html:66 -#: tickets/templates/tickets/ticket_detail.html:81 +#: tickets/templates/tickets/ticket_detail.html:80 msgid "ago" msgstr "前" @@ -4738,7 +4744,7 @@ msgstr "" msgid "Ticket list" msgstr "工单列表" -#: tickets/views.py:33 +#: tickets/views.py:35 msgid "Ticket detail" msgstr "工单详情" diff --git a/apps/tickets/models/ticket.py b/apps/tickets/models/ticket.py index 98712da1e..0db499817 100644 --- a/apps/tickets/models/ticket.py +++ b/apps/tickets/models/ticket.py @@ -78,7 +78,7 @@ class Ticket(CommonModelMixin): def create_action_comment(self, action, user): action_display = dict(self.ACTION_CHOICES).get(action) - body = '{} {} {}'.format(user, action_display, _("this order")) + body = '{} {} {}'.format(user, action_display, _("this ticket")) self.comments.create(body=body, user=user, user_display=str(user)) def perform_action(self, action, user): @@ -89,6 +89,12 @@ class Ticket(CommonModelMixin): self.assignees_display = str(user) self.save() + def is_assignee(self, user): + return self.assignees.filter(id=user.id).exists() + + def is_user(self, user): + return self.user == user + class Meta: ordering = ('-date_created',) diff --git a/apps/tickets/serializers/ticket.py b/apps/tickets/serializers/ticket.py index 9eb2d777b..b7bcde25a 100644 --- a/apps/tickets/serializers/ticket.py +++ b/apps/tickets/serializers/ticket.py @@ -13,7 +13,7 @@ class TicketSerializer(serializers.ModelSerializer): fields = [ 'id', 'user', 'user_display', 'title', 'body', 'assignees', 'assignees_display', - 'status', 'date_created', 'date_updated', + 'status', 'action', 'date_created', 'date_updated', 'type_display', 'action_display', ] read_only_fields = [ @@ -32,6 +32,8 @@ class TicketSerializer(serializers.ModelSerializer): if action and user not in instance.assignees.all(): error = {"action": "Only assignees can update"} raise serializers.ValidationError(error) + print(validated_data) + print(instance.status) if instance.status == instance.STATUS_CLOSED: validated_data.pop('action') instance = super().update(instance, validated_data) diff --git a/apps/tickets/templates/tickets/ticket_detail.html b/apps/tickets/templates/tickets/ticket_detail.html index ec25f50e7..bcbe83045 100644 --- a/apps/tickets/templates/tickets/ticket_detail.html +++ b/apps/tickets/templates/tickets/ticket_detail.html @@ -96,7 +96,7 @@

- {% if object.type == object.TYPE_LOGIN_CONFIRM %} + {% if has_action_perm %} {% trans 'Approve' %} {% trans 'Reject' %} {% endif %} diff --git a/apps/tickets/views.py b/apps/tickets/views.py index 0432ec6bc..84a08eb1c 100644 --- a/apps/tickets/views.py +++ b/apps/tickets/views.py @@ -27,9 +27,12 @@ class TicketDetailView(PermissionsMixin, mixins.TicketMixin, DetailView): queryset = Ticket.objects.all() def get_context_data(self, **kwargs): + ticket = self.get_object() + has_action_perm = ticket.is_assignee(self.request.user) context = super().get_context_data(**kwargs) context.update({ 'app': _("Tickets"), - 'action': _("Ticket detail") + 'action': _("Ticket detail"), + 'has_action_perm': has_action_perm, }) return context