61 lines
2 KiB
Python
61 lines
2 KiB
Python
from icalendar import Calendar
|
|
import pytz
|
|
|
|
class Termin(object):
|
|
#keys = ('DTSTAMP', 'DESCRIPTION', 'URL', 'SUMMARY', 'LOCATION', 'DTSTART', 'GEO', 'CLASS', 'CATEGORIES', 'UID')
|
|
keys = ('DTSTAMP', 'DESCRIPTION', 'URL', 'SUMMARY', 'LOCATION', 'DTSTART', 'CLASS', 'CATEGORIES', 'UID')
|
|
|
|
@staticmethod
|
|
def from_entry(entry):
|
|
"""
|
|
baut aus einem iCalender eintrag ein Termin Objekt
|
|
"""
|
|
termin = Termin()
|
|
for key in Termin.keys:
|
|
if key in entry:
|
|
termin.value[key] = entry.decoded(key)
|
|
return termin
|
|
|
|
def __init__(self):
|
|
self.value = {}
|
|
|
|
def get(self, name):
|
|
return self.value[name]
|
|
|
|
def get_local_start_time(self):
|
|
"""
|
|
x.get_local_start_time() -> datum
|
|
|
|
Gibt start Zeitpunkt des begines von Termin x in lokaler Zeit zurueck
|
|
datum ist ein Objekt.
|
|
"""
|
|
datum = self.value["DTSTART"]
|
|
# wenn keine Zeitzone angeben ist, nehme UTC an
|
|
if not datum.tzinfo:
|
|
src_zone = pytz.timezone("Europe/Berlin")
|
|
datum = src_zone.localize(datum)
|
|
# und jetzt umwandeln
|
|
dst_zone = pytz.timezone("Europe/Berlin")
|
|
return datum.astimezone(dst_zone)
|
|
|
|
def __str__(self):
|
|
datum = self.get_local_start_time().strftime("%Y-%m-%d %H:%M")
|
|
if "DESCRIPTION" in self.value:
|
|
return "%s: %s - %s" % (datum, self.value["SUMMARY"], self.value["DESCRIPTION"])
|
|
return "%s: %s" % (datum, self.value["SUMMARY"])
|
|
|
|
def load_from_str(data):
|
|
"""
|
|
load_from_str(data) -> list
|
|
|
|
Konvertiert eine gelesene iCalender Datei in eine nach Datum sortierte Liste von Termin Objekten.
|
|
data is String
|
|
list is a list from Termin objects
|
|
"""
|
|
cal = Calendar.from_ical(data)
|
|
# aus dem ical eine Liste von Termin Objekten bauen
|
|
liste = [Termin.from_entry(entry) for entry in cal.subcomponents]
|
|
# liste nach Datum sortieren
|
|
liste.sort(key=lambda datum: datum.get("DTSTART").timetuple())
|
|
return liste
|