Improvements
This commit is contained in:
parent
77f2baea38
commit
9f3a7995a1
9 changed files with 532 additions and 110 deletions
|
|
@ -9,7 +9,7 @@ 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 sqlalchemy.types import Boolean, Date, DateTime, Integer, String
|
||||
|
||||
from .database import session
|
||||
|
||||
|
|
@ -25,6 +25,18 @@ class TimeStampedModel(Base):
|
|||
modified = Column(DateTime, default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class Series(TimeStampedModel):
|
||||
"""Conference series."""
|
||||
|
||||
__tablename__ = "series"
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String, nullable=False)
|
||||
slug = Column(String, unique=True)
|
||||
wikidata_qid = Column(String, unique=True)
|
||||
|
||||
conferences = relationship("Conference", back_populates="series")
|
||||
|
||||
|
||||
class Conference(TimeStampedModel):
|
||||
"""Conference."""
|
||||
|
||||
|
|
@ -42,6 +54,9 @@ class Conference(TimeStampedModel):
|
|||
schedule_xml_url = Column(String)
|
||||
short_name = Column(String, unique=True)
|
||||
venue_id = Column(Integer, ForeignKey("venue.id"))
|
||||
online = Column(Boolean)
|
||||
wikidata_qid = Column(String, unique=True)
|
||||
series_id = Column(Integer, ForeignKey("series.id"))
|
||||
|
||||
people_detail = relationship(
|
||||
"ConferencePerson", lazy="dynamic", back_populates="conference"
|
||||
|
|
@ -56,6 +71,7 @@ class Conference(TimeStampedModel):
|
|||
)
|
||||
|
||||
venue = relationship("Venue", back_populates="conferences")
|
||||
series = relationship("Series", back_populates="conferences")
|
||||
|
||||
|
||||
class City(TimeStampedModel):
|
||||
|
|
@ -95,6 +111,17 @@ class Country(TimeStampedModel):
|
|||
|
||||
cities = relationship("City", back_populates="country")
|
||||
|
||||
@property
|
||||
def flag(self) -> str:
|
||||
a = ord("A")
|
||||
flag_a = 0x1F1E6
|
||||
char1, char2 = (
|
||||
flag_a + ord(self.alpha2[0]) - a,
|
||||
flag_a + ord(self.alpha2[1]) - a,
|
||||
)
|
||||
|
||||
return chr(char1) + chr(char2)
|
||||
|
||||
|
||||
class ConferencePerson(Base):
|
||||
__tablename__ = "conference_person"
|
||||
|
|
@ -108,6 +135,16 @@ class ConferencePerson(Base):
|
|||
person = relationship("Person", back_populates="conferences_association")
|
||||
conference = relationship("Conference", back_populates="people_detail")
|
||||
|
||||
@property
|
||||
def events(self):
|
||||
return (
|
||||
Event.query.join(EventPerson)
|
||||
.filter(
|
||||
Event.conference == self.conference, EventPerson.person == self.person
|
||||
)
|
||||
.order_by(Event.event_date.desc())
|
||||
)
|
||||
|
||||
|
||||
class Event(TimeStampedModel):
|
||||
"""Event."""
|
||||
|
|
@ -140,7 +177,7 @@ class Event(TimeStampedModel):
|
|||
people = association_proxy(
|
||||
"people_detail",
|
||||
"person",
|
||||
creator=lambda i: EventPerson(person=i[0], named_as=i[1]),
|
||||
creator=lambda i: EventPerson(person=i),
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -162,7 +199,23 @@ class Person(TimeStampedModel):
|
|||
events = association_proxy("events_association", "event")
|
||||
|
||||
conferences_association = relationship("ConferencePerson", back_populates="person")
|
||||
conferences = association_proxy("conference_association", "conference")
|
||||
conferences = association_proxy("conferences_association", "conference")
|
||||
|
||||
@property
|
||||
def conference_count(self):
|
||||
return ConferencePerson.query.filter_by(person_id=self.id).count()
|
||||
|
||||
@property
|
||||
def event_count(self):
|
||||
return EventPerson.query.filter_by(person_id=self.id).count()
|
||||
|
||||
def active_years(self):
|
||||
q = (
|
||||
session.query(func.min(Event.event_date), func.max(Event.event_date))
|
||||
.join(EventPerson)
|
||||
.filter_by(person_id=self.id)
|
||||
)
|
||||
return q.one()
|
||||
|
||||
# photos = relationship("PersonPhoto", back_populates="person")
|
||||
|
||||
|
|
@ -176,6 +229,16 @@ class Person(TimeStampedModel):
|
|||
|
||||
return q
|
||||
|
||||
def conference_by_time(self):
|
||||
q = (
|
||||
session.query(ConferencePerson)
|
||||
.join(Conference)
|
||||
.filter(ConferencePerson.person == self)
|
||||
.order_by(Conference.start.desc())
|
||||
)
|
||||
|
||||
return q
|
||||
|
||||
|
||||
# class PersonPhoto(TimeStampedModel):
|
||||
# """Person photo."""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue