From a3af5b3e1a94e5438e4a46af5719ae963a3a967c Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz> Date: Tue, 5 Oct 2021 13:51:12 +0200 Subject: [PATCH] Db: find_round --- mo/db.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/mo/db.py b/mo/db.py index 2697677f..eb2a5d99 100644 --- a/mo/db.py +++ b/mo/db.py @@ -9,7 +9,7 @@ import re from sqlalchemy import \ Boolean, Column, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint, \ text, func, \ - create_engine, inspect, select + create_engine, inspect, select, or_, and_ from sqlalchemy.engine import Engine from sqlalchemy.orm import relationship, sessionmaker, Session, class_mapper, joinedload, aliased from sqlalchemy.orm.attributes import get_history @@ -318,6 +318,29 @@ class Round(Base): return " ".join(times) +def find_round(year: Optional[int], category: Optional[str], code: str) -> Round: + if not year: + raise mo.CheckError('Neuveden ročník pro nalezení kola') + if not category: + raise mo.CheckError('Neuvedena kategorie pro nalezení kola') + try: + seq: Optional[int] = int(code) + except ValueError: + seq = None + + r = ( + get_session().query(Round) + .filter_by(year=year, category=category) + .filter(or_(Round.code == code, and_(Round.code == "", Round.seq == seq if seq else False))) + .all() + ) + if len(r) < 1: + raise mo.CheckError(f'Kolo {year}-{category}-{seq} nenalezeno') + if len(r) > 1: + raise mo.CheckError(f'Kolo {year}-{category}-{seq} nelze určit jednoznačně') + return r[0] + + class User(Base): __tablename__ = 'users' -- GitLab