From ad9eb25df0a466d286adad9b5f78c5fbd0560911 Mon Sep 17 00:00:00 2001 From: Matthias Bilger Date: Sun, 5 May 2019 18:16:37 +0200 Subject: [PATCH] use db for calendar change checking --- infomentor/informer.py | 36 ++++++++++++++++++++++++------------ infomentor/model.py | 17 +++++++++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/infomentor/informer.py b/infomentor/informer.py index a752aaf..857f677 100755 --- a/infomentor/informer.py +++ b/infomentor/informer.py @@ -4,6 +4,7 @@ import uuid import os import re import dateparser +import hashlib import datetime import math import pushover @@ -241,14 +242,8 @@ class Informer(object): cal = icx.get_named_calendar(cname) if not cal: cal = icx.create_calendar(cname) - calentries = self.im.get_calendar() - known_entries = {} - for calevent in cal.events(): - if calevent.data is None: - continue - uid = re.findall("UID:(.*)", calevent.data)[0] - known_entries[uid] = calevent + calentries = self.im.get_calendar() for entry in calentries: self.logger.debug(entry) uid = "infomentor_{}".format(entry["id"]) @@ -267,13 +262,30 @@ class Informer(object): event.add("dtend", dateparser.parse(entry["end"]).date()) calend.add_component(event) - new_cal_entry = calend.to_ical().decode("utf-8").replace("\r", "") - if uid in known_entries: - if known_entries[uid].data == new_cal_entry: + new_cal_entry = calend.to_ical().replace(b"\r", b"") + new_cal_hash = hashlib.sha1(new_cal_entry).hexdigest() + session = db.get_db() + storedata = { + 'calendar_id': uid, + 'ical': new_cal_entry, + 'hash': new_cal_hash + } + calendarentry = session.query(model.CalendarEntry).filter(model.CalendarEntry.calendar_id == uid) .with_parent(self.user, "calendarentries").one_or_none() + if calendarentry is not None : + if calendarentry.hash == new_cal_hash: self.logger.info("no change for calendar entry {}".format(uid)) continue else: - self.logger.info("update for calendar entry {}".format(uid)) - self.logger.debug(calend.to_ical()) + self.logger.info("update calendar entry {}".format(uid)) + for key, value in storedata.items(): + setattr(calendarentry, key, value) + + else: + self.logger.info("new calendar entry {}".format(uid)) + calendarentry = model.CalendarEntry(**storedata) + + self.user.calendarentries.append(calendarentry) + session.commit() + self.logger.debug(new_cal_entry.decode('utf-8')) cal.add_event(calend.to_ical()) diff --git a/infomentor/model.py b/infomentor/model.py index 770faad..30c79f9 100755 --- a/infomentor/model.py +++ b/infomentor/model.py @@ -32,6 +32,7 @@ class User(ModelBase): wantstatus = Column(Boolean) homeworks = relationship("Homework", back_populates="user") news = relationship("News",back_populates="user") + calendarentries = relationship("CalendarEntry", back_populates="user", uselist=True) def __init__(self, *args, **kwargs): self._setup_cipher() @@ -119,6 +120,22 @@ class News(ModelBase): return "" % ( self.id, self.title) +class CalendarEntry(ModelBase): + '''A News entry''' + __tablename__ = 'calendarentries' + + id = Column(Integer, primary_key=True) + calendar_id = Column(Integer) + title = Column(String) + user_id = Column(Integer, ForeignKey('users.id')) + ical = Column(String) + hash = Column(String) + user = relationship("User", back_populates="calendarentries") + + def __repr__(self): + return "" % ( + self.id, self.title, hash) + class Homework(ModelBase): '''A homework entry''' __tablename__ = 'homework'