Added notificcations about role changes

This commit is contained in:
Yuriy Kulakov 2021-03-21 19:47:42 +03:00
parent 74823e6c26
commit a8ca0b0eae
7 changed files with 58 additions and 18 deletions

View File

@ -236,16 +236,14 @@ def update_user_in_model(profile, zendesk_user):
profile.name = zendesk_user.name profile.name = zendesk_user.name
profile.role = zendesk_user.role profile.role = zendesk_user.role
profile.image = zendesk_user.photo['content_url'] if zendesk_user.photo else None 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() profile.save()
def count_users(users) -> tuple: def count_users(users) -> tuple:
""" """
Функция подсчета количества сотрудников с ролями engineer и light_a Функция подсчета количества сотрудников с ролями engineer и light_a
.. todo::
this func counts users from all zendesk instead of just from a model:
""" """
engineers, light_agents = 0, 0 engineers, light_agents = 0, 0
for user in users: for user in users:
@ -443,11 +441,11 @@ class StatisticData:
if first_log.old_role == ROLES['engineer']: if first_log.old_role == ROLES['engineer']:
self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds() 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)) 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(): if last_log.change_time.date() == timezone.now().date():
self.statistic[last_log.change_time.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() ).total_seconds()
else: else:
self.statistic[last_log.change_time.date()] += ( self.statistic[last_log.change_time.date()] += (
@ -455,7 +453,7 @@ class StatisticData:
if self.end_date == timezone.now().date(): if self.end_date == timezone.now().date():
self.statistic[self.end_date] = get_timedelta(None, timezone.now().time()).total_seconds() 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']: if self.data[log_index].new_role == ROLES['engineer']:
current_log, next_log = self.data[log_index], self.data[log_index + 1] current_log, next_log = self.data[log_index], self.data[log_index + 1]
if current_log.change_time.date() != next_log.change_time.date(): if current_log.change_time.date() != next_log.change_time.date():

View File

@ -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),
),
]

View File

@ -0,0 +1,14 @@
<div class="mt-5">
{% for message in messages %}
<div
class="alert alert-{{ message.tags }} alert-dismissible fade show p-2"
role="alert"
style="display: flex; align-items: center; justify-content: space-between;"
>
{{ message }}
<div>
<button type="button" class="btn btn-light p-2" data-bs-dismiss="alert" aria-label="Close">X</button>
</div>
</div>
{% endfor %}
</div>

View File

@ -101,12 +101,13 @@
<button type="submit" name="light_agent" class="hand-over-acess-button default-button"> <button type="submit" name="light_agent" class="hand-over-acess-button default-button">
Назначить выбранных на роль легкого агента Назначить выбранных на роль легкого агента
</button> </button>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
</form> </form>
{% endblock %} {% endblock %}
{% include 'base/success_messages.html' %}
</div> </div>
<script src="{% static 'main/js/control.js'%}" type="text/babel"></script> <script src="{% static 'main/js/control.js'%}" type="text/babel"></script>

View File

@ -61,6 +61,7 @@
<a href="/work/hand_over" class="hand-over-acess-button default-button">Сдать права инженера</a> <a href="/work/hand_over" class="hand-over-acess-button default-button">Сдать права инженера</a>
</div> </div>
</div> </div>
{% include 'base/success_messages.html' %}
</div> </div>
{% endblock %} {% endblock %}

View File

@ -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.tokens import default_token_generator
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.messages.views import SuccessMessageMixin
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponseRedirect, HttpResponse 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.urls import reverse_lazy, reverse
from django.views.generic import FormView from django.views.generic import FormView
from django_registration.views import RegistrationView from django_registration.views import RegistrationView
from django.contrib import messages
# Django REST # Django REST
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.response import Response from rest_framework.response import Response
from zenpy.lib.api_objects import User as ZenpyUser from zenpy.lib.api_objects import User as ZenpyUser
from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS
@ -131,6 +135,7 @@ def work_page(request, id):
context = { context = {
'engineers': engineers, 'engineers': engineers,
'agents': light_agents, 'agents': light_agents,
'messages': messages.get_messages(request),
'licences_remaining': max(0, ZENDESK_MAX_AGENTS - len(engineers)), 'licences_remaining': max(0, ZENDESK_MAX_AGENTS - len(engineers)),
'pagename': 'Управление правами' 'pagename': 'Управление правами'
} }
@ -138,15 +143,19 @@ def work_page(request, id):
return redirect("login") 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() @login_required()
def work_hand_over(request): def work_hand_over(request):
zenpy_user, admin = auth_user(request) zenpy_user, admin = auth_user(request)
if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']: if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']:
zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent'] zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent']
admin.users.update(zenpy_user) user_update(zenpy_user, admin, request)
request.user.userprofile.role = "agent"
request.user.userprofile.save()
return HttpResponseRedirect(reverse('work', args=(request.user.id,))) return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
@ -155,9 +164,7 @@ def work_become_engineer(request):
zenpy_user, admin = auth_user(request) zenpy_user, admin = auth_user(request)
if zenpy_user.custom_role_id == ZENDESK_ROLES['light_agent']: if zenpy_user.custom_role_id == ZENDESK_ROLES['light_agent']:
zenpy_user.custom_role_id = ZENDESK_ROLES['engineer'] zenpy_user.custom_role_id = ZENDESK_ROLES['engineer']
admin.users.update(zenpy_user) user_update(zenpy_user, admin, request)
request.user.userprofile.role = "agent"
request.user.userprofile.save()
return HttpResponseRedirect(reverse('work', args=(request.user.id,))) return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
@ -170,11 +177,12 @@ def main_page(request):
return render(request, 'pages/index.html') return render(request, 'pages/index.html')
class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, FormView):
permission_required = 'main.has_control_access' permission_required = 'main.has_control_access'
template_name = 'pages/adm_ruleset.html' template_name = 'pages/adm_ruleset.html'
form_class = AdminPageUsers form_class = AdminPageUsers
success_url = '/control/' success_url = '/control/'
success_message = "Права были изменены."
def form_valid(self, form: AdminPageUsers) -> AdminPageUsers: def form_valid(self, form: AdminPageUsers) -> AdminPageUsers:
""" """

View File

@ -65,7 +65,7 @@ class TableBody extends React.Component {
componentDidMount() { componentDidMount() {
this.interval = setInterval(() => { this.interval = setInterval(() => {
this.get_users(); this.get_users();
}, 10000); }, 60000);
} }
componentWillUnmount() { componentWillUnmount() {
@ -80,4 +80,4 @@ class TableBody extends React.Component {
} }
ReactDOM.render(<TableBody />, document.getElementById("new_tbody")); ReactDOM.render(<TableBody />, document.getElementById("new_tbody"));
setTimeout(() => document.getElementById("old_tbody").remove(), 10000); setTimeout(() => document.getElementById("old_tbody").remove(), 60000);