Merged in [16921] from sasha@dashcare.nl:

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.
 - Legacy-Id: 16928
Note: SVN reference [16921] has been migrated to Git commit 9df5839874
This commit is contained in:
Henrik Levkowetz 2019-10-26 15:16:18 +00:00
commit 09c34fa131
4 changed files with 62 additions and 13 deletions

View file

@ -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),
]

View file

@ -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" <reviewer@example.com>', 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):

View file

@ -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",

View file

@ -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,
@ -454,21 +456,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,