diff --git a/main/extra_func.py b/main/extra_func.py index fd59968..2ebb384 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,5 +1,6 @@ import logging from datetime import timedelta, datetime, date +from typing import Optional from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist @@ -92,7 +93,7 @@ def get_tickets_list(email): return zenpy.admin.search(assignee=email, type='ticket') -def update_profile(user_profile: UserProfile) -> UserProfile: +def update_profile(user_profile: UserProfile): """ Функция обновляет профиль пользователя в соответствии с текущим в Zendesk. @@ -318,7 +319,7 @@ class StatisticData: self.display = display_format return True - def get_data(self) -> list: + def get_data(self) -> Optional[dict]: """ Функция возвращает данные - список объектов RoleChangeLogs. """ diff --git a/main/views.py b/main/views.py index c7eec58..818de06 100644 --- a/main/views.py +++ b/main/views.py @@ -24,7 +24,7 @@ from access_controller.settings import DEFAULT_FROM_EMAIL, ZENDESK_ROLES, ZENDES from main.extra_func import check_user_exist, update_profile, get_user_organization, \ make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \ StatisticData, log -from main.zendesk_admin import ZendeskAdmin +from main.zendesk_admin import zenpy from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from main.serializers import ProfileSerializer, ZendeskUserSerializer from .models import UserProfile @@ -167,7 +167,7 @@ def auth_user(request: WSGIRequest) -> ZenpyUser: :param request: email, subdomain и token пользователя :return: объект пользователя Zendesk """ - admin = ZendeskAdmin().admin + admin = zenpy.admin zenpy_user: ZenpyUser = admin.users.search(request.user.email).values[0] return zenpy_user, admin diff --git a/main/zendesk_admin.py b/main/zendesk_admin.py index 70a461f..7692e0e 100644 --- a/main/zendesk_admin.py +++ b/main/zendesk_admin.py @@ -1,7 +1,7 @@ -from typing import Optional +from typing import Optional, Dict from zenpy import Zenpy -from zenpy.lib.api_objects import User as ZenpyUser +from zenpy.lib.api_objects import User as ZenpyUser, Group as ZenpyGroup from zenpy.lib.exception import APIException from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD, \ @@ -13,24 +13,12 @@ class ZendeskAdmin: Класс **ZendeskAdmin** существует, чтобы в каждой функции отдельно не проверять аккаунт администратора. :param credentials: Полномочия (первым указывается учетная запись организации в Zendesk) - :type credentials: :class:`dict` - :param email: Email администратора, указанный в env - :type email: :class:`str` - :param token: Токен администратора (формируется в Zendesk, указывается в env) - :type token: :class:`str` - :param password: Пароль администратора, указанный в env - :type password: :class:`str` + :type credentials: :class:`Dict[str, str]` """ - credentials: dict = { - 'subdomain': ACTRL_ZENDESK_SUBDOMAIN - } - email: str = ACTRL_API_EMAIL - token: str = ACTRL_API_TOKEN - password: str = ACTRL_API_PASSWORD - - def __init__(self): - self.create_admin() + def __init__(self, credentials: Dict[str, str]): + self.credentials = credentials + self.admin = self.create_admin() self.buffer_group_id: int = self.get_group(ZENDESK_GROUPS['buffer']).id self.solved_tickets_user_id: int = self.get_user(SOLVED_TICKETS_EMAIL).id @@ -89,7 +77,7 @@ class ZendeskAdmin: """ return self.admin.users.search(email).values[0] - def get_group(self, name: str) -> Optional[str]: + def get_group(self, name: str) -> Optional[ZenpyGroup]: """ Функция возвращает группу по названию @@ -111,31 +99,32 @@ class ZendeskAdmin: user = self.admin.users.search(email).values[0] return user.organization.name if user.organization else None - def create_admin(self) -> None: + def create_admin(self) -> Zenpy: """ Функция создает администратора, проверяя наличие вводимых данных в env. - :param credentials: В список полномочий администратора вносятся email, token, password из env - :type credentials: :class:`dict` :raise: :class:`ValueError`: исключение, вызываемое если email не введен в env :raise: :class:`APIException`: исключение, вызываемое если пользователя с таким email не существует в Zendesk """ - if self.email is None: + if self.credentials.get('email') is None: raise ValueError('access_controller email not in env') - self.credentials['email'] = self.email - if self.token: - self.credentials['token'] = self.token - elif self.password: - self.credentials['password'] = self.password - else: + if self.credentials.get('token') is None and self.credentials.get('password') is None: raise ValueError('access_controller token or password not in env') - self.admin = Zenpy(**self.credentials) + + admin = Zenpy(**self.credentials) try: - self.admin.search(self.email, type='user') + admin.search(self.credentials['email'], type='user') except APIException: raise ValueError('invalid access_controller`s login data') + return admin -zenpy = ZendeskAdmin() + +zenpy = ZendeskAdmin({ + 'subdomain': ACTRL_ZENDESK_SUBDOMAIN, + 'email': ACTRL_API_EMAIL, + 'token': ACTRL_API_TOKEN, + 'password': ACTRL_API_PASSWORD, +})