From d127c72995eee0905ebd1e2cbc80064e1fb0b899 Mon Sep 17 00:00:00 2001 From: nickmwangemi Date: Tue, 25 Jul 2023 19:00:41 +0300 Subject: [PATCH] Add labels for documents --- peachjam/admin.py | 7 ++++ peachjam/migrations/0093_add_model_labels.py | 42 +++++++++++++++++++ peachjam/models/core_document_model.py | 33 ++++++++++++--- peachjam/models/generic_document.py | 23 ++++++++++ peachjam/signals.py | 18 ++++++++ peachjam/templates/peachjam/_labels.html | 8 ++++ .../peachjam/layouts/document_detail.html | 1 + peachjam/views/generic_views.py | 1 + 8 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 peachjam/migrations/0093_add_model_labels.py create mode 100644 peachjam/templates/peachjam/_labels.html diff --git a/peachjam/admin.py b/peachjam/admin.py index 0a79f1999..da2cd8db5 100644 --- a/peachjam/admin.py +++ b/peachjam/admin.py @@ -55,6 +55,7 @@ Journal, Judge, Judgment, + Label, LegalInstrument, Legislation, Locality, @@ -854,6 +855,12 @@ class UserAdminCustom(ImportExportMixin, UserAdmin): resource_class = UserResource +@admin.register(Label) +class LabelAdmin(admin.ModelAdmin): + list_display = ("name", "code") + prepopulated_fields = {"code": ("name",)} + + admin.site.register( [ Locality, diff --git a/peachjam/migrations/0093_add_model_labels.py b/peachjam/migrations/0093_add_model_labels.py new file mode 100644 index 000000000..e1b5ced22 --- /dev/null +++ b/peachjam/migrations/0093_add_model_labels.py @@ -0,0 +1,42 @@ +# Generated by Django 3.2.19 on 2023-07-25 14:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("peachjam", "0092_documentcontent_content_xml"), + ] + + operations = [ + migrations.CreateModel( + name="Label", + 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"), + ), + ( + "code", + models.SlugField(max_length=1024, unique=True, verbose_name="code"), + ), + ], + ), + migrations.AddField( + model_name="coredocument", + name="labels", + field=models.ManyToManyField( + blank=True, to="peachjam.Label", verbose_name="labels" + ), + ), + ] diff --git a/peachjam/models/core_document_model.py b/peachjam/models/core_document_model.py index 50745db20..2a41f3620 100644 --- a/peachjam/models/core_document_model.py +++ b/peachjam/models/core_document_model.py @@ -39,14 +39,19 @@ class Label(models.Model): - name = models.CharField(_("name"), max_length=255, unique=True) - code = models.SlugField(_("code"), max_length=255, unique=True) + name = models.CharField( + _("name"), max_length=1024, unique=True, null=False, blank=False + ) + code = models.SlugField(_("code"), max_length=1024, unique=True) def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify(self.title) + if not self.code: + self.code = slugify(self.name) return super().save(*args, **kwargs) + def __str__(self): + return f"{self.name}" + class DocumentNature(models.Model): name = models.CharField( @@ -407,7 +412,7 @@ class CoreDocument(PolymorphicModel): # options for the FRBR URI doctypes frbr_uri_doctypes = FRBR_URI_DOCTYPES - labels = models.ManyToManyField(Label, verbose_name=_("labels")) + labels = models.ManyToManyField(Label, verbose_name=_("labels"), blank=True) class Meta: ordering = ["doc_type", "title"] @@ -419,6 +424,21 @@ class Meta: def __str__(self): return f"{self.doc_type} - {self.title}" + def apply_labels(self): + """Apply labels to this document based on its properties.""" + # label showing that a document is cited/reported in law reports, hence "more important" + label, _ = Label.objects.get_or_create( + code="reported", + defaults={"name": "Reported", "code": "reported"}, + ) + + # if the document has alternative_names, apply the "reported" label + if self.alternative_names.exists(): + self.labels.add(label.pk) + # if the document no alternative_names, remove the "reported" label + else: + self.labels.remove(label.pk) + def get_all_fields(self): return self._meta.get_fields() @@ -516,6 +536,9 @@ def pre_save(self): self.work.title = self.title self.work.save() + # apply labels + self.apply_labels() + def save(self, *args, **kwargs): # give ourselves and subclasses a chance to pre-populate derived fields before saving, in case full_clean() has # not yet been called diff --git a/peachjam/models/generic_document.py b/peachjam/models/generic_document.py index c598200ca..136a36f7e 100644 --- a/peachjam/models/generic_document.py +++ b/peachjam/models/generic_document.py @@ -6,6 +6,7 @@ CoreDocument, CoreDocumentManager, CoreDocumentQuerySet, + Label, Work, ) from peachjam.models.author import Author @@ -85,6 +86,28 @@ class Meta(CoreDocument.Meta): def __str__(self): return self.title + def apply_labels(self): + # label to indicate that this legislation is repealed + label, _ = Label.objects.get_or_create( + code="repealed", defaults={"name": "Repealed", "code": "repealed"} + ) + # apply label if repealed + if self.metadata_json.get("repeal"): + self.repealed = True + self.labels.add(label.pk) + + # remove label if not repealed + else: + self.repealed = False + self.labels.remove(label.pk) + self.save() + + super().apply_labels() + def pre_save(self): self.doc_type = "legislation" return super().pre_save() + + def save(self, *args, **kwargs): + self.apply_labels() + super().save(*args, **kwargs) diff --git a/peachjam/signals.py b/peachjam/signals.py index 49e9e6239..5566b5e00 100644 --- a/peachjam/signals.py +++ b/peachjam/signals.py @@ -75,3 +75,21 @@ def doc_deleted_update_extracted_citations(sender, instance, **kwargs): """Update language list on related work after a subclass of CoreDocument is deleted.""" if isinstance(instance, CoreDocument): update_extracted_citations_for_a_work(instance.work_id) + + +@receiver(signals.post_save) +def doc_saved_apply_labels(sender, instance, **kwargs): + """Apply labels when an instance of a CoreDocument is saved.""" + if ( + isinstance(instance, CoreDocument) + and instance.doc_type == "legislation" + and not kwargs["raw"] + ): + instance.apply_labels() + + if ( + isinstance(instance, CoreDocument) + and not kwargs["raw"] + and instance.alternative_names.all() + ): + instance.apply_labels() diff --git a/peachjam/templates/peachjam/_labels.html b/peachjam/templates/peachjam/_labels.html new file mode 100644 index 000000000..fc0c7e183 --- /dev/null +++ b/peachjam/templates/peachjam/_labels.html @@ -0,0 +1,8 @@ +
+ {% if labels %} + {% for label in labels %} + {% if label.code == "repealed" %}{{ label.name }}{% endif %} + {% if label.code == "reported" %}{{ label.name }}{% endif %} + {% endfor %} + {% endif %} +
diff --git a/peachjam/templates/peachjam/layouts/document_detail.html b/peachjam/templates/peachjam/layouts/document_detail.html index fd161e1cc..426649b76 100644 --- a/peachjam/templates/peachjam/layouts/document_detail.html +++ b/peachjam/templates/peachjam/layouts/document_detail.html @@ -31,6 +31,7 @@ {% block document-title %}

{{ document.title }}

+ {% include 'peachjam/_labels.html' %}