diff --git a/mo/db.py b/mo/db.py index be88ee55cc85b835f68e35bf85f9e9d60a49dfd4..255173c52339adbac10a92ac46fc1955df075da5 100644 --- a/mo/db.py +++ b/mo/db.py @@ -3,6 +3,7 @@ import datetime from enum import Enum as PythonEnum, auto +from mo.util_simple import human_timedelta import re from sqlalchemy import \ Boolean, Column, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint, \ @@ -159,7 +160,7 @@ class RoundState(MOEnum): round_state_names = { - RoundState.preparing: 'příprava', + RoundState.preparing: 'připravuje se', RoundState.running: 'běží', RoundState.grading: 'opravuje se', RoundState.closed: 'ukončeno', @@ -187,6 +188,23 @@ class Round(Base): def round_code(self): return f"{self.year}-{self.category}-{self.seq}" + def has_tasks(self): + return self.tasks_file + + def long_state(self) -> str: + details = "" + if self.state == RoundState.preparing: + if self.ct_tasks_start and self.ct_tasks_start > mo.now: + details = f" – začne {self.ct_tasks_start:%Y-%m-%d %H:%M} ({human_timedelta(self.ct_tasks_start)})" + elif self.state == RoundState.running: + if self.ct_tasks_start and self.ct_tasks_start > mo.now: + details = f" – zadání bude zveřejněno {self.ct_tasks_start:%Y-%m-%d %H:%M} ({human_timedelta(self.ct_tasks_start)})" + elif self.ct_submit_end and self.ct_submit_end < mo.now: + details = f" – odevzdávání skončilo {self.ct_submit_end:%Y-%m-%d %H:%M} ({human_timedelta(self.ct_submit_end)})" + elif self.ct_submit_end: + details = f" – odevzdávejte do {self.ct_submit_end:%Y-%m-%d %H:%M} ({human_timedelta(self.ct_submit_end)})" + return self.state.friendly_name() + details + def task_statement_available(self) -> bool: # Zde jsme raději přepečliví... return (self.state != RoundState.preparing @@ -194,6 +212,13 @@ class Round(Base): and self.ct_tasks_start is not None and mo.now >= self.ct_tasks_start) + def can_submit(self) -> bool: + return ( + self.state == RoundState.running and ( + not self.ct_tasks_start or mo.now >= self.ct_tasks_start + ) + ) + class User(Base): __tablename__ = 'users'