Added optional reviewer unavailability reason support. Fixes issue #2146. Commit ready for merge.

- Legacy-Id: 15342
This commit is contained in:
Peter E. Yee 2018-07-14 18:04:31 +00:00
parent c7a9c2f121
commit f4eba7d4df
10 changed files with 22 additions and 3 deletions

View file

@ -1,4 +1,5 @@
import os
EMAIL_COPY_TO = 'peter@akayla.com'
SECRET_KEY = 'jzv$o93h_lzw4a0%0oz-5t5lk+ai=3f8x@uo*9ahu8w4i300o6'

View file

@ -285,7 +285,7 @@ class ReviewerSettingsForm(forms.ModelForm):
class AddUnavailablePeriodForm(forms.ModelForm):
class Meta:
model = UnavailablePeriod
fields = ['start_date', 'end_date', 'availability']
fields = ['start_date', 'end_date', 'availability', 'reason']
def __init__(self, *args, **kwargs):
super(AddUnavailablePeriodForm, self).__init__(*args, **kwargs)

View file

@ -428,6 +428,7 @@ class ReviewTests(TestCase):
'start_date': start_date.isoformat(),
'end_date': "",
'availability': "unavailable",
'reason': "Whimsy",
})
self.assertEqual(r.status_code, 302)
period = UnavailablePeriod.objects.get(person=reviewer, team=review_req.team, start_date=start_date)
@ -437,6 +438,7 @@ class ReviewTests(TestCase):
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
self.assertTrue(start_date.isoformat(), msg_content)
self.assertTrue("indefinite", msg_content)
self.assertEqual(period.reason, "Whimsy")
# end unavailable period
empty_outbox()

View file

@ -1694,10 +1694,11 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
in_the_past = period.end_date and period.end_date < today
if not in_the_past:
msg = "Unavailable for review: {} - {} ({})".format(
msg = "Unavailable for review: {} - {} ({}) {}".format(
period.start_date.isoformat() if period.start_date else "indefinite",
period.end_date.isoformat() if period.end_date else "indefinite",
period.get_availability_display(),
period.reason,
)
if period.availability == "unavailable":

View file

@ -20,7 +20,7 @@ class ReviewSecretarySettingsAdmin(admin.ModelAdmin):
admin.site.register(ReviewSecretarySettings, ReviewSecretarySettingsAdmin)
class UnavailablePeriodAdmin(admin.ModelAdmin):
list_display = ["person", "team", "start_date", "end_date", "availability"]
list_display = ["person", "team", "start_date", "end_date", "availability", "reason"]
list_display_links = ["person"]
list_filter = ["team"]
date_hierarchy = "start_date"

View file

@ -164,6 +164,7 @@ with db_con.cursor() as c:
start_date=None,
end_date=end_date,
availability="unavailable",
reason="reason",
)
# check that we got the needed names

View file

@ -60,6 +60,7 @@ class UnavailablePeriod(models.Model):
("unavailable", "Completely unavailable - reassign any outstanding reviews"),
]
availability = models.CharField(max_length=30, choices=AVAILABILITY_CHOICES)
reason = models.TextField(verbose_name="Reason why reviewer is unavailable (Optional)", max_length=2048, blank=True, help_text="Provide (for the secretary's benefit) the reason why the review is unavailable", default='')
def state(self):
import datetime

View file

@ -86,6 +86,7 @@ class UnavailablePeriodResource(ModelResource):
"start_date": ALL,
"end_date": ALL,
"availability": ALL,
"reason": ALL,
"team": ALL_WITH_RELATIONS,
"person": ALL_WITH_RELATIONS,
}

View file

@ -32,12 +32,18 @@
{% if unavailable_periods %}
<table class="table">
<th>Period</th>
<th>Availability</th>
<th>Reason</th>
<th> </th>
<th> </th>
{% for o in unavailable_periods %}
<tr class="unavailable-period-{{ o.state }}">
<td>
{{ o.start_date|default:"indefinite" }} - {{ o.end_date|default:"indefinite" }}
</td>
<td>{{ o.get_availability_display }}</td>
<td>{{ o.reason }}</td>
<td>
{% if not o.end_date %}
<form method="post" class="form-inline" style="display:inline-block">

View file

@ -1,8 +1,14 @@
<table class="simple-table">
<tr>
<th>Dates</th>
<th>Availability</th>
<th>Reason</th>
</tr>
{% for p in unavailable_periods %}
<tr class="unavailable-period-{{ p.state }}">
<td> {% if p.start_date or p.end_date %}{{ p.start_date|default:"&infin;" }} -{% endif %} {{ p.end_date|default:"&infin;" }}</td>
<td>{{ p.get_availability_display }}</td>
<td>{{ p.reason }}</td>
</tr>
{% endfor %}
</table>