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")