bot upgraded

This commit is contained in:
2024-12-07 11:17:31 +09:00
parent e1c2ddbdb9
commit 66cf6ae940
8 changed files with 381 additions and 36 deletions

View File

@@ -1,6 +1,17 @@
from django.contrib import admin
from .models import Hotel, UserHotel, APIConfiguration, APIRequestLog, PMSConfiguration, PMSIntegrationLog
from django import forms
from .models import (
Hotel,
UserHotel,
APIConfiguration,
APIRequestLog,
PMSConfiguration,
PMSIntegrationLog,
Reservation,
Guest
)
# Custom form for Hotel to filter APIConfiguration
class HotelForm(forms.ModelForm):
class Meta:
model = Hotel
@@ -8,49 +19,72 @@ class HotelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Исключаем API, которые уже связаны с другими отелями
# Exclude APIs already linked to another hotel
used_apis = Hotel.objects.exclude(api__isnull=True).values_list('api', flat=True)
self.fields['api'].queryset = APIConfiguration.objects.exclude(id__in=used_apis)
class HotelAdmin(admin.ModelAdmin):
form = HotelForm
list_display = ('name', 'api', 'created_at', 'pms')
search_fields = ('name',)
list_filter = ('pms', 'created_at')
ordering = ('-created_at',)
admin.site.register(Hotel, HotelAdmin)
@admin.register(UserHotel)
class UserHotelAdmin(admin.ModelAdmin):
list_display = ('user', 'hotel')
search_fields = ('user', 'hotel')
search_fields = ('user__username', 'hotel__name')
list_filter = ('hotel',)
ordering = ('-hotel',)
@admin.register(APIConfiguration)
class ApiConfigurationAdmin(admin.ModelAdmin):
list_display = ('name', 'url', 'token', 'username', 'password')
search_fields = ('name', 'url', 'token', 'username', 'password')
list_filter = ('name', 'url', 'token', 'username', 'password')
ordering = ('-name',)
list_display = ('name', 'url', 'token', 'username', 'password', 'last_updated')
search_fields = ('name', 'url', 'token', 'username')
list_filter = ('last_updated',)
ordering = ('-last_updated',)
@admin.register(APIRequestLog)
class ApiRequestLogAdmin(admin.ModelAdmin):
list_display = ('api', 'request_time', 'response_status', 'response_data')
search_fields = ('api', 'request_time', 'response_status', 'response_data')
list_filter = ('api', 'request_time', 'response_status', 'response_data')
ordering = ('-api',)
search_fields = ('api__name', 'request_time', 'response_status')
list_filter = ('api', 'response_status', 'request_time')
ordering = ('-request_time',)
@admin.register(PMSConfiguration)
class PMSConfigurationAdmin(admin.ModelAdmin):
list_display = ('name', 'parser_settings', 'description')
list_display = ('name', 'parser_settings', 'description', 'created_at')
search_fields = ('name', 'description')
list_filter = ('created_at',)
ordering = ('-created_at',)
@admin.register(PMSIntegrationLog)
class PMSIntegreationLogAdmin(admin.ModelAdmin):
class PMSIntegrationLogAdmin(admin.ModelAdmin):
list_display = ('hotel', 'checked_at', 'status', 'message')
search_fields = ('hotel', 'checked_at', 'status', 'message')
list_filter = ('hotel', 'checked_at', 'status', 'message')
search_fields = ('hotel__name', 'status', 'message')
list_filter = ('status', 'checked_at')
ordering = ('-checked_at',)
@admin.register(Reservation)
class ReservationAdmin(admin.ModelAdmin):
list_display = ('reservation_id', 'hotel', 'room_number', 'room_type', 'check_in', 'check_out', 'status', 'price', 'discount')
search_fields = ('reservation_id', 'hotel__name', 'room_number', 'room_type', 'status')
list_filter = ('status', 'check_in', 'check_out')
ordering = ('-check_in',)
@admin.register(Guest)
class GuestAdmin(admin.ModelAdmin):
list_display = ('reservation', 'name', 'birthdate', 'phone', 'email')
search_fields = ('reservation__reservation_id', 'name', 'phone', 'email')
list_filter = ('reservation',)
ordering = ('-reservation',)

View File

@@ -0,0 +1,33 @@
import json
import pandas as pd
# Load the JSON file
file_path = '../../modules/analyzed_9.json'
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
# Process the data into a structured format
reservations = []
for booking in data:
for guest in booking.get("guests", []):
reservations.append({
"Reservation ID": booking.get("id"),
"Hotel Name": booking.get("hotelName"),
"Room Number": booking.get("roomNumber"),
"Room Type": booking.get("roomTypeName"),
"Check-in": booking.get("from"),
"Check-out": booking.get("until"),
"Status": booking.get("checkInStatus"),
"Price": booking.get("reservationPrice"),
"Discount": booking.get("discount"),
"Guest Name": f"{guest.get('lastName', '')} {guest.get('firstName', '')} {guest.get('middleName', '')}".strip(),
"Guest Birthdate": guest.get("birthDate"),
"Guest Phone": guest.get("phone"),
"Guest Email": guest.get("email"),
})
# Convert to DataFrame for better visualization
df_reservations = pd.DataFrame(reservations)
# Display the structured data
import ace_tools as tools; tools.display_dataframe_to_user(name="Structured Reservations Data", dataframe=df_reservations)

