11from django .contrib import admin
22from django .contrib .admin import SimpleListFilter
3+ from django .urls import reverse
4+ from django .utils .html import format_html
35from djangoql .admin import DjangoQLSearchMixin
4- from import_export .admin import ExportActionModelAdmin , ImportExportActionModelAdmin
6+ from import_export .admin import ImportExportActionModelAdmin
57
8+ from tickets .forms import TicketAdminForm
69from tickets .models import Venue , ConcertCategory , Concert , Ticket
710
811
@@ -16,25 +19,13 @@ class ConcertInline(admin.TabularInline):
1619 show_change_link = True
1720
1821
19- class ConcertThroughInline (admin .TabularInline ):
20- verbose_name = "concert"
21- verbose_name_plural = "concerts"
22- model = Concert .categories .through
23- fields = ["concert" ]
24- readonly_fields = ["concert" ]
25- max_num = 0
26- extra = 0
27- can_delete = False
28- show_change_link = True
29-
30-
3122class VenueAdmin (admin .ModelAdmin ):
3223 list_display = ["name" , "address" , "capacity" ]
3324 inlines = [ConcertInline ]
3425
3526
3627class ConcertCategoryAdmin (admin .ModelAdmin ):
37- inlines = [ ConcertThroughInline ]
28+ pass
3829
3930
4031class SoldOutFilter (SimpleListFilter ):
@@ -54,11 +45,11 @@ def queryset(self, request, queryset):
5445 return queryset .exclude (tickets_left = 0 )
5546
5647
57- class ConcertAdmin (DjangoQLSearchMixin , admin .ModelAdmin ):
58- list_display = ["name" , "venue" , "starts_at" , "display_price" , "tickets_left" , "display_sold_out" ]
48+ class ConcertAdmin (admin .ModelAdmin ):
49+ list_display = ["name" , "display_venue" , "starts_at" , "display_price" , "tickets_left" , "display_sold_out" ]
50+ search_fields = ["name" , "venue__name" , "venue__address" ]
5951 list_filter = ["venue" , SoldOutFilter ]
6052 readonly_fields = ["tickets_left" ]
61- search_fields = ["name" , "venue__name" , "venue__address" ]
6253
6354 def display_sold_out (self , obj ):
6455 return obj .is_sold_out ()
@@ -72,6 +63,12 @@ def display_price(self, obj):
7263 display_price .short_description = "Price"
7364 display_price .admin_order_field = "price"
7465
66+ def display_venue (self , obj ):
67+ link = reverse ("admin:tickets_venue_change" , args = [obj .venue .id ])
68+ return format_html ('<a href="{}">{}</a>' , link , obj .venue )
69+
70+ display_venue .short_description = "Venue"
71+
7572
7673@admin .action (description = "Activate selected tickets" )
7774def activate_tickets (modeladmin , request , queryset ):
@@ -83,10 +80,10 @@ def deactivate_tickets(modeladmin, request, queryset):
8380 queryset .update (is_active = False )
8481
8582
86- class TicketAdmin (ImportExportActionModelAdmin ):
83+ class TicketAdmin (DjangoQLSearchMixin , ImportExportActionModelAdmin ):
8784 list_display = ["customer_full_name" , "concert" , "payment_method" , "paid_at" , "is_active" ]
88- list_filter = ["payment_method" , "paid_at" , "is_active" ]
8985 actions = [activate_tickets , deactivate_tickets ]
86+ form = TicketAdminForm
9087
9188
9289admin .site .register (Venue , VenueAdmin )
0 commit comments