1919from django .shortcuts import render , get_object_or_404 , redirect
2020from django import forms
2121from django .conf import settings
22+ from django .contrib import messages
2223from django .contrib .auth .decorators import login_required
2324from django .utils .html import mark_safe # type:ignore
2425from django .core .exceptions import ValidationError
2829from ietf .doc .models import (Document , NewRevisionDocEvent , State , DocAlias ,
2930 LastCallDocEvent , ReviewRequestDocEvent , ReviewAssignmentDocEvent , DocumentAuthor )
3031from ietf .name .models import (ReviewRequestStateName , ReviewAssignmentStateName , ReviewResultName ,
31- DocTypeName , ReviewTypeName )
32+ ReviewTypeName )
3233from ietf .person .models import Person
3334from ietf .review .models import ReviewRequest , ReviewAssignment , ReviewWish
3435from ietf .group .models import Group
@@ -655,6 +656,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
655656 team = assignment .review_request .team
656657 team_acronym = assignment .review_request .team .acronym .lower ()
657658 request_type = assignment .review_request .type
659+ reviewer = assignment .reviewer
658660 mailtrigger_slug = 'review_completed_{}_{}' .format (team_acronym , request_type .slug )
659661 # Description is only used if the mailtrigger does not exist yet.
660662 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):
679681 request .POST , request .FILES )
680682 if form .is_valid ():
681683 review_submission = form .cleaned_data ['review_submission' ]
682-
684+ if not assignment :
685+ request_type = form .cleaned_data ['review_type' ]
686+ reviewer = form .cleaned_data ['reviewer' ].role_email ('reviewer' ,group = team )
687+
688+ if assignment and assignment .review :
689+ review = assignment .review
690+ else :
691+ # create review doc
692+ name_components = [
693+ "review" ,
694+ strip_prefix (doc .name , "draft-" ),
695+ form .cleaned_data ["reviewed_rev" ],
696+ team .acronym ,
697+ request_type .slug ,
698+ xslugify (reviewer .person .ascii_parts ()[3 ]),
699+ datetime .date .today ().isoformat (),
700+ ]
701+ review_name = "-" .join (c for c in name_components if c ).lower ()
702+ if not Document .objects .filter (name = review_name ).exists ():
703+ review = Document .objects .create (name = review_name ,type_id = 'review' ,group = team )
704+ DocAlias .objects .create (name = review_name ).docs .add (review )
705+ else :
706+ 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.' )
707+ return redirect ("ietf.doc.views_doc.document_main" , name = review_name )
708+
683709 if not assignment :
684710 # If this is an unsolicited review, create a new request and assignment.
685711 # The assignment will be immediately closed after, sharing the usual
@@ -698,33 +724,8 @@ def complete_review(request, name, assignment_id=None, acronym=None):
698724 state_id = 'assigned' ,
699725 reviewer = form .cleaned_data ['reviewer' ].role_email ('reviewer' , group = team ),
700726 assigned_on = datetime .datetime .now (),
727+ review = review ,
701728 )
702- request_type = form .cleaned_data ['review_type' ]
703-
704- review = assignment .review
705- if not review :
706- # create review doc
707- for i in range (1 , 100 ):
708- name_components = [
709- "review" ,
710- strip_prefix (assignment .review_request .doc .name , "draft-" ),
711- form .cleaned_data ["reviewed_rev" ],
712- assignment .review_request .team .acronym ,
713- request_type .slug ,
714- xslugify (assignment .reviewer .person .ascii_parts ()[3 ]),
715- datetime .date .today ().isoformat (),
716- ]
717- if i > 1 :
718- name_components .append (str (i ))
719-
720- name = "-" .join (c for c in name_components if c ).lower ()
721- if not Document .objects .filter (name = name ).exists ():
722- review = Document .objects .create (name = name )
723- DocAlias .objects .create (name = review .name ).docs .add (review )
724- break
725-
726- review .type = DocTypeName .objects .get (slug = "review" )
727- review .group = assignment .review_request .team
728729
729730 review .rev = "00" if not review .rev else "{:02}" .format (int (review .rev ) + 1 )
730731 review .title = "{} Review of {}-{}" .format (assignment .review_request .type .name , assignment .review_request .doc .name , form .cleaned_data ["reviewed_rev" ])
0 commit comments