View File

@@ -0,0 +1,48 @@
# Generated by Django 5.1.4 on 2024-12-07 00:35
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hotels', '0010_apirequestlog_hotels_apir_api_id_686bb0_idx_and_more'),
]
operations = [
migrations.CreateModel(
name='Reservation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('reservation_id', models.BigIntegerField(unique=True, verbose_name='ID бронирования')),
('room_number', models.CharField(max_length=50, verbose_name='Номер комнаты')),
('room_type', models.CharField(max_length=255, verbose_name='Тип комнаты')),
('check_in', models.DateTimeField(verbose_name='Дата заезда')),
('check_out', models.DateTimeField(verbose_name='Дата выезда')),
('status', models.CharField(max_length=50, verbose_name='Статус')),
('price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Цена')),
('discount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Скидка')),
('hotel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hotels.hotel', verbose_name='Отель')),
],
options={
'verbose_name': 'Бронирование',
'verbose_name_plural': 'Бронирования',
},
),
migrations.CreateModel(
name='Guest',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Имя гостя')),
('birthdate', models.DateField(blank=True, null=True, verbose_name='Дата рождения')),
('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='Телефон')),
('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email')),
('reservation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='guests', to='hotels.reservation', verbose_name='Бронирование')),
],
options={
'verbose_name': 'Гость',
'verbose_name_plural': 'Гости',
},
),
]

View File

@@ -30,7 +30,8 @@ class APIConfiguration(models.Model):
class Meta:
verbose_name = "Конфигурация API"
verbose_name_plural = "Конфигурации API"
class Hotel(models.Model):
name = models.CharField(max_length=255, verbose_name="Название отеля")
api = models.OneToOneField(
@@ -50,14 +51,17 @@ class Hotel(models.Model):
class Meta:
verbose_name = "Отель"
verbose_name_plural = "Отели"
class PMSIntegrationLog(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель")
checked_at = models.DateTimeField(auto_now_add=True, verbose_name="Время проверки")
status = models.CharField(max_length=50, verbose_name="Статус", choices=[('success', 'Успех'), ('error', 'Ошибка')])
message = models.TextField(verbose_name="Сообщение", blank=True, null=True)
def __str__(self):
return f"{self.hotel.name} - {self.status} - {self.checked_at}"
class Meta:
verbose_name = "Журнал интеграции PMS"
verbose_name_plural = "Журналы интеграции PMS"
@@ -66,21 +70,18 @@ class PMSIntegrationLog(models.Model):
models.Index(fields=['checked_at']),
models.Index(fields=['status']),
]
class UserHotel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь")
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель")
def __str__(self):
return f"{self.user.username} - {self.hotel.name}"
class Meta:
verbose_name = "Пользователь отеля"
verbose_name_plural = "Пользователи отелей"
from django.db import models
class APIRequestLog(models.Model):
@@ -91,6 +92,7 @@ class APIRequestLog(models.Model):
def __str__(self):
return f"{self.api.name} - {self.request_time}"
class Meta:
verbose_name = "Журнал запросов API"
verbose_name_plural = "Журналы запросов API"
@@ -98,6 +100,37 @@ class APIRequestLog(models.Model):
models.Index(fields=['api']),
models.Index(fields=['request_time']),
]
from django.db import models
class Reservation(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель")
reservation_id = models.BigIntegerField(unique=True, verbose_name="ID бронирования")
room_number = models.CharField(max_length=50, verbose_name="Номер комнаты")
room_type = models.CharField(max_length=255, verbose_name="Тип комнаты")
check_in = models.DateTimeField(verbose_name="Дата заезда")
check_out = models.DateTimeField(verbose_name="Дата выезда")
status = models.CharField(max_length=50, verbose_name="Статус")
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name="Цена")
discount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name="Скидка")
def __str__(self):
return f"Бронирование {self.reservation_id} - {self.hotel.name}"
class Meta:
verbose_name = "Бронирование"
verbose_name_plural = "Бронирования"
class Guest(models.Model):
reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, related_name="guests", verbose_name="Бронирование")
name = models.CharField(max_length=255, verbose_name="Имя гостя")
birthdate = models.DateField(null=True, blank=True, verbose_name="Дата рождения")
phone = models.CharField(max_length=50, null=True, blank=True, verbose_name="Телефон")
email = models.EmailField(null=True, blank=True, verbose_name="Email")
def __str__(self):
return self.name
class Meta:
verbose_name = "Гость"
verbose_name_plural = "Гости"