From f1989fe72df0a7cb4394ebe2ab6fe5d8ff408a38 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Tue, 5 Apr 2016 11:26:14 -0300 Subject: Add tabular calendar --- scripts/calendar_plugin2.py | 112 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 scripts/calendar_plugin2.py (limited to 'scripts/calendar_plugin2.py') diff --git a/scripts/calendar_plugin2.py b/scripts/calendar_plugin2.py new file mode 100644 index 0000000..7138655 --- /dev/null +++ b/scripts/calendar_plugin2.py @@ -0,0 +1,112 @@ +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, 'calendar.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 + 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([]) + + week_list = months[-1]['weeks'][-1] + week_list.append({ + 'year': cur_day.year, + 'month': cur_day.month, + 'day': cur_day.day, + '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(self): + return self.template_env.get_template('tabcalendar.j2').render({ + 'months': self.months, + 'events': self.events, + }).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 = self._get_calendar(), + ) + return return_value + +plugin.plugin_manager.register(TabularCalendarPlugin()) -- cgit v1.2.1