diff --git a/peachjam/admin.py b/peachjam/admin.py index 38cde8cde..5c0358cbe 100644 --- a/peachjam/admin.py +++ b/peachjam/admin.py @@ -3,6 +3,7 @@ from datetime import date from ckeditor.widgets import CKEditorWidget +from dal import autocomplete from django import forms from django.conf import settings from django.contrib import admin @@ -21,6 +22,7 @@ from django.utils.translation import gettext_lazy from import_export.admin import ImportExportMixin as BaseImportExportMixin from languages_plus.models import Language +from nonrelated_inlines.admin import NonrelatedTabularInline from treebeard.admin import TreeAdmin from treebeard.forms import MoveNodeForm, movenodeform_factory @@ -676,6 +678,30 @@ class BenchInline(admin.TabularInline): verbose_name_plural = gettext_lazy("judges") +class JudgmentRelationshipStackedInline(NonrelatedTabularInline): + model = Relationship + fields = ["predicate", "subject_work"] + verbose_name = "Related judgment" + verbose_name_plural = "Related judgments" + extra = 2 + + def get_form_queryset(self, obj): + return Relationship.objects.filter(object_work=obj.work) + + def save_new_instance(self, parent, instance): + instance.object_work = parent.work + + def get_formset(self, request, obj=None, **kwargs): + return super().get_formset( + request, + obj, + widgets={ + "subject_work": autocomplete.ModelSelect2(url="autocomplete-works") + }, + **kwargs, + ) + + class JudgmentAdminForm(DocumentForm): hearing_date = forms.DateField(widget=DateSelectorWidget(), required=False) @@ -701,6 +727,7 @@ class JudgmentAdmin(ImportExportMixin, DocumentAdmin): inlines = [ BenchInline, CaseNumberAdmin, + JudgmentRelationshipStackedInline, ] + DocumentAdmin.inlines filter_horizontal = ("judges", "attorneys") list_filter = (*DocumentAdmin.list_filter, "court") @@ -865,6 +892,16 @@ class RelationshipInline(admin.TabularInline): fk_name = "subject_work" fields = ("predicate", "object_work") + def get_formset(self, request, obj=None, **kwargs): + return super().get_formset( + request, + obj, + widgets={ + "object_work": autocomplete.ModelSelect2(url="autocomplete-works") + }, + **kwargs, + ) + @admin.register(Work) class WorkAdmin(admin.ModelAdmin): diff --git a/peachjam/settings.py b/peachjam/settings.py index 5bfc726e6..0158d0138 100644 --- a/peachjam/settings.py +++ b/peachjam/settings.py @@ -58,6 +58,8 @@ "django_elasticsearch_dsl", "django_elasticsearch_dsl_drf", "jazzmin", + "dal", + "dal_select2", "modeltranslation", "django.contrib.admin", "django.contrib.auth", diff --git a/peachjam/urls.py b/peachjam/urls.py index e7a6a5fc9..b50200e25 100644 --- a/peachjam/urls.py +++ b/peachjam/urls.py @@ -66,6 +66,7 @@ TaxonomyListView, TermsOfUsePageView, UserProfileDetailView, + WorkAutocomplete, ) from peachjam.views.metabase_stats import MetabaseStatsView @@ -200,6 +201,12 @@ PeachjamAdminLoginView.as_view(), name="login", ), + # autocomplete for admin area + path( + "admin/autocomplete/works", + WorkAutocomplete.as_view(), + name="autocomplete-works", + ), path("admin/", admin.site.urls), path("accounts/", include("allauth.urls")), path("api/", include("peachjam_api.urls")), diff --git a/peachjam/views/__init__.py b/peachjam/views/__init__.py index 288e32a10..90f988d73 100644 --- a/peachjam/views/__init__.py +++ b/peachjam/views/__init__.py @@ -2,6 +2,7 @@ from .about import * from .article import * from .authors import * +from .autocomplete import * from .books import * from .courts import * from .document_nature import * diff --git a/peachjam/views/autocomplete.py b/peachjam/views/autocomplete.py new file mode 100644 index 000000000..aab944165 --- /dev/null +++ b/peachjam/views/autocomplete.py @@ -0,0 +1,16 @@ +from dal import autocomplete + +from peachjam.models import Work + + +class WorkAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + # Don't forget to filter out results depending on the visitor ! + if not self.request.user.is_staff: + return Work.objects.none() + + qs = Work.objects.all() + if self.q: + qs = qs.filter(title__istartswith=self.q) + + return qs diff --git a/pyproject.toml b/pyproject.toml index b38d9c9cd..0b91b3e9e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ "Django~=3.2.13", "django-advanced-password-validation==1.1.1", "django-allauth>=0.56.0", + "django-autocomplete-light>=3.9.7", "django-background-tasks>=1.2.5", "django-ckeditor>=6.4.2", "django-compressor>=3.1", @@ -42,6 +43,7 @@ dependencies = [ "django-jazzmin>=2.5.0", "django-languages-plus>=1.1.1", "django-log-request-id>=2.0.0", + "django-nonrelated-inlines>=0.2", "django-modeltranslation>=0.18.10", "django-polymorphic==3.1.0", "django-sass-processor>=1.1",