]> git.parisson.com Git - teleforma.git/commitdiff
#0233 : performance improvements of seminar and conference admin pages
authorYoan Le Clanche <yoanl@pilotsystems.net>
Mon, 30 Aug 2021 15:30:43 +0000 (17:30 +0200)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Mon, 30 Aug 2021 15:30:43 +0000 (17:30 +0200)
teleforma/admin.py
teleforma/models/core.py

index b904da7aa6c4ea4a4cbcf3a354da48748d2814b8..8b3b016161e125f734a0dbf5b5b3566e2cef8378 100644 (file)
@@ -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 = ""
index 06df3e28e5e9f10b64afdedfbeded22e976f2258..f90aadd42c1badcb55741e087c78c6c5ea61ff00 100755 (executable)
@@ -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)