diff options
Diffstat (limited to 'f1elo/model.py')
-rw-r--r-- | f1elo/model.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/f1elo/model.py b/f1elo/model.py new file mode 100644 index 0000000..3133a59 --- /dev/null +++ b/f1elo/model.py @@ -0,0 +1,89 @@ +from sqlalchemy import Column, Table, ForeignKey +from sqlalchemy.types import Date, Float, Integer, String, Boolean +from sqlalchemy.orm import backref, relationship, sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() + +class Driver(Base): + __tablename__ = 'drivers' + + id = Column(Integer, primary_key=True) + driver = Column(String) + country = Column(String) + + rankings = relationship('Ranking', order_by='Ranking.rank_date', back_populates='driver') + + def __repr__(self): + return (u"<%s (#%d)>" % (self.driver, self.id)).encode('utf8') + + def get_ranking(self, rank_date=None): + ranks = self.rankings + if rank_date is not None: + ranks = [r for r in ranks if r.rank_date < rank_date] + if len(ranks): + return ranks[-1] + return None + +driver_entry = Table('driver_entries', Base.metadata, + Column('_driver', Integer, ForeignKey('drivers.id')), + Column('_entry', Integer, ForeignKey('entries.id')), + Column('id', Integer)) + +class Entry(Base): + __tablename__ = 'entries' + + id = Column(Integer, primary_key=True) + result = Column(String) + car_no = Column(String) + result_group = Column(Integer) + _race = Column(Integer, ForeignKey('races.id')) + + race = relationship('Race', back_populates='entries', order_by=result_group) + drivers = relationship('Driver', secondary=driver_entry) + + def __repr__(self): + return ('#%s (%s) %s[%d]' % (self.car_no, ', '.join([driver.__repr__().decode('utf8') for driver in self.drivers]), self.result, self.result_group)).encode('utf8') + +class Race(Base): + __tablename__ = 'races' + + id = Column(Integer, primary_key=True) + race = Column(String) + date = Column(Date) + ranked = Column(Boolean) + + _type = Column(Integer, ForeignKey('race_types.id')) + type = relationship('RaceType', back_populates='races', order_by='Race.date') + entries = relationship('Entry', back_populates='race', order_by='Entry.result_group') + + def __repr__(self): + return ('%s (%s)' % (self.race, self.date)).encode('utf8') + +class RaceType(Base): + __tablename__ = 'race_types' + + id = Column(Integer, primary_key=True) + code = Column(String) + description = Column(String) + + races = relationship('Race', back_populates='type') + + def __repr__(self): + return ('%s (%s)' % (self.description, self.code)).encode('utf8') + +class Ranking(Base): + __tablename__ = 'rankings' + + id = Column(Integer, primary_key=True) + rank_date = Column(Date) + ranking = Column(Float) + + _driver = Column(Integer, ForeignKey('drivers.id')) + driver = relationship('Driver', back_populates='rankings', order_by=rank_date) + + def __repr__(self): + return ("%s: %0.2f (%s)" % (self.driver.__repr__().decode('utf8'), self.ranking, self. rank_date)).encode('utf8') + + +__all__ = ['Driver', 'Entry', 'Ranking', 'Race', 'RaceType'] |