From 531a6078095e22bc6346cd2c73c48f624545fbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Tue, 17 Feb 2015 00:34:41 +0100 Subject: Create script to create an ical holiday calendar --- mkcal.py | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100755 mkcal.py diff --git a/mkcal.py b/mkcal.py new file mode 100755 index 0000000..53a4523 --- /dev/null +++ b/mkcal.py @@ -0,0 +1,113 @@ +from dateutil.easter import easter +from dateutil.relativedelta import relativedelta, SU, WE + +from datetime import timedelta, date + +from icalendar import Calendar,Event +from icalendar.prop import vRecur +from uuid import uuid4 + +cal = Calendar() +cal.add('prodid', '-//necoro.eu/MkCal//EN') +cal.add('version', '2.0') + +def days(d): + return timedelta(days=d) + +def event(summary, start, description = None): + e = Event() + e.add('summary', summary) + e.add('dtstart', start) + e.add('dtend', start + days(1)) + e.add('uid', '%s%%40necoro.eu' % uuid4()) + #e.add('transp', 'TRANSPARENT') + #e.add('status', 'CONFIRMED') + + if description is not None: + e.add('description', description) + + cal.add_component(e) + return e + +def recur(*args, **kwargs): + rrule = kwargs.pop('rrule', vRecur(freq = 'yearly')) + e = event(*args, **kwargs) + e.add('rrule', rrule) + return e + +# Einfache Daten +def start (d,m): + return date(2009,m,d) + +recur("Neujahr", start(1,1)) +recur("Heilige Drei Könige", start(6,1), "Nur: BW, BY, ST") +recur("Frauentag", start(8,3)) +recur("Tag der Arbeit", start(1,5)) +recur("Friedensfest", start(8,8), "Nur: Augsburg") +recur("Mariä Himmelfahrt", start(15,8), "Nur: SL, BY (Gemeinden mit überwiegend katholischer Bevölkerung)") +recur("Tag der Deutschen Einheit", start(3,10)) +recur("Reformationstag", start(31,10), "Nur: BB, MV, SN, ST, TH") +recur("Allerheiligen", start(1,11), "Nur: BW, BY, NW, RP, SL") +recur("Nikolaus", start(6,12)) +recur("Heiligabend", start(24,12)) +recur("1. Weihnachtsfeiertag", start(25,12)) +recur("2. Weihnachtsfeiertag", start(26,12)) +recur("Silvester", start(31,12)) + +# Muttertag +# am 10.05.2009, danach jeden 2. So im Mai +recur("Muttertag", start(10,5), rrule = vRecur(freq = 'yearly', bymonth=5, byday='+2SU')) + +# Buß- und Bettag +# am 18.11.2009, danach jeden letzten Mi vor dem 23. Nov +recur("Buß- und Bettag", start(18,11), + rrule = vRecur(freq = 'yearly', + bymonth=11, + byday='WE', + bymonthday=list(range(16,23))), + description = "Nur: SN") + +# Sommer/Winterzeit +recur("Beginn Sommerzeit", date(2014,3,30), + rrule = vRecur(freq = 'yearly', + bymonth=3, + byday='-1SU')) + +recur("Beginn Winterzeit", date(2014,10,26), + rrule = vRecur(freq='yearly', + bymonth=10, + byday='-1SU')) + +# Komplizierte Daten +for yr in range(2009,2026): + # Ostern und verwandte + os = easter(yr) + event("Ostersonntag", os) + + event("Ostermontag", os + days(1)) + event("Karfreitag", os - days(2)) + + event("Christi Himmelfahrt", os + days(39)) + + event("Pfingstsonntag", os + days(49)) + event("Pfingstmontag", os + days(50)) + + event("Fronleichnam", os + days(60), + "Nur: BW, BY, HE, NW, RP, SL, SN (teilw.), TH (teilw.)") + + event("Rosenmontag", os - days(48)) + event("Aschermittwoch", os - days(46)) + + # Weihnachten und verwandte + eadv = date(yr,12,24) + relativedelta(weekday=SU(-4)) + + for i,n in enumerate(["Erster", "Zweiter", "Dritter", "Vierter"]): + adv = eadv + days(7 * i) + event("%s Advent" % n, adv) + + event("Volkstrauertag", eadv - days(14)) + event("Totensonntag", eadv - days(7)) + + +with open('test.ics', 'w+b') as f: + f.write(cal.to_ical()) -- cgit v1.2.3