From 4a12a066cf928c15852c0c1173f99122ed61b4d9 Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Tue, 5 Dec 2023 16:10:43 +0100 Subject: [PATCH] Fix admin period filter and add media inline to conference admin --- teleforma/admin.py | 65 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/teleforma/admin.py b/teleforma/admin.py index cd858824..b4a02297 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -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): -- 2.39.5