From 9bef0148c7a614f4ca073d6a32a0431d82835453 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Tue, 29 Sep 2020 10:16:35 +0200
Subject: [PATCH] Add acad_fields to PreprintServer; remove disciplines

---
 submissions/admin.py                          |  7 +++++-
 .../0098_preprintserver_acad_fields.py        | 19 +++++++++++++++
 ...99_populate_preprint_server_acad_fields.py | 23 +++++++++++++++++++
 .../0100_remove_preprintserver_disciplines.py | 17 ++++++++++++++
 submissions/models/preprint_server.py         |  9 ++++----
 submissions/views.py                          |  2 +-
 6 files changed, 70 insertions(+), 7 deletions(-)
 create mode 100644 submissions/migrations/0098_preprintserver_acad_fields.py
 create mode 100644 submissions/migrations/0099_populate_preprint_server_acad_fields.py
 create mode 100644 submissions/migrations/0100_remove_preprintserver_disciplines.py

diff --git a/submissions/admin.py b/submissions/admin.py
index 46f422730..78dcb301f 100644
--- a/submissions/admin.py
+++ b/submissions/admin.py
@@ -20,7 +20,12 @@ def submission_short_title(obj):
     return obj.submission.title[:30]
 
 
-admin.site.register(PreprintServer)
+class PreprintServerAdmin(admin.ModelAdmin):
+    autocomplete_fields = [
+        'acad_fields'
+    ]
+
+admin.site.register(PreprintServer, PreprintServerAdmin)
 
 
 class iThenticateReportAdmin(admin.ModelAdmin):
diff --git a/submissions/migrations/0098_preprintserver_acad_fields.py b/submissions/migrations/0098_preprintserver_acad_fields.py
new file mode 100644
index 000000000..69e555b66
--- /dev/null
+++ b/submissions/migrations/0098_preprintserver_acad_fields.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.2.16 on 2020-09-29 07:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('ontology', '0007_Branch_Field_Specialty'),
+        ('submissions', '0097_remove_submission_secondary_areas'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='preprintserver',
+            name='acad_fields',
+            field=models.ManyToManyField(blank=True, related_name='preprint_servers', to='ontology.AcademicField'),
+        ),
+    ]
diff --git a/submissions/migrations/0099_populate_preprint_server_acad_fields.py b/submissions/migrations/0099_populate_preprint_server_acad_fields.py
new file mode 100644
index 000000000..cae3386f4
--- /dev/null
+++ b/submissions/migrations/0099_populate_preprint_server_acad_fields.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.16 on 2020-09-29 07:57
+
+from django.db import migrations
+
+
+def populate_acad_fields(apps, schema_editor):
+    PreprintServer = apps.get_model('submissions.PreprintServer')
+    AcademicField = apps.get_model('ontology', 'AcademicField')
+
+    for ps in PreprintServer.objects.all():
+        ps.acad_fields.set(AcademicField.objects.filter(slug__in=ps.disciplines))
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0098_preprintserver_acad_fields'),
+    ]
+
+    operations = [
+        migrations.RunPython(populate_acad_fields,
+                             reverse_code=migrations.RunPython.noop),
+    ]
diff --git a/submissions/migrations/0100_remove_preprintserver_disciplines.py b/submissions/migrations/0100_remove_preprintserver_disciplines.py
new file mode 100644
index 000000000..9979edddd
--- /dev/null
+++ b/submissions/migrations/0100_remove_preprintserver_disciplines.py
@@ -0,0 +1,17 @@
+# Generated by Django 2.2.16 on 2020-09-29 08:16
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0099_populate_preprint_server_acad_fields'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='preprintserver',
+            name='disciplines',
+        ),
+    ]
diff --git a/submissions/models/preprint_server.py b/submissions/models/preprint_server.py
index 801d363d5..1bc91b548 100644
--- a/submissions/models/preprint_server.py
+++ b/submissions/models/preprint_server.py
@@ -4,9 +4,6 @@ __license__ = "AGPL v3"
 
 from django.db import models
 
-from scipost.constants import SCIPOST_DISCIPLINES
-from scipost.fields import ChoiceArrayField
-
 
 class PreprintServer(models.Model):
     """
@@ -14,8 +11,10 @@ class PreprintServer(models.Model):
     """
     name = models.CharField(max_length=256)
     url = models.URLField()
-    disciplines = ChoiceArrayField(
-        models.CharField(max_length=32, choices=SCIPOST_DISCIPLINES)
+    acad_fields = models.ManyToManyField(
+        'ontology.AcademicField',
+        blank=True,
+        related_name='preprint_servers'
     )
 
     class Meta:
diff --git a/submissions/views.py b/submissions/views.py
index d8a7966d0..f7743345d 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -159,7 +159,7 @@ def submit_choose_preprint_server(request, journal_doi_label):
     Choose a preprint server. If `thread_hash` is given as a GET parameter, this is a resubmission.
     """
     journal = get_object_or_404(Journal, doi_label=journal_doi_label)
-    preprint_servers = PreprintServer.objects.filter(disciplines__contains=[journal.discipline])
+    preprint_servers = PreprintServer.objects.filter(acad_fields=journal.college.acad_field)
     thread_hash = request.GET.get('thread_hash') or None
     # Each integrated preprint server has a prefill form:
     scipost_prefill_form = SciPostPrefillForm(
-- 
GitLab