Merged in [12665] from rjsparks@nostrum.com:

Make it easier to see who's really next in reviewer rotation.
 - Legacy-Id: 12668
Note: SVN reference [12665] has been migrated to Git commit 49dcf67fd5
This commit is contained in:
Henrik Levkowetz 2017-01-18 16:30:29 +00:00
commit 79dc639f46
5 changed files with 32 additions and 4 deletions

View file

@ -509,6 +509,10 @@ class Document(DocumentInfo):
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
return e.telechat_date if e and e.telechat_date and e.telechat_date >= datetime.date.today() else None
def past_telechat_date(self):
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
return e.telechat_date if e and e.telechat_date and e.telechat_date < datetime.date.today() else None
def area_acronym(self):
g = self.group
if g:

View file

@ -26,7 +26,9 @@ from ietf.review.utils import (can_manage_review_requests_for_team,
reviewer_rotation_list,
latest_review_requests_for_reviewers,
augment_review_requests_with_events,
get_default_filter_re,)
get_default_filter_re,
days_needed_to_fulfill_min_interval_for_reviewers,
)
from ietf.doc.models import LastCallDocEvent
from ietf.group.models import Role
from ietf.group.utils import get_group_or_404, construct_group_menu_context
@ -142,6 +144,8 @@ def reviewer_overview(request, acronym, group_type=None):
req_data_for_reviewers = latest_review_requests_for_reviewers(group)
review_state_by_slug = { n.slug: n for n in ReviewRequestStateName.objects.all() }
days_needed = days_needed_to_fulfill_min_interval_for_reviewers(group)
for person in reviewers:
person.settings = reviewer_settings.get(person.pk) or ReviewerSettings(team=group, person=person)
person.settings_url = None
@ -155,6 +159,8 @@ def reviewer_overview(request, acronym, group_type=None):
person.completely_unavailable = any(p.availability == "unavailable"
and (p.start_date is None or p.start_date <= today) and (p.end_date is None or today <= p.end_date)
for p in person.unavailable_periods)
person.busy = person.id in days_needed
MAX_CLOSED_REQS = 10
req_data = req_data_for_reviewers.get(person.pk, [])

View file

@ -550,7 +550,15 @@ table.simple-table td:last-child {
}
.reviewer-overview .completely-unavailable {
opacity: 0.6;
background-color: #D8D8D8;
}
.reviewer-overview .skip-next {
background-color: #E4E4E4;
}
.reviewer-overview .busy {
background-color: #F0F0F0;
}
/* === Statistics =========================================================== */

View file

@ -148,6 +148,7 @@
<span class="close-action">
<button type="button" class="btn btn-default btn-danger">Close...</button>
{% if r.doc.past_telechat_date %} (was on {{r.doc.past_telechat_date}} telechat) {% endif %}
</span>
<span class="close-controls form-inline">

View file

@ -16,7 +16,13 @@
<h2>Reviewers</h2>
<p>Status of the reviewers in {{ group.acronym }}, ordered by their
rotation with the next reviewer in the rotation at the top.</p>
rotation with the next reviewer in the rotation at the top. Rows with darker backgrounds have the following meaning:
</p>
<div class="reviewer-overview">
<p class="busy">Has already been assigned a document within the given interval.</p>
<p class="skip-next">Will be skipped the next time at the top of rotation.</p>
<p class="completely-unavailable">Is not available to do reviews at this time.</p>
</div>
{% if reviewers %}
<table class="table reviewer-overview">
@ -29,7 +35,10 @@
</thead>
<tbody>
{% for person in reviewers %}
<tr {% if person.completely_unavailable %}class="completely-unavailable"{% endif %}>
<tr {% if person.completely_unavailable %}class="completely-unavailable"
{% elif person.busy %}class="busy"
{% elif person.settings.skip_next %}class="skip-next"
{% endif %}>
<td>{% if person.settings_url %}<a href="{{ person.settings_url }}">{% endif %}{{ person }}{% if person.settings_url %}</a>{% endif %}</td>
<td>
<table class="simple-table">