diff --git a/src/security/decorators.py b/src/security/decorators.py index d2a6b1c37b..1dd8189d75 100755 --- a/src/security/decorators.py +++ b/src/security/decorators.py @@ -1502,13 +1502,36 @@ def article_is_not_submitted(func): def _article_is_not_submitted(request, *args, **kwargs): article_id = kwargs.get("article_id") try: - article = models.Article.objects.get( + models.Article.objects.get( pk=article_id, journal=request.journal, date_submitted__isnull=True, ) return func(request, *args, **kwargs) except models.Article.DoesNotExist: + submitted_article = models.Article.objects.filter( + pk=article_id, + journal=request.journal, + ).first() + + if submitted_article and ( + request.user.is_staff + or ( + getattr(request.user, "pk", None) + and request.user.pk == submitted_article.owner_id + ) + ): + messages.info( + request, + "This article has already been submitted. Showing its status instead.", + ) + return redirect( + reverse( + "core_dashboard_article", + kwargs={"article_id": submitted_article.pk}, + ) + ) + raise Http404("This article has already been submitted.") return _article_is_not_submitted diff --git a/src/security/test_security.py b/src/security/test_security.py index 8c269a9973..dd76d084da 100644 --- a/src/security/test_security.py +++ b/src/security/test_security.py @@ -4301,6 +4301,28 @@ def test_article_is_not_submitted_complete(self): with self.assertRaises(Http404): decorated_func(request, **kwargs) + def test_article_is_not_submitted_complete_redirects_author(self): + func = Mock() + decorated_func = decorators.article_is_not_submitted(func) + kwargs = {"article_id": self.article_unassigned.pk} + + request = self.prepare_request_with_user( + self.regular_user, + journal=self.journal_one, + ) + + response = decorated_func(request, **kwargs) + + self.assertEqual(response.status_code, 302) + self.assertEqual( + response.url, + reverse( + "core_dashboard_article", + kwargs={"article_id": self.article_unassigned.pk}, + ), + ) + self.assertFalse(func.called) + def test_article_is_not_submitted_unsubmitted(self): func = Mock() decorated_func = decorators.article_is_not_submitted(func) diff --git a/src/templates/admin/core/article.html b/src/templates/admin/core/article.html index c7ed5e3540..4c9bf54637 100644 --- a/src/templates/admin/core/article.html +++ b/src/templates/admin/core/article.html @@ -1,5 +1,5 @@ {% extends "admin/core/base.html" %} -{% load hooks %} +{% load hooks i18n %} {% block title %}Article {{ article.pk }} Information{% endblock %} {% block breadcrumbs %} @@ -18,6 +18,34 @@

{{ article.safe_title }}

{% hook 'edit_article' %} {% endif %}
+ + + + + + + + + + + + + + + + + + + + + +
{% trans "Current Stage" %}{{ article.get_stage_display }}
{% trans "Submitted" %}{{ article.date_submitted|default:_("Not yet submitted") }}
{% trans "Section" %}{{ article.section.name|default:_("Not set") }}
{% trans "Correspondence Author" %} + {% if article.correspondence_author %} + {{ article.correspondence_author.full_name|default:article.correspondence_author.email }} + {% else %} + {% trans "Not set" %} + {% endif %} +
{% trans "Abstract" %}{{ article.abstract|safe|default:_("No abstract provided") }}