@@ -173,17 +173,18 @@ def edit_material(request, name=None, acronym=None, action=None, doc_type=None):
173173 'doc_name' : doc .name if doc else "" ,
174174 })
175175
176- class MaterialPresentationForm (forms .Form ):
176+ class MaterialVersionForm (forms .Form ):
177177
178- sesspres = forms .MultipleChoiceField (required = False ,widget = forms .CheckboxSelectMultiple ,label = 'Place this document on the agenda for the selected sessions' )
178+ version = forms .ChoiceField (required = False ,
179+ label = 'Which version of this document will be presented at this session' )
179180
180- def __init__ (self ,* args ,** kwargs ):
181+ def __init__ (self , * args , ** kwargs ):
181182 choices = kwargs .pop ('choices' )
182- super (MaterialPresentationForm ,self ).__init__ (* args ,** kwargs )
183- self .fields ['sesspres ' ].choices = choices
183+ super (MaterialVersionForm ,self ).__init__ (* args ,** kwargs )
184+ self .fields ['version ' ].choices = choices
184185
185186@login_required
186- def material_presentations (request , name ):
187+ def material_presentations (request , name , acronym = None , date = None , seq = None , week_day = None ):
187188
188189 doc = get_object_or_404 (Document , name = name )
189190 if not (doc .type_id == 'slides' and doc .get_state ('slides' ).slug == 'active' ):
@@ -197,31 +198,93 @@ def material_presentations(request, name):
197198 # This motif is also in Document.future_presentations - it would be nice to consolodate it somehow
198199 candidate_sessions = Session .objects .filter (meeting__date__gte = datetime .date .today ()- datetime .timedelta (days = 15 ))
199200 refined_candidates = [ sess for sess in candidate_sessions if sess .meeting .end_date ()>= datetime .date .today ()]
201+
202+ if acronym :
203+ refined_candidates = [ sess for sess in refined_candidates if sess .group .acronym == acronym ]
204+
205+ if date :
206+ if len (date )== 15 :
207+ start = datetime .datetime .strptime (date ,"%Y-%m-%d-%H%M" )
208+ refined_candidates = [ sess for sess in refined_candidates if sess .scheduledsession_set .filter (schedule = sess .meeting .agenda ,timeslot__time = start ) ]
209+ else :
210+ start = datetime .datetime .strptime (date ,"%Y-%m-%d" ).date ()
211+ end = start + datetime .timedelta (days = 1 )
212+ refined_candidates = [ sess for sess in refined_candidates if sess .scheduledsession_set .filter (schedule = sess .meeting .agenda ,timeslot__time__range = (start ,end )) ]
213+
214+ if week_day :
215+ try :
216+ dow = ['sun' ,'mon' ,'tue' ,'wed' ,'thu' ,'fri' ,'sat' ].index (week_day .lower ()[:3 ]) + 1
217+ except ValueError :
218+ raise Http404
219+ refined_candidates = [ sess for sess in refined_candidates if sess .scheduledsession_set .filter (schedule = sess .meeting .agenda ,timeslot__time__week_day = dow ) ]
220+
200221 changeable_sessions = [ sess for sess in refined_candidates if can_manage_materials (request .user , sess .group ) ]
222+
223+ if not changeable_sessions :
224+ raise Http404
225+
201226 for sess in changeable_sessions :
202- sess .has_presentation = sess .sessionpresentation_set .filter (document = doc )
203- sorted_sessions = sorted (changeable_sessions ,key = lambda x :'%s%s%s' % ('0' if x .has_presentation else '1' ,x .meeting ,x .short_name ))
227+ sess .has_presentation = bool (sess .sessionpresentation_set .filter (document = doc ))
228+ if sess .has_presentation :
229+ sess .version = sess .sessionpresentation_set .get (document = doc ).rev
230+
231+ # Since Python 2.2 sorts are stable, so this series results in a list sorted first by whether
232+ # the session has any presentations, then by the meeting 'number', then by session's group
233+ # acronym, then by scheduled time (or the time of the session request if the session isn't
234+ # scheduled).
235+
236+ def time_sort_key (session ):
237+ official_sessions = session .scheduledsession_set .filter (schedule = session .meeting .agenda )
238+ if official_sessions :
239+ return official_sessions .first ().timeslot .time
240+ else :
241+ return session .requested
242+
243+ time_sorted = sorted (changeable_sessions ,key = time_sort_key )
244+ acronym_sorted = sorted (time_sorted ,key = lambda x : x .group .acronym )
245+ meeting_sorted = sorted (acronym_sorted ,key = lambda x : x .meeting .number )
246+ sorted_sessions = sorted (meeting_sorted ,key = lambda x : '0' if x .has_presentation else '1' )
247+
248+ if seq :
249+ iseq = int (seq ) - 1
250+ if not iseq in range (0 ,len (sorted_sessions )):
251+ raise Http404
252+ else :
253+ sorted_sessions = [sorted_sessions [iseq ]]
254+
255+ for index ,session in enumerate (sorted_sessions ):
256+ session .sequence = index + 1
257+
258+ if len (sorted_sessions )== 1 :
259+ session = sorted_sessions [0 ]
260+ choices = [('notpresented' ,'Not Presented' )]
261+ choices .extend ([(x ,x ) for x in doc .docevent_set .filter (type = 'new_revision' ).values_list ('newrevisiondocevent__rev' ,flat = True )])
262+ initial = {'version' : session .version if hasattr (session ,'version' ) else 'notpresented' }
263+
264+ if request .method == 'POST' :
265+ form = MaterialVersionForm (request .POST ,choices = choices )
266+ if form .is_valid ():
267+ if request .POST .get ("action" , "" ) == "Save" :
268+ new_selection = form .cleaned_data ['version' ]
269+ if initial ['version' ] != new_selection :
270+ if initial ['version' ] == 'notpresented' :
271+ doc .sessionpresentation_set .create (session = session ,rev = new_selection )
272+ elif new_selection == 'notpresented' :
273+ doc .sessionpresentation_set .filter (session = session ).delete ()
274+ else :
275+ doc .sessionpresentation_set .filter (session = session ).update (rev = new_selection )
276+ return redirect ('doc_view' ,name = doc .name )
277+ else :
278+ form = MaterialVersionForm (choices = choices ,initial = initial )
204279
205- choices = [(sess .pk ,'%s: %s' % (sess .meeting ,sess .short_name )) for sess in sorted_sessions ]
206- initial = {'sesspres' : [sess .pk for sess in sorted_sessions if sess .has_presentation ]}
280+ return render (request , 'doc/material/edit_material_presentations.html' , {
281+ 'session' : session ,
282+ 'doc' : doc ,
283+ 'form' : form ,
284+ })
207285
208- if request .method == 'POST' :
209- form = MaterialPresentationForm (request .POST ,choices = choices )
210- if form .is_valid ():
211- print "STUFF" ,request .POST .get ("action" ,"nothing to be gotten" )
212- if request .POST .get ("action" , "" ) == "Save" :
213- new_selections = form .cleaned_data ['sesspres' ]
214- doc .sessionpresentation_set .filter (session_id__in = (set (initial ['sesspres' ])- set (new_selections ))).delete ()
215- for sess_pk in set (new_selections )- set (initial ['sesspres' ]):
216- doc .sessionpresentation_set .create (session_id = sess_pk ,rev = doc .rev )
217- return redirect ('doc_view' ,name = doc .name )
218286 else :
219- form = MaterialPresentationForm (choices = choices ,
220- initial = initial ,
221- )
222-
223- return render (request , 'doc/material/material_presentations.html' , {
224- 'sessions' : sorted_sessions ,
225- 'doc' : doc ,
226- 'form' : form ,
227- })
287+ return render (request , 'doc/material/material_presentations.html' , {
288+ 'sessions' : sorted_sessions ,
289+ 'doc' : doc ,
290+ })
0 commit comments