from typing import Optional from zenpy import Zenpy from zenpy.lib.api_objects import User as ZenpyUser from zenpy.lib.exception import APIException from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD, \ ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL 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` """ 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() 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 def check_user(self, email: str) -> bool: """ Функция осуществляет проверку существования пользователя в Zendesk по email. :param email: Email пользователя :return: Является ли зарегистрированным """ return True if self.admin.search(email, type='user') else False def get_user_name(self, email: str) -> str: """ Функция **get_user_name** возвращает имя пользователя по его email """ user = self.admin.users.search(email).values[0] return user.name def get_user_role(self, email: str) -> str: """ Функция возвращает роль пользователя по его email. :param email: Email пользователя :return: Роль пользователя """ user = self.admin.users.search(email).values[0] return user.role def get_user_id(self, email: str) -> str: """ Функция возвращает id пользователя по его email :param email: Email пользователя :return: ID пользователя """ user = self.admin.users.search(email).values[0] return user.id def get_user_image(self, email: str) -> str: """ Функция возвращает url-ссылку на аватар пользователя по его email. :param email: Email пользователя :return: Аватар пользователя """ user = self.admin.users.search(email).values[0] return user.photo['content_url'] if user.photo else None def get_user(self, email: str) -> ZenpyUser: """ Функция возвращает пользователя (объект) по его email. :param email: Email пользователя :return: Объект пользователя, найденного в БД """ return self.admin.users.search(email).values[0] def get_group(self, name: str) -> Optional[str]: """ Функция возвращает группу по названию :param name: Имя пользователя :return: Группы пользователя (в случае отсутствия None) """ groups = self.admin.search(name, type='group') for group in groups: return group return None def get_user_org(self, email: str) -> str: """ Функция возвращает организацию, к которой относится пользователь по его email. :param email: Email пользователя :return: Организация пользователя """ user = self.admin.users.search(email).values[0] return user.organization.name if user.organization else None def create_admin(self) -> None: """ Функция создает администратора, проверяя наличие вводимых данных в 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: 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: raise ValueError('access_controller token or password not in env') self.admin = Zenpy(**self.credentials) try: self.admin.search(self.email, type='user') except APIException: raise ValueError('invalid access_controller`s login data') zenpy = ZendeskAdmin()