Skip to content
Snippets Groups Projects
Select Git revision
  • 0e78c590f981f3cea39a2aa3d6d00a91266cc373
  • devel default
  • master
  • fo
  • jirka/typing
  • fo-base
  • mj/submit-images
  • jk/issue-96
  • jk/issue-196
  • honza/add-contestant
  • honza/mr7
  • honza/mrf
  • honza/mrd
  • honza/mra
  • honza/mr6
  • honza/submit-images
  • honza/kolo-vs-soutez
  • jh-stress-test-wip
  • shorten-schools
19 results

upgrade-20210712.sql

Blame
  • create-contests 2.04 KiB
    #!/usr/bin/env python3
    
    import argparse
    
    import mo.db as db
    import mo.util
    from mo.util import die, init_standalone
    
    parser = argparse.ArgumentParser(description='Založí soutěže pro dané kolo')
    parser.add_argument(dest='round', type=str, metavar='YY-C-S[p]', help='kód kola')
    parser.add_argument('-n', '--dry-run', default=False, action='store_true', help='pouze ukáže, co by bylo provedeno')
    
    args = parser.parse_args()
    
    init_standalone()
    sess = db.get_session()
    
    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.state != db.RoundState.delegate:
        state = round.state
    else:
        state = db.RoundState.preparing
    
    if round.is_subround():
        # Pokud je to podkolo, kopírujeme soutěže z hlavního kola
        for mc in sess.query(db.Contest).filter_by(round=round.master):
            r = mc.place
            print(f"Zakládám {round.round_code()} pro místo {r.name} (podsoutěž)")
    
            if not args.dry_run:
                c = db.Contest(round=round, place=r, master=mc, state=state)
    
                sess.add(c)
                sess.flush()
    
                mo.util.log(db.LogType.contest, c.contest_id, {
                    'action': 'created',
                })
    
    else:
        regions = sess.query(db.Place).filter_by(level=round.level).all()
        assert regions, "Neexistují žádná místa dané úrovně"
    
        for r in regions:
            if sess.query(db.Contest).filter_by(round=round, place=r).first():
                print(f"{round.round_code()} pro místo {r.name}: již existuje")
            else:
                print(f"{round.round_code()} pro místo {r.name}: zakládám")
                if not args.dry_run:
                    c = db.Contest(round=round, place=r, state=state)
    
                    sess.add(c)
                    sess.flush()
                    c.master = c
    
                    mo.util.log(db.LogType.contest, c.contest_id, {
                        'action': 'created',
                    })
    
    if not args.dry_run:
        sess.commit()