1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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())
|