extract function for easier processing a list of emails in future
This commit is contained in:
parent
811ea45532
commit
ce55ec61e6
@ -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 исключая правую границу
|
||||||
@ -244,7 +226,7 @@ def get_statistic_from_data(data, start_date, end_date):
|
|||||||
if int(last_log.new_role) == ROLES['engineer']:
|
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)):
|
for day in daterange(last_log.change_time.date() + timedelta(days=1), end_date + timedelta(days=1)):
|
||||||
stat[day] = 24 * 3600
|
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):
|
for log_index in range(len(data) - 1):
|
||||||
if int(data[log_index].new_role) == ROLES['engineer']:
|
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[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()
|
stat[next_log.change_time.date()] += get_timedelta(next_log).total_seconds()
|
||||||
# Если проработал несколько дней подряд, то заполнить эти дни по 24 часа
|
# Если проработал несколько дней подряд, то заполнить эти дни по 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
|
stat[day] = 24 * 3600
|
||||||
# Если сессия закончилась в тот же день, что и началась
|
# Если сессия закончилась в тот же день, что и началась
|
||||||
else:
|
else:
|
||||||
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
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user