Skip to content
Snippets Groups Projects
Commit 137d0518 authored by Martin Mareš's avatar Martin Mareš
Browse files

Skripty na ruční registraci do ročníku a soutěže

parent d596a186
Branches
No related tags found
1 merge request!121Testovací prostředí
#!/usr/bin/env python3
import argparse
from typing import Optional
import mo.db as db
import mo.users
import mo.util
from mo.util import die, init_standalone
parser = argparse.ArgumentParser(description='Přihlásí účastníka do soutěže')
parser.add_argument('--email', type=str, help='e-mailová adresa uživatele')
parser.add_argument('--uid', type=int, help='ID uživatele')
parser.add_argument('--round', type=str, required=True, metavar='YY-C-S[p]', help='kód kola')
parser.add_argument('--region', type=str, required=True, help='kód soutěžní oblasti')
parser.add_argument('--site', type=str, help='kód soutěžního místa (default: oblast)')
parser.add_argument('--state', type=str, help='stav účasti (default: active)')
args = parser.parse_args()
init_standalone()
sess = db.get_session()
if args.email and args.uid:
parser.error('--email a --uid nesmí být uvedeny současně')
elif args.email:
user = mo.users.user_by_email(args.email)
elif args.uid:
user = mo.users.user_by_uid(args.uid)
else:
parser.error('Je nutné vybrat uživatele pomocí --email nebo --uid')
if not user:
die("Tento uživatel neexistuje")
round_code = mo.util.RoundCode.parse(args.round)
if round_code is None:
die("Chybná syntaxe kódu kola")
round = mo.util.get_round_by_code(round_code)
if round is None:
die("Kolo s tímto kódem neexistuje!")
if round.is_subround():
die("Nelze přihlašovat do sekundárních kol")
pant = sess.query(db.Participant).filter_by(user=user, year=round.year).first()
if pant is None:
die("Účastník není registrovaný v ročníku")
region = db.get_place_by_code(args.region)
if region is None:
die("Soutěžní oblast neexistuje")
site: Optional[db.Place]
if args.site is None:
site = region
else:
site = db.get_place_by_code(args.site)
if site is None:
die("Soutěžní místo neexistuje")
contest = sess.query(db.Contest).filter_by(round=round, place=region).first()
if contest is None:
die("V této oblasti se nesoutěží")
if sess.query(db.Participation).filter_by(user=user, contest=contest).first() is not None:
die('Uživatel se této soutěže již účastní')
if args.state is None:
state = db.PartState.active
else:
try:
state = db.PartState.coerce(args.state)
except ValueError:
die(f'Neznámý stav účasti {args.state}')
pion = db.Participation(
user=user,
contest=contest,
place=site,
state=state,
)
sess.add(pion)
mo.util.log(
type=db.LogType.participant,
what=user.user_id,
details={'action': 'add-to-contest', 'reason': 'script', 'new': db.row2dict(pion)},
)
sess.commit()
#!/usr/bin/env python3
import argparse
import mo.db as db
import mo.users
import mo.util
from mo.util import die, init_standalone
parser = argparse.ArgumentParser(description='Přihlásí účastníka do ročníku')
parser.add_argument('--email', type=str, help='e-mailová adresa uživatele')
parser.add_argument('--uid', type=int, help='ID uživatele')
parser.add_argument('--year', type=int, required=True, help='ročník MO')
parser.add_argument('--school', type=str, required=True, help='kód školy')
parser.add_argument('--grade', type=str, required=True, help='třída')
parser.add_argument('--birth-year', type=int, required=True, help='rok narození')
args = parser.parse_args()
init_standalone()
sess = db.get_session()
if args.email and args.uid:
parser.error('--email a --uid nesmí být uvedeny současně')
elif args.email:
user = mo.users.user_by_email(args.email)
elif args.uid:
user = mo.users.user_by_uid(args.uid)
else:
parser.error('Je nutné vybrat uživatele pomocí --email nebo --uid')
if not user:
die("Tento uživatel neexistuje")
if user.is_admin or user.is_org:
die("Tento uživatel je organizátor, nelze mu přidávat účast v ročníku")
school_place = db.get_place_by_code(args.school)
if school_place is None:
die("Tato škola neexistuje")
if school_place.type != db.PlaceType.school or school_place.school is None:
die('Toto místo není škola')
try:
grade = mo.users.normalize_grade(args.grade, school_place.school)
except mo.CheckError as e:
die(str(e))
if sess.query(db.Participant).filter_by(user=user, year=args.year).first() is not None:
die('Uživatel se tohoto ročníku již účastní')
pant = db.Participant(
user=user,
year=args.year,
school_place=school_place,
birth_year=args.birth_year,
grade=grade,
)
sess.add(pant)
mo.util.log(
type=db.LogType.participant,
what=user.user_id,
details={'action': 'create-participant', 'reason': 'script', 'new': db.row2dict(pant)},
)
sess.commit()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment