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 %}
-
+ {% 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