from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from .models import Performance, Show, Venue @admin.register(Show) class ShowAdmin(admin.ModelAdmin): list_display = ("title", "slug", "is_published", "created_at", "updated_at") list_filter = ("is_published",) search_fields = ("title", "slug", "summary", "description") prepopulated_fields = {"slug": ("title",)} readonly_fields = ("created_at", "updated_at") @admin.register(Venue) class VenueAdmin(admin.ModelAdmin): list_display = ("name", "slug", "city", "address", "created_at", "updated_at") list_filter = ("city",) search_fields = ("name", "slug", "address", "city", "notes") prepopulated_fields = {"slug": ("name",)} readonly_fields = ("created_at", "updated_at") @admin.register(Performance) class PerformanceAdmin(admin.ModelAdmin): list_display = ( "show", "venue", "starts_at", "room_capacity", "additional_seats", "manually_occupied_seats", "available_seats_display", "is_booking_enabled", "create_reservation_link", ) list_filter = ("is_booking_enabled", "starts_at", "show", "venue") search_fields = ("show__title", "venue__name", "venue__city") list_select_related = ("show", "venue") readonly_fields = ("created_at", "updated_at", "available_seats_display") autocomplete_fields = ("show", "venue") @admin.display(description="Available seats") def available_seats_display(self, obj): if ( not getattr(obj, "pk", None) or obj.room_capacity is None or obj.additional_seats is None or obj.manually_occupied_seats is None ): return "-" return obj.available_seats() @admin.display(description="Manual reservation") def create_reservation_link(self, obj): if not getattr(obj, "pk", None): return "-" url = reverse("admin:bookings_reservation_add") return format_html( 'Create reservation', url, obj.pk, )