From ab89d52ff96ad87dd035b128d405fb6a4028e64e Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Mon, 30 Aug 2021 17:30:43 +0200 Subject: [PATCH] #0233 : performance improvements of seminar and conference admin pages --- teleforma/admin.py | 86 +++++++++++++++++++++++++++++++++++++--- teleforma/models/core.py | 9 +++++ 2 files changed, 90 insertions(+), 5 deletions(-) diff --git a/teleforma/admin.py b/teleforma/admin.py index b904da7a..8b3b0161 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -9,6 +9,7 @@ from longerusername.forms import UserCreationForm, UserChangeForm from django.contrib.contenttypes.generic import GenericInlineModelAdmin from django.http import HttpResponse import time +from datetime import date class ProfileInline(admin.StackedInline): model = Profile @@ -146,12 +147,40 @@ class MediaAdmin(admin.ModelAdmin): list_filter = ('period', 'date_added') class ConferenceAdmin(admin.ModelAdmin): - exclude = ['readers'] + exclude = ['readers', 'keywords'] search_fields = ['public_id', 'id'] filter_vertical = ['docs_description', 'suggested_seminars', 'suggested_conferences'] actions = ['export_conference'] + def render_change_form(self, request, context, *args, **kwargs): + """ + Filter queryset to improve performance + """ + instance = context.get('original') + current_year = date.today().year + years = (str(current_year), str(current_year - 1)) + current_values = [] + if instance: + current_values = [doc.id for doc in instance.docs_description.all()] + context['adminform'].form.fields['docs_description'].queryset = Document.objects.filter( + Q(period__name__in=years) | + Q(id__in=current_values) + ) + if instance: + current_values = [doc.id for doc in instance.suggested_seminars.all()] + context['adminform'].form.fields['suggested_seminars'].queryset = Seminar.objects.filter( + Q(private=2) | + Q(id__in=current_values) + ) + if instance: + current_values = [doc.id for doc in instance.suggested_conferences.all()] + context['adminform'].form.fields['suggested_conferences'].queryset = Conference.objects.filter( + Q(status=2) | + Q(id__in=current_values) + ) + return super(ConferenceAdmin, self).render_change_form(request, context, *args, **kwargs) + def export_conference(self, request, queryset): response = HttpResponse(content_type='text/csv') filename = "conferences" @@ -181,6 +210,7 @@ class SeminarQuestionInline(admin.StackedInline): model = Question class SeminarAdmin(admin.ModelAdmin): + exclude = ['keywords'] inlines = [SeminarQuestionInline,] filter_horizontal = ['professor',] filter_vertical = ['docs_description', 'docs_1', @@ -190,10 +220,56 @@ class SeminarAdmin(admin.ModelAdmin): search_fields = ['course__title', 'title', 'sub_title'] list_filter = ('period', 'publish_date', 'expiry_date') actions = ['clone_seminars', 'export_seminar'] - # raw_id_fields = ['docs_description', 'docs_1', - # 'docs_2', 'docs_correct', 'medias', 'media_preview', - # 'suggested_seminars', 'suggested_conferences', 'quiz', 'conference'] - + # raw_id_fields = [ 'media_preview', + # 'quiz', 'conference'] + + def render_change_form(self, request, context, *args, **kwargs): + """ + Filter queryset to improve performance + """ + instance = context.get('original') + current_year = date.today().year + years = (str(current_year), str(current_year - 1)) + # Documents + for fieldname in ('docs_description', 'docs_1', 'docs_2', 'docs_correct'): + current_values = [] + if instance: + current_values = getattr(instance, fieldname).all() + context['adminform'].form.fields[fieldname].queryset = Document.objects.filter( + Q(period__name__in=years) | + Q(id__in=[doc.id for doc in current_values]) + ) + + # Medias + current_values = [] + if instance: + current_values = instance.medias.all() + context['adminform'].form.fields['medias'].queryset = Media.objects.filter( + Q(date_modified__gte=datetime.date(current_year - 1, 1, 1)) | + Q(id__in=[media.id for media in current_values]) + ) + preview_id = None + if instance and instance.media_preview: + preview_id = instance.media_preview.id + context['adminform'].form.fields['media_preview'].queryset = Media.objects.filter( + Q(date_modified__gte=datetime.date(current_year - 1, 1, 1)) | + Q(id=preview_id) + ) + + # Suggested seminars / conferences + if instance: + current_values = [doc.id for doc in instance.suggested_seminars.all()] + context['adminform'].form.fields['suggested_seminars'].queryset = Seminar.objects.filter( + Q(private=2) | + Q(id__in=current_values) + ) + if instance: + current_values = [doc.id for doc in instance.suggested_conferences.all()] + context['adminform'].form.fields['suggested_conferences'].queryset = Conference.objects.filter( + Q(status=2) | + Q(id__in=current_values) + ) + return super(SeminarAdmin, self).render_change_form(request, context, *args, **kwargs) def clone_seminars(self, request, queryset): log = "" diff --git a/teleforma/models/core.py b/teleforma/models/core.py index 06df3e28..f90aadd4 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -51,6 +51,7 @@ from telemeta.models import * from teleforma.fields import * import django.db.models as models from django.utils.translation import ugettext_lazy as _ +from django.utils.functional import cached_property from django.contrib.auth.models import User from django.core.exceptions import ValidationError from django.contrib.contenttypes import generic @@ -442,6 +443,10 @@ class Document(MediaBase): self.mime_type = mimetypes.guess_type(self.file.path)[0] def __unicode__(self): + return self.full_title + + @cached_property + def full_title(self): strings = [] if self.period: strings.append(self.period.name) @@ -499,6 +504,10 @@ class Media(MediaBase): self.mime_type = mime_type def __unicode__(self): + return self.full_title + + @cached_property + def full_title(self): strings = [] if self.period: strings.append(self.period.name) -- 2.39.5