summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2015-02-17 00:34:41 +0100
committerRené 'Necoro' Neumann <necoro@necoro.net>2015-02-17 00:34:41 +0100
commit531a6078095e22bc6346cd2c73c48f624545fbd7 (patch)
treefab692543052deb58a2f033dd9a394eebfcce4c5
downloadmkcal-531a6078095e22bc6346cd2c73c48f624545fbd7.tar.gz
mkcal-531a6078095e22bc6346cd2c73c48f624545fbd7.tar.bz2
mkcal-531a6078095e22bc6346cd2c73c48f624545fbd7.zip
Create script to create an ical holiday calendarHEADmaster
-rwxr-xr-xmkcal.py113
1 files changed, 113 insertions, 0 deletions
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())