small refactoring
This commit is contained in:
parent
9e49a12524
commit
f47840f292
@ -379,6 +379,7 @@ class StatisticData:
|
|||||||
:param statistic: Интервалы работы пользователя
|
:param statistic: Интервалы работы пользователя
|
||||||
: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, stat=None):
|
||||||
self.display = None
|
self.display = None
|
||||||
self.interval = None
|
self.interval = None
|
||||||
@ -541,31 +542,51 @@ class StatisticData:
|
|||||||
first_log, last_log = self.data[0], self.data[len(self.data) - 1]
|
first_log, last_log = self.data[0], self.data[len(self.data) - 1]
|
||||||
|
|
||||||
if first_log.old_role == ROLES['engineer']:
|
if first_log.old_role == ROLES['engineer']:
|
||||||
self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds()
|
self.prev_engineer_logic(first_log)
|
||||||
|
|
||||||
if last_log.new_role == ROLES['engineer']: # TODO отдельная функция
|
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.post_engineer_logic(last_log)
|
||||||
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)
|
|
||||||
).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): # TODO отдельная функция
|
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']:
|
||||||
current_log, next_log = self.data[log_index], self.data[log_index + 1]
|
self.engineer_logic(log_index)
|
||||||
if current_log.change_time.date() != next_log.change_time.date():
|
|
||||||
self.statistic[current_log.change_time.date()] += (
|
def engineer_logic(self, log_index):
|
||||||
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())
|
"""
|
||||||
else:
|
current_log, next_log = self.data[log_index], self.data[log_index + 1]
|
||||||
elapsed_time = next_log.change_time - current_log.change_time
|
if current_log.change_time.date() != next_log.change_time.date():
|
||||||
self.statistic[current_log.change_time.date()] += elapsed_time.total_seconds()
|
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())
|
||||||
|
else:
|
||||||
|
elapsed_time = next_log.change_time - current_log.change_time
|
||||||
|
self.statistic[current_log.change_time.date()] += elapsed_time.total_seconds()
|
||||||
|
|
||||||
|
def post_engineer_logic(self, last_log):
|
||||||
|
"""
|
||||||
|
Функция обрабатывает случай, когда нам изветсно что инженер работал и после диапазона
|
||||||
|
"""
|
||||||
|
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)
|
||||||
|
).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()
|
||||||
|
|
||||||
|
def prev_engineer_logic(self, first_log):
|
||||||
|
"""
|
||||||
|
Функция обрабатывает случай, когда нам изветсно что инженер начал работу до диапазона
|
||||||
|
"""
|
||||||
|
self.fill_daterange(max(User.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()
|
||||||
|
|
||||||
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) -> dict:
|
||||||
"""
|
"""
|
||||||
@ -574,7 +595,6 @@ class StatisticData:
|
|||||||
:param first: Начальная дата интервала
|
:param first: Начальная дата интервала
|
||||||
:param last: Последняя дата интервала
|
:param last: Последняя дата интервала
|
||||||
:param val: Количество секунд в одном дне
|
:param val: Количество секунд в одном дне
|
||||||
:return: Статистику пользователя с указанным количеством секунд в заданных днях
|
|
||||||
"""
|
"""
|
||||||
for day in daterange(first, last):
|
for day in daterange(first, last):
|
||||||
self.statistic[day] = val
|
self.statistic[day] = val
|
||||||
@ -582,8 +602,6 @@ class StatisticData:
|
|||||||
def clear_statistic(self) -> dict:
|
def clear_statistic(self) -> dict:
|
||||||
"""
|
"""
|
||||||
Функция осуществляет обновление всех дней.
|
Функция осуществляет обновление всех дней.
|
||||||
|
|
||||||
: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)
|
||||||
|
@ -76,7 +76,7 @@ INTERVAL_CHOICES = [
|
|||||||
]
|
]
|
||||||
DISPLAY_CHOICES = [
|
DISPLAY_CHOICES = [
|
||||||
('hours', 'Часы'),
|
('hours', 'Часы'),
|
||||||
('days', 'Дни')
|
('days', 'Дни/Смены')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -361,4 +361,4 @@ def statistic_page(request: WSGIRequest) -> HttpResponse:
|
|||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
form = StatisticForm()
|
form = StatisticForm()
|
||||||
context['form'] = form
|
context['form'] = form
|
||||||
return render(request, 'pages/stat.html', context)
|
return render(request, 'pages/statistic.html', context)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user