Files
booking_backend/booking/admin.py
2026-04-10 20:51:43 -05:00

80 lines
3.0 KiB
Python

from django.contrib import admin
from django.core.exceptions import ValidationError
from .models import AvailabilitySlot, Booking, BookingEventLog
from .services import transition_booking_status
@admin.action(description="Mark selected bookings as approved")
def mark_approved(modeladmin, request, queryset):
for booking in queryset:
if booking.status == Booking.Status.REQUESTED:
try:
transition_booking_status(
booking=booking,
to_status=Booking.Status.APPROVED,
actor=request.user,
note="Booking approved via admin action.",
vendor_notes=booking.vendor_notes,
)
except ValidationError:
continue
@admin.action(description="Mark selected bookings as declined")
def mark_declined(modeladmin, request, queryset):
for booking in queryset:
if booking.status == Booking.Status.REQUESTED:
try:
transition_booking_status(
booking=booking,
to_status=Booking.Status.DECLINED,
actor=request.user,
note="Booking declined via admin action.",
vendor_notes=booking.vendor_notes,
)
except ValidationError:
continue
@admin.action(description="Mark selected bookings as confirmed")
def mark_confirmed(modeladmin, request, queryset):
for booking in queryset:
if booking.status == Booking.Status.APPROVED:
try:
transition_booking_status(
booking=booking,
to_status=Booking.Status.CONFIRMED,
actor=request.user,
note="Booking confirmed via admin action.",
vendor_notes=booking.vendor_notes,
)
except ValidationError:
continue
@admin.register(AvailabilitySlot)
class AvailabilitySlotAdmin(admin.ModelAdmin):
list_display = ("id", "equipment_item", "adventure_offering", "starts_at", "ends_at", "is_available")
list_filter = ("is_available",)
search_fields = ("equipment_item__public_id", "adventure_offering__public_id")
readonly_fields = ("created_at", "updated_at")
@admin.register(Booking)
class BookingAdmin(admin.ModelAdmin):
list_display = ("id", "status", "vendor", "customer", "starts_at", "ends_at", "total_price", "created_at")
list_filter = ("status", "vendor")
search_fields = ("id", "customer__email", "vendor__business_name")
readonly_fields = ("created_at", "updated_at", "total_price")
actions = (mark_approved, mark_declined, mark_confirmed)
@admin.register(BookingEventLog)
class BookingEventLogAdmin(admin.ModelAdmin):
list_display = ("booking", "from_status", "to_status", "actor", "created_at")
list_filter = ("to_status",)
search_fields = ("booking__id", "actor__email")
readonly_fields = ("booking", "from_status", "to_status", "note", "actor", "created_at")