Files
olaper/request_module.py
2025-07-26 04:41:47 +03:00

103 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
import logging
import hashlib
# Настройка логирования
logger = logging.getLogger(__name__)
# Уровень логирования настраивается в основном модуле 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(
f'{self.host}/api/auth',
data={'login': self.rmsLogin, 'pass': self.password},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
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'Непредвиденная ошибка в 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',
data={'key': self.token},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if response.status_code == 200:
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)}')
raise
def take_olap(self, params):
"""Отправляет кастомный OLAP-запрос на сервер RMS."""
if not self.token:
raise Exception("Невозможно выполнить запрос take_olap: отсутствует токен авторизации.")
try:
cookies = {'key': self.token}
response = self.session.post(
f'{self.host}/api/v2/reports/olap',
json=params,
cookies=cookies
)
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'Непредвиденная ошибка в take_olap: {str(e)}')
raise
def take_presets(self):
"""Получает список доступных 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
)
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'Непредвиденная ошибка в take_presets: {str(e)}')
raise