Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DAC Multi-Select Filtering #3037

Merged
merged 11 commits into from
Jul 8, 2024
1 change: 1 addition & 0 deletions tdrs-backend/Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ django-configurations = "==2.2"
django-cors-headers = "==3.12.0"
django-extensions = "==3.1.3"
django-filter = "==21.1"
django-more-admin-filters = "==1.8"
elipe17 marked this conversation as resolved.
Show resolved Hide resolved
django-model-utils = "==4.1.1"
django-storages = "==1.12.3"
django-unique-upload = "==0.2.1"
Expand Down
273 changes: 142 additions & 131 deletions tdrs-backend/Pipfile.lock

Large diffs are not rendered by default.

88 changes: 18 additions & 70 deletions tdrs-backend/tdpservice/search_indexes/admin/filters.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,11 @@
"""Filter classes."""
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
from more_admin_filters import MultiSelectDropdownFilter
from tdpservice.stts.models import STT
import datetime


class MultipleChoiceListFilter(SimpleListFilter):
"""Filter class allowing multiple filter options."""

template = 'multiselectlistfilter.html'

def lookups(self, request, model_admin):
"""Must be overridden to return a list of tuples (value, verbose value)."""
raise NotImplementedError(
'The MultipleChoiceListFilter.lookups() method must be overridden to '
'return a list of tuples (value, verbose value).'
)

def queryset(self, request, queryset):
"""Return queryset based on selected parameters."""
if request.GET.get(self.parameter_name):
kwargs = {self.parameter_name: request.GET[self.parameter_name].split(',')}
queryset = queryset.filter(**kwargs)
return queryset

def value_as_list(self):
"""Convert multiple filter fields to list."""
return self.value().split(',') if self.value() else []

def choices(self, changelist):
"""Overriden choices method."""
def amend_query_string(include=None, exclude=None):
selections = self.value_as_list()
if include and include not in selections:
selections.append(include)
if exclude and exclude in selections:
selections.remove(exclude)
if selections:
csv = ','.join(selections)
return changelist.get_query_string({self.parameter_name: csv})
else:
return changelist.get_query_string(remove=[self.parameter_name])

yield {
'selected': self.value() is None,
'query_string': changelist.get_query_string(remove=[self.parameter_name]),
'display': 'All',
'reset': True,
}
for lookup, title in self.lookup_choices:
yield {
'selected': str(lookup) in self.value_as_list(),
'query_string': changelist.get_query_string({self.parameter_name: lookup}),
'include_query_string': amend_query_string(include=str(lookup)),
'exclude_query_string': amend_query_string(exclude=str(lookup)),
'display': title,
}


class CreationDateFilter(SimpleListFilter):
"""Simple filter class to show newest created datafile records."""

Expand Down Expand Up @@ -94,26 +42,26 @@ def queryset(self, request, queryset):
return queryset


class STTFilter(MultipleChoiceListFilter):
"""Simple filter class to show records based on stt."""
class STTFilter(MultiSelectDropdownFilter):
"""Multi-select dropdown filter class to filter records based on stt."""

title = _('STT Code')
def __init__(self, field, request, params, model, model_admin, field_path):
super(MultiSelectDropdownFilter, self).__init__(field, request, params, model, model_admin, field_path)
self.lookup_choices = self._get_lookup_choices(request)

parameter_name = 'stt_code'
def _get_lookup_choices(self, request):
"""Filter queryset to guarentee lookup_choices only has STTs associated with the record type."""
record_type = str(request.path).split('/')[-2]
queryset = STT.objects.all()
if 'tribal' in record_type:
queryset = queryset.filter(type=STT.EntityType.TRIBE)
elif 'ssp' in record_type:
queryset = queryset.filter(ssp=True)
else:
elipe17 marked this conversation as resolved.
Show resolved Hide resolved
queryset = queryset.filter(type=STT.EntityType.STATE)

def lookups(self, request, model_admin):
"""Available options in dropdown."""
options = []
for obj in STT.objects.all():
options.append((obj.stt_code, _(obj.name)))
return options
return (queryset.distinct().order_by('name').values_list('name', flat=True))

def queryset(self, request, queryset):
"""Return queryset of records based on stt code(s)."""
if self.value() is not None and queryset.exists():
stts = self.value().split(',')
queryset = queryset.filter(datafile__stt__stt_code__in=stts)
return queryset

class FiscalPeriodFilter(SimpleListFilter):
"""Simple filter class to filter records based on datafile fiscal year."""
Expand All @@ -129,7 +77,7 @@ def lookups(self, request, model_admin):
quarters = [1, 2, 3, 4]
months = ["(Oct - Dec)", "(Jan - Mar)", "(Apr - Jun)", "(Jul - Sep)"]
years = [year for year in range(current_year, 2020, -1)]
options = [(None, _('All'))]
options = []

for year in years:
for qtr, month in zip(quarters, months):
Expand Down
8 changes: 6 additions & 2 deletions tdrs-backend/tdpservice/search_indexes/admin/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,24 @@ def export_as_csv(self, request, queryset):
export_as_csv.short_description = "Export Selected as CSV"


class SttCodeMixin:
class SttMixin:
"""Mixin class to display a record's associated stt code."""

def stt_code(self, obj):
"""Return stt code."""
return obj.datafile.stt.stt_code

def stt_name(self, obj):
"""Return stt name."""
return obj.datafile.stt.name


class AdminModelMixin(admin.ModelAdmin):
"""Base class for all mixin classes needing to modify ModelAdmin methods. Needed to satisfy Python MRO."""

pass

class CsvExportAdminMixin(AdminModelMixin, ExportCsvMixin, SttCodeMixin):
class CsvExportAdminMixin(AdminModelMixin, ExportCsvMixin, SttMixin):
"""Class to encapsulate CSV related mixins."""

actions = ["export_as_csv"]
Expand Down
28 changes: 14 additions & 14 deletions tdrs-backend/tdpservice/search_indexes/admin/ssp.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ class SSP_M1Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -27,13 +27,13 @@ class SSP_M2Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -44,13 +44,13 @@ class SSP_M3Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]

class SSP_M4Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
Expand All @@ -60,13 +60,13 @@ class SSP_M4Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]

class SSP_M5Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
Expand All @@ -76,13 +76,13 @@ class SSP_M5Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]

class SSP_M6Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
Expand All @@ -93,13 +93,13 @@ class SSP_M6Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'CALENDAR_QUARTER',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]

class SSP_M7Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
Expand All @@ -113,11 +113,11 @@ class SSP_M7Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'STRATUM',
'FAMILIES_MONTH',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]
28 changes: 14 additions & 14 deletions tdrs-backend/tdpservice/search_indexes/admin/tanf.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ class TANF_T1Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -27,13 +27,13 @@ class TANF_T2Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -44,13 +44,13 @@ class TANF_T3Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -61,13 +61,13 @@ class TANF_T4Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -78,13 +78,13 @@ class TANF_T5Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'RPT_MONTH_YEAR',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -95,13 +95,13 @@ class TANF_T6Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'RecordType',
'CALENDAR_QUARTER',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]


Expand All @@ -116,11 +116,11 @@ class TANF_T7Admin(ReadOnlyAdminMixin, CsvExportAdminMixin):
'STRATUM',
'FAMILIES_MONTH',
'datafile',
'stt_code',
'stt_name',
]

list_filter = [
FiscalPeriodFilter,
CreationDateFilter,
STTFilter,
('datafile__stt__name', STTFilter),
]
Loading
Loading