From 0d9bd1fbcf51226a5d3318c37b8410a5b1bdc706 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz>
Date: Sat, 9 Jan 2021 03:55:54 +0100
Subject: [PATCH] =?UTF-8?q?DB:=20Pomocn=C3=A9=20funkce=20pro=20kontrolu=20?=
 =?UTF-8?q?stavu=20a=20vypisov=C3=A1n=C3=AD=20db.Round?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Spousta z nich operuje s časem. Aby byl referenční čas pro celý request
stejný (a protože mo.db by neměla záviset na Flasku, kde by to šlo
vytáhnout z g.now), tak db.Round očekává nastavení now zvenku přes
set_now(now). Není to úplně elegantní, ale zajistí to stejný čas pro
celý request, i kdyby se zpracovával déle.
---
 mo/db.py | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/mo/db.py b/mo/db.py
index be88ee55..255173c5 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'
-- 
GitLab