diff --git a/mo/db.py b/mo/db.py index 2697677feae44a0474e43fdab5affe609f089a5e..eb2a5d9973a49187d274e17fd59d5d4f574f5d91 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'