diff --git a/plugins/talks.py b/plugins/talks.py index 8c55b42..b7e5e41 100644 --- a/plugins/talks.py +++ b/plugins/talks.py @@ -10,6 +10,7 @@ import logging import re import datetime import shutil +import time from docutils import nodes from docutils.parsers.rst import directives, Directive @@ -44,6 +45,30 @@ def get_talk_names(): ] +def all_talks(): + return [get_talk_data(tn) for tn in get_talk_names()] + + + +@memoize +def get_global_data(): + fname = os.path.join(TALKS_PATH, 'meta.yaml') + if not os.path.isfile(fname): + return None + with io.open(fname, encoding='utf8') as buf: + try: + data = yaml.load(buf) + except Exception as exc: + logging.exception("Syntax error reading %s; skipping", fname) + return None + if data is None: + return None + if 'startdate' not in data: + logging.error("Missing startdate in global data") + data['startdate'] = datetime.datetime.now() + return data + + @memoize def get_talk_data(talkname): fname = os.path.join(TALKS_PATH, talkname, 'meta.yaml') @@ -72,11 +97,14 @@ def get_talk_data(talkname): logging.warn("Talk <{}> has no `room` field".format(talkname)) if 'time' not in data or 'day' not in data: logging.warn("Talk <{}> has no `time` or `day`".format(talkname)) - if 'time' in data: + if 'day' in data: + data['day'] = get_global_data()['startdate'] + datetime.timedelta(days=data['day']) + if 'time' in data and 'day' in data: timeparts = re.findall(r'\d+', str(data['time'])) if 4 > len(timeparts) > 0: timeparts = [int(p) for p in timeparts] - data['time'] = datetime.time(*timeparts) + data['time'] = datetime.datetime.combine(data['day'], + datetime.time(*timeparts)) else: logging.error("Talk <{}> has malformed `time`".format(talkname)) data['id'] = talkname @@ -123,7 +151,32 @@ class TalkDirective(Directive): format='html') ] -# TODO: TalkGridDirective (griglia completa) + +def talks_to_ics(): + content = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:pelican\n' + for t in all_talks(): + content += talk_to_ics(t) + content += 'END:VCALENDAR\n' + return content + + +def talk_to_ics(talk): + start = talk['time'] + end = start + datetime.timedelta(minutes=talk['duration']) + content = 'BEGIN:VEVENT\n' + content += "UID:%s@%d.hackmeeting.org\n" % (talk['id'], talk['day'].year) + content += "SUMMARY:%s\n" % talk['title'] + content += "DTSTAMP:%s\n" % time.strftime('%Y%m%dT%H%M%SZ', + time.gmtime(float(start.strftime('%s')))) + content += "DTSTART:%s\n" % time.strftime('%Y%m%dT%H%M%SZ', + time.gmtime(float( + start.strftime('%s')))) + content += "DTEND:%s\n" % time.strftime('%Y%m%dT%H%M%SZ', + time.gmtime(float( + end.strftime('%s')))) + content += "LOCATION:%s\n" % talk['room'] + content += 'END:VEVENT\n' + return content class TalksGenerator(generators.Generator): @@ -143,6 +196,8 @@ class TalksGenerator(generators.Generator): if os.path.isdir(outdir): shutil.rmtree(outdir) shutil.copytree(self.talks[talkname]['resources'], outdir) + with open(os.path.join(self.output_path, 'talks.ics'), 'w') as buf: + buf.write(talks_to_ics()) def add_talks_option_defaults(pelican): diff --git a/talks/meta.yaml b/talks/meta.yaml new file mode 100644 index 0000000..ca14fca --- /dev/null +++ b/talks/meta.yaml @@ -0,0 +1 @@ +startdate: 2017-06-15