Update docs (views, extra_func, forms, models)
This commit is contained in:
@@ -12,10 +12,11 @@ def api_auth() -> dict:
|
||||
Функция создания пользователя с использованием Zendesk API.
|
||||
|
||||
Получает из env Zendesk - email, token, password пользователя.
|
||||
|
||||
Если данные валидны и пользователь Zendesk с указанным email и токеном или паролем существует,
|
||||
создается словарь данных пользователя, полученных через API c Zendesk.
|
||||
|
||||
:return: данные пользователя
|
||||
:return: данные пользователя в виде словаря: id, имя, email, роль, аватар
|
||||
"""
|
||||
credentials = {
|
||||
'subdomain': ACTRL_ZENDESK_SUBDOMAIN
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
"""
|
||||
Вспомогательные функции со списками пользователей, статистикой и т.д.
|
||||
Вспомогательные функции.
|
||||
"""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
from typing import Union
|
||||
from typing import Union, Optional
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
@@ -55,7 +55,8 @@ def make_light_agent(user_profile: UserProfile, who_changes: get_user_model()) -
|
||||
Функция устанавливает пользователю роль легкого агента.
|
||||
|
||||
:param user_profile: Профиль пользователя
|
||||
:return: Вызов функции **update_role** с параметрами: профиль пользователя, роль "light_agent"
|
||||
:return: Вызов функции **update_role** с параметрами: профиль пользователя, роль "light_agent".
|
||||
Предварительно снимаем тикеты, находящие в работы у пользователя.
|
||||
"""
|
||||
tickets: SearchResultGenerator = get_tickets_list(user_profile.user.email)
|
||||
ticket: ZenpyTicket
|
||||
@@ -85,7 +86,7 @@ def make_light_agent(user_profile: UserProfile, who_changes: get_user_model()) -
|
||||
|
||||
def get_users_list() -> list:
|
||||
"""
|
||||
Функция **get_users_list** возвращает список пользователей Zendesk, относящихся к организации SYSTEM.
|
||||
Функция возвращает список пользователей Zendesk, относящихся к организации SYSTEM.
|
||||
"""
|
||||
zendesk = zenpy
|
||||
|
||||
@@ -95,23 +96,29 @@ def get_users_list() -> list:
|
||||
return users
|
||||
|
||||
|
||||
def get_tickets_list(email) -> list:
|
||||
def get_tickets_list(email: str) -> Optional[list]:
|
||||
"""
|
||||
Функция возвращает список тикетов пользователя Zendesk
|
||||
Функция возвращает список тикетов пользователя Zendesk.
|
||||
|
||||
:param email: Email пользователя
|
||||
:return: Список тикетов пользователя
|
||||
"""
|
||||
return TicketListRequester().get_tickets_list_for_user(zenpy.get_user(email))
|
||||
|
||||
|
||||
def get_tickets_list_for_group(group_name):
|
||||
def get_tickets_list_for_group(group_name: str) -> Optional[list]:
|
||||
"""
|
||||
Функция возвращает список не назначенных, нерешённых тикетов группы Zendesk
|
||||
Функция возвращает список не назначенных, не решённых тикетов группы Zendesk.
|
||||
|
||||
:param group_name: Название группы пользователя
|
||||
:return: Список тикетов группы
|
||||
"""
|
||||
return TicketListRequester().get_tickets_list_for_group(zenpy.get_group(group_name))
|
||||
|
||||
|
||||
def update_profile(user_profile: UserProfile) -> None:
|
||||
"""
|
||||
Функция обновляет профиль пользователя в соответствии с текущим в Zendesk.
|
||||
Функция обновляет профиль пользователя в БД в соответствии с текущим в Zendesk.
|
||||
|
||||
:param user_profile: Профиль пользователя
|
||||
:return: Обновленный, в соответствие с текущими данными в Zendesk, профиль пользователя
|
||||
@@ -148,6 +155,9 @@ def check_user_auth(email: str, password: str) -> bool:
|
||||
"""
|
||||
Функция проверяет, верны ли входные данные.
|
||||
|
||||
:param email: Email пользователя
|
||||
:param password: Пароль пользователя
|
||||
:return: Существует ли пользователь
|
||||
:raise: :class:`APIException`: исключение, вызываемое если пользователь не аутентифицирован
|
||||
"""
|
||||
creds = {
|
||||
@@ -165,7 +175,7 @@ def check_user_auth(email: str, password: str) -> bool:
|
||||
|
||||
def update_user_in_model(profile: UserProfile, zendesk_user: ZenpyUser) -> None:
|
||||
"""
|
||||
Функция обновляет профиль пользователя при изменении данных пользователя на Zendesk.
|
||||
Функция обновляет профиль пользователя в модели при изменении данных пользователя на Zendesk.
|
||||
|
||||
:param profile: Профиль пользователя
|
||||
:param zendesk_user: Данные пользователя в Zendesk
|
||||
@@ -181,7 +191,10 @@ def update_user_in_model(profile: UserProfile, zendesk_user: ZenpyUser) -> None:
|
||||
|
||||
def count_users(users: list) -> tuple:
|
||||
"""
|
||||
Функция подсчета количества сотрудников с ролями engineer и light_agent
|
||||
Функция подсчета количества сотрудников с ролями engineer и light_agent.
|
||||
|
||||
:param users: Список пользователей
|
||||
:return: Количество инженеров, количество light_agents
|
||||
"""
|
||||
engineers, light_agents = 0, 0
|
||||
for user in users:
|
||||
@@ -194,7 +207,7 @@ def count_users(users: list) -> tuple:
|
||||
|
||||
def update_users_in_model() -> list:
|
||||
"""
|
||||
Обновляет пользователей в модели UserProfile по списку пользователей в организации
|
||||
Обновляет пользователей в модели UserProfile по списку пользователей в организации.
|
||||
"""
|
||||
users = get_users_list()
|
||||
for user in users:
|
||||
@@ -253,7 +266,13 @@ class DatabaseHandler(logging.Handler):
|
||||
def __init__(self):
|
||||
logging.Handler.__init__(self)
|
||||
|
||||
def emit(self, record):
|
||||
def emit(self, record: logging.LogRecord) -> None:
|
||||
"""
|
||||
Функция записи в базу данных лога с изменением роли пользователя.
|
||||
|
||||
:param record: Лог смены роли пользователя
|
||||
:return: Запись в БД лога по смене роли пользователя с указанием новой и старой роли, а также автора изменения
|
||||
"""
|
||||
database = RoleChangeLogs()
|
||||
users = record.msg
|
||||
if users[1]:
|
||||
@@ -284,7 +303,7 @@ class CsvFormatter(logging.Formatter):
|
||||
"""
|
||||
Функция форматирует запись смены роли пользователя в строку.
|
||||
|
||||
:param record: Запись смены роли пользователя.
|
||||
:param record: Лог смены роли пользователя.
|
||||
:return: Строка с записью смены пользователя.
|
||||
"""
|
||||
users = record.msg
|
||||
@@ -307,7 +326,7 @@ class CsvFormatter(logging.Formatter):
|
||||
return msg
|
||||
|
||||
|
||||
def log(user, admin=None):
|
||||
def log(user: get_user_model(), admin: get_user_model() = None) -> None:
|
||||
"""
|
||||
Функция осуществляет запись логов в базу данных и csv файл.
|
||||
|
||||
@@ -335,7 +354,7 @@ def set_session_params_for_work_page(request: WSGIRequest, count: int = None, is
|
||||
|
||||
:param request: Получение данных с рабочей страницы пользователя
|
||||
:param count: Количество запрошенных тикетов
|
||||
:param is_confirm: Назначение тикетов
|
||||
:param is_confirm: Назначены ли тикеты
|
||||
:return: Перезагрузка страницы "Управление правами" соответствующего пользователя
|
||||
"""
|
||||
request.session['is_confirm'] = is_confirm
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
Формы.
|
||||
Формы, использующиеся в приложении.
|
||||
"""
|
||||
from django import forms
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
|
||||
@@ -13,7 +13,6 @@ from access_controller.settings import ZENDESK_ROLES
|
||||
class UserProfile(models.Model):
|
||||
"""
|
||||
Модель профиля пользователя.
|
||||
|
||||
Профиль создается и изменяется при создании и изменении модель User.
|
||||
"""
|
||||
|
||||
@@ -31,11 +30,7 @@ class UserProfile(models.Model):
|
||||
@property
|
||||
def zendesk_role(self) -> str:
|
||||
"""
|
||||
Функция возвращает роль пользователя в Zendesk.
|
||||
|
||||
В формате str, либо UNDEFINED, если пользователь не найден
|
||||
|
||||
:return: Роль пользователя в Zendesk
|
||||
Роль пользователя в Zendesk, либо UNDEFINED, если пользователь не найден.
|
||||
"""
|
||||
for role, r_id in ZENDESK_ROLES.items():
|
||||
if r_id == self.custom_role_id:
|
||||
@@ -44,12 +39,12 @@ class UserProfile(models.Model):
|
||||
|
||||
|
||||
@receiver(post_save, sender=get_user_model())
|
||||
def create_user_profile(instance, created, **kwargs) -> None:
|
||||
def create_user_profile(instance: get_user_model(), created: bool, **kwargs) -> None:
|
||||
"""
|
||||
Функция создания профиля пользователя (Userprofile) при регистрации пользователя.
|
||||
|
||||
:param instance: Экземпляр класса User
|
||||
:param created: Создание профиля пользователя
|
||||
:param created: Существует ли пользователь
|
||||
:param kwargs: Параметры
|
||||
:return: Обновленный список объектов профилей пользователей
|
||||
"""
|
||||
@@ -58,7 +53,7 @@ def create_user_profile(instance, created, **kwargs) -> None:
|
||||
|
||||
|
||||
@receiver(post_save, sender=get_user_model())
|
||||
def save_user_profile(instance, **kwargs) -> None:
|
||||
def save_user_profile(instance: get_user_model(), **kwargs) -> None:
|
||||
"""
|
||||
Функция записи БД профиля пользователя.
|
||||
|
||||
@@ -84,7 +79,7 @@ class RoleChangeLogs(models.Model):
|
||||
|
||||
class UnassignedTicketStatus(models.IntegerChoices):
|
||||
"""
|
||||
Класс статусов не распределенных тикетов.
|
||||
Модель статусов нераспределенных тикетов.
|
||||
|
||||
:param UNASSIGNED: Снят с пользователя, перенесён в буферную группу
|
||||
:param RESTORED: Авторство восстановлено
|
||||
@@ -95,7 +90,7 @@ class UnassignedTicketStatus(models.IntegerChoices):
|
||||
"""
|
||||
UNASSIGNED = 0, 'Снят с пользователя, перенесён в буферную группу'
|
||||
RESTORED = 1, 'Авторство восстановлено'
|
||||
NOT_FOUND = 2, 'Пока нас не было, тикет испарился из ' \
|
||||
NOT_FOUND = 2, 'Пока нас не было, тикет был перенесен из ' \
|
||||
'буферной группы. Дополнительные действия не требуются'
|
||||
CLOSED = 3, 'Тикет уже был закрыт. Дополнительные действия не требуются'
|
||||
SOLVED = 4, 'Тикет решён. Записан на пользователя с почтой SOLVED_TICKETS_EMAIL'
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
"""
|
||||
Обработка тикетов.
|
||||
Обработка тикетов, составление списков тикетов для пользователя и группы пользователей.
|
||||
"""
|
||||
from typing import Optional
|
||||
|
||||
import requests
|
||||
from zenpy import TicketApi
|
||||
from zenpy.lib.api_objects import Ticket
|
||||
@@ -11,6 +13,13 @@ from main.zendesk_admin import zenpy
|
||||
class TicketListRequester:
|
||||
"""
|
||||
Класс обработки тикетов.
|
||||
|
||||
:param email: Email пользователя
|
||||
:type display: :class:`str`
|
||||
:param token_or_password: Токен или пароль
|
||||
:type display: :class:`str`
|
||||
:param prefix: Формат строка url страницы Zendesk
|
||||
:type display: :class:`str`
|
||||
"""
|
||||
def __init__(self):
|
||||
self.email = zenpy.credentials['email']
|
||||
@@ -21,16 +30,22 @@ class TicketListRequester:
|
||||
self.token_or_password = zenpy.credentials.get('password')
|
||||
self.prefix = f'https://{zenpy.credentials.get("subdomain")}.zendesk.com/api/v2/'
|
||||
|
||||
def get_tickets_list_for_user(self, zendesk_user: zenpy) -> str:
|
||||
def get_tickets_list_for_user(self, zendesk_user: zenpy) -> Optional[list]:
|
||||
"""
|
||||
Функция получения списка тикетов пользователя Zendesk.
|
||||
|
||||
:param zendesk_user: Пользователь Zendesk
|
||||
:return: Список тикетов, назначенных на данного пользователя в Zendesk
|
||||
"""
|
||||
url = self.prefix + f'users/{zendesk_user.id}/tickets/assigned'
|
||||
return self._get_tickets(url)
|
||||
|
||||
def get_tickets_list_for_group(self, group: zenpy) -> list():
|
||||
def get_tickets_list_for_group(self, group: zenpy) -> Optional[list]:
|
||||
"""
|
||||
Функция получения списка тикетов группы пользователей Zendesk.
|
||||
|
||||
:param group: Название группы
|
||||
:return: Список тикетов
|
||||
"""
|
||||
url = self.prefix + '/tickets'
|
||||
all_tickets = self._get_tickets(url)
|
||||
@@ -40,9 +55,12 @@ class TicketListRequester:
|
||||
tickets.append(ticket)
|
||||
return tickets
|
||||
|
||||
def _get_tickets(self, url: str) -> list():
|
||||
def _get_tickets(self, url: str) -> Optional[list]:
|
||||
"""
|
||||
Функция получения полного списка тикетов по url.
|
||||
|
||||
:param url: Url Zendesk c указанием тикетов, назначенных на пользователя
|
||||
:return: Список тикетов
|
||||
"""
|
||||
response = requests.get(url, auth=(self.email, self.token_or_password))
|
||||
tickets = []
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
Сериализаторы.
|
||||
Сериализаторы, используемые в приложении.
|
||||
"""
|
||||
from django.contrib.auth import get_user_model
|
||||
from rest_framework import serializers
|
||||
|
||||
@@ -61,7 +61,7 @@ def setup_context(**kwargs) -> Dict[str, Any]:
|
||||
|
||||
class CustomRegistrationView(RegistrationView):
|
||||
"""
|
||||
Отображение и логика работы страницы регистрации пользователя.
|
||||
Класс отображения и логики работы страницы регистрации пользователя.
|
||||
|
||||
:param form_class: Форма, которую необходимо заполнить для регистрации
|
||||
:type form_class: :class:`forms.CustomRegistrationForm`
|
||||
@@ -86,9 +86,12 @@ class CustomRegistrationView(RegistrationView):
|
||||
def register(self, form: CustomRegistrationForm) -> Optional[get_user_model()]:
|
||||
"""
|
||||
Функция регистрации пользователя.
|
||||
1. Ввод email пользователя, указанный на Zendesk
|
||||
|
||||
1. Ввод email пользователя, указанный на Zendesk.
|
||||
|
||||
2. В случае если пользователь с данным паролем зарегистрирован на Zendesk и относится к организации SYSTEM,
|
||||
происходит сброс ссылки с установлением пароля на указанный email
|
||||
происходит сброс ссылки с установлением пароля на указанный email.
|
||||
|
||||
3. Создается пользователь class User, а также его профиль.
|
||||
|
||||
:param form: Email пользователя на Zendesk
|
||||
@@ -133,7 +136,7 @@ class CustomRegistrationView(RegistrationView):
|
||||
"""
|
||||
Функция дает разрешение на просмотр страница администратора, если пользователь имеет роль admin.
|
||||
|
||||
:param user: авторизованный пользователь (получает разрешение, имея роль "admin")
|
||||
:param user: Авторизованный пользователь (получает разрешение, имея роль "admin")
|
||||
"""
|
||||
if user.userprofile.role == 'admin':
|
||||
content_type = ContentType.objects.get_for_model(UserProfile)
|
||||
@@ -148,8 +151,8 @@ class CustomRegistrationView(RegistrationView):
|
||||
Функция возвращает url-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.
|
||||
Используется самой django-registration.
|
||||
|
||||
:param user: пользователь, пытающийся зарегистрироваться
|
||||
:return: адресация на страницу успешной регистрации
|
||||
:param user: Пользователь, пытающийся зарегистрироваться
|
||||
:return: Адресация на страницу успешной регистрации
|
||||
"""
|
||||
return self.urls[self.redirect_url]
|
||||
|
||||
@@ -158,8 +161,8 @@ def registration_error(request: WSGIRequest) -> HttpResponse:
|
||||
"""
|
||||
Функция отображения страницы ошибки регистрации.
|
||||
|
||||
:param request: регистрация
|
||||
:return: адресация на страницу ошибки
|
||||
:param request: Регистрация
|
||||
:return: Адресация на страницу ошибки
|
||||
"""
|
||||
return render(request, 'django_registration/registration_error.html')
|
||||
|
||||
@@ -169,8 +172,8 @@ def profile_page(request: WSGIRequest) -> HttpResponse:
|
||||
"""
|
||||
Функция отображения страницы профиля.
|
||||
|
||||
:param request: данные пользователя из БД
|
||||
:return: адресация на страницу пользователя
|
||||
:param request: Данные пользователя из БД
|
||||
:return: Адресация на страницу пользователя
|
||||
"""
|
||||
user_profile: UserProfile = request.user.userprofile
|
||||
update_profile(user_profile)
|
||||
@@ -187,9 +190,9 @@ def work_page(request: WSGIRequest, required_id: int) -> HttpResponse:
|
||||
"""
|
||||
Функция отображения страницы "Управления правами" для текущего пользователя (login_required).
|
||||
|
||||
:param request: объект пользователя
|
||||
:param request: Объект пользователя
|
||||
:param id: id пользователя, используется для динамической адресации
|
||||
:return: адресация на страницу "Управления правами" (либо на страницу "Авторизации", если id и user.id не совпадают
|
||||
:return: Адресация на страницу "Управления правами" (либо на страницу "Авторизации", если id и user.id не совпадают
|
||||
"""
|
||||
users = get_users_list()
|
||||
if request.user.id == required_id:
|
||||
@@ -227,8 +230,8 @@ def work_hand_over(request: WSGIRequest) -> HttpResponseRedirect:
|
||||
"""
|
||||
Функция позволяет текущему пользователю сдать права, а именно сменить в Zendesk роль с "engineer" на "light_agent"
|
||||
|
||||
:param request: данные текущего пользователя (login_required)
|
||||
:return: перезагрузка текущей страницы после выполнения смены роли
|
||||
:param request: Данные текущего пользователя (login_required)
|
||||
:return: Перезагрузка текущей страницы после выполнения смены роли
|
||||
"""
|
||||
make_light_agent(request.user.userprofile, request.user)
|
||||
return set_session_params_for_work_page(request)
|
||||
@@ -240,8 +243,8 @@ def work_become_engineer(request: WSGIRequest) -> HttpResponseRedirect:
|
||||
Функция позволяет текущему пользователю получить права, а именно сменить в Zendesk роль с "light_agent"
|
||||
на "engineer".
|
||||
|
||||
:param request: данные текущего пользователя (login_required)
|
||||
:return: перезагрузка текущей страницы после выполнения смены роли
|
||||
:param request: Данные текущего пользователя (login_required)
|
||||
:return: Перезагрузка текущей страницы после выполнения смены роли
|
||||
"""
|
||||
make_engineer(request.user.userprofile, request.user)
|
||||
return set_session_params_for_work_page(request)
|
||||
@@ -250,9 +253,10 @@ def work_become_engineer(request: WSGIRequest) -> HttpResponseRedirect:
|
||||
@login_required()
|
||||
def work_get_tickets(request: WSGIRequest) -> HttpResponse:
|
||||
"""
|
||||
Функция получения тикетов в работу.
|
||||
|
||||
:param request:
|
||||
:return:
|
||||
:param request: Запрос на принятие тикетов в работу
|
||||
:return: Перезагрузка рабочей страницы
|
||||
"""
|
||||
zenpy_user = zenpy.get_user(request.user.email)
|
||||
|
||||
@@ -289,6 +293,8 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageM
|
||||
:type form_class: :class:`forms.AdminPageUsersForm`
|
||||
:param success_url: Адрес страницы администратора
|
||||
:type success_url: :class:`HttpResponseRedirect`
|
||||
:param success_message: Уведомление об изменении прав
|
||||
:type success_url: :class:`str`
|
||||
"""
|
||||
permission_required = 'main.has_control_access'
|
||||
template_name = 'pages/adm_ruleset.html'
|
||||
@@ -333,7 +339,12 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageM
|
||||
|
||||
class CustomLoginView(LoginView):
|
||||
"""
|
||||
Отображение страницы авторизации пользователя
|
||||
Класс отображения страницы авторизации пользователя.
|
||||
|
||||
:param extra_context: Добавление в контекст статус пользователя "залогинен"
|
||||
:type extra_context: :class:`dict`
|
||||
:param form_class: Форма страницы авторизации
|
||||
:type form_class: :class: forms.CustomAuthenticationForm
|
||||
"""
|
||||
extra_context = setup_context(login_lit=True)
|
||||
form_class = CustomAuthenticationForm
|
||||
@@ -353,7 +364,8 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
|
||||
def list(self, request: WSGIRequest, *args, **kwargs) -> Response:
|
||||
"""
|
||||
Функция возвращает список пользователей, список пользователей Zendesk, количество engineers и light-agents.
|
||||
Функция возвращает список пользователей Zendesk, количество engineers и light-agents.
|
||||
|
||||
:param request: Запрос
|
||||
:param args: Аргументы
|
||||
:param kwargs: Параметры
|
||||
@@ -376,6 +388,7 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
def choose_users(zendesk: list, model: list) -> list:
|
||||
"""
|
||||
Функция формирует список пользователей, которые не зарегистрированы у нас.
|
||||
|
||||
:param zendesk: Список пользователей Zendesk
|
||||
:param model: Список пользователей (модель Userprofile)
|
||||
:return: Список
|
||||
@@ -389,7 +402,8 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
@staticmethod
|
||||
def get_zendesk_users(users: list) -> list:
|
||||
"""
|
||||
Получение списка пользователей Zendesk, не являющихся админами.
|
||||
Функция получения списка пользователей Zendesk, не являющихся админами.
|
||||
|
||||
:param users: Список пользователей
|
||||
:return: Список пользователей, не являющимися администраторами.
|
||||
"""
|
||||
@@ -406,8 +420,8 @@ def statistic_page(request: WSGIRequest) -> HttpResponse:
|
||||
"""
|
||||
Функция отображения страницы статистики (для "superuser").
|
||||
|
||||
:param request: данные о пользователе: email, время и интервал работы. Данные получаем через forms.StatisticForm
|
||||
:return: адресация на страницу статистики
|
||||
:param request: Данные о пользователе: email, время и интервал работы. Данные получаем через forms.StFatisticForm
|
||||
:return: Адресация на страницу статистики
|
||||
"""
|
||||
|
||||
# if not request.user.has_perm('main.has_control_access'):
|
||||
|
||||
Reference in New Issue
Block a user