Fix some type hints, small ZendeskAdmin refactor

This commit is contained in:
Iurii Tatishchev 2021-04-20 15:13:55 -07:00
parent 95d0db24b6
commit 8d14f2e8b4
Signed by: CaZzzer
GPG Key ID: 926BE949E29DCD03
3 changed files with 26 additions and 36 deletions

View File

@ -1,5 +1,6 @@
import logging import logging
from datetime import timedelta, datetime, date from datetime import timedelta, datetime, date
from typing import Optional
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
@ -92,7 +93,7 @@ def get_tickets_list(email):
return zenpy.admin.search(assignee=email, type='ticket') return zenpy.admin.search(assignee=email, type='ticket')
def update_profile(user_profile: UserProfile) -> UserProfile: def update_profile(user_profile: UserProfile):
""" """
Функция обновляет профиль пользователя в соответствии с текущим в Zendesk. Функция обновляет профиль пользователя в соответствии с текущим в Zendesk.
@ -318,7 +319,7 @@ class StatisticData:
self.display = display_format self.display = display_format
return True return True
def get_data(self) -> list: def get_data(self) -> Optional[dict]:
""" """
Функция возвращает данные - список объектов RoleChangeLogs. Функция возвращает данные - список объектов RoleChangeLogs.
""" """

View File

@ -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, \ 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, \ make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \
StatisticData, log StatisticData, log
from main.zendesk_admin import ZendeskAdmin from main.zendesk_admin import zenpy
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
from main.serializers import ProfileSerializer, ZendeskUserSerializer from main.serializers import ProfileSerializer, ZendeskUserSerializer
from .models import UserProfile from .models import UserProfile
@ -167,7 +167,7 @@ def auth_user(request: WSGIRequest) -> ZenpyUser:
:param request: email, subdomain и token пользователя :param request: email, subdomain и token пользователя
:return: объект пользователя Zendesk :return: объект пользователя Zendesk
""" """
admin = ZendeskAdmin().admin admin = zenpy.admin
zenpy_user: ZenpyUser = admin.users.search(request.user.email).values[0] zenpy_user: ZenpyUser = admin.users.search(request.user.email).values[0]
return zenpy_user, admin return zenpy_user, admin

View File

@ -1,7 +1,7 @@
from typing import Optional from typing import Optional, Dict
from zenpy import Zenpy 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 zenpy.lib.exception import APIException
from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD, \ from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD, \
@ -13,24 +13,12 @@ class ZendeskAdmin:
Класс **ZendeskAdmin** существует, чтобы в каждой функции отдельно не проверять аккаунт администратора. Класс **ZendeskAdmin** существует, чтобы в каждой функции отдельно не проверять аккаунт администратора.
:param credentials: Полномочия (первым указывается учетная запись организации в Zendesk) :param credentials: Полномочия (первым указывается учетная запись организации в Zendesk)
:type credentials: :class:`dict` :type credentials: :class:`Dict[str, str]`
:param email: Email администратора, указанный в env
:type email: :class:`str`
:param token: Токен администратора (формируется в Zendesk, указывается в env)
:type token: :class:`str`
:param password: Пароль администратора, указанный в env
:type password: :class:`str`
""" """
credentials: dict = { def __init__(self, credentials: Dict[str, str]):
'subdomain': ACTRL_ZENDESK_SUBDOMAIN self.credentials = credentials
} self.admin = self.create_admin()
email: str = ACTRL_API_EMAIL
token: str = ACTRL_API_TOKEN
password: str = ACTRL_API_PASSWORD
def __init__(self):
self.create_admin()
self.buffer_group_id: int = self.get_group(ZENDESK_GROUPS['buffer']).id 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 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] 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] user = self.admin.users.search(email).values[0]
return user.organization.name if user.organization else None return user.organization.name if user.organization else None
def create_admin(self) -> None: def create_admin(self) -> Zenpy:
""" """
Функция создает администратора, проверяя наличие вводимых данных в env. Функция создает администратора, проверяя наличие вводимых данных в env.
:param credentials: В список полномочий администратора вносятся email, token, password из env
:type credentials: :class:`dict`
:raise: :class:`ValueError`: исключение, вызываемое если email не введен в env :raise: :class:`ValueError`: исключение, вызываемое если email не введен в env
:raise: :class:`APIException`: исключение, вызываемое если пользователя с таким email не существует в Zendesk :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') raise ValueError('access_controller email not in env')
self.credentials['email'] = self.email
if self.token: if self.credentials.get('token') is None and self.credentials.get('password') is None:
self.credentials['token'] = self.token
elif self.password:
self.credentials['password'] = self.password
else:
raise ValueError('access_controller token or password not in env') raise ValueError('access_controller token or password not in env')
self.admin = Zenpy(**self.credentials)
admin = Zenpy(**self.credentials)
try: try:
self.admin.search(self.email, type='user') admin.search(self.credentials['email'], type='user')
except APIException: except APIException:
raise ValueError('invalid access_controller`s login data') 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,
})