From 49046022d77457c0cb8281883970795bacfd7d0a Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Mon, 8 Mar 2021 17:50:47 +0300 Subject: [PATCH] small refactor: change variable`s names, add a bit documentation --- main/extra_func.py | 17 +++++---- main/forms.py | 6 +-- main/views.py | 94 ++++++++++++++++++++++++---------------------- 3 files changed, 61 insertions(+), 56 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index 623be63..8d5abfd 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,12 +1,11 @@ import os -from datetime import timedelta, datetime +from datetime import timedelta from zenpy import Zenpy from zenpy.lib.exception import APIException -from main.models import UserProfile - from access_controller.settings import ZENDESK_ROLES as ROLES +from main.models import UserProfile class ZendeskAdmin: @@ -29,7 +28,7 @@ class ZendeskAdmin: email: str = os.getenv('ACCESS_CONTROLLER_API_EMAIL') token: str = os.getenv('ACCESS_CONTROLLER_API_TOKEN') password: str = os.getenv('ACCESS_CONTROLLER_API_PASSWORD') - _instance=None + _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: @@ -194,15 +193,17 @@ def check_user_auth(email: str, password: str) -> bool: return True -def daterange(start_date, end_date): +def daterange(start_date, end_date) -> list: + # Возвращает список дней с start_date по end_date исключая правую границу dates = [] for n in range(int((end_date - start_date).days)): - dates.append( start_date + timedelta(n)) + dates.append(start_date + timedelta(n)) return dates -def get_timedelta(log): +def get_timedelta(log) -> timedelta: + # Возвращает объект класса timedelta, который хранит промежуток времени от начала суток до момента, + # который находится в log(RoleChangeLogs) time = log.change_time.time() time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second) - print(time) return time diff --git a/main/forms.py b/main/forms.py index efafa01..7046b35 100644 --- a/main/forms.py +++ b/main/forms.py @@ -70,10 +70,10 @@ class StatisticForm(forms.Form): email = forms.EmailField( label='Электроная почта', ) - inter = forms.CharField( # TODO: Переделать под html страницу + interval = forms.CharField( # TODO: Переделать под html страницу label='Выбор интервала', ) - dio_start = forms.DateField( # TODO: Переделать под html страницу + range_start = forms.DateField( # TODO: Переделать под html страницу label='Начало диапазона', widget=forms.DateInput( attrs={ @@ -81,7 +81,7 @@ class StatisticForm(forms.Form): } ), ) - dio_end = forms.DateField( # TODO: Переделать под html страницу + range_end = forms.DateField( # TODO: Переделать под html страницу label='Конец диапазона', widget=forms.DateInput( attrs={ diff --git a/main/views.py b/main/views.py index 3f2df8f..79c14bc 100644 --- a/main/views.py +++ b/main/views.py @@ -1,30 +1,22 @@ import logging 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.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.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render, get_list_or_404, redirect from django.urls import reverse_lazy, reverse 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.contrib.auth.decorators import login_required -from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin -from django.core.exceptions import PermissionDenied - -from access_controller.settings import ZENDESK_ROLES +from zenpy import Zenpy from zenpy.lib.api_objects import User as ZenpyUser from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES @@ -247,8 +239,8 @@ def statistic_page(request): form = StatisticForm(request.POST) if form.is_valid(): - start_date = form.cleaned_data['dio_start'] - end_date = form.cleaned_data['dio_end'] + start_date = form.cleaned_data['range_start'] + end_date = form.cleaned_data['range_end'] try: data = RoleChangeLogs.objects.filter( @@ -259,53 +251,68 @@ def statistic_page(request): context['errors'] = 'Пользователь не найден' context['form'] = StatisticForm() 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, в котором ключ - дата, значение - кол-во секунд + # Далее будет заполнение контекса в зависимости от выбранного интервала(дни/месяцы) и формата отобржаения(дни/часы) + # (пока есть только отображение в часах, интервал в днях) # Обнуление всех дней for day in daterange(start_date, end_date + timedelta(days=1)): stat[day] = 0 + first_log = data[0] + last_log = data[len(data) - 1] # Проеврка крайних случаев - # Если окажется, что инженер работал ещё до начала диапазона - 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), + # Если окажется, что инженер работал ещё до начала диапазона(мы видим, что он был инженером до диапазона) + if first_log.old_role == 'engineer': + for day in daterange(start_date, first_log.change_time.date()): + stat[day] = 24 * 3600 + stat[first_log.change_time.date()] += get_timedelta(first_log.change_time.time()).total_seconds() + + # Если окажется, что инженер закончил работать после диапазона(мы видим, что он был инженером и после диапазона) + if last_log.new_role == 'engineer': + for day in daterange(last_log.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) + stat[day] = 24 * 3600 + stat[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds() # Цикл по логам for log_index in range(len(data) - 1): 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(): - 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 + if current_log.change_time.date() != next_log.change_time.date(): + stat[current_log.change_time.date()] += ( + timedelta(days=1) - get_timedelta(current_log)).total_seconds() + stat[next_log.change_time.date()] += get_timedelta(next_log).total_seconds() # Если проработал несколько дней подряд, то заполнить эти дни по 24 часа - for day in daterange(log1.change_time.date() + timedelta(days=1), log2.change_time.date()): - stat[day] = 24 + for day in daterange(current_log.change_time.date() + timedelta(days=1), + next_log.change_time.date()): + stat[day] = 24 * 3600 # Если сессия закончилась в тот же день, что и началась else: - times = log2.change_time - log1.change_time - stat[log1.change_time.date()] += times.seconds // 3600 + elapsed_time = next_log.change_time - current_log.change_time + 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 + elif interval == 'months': + pass else: context['errors'] = form.errors @@ -314,6 +321,3 @@ def statistic_page(request): context['form'] = form return render(request, 'pages/stat.html', context) - - -from datetime import timedelta