small refactor: change variable`s names, add a bit documentation

This commit is contained in:
Sokurov Idar 2021-03-08 17:50:47 +03:00
parent 4a604f0941
commit 49046022d7
3 changed files with 61 additions and 56 deletions

View File

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

View File

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

View File

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