Mailspring/internal_packages/quick-schedule/backend/models.py

75 lines
No EOL
2.2 KiB
Python

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, ForeignKey, \
DateTime, Text, Boolean
from sqlalchemy.orm import relationship, backref
from session import new_engine
Base = declarative_base()
def init_db():
Base.metadata.create_all(new_engine())
class Event(Base):
"""
A single event awaiting scheduling. Once a time has been selected by the
user, an email will be sent and this entry deleted.
"""
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
title = Column(String(255))
location = Column(Text())
description = Column(Text())
@property
def organizer(self):
return filter(lambda a: a.is_sender, self.attendees)[0]
class EventTime(Base):
"""
A time range option for a single event. An event can have many times - the
user will choose one to schedule the event. Time ranges are deleted when
the event is deleted.
"""
__tablename__ = 'eventtime'
id = Column(Integer, primary_key=True)
start = Column(DateTime())
end = Column(DateTime())
key = Column(String(255))
event_id = Column(Integer, ForeignKey('event.id'))
event = relationship('Event',
foreign_keys=[event_id],
backref=backref('times', lazy='dynamic'),
lazy='joined',
single_parent=True,
cascade="all, delete-orphan")
class Attendee(Base):
"""
An attendee for a single event. These are not stored normalized, because
they're short-lived and need to be reliably deleted when the event is
deleted.
"""
__tablename__ = 'attendee'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255))
is_sender = Column(Boolean())
event_id = Column(Integer, ForeignKey('event.id'))
event = relationship('Event',
foreign_keys=[event_id],
backref=backref('attendees', lazy='dynamic'),
lazy='joined',
single_parent=True,
cascade="all, delete-orphan")