1010
1111import debug # pyflakes:ignore
1212
13- from ietf .doc .factories import IndividualDraftFactory , WgDraftFactory , DocEventFactory
13+ from ietf .doc .factories import IndividualDraftFactory , WgDraftFactory , RgDraftFactory , DocEventFactory
1414from ietf .doc .models import ( Document , DocReminder , DocEvent ,
1515 ConsensusDocEvent , LastCallDocEvent , RelatedDocument , State , TelechatDocEvent ,
1616 WriteupDocEvent , DocRelationshipName )
1717from ietf .doc .utils import get_tags_for_stream_id , create_ballot_if_not_open
1818from ietf .name .models import StreamName , DocTagName
1919from ietf .group .factories import GroupFactory , RoleFactory
20- from ietf .group .models import Group
20+ from ietf .group .models import Group , Role
2121from ietf .person .factories import PersonFactory
2222from ietf .person .models import Person , Email
2323from ietf .meeting .models import Meeting , MeetingTypeName
@@ -419,7 +419,7 @@ def test_start_iesg_process_on_draft(self):
419419 self .assertTrue ('draft-ietf-mars-test2@' in outbox [- 1 ]['To' ])
420420
421421 # Redo, starting in publication requested to make sure WG state is also set
422- draft .unset_state ( 'draft-iesg' )
422+ draft .set_state ( State . objects . get ( type_id = 'draft-iesg' , slug = 'idexists' ) )
423423 draft .set_state (State .objects .get (type = 'draft-stream-ietf' ,slug = 'writeupw' ))
424424 draft .stream = StreamName .objects .get (slug = 'ietf' )
425425 draft .save_with_history ([DocEvent .objects .create (doc = draft , rev = draft .rev , type = "changed_stream" , by = Person .objects .get (user__username = "secretary" ), desc = "Test" )])
@@ -589,7 +589,7 @@ def test_warn_expirable_drafts(self):
589589 self .assertEqual (len (list (get_soon_to_expire_drafts (14 ))), 0 )
590590
591591 # hack into expirable state
592- draft .unset_state ( " draft-iesg" )
592+ draft .set_state ( State . objects . get ( type_id = ' draft-iesg' , slug = 'idexists' ) )
593593 draft .expires = datetime .datetime .now () + datetime .timedelta (days = 10 )
594594 draft .save_with_history ([DocEvent .objects .create (doc = draft , rev = draft .rev , type = "changed_document" , by = Person .objects .get (user__username = "secretary" ), desc = "Test" )])
595595
@@ -616,7 +616,7 @@ def test_expire_drafts(self):
616616 self .assertEqual (len (list (get_expired_drafts ())), 0 )
617617
618618 # hack into expirable state
619- draft .unset_state ( " draft-iesg" )
619+ draft .set_state ( State . objects . get ( type_id = ' draft-iesg' , slug = 'idexists' ) )
620620 draft .expires = datetime .datetime .now ()
621621 draft .save_with_history ([DocEvent .objects .create (doc = draft , rev = draft .rev , type = "changed_document" , by = Person .objects .get (user__username = "secretary" ), desc = "Test" )])
622622
@@ -1114,7 +1114,7 @@ def test_cancel_submission(self):
11141114 self .assertEqual (r .status_code , 302 )
11151115
11161116 doc = Document .objects .get (name = self .docname )
1117- self .assertTrue (doc .get_state ('draft-iesg' )== None )
1117+ self .assertEqual (doc .get_state_slug ('draft-iesg' ), 'idexists' )
11181118
11191119 def test_confirm_submission (self ):
11201120 url = urlreverse ('ietf.doc.views_draft.to_iesg' , kwargs = dict (name = self .docname ))
@@ -1180,6 +1180,88 @@ def test_request_publication(self):
11801180
11811181 self .assertTrue ("Document Action" in draft .message_set .order_by ("-time" )[0 ].subject )
11821182
1183+ class ReleaseDraftTests (TestCase ):
1184+ def test_release_wg_draft (self ):
1185+ chair_role = RoleFactory (group__type_id = 'wg' ,name_id = 'chair' )
1186+ draft = WgDraftFactory (group = chair_role .group )
1187+ draft .tags .set (DocTagName .objects .filter (slug__in = ('sh-f-up' ,'w-merge' )))
1188+ other_chair_role = RoleFactory (group__type_id = 'wg' ,name_id = 'chair' )
1189+
1190+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1191+
1192+ r = self .client .get (url )
1193+ self .assertEqual (r .status_code , 302 ) # redirect to login
1194+
1195+ self .client .login (username = other_chair_role .person .user .username ,password = other_chair_role .person .user .username + "+password" )
1196+ r = self .client .get (url )
1197+ self .assertEqual (r .status_code , 403 )
1198+
1199+ self .client .logout ()
1200+ self .client .login (username = chair_role .person .user .username , password = chair_role .person .user .username + "+password" )
1201+ r = self .client .get (url )
1202+ self .assertEqual (r .status_code , 200 )
1203+
1204+ events_before = list (draft .docevent_set .all ())
1205+ empty_outbox ()
1206+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1207+ self .assertEqual (r .status_code , 302 )
1208+ draft = Document .objects .get (pk = draft .pk )
1209+ self .assertEqual (draft .stream , None )
1210+ self .assertEqual (draft .group .type_id , "individ" )
1211+ self .assertFalse (draft .get_state ('draft-stream-ietf' ))
1212+ self .assertEqual (len (outbox ),3 )
1213+ subjects = [msg ["Subject" ] for msg in outbox ]
1214+ cat_subjects = "" .join (subjects )
1215+ self .assertIn ("Tags changed" , cat_subjects )
1216+ self .assertIn ("State Update" , cat_subjects )
1217+ self .assertIn ("Stream Change" , cat_subjects )
1218+ descs = sorted ([event .desc for event in set (list (draft .docevent_set .all ())) - set (events_before )])
1219+ self .assertEqual ("Changed stream to <b>None</b> from IETF" ,descs [0 ])
1220+ self .assertEqual ("Here are some comments" ,descs [1 ])
1221+ self .assertEqual ("State changed to <b>None</b> from WG Document" ,descs [2 ])
1222+ self .assertEqual ("Tags Awaiting Merge with Other Document, Document Shepherd Followup cleared." ,descs [3 ])
1223+
1224+ def test_release_rg_draft (self ):
1225+ chair_role = RoleFactory (group__type_id = 'rg' ,name_id = 'chair' )
1226+ draft = RgDraftFactory (group = chair_role .group )
1227+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1228+ self .client .login (username = chair_role .person .user .username , password = chair_role .person .user .username + "+password" )
1229+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1230+ self .assertEqual (r .status_code , 302 )
1231+ draft = Document .objects .get (pk = draft .pk )
1232+ self .assertEqual (draft .stream , None )
1233+ self .assertEqual (draft .group .type_id , "individ" )
1234+ self .assertFalse (draft .get_state ('draft-stream-irtf' ))
1235+
1236+ def test_release_ise_draft (self ):
1237+ ise = Role .objects .get (name_id = 'chair' , group__acronym = 'ise' )
1238+ draft = IndividualDraftFactory (stream_id = 'ise' )
1239+ draft .set_state (State .objects .get (type_id = 'draft-stream-ise' ,slug = 'ise-rev' ))
1240+ draft .tags .set (DocTagName .objects .filter (slug = 'w-dep' ))
1241+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1242+
1243+ self .client .login (username = ise .person .user .username , password = ise .person .user .username + '+password' )
1244+
1245+ events_before = list (draft .docevent_set .all ())
1246+ empty_outbox ()
1247+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1248+ self .assertEqual (r .status_code , 302 )
1249+ draft = Document .objects .get (pk = draft .pk )
1250+ self .assertEqual (draft .stream , None )
1251+ self .assertEqual (draft .group .type_id , "individ" )
1252+ self .assertFalse (draft .get_state ('draft-stream-ise' ))
1253+ self .assertEqual (len (outbox ),3 )
1254+ subjects = [msg ["Subject" ] for msg in outbox ]
1255+ cat_subjects = "" .join (subjects )
1256+ self .assertIn ("Tags changed" , cat_subjects )
1257+ self .assertIn ("State Update" , cat_subjects )
1258+ self .assertIn ("Stream Change" , cat_subjects )
1259+ descs = sorted ([event .desc for event in set (list (draft .docevent_set .all ())) - set (events_before )])
1260+ self .assertEqual ("Changed stream to <b>None</b> from ISE" ,descs [0 ])
1261+ self .assertEqual ("Here are some comments" ,descs [1 ])
1262+ self .assertEqual ("State changed to <b>None</b> from In ISE Review" ,descs [2 ])
1263+ self .assertEqual ("Tag Waiting for Dependency on Other Document cleared." ,descs [3 ])
1264+
11831265class AdoptDraftTests (TestCase ):
11841266 def test_adopt_document (self ):
11851267 RoleFactory (group__acronym = 'mars' ,group__list_email = 'mars-wg@ietf.org' ,person__user__username = 'marschairman' ,name_id = 'chair' )
0 commit comments