From b89b228c96fbf8e5f6758bb46d8a3859cedbfbe1 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sat, 18 Mar 2023 21:01:40 +0100 Subject: [PATCH] =?UTF-8?q?Import=20=C3=BA=C4=8Dastn=C3=ADk=C5=AF=20um?= =?UTF-8?q?=C3=AD=20zakl=C3=A1dat=20nov=C3=A9=20sout=C4=9B=C5=BEe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mo/imports.py | 20 +++++++++++++++++--- mo/web/org_contest.py | 6 +++++- mo/web/templates/org_contestants_import.html | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/mo/imports.py b/mo/imports.py index 46b1e18e..d6f738b6 100644 --- a/mo/imports.py +++ b/mo/imports.py @@ -7,6 +7,7 @@ from sqlalchemy import and_ from sqlalchemy.orm import joinedload, Query from typing import List, Optional, Any, Dict, Type, Union, Tuple +import mo.contests import mo.csv from mo.csv import FileFormat, MissingHeaderError import mo.db as db @@ -27,6 +28,7 @@ class Import: cnt_new_participants: int = 0 cnt_new_participations: int = 0 cnt_new_roles: int = 0 + cnt_new_contests: int = 0 cnt_set_points: int = 0 cnt_add_sols: int = 0 cnt_del_sols: int = 0 @@ -49,6 +51,7 @@ class Import: log_msg_prefix: str log_details: Any allow_change_user_to_org: bool = False # pro Import orgů: je povoleno vyrobit orga z účastníka + allow_create_contests: bool = False # pro Import účastníků: je povoleno zakládat soutěže # Interní: Stav importu place_cache: Dict[str, db.Place] @@ -263,7 +266,16 @@ class Import: return None contest = db.get_session().query(db.Contest).filter_by(round=round, place=oblast).one_or_none() if contest is None: - return self.error('V uvedené oblasti toto kolo neprobíhá') + if self.allow_create_contests: + try: + mo.contests.add_contest(round.master, oblast, reason='import', gatekeeper=self.gatekeeper) + self.cnt_new_contests += 1 + except mo.contests.ContestError as e: + return self.error(str(e)) + # Je jednodušší contest znovu najít, než ho vyhrabat ze zakládání soutěží ve skupině kol + contest = db.get_session().query(db.Contest).filter_by(round=round, place=oblast).one() + else: + return self.error('V uvedené oblasti toto kolo neprobíhá') return contest @@ -468,7 +480,8 @@ class ContestImport(Import): round: db.Round, contest: Optional[db.Contest] = None, only_region: Optional[db.Place] = None, - default_place: Optional[db.Place] = None + default_place: Optional[db.Place] = None, + allow_create_contests: bool = False ): super().__init__(user) self.user = user @@ -476,6 +489,7 @@ class ContestImport(Import): self.contest = contest self.only_region = only_region self.default_place = default_place + self.allow_create_contests = allow_create_contests assert not self.round.is_subround() def import_row(self, r: mo.csv.Row) -> None: @@ -515,7 +529,7 @@ class ContestImport(Import): self.find_or_create_participation(user, contest, misto) def get_after_import_message(self) -> str: - return f'Importováno ({self.cnt_rows} řádků, založeno {self.cnt_new_users} uživatelů, {self.cnt_new_participations} účastí, {self.cnt_new_roles} rolí)' + return f'Importováno ({self.cnt_rows} řádků, založeno {self.cnt_new_users} uživatelů, {self.cnt_new_participations} účastí, {self.cnt_new_contests} soutěží)' @dataclass diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index a49d464b..b11e95aa 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -486,7 +486,7 @@ def org_contest(ct_id: int, site_id: Optional[int] = None): class ContestantImportForm(ImportForm): - pass + allow_create_contests = wtforms.BooleanField("Povolit zakládání nových soutěží") @app.route('/org/contest/c/<int:ct_id>/import-contestant', methods=('GET', 'POST')) @@ -499,6 +499,9 @@ def org_import_user(round_id: Optional[int] = None, hier_id: Optional[int] = Non default_place = contest.place if contest else ctx.hier_place form = ContestantImportForm() + if ctx.contest is not None: + del form.allow_create_contests + imp = None if form.validate_on_submit(): imp = ContestImport( @@ -507,6 +510,7 @@ def org_import_user(round_id: Optional[int] = None, hier_id: Optional[int] = Non contest=contest, only_region=ctx.hier_place, default_place=default_place, + allow_create_contests=form.allow_create_contests.data if form.allow_create_contests is not None else False ) return generic_import_page( form, imp, ctx.url_home(), diff --git a/mo/web/templates/org_contestants_import.html b/mo/web/templates/org_contestants_import.html index 82d27d7e..12da9a29 100644 --- a/mo/web/templates/org_contestants_import.html +++ b/mo/web/templates/org_contestants_import.html @@ -21,4 +21,7 @@ kód oblasti. Nechcete raději importovat do konkrétní oblasti?</em></p> {% block import_form %} + {% if form.allow_create_contests %} + {{ wtf.form_field(form.allow_create_contests) }} + {% endif %} {% endblock %} -- GitLab