diff --git a/peachjam/admin.py b/peachjam/admin.py index 70a88c419..49f99b150 100644 --- a/peachjam/admin.py +++ b/peachjam/admin.py @@ -63,7 +63,7 @@ Locality, LowerBench, MatterType, - OrderOutcome, + Outcome, PeachJamSettings, Predicate, Relationship, @@ -275,6 +275,7 @@ class DocumentForm(forms.ModelForm): ) flynote = forms.CharField(widget=CKEditorWidget(), required=False) case_summary = forms.CharField(widget=CKEditorWidget(), required=False) + order = forms.CharField(widget=CKEditorWidget(), required=False) date = forms.DateField(widget=DateSelectorWidget()) def __init__(self, data=None, *args, **kwargs): @@ -750,14 +751,14 @@ class JudgmentAdmin(ImportExportMixin, DocumentAdmin): CaseNumberAdmin, JudgmentRelationshipStackedInline, ] + DocumentAdmin.inlines - filter_horizontal = ("judges", "attorneys", "order_outcomes") + filter_horizontal = ("judges", "attorneys", "outcomes") list_filter = (*DocumentAdmin.list_filter, "court") fieldsets = copy.deepcopy(DocumentAdmin.fieldsets) fieldsets[0][1]["fields"].insert(3, "court") fieldsets[0][1]["fields"].insert(4, "registry") fieldsets[0][1]["fields"].insert(5, "case_name") - fieldsets[0][1]["fields"].insert(6, "order_outcomes") + fieldsets[0][1]["fields"].insert(6, "outcomes") fieldsets[0][1]["fields"].insert(7, "mnc") fieldsets[0][1]["fields"].insert(8, "serial_number_override") fieldsets[0][1]["fields"].insert(9, "serial_number") @@ -765,7 +766,7 @@ class JudgmentAdmin(ImportExportMixin, DocumentAdmin): fieldsets[1][1]["fields"].insert(0, "attorneys") fieldsets[2][1]["classes"] = ["collapse"] - fieldsets[3][1]["fields"].extend(["case_summary", "flynote"]) + fieldsets[3][1]["fields"].extend(["case_summary", "flynote", "order"]) readonly_fields = [ "mnc", "serial_number", @@ -1058,7 +1059,7 @@ class CourtRegistryAdmin(BaseAdmin): list_display = ("name", "code") -@admin.register(OrderOutcome) +@admin.register(Outcome) class OutcomeAdmin(admin.ModelAdmin): list_display = ("name",) diff --git a/peachjam/forms.py b/peachjam/forms.py index b5fab7f92..7141aab5a 100644 --- a/peachjam/forms.py +++ b/peachjam/forms.py @@ -84,7 +84,7 @@ class BaseDocumentFilterForm(forms.Form): localities = forms.CharField(required=False) registries = forms.CharField(required=False) attorneys = forms.CharField(required=False) - order_outcomes = forms.CharField(required=False) + outcomes = forms.CharField(required=False) def __init__(self, data, *args, **kwargs): self.params = QueryDict(mutable=True) @@ -103,7 +103,7 @@ def filter_queryset(self, queryset, exclude=None): localities = self.params.getlist("localities") registries = self.params.getlist("registries") attorneys = self.params.getlist("attorneys") - order_outcomes = self.params.getlist("order_outcomes") + outcomes = self.params.getlist("outcomes") queryset = self.order_queryset(queryset, exclude) @@ -137,10 +137,8 @@ def filter_queryset(self, queryset, exclude=None): if attorneys and exclude != "attorneys": queryset = queryset.filter(attorneys__name__in=attorneys) - if order_outcomes and exclude != "order_outcomes": - queryset = queryset.filter( - order_outcomes__name__in=order_outcomes - ).distinct() + if outcomes and exclude != "outcomes": + queryset = queryset.filter(outcomes__name__in=outcomes).distinct() return queryset diff --git a/peachjam/js/components/ListFacets.vue b/peachjam/js/components/ListFacets.vue index 190a3aa45..1be28ede8 100644 --- a/peachjam/js/components/ListFacets.vue +++ b/peachjam/js/components/ListFacets.vue @@ -68,7 +68,7 @@ export default { type: Array, default: () => [] }, - order_outcomes: { + outcomes: { type: Array, default: () => [] } @@ -141,7 +141,7 @@ export default { title: this.$t('Judges') }, { - name: 'order_outcomes', + name: 'outcomes', type: 'checkboxes', title: this.$t('Order') }, diff --git a/peachjam/migrations/0129_rename_outcome.py b/peachjam/migrations/0129_rename_outcome.py new file mode 100644 index 000000000..5069cfb6b --- /dev/null +++ b/peachjam/migrations/0129_rename_outcome.py @@ -0,0 +1,76 @@ +# Generated by Django 3.2.21 on 2024-05-15 11:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peachjam", "0128_courtclass_show_listing_page"), + ] + + operations = [ + migrations.CreateModel( + name="Outcome", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField(max_length=1024, unique=True, verbose_name="name"), + ), + ( + "name_en", + models.CharField( + max_length=1024, null=True, unique=True, verbose_name="name" + ), + ), + ( + "name_fr", + models.CharField( + max_length=1024, null=True, unique=True, verbose_name="name" + ), + ), + ( + "name_pt", + models.CharField( + max_length=1024, null=True, unique=True, verbose_name="name" + ), + ), + ( + "name_sw", + models.CharField( + max_length=1024, null=True, unique=True, verbose_name="name" + ), + ), + ( + "description", + models.TextField(blank=True, verbose_name="description"), + ), + ], + options={ + "verbose_name": "outcome", + "verbose_name_plural": "outcomes", + "ordering": ["name"], + }, + ), + migrations.AddField( + model_name="judgment", + name="order", + field=models.TextField(blank=True, null=True, verbose_name="order"), + ), + migrations.AddField( + model_name="judgment", + name="outcomes", + field=models.ManyToManyField( + blank=True, related_name="judgments", to="peachjam.Outcome" + ), + ), + ] diff --git a/peachjam/migrations/0130_copy_outcomes.py b/peachjam/migrations/0130_copy_outcomes.py new file mode 100644 index 000000000..5127df80f --- /dev/null +++ b/peachjam/migrations/0130_copy_outcomes.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.21 on 2024-05-15 11:12 + +from django.db import migrations + + +def forwards(apps, schema_editor): + Outcome = apps.get_model("peachjam", "Outcome") + OrderOutCome = apps.get_model("peachjam", "OrderOutCome") + Judgment = apps.get_model("peachjam", "Judgment") + + for outcome in OrderOutCome.objects.all(): + o = Outcome() + o.name = outcome.name + o.description = outcome.description + if hasattr(outcome, "name_en"): + o.name_en = outcome.name_en + if hasattr(outcome, "name_fr"): + o.name_fr = outcome.name_fr + if hasattr(outcome, "name_pt"): + o.name_pt = outcome.name_pt + if hasattr(outcome, "name_sw"): + o.name_sw = outcome.name_sw + o.save() + + for judgment in Judgment.objects.all(): + j_outcomes = judgment.order_outcomes.all().values_list("name", flat=True) + outcomes = Outcome.objects.filter(name__in=j_outcomes) + if outcomes: + for outcome in outcomes: + judgment.outcomes.add(outcome) + + +class Migration(migrations.Migration): + + dependencies = [ + ("peachjam", "0129_rename_outcome"), + ] + + operations = [ + migrations.RunPython(forwards, migrations.RunPython.noop), + ] diff --git a/peachjam/models/judgment.py b/peachjam/models/judgment.py index b46c9d178..74ef48c3d 100644 --- a/peachjam/models/judgment.py +++ b/peachjam/models/judgment.py @@ -56,6 +56,21 @@ def __str__(self): return self.name +class Outcome(models.Model): + name = models.CharField( + _("name"), max_length=1024, null=False, blank=False, unique=True + ) + description = models.TextField(_("description"), blank=True) + + class Meta: + ordering = ["name"] + verbose_name = _("outcome") + verbose_name_plural = _("outcomes") + + def __str__(self): + return self.name + + class MatterType(models.Model): name = models.CharField( _("name"), max_length=1024, null=False, blank=False, unique=True @@ -246,8 +261,14 @@ class Judgment(CoreDocument): blank=True, related_name="judgments", ) + outcomes = models.ManyToManyField( + Outcome, + blank=True, + related_name="judgments", + ) case_summary = models.TextField(_("case summary"), null=True, blank=True) flynote = models.TextField(_("flynote"), null=True, blank=True) + order = models.TextField(_("order"), null=True, blank=True) case_name = models.CharField( _("case name"), max_length=4096, diff --git a/peachjam/resources.py b/peachjam/resources.py index e33924ad3..855fc7acd 100644 --- a/peachjam/resources.py +++ b/peachjam/resources.py @@ -48,7 +48,7 @@ Judgment, Locality, MatterType, - OrderOutcome, + Outcome, SourceFile, Taxonomy, citations_processor, @@ -490,10 +490,10 @@ class JudgmentResource(BaseDocumentResource): ) matter_type = fields.Field(column_name="matter_type", widget=CharWidget) - order_outcome = fields.Field( - column_name="order_outcome", - attribute="order_outcome", - widget=ForeignKeyWidget(OrderOutcome, field="name"), + outcome = fields.Field( + column_name="outcome", + attribute="outcome", + widget=ForeignKeyWidget(Outcome, field="name"), ) class Meta(BaseDocumentResource.Meta): diff --git a/peachjam/templates/peachjam/judgment_detail.html b/peachjam/templates/peachjam/judgment_detail.html index 85211f778..d5f13dee1 100644 --- a/peachjam/templates/peachjam/judgment_detail.html +++ b/peachjam/templates/peachjam/judgment_detail.html @@ -42,14 +42,14 @@ {{ document.registry.name }} {% endif %} - {% with document.order_outcomes.all as order_outcomes %} - {% if order_outcomes %} + {% with document.outcomes.all as outcomes %} + {% if outcomes %}
- {% trans 'Order' %} + {% trans 'Outcome' %}
- {% for order_outcome in order_outcomes %} - {{ order_outcome.name }} + {% for outcome in outcomes %} + {{ outcome.name }} {% if not forloop.last %},{% endif %} {% endfor %}
diff --git a/peachjam/translation.py b/peachjam/translation.py index 62487a5e1..bbcf8a309 100644 --- a/peachjam/translation.py +++ b/peachjam/translation.py @@ -8,6 +8,7 @@ DocumentNature, Label, OrderOutcome, + Outcome, Predicate, Taxonomy, ) @@ -48,6 +49,11 @@ class OrderOutcomeTranslationOptions(TranslationOptions): fields = ("name",) +@register(Outcome) +class OutcomeTranslationOptions(TranslationOptions): + fields = ("name",) + + @register(Predicate) class PredicateTranslationOptions(TranslationOptions): fields = ("verb", "reverse_verb") diff --git a/peachjam/views/courts.py b/peachjam/views/courts.py index 665528595..8e49e935b 100644 --- a/peachjam/views/courts.py +++ b/peachjam/views/courts.py @@ -62,22 +62,22 @@ def populate_facets(self, context): if attorney ) - order_outcomes = list( - order_outcome - for order_outcome in self.form.filter_queryset( - self.get_base_queryset(), exclude="order_outcomes" + outcomes = list( + outcome + for outcome in self.form.filter_queryset( + self.get_base_queryset(), exclude="outcomes" ) .order_by() - .values_list("order_outcomes__name", flat=True) + .values_list("outcomes__name", flat=True) .distinct() - if order_outcome + if outcome ) context["facet_data"] = { "judges": judges, "alphabet": lowercase_alphabet(), "attorneys": attorneys, - "order_outcomes": order_outcomes, + "outcomes": outcomes, } def populate_years(self, context): diff --git a/peachjam_search/documents.py b/peachjam_search/documents.py index d0aecede9..c48a76de1 100644 --- a/peachjam_search/documents.py +++ b/peachjam_search/documents.py @@ -18,7 +18,7 @@ ExternalDocument, Judge, Locality, - OrderOutcome, + Outcome, Taxonomy, ) from peachjam.xmlutils import parse_html_str @@ -82,11 +82,11 @@ class SearchableDocument(Document): registry_fr = fields.KeywordField() registry_pt = fields.KeywordField() - order_outcome = fields.KeywordField() - order_outcome_en = fields.KeywordField() - order_outcome_sw = fields.KeywordField() - order_outcome_fr = fields.KeywordField() - order_outcome_pt = fields.KeywordField() + outcome = fields.KeywordField() + outcome_en = fields.KeywordField() + outcome_sw = fields.KeywordField() + outcome_fr = fields.KeywordField() + outcome_pt = fields.KeywordField() # GenericDocument, LegalInstrument authors = fields.KeywordField() @@ -162,7 +162,7 @@ def get_subclasses(klass): Locality, Court, CourtRegistry, - OrderOutcome, + Outcome, Author, Judge, Attorney, @@ -184,9 +184,7 @@ def get_instances_from_related(self, related_instance): if any(isinstance(related_instance, cls) for cls in [Locality, DocumentNature]): return related_instance.coredocument_set.all() - if any( - isinstance(related_instance, cls) for cls in [CourtRegistry, OrderOutcome] - ): + if any(isinstance(related_instance, cls) for cls in [CourtRegistry, Outcome]): return related_instance.judgments.all() if any(isinstance(related_instance, cls) for cls in [Court, Judge, Attorney]): @@ -253,23 +251,21 @@ def prepare_nature(self, instance): if hasattr(instance, "nature") and instance.nature: return instance.nature.name - def prepare_order_outcome(self, instance): - if hasattr(instance, "order_outcomes") and instance.order_outcomes: - return [ - order_outcome.name for order_outcome in instance.order_outcomes.all() - ] + def prepare_outcome(self, instance): + if hasattr(instance, "outcomes") and instance.outcomes: + return [outcome.name for outcome in instance.outcomes.all()] - def prepare_order_outcome_en(self, instance): - return get_translated_m2m_name(instance, "order_outcomes", "en") + def prepare_outcome_en(self, instance): + return get_translated_m2m_name(instance, "outcomes", "en") - def prepare_order_outcome_fr(self, instance): - return get_translated_m2m_name(instance, "order_outcomes", "fr") + def prepare_outcome_fr(self, instance): + return get_translated_m2m_name(instance, "outcomes", "fr") - def prepare_order_outcome_pt(self, instance): - return get_translated_m2m_name(instance, "order_outcomes", "pt") + def prepare_outcome_pt(self, instance): + return get_translated_m2m_name(instance, "outcomes", "pt") - def prepare_order_outcome_sw(self, instance): - return get_translated_m2m_name(instance, "order_outcomes", "sw") + def prepare_outcome_sw(self, instance): + return get_translated_m2m_name(instance, "outcomes", "sw") def prepare_pages(self, instance): """Text content of pages extracted from PDF.""" diff --git a/peachjam_search/serializers.py b/peachjam_search/serializers.py index d38c249b3..65b00ce26 100644 --- a/peachjam_search/serializers.py +++ b/peachjam_search/serializers.py @@ -17,7 +17,7 @@ class SearchableDocumentSerializer(DocumentSerializer): provisions = SerializerMethodField() court = SerializerMethodField() nature = SerializerMethodField() - order_outcome = SerializerMethodField() + outcome = SerializerMethodField() registry = SerializerMethodField() labels = CharField(allow_null=True) _score = FloatField(source="meta.score") @@ -104,8 +104,8 @@ def get_court(self, obj): def get_nature(self, obj): return obj["nature" + self.language_suffix] - def get_order_outcome(self, obj): - val = obj["order_outcome" + self.language_suffix] + def get_outcome(self, obj): + val = obj["outcome" + self.language_suffix] if val is not None: val = list(val) return val