From a8ca0b0eae3b978cbc5bceeb6bddeadffb145496 Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Sun, 21 Mar 2021 19:47:42 +0300 Subject: [PATCH] Added notificcations about role changes --- main/extra_func.py | 12 +++++------ main/migrations/0015_auto_20210321_1600.py | 18 ++++++++++++++++ main/templates/base/success_messages.html | 14 +++++++++++++ main/templates/pages/adm_ruleset.html | 3 ++- main/templates/pages/work.html | 1 + main/views.py | 24 ++++++++++++++-------- static/main/js/control.js | 4 ++-- 7 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 main/migrations/0015_auto_20210321_1600.py create mode 100644 main/templates/base/success_messages.html diff --git a/main/extra_func.py b/main/extra_func.py index f2a4df9..f5488d6 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -236,16 +236,14 @@ def update_user_in_model(profile, zendesk_user): profile.name = zendesk_user.name profile.role = zendesk_user.role profile.image = zendesk_user.photo['content_url'] if zendesk_user.photo else None - profile.custom_role_id = zendesk_user.custom_role_id + if zendesk_user.custom_role_id is not None: + profile.custom_role_id = int(zendesk_user.custom_role_id) profile.save() def count_users(users) -> tuple: """ Функция подсчета количества сотрудников с ролями engineer и light_a - - .. todo:: - this func counts users from all zendesk instead of just from a model: """ engineers, light_agents = 0, 0 for user in users: @@ -443,11 +441,11 @@ class StatisticData: if first_log.old_role == ROLES['engineer']: self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds() - if last_log.new_role == ROLES['engineer']: #TODO отдельная функция + if last_log.new_role == ROLES['engineer']: # TODO отдельная функция self.fill_daterange(last_log.change_time.date() + timedelta(days=1), self.end_date + timedelta(days=1)) if last_log.change_time.date() == timezone.now().date(): self.statistic[last_log.change_time.date()] += ( - get_timedelta(None, timezone.now().time()) - get_timedelta(last_log) + get_timedelta(None, timezone.now().time()) - get_timedelta(last_log) ).total_seconds() else: self.statistic[last_log.change_time.date()] += ( @@ -455,7 +453,7 @@ class StatisticData: if self.end_date == timezone.now().date(): self.statistic[self.end_date] = get_timedelta(None, timezone.now().time()).total_seconds() - for log_index in range(len(self.data) - 1): #TODO отдельная функция + for log_index in range(len(self.data) - 1): # TODO отдельная функция if self.data[log_index].new_role == ROLES['engineer']: current_log, next_log = self.data[log_index], self.data[log_index + 1] if current_log.change_time.date() != next_log.change_time.date(): diff --git a/main/migrations/0015_auto_20210321_1600.py b/main/migrations/0015_auto_20210321_1600.py new file mode 100644 index 0000000..79b5726 --- /dev/null +++ b/main/migrations/0015_auto_20210321_1600.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.6 on 2021-03-21 13:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0014_auto_20210314_1455'), + ] + + operations = [ + migrations.AlterField( + model_name='unassignedticket', + name='status', + field=models.IntegerField(choices=[(0, 'Снят с пользователя, перенесён в буферную группу'), (1, 'Авторство восстановлено'), (2, 'Пока нас не было, тикет испарился из буферной группы. Дополнительные действия не требуются'), (3, 'Тикет уже был закрыт. Дополнительные действия не требуются'), (4, 'Тикет решён. Записан на пользователя с почтой SOLVED_TICKETS_EMAIL')], default=0), + ), + ] diff --git a/main/templates/base/success_messages.html b/main/templates/base/success_messages.html new file mode 100644 index 0000000..fdef313 --- /dev/null +++ b/main/templates/base/success_messages.html @@ -0,0 +1,14 @@ +
+ {% for message in messages %} + + {% endfor %} +
diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 92686f1..b324ac7 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -101,12 +101,13 @@ - {% endblock %} {% endblock %} + + {% include 'base/success_messages.html' %} diff --git a/main/templates/pages/work.html b/main/templates/pages/work.html index 1ce7dd3..67c5846 100644 --- a/main/templates/pages/work.html +++ b/main/templates/pages/work.html @@ -61,6 +61,7 @@ Сдать права инженера + {% include 'base/success_messages.html' %} {% endblock %} diff --git a/main/views.py b/main/views.py index a8b3af5..2c00277 100644 --- a/main/views.py +++ b/main/views.py @@ -7,6 +7,7 @@ from django.contrib.auth.models import User, Permission from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.views import LoginView from django.contrib.contenttypes.models import ContentType +from django.contrib.messages.views import SuccessMessageMixin from django.core.exceptions import PermissionDenied from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponse @@ -14,9 +15,12 @@ from django.shortcuts import render, get_list_or_404, redirect from django.urls import reverse_lazy, reverse from django.views.generic import FormView from django_registration.views import RegistrationView +from django.contrib import messages + # Django REST from rest_framework import viewsets from rest_framework.response import Response + from zenpy.lib.api_objects import User as ZenpyUser from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS @@ -131,6 +135,7 @@ def work_page(request, id): context = { 'engineers': engineers, 'agents': light_agents, + 'messages': messages.get_messages(request), 'licences_remaining': max(0, ZENDESK_MAX_AGENTS - len(engineers)), 'pagename': 'Управление правами' } @@ -138,15 +143,19 @@ def work_page(request, id): return redirect("login") +def user_update(zenpy_user, admin, request): + admin.users.update(zenpy_user) + request.user.userprofile.role = "agent" + request.user.userprofile.save() + messages.success(request, "Права были изменены") + + @login_required() def work_hand_over(request): zenpy_user, admin = auth_user(request) - if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']: zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent'] - admin.users.update(zenpy_user) - request.user.userprofile.role = "agent" - request.user.userprofile.save() + user_update(zenpy_user, admin, request) return HttpResponseRedirect(reverse('work', args=(request.user.id,))) @@ -155,9 +164,7 @@ def work_become_engineer(request): zenpy_user, admin = auth_user(request) if zenpy_user.custom_role_id == ZENDESK_ROLES['light_agent']: zenpy_user.custom_role_id = ZENDESK_ROLES['engineer'] - admin.users.update(zenpy_user) - request.user.userprofile.role = "agent" - request.user.userprofile.save() + user_update(zenpy_user, admin, request) return HttpResponseRedirect(reverse('work', args=(request.user.id,))) @@ -170,11 +177,12 @@ def main_page(request): return render(request, 'pages/index.html') -class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): +class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, FormView): permission_required = 'main.has_control_access' template_name = 'pages/adm_ruleset.html' form_class = AdminPageUsers success_url = '/control/' + success_message = "Права были изменены." def form_valid(self, form: AdminPageUsers) -> AdminPageUsers: """ diff --git a/static/main/js/control.js b/static/main/js/control.js index 62d2daf..e518c36 100644 --- a/static/main/js/control.js +++ b/static/main/js/control.js @@ -65,7 +65,7 @@ class TableBody extends React.Component { componentDidMount() { this.interval = setInterval(() => { this.get_users(); - }, 10000); + }, 60000); } componentWillUnmount() { @@ -80,4 +80,4 @@ class TableBody extends React.Component { } ReactDOM.render(, document.getElementById("new_tbody")); -setTimeout(() => document.getElementById("old_tbody").remove(), 10000); +setTimeout(() => document.getElementById("old_tbody").remove(), 60000);