Files
Touchh/pms_integration/plugins/realtycalendar_pms.py

79 lines
2.8 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 hashlib
import requests
import json
from datetime import datetime
from hotels.models import Reservation
from pms_integration.plugins.base_plugin import BasePMSPlugin
class RealtyCalendarPlugin(BasePMSPlugin):
"""
Плагин для взаимодействия с RealtyCalendar.
"""
def __init__(self, config):
super().__init__(config)
self.public_key = config.token # Используем `token` как публичный ключ
self.private_key = config.password # Используем `password` как приватный ключ
self.base_url = config.url
def generate_sign(self, params):
"""
Генерация подписи запроса.
:param params: Параметры запроса.
:return: Подпись.
"""
sorted_keys = sorted(params.keys())
data_string = ''.join(f"{key}={params[key]}" for key in sorted_keys)
sign_string = f"{data_string}{self.private_key}"
return hashlib.md5(sign_string.encode('utf-8')).hexdigest()
def fetch_data(self, start_date=None, end_date=None):
"""
Получение данных из RealtyCalendar.
:param start_date: Начальная дата (формат YYYY-MM-DD).
:param end_date: Конечная дата (формат YYYY-MM-DD).
:return: Список данных бронирования.
"""
if not start_date:
start_date = datetime.now().strftime('%Y-%m-%d')
if not end_date:
end_date = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d')
params = {
'begin_date': start_date,
'end_date': end_date,
}
params['sign'] = self.generate_sign(params)
url = f"{self.base_url}/bookings/{self.public_key}/"
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
response = requests.post(url, json=params, headers=headers)
response.raise_for_status()
data = response.json()
return data.get('bookings', [])
@staticmethod
def save_data(bookings):
"""
Сохранение данных бронирования в базу данных.
:param bookings: Список бронирований.
"""
for booking in bookings:
Reservation.objects.update_or_create(
external_id=booking['id'],
defaults={
'check_in': booking['begin_date'],
'check_out': booking['end_date'],
'amount': booking['amount'],
'notes': booking.get('notes', ''),
'guest_name': booking['client']['fio'],
'guest_phone': booking['client']['phone'],
},
)