80 lines
3.0 KiB
Python
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")
|
|
|