Update statistic docs

This commit is contained in:
Andrew Smirnov 2021-05-20 20:41:55 +03:00
parent 26f32327b3
commit 45ac484480
No known key found for this signature in database
GPG Key ID: 0EFE318E5BB2A82A
2 changed files with 31 additions and 17 deletions

View File

@ -2,7 +2,7 @@
Вспомогательные функции. Вспомогательные функции.
""" """
import logging import logging
from datetime import timedelta from datetime import timedelta, date
from typing import Union, Optional from typing import Union, Optional
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
@ -219,7 +219,7 @@ def update_users_in_model() -> list:
return users return users
def daterange(start_date: timedelta, end_date: timedelta) -> list: def daterange(start_date: date, end_date: date) -> list:
""" """
Функция возвращает список дней с start_date по end_date, исключая правую границу. Функция возвращает список дней с start_date по end_date, исключая правую границу.

View File

@ -1,6 +1,9 @@
""" """
Обработка статистики. Обработка статистики.
Обнаруживает факт изменения роли пользователя и вычисляет отработанное на смене время.
""" """
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from typing import Optional from typing import Optional
@ -14,7 +17,7 @@ from main.models import RoleChangeLogs
class StatisticData: class StatisticData:
""" """
Класс для учета статистики интервалов работы пользователей. Класс для учета статистики времени работы пользователей.
Передаваемые параметры: start_date, end_date, email, stat. Передаваемые параметры: start_date, end_date, email, stat.
:param display: Формат отображения времени (часы, минуты) :param display: Формат отображения времени (часы, минуты)
@ -37,7 +40,7 @@ class StatisticData:
:type statistic: :class:`dict` :type statistic: :class:`dict`
""" """
def __init__(self, start_date, end_date, user_email, stat=None): def __init__(self, start_date, end_date, user_email: str, stat=None):
self.display = None self.display = None
self.interval = None self.interval = None
self.start_date = start_date self.start_date = start_date
@ -57,7 +60,8 @@ class StatisticData:
""" """
Функция возвращает статистику работы пользователя. Функция возвращает статистику работы пользователя.
:return: Словарь statistic с применением формата отображения и интервала работы(если они есть). :return: Словарь statistic с применением формата отображения
и интервала работы (если они есть).
None, если были ошибки при создании. None, если были ошибки при создании.
""" """
if self.is_valid_statistic(): if self.is_valid_statistic():
@ -117,7 +121,7 @@ class StatisticData:
""" """
return not self.errors return not self.errors
def _use_display(self, stat: list) -> list: def _use_display(self, stat: dict) -> dict:
""" """
Функция приводит данные к формату отображения. Функция приводит данные к формату отображения.
@ -136,7 +140,9 @@ class StatisticData:
def _use_interval(self, stat: dict) -> dict: def _use_interval(self, stat: dict) -> dict:
""" """
Функция объединяет ключи и значения в соответствии с интервалом работы. Переупаковка результата в соответствии с указанным временным диапазоном
Сжимает набор дней в месяцы, если указан режим работы "по месяцам"
:param stat: Статистика работы пользователя :param stat: Статистика работы пользователя
:return: Обновленная статистика :return: Обновленная статистика
@ -210,7 +216,7 @@ class StatisticData:
def engineer_logic(self, log_index: int) -> None: def engineer_logic(self, log_index: int) -> None:
""" """
Функция обрабатывает подсчета времени работы инженера. Функция вычисляет время работы инженера.
:param log_index: Индекс текущего лога :param log_index: Индекс текущего лога
:return: Дополняет статистику работы инженера временем между текущим и последующим логом :return: Дополняет статистику работы инженера временем между текущим и последующим логом
@ -227,7 +233,9 @@ class StatisticData:
def post_engineer_logic(self, last_log: RoleChangeLogs) -> None: def post_engineer_logic(self, last_log: RoleChangeLogs) -> None:
""" """
Функция обрабатывает случай, когда пользователя назначили инженером в последнем логе. Обработка случая, в котором инженер не закрыл смену.
В таком случае считается всё время от момента открытия смены до текущего момента.
:param last_log: Последний лог изменения роли, в результате которого пользователь назначен инженером. :param last_log: Последний лог изменения роли, в результате которого пользователь назначен инженером.
:return: Дополняет статистику работы :return: Дополняет статистику работы
@ -245,16 +253,23 @@ class StatisticData:
def prev_engineer_logic(self, first_log: RoleChangeLogs) -> None: def prev_engineer_logic(self, first_log: RoleChangeLogs) -> None:
""" """
Функция обрабатывает случай, когда пользователь в первом логе диапазона был назначен легким агентом. Обработка случая, в котором инженер закрыл смену в отражаемом периоде, а открыл её до этого периода.
В таком случае должен быть учтён только период от начала отображаемого диапазона до закрытия смены.
:param first_log_log: Первый лог в диапазоне, в результате которого пользователь назначен легким агентом. :param first_log_log: Первый лог в диапазоне, в результате которого пользователь назначен легким агентом.
:return: Дополняет статистику работы :return: Дополняет статистику работы
""" """
self.fill_daterange(max(get_user_model().objects.get(email=self.email).date_joined.date(), self.start_date), self.fill_daterange(
first_log.change_time.date()) 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 дне). Функция заполняет диапазон дат значением val (по умолчанию val = кол-во секунд в 1 дне).
@ -265,12 +280,11 @@ class StatisticData:
for day in daterange(first, last): for day in daterange(first, last):
self.statistic[day] = val self.statistic[day] = val
def clear_statistic(self) -> dict: def clear_statistic(self) -> None:
""" """
Функция осуществляет очищает статистику и устанавливает время в диапазоне start_date - end_date в количестве Чистка статистики и установка времени по умолчанию.
24*3600 секунд.
:return: Обновленная статистика Устанавливает время смены в 0
""" """
self.statistic.clear() 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)