From 1da68240b472af16100fe5a66178c403d12453ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pracha=C5=99?= <jan.prachar@gmail.com> Date: Wed, 21 Apr 2021 01:13:55 +0200 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1n=C3=AD=20=C3=BA=C4=8Dastn=C3=AD?= =?UTF-8?q?ka:=20One=20form=20to=20rule=20them=20all?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mo/db.py | 2 + mo/web/org_contest.py | 118 ++++++++++-------------------------------- 2 files changed, 28 insertions(+), 92 deletions(-) diff --git a/mo/db.py b/mo/db.py index 429a9302..8e617828 100644 --- a/mo/db.py +++ b/mo/db.py @@ -123,6 +123,8 @@ class Place(Base): def name_locative(self): name = self.name + if self.type == PlaceType.site: + return f'v soutěžním místě {name}' if self.level == 1: name = name.replace("ý kraj", "ém").replace("Kraj ", "") return place_levels[self.level].in_name() + " " + name diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py index c64aab1b..d43ed413 100644 --- a/mo/web/org_contest.py +++ b/mo/web/org_contest.py @@ -240,87 +240,22 @@ 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", - 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()]) + school = wtforms.SelectField("Škola", validators=[validators.Required()], coerce=int) + school_code = wtforms.StringField("Kód školy", validators=[validators.Required()]) + 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') + participation_place = wtforms.StringField("Kód soutěžního místa") save = wtforms.SubmitField("Přidat") def get_school_code(self) -> str: - return self.school_code.data + return self.school_code.data if self.school_code else '#'+self.school.data - def get_participation_place(self) -> str: - return '#'+str(self.participation_place.data) + def set_descriptions(self, contest: db.Contest): + self.school_code.description = 'Kód školy najdete v <a href="' + url_for('org_place', id=contest.place.place_id)+ '">katalogu míst</a>.' + self.participation_place.description = 'Pokud účastník soutěží někde jinde než ' + contest.place.name_locative() + ', vyplňte <a href="' + url_for('org_place', id=contest.place.place_id)+ '">kód místa</a>. Dozor na tomto místě pak může za účastníka odevzdávat řešení.' - 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.StringField('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 self.participation_place.data - - def set_contest(self, contest: db.Contest): - self.participation_place.description = "Vyplňte, 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: - field.data = mo.users.normalize_email(field.data) - except mo.CheckError as e: - 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): + def fill_schools(self, contest: db.Contest): sess = db.get_session() schools = [] @@ -340,13 +275,13 @@ class ParticipantAddFormWithSchoolSelect(FlaskForm): elif contest.place.level == 4: schools = [contest.place] - self.school_code.choices = [(s.place_id, s.name) for s in schools] + self.school.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 validate_email(form, field): + try: + field.data = mo.users.normalize_email(field.data) + except mo.CheckError as e: + raise wtforms.ValidationError(str(e)) def get_contest(id: int) -> Tuple[db.Contest, db.Contest]: @@ -559,18 +494,16 @@ def org_contest_add_user(id: int, site_id: Optional[int] = None): contest, master_contest, site, rr = get_contest_site_rr(id, site_id, right_needed=Right.manage_contest) errs = None - form = None + form = ParticipantAddForm() + form.set_descriptions(master_contest) + if master_contest.place.level >= 2: - form = ParticipantAddFormWithSchoolSelect() - form.set_contest(master_contest, site) - elif site: - form = ParticipantAddForm() - form.school_code.description = 'Kód školy najdete v <a href="' + url_for('org_place', id=master_contest.place.place_id)+ '">katalogu míst</a>.' - form.set_site(site) + del form.school_code + form.fill_schools(master_contest) else: - form = ParticipantAddFormWithSite() - form.school_code.description = 'Kód školy najdete v <a href="' + url_for('org_place', id=master_contest.place.place_id)+ '">katalogu míst</a>.' - form.set_contest(master_contest) + del form.school + if site: + del form.participation_place if form.validate_on_submit(): row = ContestImportRow() @@ -580,7 +513,8 @@ def org_contest_add_user(id: int, site_id: Optional[int] = None): row.kod_skoly = form.get_school_code() row.rocnik = form.rocnik.data row.rok_naroz = form.rok_naroz.data - row.kod_mista = form.get_participation_place() + if form.participation_place: + row.kod_mista = form.participation_place.data imp = ContestImport() imp.user = g.user -- GitLab