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())