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(): engine = new_engine(None) engine.execute("CREATE DATABASE IF NOT EXISTS sendavailability " "DEFAULT CHARACTER SET utf8mb4 " "DEFAULT COLLATE utf8mb4_general_ci;") 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")