Talks generate schedule.ics calendar
This commit is contained in:
parent
aceb09d1c9
commit
83b581f3b7
2 changed files with 59 additions and 3 deletions
|
@ -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):
|
||||
|
|
1
talks/meta.yaml
Normal file
1
talks/meta.yaml
Normal file
|
@ -0,0 +1 @@
|
|||
startdate: 2017-06-15
|
Loading…
Reference in a new issue