This commit is contained in:
2025-07-26 04:41:47 +03:00
parent 019e4f90c7
commit f5cf4c32da
17 changed files with 2386 additions and 931 deletions

View File

@@ -4,17 +4,20 @@ import hashlib
# Настройка логирования
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Уровень логирования настраивается в основном модуле app.py
# logger.setLevel(logging.DEBUG)
class ReqModule:
def __init__(self, host, rmsLogin, password):
self.host = host
self.rmsLogin = rmsLogin
# Пароль для API iiko/Syrve должен передаваться в виде SHA1-хэша
self.password = hashlib.sha1(password.encode('utf-8')).hexdigest()
self.token = None
self.session = requests.Session()
def login(self):
"""Выполняет авторизацию на сервере RMS и получает токен."""
logger.info(f"Вызов метода login с логином: {self.rmsLogin}")
try:
response = self.session.post(
@@ -22,19 +25,25 @@ class ReqModule:
data={'login': self.rmsLogin, 'pass': self.password},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if response.status_code == 200:
self.token = response.text
logger.info(f'Получен токен: {self.token}')
return True
elif response.status_code == 401:
logger.error(f'Ошибка авторизации. {response.text}')
raise Exception('Unauthorized')
response.raise_for_status() # Вызовет исключение для статусов 4xx/5xx
self.token = response.text
logger.info(f'Успешно получен токен: {self.token[:8]}...') # Логируем только часть токена
return True
except requests.exceptions.HTTPError as e:
if e.response.status_code == 401:
logger.error(f'Ошибка авторизации (401). Неверный логин или пароль. Ответ сервера: {e.response.text}')
else:
logger.error(f'HTTP ошибка при авторизации: {e}')
return False # Возвращаем False вместо выброса исключения для удобства обработки в app.py
except Exception as e:
logger.error(f'Error in get_token: {str(e)}')
raise
logger.error(f'Непредвиденная ошибка в login: {str(e)}')
raise # Выбрасываем исключение для критических ошибок (например, недоступность хоста)
def logout(self):
"""Функция для освобождения токена авторизации."""
"""Освобождает токен авторизации на сервере RMS."""
if not self.token:
logger.warning("Попытка вызова logout без активного токена.")
return False
try:
response = self.session.post(
f'{self.host}/api/logout',
@@ -42,15 +51,20 @@ class ReqModule:
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if response.status_code == 200:
logger.info(f"{self.token} -- Токен освобожден")
logger.info(f"Токен {self.token[:8]}... успешно освобожден.")
self.token = None
return True
else:
logger.warning(f"Не удалось освободить токен. Статус: {response.status_code}, Ответ: {response.text}")
return False
except Exception as e:
logger.error(f'Ошибка освобождения токена. {str(e)}')
logger.error(f'Ошибка при освобождении токена: {str(e)}')
raise
def take_olap(self, params):
"""Функция для отправки кастомного OLAP-запроса."""
"""Отправляет кастомный OLAP-запрос на сервер RMS."""
if not self.token:
raise Exception("Невозможно выполнить запрос take_olap: отсутствует токен авторизации.")
try:
cookies = {'key': self.token}
response = self.session.post(
@@ -58,30 +72,32 @@ class ReqModule:
json=params,
cookies=cookies
)
if response.status_code == 200:
return response.json()
else:
logger.error(f'Не удалось получить кастомный OLAP. Status code: {response.status_code} \nText: {response.text}')
raise Exception('Request failed')
response.raise_for_status() # Проверка на HTTP ошибки
return response.json()
except requests.exceptions.RequestException as e:
logger.error(f'Ошибка при выполнении OLAP-запроса: {e}. URL: {e.request.url if e.request else "N/A"}')
raise Exception(f'Ошибка сети при запросе OLAP: {e}')
except Exception as e:
logger.error(f'Error in send_olap_request: {str(e)}')
logger.error(f'Непредвиденная ошибка в take_olap: {str(e)}')
raise
def take_presets(self):
"""Функция генерации шаблонов OLAP-запросов"""
"""Получает список доступных OLAP-отчетов (пресетов) с сервера RMS."""
if not self.token:
raise Exception("Невозможно выполнить запрос take_presets: отсутствует токен авторизации.")
try:
cookies = {'key': self.token}
response = self.session.get(
f'{self.host}/api/v2/reports/olap/presets',
cookies=cookies
)
if response.status_code == 200:
presets = response.json()
logger.info('Пресеты переданы в генератор шаблонов')
return presets
else:
logger.error(f"Не удалось получить пресеты. {response.text}")
raise Exception('Take presets failed')
response.raise_for_status() # Проверка на HTTP ошибки
presets = response.json()
logger.info(f"Успешно получено {len(presets)} пресетов OLAP-отчетов.")
return presets
except requests.exceptions.RequestException as e:
logger.error(f"Сетевая ошибка при получении пресетов: {e}")
raise Exception(f'Ошибка сети при получении пресетов: {e}')
except Exception as e:
logger.error(f'Ошибка получения пресетов: {str(e)}')
logger.error(f'Непредвиденная ошибка в take_presets: {str(e)}')
raise