Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/review/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1251,3 +1251,44 @@ def test_notify_reviewer_missing_url_does_not_redirect(self):
SERVER_NAME=self.journal_one.domain,
)
self.assertEqual(response.status_code, 200)


class InReviewActionsTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.press = helpers.create_press()
cls.journal_one, cls.journal_two = helpers.create_journals()
cls.editor = helpers.create_editor(cls.journal_one)
cls.article = helpers.create_article(cls.journal_one)
review_models.ReviewRound.objects.create(
article=cls.article,
round_number=1,
)

def test_rolled_back_article_offers_decision_actions(self):
# Acceptance leaves a historical ArticleStageLog entry that
# keeps is_accepted() True even after rollback.
self.article.stage = submission_models.STAGE_ACCEPTED
self.article.date_accepted = timezone.now()
self.article.save()
self.article.stage = submission_models.STAGE_UNDER_REVIEW
self.article.date_accepted = None
self.article.date_declined = None
self.article.save()
self.assertTrue(self.article.is_accepted())

self.client.force_login(self.editor)
response = self.client.get(
reverse(
"review_in_review",
kwargs={"article_id": self.article.pk},
),
SERVER_NAME=self.journal_one.domain,
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "New Review Round")
self.assertContains(
response,
reverse("decision_helper", kwargs={"article_id": self.article.pk}),
)
self.assertNotContains(response, "Move to Next Stage")
49 changes: 49 additions & 0 deletions src/submission/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@

from django.db import IntegrityError
from django.test import TestCase
from django.utils import timezone

from core import models as core_models
from core import workflow as core_workflow
from submission import models
from utils.testing import helpers
from workflow import logic as workflow_logic


class FrozenAuthorModelTests(TestCase):
Expand Down Expand Up @@ -54,3 +58,48 @@ def test_article_authors_and_credits_for_frozen_author(self):
roles for _, roles in self.article_one.authors_and_credits().items()
]
self.assertEqual(expected_roles[0].first(), role)


class WorkflowRollbackTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.press = helpers.create_press()
cls.journal_one, cls.journal_two = helpers.create_journals()
core_workflow.create_default_workflow(cls.journal_one)
cls.review_element = core_models.WorkflowElement.objects.get(
journal=cls.journal_one,
element_name="review",
)
cls.copyediting_element = core_models.WorkflowElement.objects.get(
journal=cls.journal_one,
element_name="copyediting",
)

def test_rollback_to_review_clears_decision_dates(self):
article = helpers.create_article(self.journal_one)
article.stage = models.STAGE_UNDER_REVIEW
article.save()
core_models.WorkflowLog.objects.create(
article=article,
element=self.review_element,
)
article.stage = models.STAGE_ACCEPTED
article.date_accepted = timezone.now()
article.save()
article.stage = models.STAGE_EDITOR_COPYEDITING
article.save()
core_models.WorkflowLog.objects.create(
article=article,
element=self.copyediting_element,
)

workflow_logic.move_to_stage(
article.stage,
models.STAGE_UNASSIGNED,
article,
)

article.refresh_from_db()
self.assertEqual(article.stage, models.STAGE_UNDER_REVIEW)
self.assertIsNone(article.date_accepted)
self.assertIsNone(article.date_declined)
18 changes: 8 additions & 10 deletions src/templates/admin/review/in_review.html
Original file line number Diff line number Diff line change
Expand Up @@ -280,15 +280,13 @@ <h2>Actions</h2>
<a href="{% url 'document_management' article.pk %}?return={{ request.path }}"><i
class="fa fa-file-archive-o">&nbsp;</i>Document
Management</a></li>
{% if article.is_accepted %}
{% if article.in_review_stages %}
<li>
<a href="{% url 'move_to_next_workflow_element' article.pk %}">
<i class="fa fa-arrow-circle-right action-icon">&nbsp;</i>
{% trans 'Move to Next Stage' %}
</a>
</li>
{% endif %}
{% if article.stage == 'Accepted' %}
<li>
<a href="{% url 'move_to_next_workflow_element' article.pk %}">
<i class="fa fa-arrow-circle-right action-icon">&nbsp;</i>
{% trans 'Move to Next Stage' %}
</a>
</li>
{% else %}
<li>
<a href="{% url 'decision_helper' article.pk %}">
Expand Down Expand Up @@ -326,7 +324,7 @@ <h2>Actions</h2>
{% block js %}
<script src="{% static "admin/js/modal.js" %}"></script>
{% include "elements/notes/note_script.html" %}
{% if article.is_accepted and article.in_review_stages %}
{% if article.stage == 'Accepted' %}
{% include "admin/elements/open_modal.html" with target='move_to_next_modal' %}
{% endif %}
{% endblock js %}
5 changes: 5 additions & 0 deletions src/workflow/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ def move_to_stage(from_stage, to_stage, article):
elif stage == submissions_models.STAGE_EDITOR_COPYEDITING:
article.stage = submissions_models.STAGE_EDITOR_COPYEDITING

elif stage == submissions_models.STAGE_UNDER_REVIEW:
article.stage = submissions_models.STAGE_UNDER_REVIEW
article.date_accepted = None
article.date_declined = None

elif stage == submissions_models.STAGE_UNASSIGNED:
article.stage = submissions_models.STAGE_UNDER_REVIEW
article.date_accepted = None
Expand Down
Loading