Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#4081 reviewers from past review rounds are now valid review assignment choices. #4101

Merged
merged 15 commits into from
Apr 24, 2024
Merged
Show file tree
Hide file tree
Changes from 7 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
37 changes: 35 additions & 2 deletions src/review/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
OuterRef,
Prefetch,
Subquery,
Case,
When,
BooleanField,
Value,
)
from django.shortcuts import redirect, reverse
from django.utils import timezone
Expand Down Expand Up @@ -77,6 +81,31 @@ def get_reviewers(article, candidate_queryset, exclude_pks):
).annotate(
rating_average=Subquery(rating_average, output_field=IntegerField()),
)

if article.journal.get_setting('general', 'display_past_reviewers'):
completed_reviewer_pks = article.completed_reviews_with_decision.values_list(
'reviewer__pk',
flat=True,
)
reviewers = reviewers.annotate(
is_past_reviewer=Case(
When(pk__in=completed_reviewer_pks, then=True),
default=False,
output_field=BooleanField(),
),
)

if article.journal.get_setting('general', 'enable_suggested_reviewers'):
article_keywords = [keyword.word for keyword in article.keywords.all()]
reviewers = reviewers.annotate(
is_suggested_reviewer=Case(
When(interest__name__in=article_keywords,
then=Value(True)),
default=Value(False),
output_field=BooleanField(),
)
)

return reviewers


Expand All @@ -86,8 +115,11 @@ def get_reviewer_candidates(article, user=None, reviewers_to_exclude=None):
:param user: The user requesting candidates who would be filtered out
:param reviewers_to_exclude: queryset of Account objects
"""
review_assignments = article.reviewassignment_set.filter(review_round=article.current_review_round_object())
reviewer_pks_to_exclude = [review.reviewer.pk for review in review_assignments]
reviewer_pks_to_exclude = [
review.reviewer.pk for review in article.reviewassignment_set.filter(
review_round=article.current_review_round_object(),
)
]
if user:
reviewer_pks_to_exclude.append(user.pk)

Expand Down Expand Up @@ -116,6 +148,7 @@ def get_suggested_reviewers(article, reviewers):

return suggested_reviewers


def get_previous_round_reviewers(article):
"""
Builds a queryset of candidates who have previously completed a review
Expand Down
32 changes: 14 additions & 18 deletions src/review/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1085,20 +1085,11 @@ def add_review_assignment(request, article_id):
:return: HttpResponse
"""
article = get_object_or_404(submission_models.Article, pk=article_id)

# if setting enabled, fetch reviewers who have completed a review
# in a past review round.
past_reviewers = []
if request.journal.get_setting('general', 'display_past_reviewers'):
past_reviewers = logic.get_previous_round_reviewers(
article,
)
reviewers = logic.get_reviewer_candidates(
article,
user=request.user,
reviewers_to_exclude=past_reviewers,
)

suggested_reviewers = past_reviewers = table_sort = list()
form = forms.ReviewAssignmentForm(
journal=request.journal,
article=article,
Expand Down Expand Up @@ -1175,21 +1166,26 @@ def add_review_assignment(request, article_id):
)
)

display_past_reviewers = request.journal.get_setting(
'general',
'display_past_reviewers')
enable_suggested_reviewers = request.journal.get_setting(
'general',
'enable_suggested_reviewers',
)
if display_past_reviewers and enable_suggested_reviewers:
table_sort = [7, 8]
elif display_past_reviewers or enable_suggested_reviewers:
table_sort = [7]

template = 'admin/review/add_review_assignment.html'
context = {
'article': article,
'form': form,
'reviewers': reviewers,
'new_reviewer_form': new_reviewer_form,
'past_reviewers': past_reviewers,
'table_sort': table_sort,
}

if request.journal.get_setting('general', 'enable_suggested_reviewers'):
context['suggested_reviewers'] = logic.get_suggested_reviewers(
article,
reviewers,
)

return render(request, template, context)


Expand Down
1 change: 1 addition & 0 deletions src/templates/admin/elements/datatables.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
{% if hide_length %}"bLengthChange": false,{% endif %}
{% if hide_page %}"bPaginate": false,{% endif %}
{% if sort and order %}"order": [[ {{ sort }}, "{{ order }}" ]],{% endif %}
{% if sort_list and order %}"order": [{% for sort in sort_list %}[{{ sort }}, "{{ order }}"],{% endfor %}],{% endif %}
{% if disable_ordering %}"ordering": false,{% endif %}
{% if page_length %}"pageLength": {{ page_length }},{% endif %}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
<td>{% for interest in reviewer.interest.all %}{{ interest.name }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
<td>{{ reviewer.rating_average|default_if_none:"" }}</td>
<td>{{ reviewer.reviewer.all.0.date_complete }}</td>
{% if past_reviewers %}<td>{% if reviewer in past_reviewers %}Yes{% else %}No{% endif %}</td>{% endif %}
{% if journal_settings.general.display_past_reviewers %}<td>{% if reviewer.is_past_reviewer %}Yes{% else %}No{% endif %}</td>{% endif %}
{% if journal_settings.general.enable_suggested_reviewers %}<td>{% if reviewer.is_suggested_reviewer %}Yes{% else %}No{% endif %}</td>{% endif %}
30 changes: 7 additions & 23 deletions src/templates/admin/review/add_review_assignment.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ <h2>1. Select Reviewer</h2>
{% endblocktrans %}
</p>

{% if past_reviewers %}
{% if journal_settings.general.display_past_reviewers %}
<div class="callout primary">
<p><span class="fa fa-info-circle"></span> Reviewers who have compeleted a review for this article in a previous round will appear at the top of this list, they will show with a <strong>Yes</strong> in the <strong>Has Reviewed Article</strong> column.</p>
<p><span class="fa fa-info-circle"></span> Reviewers who have completed a review for this article in a previous round will appear at the top of this list, they will show with a <strong>Yes</strong> in the <strong>Has Reviewed Article</strong> column.</p>
</div>
{% endif %}

Expand All @@ -46,35 +46,19 @@ <h2>1. Select Reviewer</h2>
<th width="30%">Interests</th>
<th>Average Score</th>
<th>Last Review Completed</th>
{% if past_reviewers %}<th>Has Reviewed Article</th>{% endif %}
{% if journal_settings.general.display_past_reviewers %}<th>Has Reviewed Article</th>{% endif %}
{% if journal_settings.general.enable_suggested_reviewers %}<th>Suggested Reviewer</th>{% endif %}
</tr>
</thead>

<tbody>
{% for reviewer in past_reviewers %}
<tr>
{% include "admin/elements/review/add_reviewer_table_row.html" with reviewer=reviewer past_reviewers=past_reviewers %}
</tr>
{% endfor %}
{% for reviewer in suggested_reviewers %}
<tr class="green">
{% include "admin/elements/review/add_reviewer_table_row.html" with reviewer=reviewer past_reviewers=past_reviewers %}
</tr>
{% endfor %}
{% for reviewer in reviewers %}
{% if not journal_settings.general.enable_suggested_reviewers or not reviewer in suggested_reviewers %}
<tr>
{% include "admin/elements/review/add_reviewer_table_row.html" with reviewer=reviewer past_reviewers=past_reviewers %}
{% include "admin/elements/review/add_reviewer_table_row.html" with reviewer=reviewer %}
</tr>
{% endif %}
{% empty %}
<tr>
<td>No suitable reviewers.</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="10">No suitable reviewers.</td>
</tr>
{% endfor %}
</tbody>
Expand Down Expand Up @@ -175,7 +159,7 @@ <h4><i class="fa fa-users">&nbsp;</i>Enroll Existing User as Reviewer</h4>
{% endblock body %}

{% block js %}
{% include "elements/datatables.html" with target="#reviewers" %}
{% include "elements/datatables.html" with target="#reviewers" sort_list=table_sort order="desc" %}
{% include "elements/datepicker.html" with target="#id_date_due" %}
{% if form.modal %}
{% include "admin/elements/open_modal.html" with target=form.modal.id %}
Expand Down