Files
Touchh/hotels/admin.py
2025-02-26 22:29:39 +09:00

103 lines
3.7 KiB
Python
Raw Permalink 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.

from django import forms
from django.contrib import admin
from .models import (
Hotel,
UserHotel,
APIConfiguration,
Reservation,
Room
)
from django.urls import path
from django.shortcuts import redirect
from django.utils.html import format_html
from pms_integration.api_client import APIClient
# Custom form for Hotel to filter APIConfiguration
class HotelForm(forms.ModelForm):
class Meta:
model = Hotel
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 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)
@admin.register(Hotel)
class HotelAdmin(admin.ModelAdmin):
list_display = ['name', 'hotel_id','room_count', 'pms', 'timezone', 'description']
list_filter = ['name', 'pms', 'timezone']
list_sorting = ['name', 'pms', 'room_count', 'timezone']
def sync_button(self, obj):
return format_html(
'<a class="button" href="{}">Синхронизировать</a>',
f"/admin/hotels/sync/{obj.id}/"
)
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path('sync/<int:hotel_id>/', self.sync_hotel_data),
]
return custom_urls + urls
def room_count(self, obj):
"""
Подсчитывает количество комнат, связанных с отелем.
"""
return Room.objects.filter(hotel=obj).count()
room_count.short_description = "Количество комнат"
def sync_button(self, obj):
"""
Кнопка синхронизации данных.
"""
return format_html(
'<a class="button" href="{}">Синхронизировать</a>',
f"/admin/hotels/sync/{obj.id}/"
)
def get_urls(self):
"""
Добавление кастомного URL для синхронизации.
"""
urls = super().get_urls()
custom_urls = [
path('sync/<int:hotel_id>/', self.sync_hotel_data),
]
return custom_urls + urls
def sync_hotel_data(self, request, hotel_id):
"""
Метод синхронизации данных отеля.
"""
try:
hotel = Hotel.objects.get(id=hotel_id)
client = APIClient(hotel.pms)
client.run(hotel)
self.message_user(request, f"Данные отеля {hotel.name} успешно синхронизированы.")
except Exception as e:
self.message_user(request, f"Ошибка: {str(e)}", level="error")
return redirect("..")
@admin.register(UserHotel)
class UserHotelAdmin(admin.ModelAdmin):
list_display = ('user', 'hotel')
search_fields = ('user__username', 'hotel__name')
list_filter = ('hotel',)
ordering = ('-hotel',)
@admin.register(Reservation)
class ReservationAdmin(admin.ModelAdmin):
list_display = ('reservation_id', 'hotel', 'room_number', 'room_type', 'check_in', 'check_out', 'status', 'fraud_checked')
search_fields = ('hotel', 'room_number', 'room_type', 'check_in', 'check_out', 'status')
list_filter = ('hotel', 'room_number', 'room_type', 'check_in', 'check_out', 'status')
ordering = ('-check_in',)
@admin.register(Room)
class RoomAdmin(admin.ModelAdmin):
list_display = ('hotel', 'number', 'external_id', 'description', 'created_at', 'updated_at')
search_fields = ('hotel', 'number', 'external_id', 'description')
list_filter = ('hotel', 'number', 'external_id','description', 'created_at', 'updated_at')
ordering = ('-hotel', '-number')