diff --git a/access_controller/settings.py b/access_controller/settings.py index b1b98a9..1619d5d 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -181,3 +181,5 @@ ACTRL_ZENDESK_SUBDOMAIN = os.getenv('ACTRL_ZENDESK_SUBDOMAIN') or os.getenv('ZD_ ACTRL_API_EMAIL = os.getenv('ACTRL_API_EMAIL') or os.getenv('ACCESS_CONTROLLER_API_EMAIL') ACTRL_API_TOKEN = os.getenv('ACTRL_API_TOKEN') or os.getenv('ACCESS_CONTROLLER_API_TOKEN') ACTRL_API_PASSWORD = os.getenv('ACTRL_API_PASSWORD') or os.getenv('ACCESS_CONTROLLER_API_PASSWORD') + + diff --git a/main/extra_func.py b/main/extra_func.py index af1555d..2c7e0a4 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -5,7 +5,7 @@ import logging from datetime import timedelta, datetime, date from typing import Optional, Union -from django.contrib.auth import get_user_model +from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect @@ -27,7 +27,6 @@ def update_role(user_profile: UserProfile, role: int, who_changes: get_user_mode :param user_profile: Профиль пользователя :param role: Новая роль - :param who_changes: Пользователь, меняющий роль :return: Пользователь с обновленной ролью """ zendesk = zenpy @@ -44,7 +43,8 @@ def make_engineer(user_profile: UserProfile, who_changes: get_user_model()) -> N Функция устанавливает пользователю роль инженера. :param user_profile: Профиль пользователя - :return: Вызов функции **update_role** с параметрами: профиль пользователя, роль "engineer" + :return: Вызов функции **update_role** с параметрами: + профиль пользователя, роль "engineer" """ update_role(user_profile, ROLES['engineer'], who_changes) @@ -72,7 +72,6 @@ def make_light_agent(user_profile: UserProfile, who_changes: get_user_model()) - if tickets.count: zenpy.admin.tickets.update(tickets.values) - attempts, success = 5, False while not success and attempts != 0: try: @@ -86,7 +85,8 @@ def make_light_agent(user_profile: UserProfile, who_changes: get_user_model()) - def get_users_list() -> list: """ - Функция **get_users_list** возвращает список пользователей Zendesk, относящихся к организации SYSTEM. + Функция **get_users_list** возвращает список + пользователей Zendesk, относящихся к организации SYSTEM. """ zendesk = zenpy @@ -186,9 +186,9 @@ def count_users(users: list) -> tuple: return engineers, light_agents -def update_users_in_model(): +def update_users_in_model() -> list: """ - Обновляет пользователей в модели UserProfile по списку пользователей в организации + Обновляет пользователей в модели UserProfile по списку пользователей в организации. """ users = get_users_list() for user in users: @@ -436,7 +436,7 @@ class StatisticData: if self.data[log_index].new_role == ROLES['engineer']: self.engineer_logic(log_index) - def engineer_logic(self, log_index): + def engineer_logic(self, log_index: int) -> None: """ Функция обрабатывает основную часть работы инженера. @@ -446,11 +446,14 @@ class StatisticData: if current_log.change_time.date() != next_log.change_time.date(): self.statistic[current_log.change_time.date()] += ( timedelta(days=1) - get_timedelta(current_log)).total_seconds() - self.statistic[next_log.change_time.date()] += get_timedelta(next_log).total_seconds() - self.fill_daterange(current_log.change_time.date() + timedelta(days=1), next_log.change_time.date()) + self.statistic[next_log.change_time.date( + )] += get_timedelta(next_log).total_seconds() + self.fill_daterange(current_log.change_time.date( + ) + timedelta(days=1), next_log.change_time.date()) else: elapsed_time = next_log.change_time - current_log.change_time - self.statistic[current_log.change_time.date()] += elapsed_time.total_seconds() + self.statistic[current_log.change_time.date( + )] += elapsed_time.total_seconds() def post_engineer_logic(self, last_log: RoleChangeLogs) -> None: """ @@ -458,16 +461,19 @@ class StatisticData: :param last_log: Последний лог """ - 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(): 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()] += ( 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() + self.statistic[self.end_date] = get_timedelta( + None, timezone.now().time()).total_seconds() def prev_engineer_logic(self, first_log: RoleChangeLogs) -> None: """ @@ -477,9 +483,10 @@ class StatisticData: """ self.fill_daterange(max(get_user_model().objects.get(email=self.email).date_joined.date(), self.start_date), first_log.change_time.date()) - 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() - def fill_daterange(self, first: date, last: date, val: int = 24 * 3600) -> dict: + def fill_daterange(self, first: date, last: date, val: int = 24 * 3600) -> None: """ Функция заполняет диапазон дат значением val (по умолчанию val = кол-во секунд в 1 дне). @@ -495,7 +502,8 @@ class StatisticData: Функция осуществляет обновление всех дней. """ self.statistic.clear() - self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0) + self.fill_daterange( + self.start_date, self.end_date + timedelta(days=1), 0) class DatabaseHandler(logging.Handler): diff --git a/main/models.py b/main/models.py index 6c5563a..2d1b4cb 100644 --- a/main/models.py +++ b/main/models.py @@ -1,10 +1,8 @@ """ Модели, использующиеся в приложении. """ - - -from django.db import models from django.contrib.auth import get_user_model +from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver from django.utils import timezone @@ -17,7 +15,6 @@ class UserProfile(models.Model): Модель профиля пользователя. Профиль создается и изменяется при создании и изменении модель User. - """ class Meta: @@ -40,6 +37,7 @@ class UserProfile(models.Model): :return: Роль пользователя в Zendesk """ + id = self.custom_role_id for role, r_id in ZENDESK_ROLES.items(): if r_id == self.custom_role_id: return role @@ -107,7 +105,6 @@ class UnassignedTicketStatus(models.IntegerChoices): class UnassignedTicket(models.Model): """ Модель не распределенного тикета. - """ assignee = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE, related_name='tickets', help_text='Пользователь, с которого снят тикет') diff --git a/main/views.py b/main/views.py index ffc2c68..7a0eca5 100644 --- a/main/views.py +++ b/main/views.py @@ -28,7 +28,7 @@ from rest_framework.response import Response from access_controller.settings import DEFAULT_FROM_EMAIL, ZENDESK_ROLES, ZENDESK_MAX_AGENTS from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \ - get_users_list, update_users_in_model, count_users, StatisticData, set_session_params_for_work_page + get_users_list, update_users_in_model, count_users, StatisticData, log, set_session_params_for_work_page from main.zendesk_admin import zenpy from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from main.serializers import ProfileSerializer, ZendeskUserSerializer