diff --git a/main/extra_func.py b/main/extra_func.py index b87ac27..a2e997e 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -379,6 +379,7 @@ class StatisticData: :param statistic: Интервалы работы пользователя :type statistic: :class:`dict` """ + def __init__(self, start_date, end_date, user_email, stat=None): self.display = None self.interval = None @@ -541,31 +542,51 @@ class StatisticData: first_log, last_log = self.data[0], self.data[len(self.data) - 1] 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 отдельная функция - 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() + if last_log.new_role == ROLES['engineer']: + self.post_engineer_logic(last_log) - 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']: - current_log, next_log = self.data[log_index], self.data[log_index + 1] - 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()) - else: - elapsed_time = next_log.change_time - current_log.change_time - self.statistic[current_log.change_time.date()] += elapsed_time.total_seconds() + self.engineer_logic(log_index) + + def engineer_logic(self, log_index): + """ + Функция обрабатывает основную часть работы инженера + """ + current_log, next_log = self.data[log_index], self.data[log_index + 1] + 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()) + 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: """ @@ -574,7 +595,6 @@ class StatisticData: :param first: Начальная дата интервала :param last: Последняя дата интервала :param val: Количество секунд в одном дне - :return: Статистику пользователя с указанным количеством секунд в заданных днях """ for day in daterange(first, last): self.statistic[day] = val @@ -582,8 +602,6 @@ class StatisticData: def clear_statistic(self) -> dict: """ Функция осуществляет обновление всех дней. - - :return: Статистику пользователя с количеством рабочих секунд = 0 """ self.statistic.clear() self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0) diff --git a/main/forms.py b/main/forms.py index c25e53f..613fc34 100644 --- a/main/forms.py +++ b/main/forms.py @@ -76,7 +76,7 @@ INTERVAL_CHOICES = [ ] DISPLAY_CHOICES = [ ('hours', 'Часы'), - ('days', 'Дни') + ('days', 'Дни/Смены') ] diff --git a/main/views.py b/main/views.py index dcf3e42..05bb157 100644 --- a/main/views.py +++ b/main/views.py @@ -361,4 +361,4 @@ def statistic_page(request: WSGIRequest) -> HttpResponse: if request.method == 'GET': form = StatisticForm() context['form'] = form - return render(request, 'pages/stat.html', context) + return render(request, 'pages/statistic.html', context)