72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
import requests
|
||
from .base_plugin import BasePMSPlugin
|
||
|
||
|
||
class BnovoPMS(BasePMSPlugin):
|
||
"""
|
||
Плагин для интеграции с Bnovo.
|
||
"""
|
||
json_schema = {
|
||
"type": "object",
|
||
"properties": {
|
||
"id": {"type": "integer"},
|
||
"number": {"type": "integer"},
|
||
"roomTypeName": {"type": "string"},
|
||
"checkInStatus": {"type": "string"},
|
||
"guests": {"type": "array"},
|
||
},
|
||
"required": ["id", "number", "roomTypeName", "checkInStatus", "guests"]
|
||
}
|
||
def get_default_parser_settings(self):
|
||
"""
|
||
Возвращает настройки парсера по умолчанию.
|
||
"""
|
||
return {
|
||
"field_mapping": {
|
||
"room_name": "roomNumber",
|
||
"check_in": "from",
|
||
"check_out": "until",
|
||
},
|
||
"date_format": "%Y-%m-%dT%H:%M:%S"
|
||
}
|
||
def fetch_data(self):
|
||
response = requests.get(self.pms_config.url, headers={"Authorization": f"Bearer {self.pms_config.token}"})
|
||
response.raise_for_status()
|
||
data = response.json()
|
||
|
||
# Проверка структуры
|
||
expected_fields = self.pms_config.parser_settings.get("fields_mapping", {})
|
||
for field in expected_fields.values():
|
||
if field not in data[0]: # Проверяем первую запись
|
||
raise ValueError(f"Поле {field} отсутствует в ответе API.")
|
||
|
||
return data
|
||
|
||
def fetch_and_parse(self):
|
||
response = requests.get(
|
||
self.pms_config.url,
|
||
headers={"Authorization": f"Bearer {self.pms_config.token}"}
|
||
)
|
||
self.validate_response(response) # Проверка соответствия структуры
|
||
if response.status_code != 200:
|
||
raise ValueError(f"Ошибка запроса к PMS Bnovo: {response.text}")
|
||
|
||
data = response.json()
|
||
parsed_data = self.parse_data(data)
|
||
return parsed_data
|
||
|
||
def parse_data(self, data):
|
||
# Пример разбора данных на основе JSON-маски
|
||
reservations = []
|
||
for item in data["reservations"]:
|
||
reservation = {
|
||
"id": item["id"],
|
||
"room_number": item["roomNumber"],
|
||
"check_in": item["checkIn"],
|
||
"check_out": item["checkOut"],
|
||
"status": item["status"],
|
||
}
|
||
reservations.append(reservation)
|
||
return reservations
|
||
|