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 Parameter(BaseModel): group = ForeignKeyField(ParameterGroup, backref="parameters") key = CharField() value = CharField() class Meta: primary_key = CompositeKey("group", "key")
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 Person(ObraModel): """ A person who participated in a race. """ id = IntegerField(verbose_name='Person ID', primary_key=True) first_name = CharField(verbose_name='First Name') last_name = CharField(verbose_name='Last Name') team_name = CharField(verbose_name='Team Name', default='')
class Series(ObraModel): """ An OBRA race series spanning multiple events over more than one day. """ id = IntegerField(verbose_name='Series ID', primary_key=True) name = CharField(verbose_name='Series Name') year = IntegerField(verbose_name='Series Year') dates = CharField(verbose_name='Series Months/Days')
class Node(BaseModel): hostname = CharField(primary_key=True) platform = CharField(null=True) arch = CharField(null=True) python = CharField(null=True) cpu = CharField(null=True) cpu_count = IntegerField(null=True) cpu_min_freq = FloatField(null=True) cpu_max_freq = FloatField(null=True) mem_total = IntegerField(null=True) mem_available = IntegerField(null=True) swap_total = IntegerField(null=True) swap_available = IntegerField(null=True)
class Step(BasePlugin): RUN = "run" ANALYSIS = "analysis" CATEGORY_CHOICES = ((RUN, "Single run step"), (ANALYSIS, "Analysis step")) category = CharField(choices=CATEGORY_CHOICES, 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 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 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 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 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 Tool(BaseModel): module = CharField(primary_key=True) name = CharField() version = CharField(null=True)
class BasePlugin(BaseModel): module = CharField(index=True) config = TextField()
class ParameterGroup(BaseModel): name = CharField() tool = ForeignKeyField(Tool, backref="parameter_groups") class Meta: indexes = ((("name", "tool"), True), )
class Tool(BaseModel): module = CharField() name = CharField(primary_key=True)
class Task(BaseModel): group = ForeignKeyField(TaskGroup, backref="tasks") path = CharField(primary_key=True)
class TaskGroup(BaseModel): name = CharField(primary_key=True)
class Limit(BaseModel): key = CharField(max_length=32, primary_key=True) value = CharField()