class Event(ObraModel): """ A single race day - may be standalone or part of a series. """ id = IntegerField(verbose_name='Event ID', primary_key=True) name = CharField(verbose_name='Event Name') discipline = CharField(verbose_name='Event Discipline', index=True) year = IntegerField(verbose_name='Event Year') date = CharField(verbose_name='Event Month/Day') series = ForeignKeyField(verbose_name='Event Series', model=Series, backref='events', on_update='RESTRICT', on_delete='RESTRICT', null=True) parent = ForeignKeyField(verbose_name='Child Events', model='self', backref='children', on_update='RESTRICT', on_delete='RESTRICT', null=True) ignore = BooleanField(verbose_name='Ignore/Hide Event', default=False) @property def discipline_title(self): return self.discipline.replace('_', ' ').title()
class Run(BaseModel): FAILED = -2 CANCELED = -1 PENDING = 0 SUBMITTED = 1 RUNNING = 2 DONE = 3 STATUS_CHOICES = ( (FAILED, "Failed"), (CANCELED, "Canceled"), (PENDING, "Pending"), (SUBMITTED, "Submitted"), (RUNNING, "Running"), (DONE, "Done"), ) id = CharField(null=True, primary_key=True) created_at = DateTimeField(default=datetime.now) tool = ForeignKeyField(Tool, backref="runs") tool_version = CharField(null=True) parameter_group = ForeignKeyField(ParameterGroup, backref="runs") task = ForeignKeyField(Task, backref="runs") status = IntegerField(choices=STATUS_CHOICES, default=PENDING) last_step = ForeignKeyField(Step, null=True) iteration = IntegerField(default=0)
class PendingUpgrade(ObraModel): result = ForeignKeyField(verbose_name='Result with Pending Upgrade', model=Result, backref='pending', on_update='RESTRICT', on_delete='RESTRICT', primary_key=True) upgrade_confirmation = ForeignKeyField( verbose_name='Member Data Confirming Upgrade', model=ObraPersonSnapshot, backref='pending', on_update='RESTRICT', on_delete='RESTRICT') discipline = CharField(verbose_name='Upgrade Discipline', index=True)
class RunStatistic(BaseModel): TIMEOUT = "TLE" MEMOUT = "MEM" RUNTIME_ERR = "RTE" OUTPUT_LIMIT = "OLE" SUCCESS = "OK" VERDICT_CHOICES = ( (TIMEOUT, "Time Limit Exceeded"), (MEMOUT, "Memory Limit Exceeded"), (RUNTIME_ERR, "Runtime Error"), (OUTPUT_LIMIT, "Output Limit Exceeded"), (SUCCESS, "Run Successfully"), ) created_at = DateTimeField(default=datetime.now) run = ForeignKeyField(Run, backref="statistics", on_delete="cascade", primary_key=True) cpu_time = FloatField(help_text="CPU Time (s)", null=True) wall_time = FloatField(help_text="Wall Clock Time (s)", null=True) max_memory = FloatField(help_text="Max Memory Usage (KiB)", null=True) return_code = IntegerField(help_text="Process Return Code", null=True) verdict = CharField(choices=VERDICT_CHOICES, max_length=3, null=True)
class Parameter(BaseModel): group = ForeignKeyField(ParameterGroup, backref="parameters") key = CharField() value = CharField() class Meta: primary_key = CompositeKey("group", "key")
class Result(ObraModel): """ An individual race result - a Person's place in a specific Race. """ id = IntegerField(verbose_name='Result ID', primary_key=True) race = ForeignKeyField(verbose_name='Result Race', model=Race, backref='results', on_update='RESTRICT', on_delete='RESTRICT') person = ForeignKeyField(verbose_name='Result Person', model=Person, backref='results', on_update='RESTRICT', on_delete='RESTRICT', null=True) place = CharField(verbose_name='Place', index=True) time = IntegerField(verbose_name='Time', null=True) laps = IntegerField(verbose_name='Laps', null=True)
class Points(ObraModel): """ Points toward a category upgrade - awarded for a good Result in a Race of a specific size. """ result = ForeignKeyField(verbose_name='Result awarding Upgrade Points', model=Result, backref='points', on_update='RESTRICT', on_delete='RESTRICT', primary_key=True) value = CharField(verbose_name='Points Earned for Result', default='0') notes = CharField(verbose_name='Notes', default='') needs_upgrade = BooleanField(verbose_name='Needs Upgrade', default=False) upgrade_confirmation = ForeignKeyField( verbose_name='Member Data Confirming Upgrade', model=ObraPersonSnapshot, backref='points', null=True) sum_value = IntegerField(verbose_name='Current Points Sum', default=0) sum_categories = JSONField(verbose_name='Current Category', default=[])
class Rank(ObraModel): """ Rank points associated with a Result """ result = ForeignKeyField(verbose_name='Rank from Result', model=Result, backref='rank', on_update='RESTRICT', on_delete='RESTRICT', primary_key=True) value = DecimalField(verbose_name='Rank for Place', decimal_places=2)
class Quality(ObraModel): """ Race Quality figures for a Race """ race = ForeignKeyField(verbose_name='Quality Race', model=Race, backref='quality', on_update='RESTRICT', on_delete='RESTRICT') value = DecimalField(verbose_name='Race Quality', decimal_places=2) points_per_place = DecimalField(verbose_name='Points per Place', decimal_places=2)
class Race(ObraModel): """ A single race at an event, with one or more results. """ id = IntegerField(verbose_name='Race ID', primary_key=True) name = CharField(verbose_name='Race Name', index=True) date = DateField(verbose_name='Race Date') categories = JSONField(verbose_name='Race Categories') starters = IntegerField(verbose_name='Race Starting Field Size', default=0) created = DateTimeField(verbose_name='Results Created') updated = DateTimeField(verbose_name='Results Updated') event = ForeignKeyField(verbose_name='Race Event', model=Event, backref='races', on_update='RESTRICT', on_delete='RESTRICT')
class ObraPersonSnapshot(ObraModel): """ A point in time record of OBRA member data. The OBRA website doesn't make historical data available, so we store a timestamped copy every time we do a lookup. Doesn't help with really old upgrades, but it should be useful going forward. """ id = AutoField(verbose_name='Scrape ID', primary_key=True) date = DateField(verbose_name='Scrape Date') person = ForeignKeyField(verbose_name='Person', model=Person, backref='obra', on_update='RESTRICT', on_delete='RESTRICT') license = IntegerField(verbose_name='License', null=True) mtb_category = IntegerField(verbose_name='MTB Category', default=3) dh_category = IntegerField(verbose_name='DH Category', default=3) ccx_category = IntegerField(verbose_name='CX Category', default=5) road_category = IntegerField(verbose_name='Road Category', default=5) track_category = IntegerField(verbose_name='Track Category', default=5) class Meta: indexes = ((('date', 'person'), True), ) def category_for_discipline(self, discipline): discipline = discipline.replace('mountain_bike', 'mtb') discipline = discipline.replace('short_track', 'mtb') discipline = discipline.replace('cyclocross', 'ccx') discipline = discipline.replace('criterium', 'road') discipline = discipline.replace('time_trial', 'road') discipline = discipline.replace('circuit', 'road') discipline = discipline.replace('gran_fondo', 'road') discipline = discipline.replace('gravel', 'road') discipline = discipline.replace('tour', 'road') discipline = discipline.replace('downhill', 'dh') discipline = discipline.replace('super_d', 'dh') return getattr(self, discipline + '_category')
class Reference(BaseModel): name = TextField() reference_type = TextField(default=None, null=True) character = ForeignKeyField(Character, related_name='references')
class ParameterGroup(BaseModel): name = CharField() tool = ForeignKeyField(Tool, backref="parameter_groups") class Meta: indexes = ((("name", "tool"), True), )
class Task(BaseModel): group = ForeignKeyField(TaskGroup, backref="tasks") path = CharField(primary_key=True)
class SudokuVerdict(BaseModel): created_at = DateTimeField(default=datetime.now) run = ForeignKeyField(Run, backref="sudoku_verdicts", on_delete="cascade") is_valid = BooleanField()
class RunNode(BaseModel): run = ForeignKeyField(Run, backref="run_node", primary_key=True) node = ForeignKeyField(Node, backref="runs")
class SudokuVerdict(BaseModel): run = ForeignKeyField(Run, backref="sudoku_verdicts", on_delete="cascade") is_valid = BooleanField()
class Song(BaseModel): title = TextField() artist = TextField() link = TextField(default=None, null=True) reference = ForeignKeyField(Reference, related_name='songs')