diff --git a/scipost_django/funders/forms.py b/scipost_django/funders/forms.py index 312263637d748c2f9d32e95a425e5646f9888b2a..c8b24b6dbaea71661582e1bdb9e3ec79fc6e5fd7 100644 --- a/scipost_django/funders/forms.py +++ b/scipost_django/funders/forms.py @@ -4,6 +4,8 @@ __license__ = "AGPL v3" from django import forms +from common.forms import HTMXDynSelWidget + from .models import Funder, Grant from dal import autocomplete @@ -28,7 +30,7 @@ class FunderForm(forms.ModelForm): class FunderSelectForm(forms.Form): funder = forms.ModelChoiceField( queryset=Funder.objects.all(), - widget=autocomplete.ModelSelect2( + widget=HTMXDynSelWidget( url="/funders/funder-autocomplete", attrs={"data-html": True} ), ) @@ -56,9 +58,7 @@ class GrantForm(HttpRefererFormMixin, forms.ModelForm): super().__init__(*args, **kwargs) self.fields["funder"] = forms.ModelChoiceField( queryset=Funder.objects.all(), - widget=autocomplete.ModelSelect2( - url="/funders/funder-autocomplete", attrs={"data-html": True} - ), + widget=HTMXDynSelWidget(url="/funders/funder-autocomplete"), ) self.fields["recipient"] = forms.ModelChoiceField( queryset=Contributor.objects.select_related("user").order_by( @@ -71,7 +71,5 @@ class GrantForm(HttpRefererFormMixin, forms.ModelForm): class GrantSelectForm(forms.Form): grant = forms.ModelChoiceField( queryset=Grant.objects.all(), - widget=autocomplete.ModelSelect2( - url="/funders/grant-autocomplete", attrs={"data-html": True} - ), + widget=HTMXDynSelWidget(url="/funders/grant-autocomplete"), ) diff --git a/scipost_django/funders/urls.py b/scipost_django/funders/urls.py index 564ce8d20f016efe4ef9865d416ddd4aaf2f01d5..c4a13b431ab3e24da62b0eb04f02e656b3a01cc5 100644 --- a/scipost_django/funders/urls.py +++ b/scipost_django/funders/urls.py @@ -11,12 +11,12 @@ app_name = "funders" urlpatterns = [ path( "funder-autocomplete", - views.FunderAutocompleteView.as_view(), + views.HXDynselFunderAutocomplete.as_view(), name="funder-autocomplete", ), path( "grant-autocomplete", - views.GrantAutocompleteView.as_view(), + views.HXDynselGrantAutocomplete.as_view(), name="grant-autocomplete", ), path("", views.funders, name="funders"), diff --git a/scipost_django/funders/views.py b/scipost_django/funders/views.py index 18531ef8c0bd1c3be2cc4c96f882e417802a49d9..c50f4938800ee927596a27d46eb2ceb980343918 100644 --- a/scipost_django/funders/views.py +++ b/scipost_django/funders/views.py @@ -15,7 +15,7 @@ from django.utils.html import format_html from django.views.generic.edit import CreateView, UpdateView from django.shortcuts import get_object_or_404, render, redirect -from dal import autocomplete +from common.views import HXDynselAutocomplete from .models import Funder, Grant from .forms import ( @@ -28,65 +28,36 @@ from .forms import ( from scipost.mixins import PermissionsMixin -class FunderAutocompleteView(autocomplete.Select2QuerySetView): - """ - View to feed the Select2 widget. - """ +class HXDynselFunderAutocomplete(HXDynselAutocomplete): + model = Funder + + def search(self, queryset, q): + return queryset.filter( + Q(name__unaccent__icontains=q) + | Q(acronym__unaccent__icontains=q) + | Q(identifier__icontains=q) + | Q(organization__name__unaccent__icontains=q) + | Q(organization__name_original__unaccent__icontains=q) + | Q(organization__acronym__unaccent__icontains=q) + ).order_by("name") - def get_queryset(self): - if not self.request.user.has_perm("scipost.can_draft_publication"): - return None - qs = Funder.objects.all() - if self.q: - qs = qs.filter( - Q(name__unaccent__icontains=self.q) - | Q(acronym__unaccent__icontains=self.q) - | Q(identifier__icontains=self.q) - | Q(organization__name__unaccent__icontains=self.q) - | Q(organization__name_original__unaccent__icontains=self.q) - | Q(organization__acronym__unaccent__icontains=self.q) - ).order_by("name") - return qs - - def get_result_label(self, item): - if item.organization: - return format_html( - '<span><i class="{}" title="{}"></i> {}</span>', - item.organization.country.flag_css, - item.organization.country.name, - item.name, - ) - return format_html("<span>{}</span>", item.name) - - -class GrantAutocompleteView(autocomplete.Select2QuerySetView): - """ - View to feed the Select2 widget. - """ - def get_queryset(self): +class HXDynselGrantAutocomplete(HXDynselAutocomplete): + model = Grant + + def search(self, queryset, q): if not self.request.user.has_perm("scipost.can_draft_publication"): - return None - qs = Grant.objects.all() - if self.q: - qs = qs.filter( - Q(funder__name__unaccent__icontains=self.q) - | Q(funder__acronym__icontains=self.q) - | Q(number__icontains=self.q) - | Q(recipient_name__unaccent__icontains=self.q) - | Q(recipient__user__last_name__unaccent__icontains=self.q) - | Q(recipient__user__first_name__unaccent__icontains=self.q) - | Q(further_details__icontains=self.q) + return Grant.objects.none() + else: + return queryset.filter( + Q(funder__name__unaccent__icontains=q) + | Q(funder__acronym__icontains=q) + | Q(number__icontains=q) + | Q(recipient_name__unaccent__icontains=q) + | Q(recipient__user__last_name__unaccent__icontains=q) + | Q(recipient__user__first_name__unaccent__icontains=q) + | Q(further_details__icontains=q) ).order_by("funder__name", "number") - return qs - - def get_result_label(self, item): - return format_html( - "<span>Number: {}<br>Recipient: {}<br>From: {}", - item.number, - item.recipient if item.recipient else item.recipient_name, - item.funder, - ) @permission_required("scipost.can_view_all_funding_info", raise_exception=True)