From 1f23b08fb1cbad116cb10642b118de0f504db02a Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Wed, 29 Nov 2017 12:08:14 -0500 Subject: [PATCH] Use a dropdown to filter schedules by course_id, rather than forcing the use of search --- openedx/core/djangoapps/schedules/admin.py | 62 ++++++++++++++++++- .../schedules/templates/dropdown_filter.html | 15 +++++ 2 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 openedx/core/djangoapps/schedules/templates/dropdown_filter.html diff --git a/openedx/core/djangoapps/schedules/admin.py b/openedx/core/djangoapps/schedules/admin.py index 9685c5f3f9..96a65c6743 100644 --- a/openedx/core/djangoapps/schedules/admin.py +++ b/openedx/core/djangoapps/schedules/admin.py @@ -8,6 +8,8 @@ from django.utils.translation import ugettext_lazy as _ from openedx.core.djangolib.markup import HTML from . import models +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview +from opaque_keys.edx.keys import CourseKey class ScheduleExperienceAdminInline(admin.StackedInline): @@ -45,7 +47,10 @@ for (db_name, human_name) in models.ScheduleExperience.EXPERIENCES: class KnownErrorCases(admin.SimpleListFilter): - title = _('KnownErrorCases') + """ + Filter schedules by a list of known error cases. + """ + title = _('Known Error Case') parameter_name = 'error' @@ -59,14 +64,65 @@ class KnownErrorCases(admin.SimpleListFilter): return queryset.filter(start__lt=F('enrollment__course__start')) +class CourseIdFilter(admin.SimpleListFilter): + """ + Filter schedules to by course id using a dropdown list. + """ + template = "dropdown_filter.html" + title = _("Course Id") + parameter_name = "course_id" + + def __init__(self, request, params, model, model_admin): + super(CourseIdFilter, self).__init__(request, params, model, model_admin) + self.unused_parameters = params.copy() + self.unused_parameters.pop(self.parameter_name, None) + + def value(self): + value = super(CourseIdFilter, self).value() + if value == "None" or value is None: + return None + else: + return CourseKey.from_string(value) + + def lookups(self, request, model_admin): + return ( + (overview.id, unicode(overview.id)) for overview in CourseOverview.objects.all().order_by('id') + ) + + def queryset(self, request, queryset): + value = self.value() + if value is None: + return queryset + else: + return queryset.filter(enrollment__course_id=value) + + def choices(self, changelist): # pylint: disable=unused-argument + yield { + 'selected': self.value() is None, + 'value': None, + 'display': _('All'), + } + for lookup, title in self.lookup_choices: + yield { + 'selected': self.value() == lookup, + 'value': unicode(lookup), + 'display': title, + } + + @admin.register(models.Schedule) class ScheduleAdmin(admin.ModelAdmin): list_display = ('username', 'course_id', 'active', 'start', 'upgrade_deadline', 'experience_display') list_display_links = ('start', 'upgrade_deadline', 'experience_display') - list_filter = ('experience__experience_type', 'active', KnownErrorCases) + list_filter = ( + CourseIdFilter, + 'experience__experience_type', + 'active', + KnownErrorCases + ) raw_id_fields = ('enrollment',) readonly_fields = ('modified',) - search_fields = ('enrollment__user__username', 'enrollment__course__id',) + search_fields = ('enrollment__user__username',) inlines = (ScheduleExperienceAdminInline,) actions = ['deactivate_schedules', 'activate_schedules'] + experience_actions diff --git a/openedx/core/djangoapps/schedules/templates/dropdown_filter.html b/openedx/core/djangoapps/schedules/templates/dropdown_filter.html new file mode 100644 index 0000000000..61c6a21737 --- /dev/null +++ b/openedx/core/djangoapps/schedules/templates/dropdown_filter.html @@ -0,0 +1,15 @@ +{% load i18n %} +

{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

+
+ {% for name, param in spec.unused_parameters.items %} + + {% endfor %} + + +