Skip to content
Snippets Groups Projects

Formulář na přidání účastníka do soutěže

Closed Jan Prachař requested to merge honza/add-contestant into devel

Files

+ 80
1
@@ -15,7 +15,7 @@ import wtforms
import mo
from mo.csv import FileFormat
import mo.db as db
from mo.imports import ImportType, Import, create_import
from mo.imports import ImportType, Import, ContestImport, ContestImportRow, create_import
import mo.jobs.submit
from mo.rights import Right, Rights
import mo.util
@@ -26,6 +26,7 @@ from mo.web.util import PagerForm
from mo.web.table import CellCheckbox, Table, Row, Column, cell_pion_link, cell_place_link, cell_email_link
import wtforms.validators as validators
from wtforms.fields.html5 import IntegerField
from wtforms.validators import Required
class ImportForm(FlaskForm):
@@ -232,6 +233,44 @@ class ParticipantsActionForm(FlaskForm):
return True
class ParticipantAddForm(FlaskForm):
email = wtforms.StringField("Email", validators=[Required()])
first_name = wtforms.StringField("Křestní jméno", validators=[Required()])
last_name = wtforms.StringField("Příjmení", validators=[Required()])
school_code = wtforms.StringField(
"Kód školy", description="Viz katalog škol na tomto webu", 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 <i>k</i>/<i>r</i>.", validators=[Required()]
)
rok_naroz = wtforms.StringField("Rok narození")
participation_place = wtforms.SelectField('Soutěžní místo', coerce=int)
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)
+5
.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()
)
self.participation_place.choices = [(p.place_id, p.name) for p in places]
if site_id:
self.participation_place.data = site_id
def validate_email(form, field):
Please register or sign in to reply
try:
field.data = mo.users.normalize_email(field.data)
except mo.CheckError as e:
raise wtforms.ValidationError(str(e))
def get_contest(id: int) -> db.Contest:
contest = (db.get_session().query(db.Contest)
.options(joinedload(db.Contest.place),
@@ -411,6 +450,46 @@ def org_contest_import(id: int):
contest, rr = get_contest_rr(id, Right.manage_contest)
return generic_import(contest.round, contest)
@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)
if not rr.have_right(Right.manage_contest):
raise werkzeug.exceptions.Forbidden()
errs = None
form = ParticipantAddForm()
form.set_contest(id, site_id)
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.rocnik = form.rocnik.data
row.rok_naroz = form.rok_naroz.data
row.kod_mista = '#'+str(form.participation_place.data)
imp = ContestImport()
imp.user = g.user
imp.round = contest.round
imp.contest = contest
imp.gatekeeper = mo.rights.Gatekeeper(g.user)
imp.setup()
imp.import_row(row)
errs = imp.errors
if len(errs) == 0:
db.get_session().commit()
imp.notify_users()
return redirect(url_for('org_contest_list', id=id, site_id=site_id))
else:
db.get_session().rollback()
return render_template(
'org_contest_add_user.html',
contest=contest, site=site,
form=form, errs=errs
)
@app.route('/org/contest/c/<int:id>/ucastnici', methods=('GET', 'POST'))
@app.route('/org/contest/c/<int:id>/site/<int:site_id>/ucastnici', methods=('GET', 'POST'))
Loading