From 9df5839874073ab10342bcb9b32d1dd9b67613c2 Mon Sep 17 00:00:00 2001 From: Sasha Romijn Date: Wed, 23 Oct 2019 16:06:44 +0000 Subject: [PATCH] Fix #2123 - Use a DBTemplate when a review assignment is mailed. The message sent to a reviewer when a new review is assigned to them, is now taken from a DBTemplate, allowing it to be customised per team. This includes a migration to create a default template, which looks the same as before. Commit ready for merge. - Legacy-Id: 16921 --- .../0006_add_review_assigned_template.py | 35 +++++++++++++++++++ ietf/doc/tests_review.py | 10 ++++-- ietf/name/fixtures/names.json | 9 +++++ ietf/review/utils.py | 21 +++++------ 4 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 ietf/dbtemplate/migrations/0006_add_review_assigned_template.py diff --git a/ietf/dbtemplate/migrations/0006_add_review_assigned_template.py b/ietf/dbtemplate/migrations/0006_add_review_assigned_template.py new file mode 100644 index 000000000..f2a0ddaab --- /dev/null +++ b/ietf/dbtemplate/migrations/0006_add_review_assigned_template.py @@ -0,0 +1,35 @@ +# Copyright The IETF Trust 2019, All Rights Reserved +# -*- coding: utf-8 -*- + + +from __future__ import absolute_import, print_function, unicode_literals + +from django.db import migrations + +def forward(apps, schema_editor): + DBTemplate = apps.get_model('dbtemplate', 'DBTemplate') + + DBTemplate.objects.create(path='/group/defaults/email/review_assigned.txt', type_id='django', + content="""{{ assigner.ascii }} has assigned you as a reviewer for this document. + +{% if prev_team_reviews %}This team has completed other reviews of this document:{% endif %}{% for assignment in prev_team_reviews %} +- {{ assignment.completed_on }} {{ assignment.reviewer.person.ascii }} -{% if assignment.reviewed_rev %}{{ assignment.reviewed_rev }}{% else %}{{ assignment.review_request.requested_rev }}{% endif %} {{ assignment.result.name }} +{% endfor %} +""") + + +def reverse(apps, schema_editor): + DBTemplate = apps.get_model('dbtemplate', 'DBTemplate') + + DBTemplate.objects.get(path='/group/defaults/email/review_assigned.txt').delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('dbtemplate', '0005_adjust_assignment_email_summary_templates_2526'), + ] + + operations = [ + migrations.RunPython(forward,reverse), + ] diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index f4f1f728b..fadfd0696 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -322,7 +322,7 @@ class ReviewTests(TestCase): review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',person__name='Some Reviewer',name_id='reviewer') RoleFactory(group=review_team,person__user__username='marschairman',person__name='WG Cháir Man',name_id='reviewer') - RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') + secretary = RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') ReviewerSettings.objects.create(team=review_team, person=rev_role.person, min_interval=14, skip_next=0) # review to assign to @@ -421,10 +421,14 @@ class ReviewTests(TestCase): assignment = review_req.reviewassignment_set.first() self.assertEqual(assignment.reviewer, reviewer) self.assertEqual(assignment.state_id, "assigned") + self.assertEqual(NextReviewerInTeam.objects.get(team=review_req.team).next_reviewer, rotation_list[1]) + self.assertEqual(len(outbox), 1) self.assertEqual('"Some Reviewer" ', outbox[0]["To"]) - self.assertTrue("assigned" in outbox[0].get_payload(decode=True).decode("utf-8")) - self.assertEqual(NextReviewerInTeam.objects.get(team=review_req.team).next_reviewer, rotation_list[1]) + message = outbox[0].get_payload(decode=True).decode("utf-8") + self.assertTrue("{} has assigned you".format(secretary.person.ascii) in message) + self.assertTrue("This team has completed other reviews" in message) + self.assertTrue("{} -01 Serious Issues".format(reviewer_email.person.ascii) in message) def test_accept_reviewer_assignment(self): diff --git a/ietf/name/fixtures/names.json b/ietf/name/fixtures/names.json index 680312e97..90c451186 100644 --- a/ietf/name/fixtures/names.json +++ b/ietf/name/fixtures/names.json @@ -1,4 +1,13 @@ [ + { + "fields": { + "path": "/group/defaults/email/review_assigned.txt", + "type_id": "django", + "content": "{{ assigner.ascii }} has assigned you as a reviewer for this document.\n\n{% if prev_team_reviews %}This team has completed other reviews of this document:{% endif %}{% for assignment in prev_team_reviews %}\n- {{ assignment.completed_on }} {{ assignment.reviewer.person.ascii }} -{% if assignment.reviewed_rev %}{{ assignment.reviewed_rev }}{% else %}{{ assignment.review_request.requested_rev }}{% endif %} {{ assignment.result.name }}\n{% endfor %}" + }, + "model": "dbtemplate.dbtemplate", + "pk": "1000" + }, { "fields": { "doc_type": "charter", diff --git a/ietf/review/utils.py b/ietf/review/utils.py index c6d836f67..705b166f0 100644 --- a/ietf/review/utils.py +++ b/ietf/review/utils.py @@ -13,10 +13,12 @@ from collections import defaultdict, namedtuple from django.db.models import Q, Max, F from django.template.defaultfilters import pluralize +from django.template.loader import render_to_string from django.urls import reverse as urlreverse from django.contrib.sites.models import Site import debug # pyflakes:ignore +from ietf.dbtemplate.models import DBTemplate from ietf.group.models import Group, Role from ietf.doc.models import (Document, ReviewRequestDocEvent, ReviewAssignmentDocEvent, State, @@ -451,21 +453,20 @@ def assign_review_request_to_reviewer(request, review_req, reviewer, add_skip=Fa state_id='assigned', ) - msg = "%s has assigned you as a reviewer for this document." % request.user.person.ascii prev_team_reviews = ReviewAssignment.objects.filter( review_request__doc=review_req.doc, state="completed", review_request__team=review_req.team, ) - if prev_team_reviews.exists(): - msg = msg + '\n\nThis team has completed other reviews of this document:\n' - for assignment in prev_team_reviews: - msg += '%s %s -%s %s\n'% ( - assignment.completed_on.strftime('%d %b %Y'), - assignment.reviewer.person.ascii, - assignment.reviewed_rev or assignment.review_request.requested_rev, - assignment.result.name, - ) + + try: + template = DBTemplate.objects.get( + path="/group/%s/email/review_assigned.txt" % review_req.team.acronym) + except DBTemplate.DoesNotExist: + template = DBTemplate.objects.get(path="/group/defaults/email/review_assigned.txt") + + context = {'assigner': request.user.person, 'prev_team_reviews': prev_team_reviews} + msg = render_to_string(template.path, context, request=request) email_review_request_change( request, review_req,