import os from zenpy import Zenpy from zenpy.lib.exception import APIException from main.models import UserProfile class ZendeskAdmin: """ Класс **ZendeskAdmin** существует, чтобы в каждой фунциии отдельно не проверять аккаунт администратора :param credentials: Полномочия (первым указывается учетная запись организации в Zendesk) :type credentials: :class:`list of dictionaries` :param email: Email администратора, указанный в env :type email: :class:`email` :param token: Токен администратора (формируется в Zendesk, указывается в env) :type token: :class:`str` :param password: Пароль администратора, указанный в env :type password: :class:`str` """ credentials = { 'subdomain': 'ngenix1612197338' } email = os.getenv('ACCESS_CONTROLLER_API_EMAIL') token = os.getenv('ACCESS_CONTROLLER_API_TOKEN') password = os.getenv('ACCESS_CONTROLLER_API_PASSWORD') def __init__(self): self.create_admin() def check_user(self, email: str) -> bool: """ Функция **check_user** осуществляет проверку существования пользователя в Zendesk :param email: Электронная почта пользователя :type email: :class:`email` :return: True, если существует, иначе False :rtype: :class:`bool` """ return True if self.admin.search(email, type='user') else False def get_user_name(self, email: str) -> str: """ Функция **get_user_name** возвращает имя пользователя :param user_name: Имя пользователя :type user_name: :class:`str` """ user = self.admin.users.search(email).values[0] return user.name def get_user_role(self, email: str) -> str: """ Функция **get_user_role** возвращает роль пользователя :param user_role: Роль пользователя :type user_role: :class:`str` """ user = self.admin.users.search(email).values[0] return user.role def get_user_id(self, email: str) -> str: """ Функция **get_user_id** возвращает id пользователя :param user_id: ID пользователя :type user_id: :class:`str` """ user = self.admin.users.search(email).values[0] return user.id def get_user_image(self, email: str) -> str: """ Функция **get_user_image** возвращает аватар пользователя :param user_image: Аватар пользователя :type user_image: :class:`img` """ user = self.admin.users.search(email).values[0] return user.photo['content_url'] if user.photo else None def create_admin(self) -> None: """ Функция **Create_admin()** создает администратора, проверяя наличие вводимых данных в env. :param credentials: В список полномочий администратора вносятся email, token, password из env :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'] = os.getenv('ACCESS_CONTROLLER_API_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') def update_profile(user_profile: UserProfile): """ Функция обновляет профиль пользователя в соотвтетствии с текущим в Zendesk :param user_profile: Объект профиля пользователя :type user_profile: :class:`main.models.UserProfile` """ user_profile.name = ZendeskAdmin().get_user_name(user_profile.user.email) user_profile.role = ZendeskAdmin().get_user_role(user_profile.user.email) user_profile.image = ZendeskAdmin().get_user_image(user_profile.user.email) user_profile.save() def check_user_exist(email: str) -> bool: """ Функция проверяет, существует ли пользователь :param email: Электронная почта пользователя :type email: :class:`str` :return: True, если существует, иначе False :rtype: :class:`bool` """ return ZendeskAdmin().check_user(email) def check_user_auth(email: str, password: str) -> bool: """ Функция проверяет, верны ли входные данные :param email: Электроная почта пользователя :type email: :class:`str` :param password: Пароль пользователя :type password: :class:`str` :return: True, если входные данные верны, иначе False :raise: :class:`APIException`: исключение, вызываемое если пользователь не аутентифицирован :rtype: :class:`bool` """ creds = { 'email': email, 'password': password, 'subdomain': 'ngenix1612197338', } try: user = Zenpy(**creds) user.search(email, type='user') except APIException: return False return True