Files
Touchh/pms_integration/plugins/realtycalendar_pms.py
trevor 806c611cc7 bnovo plugin
scheduller
2024-12-10 20:07:23 +09:00

255 lines
11 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 hashlib
# import json
# from .base_plugin import BasePMSPlugin
# from datetime import datetime, timedelta
# from asgiref.sync import sync_to_async
# class RealtyCalendarPlugin(BasePMSPlugin):
# """Плагин для импорта данных из системы RealtyCalendar
# """
# def __init__(self, config):
# super().__init__(config)
# self.public_key = config.public_key
# self.private_key = config.private_key
# self.api_url = config.url.rstrip("/") # Убираем лишний `/` в конце URL
# if not self.public_key or not self.private_key:
# raise ValueError("Публичный или приватный ключ отсутствует для RealtyCalendar")
# def get_default_parser_settings(self):
# """
# Возвращает настройки по умолчанию для обработки данных.
# """
# return {
# "date_format": "%Y-%m-%dT%H:%M:%S",
# "timezone": "UTC"
# }
# def _get_sorted_keys(self, obj):
# """
# Возвращает отсортированный по имени список ключей.
# """
# return sorted(list(obj.keys()))
# def _generate_data_string(self, obj):
# """
# Формирует строку параметров для подписи.
# """
# sorted_keys = self._get_sorted_keys(obj)
# string = "".join(f"{key}={obj[key]}" for key in sorted_keys)
# return string + self.private_key
# def _generate_md5(self, string):
# """
# Генерирует MD5-хеш от строки.
# """
# return hashlib.md5(string.encode("utf-8")).hexdigest()
# def _generate_sign(self, data):
# """
# Генерирует подпись для данных запроса.
# """
# data_string = self._generate_data_string(data)
# return self._generate_md5(data_string)
# def fetch_data(self):
# """
# Выполняет запрос к API RealtyCalendar для получения данных о бронированиях.
# """
# base_url = f"https://realtycalendar.ru/api/v1/bookings/{self.public_key}/"
# headers = {
# "Accept": "application/json",
# "Content-Type": "application/json",
# }
# # Определяем даты выборки
# now = datetime.now()
# data = {
# "begin_date": (now - timedelta(days=7)).strftime("%Y-%m-%d"),
# "end_date": now.strftime("%Y-%m-%d"),
# }
# # Генерация подписи
# data["sign"] = self._generate_sign(data)
# # Отправляем запрос
# print(f"URL запроса: {base_url}")
# print(f"Заголовки: {headers}")
# print(f"Данные запроса: {data}")
# response = requests.post(url=base_url, headers=headers, json=data)
# # Логируем результат
# print(f"Статус ответа: {response.status_code}")
# print(f"Ответ: {response.text}")
# # Проверяем успешность запроса
# if response.status_code == 200:
# return response.json().get("bookings", [])
# else:
# raise ValueError(f"Ошибка API RealtyCalendar: {response.status_code}, {response.text}")
# async def _save_to_db(self, data, hotel_id):
# """
# Сохраняет данные о бронированиях в базу данных.
# """
# from hotels.models import Reservation, Hotel
# hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id)
# for item in data:
# try:
# reservation, created = await sync_to_async(Reservation.objects.update_or_create)(
# reservation_id=item["id"],
# hotel=hotel,
# defaults={
# "room_number": item.get("apartment_id", ""), # ID квартиры
# "check_in": datetime.strptime(item["begin_date"], "%Y-%m-%d"), # Дата заезда
# "check_out": datetime.strptime(item["end_date"], "%Y-%m-%d"), # Дата выезда
# "status": item.get("status", ""), # Статус бронирования
# "price": item.get("amount", 0), # Сумма оплаты
# "client_name": item["client"].get("fio", ""), # Имя клиента
# "client_email": item["client"].get("email", ""), # Email клиента
# "client_phone": item["client"].get("phone", ""), # Телефон клиента
# }
# )
# print(f"{'Создана' if created else 'Обновлена'} запись: {reservation}")
# except Exception as e:
# print(f"Ошибка при сохранении бронирования ID {item['id']}: {e}")
import requests
import hashlib
import json
from .base_plugin import BasePMSPlugin
from datetime import datetime, timedelta
from asgiref.sync import sync_to_async
class RealtyCalendarPlugin(BasePMSPlugin):
"""Плагин для импорта данных из системы RealtyCalendar
"""
def __init__(self, config):
super().__init__(config)
self.public_key = config.public_key
self.private_key = config.private_key
self.api_url = config.url.rstrip("/")
if not self.public_key or not self.private_key:
raise ValueError("Публичный или приватный ключ отсутствует для RealtyCalendar")
def get_default_parser_settings(self):
"""
Возвращает настройки по умолчанию для обработки данных.
"""
return {
"date_format": "%Y-%m-%dT%H:%M:%S",
"timezone": "UTC"
}
def _get_sorted_keys(self, obj):
"""
Возвращает отсортированный по имени список ключей.
"""
sorted_keys = sorted(list(obj.keys()))
print(f"[DEBUG] Отсортированные ключи: {sorted_keys}")
return sorted_keys
def _generate_data_string(self, obj):
"""
Формирует строку параметров для подписи.
"""
sorted_keys = self._get_sorted_keys(obj)
string = "".join(f"{key}={obj[key]}" for key in sorted_keys)
print(f"[DEBUG] Сформированная строка данных: {string}")
return string + self.private_key
def _generate_md5(self, string):
"""
Генерирует MD5-хеш от строки.
"""
md5_hash = hashlib.md5(string.encode("utf-8")).hexdigest()
print(f"[DEBUG] Сформированный MD5-хеш: {md5_hash}")
return md5_hash
def _generate_sign(self, data):
"""
Генерирует подпись для данных запроса.
"""
data_string = self._generate_data_string(data)
print(f"[DEBUG] Строка для подписи: {data_string}")
sign = self._generate_md5(data_string)
print(f"[DEBUG] Подпись: {sign}")
return sign
def _fetch_data(self):
"""
Выполняет запрос к API RealtyCalendar для получения данных о бронированиях.
"""
base_url = f"https://realtycalendar.ru/api/v1/bookings/{self.public_key}/"
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
}
# Определяем даты выборки
now = datetime.now()
data = {
"begin_date": (now - timedelta(days=7)).strftime("%Y-%m-%d"),
"end_date": now.strftime("%Y-%m-%d"),
}
print(f"[DEBUG] Даты выборки: {data}")
# Генерация подписи
data["sign"] = self._generate_sign(data)
# Отправляем запрос
print(f"[DEBUG] URL запроса: {base_url}")
print(f"[DEBUG] Заголовки: {headers}")
print(f"[DEBUG] Данные запроса: {data}")
response = requests.post(url=base_url, headers=headers, json=data)
# Логируем результат
print(f"[DEBUG] Статус ответа: {response.status_code}")
print(f"[DEBUG] Ответ: {response.text}")
# Проверяем успешность запроса
if response.status_code == 200:
bookings = response.json().get("bookings", [])
print(f"[DEBUG] Полученные данные бронирований: {bookings}")
return bookings
else:
raise ValueError(f"Ошибка API RealtyCalendar: {response.status_code}, {response.text}")
async def _save_to_db(self, data, hotel_id):
"""
Сохраняет данные о бронированиях в базу данных.
"""
from hotels.models import Reservation, Hotel
hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id)
print(f"[DEBUG] Загружен отель: {hotel.name}")
for item in data:
print(f"[DEBUG] Обработка бронирования: {item}")
try:
reservation, created = await sync_to_async(Reservation.objects.update_or_create)(
reservation_id=item["id"],
hotel=hotel,
defaults={
"room_number": item.get("apartment_id", ""), # ID квартиры
"check_in": datetime.strptime(item["begin_date"], "%Y-%m-%d"), # Дата заезда
"check_out": datetime.strptime(item["end_date"], "%Y-%m-%d"), # Дата выезда
"status": item.get("status", ""), # Статус бронирования
"price": item.get("amount", 0), # Сумма оплаты
"client_name": item["client"].get("fio", ""), # Имя клиента
"client_email": item["client"].get("email", ""), # Email клиента
"client_phone": item["client"].get("phone", ""), # Телефон клиента
}
)
print(f"[DEBUG] {'Создана' if created else 'Обновлена'} запись: {reservation}")
except Exception as e:
print(f"[DEBUG] Ошибка при сохранении бронирования ID {item['id']}: {e}")