diff options
author | emkael <emkael@tlen.pl> | 2016-02-23 14:01:45 +0100 |
---|---|---|
committer | emkael <emkael@tlen.pl> | 2016-02-23 14:01:45 +0100 |
commit | fb56c9ef1822b2e915f9703f1d697bfb29492f50 (patch) | |
tree | 5cba8ffdf623cd7d35c26c4e07b5324d775bc191 | |
parent | 52bbfbc4af50b7ae0eeb642fbe85005c5a1a59d9 (diff) |
* event import script
-rw-r--r-- | fetch_cals.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/fetch_cals.py b/fetch_cals.py new file mode 100644 index 0000000..73792c7 --- /dev/null +++ b/fetch_cals.py @@ -0,0 +1,82 @@ +import datetime + +import dateutil.parser as dateparser +import ics +import requests +from rcal.db import Session +from rcal.model import Calendar, Entry + + +def update_event_data(db_event, ical_event): + db_event.name = ical_event.name + db_event.location = ical_event.location + db_event.begin_date = ical_event.begin.datetime + db_event.end_date = ical_event.end.datetime + db_event.all_day = ( + (db_event.end_date - db_event.begin_date).seconds % 86400 == 0 + ) and ( + db_event.begin_date.time() == datetime.time.min) + if db_event.all_day: + db_event.end_date = db_event.end_date - datetime.timedelta(days=1) + return db_event + + +def update_event(db_event, ical_event): + update_event_data(db_event, ical_event) + + +def add_event(event, calendar, session): + entry = Entry() + entry.uid = event.uid + entry.calendar = calendar + entry = update_event_data(entry, event) + session.add(entry) + + +def remove_event(event, session): + session.delete(event) + + +def get_last_modification_time(event): + for unused in event.__dict__['_unused']: + if unused.name == 'LAST-MODIFIED': + return dateparser.parse(unused.value) + return None + + +def fetch_calendar(calendar, session): + cal_data = requests.get(calendar.url) + cal_object = ics.Calendar(cal_data.content.decode(cal_data.encoding)) + cal_events = {e.uid: e for e in cal_object.events} + db_events = {e.uid: e for e in calendar.entries} + new_events = [e for u, e in cal_events.iteritems() + if u not in db_events.keys()] + old_events = [e for u, e in db_events.iteritems() + if u not in cal_events.keys()] + mod_events = [{'ics': cal_events[u], 'db': e} + for u, e in db_events.iteritems() if u in cal_events.keys()] + for event in mod_events: + modified_date = get_last_modification_time(event['ics']) + if not modified_date or \ + not calendar.last_updated or \ + modified_date.time() > calendar.last_updated.time(): + update_event(event['db'], event['ics']) + for event in new_events: + add_event(event, calendar, session) + for event in old_events: + remove_event(event, session) + calendar.last_updated = datetime.datetime.now() + + +def main(): + session = Session.create() + + calendars = session.query(Calendar).all() + for calendar in calendars: + fetch_calendar(calendar, session) + + session.commit() + + +if __name__ == '__main__': + main() |