diff --git a/src/review/forms.py b/src/review/forms.py index 9c838406d1..7026833426 100755 --- a/src/review/forms.py +++ b/src/review/forms.py @@ -13,8 +13,7 @@ from tinymce.widgets import TinyMCE from review import models, logic -from core import models as core_models, forms as core_forms -from core.widgets import JanewayFileInput +from core import models as core_models, forms as core_forms, files from utils import setting_handler from utils.forms import FakeModelForm, HTMLDateInput, HTMLSwitchInput @@ -483,3 +482,25 @@ def __init__(self, *args, **kwargs): label=f"Email for {review.reviewer.full_name()}", initial=review.email_content, ) + + +class EditorReviewFileUpload(forms.Form): + review_file = forms.FileField( + label=_("Review file"), + ) + + def __init__(self, *args, **kwargs): + self.article = kwargs.pop("article", None) + self.review = kwargs.pop("review", None) + super().__init__(*args, **kwargs) + + def save(self, commit=True): + review_file = files.save_file_to_article( + self.cleaned_data.get("review_file"), + self.article, + self.review.reviewer, + ) + self.review.review_file = review_file + + if commit: + self.review.save() \ No newline at end of file diff --git a/src/review/urls.py b/src/review/urls.py index 41027b4e06..10df2b8a34 100755 --- a/src/review/urls.py +++ b/src/review/urls.py @@ -96,6 +96,11 @@ views.view_review, name="review_view_review", ), + re_path( + r"^article/(?P\d+)/review/(?P\d+)/upload-file/$", + views.editor_upload_review_file, + name="review_editor_upload_review_file", + ), re_path( r"^article/(?P\d+)/review/(?P\d+)/answer/(?P\d+)/$", views.edit_review_answer, diff --git a/src/review/views.py b/src/review/views.py index 18e91eaa2d..86be895433 100755 --- a/src/review/views.py +++ b/src/review/views.py @@ -1452,6 +1452,10 @@ def view_review(request, article_id, review_id): "review": review, "visibility_form": visibility_form, "answer_visibility_form": answer_visibility_form, + "editor_review_file_form": forms.EditorReviewFileUpload( + review=review, + article=article, + ) } return render(request, template, context) @@ -3341,3 +3345,55 @@ def reviewer_shared_review_download(request, article_id, review_id): ) raise Http404("You do not have permission to download this file.") + + +@require_POST +@editor_user_required +def editor_upload_review_file(request, article_id, review_id): + """ + Handles upload of a brand new review file by an editor. + """ + article = get_object_or_404( + submission_models.Article, + pk=article_id, + journal=request.journal, + ) + review_assignment = get_object_or_404( + models.ReviewAssignment, + pk=review_id, + article=article, + ) + form = forms.EditorReviewFileUpload( + request.POST, + request.FILES, + article=article, + review=review_assignment, + ) + if form.is_valid(): + form.save() + messages.add_message( + request, + messages.SUCCESS, + "Review file uploaded successfully.", + ) + else: + if form.errors: + for field, errors in form.errors.items(): + field_label = ( + form.fields.get(field).label if field in form.fields else field + ) + for error in errors: + messages.error( + request, + f"{field_label}: {error}", + ) + + return redirect( + reverse( + 'review_view_review', + kwargs={ + 'article_id': article.pk, + 'review_id': review_assignment.pk, + } + ) + ) diff --git a/src/templates/admin/elements/review/editor_upload_review_file.html b/src/templates/admin/elements/review/editor_upload_review_file.html new file mode 100644 index 0000000000..f86dbe33d0 --- /dev/null +++ b/src/templates/admin/elements/review/editor_upload_review_file.html @@ -0,0 +1,16 @@ +{% load foundation %} + +
+ {% csrf_token %} + {{ editor_review_file_form|foundation }} +
+
+ +
+
+ +
\ No newline at end of file diff --git a/src/templates/admin/review/view_review.html b/src/templates/admin/review/view_review.html index c178719e96..23bd7c0d76 100644 --- a/src/templates/admin/review/view_review.html +++ b/src/templates/admin/review/view_review.html @@ -82,16 +82,16 @@

{% trans 'Summary of Review' %}

{% if review.decision == 'withdrawn' or review.date_declined %}

{% trans 'No review was undertaken.' %}

{% elif review.is_complete %} +
+ {% trans 'Review File' %} {% if review.review_file %} -
-
-
- {% trans 'Review File' %} - {% include "admin/elements/review/review_file_table_modal.html" with review=review %} -
-
-
+ {% include "admin/elements/review/review_file_table_modal.html" with review=review %} + {% else %} +

No review file provided. You may upload one here.

+ {% include "admin/elements/review/editor_upload_review_file.html" %} + {% endif %} +
{% for answer in review.review_form_answers %}
@@ -127,20 +127,17 @@

{% trans 'Summary of Review' %}

{% endfor %} {% if review.comments_for_editor %} -
-
-
-

{% trans 'Comments for the Editor' %}

-
-
-

{{ review.comments_for_editor|safe|linebreaksbr }}

-
-
-
+
+
+

{% trans 'Comments for the Editor' %}

+
+
+

{{ review.comments_for_editor|safe|linebreaksbr }}

+
+
{% endif %} -
{% endif %} - +
@@ -195,17 +192,17 @@

{% trans 'Review Availability Controls' %}

{% endif %} - - - {% if review.date_declined %} -
+ {% if review.date_declined %} +

{% trans 'Suggested Reviewers' %}

-
-
+
+
{{ review.suggested_reviewers|safe }} -
- {% endif %} +
+ {% endif %} + + {% endblock %} {% block js %}