@@ -1702,7 +1702,7 @@ def api_get_session_materials(request, session_id=None):
17021702
17031703 minutes = session .minutes ()
17041704 slides_actions = []
1705- if can_manage_session_materials (request .user , session .group , session ):
1705+ if can_manage_session_materials (request .user , session .group , session ) or not session . is_material_submission_cutoff () :
17061706 slides_actions .append (
17071707 {
17081708 "label" : "Upload slides" ,
@@ -1712,16 +1712,6 @@ def api_get_session_materials(request, session_id=None):
17121712 ),
17131713 }
17141714 )
1715- elif not session .is_material_submission_cutoff ():
1716- slides_actions .append (
1717- {
1718- "label" : "Propose slides" ,
1719- "url" : reverse (
1720- "ietf.meeting.views.propose_session_slides" ,
1721- kwargs = {"num" : session .meeting .number , "session_id" : session .pk },
1722- ),
1723- }
1724- )
17251715 else :
17261716 pass # no action available if it's past cutoff
17271717
@@ -2920,17 +2910,15 @@ def upload_session_agenda(request, session_id, num):
29202910 })
29212911
29222912
2913+ @login_required
29232914def upload_session_slides (request , session_id , num , name = None ):
29242915 """Upload new or replacement slides for a session
29252916
29262917 If name is None or "", expects a new set of slides. Otherwise, replaces the named slides with a new rev.
29272918 """
29282919 # num is redundant, but we're dragging it along an artifact of where we are in the current URL structure
29292920 session = get_object_or_404 (Session , pk = session_id )
2930- if not session .can_manage_materials (request .user ):
2931- permission_denied (
2932- request , "You don't have permission to upload slides for this session."
2933- )
2921+ can_manage = session .can_manage_materials (request .user )
29342922 if session .is_material_submission_cutoff () and not has_role (
29352923 request .user , "Secretariat"
29362924 ):
@@ -2955,14 +2943,54 @@ def upload_session_slides(request, session_id, num, name=None):
29552943
29562944 if request .method == "POST" :
29572945 form = UploadSlidesForm (
2958- session , show_apply_to_all_checkbox , request .POST , request .FILES
2946+ session , show_apply_to_all_checkbox , can_manage , request .POST , request .FILES
29592947 )
29602948 if form .is_valid ():
29612949 file = request .FILES ["file" ]
29622950 _ , ext = os .path .splitext (file .name )
29632951 apply_to_all = session .type_id == "regular"
29642952 if show_apply_to_all_checkbox :
29652953 apply_to_all = form .cleaned_data ["apply_to_all" ]
2954+ if can_manage :
2955+ approved = form .cleaned_data ["approved" ]
2956+ else :
2957+ approved = False
2958+
2959+ # Propose slides if not auto-approved
2960+ if not approved :
2961+ title = form .cleaned_data ['title' ]
2962+ submission = SlideSubmission .objects .create (session = session , title = title , filename = '' , apply_to_all = apply_to_all , submitter = request .user .person )
2963+
2964+ if session .meeting .type_id == 'ietf' :
2965+ name = 'slides-%s-%s' % (session .meeting .number ,
2966+ session .group .acronym )
2967+ if not apply_to_all :
2968+ name += '-%s' % (session .docname_token (),)
2969+ else :
2970+ name = 'slides-%s-%s' % (session .meeting .number , session .docname_token ())
2971+ name = name + '-' + slugify (title ).replace ('_' , '-' )[:128 ]
2972+ filename = '%s-ss%d%s' % (name , submission .id , ext )
2973+ destination = io .open (os .path .join (settings .SLIDE_STAGING_PATH , filename ),'wb+' )
2974+ for chunk in file .chunks ():
2975+ destination .write (chunk )
2976+ destination .close ()
2977+
2978+ submission .filename = filename
2979+ submission .save ()
2980+
2981+ (to , cc ) = gather_address_lists ('slides_proposed' , group = session .group , proposer = request .user .person ).as_strings ()
2982+ msg_txt = render_to_string ("meeting/slides_proposed.txt" , {
2983+ "to" : to ,
2984+ "cc" : cc ,
2985+ "submission" : submission ,
2986+ "settings" : settings ,
2987+ })
2988+ msg = infer_message (msg_txt )
2989+ msg .by = request .user .person
2990+ msg .save ()
2991+ send_mail_message (request , msg )
2992+ messages .success (request , 'Successfully submitted proposed slides.' )
2993+ return redirect ('ietf.meeting.views.session_details' ,num = num ,acronym = session .group .acronym )
29662994
29672995 # Handle creation / update of the Document (but do not save yet)
29682996 if doc is not None :
@@ -3076,7 +3104,7 @@ def upload_session_slides(request, session_id, num, name=None):
30763104 initial = {}
30773105 if doc is not None :
30783106 initial = {"title" : doc .title }
3079- form = UploadSlidesForm (session , show_apply_to_all_checkbox , initial = initial )
3107+ form = UploadSlidesForm (session , show_apply_to_all_checkbox , can_manage , initial = initial )
30803108
30813109 return render (
30823110 request ,
@@ -3085,77 +3113,12 @@ def upload_session_slides(request, session_id, num, name=None):
30853113 "session" : session ,
30863114 "session_number" : session_number ,
30873115 "slides_sp" : session .presentations .filter (document = doc ).first () if doc else None ,
3116+ "manage" : session .can_manage_materials (request .user ),
30883117 "form" : form ,
30893118 },
30903119 )
30913120
30923121
3093- @login_required
3094- def propose_session_slides (request , session_id , num ):
3095- session = get_object_or_404 (Session ,pk = session_id )
3096- if session .is_material_submission_cutoff () and not has_role (request .user , "Secretariat" ):
3097- permission_denied (request , "The materials cutoff for this session has passed. Contact the secretariat for further action." )
3098-
3099- session_number = None
3100- sessions = get_sessions (session .meeting .number ,session .group .acronym )
3101- show_apply_to_all_checkbox = len (sessions ) > 1 if session .type_id == 'regular' else False
3102- if len (sessions ) > 1 :
3103- session_number = 1 + sessions .index (session )
3104-
3105-
3106- if request .method == 'POST' :
3107- form = UploadSlidesForm (session , show_apply_to_all_checkbox ,request .POST ,request .FILES )
3108- if form .is_valid ():
3109- file = request .FILES ['file' ]
3110- _ , ext = os .path .splitext (file .name )
3111- apply_to_all = session .type_id == 'regular'
3112- if show_apply_to_all_checkbox :
3113- apply_to_all = form .cleaned_data ['apply_to_all' ]
3114- title = form .cleaned_data ['title' ]
3115-
3116- submission = SlideSubmission .objects .create (session = session , title = title , filename = '' , apply_to_all = apply_to_all , submitter = request .user .person )
3117-
3118- if session .meeting .type_id == 'ietf' :
3119- name = 'slides-%s-%s' % (session .meeting .number ,
3120- session .group .acronym )
3121- if not apply_to_all :
3122- name += '-%s' % (session .docname_token (),)
3123- else :
3124- name = 'slides-%s-%s' % (session .meeting .number , session .docname_token ())
3125- name = name + '-' + slugify (title ).replace ('_' , '-' )[:128 ]
3126- filename = '%s-ss%d%s' % (name , submission .id , ext )
3127- destination = io .open (os .path .join (settings .SLIDE_STAGING_PATH , filename ),'wb+' )
3128- for chunk in file .chunks ():
3129- destination .write (chunk )
3130- destination .close ()
3131-
3132- submission .filename = filename
3133- submission .save ()
3134-
3135- (to , cc ) = gather_address_lists ('slides_proposed' , group = session .group , proposer = request .user .person ).as_strings ()
3136- msg_txt = render_to_string ("meeting/slides_proposed.txt" , {
3137- "to" : to ,
3138- "cc" : cc ,
3139- "submission" : submission ,
3140- "settings" : settings ,
3141- })
3142- msg = infer_message (msg_txt )
3143- msg .by = request .user .person
3144- msg .save ()
3145- send_mail_message (request , msg )
3146- messages .success (request , 'Successfully submitted proposed slides.' )
3147- return redirect ('ietf.meeting.views.session_details' ,num = num ,acronym = session .group .acronym )
3148- else :
3149- initial = {}
3150- form = UploadSlidesForm (session , show_apply_to_all_checkbox , initial = initial )
3151-
3152- return render (request , "meeting/propose_session_slides.html" ,
3153- {'session' : session ,
3154- 'session_number' : session_number ,
3155- 'form' : form ,
3156- })
3157-
3158-
31593122def remove_sessionpresentation (request , session_id , num , name ):
31603123 sp = get_object_or_404 (
31613124 SessionPresentation , session_id = session_id , document__name = name
@@ -5072,6 +5035,7 @@ def approve_proposed_slides(request, slidesubmission_id, num):
50725035 "cc" : cc ,
50735036 "submission" : submission ,
50745037 "settings" : settings ,
5038+ "approver" : request .user .person
50755039 })
50765040 send_mail_text (request , to , None , subject , body , cc = cc )
50775041 return redirect ('ietf.meeting.views.session_details' ,num = num ,acronym = acronym )
0 commit comments