small refactor: change variable`s names, add a bit documentation
This commit is contained in:
parent
4a604f0941
commit
49046022d7
@ -1,12 +1,11 @@
|
|||||||
import os
|
import os
|
||||||
from datetime import timedelta, datetime
|
from datetime import timedelta
|
||||||
|
|
||||||
from zenpy import Zenpy
|
from zenpy import Zenpy
|
||||||
from zenpy.lib.exception import APIException
|
from zenpy.lib.exception import APIException
|
||||||
|
|
||||||
from main.models import UserProfile
|
|
||||||
|
|
||||||
from access_controller.settings import ZENDESK_ROLES as ROLES
|
from access_controller.settings import ZENDESK_ROLES as ROLES
|
||||||
|
from main.models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
class ZendeskAdmin:
|
class ZendeskAdmin:
|
||||||
@ -29,7 +28,7 @@ class ZendeskAdmin:
|
|||||||
email: str = os.getenv('ACCESS_CONTROLLER_API_EMAIL')
|
email: str = os.getenv('ACCESS_CONTROLLER_API_EMAIL')
|
||||||
token: str = os.getenv('ACCESS_CONTROLLER_API_TOKEN')
|
token: str = os.getenv('ACCESS_CONTROLLER_API_TOKEN')
|
||||||
password: str = os.getenv('ACCESS_CONTROLLER_API_PASSWORD')
|
password: str = os.getenv('ACCESS_CONTROLLER_API_PASSWORD')
|
||||||
_instance=None
|
_instance = None
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
def __new__(cls, *args, **kwargs):
|
||||||
if cls._instance is None:
|
if cls._instance is None:
|
||||||
@ -194,15 +193,17 @@ def check_user_auth(email: str, password: str) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def daterange(start_date, end_date):
|
def daterange(start_date, end_date) -> list:
|
||||||
|
# Возвращает список дней с start_date по end_date исключая правую границу
|
||||||
dates = []
|
dates = []
|
||||||
for n in range(int((end_date - start_date).days)):
|
for n in range(int((end_date - start_date).days)):
|
||||||
dates.append( start_date + timedelta(n))
|
dates.append(start_date + timedelta(n))
|
||||||
return dates
|
return dates
|
||||||
|
|
||||||
|
|
||||||
def get_timedelta(log):
|
def get_timedelta(log) -> timedelta:
|
||||||
|
# Возвращает объект класса timedelta, который хранит промежуток времени от начала суток до момента,
|
||||||
|
# который находится в log(RoleChangeLogs)
|
||||||
time = log.change_time.time()
|
time = log.change_time.time()
|
||||||
time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
|
time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
|
||||||
print(time)
|
|
||||||
return time
|
return time
|
||||||
|
@ -70,10 +70,10 @@ class StatisticForm(forms.Form):
|
|||||||
email = forms.EmailField(
|
email = forms.EmailField(
|
||||||
label='Электроная почта',
|
label='Электроная почта',
|
||||||
)
|
)
|
||||||
inter = forms.CharField( # TODO: Переделать под html страницу
|
interval = forms.CharField( # TODO: Переделать под html страницу
|
||||||
label='Выбор интервала',
|
label='Выбор интервала',
|
||||||
)
|
)
|
||||||
dio_start = forms.DateField( # TODO: Переделать под html страницу
|
range_start = forms.DateField( # TODO: Переделать под html страницу
|
||||||
label='Начало диапазона',
|
label='Начало диапазона',
|
||||||
widget=forms.DateInput(
|
widget=forms.DateInput(
|
||||||
attrs={
|
attrs={
|
||||||
@ -81,7 +81,7 @@ class StatisticForm(forms.Form):
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
dio_end = forms.DateField( # TODO: Переделать под html страницу
|
range_end = forms.DateField( # TODO: Переделать под html страницу
|
||||||
label='Конец диапазона',
|
label='Конец диапазона',
|
||||||
widget=forms.DateInput(
|
widget=forms.DateInput(
|
||||||
attrs={
|
attrs={
|
||||||
|
@ -1,30 +1,22 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.forms import PasswordResetForm
|
from django.contrib.auth.forms import PasswordResetForm
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||||
|
from django.contrib.auth.models import User, Permission
|
||||||
|
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.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.core.handlers.wsgi import WSGIRequest
|
from django.core.handlers.wsgi import WSGIRequest
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
from django.http import HttpResponseRedirect, HttpResponse
|
||||||
from django.shortcuts import render, get_list_or_404, redirect
|
from django.shortcuts import render, get_list_or_404, redirect
|
||||||
from django.urls import reverse_lazy, reverse
|
from django.urls import reverse_lazy, reverse
|
||||||
from django.views.generic import FormView
|
from django.views.generic import FormView
|
||||||
from zenpy import Zenpy
|
|
||||||
|
|
||||||
from access_controller.settings import EMAIL_HOST_USER
|
|
||||||
from main.extra_func import check_user_exist, update_profile, get_user_organization, \
|
|
||||||
make_engineer, make_light_agent, get_users_list
|
|
||||||
|
|
||||||
from django.contrib.auth.models import User, Permission
|
|
||||||
from main.models import UserProfile
|
|
||||||
from main.forms import CustomRegistrationForm, AdminPageUsers, CustomAuthenticationForm
|
|
||||||
from django_registration.views import RegistrationView
|
from django_registration.views import RegistrationView
|
||||||
from django.contrib.auth.decorators import login_required
|
from zenpy import Zenpy
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
|
||||||
from django.core.exceptions import PermissionDenied
|
|
||||||
|
|
||||||
from access_controller.settings import ZENDESK_ROLES
|
|
||||||
from zenpy.lib.api_objects import User as ZenpyUser
|
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
|
||||||
@ -247,8 +239,8 @@ def statistic_page(request):
|
|||||||
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['range_start']
|
||||||
end_date = form.cleaned_data['dio_end']
|
end_date = form.cleaned_data['range_end']
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = RoleChangeLogs.objects.filter(
|
data = RoleChangeLogs.objects.filter(
|
||||||
@ -259,53 +251,68 @@ def statistic_page(request):
|
|||||||
context['errors'] = 'Пользователь не найден'
|
context['errors'] = 'Пользователь не найден'
|
||||||
context['form'] = StatisticForm()
|
context['form'] = StatisticForm()
|
||||||
return render(request, 'pages/stat.html', context)
|
return render(request, 'pages/stat.html', context)
|
||||||
sep = form.cleaned_data['inter'] # Разрез
|
|
||||||
|
interval = form.cleaned_data['interval'] # интервал TODO: переделать под html-страницу
|
||||||
|
show = form.cleaned_data['display_format'] # формат отображения TODO: переделать под html-страницу
|
||||||
stat = {}
|
stat = {}
|
||||||
|
|
||||||
# Этот кусок кода будет заполнять массив stat, в котором ключ - дата, значение кол-во часов
|
# Этот кусок кода будет заполнять массив stat, в котором ключ - дата, значение - кол-во секунд
|
||||||
# Далее будет заполнение контекса в зависимости от выбранного интервала и отображения
|
# Далее будет заполнение контекса в зависимости от выбранного интервала(дни/месяцы) и формата отобржаения(дни/часы)
|
||||||
# (пока есть только отображение в часах, разрез в днях)
|
# (пока есть только отображение в часах, интервал в днях)
|
||||||
|
|
||||||
# Обнуление всех дней
|
# Обнуление всех дней
|
||||||
for day in daterange(start_date, end_date + timedelta(days=1)):
|
for day in daterange(start_date, end_date + timedelta(days=1)):
|
||||||
stat[day] = 0
|
stat[day] = 0
|
||||||
|
|
||||||
|
first_log = data[0]
|
||||||
|
last_log = data[len(data) - 1]
|
||||||
# Проеврка крайних случаев
|
# Проеврка крайних случаев
|
||||||
# Если окажется, что инженер работал ещё до начала диапазона
|
# Если окажется, что инженер работал ещё до начала диапазона(мы видим, что он был инженером до диапазона)
|
||||||
if data[0].old_role == 'engineer':
|
if first_log.old_role == 'engineer':
|
||||||
for day in daterange(start_date, data[0].change_time.date()):
|
for day in daterange(start_date, first_log.change_time.date()):
|
||||||
stat[day] = 24
|
stat[day] = 24 * 3600
|
||||||
stat[data[0].change_time.date()] += data[0].change_time.time().hour
|
stat[first_log.change_time.date()] += get_timedelta(first_log.change_time.time()).total_seconds()
|
||||||
# Если окажется, что инженер закончил работать после диапазона
|
|
||||||
if data[len(data) - 1].new_role == 'engineer':
|
# Если окажется, что инженер закончил работать после диапазона(мы видим, что он был инженером и после диапазона)
|
||||||
for day in daterange(data[len(data) - 1].change_time.date() + timedelta(days=1),
|
if last_log.new_role == 'engineer':
|
||||||
|
for day in daterange(last_log.change_time.date() + timedelta(days=1),
|
||||||
end_date + timedelta(days=1)):
|
end_date + timedelta(days=1)):
|
||||||
stat[day] = 24
|
stat[day] = 24 * 3600
|
||||||
stat[data[len(data) - 1].change_time.date()] += int(
|
stat[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds()
|
||||||
(timedelta(days=1) - get_timedelta(data[len(data) - 1])).total_seconds() // 3600)
|
|
||||||
|
|
||||||
# Цикл по логам
|
# Цикл по логам
|
||||||
for log_index in range(len(data) - 1):
|
for log_index in range(len(data) - 1):
|
||||||
if data[log_index].new_role == 'engineer':
|
if data[log_index].new_role == 'engineer':
|
||||||
log1, log2 = data[log_index], data[log_index + 1]
|
current_log, next_log = data[log_index], data[log_index + 1]
|
||||||
|
|
||||||
# Если сессия закончилась НЕ в тот же день, что и началась
|
# Если сессия закончилась НЕ в тот же день, что и началась
|
||||||
if log1.change_time.date() != log2.change_time.date():
|
if current_log.change_time.date() != next_log.change_time.date():
|
||||||
stat[log1.change_time.date()] += int(
|
stat[current_log.change_time.date()] += (
|
||||||
(timedelta(days=1) - get_timedelta(log1)).total_seconds() // 3600)
|
timedelta(days=1) - get_timedelta(current_log)).total_seconds()
|
||||||
stat[log2.change_time.date()] += log2.change_time.time().hour
|
stat[next_log.change_time.date()] += get_timedelta(next_log).total_seconds()
|
||||||
|
|
||||||
# Если проработал несколько дней подряд, то заполнить эти дни по 24 часа
|
# Если проработал несколько дней подряд, то заполнить эти дни по 24 часа
|
||||||
for day in daterange(log1.change_time.date() + timedelta(days=1), log2.change_time.date()):
|
for day in daterange(current_log.change_time.date() + timedelta(days=1),
|
||||||
stat[day] = 24
|
next_log.change_time.date()):
|
||||||
|
stat[day] = 24 * 3600
|
||||||
|
|
||||||
# Если сессия закончилась в тот же день, что и началась
|
# Если сессия закончилась в тот же день, что и началась
|
||||||
else:
|
else:
|
||||||
times = log2.change_time - log1.change_time
|
elapsed_time = next_log.change_time - current_log.change_time
|
||||||
stat[log1.change_time.date()] += times.seconds // 3600
|
stat[current_log.change_time.date()] += elapsed_time.total_seconds()
|
||||||
|
|
||||||
if sep == 'days':
|
# Переделываем наши значения под формат отображения
|
||||||
|
for key, item in stat.items():
|
||||||
|
if show == 'hours':
|
||||||
|
stat[key] = item / 3600
|
||||||
|
elif show == 'days':
|
||||||
|
stat[key] = item / 86400
|
||||||
|
|
||||||
|
# Переделываем наши значения под формат отображения
|
||||||
|
if interval == 'days':
|
||||||
context['stats_logs'] = stat
|
context['stats_logs'] = stat
|
||||||
|
elif interval == 'months':
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
context['errors'] = form.errors
|
context['errors'] = form.errors
|
||||||
|
|
||||||
@ -314,6 +321,3 @@ def statistic_page(request):
|
|||||||
|
|
||||||
context['form'] = form
|
context['form'] = form
|
||||||
return render(request, 'pages/stat.html', context)
|
return render(request, 'pages/stat.html', context)
|
||||||
|
|
||||||
|
|
||||||
from datetime import timedelta
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user