extract function for easier processing a list of emails in future

This commit is contained in:
Sokurov Idar 2021-03-08 22:48:31 +03:00
parent 811ea45532
commit ce55ec61e6
2 changed files with 30 additions and 40 deletions

View File

@ -1,11 +1,12 @@
import os import os
from datetime import timedelta, datetime from datetime import timedelta, datetime
from django.contrib.auth.models import User
from zenpy import Zenpy from zenpy import Zenpy
from zenpy.lib.exception import APIException from zenpy.lib.exception import APIException
from access_controller.settings import ZENDESK_ROLES as ROLES from access_controller.settings import ZENDESK_ROLES as ROLES
from main.models import UserProfile from main.models import UserProfile, RoleChangeLogs
class ZendeskAdmin: class ZendeskAdmin:
@ -86,7 +87,7 @@ class ZendeskAdmin:
Функция **get_user_org** возвращает организацию, к которой относится пользователь по его email Функция **get_user_org** возвращает организацию, к которой относится пользователь по его email
""" """
user = self.admin.users.search(email).values[0] 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: def create_admin(self) -> Zenpy:
""" """
@ -100,7 +101,7 @@ class ZendeskAdmin:
if self.email is None: if self.email is None:
raise ValueError('access_controller email not in env') 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: if self.token:
self.credentials['token'] = self.token self.credentials['token'] = self.token
@ -174,25 +175,6 @@ def get_user_organization(email: str) -> str:
return ZendeskAdmin().get_user_org(email) 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: def daterange(start_date, end_date) -> list:
""" """
Возвращает список дней с start_date по end_date исключая правую границу Возвращает список дней с start_date по end_date исключая правую границу
@ -261,3 +243,18 @@ def get_statistic_from_data(data, start_date, end_date):
elapsed_time = next_log.change_time - current_log.change_time elapsed_time = next_log.change_time - current_log.change_time
stat[current_log.change_time.date()] += elapsed_time.total_seconds() stat[current_log.change_time.date()] += elapsed_time.total_seconds()
return stat 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

View File

@ -1,6 +1,6 @@
import logging import logging
import os 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.decorators import login_required
from django.contrib.auth.forms import PasswordResetForm 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 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, 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 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) content_type_temp = ContentType.objects.get_for_model(UserProfile)
permission_temp, created = Permission.objects.get_or_create( permission_temp, created = Permission.objects.get_or_create(
@ -252,20 +252,13 @@ def statistic_page(request):
else: else:
start_date, end_date, data = form.cleaned_data['range_start'], form.cleaned_data['range_end'], list() 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(): if end_date < start_date or end_date > datetime.now().date():
context['errors'] += ['Конец диапазона должен быть больше начала диапазона и меньше текущего времени'] context['errors'] += ['Конец диапазона должен быть позже начала диапазона и раньше текущего времени']
else: else:
try: data = get_data_logs(context, start_date, end_date, form.cleaned_data['email'])
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'] = ['Пользователь не найден']
stats = get_statistic_from_data(data, start_date, end_date) stats = get_statistic_from_data(data, start_date, end_date)
if stats is None: if stats is None:
context['errors'] += ['Не найдено изменений роли в указаном диапазоне'] context['errors'] += ['Не найдено изменений роли в указаном диапазоне']
interval = form.cleaned_data['interval'] # интервал работы TODO: переделать под html-страницу interval, show = form.cleaned_data['interval'], form.cleaned_data['display_format']
show = form.cleaned_data['display_format'] # формат отображения
if not (show in ['hours', 'days']): # Работа с форматом отображения if not (show in ['hours', 'days']): # Работа с форматом отображения
context['errors'] += ['Формат отображения должен быть в часах или днях'] context['errors'] += ['Формат отображения должен быть в часах или днях']
@ -281,15 +274,15 @@ def statistic_page(request):
elif interval == 'months' and stats: # Переделываем ключи под формат в прототипе(началоесяцаонец_месяца) elif interval == 'months' and stats: # Переделываем ключи под формат в прототипе(началоесяцаонец_месяца)
new_stats = {} new_stats = {}
for key, value in stats.items(): for key, value in stats.items():
current_month_start, current_month_end = max(start_date, current_month_start = max(start_date, date(year=key.year, month=key.month, day=1))
date(year=key.year, month=key.month, day=1)), min( current_month_end = min(end_date, last_day_of_month(date(year=key.year, month=key.month, day=1)))
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)]) index = ' - '.join([str(current_month_start), str(current_month_end)])
if new_stats.get(index): if new_stats.get(index):
new_stats[index] += value new_stats[index] += value
else: else:
new_stats[index] = value new_stats[index] = value
stats = new_stats stats = new_stats
context['log_stats'] = stats if not context['errors'] else None context['log_stats'] = stats if not context['errors'] else None
if request.method == 'GET': if request.method == 'GET':
form = StatisticForm() form = StatisticForm()