From 3798c8f796809cef8718589b27adc01ba45f7097 Mon Sep 17 00:00:00 2001 From: Massimo Di Pierro Date: Thu, 5 Apr 2012 18:03:55 -0500 Subject: [PATCH] generic.ics --- VERSION | 2 +- applications/welcome/views/generic.ics | 17 ++++++++++ gluon/serializers.py | 47 +++++++++++++++++++------- 3 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 applications/welcome/views/generic.ics diff --git a/VERSION b/VERSION index d1518ec7..9c0abb0c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.7 (2012-04-05 16:57:05) dev +Version 1.99.7 (2012-04-05 18:03:27) dev diff --git a/applications/welcome/views/generic.ics b/applications/welcome/views/generic.ics new file mode 100644 index 00000000..a812bfe2 --- /dev/null +++ b/applications/welcome/views/generic.ics @@ -0,0 +1,17 @@ +{{ +### +# response._vars contains the dictionary returned by the controller action +# Assuming something like: +# +# db.define_table('event', +# Field('title'), +# Field('start_datetime','datetime'), +# Field('stop_datetime','datetime')) +# events = db(db.event).select() +# +# Aor this to work the action must return something like +# +# dict(events=events, title='title',link=URL('action'),timeshift=0) +# +### +from gluon.serializers import ics}}{{=XML(ics(**response._vars))}} diff --git a/gluon/serializers.py b/gluon/serializers.py index 197e43af..ee8501b4 100644 --- a/gluon/serializers.py +++ b/gluon/serializers.py @@ -64,24 +64,47 @@ def json(value,default=custom_json): def csv(value): return '' +def ics(events, title=None, link=None, timeshift=0): + import datetime + title = title or '(unkown)' + if link and not callable(link): + link = lambda item: link +'/%s' % link['id'] + s = 'BEGIN:VCALENDAR' + s += '\nVERSION:2.0' + s += '\nX-WR-CALNAME:%s' % title + s += '\nSUMMARY:%s' % title + s += '\nPRODID:Generated by web2py' + s += '\nCALSCALE:GREGORIAN' + s += '\nMETHOD:PUBLISH' + for item in events: + s += '\nBEGIN:VEVENT' + s += '\nUID:%s' % item['id'] + if link: + s += '\nURL:%s' % link(item) + shift = datetime.timedelta(seconds=3600*timeshift) + start = item['start_datetime']+shift + stop = item['stop_datetime']+shift + s += '\nDTSTART:%s' % start.strftime('%Y%m%dT%H%M%S') + s += '\nDTEND:%s' % stop.strftime('%Y%m%dT%H%M%S') + s += '\nSUMMARY:%s' % item['title'] + s += '\nEND:VEVENT' + s += '\nEND:VCALENDAR' + return s def rss(feed): if not 'entries' in feed and 'items' in feed: feed['entries'] = feed['items'] now=datetime.datetime.now() - rss = rss2.RSS2(title = feed['title'], - link = str(feed['link']), - description = feed['description'], + rss = rss2.RSS2(title = feed.get('title','(notitle)'), + link = feed.get('link',None), + description = feed.get('description',''), lastBuildDate = feed.get('created_on', now), - items = [rss2.RSSItem(\ - title=entry['title'], - link=str(entry['link']), - description=entry['description'], - pubDate=entry.get('created_on', now) - )\ - for entry in feed['entries'] - ] - ) + items = [rss2.RSSItem( + title=entry.get('title','(notitle)'), + link=entry('link',None), + description=entry.get('description',''), + pubDate=entry.get('created_on', now) + ) for entry in feed.get('entries',[])]) return rss2.dumps(rss)