diff --git a/ical/Readme.rst b/ical/Readme.rst new file mode 100644 index 0000000..0260a72 --- /dev/null +++ b/ical/Readme.rst @@ -0,0 +1,28 @@ +ical +-------- + +This plugin read the calendar defined in the page metadata : calendar : + +with:: + + :calendar: /path/to/your/ics/file + +Example of code that can be added in page template :: + + + {% if page.calendar %} +
+ {% for vevent in events[page.slug] %} +
{{ vevent.summary }}
+
{{ vevent.description|replace('\n\n', '
') }}
+
{{ vevent.dtstart }}
+
{{ vevent.dtend }}
+ + {% endfor %} +
+ {% endif %} + +this plugins needs icalendar module installed:: + + pip install icalendar + diff --git a/ical/__init__.py b/ical/__init__.py new file mode 100644 index 0000000..8a1352a --- /dev/null +++ b/ical/__init__.py @@ -0,0 +1 @@ +from .ical import * diff --git a/ical/ical.py b/ical/ical.py new file mode 100644 index 0000000..26fdd12 --- /dev/null +++ b/ical/ical.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +""" +ical plugin for Pelican +=========================== + +This plugin parse the calendars defined in pages metadata :calendar: +One calendar per page + +""" + +from icalendar import Calendar, Event +from pelican import signals , utils +import pytz +import datetime +import os.path + +def init_cal(generator): + # initialisation of the dictionnary of calendar + # you can add one calendar per page + calDict = {} + generator.context['events'] = calDict + +def add_ical(generator, metadata): + # check if a calendar is here + if 'calendar' in metadata.keys(): + summ = [] + path = metadata['calendar'] + if not os.path.isabs(path): + path = os.path.abspath(metadata['calendar']) + cal = Calendar.from_ical(open(path,'rb').read()) + for element in cal.walk(): + eventdict = {} + if element.name == "VEVENT": + if element.get('summary') != None: + eventdict['summary'] = element.get('summary') + if element.get('description') != None: + eventdict['description'] = element.get('description') + if element.get('url') != None: + eventdict['url'] = element.get('url') + if element.get('dtstart') != None: + eventdict['dtstart'] = element.get('dtstart').dt + if element.get('dtend') != None: + eventdict['dtend'] = element.get('dtend').dt + summ.append(eventdict) + # the id of the calendar is the slugify name of the page + calId = utils.slugify(metadata['title']) + generator.context['events'][calId] = summ + + +def register(): + signals.pages_generator_init.connect(init_cal) + signals.pages_generate_context.connect(add_ical)