generated from bisco/codex-bootstrap
92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
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", "image_preview", "created_at", "updated_at")
|
|
list_filter = ("is_published",)
|
|
search_fields = ("title", "slug", "summary", "description")
|
|
prepopulated_fields = {"slug": ("title",)}
|
|
readonly_fields = ("image_preview", "created_at", "updated_at")
|
|
fields = (
|
|
"title",
|
|
"slug",
|
|
"summary",
|
|
"description",
|
|
"uploaded_image",
|
|
"poster_image",
|
|
"image_preview",
|
|
"is_published",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
|
|
@admin.display(description="Preview")
|
|
def image_preview(self, obj):
|
|
if not getattr(obj, "pk", None):
|
|
return "-"
|
|
image_url = obj.image_url()
|
|
if not image_url:
|
|
return "No image"
|
|
return format_html(
|
|
'<img src="{}" alt="{}" style="max-width: 120px; border-radius: 6px;" />',
|
|
image_url,
|
|
obj.title,
|
|
)
|
|
|
|
|
|
@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(
|
|
'<a href="{}?performance={}">Create reservation</a>',
|
|
url,
|
|
obj.pk,
|
|
)
|