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>&emsp;{}</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:&nbsp;{}<br>Recipient:&nbsp;{}<br>From:&nbsp;{}",
-            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