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.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():
|
||||
|
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>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% include 'base/success_messages.html' %}
|
||||
</div>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
{% include 'base/success_messages.html' %}
|
||||
</div>
|
||||
{% 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.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:
|
||||
"""
|
||||
|
@ -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(<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