11import os , datetime , textwrap , json
22
33from django .http import HttpResponseRedirect , HttpResponseNotFound , HttpResponseForbidden , Http404
4- from django .shortcuts import render_to_response , get_object_or_404 , redirect
4+ from django .shortcuts import render_to_response , get_object_or_404 , redirect , render
55from django .core .urlresolvers import reverse as urlreverse
66from django .template import RequestContext
77from django import forms
1212
1313import debug # pyflakes:ignore
1414
15- from ietf .doc .models import ( Document , DocHistory , State , DocEvent , BallotDocEvent ,
16- BallotPositionDocEvent , InitialReviewDocEvent , NewRevisionDocEvent ,
15+ from ietf .doc .models import ( Document , DocAlias , DocHistory , State , DocEvent ,
16+ BallotDocEvent , BallotPositionDocEvent , InitialReviewDocEvent , NewRevisionDocEvent ,
1717 WriteupDocEvent )
1818from ietf .doc .utils import ( add_state_change_event , close_open_ballots ,
1919 create_ballot_if_not_open , get_chartering_type )
2020from ietf .doc .utils_charter import ( historic_milestones_for_charter ,
2121 approved_revision , default_review_text , default_action_text , email_state_changed ,
2222 generate_ballot_writeup , generate_issue_ballot_mail , next_revision ,
23- change_group_state_after_charter_approval , fix_charter_revision_after_approval )
24- from ietf .group .models import ChangeStateGroupEvent , MilestoneGroupEvent
23+ change_group_state_after_charter_approval , fix_charter_revision_after_approval ,
24+ split_charter_name )
25+ from ietf .group .models import Group , ChangeStateGroupEvent , MilestoneGroupEvent
2526from ietf .group .utils import save_group_in_history , save_milestone_in_history , can_manage_group_type
2627from ietf .ietfauth .utils import has_role , role_required
2728from ietf .name .models import GroupStateName
@@ -346,22 +347,31 @@ def save(self, group, rev):
346347 destination .write (self .cleaned_data ['content' ].encode ("utf-8" ))
347348
348349@login_required
349- def submit (request , name = None , option = None ):
350+ def submit (request , name , option = None ):
350351 if not name .startswith ('charter-' ):
351352 raise Http404
352353
353- charter = get_object_or_404 (Document , type = "charter" , name = name )
354- group = charter .group
354+ charter = Document .objects .filter (type = "charter" , name = name ).first ()
355+ if charter :
356+ group = charter .group
357+ charter_canonical_name = charter .canonical_name ()
358+ charter_rev = charter .rev
359+ else :
360+ top_org , group_acronym = split_charter_name (name )
361+ group = get_object_or_404 (Group , acronym = group_acronym )
362+ charter_canonical_name = name
363+ charter_rev = "00-00"
355364
356- if not can_manage_group_type (request .user , group .type_id ):
365+ if not can_manage_group_type (request .user , group .type_id ) or not group . features . has_chartering_process :
357366 return HttpResponseForbidden ("You don't have permission to access this view" )
358367
359- path = os .path .join (settings .CHARTER_PATH , '%s-%s.txt' % (charter .canonical_name (), charter .rev ))
360- not_uploaded_yet = charter .rev .endswith ("-00" ) and not os .path .exists (path )
361368
362- if not_uploaded_yet :
369+ path = os .path .join (settings .CHARTER_PATH , '%s-%s.txt' % (charter_canonical_name , charter_rev ))
370+ not_uploaded_yet = charter_rev .endswith ("-00" ) and not os .path .exists (path )
371+
372+ if not_uploaded_yet or not charter :
363373 # this case is special - we recently chartered or rechartered and have no file yet
364- next_rev = charter . rev
374+ next_rev = charter_rev
365375 else :
366376 # search history for possible collisions with abandoned efforts
367377 prev_revs = list (charter .history_set .order_by ('-time' ).values_list ('rev' , flat = True ))
@@ -375,7 +385,23 @@ def submit(request, name=None, option=None):
375385 # Also save group history so we can search for it
376386 save_group_in_history (group )
377387
378- charter .rev = next_rev
388+ if not charter :
389+ charter = Document .objects .create (
390+ name = name ,
391+ type_id = "charter" ,
392+ title = group .name ,
393+ group = group ,
394+ abstract = group .name ,
395+ rev = next_rev ,
396+ )
397+ DocAlias .objects .create (name = charter .name , document = charter )
398+
399+ charter .set_state (State .objects .get (used = True , type = "charter" , slug = "notrev" ))
400+
401+ group .charter = charter
402+ group .save ()
403+ else :
404+ charter .rev = next_rev
379405
380406 events = []
381407 e = NewRevisionDocEvent (doc = charter , by = request .user .person , type = "new_revision" )
@@ -397,30 +423,30 @@ def submit(request, name=None, option=None):
397423 else :
398424 return redirect ("doc_view" , name = charter .name )
399425 else :
400- init = { "content" : "" }
401- c = charter
426+ init = { "content" : "" }
402427
403- if not_uploaded_yet :
428+ if not_uploaded_yet and charter :
404429 # use text from last approved revision
405430 last_approved = charter .rev .split ("-" )[0 ]
406- h = charter .history_set .filter (rev = last_approved ).order_by ("-time" , "-id" )
431+ h = charter .history_set .filter (rev = last_approved ).order_by ("-time" , "-id" ). first ()
407432 if h :
408- c = h [0 ]
433+ charter_canonical_name = h .canonical_name ()
434+ charter_rev = h .rev
409435
410- filename = os .path .join (settings .CHARTER_PATH , '%s-%s.txt' % (c . canonical_name (), c . rev ))
436+ filename = os .path .join (settings .CHARTER_PATH , '%s-%s.txt' % (charter_canonical_name , charter_rev ))
411437
412438 try :
413439 with open (filename , 'r' ) as f :
414440 init ["content" ] = f .read ()
415441 except IOError :
416442 pass
417443 form = UploadForm (initial = init )
418- return render_to_response ( 'doc/charter/submit.html' ,
419- { 'form' : form ,
420- 'next_rev' : next_rev ,
421- 'group' : group ,
422- 'name' : name } ,
423- context_instance = RequestContext ( request ) )
444+ return render ( request , 'doc/charter/submit.html' , {
445+ 'form' : form ,
446+ 'next_rev' : next_rev ,
447+ 'group' : group ,
448+ 'name' : name ,
449+ } )
424450
425451class AnnouncementTextForm (forms .Form ):
426452 announcement_text = forms .CharField (widget = forms .Textarea , required = True )
0 commit comments