Skip to content

Commit

Permalink
Merge pull request #3037 from raft-tech/3002-dac-filtering
Browse files Browse the repository at this point in the history
DAC Multi-Select Filtering
  • Loading branch information
elipe17 authored Jul 8, 2024
2 parents 001873d + d8fcc54 commit 410ce8f
Show file tree
Hide file tree
Showing 9 changed files with 212 additions and 269 deletions.
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"
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.

90 changes: 20 additions & 70 deletions tdrs-backend/tdpservice/search_indexes/admin/filters.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,12 @@
"""Filter classes."""
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
from django.db.models import Q as Query
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 +43,27 @@ 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:
type_query = Query(type=STT.EntityType.STATE) | Query(type=STT.EntityType.TERRITORY)
queryset = queryset.filter(type_query)

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 +79,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

0 comments on commit 410ce8f

Please sign in to comment.