From 245ccc0ccd283f0328963becfcc9e73bf9117893 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Thu, 24 Sep 2020 20:45:36 +0200
Subject: [PATCH] Work on paths for journals

---
 SciPost_v1/urls.py                            | 18 ++++++----
 journals/converters.py                        | 12 +++++--
 .../migrations/0095_auto_20200924_2044.py     | 34 +++++++++++++++++++
 journals/regexes.py                           |  2 +-
 scipost/urls.py                               | 29 +++++++++++-----
 submissions/urls.py                           |  2 --
 6 files changed, 75 insertions(+), 22 deletions(-)
 create mode 100644 journals/migrations/0095_auto_20200924_2044.py

diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py
index b5e29d1a3..e687ec367 100644
--- a/SciPost_v1/urls.py
+++ b/SciPost_v1/urls.py
@@ -7,16 +7,15 @@ from django.contrib.auth.decorators import login_required
 from django.conf.urls import include, url
 from django.conf.urls.static import static
 from django.contrib import admin
-from django.urls import path
+from django.urls import path, register_converter
 
 # from rest_framework import routers
 
-from journals.regexes import JOURNAL_DOI_LABEL_REGEX
+from journals.converters import JournalDOILabelConverter
 from scipost import views as scipost_views
 from organizations.views import OrganizationListView
 
-# Journal URL Regex
-JOURNAL_REGEX = '(?P<doi_label>%s)' % JOURNAL_DOI_LABEL_REGEX
+register_converter(JournalDOILabelConverter, 'journal_doi_label')
 
 
 # Disable admin login view which is essentially a 2FA workaround.
@@ -30,9 +29,14 @@ urlpatterns = [
     url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
     url(r'^admin/', admin.site.urls),
     url(r'^api/', include('api.urls', namespace='api')),
-    url(r'^10.21468/%s/' % JOURNAL_REGEX,
-        include('journals.urls.journal', namespace="prefixed_journal")),
-    url(r'^%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")),
+    path(
+        '10.21468/<journal_doi_label:doi_label>/',
+        include('journals.urls.journal', namespace="prefixed_journal")
+    ),
+    path(
+        '<journal_doi_label:doi_label>/',
+        include('journals.urls.journal', namespace="journal")
+    ),
     url(r'^', include('scipost.urls', namespace="scipost")),
     url(r'^careers/', include('careers.urls', namespace="careers")),
     url(r'^colleges/', include('colleges.urls', namespace="colleges")),
diff --git a/journals/converters.py b/journals/converters.py
index 1d6f27296..3de1377f2 100644
--- a/journals/converters.py
+++ b/journals/converters.py
@@ -2,12 +2,18 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from .regexes import JOURNAL_DOI_LABEL_REGEX
+from django.urls.converters import StringConverter
 
-class JournalDOILabelConverter:
-    regex = JOURNAL_DOI_LABEL_REGEX
+from journals.models import Journal
+
+
+class JournalDOILabelConverter(StringConverter):
 
     def to_python(self, value):
+        try:
+            return Journal.objects.get(doi_label=value).doi_label
+        except Journal.DoesNotExist:
+            return ValueError
         return value
 
     def to_url(self, value):
diff --git a/journals/migrations/0095_auto_20200924_2044.py b/journals/migrations/0095_auto_20200924_2044.py
new file mode 100644
index 000000000..2bf1990ca
--- /dev/null
+++ b/journals/migrations/0095_auto_20200924_2044.py
@@ -0,0 +1,34 @@
+# Generated by Django 2.2.16 on 2020-09-24 18:44
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0094_auto_20200906_1355'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='issue',
+            name='doi_label',
+            field=models.CharField(db_index=True, max_length=200, unique=True, validators=[django.core.validators.RegexValidator('^([a-zA-Z]+)\\.\\w+(\\.[0-9]+)?$', 'Only expressions with regex ([a-zA-Z]+)\\.\\w+(\\.[0-9]+)? are allowed.')]),
+        ),
+        migrations.AlterField(
+            model_name='journal',
+            name='doi_label',
+            field=models.CharField(db_index=True, max_length=200, unique=True, validators=[django.core.validators.RegexValidator('^[a-zA-Z]+$', 'Only expressions with regex [a-zA-Z]+ are allowed.')]),
+        ),
+        migrations.AlterField(
+            model_name='publication',
+            name='doi_label',
+            field=models.CharField(db_index=True, max_length=200, unique=True, validators=[django.core.validators.RegexValidator('^([a-zA-Z]+)(\\.\\w+(\\.[0-9]+(\\.[0-9]{3,})?)?)?$', 'Only expressions with regex ([a-zA-Z]+)(\\.\\w+(\\.[0-9]+(\\.[0-9]{3,})?)?)? are allowed.')]),
+        ),
+        migrations.AlterField(
+            model_name='volume',
+            name='doi_label',
+            field=models.CharField(db_index=True, max_length=200, unique=True, validators=[django.core.validators.RegexValidator('^([a-zA-Z]+\\.\\w)$', 'Only expressions with regex ([a-zA-Z]+\\.\\w) are allowed.')]),
+        ),
+    ]
diff --git a/journals/regexes.py b/journals/regexes.py
index 22f9b8161..683c1ae33 100644
--- a/journals/regexes.py
+++ b/journals/regexes.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-JOURNAL_DOI_LABEL_REGEX = r'SciPost[a-zA-Z]+'
+JOURNAL_DOI_LABEL_REGEX = r'[a-zA-Z]+'
 
 VOLUME_DOI_LABEL_REGEX = r'({}\.\w)'.format(JOURNAL_DOI_LABEL_REGEX)
 
