]> git.parisson.com Git - teleforma.git/commitdiff
Fix admin period filter and add media inline to conference admin
authorYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 5 Dec 2023 15:10:43 +0000 (16:10 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 5 Dec 2023 15:10:43 +0000 (16:10 +0100)
teleforma/admin.py

index cd858824e46a1a596111e7a48e67490873db834c..b4a02297346b2136f8e04c0edc057e172d533048 100644 (file)
@@ -31,6 +31,7 @@ from .models.crfpa import (IEJ, Corrector, Discount, Home, NewsItem,
                            Student, Training)
 from .models.messages import GroupedMessage, StudentGroup
 from .views.crfpa import CorrectorXLSBook, UserXLSBook
+from .views.core import get_default_period
 
 
 class PeriodListFilter(SimpleListFilter):
@@ -38,7 +39,7 @@ class PeriodListFilter(SimpleListFilter):
     title = _('period')
 
     # Parameter for the filter that will be used in the URL query.
-    parameter_name = 'period__id'
+    parameter_name = 'period'
 
     def lookups(self, request, model_admin):
         """
@@ -58,11 +59,7 @@ class PeriodListFilter(SimpleListFilter):
         `self.value()`.
         """
         if self.value():
-            try:
-                value = int(self.value())
-            except ValueError:
-                return queryset
-            return queryset.filter(period__id=value)
+            return queryset.filter(trainings__period__name=self.value())
         else:
             return queryset
 
@@ -346,19 +343,71 @@ class ConferenceDateBeginFilter(admin.SimpleListFilter):
 class MediaTranscodedInline(admin.TabularInline):
     model = MediaTranscoded
 
+@admin.action(description='Duplicate selected medias')
+def duplicate_medias(modeladmin, request, queryset):
+    for media in queryset:
+        transcoded_files = list(media.transcoded.values_list('file', flat=True))
+        media.id = None
+        media.save()
+        transcoded = [MediaTranscoded(file=file, item_id=media.id) for file in transcoded_files]
+        MediaTranscoded.objects.bulk_create(transcoded)
 
 class MediaAdmin(admin.ModelAdmin):
+
+    def get_form(self, request, obj=None, **kwargs):
+        form = super(MediaAdmin, self).get_form(request, obj, **kwargs)
+        periods = Period.objects.all()
+        period = get_default_period(periods)
+        form.base_fields['conference'].queryset = Conference.objects.filter(period=period)
+        return form
+
+    list_per_page = 30
     exclude = ['readers']
     search_fields = ['id', 'title', 'course__title', 'course__code']
-    list_filter = (ConferenceDateBeginFilter, )
+    list_filter = ['course', 'course_type', 'period', 'type', 'date_added', ConferenceDateBeginFilter, ]
     inlines = [MediaTranscodedInline]
+    actions = [duplicate_medias,]
+    exlude = ['readers', ]
+
+
+class MediaInline(admin.StackedInline):
+    model = Media
+    exclude = ['readers', ]
+
+@admin.action(description='Publish selected conferences')
+def publish_conferences(modeladmin, request, queryset):
+    for conference in queryset:
+        for media in conference.media.all():
+            media.is_published = True
+            media.save()
+
+
+@admin.action(description='Duplicate selected conferences')
+def duplicate_conferences(modeladmin, request, queryset):
+    for conference in queryset:
+        original_pid = conference.public_id
+        medias = deepcopy(conference.media.all())
+        conference.pk = None
+        conference.public_id = None
+        conference.comment += '\nCopy of ' + original_pid
+        conference.save()
+        for media in medias:
+            media.pk = None
+            media.save()
+            media.conference = conference
+            media.save()
 
 
 class ConferenceAdmin(admin.ModelAdmin):
+    inlines = [MediaInline,]
     exclude = ['readers']
-    list_filter = ('course', 'period', 'date_begin', 'session')
+    list_per_page = 30
+    list_filter = ('course', 'period', 'date_begin', 'session', 'course_type')
     search_fields = ['public_id', 'id',
                      'course__code', 'course__title', 'session']
+    actions = [publish_conferences, duplicate_conferences]
+    list_display = ['__str__', 'date_begin', 'status', 'public_id', 'comment']
+
 
 
 # class SeminarQuestionInline(admin.StackedInline):