Update statistic docs
This commit is contained in:
parent
26f32327b3
commit
45ac484480
@ -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, исключая правую границу.
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user