diff --git a/bda/admin.py b/bda/admin.py index 8926c554..56c958dc 100644 --- a/bda/admin.py +++ b/bda/admin.py @@ -13,32 +13,85 @@ from bda.models import Spectacle, Salle, Participant, ChoixSpectacle,\ Attribution, Tirage, Quote, CategorieSpectacle, SpectacleRevente +class ReadOnlyMixin(object): + readonly_fields_update = () + + def get_readonly_fields(self, request, obj=None): + readonly_fields = super().get_readonly_fields(request, obj) + if obj is None: + return readonly_fields + else: + return readonly_fields + self.readonly_fields_update + + class ChoixSpectacleInline(admin.TabularInline): model = ChoixSpectacle sortable_field_name = "priority" -class AttributionInline(admin.TabularInline): - model = Attribution - extra = 0 +class AttributionAdminForm(forms.ModelForm): - def get_queryset(self, request): - qs = super(AttributionInline, self).get_queryset(request) - return qs.filter(spectacle__listing=False) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['spectacle'].queryset = ( + Spectacle.objects + .select_related('location') + ) + + +class AttributionNoListingAdminForm(AttributionAdminForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['spectacle'].queryset = ( + self.fields['spectacle'].queryset + .filter(listing=False) + ) + + +class AttributionListingAdminForm(AttributionAdminForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['spectacle'].queryset = ( + self.fields['spectacle'].queryset + .filter(listing=True) + ) class AttributionInlineListing(admin.TabularInline): model = Attribution - exclude = ('given', ) extra = 0 + form = AttributionListingAdminForm def get_queryset(self, request): - qs = super(AttributionInlineListing, self).get_queryset(request) + qs = super().get_queryset(request) return qs.filter(spectacle__listing=True) -class ParticipantAdmin(admin.ModelAdmin): - inlines = [AttributionInline, AttributionInlineListing] +class AttributionInlineNoListing(admin.TabularInline): + model = Attribution + exclude = ('given', ) + extra = 0 + form = AttributionNoListingAdminForm + + def get_queryset(self, request): + qs = super().get_queryset(request) + return qs.filter(spectacle__listing=False) + + +class ParticipantAdminForm(forms.ModelForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['choicesrevente'].queryset = ( + Spectacle.objects + .select_related('location') + ) + + +class ParticipantAdmin(ReadOnlyMixin, admin.ModelAdmin): + inlines = [AttributionInlineListing, AttributionInlineNoListing] def get_queryset(self, request): return Participant.objects.annotate(nb_places=Count('attributions'), @@ -65,6 +118,8 @@ class ParticipantAdmin(admin.ModelAdmin): actions_on_bottom = True list_per_page = 400 readonly_fields = ("total",) + readonly_fields_update = ('user', 'tirage') + form = ParticipantAdminForm def send_attribs(self, request, queryset): datatuple = [] @@ -120,17 +175,6 @@ class AttributionAdminForm(forms.ModelForm): return cleaned_data -class ReadOnlyMixin(object): - readonly_fields_update = () - - def get_readonly_fields(self, request, obj=None): - readonly_fields = super().get_readonly_fields(request, obj) - if obj is None: - return readonly_fields - else: - return readonly_fields + self.readonly_fields_update - - class AttributionAdmin(ReadOnlyMixin, admin.ModelAdmin): def paid(self, obj): return obj.participant.paid