diff options
-rw-r--r-- | rcal/model.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/rcal/model.py b/rcal/model.py new file mode 100644 index 0000000..014476e --- /dev/null +++ b/rcal/model.py @@ -0,0 +1,91 @@ +from sqlalchemy import Column, ForeignKey, Table +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import backref, relationship, sessionmaker +from sqlalchemy.types import Boolean, Date, Float, Integer, String + +Base = declarative_base() + +class Calendar(Base): + __tablename__ = 'calendars' + + uid = Column(String(255), primary_key=True) + url = Column(String(255)) + name = Column(String(255), index=True) + website = Column(String(255)) + visible = Column(Boolean, index=True) + + _category = Column( + Integer, + ForeignKey( + 'categories.id', + onupdate='CASCADE', + ondelete='SET NULL')) + category = relationship( + 'Category', + back_populates='calendars', + order_by='Calendar.name') + + entries = relationship( + 'Entry', + back_populates='calendar', + cascade="all", + passive_deletes=True, + order_by='Entry.begin_date') + + @staticmethod + def fetch(uid, session, name=None, url=None): + calendar = session.query(Calendar).filter(Calendar.uid == uid).first() + if not calendar: + calendar = Calendar() + calendar.uid = uid + session.add(calendar) + if name: + calendar.name = name + if url: + calendar.url = url + return calendar + +class Entry(Base): + __tablename__ = 'entries' + + id = Column(Integer, primary_key=True) + uid = Column(String(255), index=True, unique=True) + begin_date = Column(Date, index=True) + end_date = Column(Date) + all_day = Column(Boolean) + name = Column(String(255)) + location = Column(String(255)) + + _calendar = Column( + String(255), + ForeignKey( + 'calendars.uid', + onupdate='CASCADE', + ondelete='CASCADE')) + calendar = relationship( + 'Calendar', + back_populates='entries', + order_by='Entry.begin_date') + + @staticmethod + def fetch(uid, session): + entry = session.query(Entry).filter(Entry.uid == uid).first() + if not entry: + entry = Entry() + session.add(entry) + return entry + +class Category(Base): + __tablename__ = 'categories' + + id = Column(Integer, primary_key=True) + name = Column(String(255)) + + calendars = relationship( + 'Calendar', + back_populates='category', + cascade="all", + passive_deletes=True, + order_by='Calendar.name') + +__all__ = ['Calendar', 'Entry', 'Category'] |