Sei sulla pagina 1di 14

Rückwärtsterminierung und

seine Realisierung in Python


Ulrich Hoffmann
uho@xlerb.de

Donnerstag, 14. Oktober 2010


Überblick

• Was ist Rückwärtsterminierung?


• Elektronische Kalender: iCalendar-Format
• icalendar.py
• Eine interne DSL für icalendar, Fluent Interface
• Rückwärtsdatieren im Einsatz

Donnerstag, 14. Oktober 2010


Rückwärtsterminierung

Donnerstag, 14. Oktober 2010


iCalendar-Format
• RFC 5545
• iCal BEGIN:VCALENDAR
PRODID:-//BusyMac LLC/BusyCal 1.3.3/DE
VERSION:2.0

• .ics
...
BEGIN:VEVENT
DTSTART;TZID=Europe/Berlin:20100914T190000
DTEND;TZID=Europe/Berlin:20100914T235900
SUMMARY:Treffen des Objekt-Stammtisches Kiel
LOCATION:Toppoint e.v.\, Eckernförder Straße 20\, Kiel\, +49 431562136
UID:4B670168-13B7-41E0-B111-D31C11EF41CD
DTSTAMP:20100912T202139Z
LAST-MODIFIED:20100819T095106Z
END:VEVENT

END:VCALENDAR

Donnerstag, 14. Oktober 2010


icalendar.py
http://codespeak.net/icalendar/

• Lesen und Schreiben von iCalendar-Files


from icalendar import Calendar, Event, UTC
from datetime import datetime

cal = Calendar()
cal.add('prodid', '-//My calendar product//mxm.dk//')
cal.add('version', '2.0')

event = Event()
event.add('summary', 'Objekt-Stammtisch')
event.add('dtstart', datetime(2010,9,14,17,0,0,tzinfo=UTC))
event.add('dtend', datetime(2010,9,14,21,59,0,tzinfo=UTC))
event.add('dtstamp', datetime(2010,9,1,0,10,0,tzinfo=UTC))
event['uid'] = '20050115T101010/27346262376@mxm.dk'
event.add('priority', 5)

cal.add_component(event)

f = open('example.ics', 'wb')
f.write(cal.as_string())
f.close()

Donnerstag, 14. Oktober 2010


Was ist schlecht daran?
Geht das besser?
from icalendar import Calendar, Event, UTC
from datetime import datetime

cal = Calendar()
cal.add('prodid', '-//My calendar product//mxm.dk//')
cal.add('version', '2.0')

event = Event()
event.add('summary', 'Objekt-Stammtisch')
event.add('dtstart', datetime(2010,9,14,17,0,0,tzinfo=UTC))
event.add('dtend', datetime(2010,9,14,21,59,0,tzinfo=UTC))
event.add('dtstamp', datetime(2010,9,1,0,10,0,tzinfo=UTC))
event['uid'] = '20050115T101010/27346262376@mxm.dk'
event.add('priority', 5)

cal.add_component(event)

f = open('example.ics', 'wb')
f.write(cal.as_string())
f.close()

Donnerstag, 14. Oktober 2010


Interne DSL für
icalendar
• Unwichtiges weglassen!
# encoding: utf-8

from icalendarDSL import *

Calendar([
Event("Objekt-Stammtisch").at(u"Toppoint, Eckernförder Straße")
.start("2010-09-14T1900").until("2010-09-14T2359")
.url('www.obst-kiel.de').note("Vortragsprogramm: ").priority(5)
.alarm(10*hours)
]).to_file("example.ics")

Donnerstag, 14. Oktober 2010


Fluent Interface
class Event():
def __init__(self, summary):
self.summary=summary
self.allDay=False
self.event=icalendar.Event()
now=datetime.utcnow()
self.event.add('dtstamp', now)
self.event.add('created', now)
self.event.add('summary', summary)
self.event['uid']=uuid.uuid4().hex

def start(self, dt):


if type(dt)==types.StringType:
dt=absolutizeTime(dateutil.parser.parse(dt))
self.event.add('dtstart', dt)
return self

def priority(self, prio):


self.event.add('priority', prio)
return self
...

Donnerstag, 14. Oktober 2010


Fluent Interface
class Calendar:

def __init__(self, components):


self.cal=icalendar.Calendar()
self.cal.add('prodid','-//obst-kiel.de//iCalGen//0.5')
self.cal.add('version','2.0')
map(lambda c: self.cal.add_component(c._component()), components)

def to_file(self, filename):


f=open(filename, 'wb')
f.write(self.cal.as_string())
f.close()
return self

Donnerstag, 14. Oktober 2010


Zeitspannen
Wie gebe ich am besten 10 Stunden an?

• datetime.timedelta(0,0,0,0,0,10,0)
• timedelta(hours=10)
• hours(10) class HourBuilder:

• 10*hours
def __rmul__(self, other):
return timedelta(hours=other)

hour=hours=HourBuilder()

>>> 10*hours
>>> hours.__rmul__(10)
>>> timedelta(hours=10)

Donnerstag, 14. Oktober 2010


Rückwärtsterminierung im Einsatz:
Senatssitzungen

• Termin der Senatssitung wird festgelegt.


• 1 Woche vorher: Einladung verschicken.
• 2 Wochen vorher: Einladungsentwurf intern
verschicken und um Ergänzungen bitten.

Donnerstag, 14. Oktober 2010


Rückwärtsterminierung
def SenatVorbereitung(sitzungstermin, filename):
sitzungstag = sitzungstermin.date()
Calendar([
Event("Senatssitzung")
.start(sitzungstermin).until(sitzungstermin + 90*minutes),

Event(u"Einladung für Senatssitzung versenden")


.all_day( vorherigerWerktag(sitzungstag - 7*days) ).alarm(2*days),

Event(u"Vorläufige Einladung für die Senatssitzung verschicken")


.all_day( vorherigerWerktag(sitzungstag - 14*days)).alarm(1*day)
]).to_file(filename)

>>> calName="senat-vorbereitung.ics"
>>> SenatVorbereitung(UTC(2010,10,13,15,0), calName)

>>> os.system("open "+calName)

Donnerstag, 14. Oktober 2010


Zusammenfassung
• Was ist Rückwärtsterminierung?
• Elektronische Kalender: iCalendar-Format
• icalendar.py
• Eine interne DSL für icalendar, Fluent Interface
• Rückwärtsdatieren im Einsatz
Ausblick:
• DSL für wiederkehrende Termine?

Gibt es Fragen?
Donnerstag, 14. Oktober 2010
vorheriger Werktag?

def vorherigerWerktag(date):
while date.isoweekday() > 5:
date -= 1*day
return date

Donnerstag, 14. Oktober 2010

Potrebbero piacerti anche