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