44import datetime
55import StringIO
66from pyquery import PyQuery
7+ from collections import Counter
78
89from django .urls import reverse as urlreverse
910from django .conf import settings
1011
1112import debug # pyflakes:ignore
1213
13- from ietf .doc .factories import IndividualDraftFactory , WgDraftFactory , DocEventFactory
14+ from ietf .doc .factories import IndividualDraftFactory , WgDraftFactory , RgDraftFactory , DocEventFactory
1415from ietf .doc .models import ( Document , DocReminder , DocEvent ,
1516 ConsensusDocEvent , LastCallDocEvent , RelatedDocument , State , TelechatDocEvent ,
1617 WriteupDocEvent , DocRelationshipName )
1718from ietf .doc .utils import get_tags_for_stream_id , create_ballot_if_not_open
1819from ietf .name .models import StreamName , DocTagName
1920from ietf .group .factories import GroupFactory , RoleFactory
20- from ietf .group .models import Group
21+ from ietf .group .models import Group , Role
2122from ietf .person .factories import PersonFactory
2223from ietf .person .models import Person , Email
2324from ietf .meeting .models import Meeting , MeetingTypeName
@@ -419,7 +420,7 @@ def test_start_iesg_process_on_draft(self):
419420 self .assertTrue ('draft-ietf-mars-test2@' in outbox [- 1 ]['To' ])
420421
421422 # Redo, starting in publication requested to make sure WG state is also set
422- draft .unset_state ( 'draft-iesg' )
423+ draft .set_state ( State . objects . get ( type_id = 'draft-iesg' , slug = 'idexists' ) )
423424 draft .set_state (State .objects .get (type = 'draft-stream-ietf' ,slug = 'writeupw' ))
424425 draft .stream = StreamName .objects .get (slug = 'ietf' )
425426 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 +590,7 @@ def test_warn_expirable_drafts(self):
589590 self .assertEqual (len (list (get_soon_to_expire_drafts (14 ))), 0 )
590591
591592 # hack into expirable state
592- draft .unset_state ( " draft-iesg" )
593+ draft .set_state ( State . objects . get ( type_id = ' draft-iesg' , slug = 'idexists' ) )
593594 draft .expires = datetime .datetime .now () + datetime .timedelta (days = 10 )
594595 draft .save_with_history ([DocEvent .objects .create (doc = draft , rev = draft .rev , type = "changed_document" , by = Person .objects .get (user__username = "secretary" ), desc = "Test" )])
595596
@@ -616,7 +617,7 @@ def test_expire_drafts(self):
616617 self .assertEqual (len (list (get_expired_drafts ())), 0 )
617618
618619 # hack into expirable state
619- draft .unset_state ( " draft-iesg" )
620+ draft .set_state ( State . objects . get ( type_id = ' draft-iesg' , slug = 'idexists' ) )
620621 draft .expires = datetime .datetime .now ()
621622 draft .save_with_history ([DocEvent .objects .create (doc = draft , rev = draft .rev , type = "changed_document" , by = Person .objects .get (user__username = "secretary" ), desc = "Test" )])
622623
@@ -1110,21 +1111,21 @@ def test_cancel_submission(self):
11101111 url = urlreverse ('ietf.doc.views_draft.to_iesg' , kwargs = dict (name = self .docname ))
11111112 self .client .login (username = "marschairman" , password = "marschairman+password" )
11121113
1113- r = self .client .post (url , dict (cancel = "1" ))
1114+ r = self .client .post (url , dict (cancel = "1" ))
11141115 self .assertEqual (r .status_code , 302 )
11151116
11161117 doc = Document .objects .get (name = self .docname )
1117- self .assertTrue (doc .get_state ('draft-iesg' )== None )
1118+ self .assertEqual (doc .get_state_slug ('draft-iesg' ), 'idexists' )
11181119
11191120 def test_confirm_submission (self ):
11201121 url = urlreverse ('ietf.doc.views_draft.to_iesg' , kwargs = dict (name = self .docname ))
11211122 self .client .login (username = "marschairman" , password = "marschairman+password" )
11221123
11231124 doc = Document .objects .get (name = self .docname )
1124- docevent_count_pre = doc .docevent_set .count ( )
1125+ docevents_pre = set ( doc .docevent_set .all () )
11251126 mailbox_before = len (outbox )
11261127
1127- r = self .client .post (url , dict (confirm = "1" ))
1128+ r = self .client .post (url , dict (confirm = "1" ))
11281129 self .assertEqual (r .status_code , 302 )
11291130
11301131 doc = Document .objects .get (name = self .docname )
@@ -1136,7 +1137,12 @@ def test_confirm_submission(self):
11361137 # checks whether the setup document had an ad or not.
11371138 self .assertTrue (doc .ad != None )
11381139
1139- self .assertTrue (doc .docevent_set .count () != docevent_count_pre )
1140+ new_docevents = set (doc .docevent_set .all ()) - docevents_pre
1141+ self .assertEqual (len (new_docevents ),3 )
1142+ new_docevent_type_count = Counter ([e .type for e in new_docevents ])
1143+ self .assertEqual (new_docevent_type_count ['changed_state' ],2 )
1144+ self .assertEqual (new_docevent_type_count ['started_iesg_process' ],1 )
1145+
11401146 self .assertEqual (len (outbox ), mailbox_before + 1 )
11411147 self .assertTrue ("Publication has been requested" in outbox [- 1 ]['Subject' ])
11421148 self .assertTrue ("aread@" in outbox [- 1 ]['To' ])
@@ -1180,6 +1186,88 @@ def test_request_publication(self):
11801186
11811187 self .assertTrue ("Document Action" in draft .message_set .order_by ("-time" )[0 ].subject )
11821188
1189+ class ReleaseDraftTests (TestCase ):
1190+ def test_release_wg_draft (self ):
1191+ chair_role = RoleFactory (group__type_id = 'wg' ,name_id = 'chair' )
1192+ draft = WgDraftFactory (group = chair_role .group )
1193+ draft .tags .set (DocTagName .objects .filter (slug__in = ('sh-f-up' ,'w-merge' )))
1194+ other_chair_role = RoleFactory (group__type_id = 'wg' ,name_id = 'chair' )
1195+
1196+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1197+
1198+ r = self .client .get (url )
1199+ self .assertEqual (r .status_code , 302 ) # redirect to login
1200+
1201+ self .client .login (username = other_chair_role .person .user .username ,password = other_chair_role .person .user .username + "+password" )
1202+ r = self .client .get (url )
1203+ self .assertEqual (r .status_code , 403 )
1204+
1205+ self .client .logout ()
1206+ self .client .login (username = chair_role .person .user .username , password = chair_role .person .user .username + "+password" )
1207+ r = self .client .get (url )
1208+ self .assertEqual (r .status_code , 200 )
1209+
1210+ events_before = list (draft .docevent_set .all ())
1211+ empty_outbox ()
1212+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1213+ self .assertEqual (r .status_code , 302 )
1214+ draft = Document .objects .get (pk = draft .pk )
1215+ self .assertEqual (draft .stream , None )
1216+ self .assertEqual (draft .group .type_id , "individ" )
1217+ self .assertFalse (draft .get_state ('draft-stream-ietf' ))
1218+ self .assertEqual (len (outbox ),3 )
1219+ subjects = [msg ["Subject" ] for msg in outbox ]
1220+ cat_subjects = "" .join (subjects )
1221+ self .assertIn ("Tags changed" , cat_subjects )
1222+ self .assertIn ("State Update" , cat_subjects )
1223+ self .assertIn ("Stream Change" , cat_subjects )
1224+ descs = sorted ([event .desc for event in set (list (draft .docevent_set .all ())) - set (events_before )])
1225+ self .assertEqual ("Changed stream to <b>None</b> from IETF" ,descs [0 ])
1226+ self .assertEqual ("Here are some comments" ,descs [1 ])
1227+ self .assertEqual ("State changed to <b>None</b> from WG Document" ,descs [2 ])
1228+ self .assertEqual ("Tags Awaiting Merge with Other Document, Document Shepherd Followup cleared." ,descs [3 ])
1229+
1230+ def test_release_rg_draft (self ):
1231+ chair_role = RoleFactory (group__type_id = 'rg' ,name_id = 'chair' )
1232+ draft = RgDraftFactory (group = chair_role .group )
1233+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1234+ self .client .login (username = chair_role .person .user .username , password = chair_role .person .user .username + "+password" )
1235+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1236+ self .assertEqual (r .status_code , 302 )
1237+ draft = Document .objects .get (pk = draft .pk )
1238+ self .assertEqual (draft .stream , None )
1239+ self .assertEqual (draft .group .type_id , "individ" )
1240+ self .assertFalse (draft .get_state ('draft-stream-irtf' ))
1241+
1242+ def test_release_ise_draft (self ):
1243+ ise = Role .objects .get (name_id = 'chair' , group__acronym = 'ise' )
1244+ draft = IndividualDraftFactory (stream_id = 'ise' )
1245+ draft .set_state (State .objects .get (type_id = 'draft-stream-ise' ,slug = 'ise-rev' ))
1246+ draft .tags .set (DocTagName .objects .filter (slug = 'w-dep' ))
1247+ url = urlreverse ('ietf.doc.views_draft.release_draft' , kwargs = dict (name = draft .name ))
1248+
1249+ self .client .login (username = ise .person .user .username , password = ise .person .user .username + '+password' )
1250+
1251+ events_before = list (draft .docevent_set .all ())
1252+ empty_outbox ()
1253+ r = self .client .post (url ,{"comment" : "Here are some comments" })
1254+ self .assertEqual (r .status_code , 302 )
1255+ draft = Document .objects .get (pk = draft .pk )
1256+ self .assertEqual (draft .stream , None )
1257+ self .assertEqual (draft .group .type_id , "individ" )
1258+ self .assertFalse (draft .get_state ('draft-stream-ise' ))
1259+ self .assertEqual (len (outbox ),3 )
1260+ subjects = [msg ["Subject" ] for msg in outbox ]
1261+ cat_subjects = "" .join (subjects )
1262+ self .assertIn ("Tags changed" , cat_subjects )
1263+ self .assertIn ("State Update" , cat_subjects )
1264+ self .assertIn ("Stream Change" , cat_subjects )
1265+ descs = sorted ([event .desc for event in set (list (draft .docevent_set .all ())) - set (events_before )])
1266+ self .assertEqual ("Changed stream to <b>None</b> from ISE" ,descs [0 ])
1267+ self .assertEqual ("Here are some comments" ,descs [1 ])
1268+ self .assertEqual ("State changed to <b>None</b> from In ISE Review" ,descs [2 ])
1269+ self .assertEqual ("Tag Waiting for Dependency on Other Document cleared." ,descs [3 ])
1270+
11831271class AdoptDraftTests (TestCase ):
11841272 def test_adopt_document (self ):
11851273 RoleFactory (group__acronym = 'mars' ,group__list_email = 'mars-wg@ietf.org' ,person__user__username = 'marschairman' ,name_id = 'chair' )
0 commit comments