Updated version with days iteration
This commit is contained in:
parent
fd1e048ebe
commit
8566e2b5b6
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
from datetime import timedelta, datetime
|
||||||
|
|
||||||
from zenpy import Zenpy
|
from zenpy import Zenpy
|
||||||
from zenpy.lib.exception import APIException
|
from zenpy.lib.exception import APIException
|
||||||
@ -188,3 +189,17 @@ def check_user_auth(email: str, password: str) -> bool:
|
|||||||
except APIException:
|
except APIException:
|
||||||
return False
|
return False
|
||||||
return True
|
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
|
||||||
|
@ -12,15 +12,19 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
<div>
|
||||||
<form action="" method="post">
|
<form action="" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% for field in form %}
|
{% for field in form %}
|
||||||
{{field.label}}
|
{{field.label}}
|
||||||
{{field}}
|
{{field}}
|
||||||
<br>
|
<br>
|
||||||
|
{% endfor %}
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
|
{% for key,val in stats_logs.items %}
|
||||||
|
<h3>{{key}} {{val}}</h3>
|
||||||
|
<br>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<input type="submit">
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ from django.contrib.auth.tokens import default_token_generator
|
|||||||
from django.contrib.auth.views import LoginView
|
from django.contrib.auth.views import LoginView
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.http import HttpResponseRedirect
|
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.urls import reverse_lazy
|
||||||
from django.views.generic import FormView
|
from django.views.generic import FormView
|
||||||
from django_registration.views import RegistrationView
|
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 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, \
|
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 main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
||||||
from .models import UserProfile, RoleChangeLogs
|
from .models import UserProfile, RoleChangeLogs
|
||||||
|
|
||||||
@ -196,34 +196,74 @@ class CustomLoginView(LoginView):
|
|||||||
def statistic_page(request):
|
def statistic_page(request):
|
||||||
if not request.user.is_superuser:
|
if not request.user.is_superuser:
|
||||||
return redirect('index')
|
return redirect('index')
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'pagename': 'страница статистики',
|
'pagename': 'страница статистики',
|
||||||
}
|
}
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = StatisticForm(request.POST)
|
form = StatisticForm(request.POST)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
start_date = form.cleaned_data['dio_start']
|
start_date = form.cleaned_data['dio_start']
|
||||||
end_date = form.cleaned_data['dio_end']
|
end_date = form.cleaned_data['dio_end']
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = RoleChangeLogs.objects.filter(
|
data = RoleChangeLogs.objects.filter(
|
||||||
change_time__range=[start_date, end_date],
|
change_time__range=[start_date, end_date],
|
||||||
user=User.objects.get(email=form.cleaned_data['email']),
|
user=User.objects.get(email=form.cleaned_data['email']),
|
||||||
)
|
).order_by('change_time')
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
data = []
|
|
||||||
context['errors'] = 'Пользователь не найден'
|
context['errors'] = 'Пользователь не найден'
|
||||||
if not data:
|
context['form'] = StatisticForm()
|
||||||
context['errors'] = 'Не найдено изменений роли за этот промежуток времени'
|
return render(request, 'pages/stat.html', context)
|
||||||
else:
|
sep = form.cleaned_data['inter'] # Разрез
|
||||||
sep = form.cleaned_data['inter']
|
stat = {}
|
||||||
stat = {}
|
|
||||||
if sep == 'days':
|
# Этот кусок кода будет заполнять массив 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':
|
for day in daterange(start_date, end_date + timedelta(days=1)):
|
||||||
stat[end_date] += 24-data[-1].change_time.time().hour
|
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:
|
else:
|
||||||
context['errors'] = form.errors
|
context['errors'] = form.errors
|
||||||
|
|
||||||
@ -234,9 +274,4 @@ def statistic_page(request):
|
|||||||
return render(request, 'pages/stat.html', context)
|
return render(request, 'pages/stat.html', context)
|
||||||
|
|
||||||
|
|
||||||
from datetime import timedelta, date
|
from datetime import timedelta
|
||||||
|
|
||||||
|
|
||||||
def daterange(start_date, end_date):
|
|
||||||
for n in range(int((end_date - start_date).days)):
|
|
||||||
yield start_date + timedelta(n)
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user