Add ticket unassignment
This commit is contained in:
parent
0cc788c039
commit
5ec2407211
@ -187,6 +187,6 @@ ZENDESK_GROUPS = {
|
|||||||
'employees': 'Поддержка',
|
'employees': 'Поддержка',
|
||||||
'buffer': 'Сменная группа',
|
'buffer': 'Сменная группа',
|
||||||
}
|
}
|
||||||
|
SOLVED_TICKETS_EMAIL = 'd.krikov@ngenix.net'
|
||||||
ONE_DAY = 12 # Количество часов в 1 рабочем дне
|
ONE_DAY = 12 # Количество часов в 1 рабочем дне
|
||||||
|
|
||||||
|
@ -2,10 +2,11 @@ import os
|
|||||||
from datetime import timedelta, datetime, date
|
from datetime import timedelta, datetime, date
|
||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from django.utils import timezone
|
||||||
from zenpy import Zenpy
|
from zenpy import Zenpy
|
||||||
from zenpy.lib.exception import APIException
|
from zenpy.lib.exception import APIException
|
||||||
|
|
||||||
from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY, ZENDESK_GROUPS
|
from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY, ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL
|
||||||
from main.models import UserProfile, RoleChangeLogs, UnassignedTicket, UnassignedTicketStatus
|
from main.models import UserProfile, RoleChangeLogs, UnassignedTicket, UnassignedTicketStatus
|
||||||
|
|
||||||
|
|
||||||
@ -143,15 +144,16 @@ def make_light_agent(user_profile: UserProfile, who_changes: User) -> UserProfil
|
|||||||
"""
|
"""
|
||||||
Функция **make_light_agent** устанавливапет пользователю роль легкого агента.
|
Функция **make_light_agent** устанавливапет пользователю роль легкого агента.
|
||||||
"""
|
"""
|
||||||
tickets = get_ticket_list(user_profile.user.email)
|
tickets = get_tickets_list(user_profile.user.email)
|
||||||
for ticket in tickets:
|
for ticket in tickets:
|
||||||
if ticket.status=='solved':
|
|
||||||
continue
|
|
||||||
UnassignedTicket.objects.create(
|
UnassignedTicket.objects.create(
|
||||||
assignee=user_profile.user,
|
assignee=user_profile.user,
|
||||||
ticket_id=ticket.id,
|
ticket_id=ticket.id,
|
||||||
status=UnassignedTicketStatus.UNASSIGNED
|
status=UnassignedTicketStatus.SOLVED if ticket.status == 'solved' else UnassignedTicketStatus.UNASSIGNED
|
||||||
)
|
)
|
||||||
|
if ticket.status == 'solved':
|
||||||
|
ticket.assignee = ZendeskAdmin().get_user(SOLVED_TICKETS_EMAIL)
|
||||||
|
else:
|
||||||
ticket.assignee = None
|
ticket.assignee = None
|
||||||
ticket.group = ZendeskAdmin().get_group(ZENDESK_GROUPS['buffer'])
|
ticket.group = ZendeskAdmin().get_group(ZENDESK_GROUPS['buffer'])
|
||||||
ZendeskAdmin().admin.tickets.update(ticket)
|
ZendeskAdmin().admin.tickets.update(ticket)
|
||||||
@ -175,7 +177,10 @@ def get_users_list() -> list:
|
|||||||
return zendesk.admin.organizations.users(org)
|
return zendesk.admin.organizations.users(org)
|
||||||
|
|
||||||
|
|
||||||
def get_ticket_list(email):
|
def get_tickets_list(email):
|
||||||
|
"""
|
||||||
|
Функция возвращает список тикетов пользователя Zendesk
|
||||||
|
"""
|
||||||
return ZendeskAdmin().admin.search(assignee=email, type='ticket')
|
return ZendeskAdmin().admin.search(assignee=email, type='ticket')
|
||||||
|
|
||||||
|
|
||||||
@ -381,9 +386,15 @@ class StatisticData:
|
|||||||
|
|
||||||
if last_log.new_role == ROLES['engineer']:
|
if last_log.new_role == ROLES['engineer']:
|
||||||
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))
|
||||||
self.statistic[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds()
|
if last_log.change_time.date() == timezone.now().date():
|
||||||
if self.end_date == datetime.now().date():
|
self.statistic[last_log.change_time.date()] += (
|
||||||
self.statistic[self.end_date] = get_timedelta(None, datetime.now().time()).total_seconds()
|
get_timedelta(None, timezone.now().time()) - get_timedelta(last_log)
|
||||||
|
).total_seconds()
|
||||||
|
else:
|
||||||
|
self.statistic[last_log.change_time.date()] += (
|
||||||
|
timedelta(days=1) - get_timedelta(last_log)).total_seconds()
|
||||||
|
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):
|
for log_index in range(len(self.data) - 1):
|
||||||
if self.data[log_index].new_role == ROLES['engineer']:
|
if self.data[log_index].new_role == ROLES['engineer']:
|
||||||
|
@ -47,6 +47,7 @@ class UnassignedTicketStatus(models.IntegerChoices):
|
|||||||
RESTORED = 1, 'Авторство восстановлено'
|
RESTORED = 1, 'Авторство восстановлено'
|
||||||
NOT_FOUND = 2, 'Пока нас не было, тикет испарился из буферной группы. Дополнительные действия не требуются'
|
NOT_FOUND = 2, 'Пока нас не было, тикет испарился из буферной группы. Дополнительные действия не требуются'
|
||||||
CLOSED = 3, 'Тикет уже был закрыт. Дополнительные действия не требуются'
|
CLOSED = 3, 'Тикет уже был закрыт. Дополнительные действия не требуются'
|
||||||
|
SOLVED = 4, 'Тикет решён. Записан на пользователя с почтой SOLVED_TICKETS_EMAIL'
|
||||||
|
|
||||||
|
|
||||||
class UnassignedTicket(models.Model):
|
class UnassignedTicket(models.Model):
|
||||||
|
@ -20,7 +20,7 @@ from zenpy.lib.api_objects import User as ZenpyUser
|
|||||||
|
|
||||||
from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_GROUPS
|
from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_GROUPS
|
||||||
from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \
|
from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \
|
||||||
get_users_list, StatisticData, get_ticket_list, ZendeskAdmin
|
get_users_list, StatisticData, get_tickets_list, ZendeskAdmin
|
||||||
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
||||||
from .models import UserProfile, UnassignedTicket, UnassignedTicketStatus
|
from .models import UserProfile, UnassignedTicket, UnassignedTicketStatus
|
||||||
|
|
||||||
@ -181,9 +181,9 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView):
|
|||||||
self.make_light_agents(form.cleaned_data['users'])
|
self.make_light_agents(form.cleaned_data['users'])
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
@staticmethod
|
def make_engineers(self, users):
|
||||||
def make_engineers(users):
|
for user in users:
|
||||||
[make_engineer(user) for user in users]
|
make_engineer(user, self.request.user)
|
||||||
|
|
||||||
def make_light_agents(self, users):
|
def make_light_agents(self, users):
|
||||||
for user in users:
|
for user in users:
|
||||||
@ -227,8 +227,8 @@ class CustomLoginView(LoginView):
|
|||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
def statistic_page(request):
|
def statistic_page(request):
|
||||||
if not request.user.is_superuser:
|
if not request.user.has_perm('main.has_control_access'):
|
||||||
return redirect('index')
|
raise PermissionDenied
|
||||||
context = {
|
context = {
|
||||||
'pagename': 'страница статистики',
|
'pagename': 'страница статистики',
|
||||||
'errors': list(),
|
'errors': list(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user