From 2e30507753165fb4d4e02f9ee1a5aece8a2a19ed Mon Sep 17 00:00:00 2001 From: George Katsikas <giorgakis.katsikas@gmail.com> Date: Tue, 9 Jul 2024 17:14:32 +0300 Subject: [PATCH] add htmx dynsel widget to grants and funders --- scipost_django/funders/forms.py | 12 ++--- scipost_django/funders/urls.py | 4 +- scipost_django/funders/views.py | 83 +++++++++++---------------------- 3 files changed, 34 insertions(+), 65 deletions(-) diff --git a/scipost_django/funders/forms.py b/scipost_django/funders/forms.py index 312263637..c8b24b6db 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 564ce8d20..c4a13b431 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 18531ef8c..c50f49388 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) -- GitLab