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

Replaced review name collision resolution code with a decision to not save when it occurs. Fixes #3092.
 - Legacy-Id: 18559
Note: SVN reference [18533] has been migrated to Git commit 0ff5172a89d5a7ad48cb1fd03b1c8926e26e50f9
This commit is contained in:
Henrik Levkowetz 2020-10-04 13:36:44 +00:00
parent 1a7aa2129d
commit 29d1a0b362
2 changed files with 29 additions and 59 deletions

View file

@ -894,8 +894,6 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "part-completed")
self.assertTrue(assignment.review_request.doc.rev in assignment.review.name)
@ -915,35 +913,6 @@ class ReviewTests(TestCase):
self.assertTrue(not any( len(line) > 100 for line in body.splitlines() ))
self.assertTrue(any( len(line) > 80 for line in body.splitlines() ))
first_review = assignment.review
# complete
assignment = assignment.review_request.reviewassignment_set.create(state_id="assigned", reviewer=assignment.reviewer)
url = urlreverse('ietf.doc.views_review.complete_review', kwargs={ "name": assignment.review_request.doc.name, "assignment_id": assignment.pk })
r = self.client.post(url, data={
"result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
"state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
"reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is another review with a really, really, really, really, really, really, really, really, really, really long line.",
})
self.assertEqual(r.status_code, 302)
assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "completed")
self.assertTrue(assignment.review_request.doc.rev in assignment.review.name)
second_review = assignment.review
self.assertTrue(first_review.name != second_review.name)
self.assertTrue(second_review.name.endswith("-2")) # uniquified
# This review has a line longer than 100; it should be wrapped to less
# than 80.
body = get_payload_text(outbox[2])
self.assertIn('really, really, really', body)
self.assertTrue(all( len(line) <= 80 for line in body.splitlines() ))
def test_revise_review_enter_content(self):
assignment, url = self.setup_complete_review_test()

View file

@ -19,6 +19,7 @@ from django.http import JsonResponse, Http404, HttpResponse, HttpResponseRedirec
from django.shortcuts import render, get_object_or_404, redirect
from django import forms
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.html import mark_safe # type:ignore
from django.core.exceptions import ValidationError
@ -28,7 +29,7 @@ from django.urls import reverse as urlreverse
from ietf.doc.models import (Document, NewRevisionDocEvent, State, DocAlias,
LastCallDocEvent, ReviewRequestDocEvent, ReviewAssignmentDocEvent, DocumentAuthor)
from ietf.name.models import (ReviewRequestStateName, ReviewAssignmentStateName, ReviewResultName,
DocTypeName, ReviewTypeName)
ReviewTypeName)
from ietf.person.models import Person
from ietf.review.models import ReviewRequest, ReviewAssignment, ReviewWish
from ietf.group.models import Group
@ -655,6 +656,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
team = assignment.review_request.team
team_acronym = assignment.review_request.team.acronym.lower()
request_type = assignment.review_request.type
reviewer = assignment.reviewer
mailtrigger_slug = 'review_completed_{}_{}'.format(team_acronym, request_type.slug)
# Description is only used if the mailtrigger does not exist yet.
mailtrigger_desc = 'Recipients when a {} {} review is completed'.format(team_acronym, request_type)
@ -679,7 +681,31 @@ def complete_review(request, name, assignment_id=None, acronym=None):
request.POST, request.FILES)
if form.is_valid():
review_submission = form.cleaned_data['review_submission']
if not assignment:
request_type = form.cleaned_data['review_type']
reviewer = form.cleaned_data['reviewer'].role_email('reviewer',group=team)
if assignment and assignment.review:
review = assignment.review
else:
# create review doc
name_components = [
"review",
strip_prefix(doc.name, "draft-"),
form.cleaned_data["reviewed_rev"],
team.acronym,
request_type.slug,
xslugify(reviewer.person.ascii_parts()[3]),
datetime.date.today().isoformat(),
]
review_name = "-".join(c for c in name_components if c).lower()
if not Document.objects.filter(name=review_name).exists():
review = Document.objects.create(name=review_name,type_id='review',group=team)
DocAlias.objects.create(name=review_name).docs.add(review)
else:
messages.warning(message='Attempt to save review failed: review document already exists. This most likely occurred because the review was submitted twice in quick succession. If you intended to submit a new review, rather than update an existing one, things are probably OK. Please verify that the shown review is what you expected.')
return redirect("ietf.doc.views_doc.document_main", name=review_name)
if not assignment:
# If this is an unsolicited review, create a new request and assignment.
# The assignment will be immediately closed after, sharing the usual
@ -698,33 +724,8 @@ def complete_review(request, name, assignment_id=None, acronym=None):
state_id='assigned',
reviewer=form.cleaned_data['reviewer'].role_email('reviewer', group=team),
assigned_on=datetime.datetime.now(),
review = review,
)
request_type = form.cleaned_data['review_type']
review = assignment.review
if not review:
# create review doc
for i in range(1, 100):
name_components = [
"review",
strip_prefix(assignment.review_request.doc.name, "draft-"),
form.cleaned_data["reviewed_rev"],
assignment.review_request.team.acronym,
request_type.slug,
xslugify(assignment.reviewer.person.ascii_parts()[3]),
datetime.date.today().isoformat(),
]
if i > 1:
name_components.append(str(i))
name = "-".join(c for c in name_components if c).lower()
if not Document.objects.filter(name=name).exists():
review = Document.objects.create(name=name)
DocAlias.objects.create(name=review.name).docs.add(review)
break
review.type = DocTypeName.objects.get(slug="review")
review.group = assignment.review_request.team
review.rev = "00" if not review.rev else "{:02}".format(int(review.rev) + 1)
review.title = "{} Review of {}-{}".format(assignment.review_request.type.name, assignment.review_request.doc.name, form.cleaned_data["reviewed_rev"])