diff --git a/src/assets/css/style.css b/src/assets/css/style.css index e113a05..f9f107b 100644 --- a/src/assets/css/style.css +++ b/src/assets/css/style.css @@ -1240,3 +1240,8 @@ h6 { .clickable-table-cell:hover { cursor: pointer; } + +.bulk-select > a:nth-child(1):hover, +.bulk-select > a:nth-child(2):hover { + color: #0d6efd; +} diff --git a/src/signals/admin.py b/src/signals/admin.py index 2c4d148..a837f0a 100644 --- a/src/signals/admin.py +++ b/src/signals/admin.py @@ -57,13 +57,12 @@ class SignalAdmin(ImportExportModelAdmin): list_display: tuple[Literal['name']] = ('name',) search_fields: tuple[Literal['name'], Literal['description'], Literal['short_description']] search_fields = ('name', 'description', 'short_description') - list_filter: tuple[Literal['pathogen'], Literal['available_geography'], Literal['signal_type'], Literal['format_type'], - Literal['is_smoothed'], Literal['is_weighted'], Literal['is_cumulative'], Literal['has_stderr'], Literal['has_sample_size']] list_filter = ( 'pathogen', 'available_geography', 'signal_type', 'format_type', + 'time_label', 'is_smoothed', 'is_weighted', 'is_cumulative', diff --git a/src/signals/filters.py b/src/signals/filters.py index 4dd2bac..24aad08 100644 --- a/src/signals/filters.py +++ b/src/signals/filters.py @@ -10,7 +10,12 @@ ) from django_filters.widgets import QueryArrayWidget -from signals.models import Signal +from datasources.models import SourceSubdivision +from signals.models import ( + FormatChoices, + Signal, + TimeLabelChoices, +) class NumberInFilter(BaseInFilter, NumberFilter): @@ -22,7 +27,11 @@ class SignalFilter(django_filters.FilterSet): FilterSet for the Signal model. """ - id = NumberInFilter(field_name='id', lookup_expr='in', widget=QueryArrayWidget) + id = NumberInFilter( + field_name='id', + lookup_expr='in', + widget=QueryArrayWidget + ) search = CharFilter(method='filter_search') order_by = OrderingFilter( fields=( @@ -31,6 +40,9 @@ class SignalFilter(django_filters.FilterSet): ('last_updated', 'last_updated'), ) ) + format_type = django_filters.MultipleChoiceFilter(choices=FormatChoices.choices) + source = django_filters.ModelMultipleChoiceFilter(queryset=SourceSubdivision.objects.all()) + time_label = django_filters.MultipleChoiceFilter(choices=TimeLabelChoices.choices) class Meta: model = Signal diff --git a/src/signals/forms.py b/src/signals/forms.py index 3c3494a..192596d 100644 --- a/src/signals/forms.py +++ b/src/signals/forms.py @@ -3,11 +3,11 @@ from datasources.models import SourceSubdivision from signals.models import ( + ActiveChoices, FormatChoices, Pathogen, Signal, TimeLabelChoices, - ActiveChoices ) @@ -18,18 +18,18 @@ class SignalFilterForm(forms.ModelForm): id = forms.ModelMultipleChoiceField(queryset=Signal.objects.all(), widget=forms.MultipleHiddenInput) order_by = forms.ChoiceField(choices=[ ('', '---------'), - ('name', 'Name'), - ('source__name', 'Source'), - ('last_updated', 'Last Updated'), + ('name', _('Name')), + ('source__name', _('Source')), + ('last_updated', _('Last Updated')), ], required=False, ) search = forms.CharField(min_length=3) - pathogen = forms.ModelChoiceField(queryset=Pathogen.objects.all(), empty_label='---------') + pathogen = forms.ModelChoiceField(queryset=Pathogen.objects.all(), widget=forms.CheckboxSelectMultiple()) active = forms.TypedMultipleChoiceField(choices=ActiveChoices.choices, coerce=bool, widget=forms.CheckboxSelectMultiple()) - format_type = forms.ChoiceField(choices=[('', '---------')] + FormatChoices.choices) - source = forms.ModelChoiceField(queryset=SourceSubdivision.objects.all(), empty_label='---------') - time_label = forms.ChoiceField(choices=[('', '---------')] + TimeLabelChoices.choices, label=_('Temporal Resolution')) + format_type = forms.ChoiceField(choices=FormatChoices.choices, widget=forms.CheckboxSelectMultiple()) + source = forms.ModelMultipleChoiceField(queryset=SourceSubdivision.objects.all(), widget=forms.CheckboxSelectMultiple()) + time_label = forms.ChoiceField(choices=TimeLabelChoices.choices, widget=forms.CheckboxSelectMultiple()) class Meta: model = Signal @@ -53,8 +53,7 @@ class Meta: 'id': 'order_by', 'aria-label': 'Order by', }), - 'search': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter search term'}), - 'pathogen': forms.Select(attrs={'class': 'form-select'}), + 'search': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('Enter search term')}), 'available_geography': forms.CheckboxSelectMultiple(attrs={ 'class': 'form-select', 'data-bs-toggle': 'tooltip', @@ -70,13 +69,16 @@ class Meta: 'data-bs-toggle': 'tooltip', 'data-bs-placement': 'bottom', }), - 'format_type': forms.Select(attrs={'class': 'form-control'}), + 'format_type': forms.CheckboxSelectMultiple(attrs={ + 'class': 'form-select', + 'data-bs-toggle': 'tooltip', + 'data-bs-placement': 'bottom', + }), 'source': forms.CheckboxSelectMultiple(attrs={ 'class': 'form-select', 'data-bs-toggle': 'tooltip', 'data-bs-placement': 'bottom', }), - 'time_label': forms.Select(attrs={'class': 'form-select'}), } def __init__(self, *args, **kwargs): diff --git a/src/signals/views.py b/src/signals/views.py index 1bba967..101a5c7 100644 --- a/src/signals/views.py +++ b/src/signals/views.py @@ -9,7 +9,7 @@ from signals.filters import SignalFilter from signals.forms import SignalFilterForm -from signals.models import Signal +from signals.models import Pathogen, Signal from signals.serializers import SignalSerializer @@ -38,9 +38,9 @@ def get_url_params(self): url_params_dict = { "id": self.request.GET.get("id"), "search": self.request.GET.get("search"), - "pathogen": int(self.request.GET.get("pathogen")) + "pathogen": [el for el in self.request.GET._getlist("pathogen")] if self.request.GET.get("pathogen") - else "", + else [el.id for el in Pathogen.objects.all()], "active": [el for el in self.request.GET._getlist("active")] if self.request.GET.get("active") else [True, False], @@ -55,13 +55,9 @@ def get_url_params(self): "category": self.request.GET._getlist("category") if self.request.GET.get("category") else None, - "format_type": self.request.GET.get("format_type"), - "source": int(self.request.GET.get("source")) - if self.request.GET.get("source") - else "", - "time_label": self.request.GET.get("time_label") - if self.request.GET.get("time_label") - else "", + "format_type": [el for el in self.request.GET._getlist("format_type")], + "source": [int(el) for el in self.request.GET._getlist("source")], + "time_label": [el for el in self.request.GET._getlist("time_label")] } url_params_str = "" for param_name, param_value in url_params_dict.items(): diff --git a/src/templates/signals/signal_detail.html b/src/templates/signals/signal_detail.html index e28897c..8801aac 100644 --- a/src/templates/signals/signal_detail.html +++ b/src/templates/signals/signal_detail.html @@ -179,6 +179,24 @@