@@ -317,6 +317,14 @@ def merge_dict(base, patch):
317317 return result
318318
319319
320+ def time_from_string (time_string ):
321+ hour , minute = time_string .split (':' )
322+ hour = int (hour )
323+ minute = int (minute )
324+ tzinfo = dateutil .tz .gettz (_TIMEZONE )
325+ return datetime .time (hour , minute , tzinfo = tzinfo )
326+
327+
320328class Session (Model ):
321329 """An ordered collection of materials"""
322330 def __init__ (self , root , path , base_course , info , index , course = None ):
@@ -341,21 +349,44 @@ def __str__(self):
341349 date = DataProperty (info , default = None )
342350 description = DataProperty (info , default = None )
343351
344- def _time (self , key , default_time ):
345- if self .date and default_time :
346- return datetime .datetime .combine (self .date , default_time )
352+ def _time (self , time ):
353+ if self .date and time :
354+ return datetime .datetime .combine (self .date , time )
355+ return None
356+
357+ def _session_time (self , key ):
358+ sesion_time = self .info .get ('time' )
359+ if sesion_time :
360+ return time_from_string (sesion_time [key ])
347361 return None
348362
363+ @reify
364+ def has_irregular_time (self ):
365+ """True iff the session has its own start or end time, the course has
366+ a default start or end time, and either of those does not match."""
367+
368+ irregular_start = self .course .default_start_time is not None \
369+ and self ._time (self .course .default_start_time ) != self .start_time
370+ irregular_end = self .course .default_end_time is not None \
371+ and self ._time (self .course .default_end_time ) != self .end_time
372+ return irregular_start or irregular_end
373+
349374 @reify
350375 def start_time (self ):
376+ session_time = self ._session_time ('start' )
377+ if session_time :
378+ return self ._time (session_time )
351379 if self .course :
352- return self ._time ('start' , self .course .default_start_time )
380+ return self ._time (self .course .default_start_time )
353381 return None
354382
355383 @reify
356384 def end_time (self ):
385+ session_time = self ._session_time ('end' )
386+ if session_time :
387+ return self ._time (session_time )
357388 if self .course :
358- return self ._time ('end' , self .course .default_end_time )
389+ return self ._time (self .course .default_end_time )
359390 return None
360391
361392 @reify
@@ -471,12 +502,7 @@ def end_date(self):
471502 def _default_time (self , key ):
472503 default_time = self .info .get ('default_time' )
473504 if default_time :
474- time_string = default_time [key ]
475- hour , minute = time_string .split (':' )
476- hour = int (hour )
477- minute = int (minute )
478- tzinfo = dateutil .tz .gettz (_TIMEZONE )
479- return datetime .time (hour , minute , tzinfo = tzinfo )
505+ return time_from_string (default_time [key ])
480506 return None
481507
482508 @reify
0 commit comments