diff --git a/peachjam/migrations/0166_alter_coredocument_doc_type_causelist.py b/peachjam/migrations/0166_alter_coredocument_doc_type_causelist.py deleted file mode 100644 index 590bdbd8d..000000000 --- a/peachjam/migrations/0166_alter_coredocument_doc_type_causelist.py +++ /dev/null @@ -1,71 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-11 13:46 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("peachjam", "0165_editactivity"), - ] - - operations = [ - migrations.AlterField( - model_name="coredocument", - name="doc_type", - field=models.CharField( - choices=[ - ("core_document", "Core Document"), - ("gazette", "Gazette"), - ("generic_document", "Generic Document"), - ("judgment", "Judgment"), - ("legal_instrument", "Legal Instrument"), - ("legislation", "Legislation"), - ("book", "Book"), - ("journal", "Journal"), - ("causelist", "Cause List"), - ], - default="core_document", - max_length=255, - verbose_name="document type", - ), - ), - migrations.CreateModel( - name="CauseList", - fields=[ - ( - "coredocument_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="peachjam.coredocument", - ), - ), - ( - "court", - models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.PROTECT, - related_name="causelists", - to="peachjam.court", - verbose_name="court", - ), - ), - ( - "judges", - models.ManyToManyField( - blank=True, to="peachjam.judge", verbose_name="judges" - ), - ), - ], - options={ - "abstract": False, - "base_manager_name": "objects", - }, - bases=("peachjam.coredocument",), - ), - ] diff --git a/peachjam/models/judgment.py b/peachjam/models/judgment.py index 811dea1bd..fed299b0e 100644 --- a/peachjam/models/judgment.py +++ b/peachjam/models/judgment.py @@ -115,6 +115,23 @@ def save(self, *args, **kwargs): return super().save(*args, **kwargs) +class CourtDivision(models.Model): + name = models.CharField(_("name"), max_length=255, null=False, unique=True) + code = models.SlugField(_("code"), max_length=255, null=False, unique=True) + entity_profile = GenericRelation( + "peachjam.EntityProfile", verbose_name=_("profile") + ) + order = models.IntegerField(_("order"), null=True, blank=True) + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.code: + self.code = f"{slugify(self.name)}" + return super().save(*args, **kwargs) + + class Court(models.Model): name = models.CharField(_("name"), max_length=255, null=False, unique=True) code = models.SlugField(_("code"), max_length=255, null=False, unique=True) @@ -551,9 +568,31 @@ class CauseList(CoreDocument): verbose_name=_("court"), related_name="causelists", ) + registry = models.ForeignKey( + CourtRegistry, + on_delete=models.PROTECT, + null=True, + related_name="causelists", + blank=True, + ) + division = models.ForeignKey( + CourtDivision, + on_delete=models.PROTECT, + null=True, + related_name="causelists", + blank=True, + ) judges = models.ManyToManyField(Judge, blank=True, verbose_name=_("judges")) + def assign_title(self): + court_name = self.court.name if self.court else "" + nature_name = self.nature.name if self.nature else "" + date_str = self.date.strftime("%Y-%m-%d") if self.date else "" + + self.title = f"{court_name} {nature_name} {date_str}" + def pre_save(self): + self.assign_title() self.frbr_uri_doctype = "doc" self.doc_type = "causelist" super().pre_save() diff --git a/peachjam/templates/peachjam/_causelist_months_list.html b/peachjam/templates/peachjam/_causelist_court_months_list.html similarity index 94% rename from peachjam/templates/peachjam/_causelist_months_list.html rename to peachjam/templates/peachjam/_causelist_court_months_list.html index dde3e98e2..339ec8a00 100644 --- a/peachjam/templates/peachjam/_causelist_months_list.html +++ b/peachjam/templates/peachjam/_causelist_court_months_list.html @@ -6,6 +6,5 @@ {% block month_option %} {% endblock %} diff --git a/peachjam/templates/peachjam/_causelist_court_registries_months_list.html b/peachjam/templates/peachjam/_causelist_court_registries_months_list.html new file mode 100644 index 000000000..95dd5b7b0 --- /dev/null +++ b/peachjam/templates/peachjam/_causelist_court_registries_months_list.html @@ -0,0 +1,11 @@ +{% extends "peachjam/_court_months_list.html" %} +{% load i18n %} +{% block month_link %} + {{ m|date:"F" }} +{% endblock %} +{% block month_option %} + +{% endblock %} diff --git a/peachjam/templates/peachjam/_causelist_court_registries_years_list.html b/peachjam/templates/peachjam/_causelist_court_registries_years_list.html new file mode 100644 index 000000000..be54df368 --- /dev/null +++ b/peachjam/templates/peachjam/_causelist_court_registries_years_list.html @@ -0,0 +1,11 @@ +{% extends "peachjam/_court_years_list.html" %} +{% load i18n %} +{% block year_link %} + {{ y.year }} +{% endblock %} +{% block year_option %} + +{% endblock %} diff --git a/peachjam/templates/peachjam/_causelist_years_list.html b/peachjam/templates/peachjam/_causelist_court_years_list.html similarity index 100% rename from peachjam/templates/peachjam/_causelist_years_list.html rename to peachjam/templates/peachjam/_causelist_court_years_list.html diff --git a/peachjam/templates/peachjam/causelist_court_detail.html b/peachjam/templates/peachjam/causelist_court_detail.html index 44e38decd..4bb57cf14 100644 --- a/peachjam/templates/peachjam/causelist_court_detail.html +++ b/peachjam/templates/peachjam/causelist_court_detail.html @@ -38,9 +38,9 @@ {% include 'peachjam/_registries.html' %} {% endblock %} {% block year_list %} - {% include 'peachjam/_causelist_years_list.html' %} + {% include 'peachjam/_causelist_court_years_list.html' %} {% endblock %} {% block month_list %} - {% include 'peachjam/_causelist_months_list.html' %} + {% include 'peachjam/_causelist_court_months_list.html' %} {% endblock %} {% endblock %} diff --git a/peachjam/templates/peachjam/causelist_court_registry_detail.html b/peachjam/templates/peachjam/causelist_court_registry_detail.html new file mode 100644 index 000000000..82bbd31c1 --- /dev/null +++ b/peachjam/templates/peachjam/causelist_court_registry_detail.html @@ -0,0 +1,8 @@ +{% extends 'peachjam/causelist_court_detail.html' %} +{% load i18n %} +{% block year_list %} + {% include "peachjam/_causelist_court_registries_years_list.html" %} +{% endblock %} +{% block month_list %} + {% include "peachjam/_causelist_court_registries_months_list.html" %} +{% endblock %} diff --git a/peachjam/templates/peachjam/causelist_detail.html b/peachjam/templates/peachjam/causelist_detail.html index 4aa29da67..50a777390 100644 --- a/peachjam/templates/peachjam/causelist_detail.html +++ b/peachjam/templates/peachjam/causelist_detail.html @@ -1 +1,53 @@ {% extends 'peachjam/layouts/document_detail.html' %} +{% load i18n %} +{% block breadcrumbs %} +
+ +
+{% endblock %} +{% block document-metadata-content-citation %} + {{ block.super }} + {% if document.court %} +
+ {% trans 'Court' %} +
+
+ {{ document.court.name }} +
+ {% endif %} + {% if document.registry %} +
+ {{ document.registry.model_label }} +
+
+ {{ document.registry.name }} +
+ {% endif %} + {% if document.division %} +
+ {% trans 'Division' %} +
+
+ {{ document.division.name }} +
+ {% endif %} +{% endblock %} diff --git a/peachjam/urls.py b/peachjam/urls.py index 435279c21..bbbeef9e3 100644 --- a/peachjam/urls.py +++ b/peachjam/urls.py @@ -41,6 +41,9 @@ CauseListCourtClassYearView, CauseListCourtDetailView, CauseListCourtMonthView, + CauseListCourtRegistryDetailView, + CauseListCourtRegistryMonthView, + CauseListCourtRegistryYearView, CauseListCourtYearView, CauseListListView, CourtClassDetailView, @@ -166,6 +169,21 @@ CauseListCourtDetailView.as_view(), name="causelist_court", ), + path( + "causelists/court-class//", + CauseListCourtClassView.as_view(), + name="causelist_court_class", + ), + path( + "causelists/court-class///", + CauseListCourtClassYearView.as_view(), + name="causelist_court_class_year", + ), + path( + "causelists/court-class////", + CauseListCourtClassMonthView.as_view(), + name="causelist_court_class_month", + ), path( "causelists///", CauseListCourtYearView.as_view(), @@ -177,19 +195,19 @@ name="causelist_court_month", ), path( - "causelists/court-class//", - CauseListCourtClassView.as_view(), - name="causelist_court_class", + "causelists///", + CauseListCourtRegistryDetailView.as_view(), + name="causelist_court_registry", ), path( - "causelists/court-class///", - CauseListCourtClassYearView.as_view(), - name="causelist_court_class_year", + "causelists////", + CauseListCourtRegistryYearView.as_view(), + name="causelist_court_registry_year", ), path( - "causelists/court-class////", - CauseListCourtClassMonthView.as_view(), - name="causelist_court_class_month", + "causelists/////", + CauseListCourtRegistryMonthView.as_view(), + name="causelist_court_registry_month", ), path("place/", PlaceDetailView.as_view(), name="place"), path("legislation/", LegislationListView.as_view(), name="legislation_list"), diff --git a/peachjam/views/causelist.py b/peachjam/views/causelist.py index 8c99147a3..238a9490a 100644 --- a/peachjam/views/causelist.py +++ b/peachjam/views/causelist.py @@ -7,10 +7,10 @@ from django.views.generic import TemplateView from peachjam.helpers import lowercase_alphabet -from peachjam.models import CauseList, Court, CourtClass, Judge, Taxonomy +from peachjam.models import CauseList, Court, CourtClass, CourtRegistry, Judge, Taxonomy from peachjam.registry import registry from peachjam.views import BaseDocumentDetailView, FilteredDocumentListView -from peachjam.views.courts import MonthMixin +from peachjam.views.courts import MonthMixin, RegistryMixin from peachjam.views.generic_views import YearMixin @@ -146,26 +146,64 @@ def get_base_queryset(self, exclude=None): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["court"] = self.court - context["all_years_url"] = reverse("causelist_court", args=[self.court.code]) + context["registry_label_plural"] = CourtRegistry.model_label_plural + registries = self.court.registries.exclude(causelists__isnull=True) + split_index = ceil(registries.count() / 2) + for r in registries: + r.get_absolute_url = reverse( + "causelist_court_registry", args=[self.court.code, r.code] + ) + context["registries"] = registries + context["registry_groups"] = [ + registries[:split_index], + registries[split_index:], + ] + context["all_years_url"] = reverse("causelist_court", args=[self.court.code]) return context class CauseListCourtYearView(YearMixin, CauseListCourtDetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["year"] = self.year + context["all_months_url"] = reverse( + "causelist_court_year", args=[self.court.code, self.year] + ) return context class CauseListCourtMonthView(MonthMixin, CauseListCourtYearView): + pass + + +class CauseListCourtRegistryDetailView(RegistryMixin, CauseListCourtDetailView): + template_name = "peachjam/causelist_court_registry_detail.html" + + def base_view_name(self): + return f'{super().base_view_name()} {_("Cause Lists")}' + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["month"] = self.month + context["all_years_url"] = reverse( + "causelist_court_registry", args=[self.court.code, self.registry.code] + ) + return context + +class CauseListCourtRegistryYearView(YearMixin, CauseListCourtRegistryDetailView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["all_months_url"] = reverse( + "causelist_court_registry_year", + args=[self.court.code, self.registry.code, self.year], + ) return context +class CauseListCourtRegistryMonthView(MonthMixin, CauseListCourtRegistryYearView): + pass + + class CauseListCourtClassView(FilteredCauseListView): template_name = "peachjam/causelist_court_class_detail.html" @@ -203,7 +241,9 @@ def get_context_data(self, **kwargs): registries[:split_index], registries[split_index:], ] - context["all_years_url"] = self.court_class.get_absolute_url() + context["all_years_url"] = reverse( + "causelist_court_class", args=[self.court_class.slug] + ) return context