Added notificcations about role changes
This commit is contained in:
parent
74823e6c26
commit
a8ca0b0eae
@ -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():
|
||||||
|
18
main/migrations/0015_auto_20210321_1600.py
Normal file
18
main/migrations/0015_auto_20210321_1600.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
14
main/templates/base/success_messages.html
Normal file
14
main/templates/base/success_messages.html
Normal 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>
|
@ -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>
|
||||||
|
@ -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 %}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
"""
|
"""
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user