diff --git a/main/extra_func.py b/main/extra_func.py index 6227bf1..8929d3e 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,4 +1,5 @@ import os +from datetime import timedelta, datetime from zenpy import Zenpy from zenpy.lib.exception import APIException @@ -188,3 +189,17 @@ def check_user_auth(email: str, password: str) -> bool: except APIException: return False return True + + +def daterange(start_date, end_date): + dates = [] + for n in range(int((end_date - start_date).days)): + dates.append( start_date + timedelta(n)) + return dates + + +def get_timedelta(log): + time = log.change_time.time() + time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second) + print(time) + return time diff --git a/main/templates/pages/stat.html b/main/templates/pages/stat.html index 1ac47d7..ea5e793 100644 --- a/main/templates/pages/stat.html +++ b/main/templates/pages/stat.html @@ -12,15 +12,19 @@ {% block content %}
-
- {% csrf_token %} - {% for field in form %} - {{field.label}} - {{field}} -
+ + {% csrf_token %} + {% for field in form %} + {{field.label}} + {{field}} +
+ {% endfor %} + +
+ {% for key,val in stats_logs.items %} +

{{key}} {{val}}

+
{% endfor %} - -
{% endblock %} diff --git a/main/views.py b/main/views.py index 532aac0..a489b01 100644 --- a/main/views.py +++ b/main/views.py @@ -9,7 +9,7 @@ from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.views import LoginView from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect -from django.shortcuts import get_list_or_404, redirect, reverse, render, get_object_or_404 +from django.shortcuts import get_list_or_404, redirect, reverse, render from django.urls import reverse_lazy from django.views.generic import FormView from django_registration.views import RegistrationView @@ -18,7 +18,7 @@ from zenpy.lib.api_objects import User as ZenpyUser from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \ - get_users_list + get_users_list, daterange, get_timedelta from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from .models import UserProfile, RoleChangeLogs @@ -196,34 +196,74 @@ class CustomLoginView(LoginView): def statistic_page(request): if not request.user.is_superuser: return redirect('index') + context = { 'pagename': 'страница статистики', } + if request.method == "POST": form = StatisticForm(request.POST) + if form.is_valid(): start_date = form.cleaned_data['dio_start'] end_date = form.cleaned_data['dio_end'] + try: data = RoleChangeLogs.objects.filter( change_time__range=[start_date, end_date], user=User.objects.get(email=form.cleaned_data['email']), - ) + ).order_by('change_time') except User.DoesNotExist: - data = [] context['errors'] = 'Пользователь не найден' - if not data: - context['errors'] = 'Не найдено изменений роли за этот промежуток времени' - else: - sep = form.cleaned_data['inter'] - stat = {} - if sep == 'days': - for day in daterange(start_date, end_date+timedelta(days=1)): - stat[day] = 0 - if data[0].old_role == 'engineer': - stat[start_date] += data[0].change_time.time().hour - if data[-1].old_role == 'engineer': - stat[end_date] += 24-data[-1].change_time.time().hour + context['form'] = StatisticForm() + return render(request, 'pages/stat.html', context) + sep = form.cleaned_data['inter'] # Разрез + stat = {} + + # Этот кусок кода будет заполнять массив stat, в котором ключ - дата, значение кол-во часов + # Далее будет заполнение контекса в зависимости от выбранного интервала и отображения + # (пока есть только отображение в часах, разрез в днях) + + # Обнуление всех дней + for day in daterange(start_date, end_date + timedelta(days=1)): + stat[day] = 0 + + # Проеврка крайних случаев + # Если окажется, что инженер работал ещё до начала диапазона + if data[0].old_role == 'engineer': + for day in daterange(start_date, data[0].change_time.date()): + stat[day] = 24 + stat[data[0].change_time.date()] += data[0].change_time.time().hour + # Если окажется, что инженер закончил работать после диапазона + if data[len(data) - 1].new_role == 'engineer': + for day in daterange(data[len(data) - 1].change_time.date() + timedelta(days=1), + end_date + timedelta(days=1)): + stat[day] = 24 + stat[data[len(data) - 1].change_time.date()] += int( + (timedelta(days=1) - get_timedelta(data[len(data) - 1])).total_seconds() // 3600) + + # Цикл по логам + for log_index in range(len(data) - 1): + if data[log_index].new_role == 'engineer': + log1, log2 = data[log_index], data[log_index + 1] + + # Если сессия закончилась НЕ в тот же день, что и началась + if log1.change_time.date() != log2.change_time.date(): + stat[log1.change_time.date()] += int( + (timedelta(days=1) - get_timedelta(log1)).total_seconds() // 3600) + stat[log2.change_time.date()] += log2.change_time.time().hour + + # Если проработал несколько дней подряд, то заполнить эти дни по 24 часа + for day in daterange(log1.change_time.date() + timedelta(days=1), log2.change_time.date()): + stat[day] = 24 + + # Если сессия закончилась в тот же день, что и началась + else: + times = log2.change_time - log1.change_time + stat[log1.change_time.date()] += times.seconds // 3600 + + if sep == 'days': + context['stats_logs'] = stat else: context['errors'] = form.errors @@ -234,9 +274,4 @@ def statistic_page(request): return render(request, 'pages/stat.html', context) -from datetime import timedelta, date - - -def daterange(start_date, end_date): - for n in range(int((end_date - start_date).days)): - yield start_date + timedelta(n) +from datetime import timedelta