From e8f06b59aa8921347df923b031006d4ca3a1c92a Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Fri, 1 Jan 2021 22:58:06 +0100
Subject: [PATCH] =?UTF-8?q?mo.util:=20die=20a=20parsov=C3=A1n=C3=AD=20k?=
 =?UTF-8?q?=C3=B3d=C5=AF=20kol?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Kódy kol možná patří do mo.db, ale mám pocit, že se z toho už stává
ošklivé skladiště.
---
 mo/util.py | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/mo/util.py b/mo/util.py
index 2a817c45..6a021e24 100644
--- a/mo/util.py
+++ b/mo/util.py
@@ -1,12 +1,13 @@
 # Různé
 
+from dataclasses import dataclass
 import datetime
 import email.message
 import email.headerregistry
 import re
-from sqlalchemy.orm import joinedload
 import subprocess
-from typing import Any, Optional
+import sys
+from typing import Any, Optional, Noreturn
 import textwrap
 
 import mo.db as db
@@ -64,3 +65,30 @@ def send_password_reset_email(user: db.User, link: str):
 
     if sm.returncode != 0:
         raise RuntimeError('Sendmail failed with return code {}'.format(sm.returncode))
+
+
+def die(msg: str) -> Noreturn:
+    print(msg, file=sys.stderr)
+    sys.exit(1)
+
+
+@dataclass
+class RoundCode:
+    year: int
+    cat: str
+    seq: int
+
+    def __str__(self):
+        return f'{self.year}-{self.cat}-{self.seq}'
+
+    @staticmethod
+    def parse(code: str) -> Optional['RoundCode']:
+        m = re.match(r'(\d+)-([A-Z0-9]+)-(\d+)', code)
+        if m:
+            return RoundCode(year=int(m[1]), cat=m[2], seq=int(m[3]))
+        else:
+            return None
+
+
+def get_round_by_code(code: RoundCode) -> Optional[db.Round]:
+    return db.get_session().query(db.Round).filter_by(year=code.year, category=code.cat, seq=code.seq).one_or_none()
-- 
GitLab