diff --git a/mo/imports.py b/mo/imports.py index 46b1e18e0f27f35de4e2d7ac1f8d4dc4d8ba6023..d6f738b67137f2b1a36b4c6b078ee2d0697f0d29 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 a49d464b264ca4dccf666716eb3014ccf2bdb35c..b11e95aab161b94a356b5c7b251bc27f8a184535 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 82d27d7e2ca53cd63d8e6955d6f3194cd89863e4..12da9a298e1bcc23d41511e8a8828353f8066980 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 %}