2024-12-25 15:51:36 +09:00
2024-12-28 10:40:04 +10:00
2024-12-27 14:47:04 +09:00
2024-12-07 13:04:46 +09:00
2024-12-25 15:51:36 +09:00
2024-12-28 18:57:24 +09:00
2024-12-28 09:52:47 +09:00
2024-12-28 05:40:26 +10:00
2024-12-27 14:47:04 +09:00
2024-12-28 18:57:24 +09:00
2024-12-12 21:11:01 +09:00
2024-12-28 04:42:06 +10:00
2024-12-25 15:51:36 +09:00
2024-12-28 04:42:06 +10:00
2024-12-28 13:41:02 +09:00
2024-12-28 18:57:24 +09:00
2024-12-28 10:04:42 +09:00
2024-12-28 10:16:18 +10:00
2024-12-18 20:44:21 +09:00

Проект управления отелями

Описание

Проект для управления отелями, пользователями, интеграциями с PMS, а также для контроля статистики и уведомлений. Включает веб-админку, REST API для управления данными и Telegram-бота для взаимодействия с пользователями.

Стек технологий

  • Django (для бэкенда)
  • Jazzmin (для кастомизации админки)
  • MySQL (для хранения данных)
  • python-telegram-bot (для Telegram-бота)
  • Docker (для контейнеризации базы данных и проекта)

Установка

1. Клонирование репозитория

git clone <repo url>
cd yourrepository

2. Установка зависимостей


python -m venv .venv
source .venv/bin/activate  # Для Linux/MacOS
.venv\Scripts\activate  # Для Windows

pip install -r requirements.txt

3. Настройка базы данных MySQL

3.1. Запуск контейнера с MySQL

Используем Docker для поднятия MySQL контейнера:

docker-compose up -d mysql

3.2. Создание базы данных и пользователя

После поднятия контейнера с MySQL, создайте базу данных и пользователя:

3.2. Настройка базы данных

После поднятия контейнера с MySQL, создайте таблицы и загрузите дамп:

docker exec -it mysql_container bash
mysql -u root -p 

Введите пароль от MySQL, а затем загрузите ваш дамп:

mysql -u root -p your_database_name < /path/to/your_dump.sql

3.3. Применение миграций

После настройки базы данных выполните миграции для вашего Django-проекта:

python manage.py migrate

4. Настройка админки

Для настройки админки с использованием Dazzling и Jazzmin, добавьте соответствующие настройки в settings.py:

INSTALLED_APPS = [
    'dazzle',
    'jazzmin',
    ...
]

JAZZMIN_SETTINGS = {
    "site_title": "My Admin",
    "site_header": "My Administration",
    "site_brand": "My Brand",
    "footer": {
        "copyright": False,
        "version": False,
    },
}

5. Запуск проекта

Запустите сервер Django:

python manage.py runserver

Теперь проект будет доступен по адресу http://127.0.0.1:8000.

Структура проекта
hotel_manager/ — основная директория проекта.
hotel_manager/settings.py — настройки Django.
hotel_manager/models.py — модели данных для отелей, пользователей и статистики.
hotel_manager/views.py — представления для работы с данными.
hotel_manager/urls.py — маршруты проекта.
bot/ — директория для бота, использующего python-telegram-bot.
Модели
Отель (Hotel)
    Название отеля
    ID отеля
    PMS (Bnovo, Travel Line, Realty)
    Статус интеграции с PMS

Пользователь (User)
    Имя пользователя
    Роль (Admin или Hotel User)
    Связь с отелем

Настройки уведомлений (Notification Settings)
    Включено/выключено уведомление
    Часовой пояс
    Время отправки уведомлений

Статистика (Statistics)
    Количество несанкционированных заселений за период
    Статус ошибок
    Даты и номера нарушений
API
Администратор:
    Добавить/удалить отель
    Добавить/удалить пользователя
    Проверка статуса интеграции с PMS
    Управление уведомлениями

Пользователь отеля:
    Получение статистики по заселениям
    Управление уведомлениями
Интеграция с Telegram-ботом
Бот для администраторов позволяет управлять отелями, пользователями, уведомлениями и проверять статус интеграций.

Бот для пользователей отелей позволяет получать статистику по заселениям и управлять уведомлениями.
Пример команды для администратора
Добавить отель
Список отелей
Удалить отель
Проверить статус PMS
Пример команды для пользователя отеля
Показать статистику за вчера
Управление уведомлениями

Проверка интеграции с PMS

Для каждого отеля можно проверять статус интеграции с PMS (Bnovo, Travel Line, Realty) и получать ответ о доступности PMS.

Разработка плагинов для интеграции с PMS

Для разработки плагина используются следующие инструменты:

  • Django
  • Python
  • Pydantic

код примера для плагина

from datetime import datetime, timedelta
import requests
from asgiref.sync import sync_to_async
from hotels.models import Reservation
from .base_plugin import BasePMSPlugin
import logging

class ExamplePMSPlugin(BasePMSPlugin):
    """
    Плагин для интеграции с PMS Example.
    """

    def __init__(self, hotel):
        super().__init__(hotel.pms)
        self.hotel = hotel
        self.api_url = self.hotel.pms.url
        self.token = self.hotel.pms.token
        self.logger = self._configure_logger()

    def _configure_logger(self):
        logger = logging.getLogger(self.__class__.__name__)
        handler_console = logging.StreamHandler()
        handler_file = logging.FileHandler(f'{self.__class__.__name__.lower()}.log')
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        handler_console.setFormatter(formatter)
        handler_file.setFormatter(formatter)
        logger.addHandler(handler_console)
        logger.addHandler(handler_file)
        logger.setLevel(logging.DEBUG)
        return logger

    def get_default_parser_settings(self):
        """
        Возвращает настройки для обработки данных.
        """
        return {
            "field_mapping": {
                "check_in": "arrival_date",
                "check_out": "departure_date",
                "room_number": "room",
                "status": "status",
            },
            "date_format": "%Y-%m-%d %H:%M:%S"
        }

    async def _fetch_data(self):
        """
        Получает данные из API Example PMS.
        """
        headers = {
            "Authorization": f"Bearer {self.token}",
            "Content-Type": "application/json",
        }
        now = datetime.now()
        payload = {
            "from_date": (now - timedelta(days=7)).strftime("%Y-%m-%d"),
            "to_date": now.strftime("%Y-%m-%d"),
        }

        try:
            response = await sync_to_async(requests.post)(
                self.api_url, json=payload, headers=headers
            )
            response.raise_for_status()
            data = response.json()
            return await self._process_data(data)
        except requests.exceptions.RequestException as e:
            self.logger.error(f"Ошибка API: {e}")
            return {"processed_items": 0, "errors": [str(e)]}

    async def _process_data(self, data):
        """
        Обрабатывает и сохраняет данные в базу.
        """
        processed_items = 0
        errors = []

        for item in data.get("bookings", []):
            try:
                reservation, created = await sync_to_async(Reservation.objects.update_or_create)(
                    reservation_id=item['id'],
                    defaults={
                        'room_number': item['room'],
                        'check_in': datetime.strptime(item['arrival_date'], "%Y-%m-%d"),
                        'check_out': datetime.strptime(item['departure_date'], "%Y-%m-%d"),
                        'status': item['status'],
                        'hotel': self.hotel,
                    }
                )
                processed_items += 1
            except Exception as e:
                self.logger.error(f"Ошибка обработки записи {item['id']}: {e}")
                errors.append(str(e))

        return {"processed_items": processed_items, "errors": errors}

Description
No description provided
Readme 100 MiB