summaryrefslogtreecommitdiff
path: root/mkcal.py
blob: 53a4523654a1321c9badeedcd69459dc8324996a (plain)
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())