Updated version with days iteration

This commit is contained in:
Sokurov Idar 2021-03-04 23:13:10 +03:00
parent fd1e048ebe
commit 8566e2b5b6
3 changed files with 84 additions and 30 deletions

View File

@ -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

View File

@ -12,7 +12,7 @@
{% block content %}
<div>
<form action="" method="post">
<form action="" method="post">
{% csrf_token %}
{% for field in form %}
{{field.label}}
@ -20,7 +20,11 @@
<br>
{% endfor %}
<input type="submit">
</form>
</form>
{% for key,val in stats_logs.items %}
<h3>{{key}} {{val}}</h3>
<br>
{% endfor %}
</div>
{% endblock %}

View File

@ -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']
context['form'] = StatisticForm()
return render(request, 'pages/stat.html', context)
sep = form.cleaned_data['inter'] # Разрез
stat = {}
if sep == 'days':
for day in daterange(start_date, end_date+timedelta(days=1)):
# Этот кусок кода будет заполнять массив stat, в котором ключ - дата, значение кол-во часов
# Далее будет заполнение контекса в зависимости от выбранного интервала и отображения
# (пока есть только отображение в часах, разрез в днях)
# Обнуление всех дней
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
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