import template import plugin import string import os import locale from datetime import datetime,timedelta,date import jinja2 import json class TabularCalendarPlugin: def __init__(self): calpath = os.path.join(template.path, 'tabcalendar.json') with open(calpath, 'r') as calfile: events = json.load(calfile) for event in events: event['start'] = datetime.strptime(event['start'], '%Y-%m-%dT%H:%M:%S') event['end'] = datetime.strptime(event['end'], '%Y-%m-%dT%H:%M:%S') event['multiday'] = (event['end'] - event['start']) > timedelta(days=1) events = sorted(events, key=lambda x:x['start']) i = 0 for event in events: event['id'] = i i += 1 first = events[0]['start'] last = events[-1]['end'] calendar_start = first - timedelta(days=first.weekday()) if calendar_start.month != first.month: calendar_start = date(first.year, first.month, 1) else: calendar_start = date(calendar_start.year, calendar_start.month, calendar_start.day) calendar_end = last + timedelta(days=6 - last.weekday()) if calendar_end.month != last.month: calendar_end = date(last.year,last.month,last.day) while True: next_end = calendar_end + timedelta(days=1) if next_end.month != calendar_end.month: break calendar_end = next_end else: calendar_end = date(calendar_end.year, calendar_end.month, calendar_end.day) months = [] cur_day = calendar_start active_month = None active_week = None today = date.today() while cur_day <= calendar_end: cur_month = cur_day.month cur_week = cur_day.isocalendar()[1] if cur_month != active_month: months.append({ 'year': cur_day.year, 'month': cur_day.month, 'date': date(cur_day.year, cur_day.month, 1), 'weeks': [[]] }) active_week = cur_week active_month = cur_month if cur_week != active_week: months[-1]['weeks'].append([]) active_week = cur_week week_list = months[-1]['weeks'][-1] week_list.append({ 'year': cur_day.year, 'month': cur_day.month, 'day': cur_day.day, 'today': cur_day == today, 'weekday': cur_day.weekday(), 'events': [] }) event_list = week_list[-1]['events'] day_start = datetime(cur_day.year, cur_day.month, cur_day.day) day_end = day_start + timedelta(days=1) for event in events: if event['start'] >= day_end \ or event['end'] <= day_start: continue event_list.append(event) cur_day += timedelta(days=1) self.months = months self.events = events template_loader = jinja2.FileSystemLoader(searchpath=os.path.join(template.path)) self.template_env = jinja2.Environment(loader=template_loader) locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') def _get_calendar_tabs(self): return self.template_env.get_template('tabcalendar.j2').render({ 'months': self.months, 'events': self.events, 'class': 'expanded' }).encode('utf-8') def _get_calendar_events(self): return self.template_env.get_template('tabcalendar_list.j2').render({ 'months': self.months, 'events': self.events, 'class': 'expanded' }).encode('utf-8') def process_content(self, page_content): return_value = {} for filename, content in page_content.iteritems(): t = string.Template(content) return_value[filename] = t.safe_substitute( tabcalendar_tabs = self._get_calendar_tabs(), tabcalendar_events = self._get_calendar_events(), ) return return_value plugin.plugin_manager.register(TabularCalendarPlugin())