diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index bd786672373cc1852ce82c61d64ae0774616605f..758416680e30e01a3886d68702d90c79a2e17ba2 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -240,35 +240,57 @@ class ParticipantAddForm(FlaskForm): email = wtforms.StringField("E-mail", validators=[validators.Required()]) first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()]) last_name = wtforms.StringField("Příjmení", validators=[validators.Required()]) - school_code = wtforms.StringField( - "Kód školy", - description="Viz katalog škol na tomto webu", + school_code = wtforms.StringField("Kód školy", + validators=[validators.Required()], + description="Viz katalog škol na tomto webu") + rocnik = wtforms.StringField( + "Ročník", + description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.", validators=[validators.Required()]) + rok_naroz = wtforms.StringField("Rok narození") + participation_place = wtforms.HiddenField('Soutěžní místo') + save = wtforms.SubmitField("Přidat") + + def get_school_code(self) -> str: + return self.school_code.data + + def get_participation_place(self) -> str: + return '#'+str(self.participation_place.data) + + def set_site(self, site: db.Place): + self.participation_place.data = site.place_id + + def validate_email(form, field): + try: + field.data = mo.users.normalize_email(field.data) + except mo.CheckError as e: + raise wtforms.ValidationError(str(e)) + + + +class ParticipantAddFormWithSite(FlaskForm): + email = wtforms.StringField("E-mail", validators=[validators.Required()]) + first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()]) + last_name = wtforms.StringField("Příjmení", validators=[validators.Required()]) + school_code = wtforms.StringField("Kód školy", + validators=[validators.Required()], + description="Viz katalog škol na tomto webu") rocnik = wtforms.StringField( "Ročník", description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.", validators=[validators.Required()]) rok_naroz = wtforms.StringField("Rok narození") - participation_place = wtforms.SelectField('Soutěžní místo', coerce=int) + participation_place = wtforms.StringField('Soutěžní místo') save = wtforms.SubmitField("Přidat") - def set_contest(self, contest_id: int, site_id: int): - sess = db.get_session() - places = ( - sess.query(db.Place) - .select_from(db.Participation).join(db.Place) - .filter(db.Participation.contest_id == contest_id).all() - ) - if len(places) == 0: - places = ( - sess.query(db.Place) - .select_from(db.Contest).join(db.Place) - .filter(db.Contest.contest_id == contest_id).all() - ) + def get_school_code(self) -> str: + return self.school_code.data - self.participation_place.choices = [(p.place_id, p.name) for p in places] - if site_id: - self.participation_place.data = site_id + def get_participation_place(self) -> str: + return self.participation_place.data + + def set_contest(self, contest: db.Contest): + self.participation_place.description = "Pokud účastník soutěží někde jinde než: "+contest.place.name+". Dozor na soutěžním místě má pak právo odevzdávat za účastníka řešení." def validate_email(form, field): try: @@ -277,6 +299,56 @@ class ParticipantAddForm(FlaskForm): raise wtforms.ValidationError(str(e)) +class ParticipantAddFormWithSchoolSelect(FlaskForm): + email = wtforms.StringField("E-mail", validators=[validators.Required()]) + first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()]) + last_name = wtforms.StringField("Příjmení", validators=[validators.Required()]) + school_code = wtforms.SelectField("Škola", + validators=[validators.Required()], + coerce=int) + rocnik = wtforms.StringField( + "Ročník", + description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.", + validators=[validators.Required()]) + rok_naroz = wtforms.StringField("Rok narození") + participation_place = wtforms.SelectField('Soutěžní místo', coerce=int) + save = wtforms.SubmitField("Přidat") + + def get_school_code(self) -> str: + return '#'+str(self.school_code.data) + + def get_participation_place(self) -> str: + return '#'+str(self.participation_place.data) + + def set_contest(self, contest: db.Contest, site: db.Place): + sess = db.get_session() + + schools = [] + if contest.place.level == 2: + school = aliased(db.Place) + schools = ( + sess.query(school) + .select_from(db.Place).join(school, school.parent == db.Place.place_id) + .filter(db.Place.parent == contest.place.place_id).order_by('name').all() + ) + elif contest.place.level == 3: + schools = ( + sess.query(db.Place) + .select_from(db.Place) + .filter(db.Place.parent == contest.place.place_id).order_by('name').all() + ) + elif contest.place.level == 4: + schools = [contest.place] + + self.school_code.choices = [(s.place_id, s.name) for s in schools] + + places = [contest.place] + schools + self.participation_place.choices = [(p.place_id, p.name) for p in places] + if site: + self.participation_place.data = site.place_id + self.participation_place.render_kw={'disabled': True} + + def get_contest(id: int) -> Tuple[db.Contest, db.Contest]: """Vrací contest a master_contest pro zadané contest_id. Pro nedělená kola platí contest == master_contest. @@ -484,25 +556,34 @@ def org_contest_import(id: int): @app.route('/org/contest/c/<int:id>/ucastnici/pridat', methods=('GET', 'POST')) @app.route('/org/contest/c/<int:id>/site/<int:site_id>/ucastnici/pridat', methods=('GET', 'POST')) def org_contest_add_user(id: int, site_id: Optional[int] = None): - contest, site, rr = get_contest_site_rr(id, site_id, right_needed=Right.manage_contest) + contest, master_contest, site, rr = get_contest_site_rr(id, site_id, right_needed=Right.manage_contest) errs = None - form = ParticipantAddForm() - form.set_contest(id, site_id) + form = None + if master_contest.place.level >= 2: + form = ParticipantAddFormWithSchoolSelect() + form.set_contest(master_contest, site) + elif site: + form = ParticipantAddForm() + form.set_site(site) + else: + form = ParticipantAddFormWithSite() + form.set_contest(master_contest) + if form.validate_on_submit(): row = ContestImportRow() row.email = form.email.data row.krestni = form.first_name.data row.prijmeni = form.last_name.data - row.kod_skoly = form.school_code.data + row.kod_skoly = form.get_school_code() row.rocnik = form.rocnik.data row.rok_naroz = form.rok_naroz.data - row.kod_mista = '#'+str(form.participation_place.data) + row.kod_mista = form.get_participation_place() imp = ContestImport() imp.user = g.user imp.round = contest.round - imp.contest = contest + imp.contest = master_contest imp.gatekeeper = mo.rights.Gatekeeper(g.user) imp.setup() imp.import_row(row) @@ -516,7 +597,7 @@ def org_contest_add_user(id: int, site_id: Optional[int] = None): return render_template( 'org_contest_add_user.html', - contest=contest, site=site, + contest=master_contest, site=site, form=form, errs=errs )