diff --git a/scipost/urls.py b/scipost/urls.py
index 3240a2222..40f54c1fa 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -5,7 +5,7 @@ __license__ = "AGPL v3"
 from django.conf.urls import url
 from django.contrib.auth.decorators import permission_required
 from django.views.generic import TemplateView
-from django.urls import include, path
+from django.urls import include, path, register_converter
 
 from . import views
 from .feeds import LatestNewsFeedRSS, LatestNewsFeedAtom, LatestCommentsFeedRSS,\
@@ -13,11 +13,12 @@ from .feeds import LatestNewsFeedRSS, LatestNewsFeedAtom, LatestCommentsFeedRSS,
                    LatestPublicationsFeedRSS, LatestPublicationsFeedAtom
 
 from journals import views as journals_views
-from journals.regexes import JOURNAL_DOI_LABEL_REGEX, ISSUE_DOI_LABEL_REGEX,\
+from journals.converters import JournalDOILabelConverter
+from journals.regexes import ISSUE_DOI_LABEL_REGEX,\
     PUBLICATION_DOI_LABEL_REGEX, DOI_DISPATCH_PATTERN
 from submissions import views as submission_views
 
-JOURNAL_PATTERN = '(?P<doi_label>%s)' % JOURNAL_DOI_LABEL_REGEX
+register_converter(JournalDOILabelConverter, 'journal_doi_label')
 
 app_name = 'scipost'
 
@@ -285,12 +286,22 @@ urlpatterns = [
         journals_views.issue_detail, name='issue_detail'),
 
     # Journal landing page
-    url(r'^10.21468/%s$' % JOURNAL_PATTERN,
-        journals_views.landing_page, name='landing_page'),
-    url(r'^%s$' % JOURNAL_PATTERN,
-        journals_views.landing_page, name='landing_page'),
-    url(r'^arxiv_doi_feed/%s' % JOURNAL_PATTERN,
-        journals_views.arxiv_doi_feed, name='arxiv_doi_feed'),
+    path(
+        '10.21468/<journal_doi_label:doi_label>',
+        journals_views.landing_page,
+        name='landing_page'
+    ),
+    path(
+        '<journal_doi_label:doi_label>',
+        journals_views.landing_page,
+        name='landing_page'
+    ),
+
+    path(
+        'arxiv_doi_feed/<journal_doi_label:doi_label>',
+        journals_views.arxiv_doi_feed,
+        name='arxiv_doi_feed'
+    ),
 
     ################
     # Howto guides #
diff --git a/submissions/urls.py b/submissions/urls.py
index 5db65d7ed..a9a008f60 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -6,10 +6,8 @@ from django.conf.urls import url
 from django.urls import path, register_converter
 from django.views.generic import TemplateView
 
-from scipost.constants import DISCIPLINES_REGEX
 from scipost.converters import DisciplineConverter
 from journals.converters import JournalDOILabelConverter
-from journals.regexes import JOURNAL_DOI_LABEL_REGEX
 
 from . import views
 from .constants import SUBMISSIONS_WO_VN_REGEX, SUBMISSIONS_COMPLETE_REGEX
-- 
GitLab