From 185000c87f53797a565300180cda99159a47f081 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org>
Date: Sun, 20 Feb 2022 21:38:47 +0100
Subject: [PATCH] Make Publication citation a computed field

---
 .../0115_publication_cf_citation.py           | 18 ++++++++++++++++
 scipost_django/journals/models/publication.py | 21 +++++++++++++------
 2 files changed, 33 insertions(+), 6 deletions(-)
 create mode 100644 scipost_django/journals/migrations/0115_publication_cf_citation.py

diff --git a/scipost_django/journals/migrations/0115_publication_cf_citation.py b/scipost_django/journals/migrations/0115_publication_cf_citation.py
new file mode 100644
index 000000000..5e7a60ab1
--- /dev/null
+++ b/scipost_django/journals/migrations/0115_publication_cf_citation.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2022-02-20 20:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0114_journal_required_article_elements'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='publication',
+            name='cf_citation',
+            field=models.CharField(blank=True, max_length=1024),
+        ),
+    ]
diff --git a/scipost_django/journals/models/publication.py b/scipost_django/journals/models/publication.py
index 3a17a2891..af0fb381d 100644
--- a/scipost_django/journals/models/publication.py
+++ b/scipost_django/journals/models/publication.py
@@ -167,6 +167,7 @@ class Publication(models.Model):
     )  # Needs `auto_now` as its not explicity updated anywhere?
 
     # Calculated fields
+    cf_citation = models.CharField(max_length=1024, blank=True)
     cf_author_affiliation_indices_list = ArrayField(
         ArrayField(
             models.PositiveSmallIntegerField(blank=True, null=True), default=list
@@ -361,30 +362,38 @@ class Publication(models.Model):
 
     @property
     def citation(self):
+        if self.cf_citation:
+            return self.cf_citation
+        citation = ""
         """Return Publication name in the preferred citation format."""
         if self.in_issue and self.in_issue.in_volume:
-            return "{journal} {volume}, {paper_nr} ({year})".format(
+            citation = "{journal} {volume}, {paper_nr} ({year})".format(
                 journal=self.in_issue.in_volume.in_journal.name_abbrev,
                 volume=self.in_issue.in_volume.number,
                 paper_nr=self.get_paper_nr(),
                 year=self.publication_date.strftime("%Y"),
             )
         elif self.in_issue and self.in_issue.in_journal:
-            return "{journal} {issue}, {paper_nr} ({year})".format(
+            citation = "{journal} {issue}, {paper_nr} ({year})".format(
                 journal=self.in_issue.in_journal.name_abbrev,
                 issue=self.in_issue.number,
                 paper_nr=self.get_paper_nr(),
                 year=self.publication_date.strftime("%Y"),
             )
         elif self.in_journal:
-            return "{journal} {paper_nr} ({year})".format(
+            citation = "{journal} {paper_nr} ({year})".format(
                 journal=self.in_journal.name_abbrev,
                 paper_nr=self.paper_nr,
                 year=self.publication_date.strftime("%Y"),
             )
-        return "{paper_nr} ({year})".format(
-            paper_nr=self.paper_nr, year=self.publication_date.strftime("%Y")
-        )
+        else:
+            citation = "{paper_nr} ({year})".format(
+                paper_nr=self.paper_nr, year=self.publication_date.strftime("%Y")
+            )
+        self.cf_citation = citation
+        self.save()
+        return citation
+
 
     def get_cc_license_URI(self):
         for (key, val) in CC_LICENSES_URI:
-- 
GitLab