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'