From ce55ec61e66406b581ff0c2e5be2d7d3f2ce3e70 Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Mon, 8 Mar 2021 22:48:31 +0300 Subject: [PATCH] extract function for easier processing a list of emails in future --- main/extra_func.py | 45 +++++++++++++++++++++------------------------ main/views.py | 25 +++++++++---------------- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index 03fd61a..9fb141d 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,11 +1,12 @@ import os from datetime import timedelta, datetime +from django.contrib.auth.models import User from zenpy import Zenpy from zenpy.lib.exception import APIException from access_controller.settings import ZENDESK_ROLES as ROLES -from main.models import UserProfile +from main.models import UserProfile, RoleChangeLogs class ZendeskAdmin: @@ -86,7 +87,7 @@ class ZendeskAdmin: Функция **get_user_org** возвращает организацию, к которой относится пользователь по его email """ user = self.admin.users.search(email).values[0] - return user.organization.name + return user.organization.name if user.organization else None def create_admin(self) -> Zenpy: """ @@ -100,7 +101,7 @@ class ZendeskAdmin: if self.email is None: raise ValueError('access_controller email not in env') - self.credentials['email'] = os.getenv('ACCESS_CONTROLLER_API_EMAIL') + self.credentials['email'] = self.email if self.token: self.credentials['token'] = self.token @@ -174,25 +175,6 @@ def get_user_organization(email: str) -> str: return ZendeskAdmin().get_user_org(email) -def check_user_auth(email: str, password: str) -> bool: - """ - Функция проверяет, верны ли входные данные - - :raise: :class:`APIException`: исключение, вызываемое если пользователь не аутентифицирован - """ - creds = { - 'email': email, - 'password': password, - 'subdomain': 'ngenix1612197338', - } - try: - user = Zenpy(**creds) - user.search(email, type='user') - except APIException: - return False - return True - - def daterange(start_date, end_date) -> list: """ Возвращает список дней с start_date по end_date исключая правую границу @@ -244,7 +226,7 @@ def get_statistic_from_data(data, start_date, end_date): if int(last_log.new_role) == ROLES['engineer']: for day in daterange(last_log.change_time.date() + timedelta(days=1), end_date + timedelta(days=1)): stat[day] = 24 * 3600 - stat[last_log.change_time.date()] += (timedelta(days=1)-get_timedelta(last_log)).total_seconds() + stat[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds() # Цикл по логам for log_index in range(len(data) - 1): if int(data[log_index].new_role) == ROLES['engineer']: @@ -254,10 +236,25 @@ def get_statistic_from_data(data, start_date, end_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(current_log.change_time.date() + timedelta(days=1),next_log.change_time.date()): + for day in daterange(current_log.change_time.date() + timedelta(days=1), next_log.change_time.date()): stat[day] = 24 * 3600 # Если сессия закончилась в тот же день, что и началась else: elapsed_time = next_log.change_time - current_log.change_time stat[current_log.change_time.date()] += elapsed_time.total_seconds() return stat + + +def get_data_logs(context, start_date, end_date, email): + """ + Функция возвращает список из лог-ов в диапазоне дат start_date-end_date для пользователя с почтой email + """ + data = [] + try: + data = RoleChangeLogs.objects.filter( + change_time__range=[start_date, end_date + timedelta(days=1)], + user=User.objects.get(email=email), + ).order_by('change_time') + except User.DoesNotExist: + context['errors'] = ['Пользователь не найден'] + return data diff --git a/main/views.py b/main/views.py index 72918e5..b2d4fc0 100644 --- a/main/views.py +++ b/main/views.py @@ -1,6 +1,6 @@ import logging import os -from datetime import timedelta, date, datetime +from datetime import date, datetime from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordResetForm @@ -21,9 +21,9 @@ 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, last_day_of_month, get_statistic_from_data + get_users_list, last_day_of_month, get_statistic_from_data, get_data_logs from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm -from .models import UserProfile, RoleChangeLogs +from .models import UserProfile content_type_temp = ContentType.objects.get_for_model(UserProfile) permission_temp, created = Permission.objects.get_or_create( @@ -252,20 +252,13 @@ def statistic_page(request): else: start_date, end_date, data = form.cleaned_data['range_start'], form.cleaned_data['range_end'], list() if end_date < start_date or end_date > datetime.now().date(): - context['errors'] += ['Конец диапазона должен быть больше начала диапазона и меньше текущего времени'] + context['errors'] += ['Конец диапазона должен быть позже начала диапазона и раньше текущего времени'] else: - try: - data = RoleChangeLogs.objects.filter( - change_time__range=[start_date, end_date + timedelta(days=1)], - user=User.objects.get(email=form.cleaned_data['email']), - ).order_by('change_time') - except User.DoesNotExist: - context['errors'] = ['Пользователь не найден'] + data = get_data_logs(context, start_date, end_date, form.cleaned_data['email']) stats = get_statistic_from_data(data, start_date, end_date) if stats is None: context['errors'] += ['Не найдено изменений роли в указаном диапазоне'] - interval = form.cleaned_data['interval'] # интервал работы TODO: переделать под html-страницу - show = form.cleaned_data['display_format'] # формат отображения + interval, show = form.cleaned_data['interval'], form.cleaned_data['display_format'] if not (show in ['hours', 'days']): # Работа с форматом отображения context['errors'] += ['Формат отображения должен быть в часах или днях'] @@ -281,15 +274,15 @@ def statistic_page(request): elif interval == 'months' and stats: # Переделываем ключи под формат в прототипе(начало_месяца-конец_месяца) new_stats = {} for key, value in stats.items(): - current_month_start, current_month_end = max(start_date, - date(year=key.year, month=key.month, day=1)), min( - end_date, last_day_of_month(date(year=key.year, month=key.month, day=1))) + current_month_start = max(start_date, date(year=key.year, month=key.month, day=1)) + current_month_end = min(end_date, last_day_of_month(date(year=key.year, month=key.month, day=1))) index = ' - '.join([str(current_month_start), str(current_month_end)]) if new_stats.get(index): new_stats[index] += value else: new_stats[index] = value stats = new_stats + context['log_stats'] = stats if not context['errors'] else None if request.method == 'GET': form = StatisticForm()