11from collections import OrderedDict
22import copy
3+ import datetime
34
5+ import dateutil .tz
46import jinja2
57
68from naucse .modelutils import Model , YamlProperty , DataProperty , DirProperty
1012from naucse .notebook_util import convert_notebook
1113from pathlib import Path
1214
15+ _TIMEZONE = 'Europe/Prague'
16+
1317
1418class Lesson (Model ):
1519 """An individual lesson stored on naucse"""
@@ -294,10 +298,11 @@ def merge_dict(base, patch):
294298
295299class Session (Model ):
296300 """An ordered collection of materials"""
297- def __init__ (self , root , path , base_course , info , index ):
301+ def __init__ (self , root , path , base_course , info , index , course = None ):
298302 super ().__init__ (root , path )
299303 base_name = info .get ('base' )
300304 self .index = index
305+ self .course = course
301306 if base_name is None :
302307 self .info = info
303308 else :
@@ -314,6 +319,23 @@ def __str__(self):
314319 slug = DataProperty (info )
315320 date = DataProperty (info , default = None )
316321
322+ def _time (self , key , default_time ):
323+ if self .date and default_time :
324+ return datetime .datetime .combine (self .date , default_time )
325+ return None
326+
327+ @reify
328+ def start_time (self ):
329+ if self .course :
330+ return self ._time ('start' , self .course .default_start_time )
331+ return None
332+
333+ @reify
334+ def end_time (self ):
335+ if self .course :
336+ return self ._time ('end' , self .course .default_end_time )
337+ return None
338+
317339 @reify
318340 def materials (self ):
319341 materials = [material (self .root , self .path , s )
@@ -352,7 +374,7 @@ def _get_sessions(course, plan):
352374 result = OrderedDict ()
353375 for index , sess_info in enumerate (plan ):
354376 session = Session (course .root , course .path , course .base_course ,
355- sess_info , index = index )
377+ sess_info , index = index , course = course )
356378 result [session .slug ] = session
357379
358380 sessions = list (result .values ())
@@ -424,6 +446,25 @@ def end_date(self):
424446 return None
425447 return max (dates )
426448
449+ def _default_time (self , key ):
450+ default_time = self .info .get ('default_time' )
451+ if default_time :
452+ time_string = default_time [key ]
453+ hour , minute = time_string .split (':' )
454+ hour = int (hour )
455+ minute = int (minute )
456+ tzinfo = dateutil .tz .gettz (_TIMEZONE )
457+ return datetime .time (hour , minute , tzinfo = tzinfo )
458+ return None
459+
460+ @reify
461+ def default_start_time (self ):
462+ return self ._default_time ('start' )
463+
464+ @reify
465+ def default_end_time (self ):
466+ return self ._default_time ('end' )
467+
427468
428469class RunYear (Model ):
429470 """A year of runs"""
0 commit comments