From f4eba7d4dfcae1352738063a11b4d7a5b9889de9 Mon Sep 17 00:00:00 2001 From: "Peter E. Yee" Date: Sat, 14 Jul 2018 18:04:31 +0000 Subject: [PATCH] Added optional reviewer unavailability reason support. Fixes issue #2146. Commit ready for merge. - Legacy-Id: 15342 --- docker/settings_local.py | 1 + ietf/group/forms.py | 2 +- ietf/group/tests_review.py | 2 ++ ietf/group/views.py | 3 ++- ietf/review/admin.py | 2 +- ietf/review/import_from_review_tool.py | 1 + ietf/review/models.py | 1 + ietf/review/resources.py | 1 + ietf/templates/group/change_reviewer_settings.html | 6 ++++++ ietf/templates/review/unavailable_table.html | 6 ++++++ 10 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docker/settings_local.py b/docker/settings_local.py index 0737d97a2..bed522a5d 100644 --- a/docker/settings_local.py +++ b/docker/settings_local.py @@ -1,4 +1,5 @@ import os +EMAIL_COPY_TO = 'peter@akayla.com' SECRET_KEY = 'jzv$o93h_lzw4a0%0oz-5t5lk+ai=3f8x@uo*9ahu8w4i300o6' diff --git a/ietf/group/forms.py b/ietf/group/forms.py index 023d2e0ab..091fd79fa 100644 --- a/ietf/group/forms.py +++ b/ietf/group/forms.py @@ -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) diff --git a/ietf/group/tests_review.py b/ietf/group/tests_review.py index 66c05bb45..08c4aed7d 100644 --- a/ietf/group/tests_review.py +++ b/ietf/group/tests_review.py @@ -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() diff --git a/ietf/group/views.py b/ietf/group/views.py index 54c9990e9..96f62aa14 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -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": diff --git a/ietf/review/admin.py b/ietf/review/admin.py index 30ace82f8..ec2319f03 100644 --- a/ietf/review/admin.py +++ b/ietf/review/admin.py @@ -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" diff --git a/ietf/review/import_from_review_tool.py b/ietf/review/import_from_review_tool.py index 4e1488d2c..868ab4bb6 100755 --- a/ietf/review/import_from_review_tool.py +++ b/ietf/review/import_from_review_tool.py @@ -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 diff --git a/ietf/review/models.py b/ietf/review/models.py index f52a94e30..97243aebb 100644 --- a/ietf/review/models.py +++ b/ietf/review/models.py @@ -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 diff --git a/ietf/review/resources.py b/ietf/review/resources.py index 85e22c8b0..4ef8e8dd9 100644 --- a/ietf/review/resources.py +++ b/ietf/review/resources.py @@ -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, } diff --git a/ietf/templates/group/change_reviewer_settings.html b/ietf/templates/group/change_reviewer_settings.html index e77b63ccd..cee48d9ea 100644 --- a/ietf/templates/group/change_reviewer_settings.html +++ b/ietf/templates/group/change_reviewer_settings.html @@ -32,12 +32,18 @@ {% if unavailable_periods %} + + + + + {% for o in unavailable_periods %} +
PeriodAvailabilityReason
{{ o.start_date|default:"indefinite" }} - {{ o.end_date|default:"indefinite" }} {{ o.get_availability_display }}{{ o.reason }} {% if not o.end_date %}
diff --git a/ietf/templates/review/unavailable_table.html b/ietf/templates/review/unavailable_table.html index 79e8b4f4f..614ec7f6a 100644 --- a/ietf/templates/review/unavailable_table.html +++ b/ietf/templates/review/unavailable_table.html @@ -1,8 +1,14 @@ + + + + + {% for p in unavailable_periods %} + {% endfor %}
DatesAvailabilityReason
{% if p.start_date or p.end_date %}{{ p.start_date|default:"∞" }} -{% endif %} {{ p.end_date|default:"∞" }} {{ p.get_availability_display }}{{ p.reason }}