102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
"""Database models."""
|
|
|
|
import sqlalchemy
|
|
import sqlalchemy.orm.decl_api
|
|
from sqlalchemy import func
|
|
from sqlalchemy.ext.associationproxy import association_proxy
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.ext.orderinglist import ordering_list
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.schema import Column, ForeignKey
|
|
from sqlalchemy.types import Date, DateTime, Integer, String
|
|
|
|
from .database import session
|
|
|
|
Base: sqlalchemy.orm.decl_api.DeclarativeMeta = declarative_base()
|
|
Base.query = session.query_property()
|
|
|
|
|
|
class TimeStampedModel(Base):
|
|
"""Time stamped model."""
|
|
|
|
__abstract__ = True
|
|
created = Column(DateTime, default=func.now())
|
|
modified = Column(DateTime, default=func.now(), onupdate=func.now())
|
|
|
|
|
|
class Conference(TimeStampedModel):
|
|
"""Conference."""
|
|
|
|
__tablename__ = "conference"
|
|
id = Column(Integer, primary_key=True)
|
|
title = Column(String, nullable=False)
|
|
start = Column(Date)
|
|
end = Column(Date)
|
|
days = Column(Integer)
|
|
timezone = Column(String)
|
|
location = Column(String)
|
|
country = Column(String)
|
|
acronym = Column(String)
|
|
url = Column(String)
|
|
schedule_xml_url = Column(String)
|
|
|
|
|
|
class Event(TimeStampedModel):
|
|
"""Event."""
|
|
|
|
__tablename__ = "event"
|
|
id = Column(Integer, primary_key=True)
|
|
conference_id = Column(Integer, ForeignKey("conference.id"), nullable=False)
|
|
event_date = Column(DateTime)
|
|
day = Column(Integer)
|
|
guid = Column(String)
|
|
start = Column(String)
|
|
duration = Column(String)
|
|
room = Column(String)
|
|
track = Column(String)
|
|
slug = Column(String)
|
|
title = Column(String, nullable=False)
|
|
description = Column(String)
|
|
event_type = Column(String)
|
|
url = Column(String)
|
|
|
|
conference = relationship("Conference", backref="events")
|
|
|
|
people_association = relationship(
|
|
"EventPerson",
|
|
order_by="EventPerson.position",
|
|
back_populates="event",
|
|
collection_class=ordering_list("position"),
|
|
)
|
|
people = association_proxy(
|
|
"people_association",
|
|
"person",
|
|
creator=lambda person: EventPerson(person=person),
|
|
)
|
|
|
|
|
|
class Person(TimeStampedModel):
|
|
"""Person."""
|
|
|
|
__tablename__ = "person"
|
|
id = Column(Integer, primary_key=True)
|
|
name = Column(String)
|
|
wikidata_qid = Column(String)
|
|
gender = Column(String)
|
|
|
|
events_association = relationship("EventPerson", back_populates="person")
|
|
events = association_proxy("event_association", "event")
|
|
|
|
|
|
class EventPerson(Base):
|
|
"""Event person."""
|
|
|
|
__tablename__ = "event_person"
|
|
event_id = Column(Integer, ForeignKey("event.id"), primary_key=True)
|
|
person_id = Column(Integer, ForeignKey("person.id"), primary_key=True)
|
|
position = Column(Integer, nullable=False)
|
|
named_as = Column(String)
|
|
|
|
person = relationship("Person", back_populates="events_association")
|
|
event = relationship("Event", back_populates="people_association")
|