Fewer requests on participant admin create and updateviews.

- Fewer requests on choicesreventes and tabular inlines (of
  attributions)
- User and tirage cannot be updated if updating a participant instance.
- Tabular inlines are fixed:
  - the one which is used for spectacles with listing only propose
    choices in spectacle with listing
  - same with the other (spectacles without listing)
- Still does too much request (because of tabularinlines)
This commit is contained in:
Aurélien Delobelle 2017-04-08 17:16:33 +02:00
parent 6451f971bd
commit 0750551d7c

View file

@ -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