88
99from django import forms
1010from django .conf import settings
11+ from django .contrib import messages
1112from django .http import HttpResponse , HttpResponseRedirect , Http404
1213from django .shortcuts import render , get_object_or_404 , redirect
1314from django .template .defaultfilters import striptags
@@ -592,6 +593,7 @@ def clean_ballot_writeup(self):
592593def ballot_writeupnotes (request , name ):
593594 """Editing of ballot write-up and notes"""
594595 doc = get_object_or_404 (Document , docalias__name = name )
596+ prev_state = doc .get_state ("draft-iesg" )
595597
596598 login = request .user .person
597599
@@ -604,61 +606,76 @@ def ballot_writeupnotes(request, name):
604606 if request .method == 'POST' and "save_ballot_writeup" in request .POST or "issue_ballot" in request .POST :
605607 form = BallotWriteupForm (request .POST )
606608 if form .is_valid ():
607- t = form .cleaned_data ["ballot_writeup" ]
608- if t != existing .text :
609- e = WriteupDocEvent (doc = doc , rev = doc .rev , by = login )
610- e .by = login
611- e .type = "changed_ballot_writeup_text"
612- e .desc = "Ballot writeup was changed"
613- e .text = t
614- e .save ()
615- elif existing .pk == None :
616- existing .save ()
617-
618- if "issue_ballot" in request .POST :
619- e = create_ballot_if_not_open (request , doc , login , "approve" ) # pyflakes:ignore
620- ballot = doc .latest_event (BallotDocEvent , type = "created_ballot" )
621- if has_role (request .user , "Area Director" ) and not doc .latest_event (BallotPositionDocEvent , balloter = login , ballot = ballot ):
622- # sending the ballot counts as a yes
623- pos = BallotPositionDocEvent (doc = doc , rev = doc .rev , by = login )
624- pos .ballot = ballot
625- pos .type = "changed_ballot_position"
626- pos .balloter = login
627- pos .pos_id = "yes"
628- pos .desc = "[Ballot Position Update] New position, %s, has been recorded for %s" % (pos .pos .name , pos .balloter .plain_name ())
629- pos .save ()
630-
631- # Consider mailing this position to 'iesg_ballot_saved'
632-
633- approval = doc .latest_event (WriteupDocEvent , type = "changed_ballot_approval_text" )
634- if not approval :
635- approval = generate_approval_mail (request , doc )
636- approval .save ()
637-
638- msg = generate_issue_ballot_mail (request , doc , ballot )
639-
640- addrs = gather_address_lists ('iesg_ballot_issued' ,doc = doc ).as_strings ()
641- override = {'To' :addrs .to }
642- if addrs .cc :
643- override ['CC' ] = addrs .cc
644- send_mail_preformatted (request , msg , override = override )
645-
646- addrs = gather_address_lists ('ballot_issued_iana' ,doc = doc ).as_strings ()
647- override = { "To" : "IANA <%s>" % settings .IANA_EVAL_EMAIL , "Bcc" : None , "Reply-To" : []}
648- if addrs .cc :
649- override ['CC' ] = addrs .cc
650- send_mail_preformatted (request , msg , extra = extra_automation_headers (doc ), override = override )
651-
652- e = DocEvent (doc = doc , rev = doc .rev , by = login )
653- e .by = login
654- e .type = "sent_ballot_announcement"
655- e .desc = "Ballot has been issued"
656- e .save ()
609+ if prev_state .slug in ['ann' , 'approved' , 'rfcqueue' , 'pub' ]:
610+ ballot_already_approved = True
611+ messages .warning (request , "There is an approved ballot for %s. Writeup not changed." % doc .name )
612+ else :
613+ ballot_already_approved = False
614+ t = form .cleaned_data ["ballot_writeup" ]
615+ if t != existing .text :
616+ e = WriteupDocEvent (doc = doc , rev = doc .rev , by = login )
617+ e .by = login
618+ e .type = "changed_ballot_writeup_text"
619+ e .desc = "Ballot writeup was changed"
620+ e .text = t
621+ e .save ()
622+ elif existing .pk == None :
623+ existing .save ()
624+
625+ if "issue_ballot" in request .POST and not ballot_already_approved :
626+ if prev_state .slug in ['watching' , 'writeupw' , 'goaheadw' ]:
627+ new_state = State .objects .get (used = True , type = "draft-iesg" , slug = 'iesg-eva' )
628+ prev_tags = doc .tags .filter (slug__in = IESG_SUBSTATE_TAGS )
629+ doc .set_state (new_state )
630+ doc .tags .remove (* prev_tags )
631+
632+ sce = add_state_change_event (doc , login , prev_state , new_state , prev_tags = prev_tags , new_tags = [])
633+ if sce :
634+ doc .save_with_history ([sce ])
635+
636+ if not ballot_already_approved :
637+ e = create_ballot_if_not_open (request , doc , login , "approve" ) # pyflakes:ignore
638+ ballot = doc .latest_event (BallotDocEvent , type = "created_ballot" )
639+ if has_role (request .user , "Area Director" ) and not doc .latest_event (BallotPositionDocEvent , balloter = login , ballot = ballot ):
640+ # sending the ballot counts as a yes
641+ pos = BallotPositionDocEvent (doc = doc , rev = doc .rev , by = login )
642+ pos .ballot = ballot
643+ pos .type = "changed_ballot_position"
644+ pos .balloter = login
645+ pos .pos_id = "yes"
646+ pos .desc = "[Ballot Position Update] New position, %s, has been recorded for %s" % (pos .pos .name , pos .balloter .plain_name ())
647+ pos .save ()
648+
649+ # Consider mailing this position to 'iesg_ballot_saved'
650+
651+ approval = doc .latest_event (WriteupDocEvent , type = "changed_ballot_approval_text" )
652+ if not approval :
653+ approval = generate_approval_mail (request , doc )
654+ approval .save ()
655+
656+ msg = generate_issue_ballot_mail (request , doc , ballot )
657+
658+ addrs = gather_address_lists ('iesg_ballot_issued' ,doc = doc ).as_strings ()
659+ override = {'To' :addrs .to }
660+ if addrs .cc :
661+ override ['CC' ] = addrs .cc
662+ send_mail_preformatted (request , msg , override = override )
663+
664+ addrs = gather_address_lists ('ballot_issued_iana' ,doc = doc ).as_strings ()
665+ override = { "To" : "IANA <%s>" % settings .IANA_EVAL_EMAIL , "Bcc" : None , "Reply-To" : []}
666+ if addrs .cc :
667+ override ['CC' ] = addrs .cc
668+ send_mail_preformatted (request , msg , extra = extra_automation_headers (doc ), override = override )
669+
670+ e = DocEvent (doc = doc , rev = doc .rev , by = login )
671+ e .by = login
672+ e .type = "sent_ballot_announcement"
673+ e .desc = "Ballot has been issued"
674+ e .save ()
657675
658- return render (request , 'doc/ballot/ballot_issued.html' ,
659- dict (doc = doc ,
660- back_url = doc .get_absolute_url ()))
661-
676+ return render (request , 'doc/ballot/ballot_issued.html' ,
677+ dict (doc = doc ,
678+ back_url = doc .get_absolute_url ()))
662679
663680 need_intended_status = ""
664681 if not doc .intended_std_level :
@@ -668,6 +685,7 @@ def ballot_writeupnotes(request, name):
668685 dict (doc = doc ,
669686 back_url = doc .get_absolute_url (),
670687 ballot_issued = bool (doc .latest_event (type = "sent_ballot_announcement" )),
688+ ballot_issue_danger = bool (prev_state .slug in ['ad-eval' , 'lc' ]),
671689 ballot_writeup_form = form ,
672690 need_intended_status = need_intended_status ,
673691 ))
0 commit comments