Skip to content
Snippets Groups Projects
Commit 32429357 authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Zobrazování a filtrování soutěžících a organizátorů

parent ee637ba0
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !5. Comments created here will be created in the context of that merge request.
......@@ -63,4 +63,5 @@ app.before_request(init_request)
# Většina webu je v samostatných modulech
import mo.web.main
import mo.web.org
import mo.web.org_users
import mo.web.menu
......@@ -27,7 +27,8 @@ def get_menu():
MenuItem(url_for('org_index'), "Org"),
MenuItem(url_for('org_place_root'), "Místa"),
MenuItem(url_for('org_contest_root'), "Soutěž"),
MenuItem(url_for('org_users'), "Uživatelé"),
MenuItem(url_for('org_users'), "Soutěžící"),
MenuItem(url_for('org_users_orgs'), "Organizátoři"),
]
# Login / user settings
......
......@@ -378,11 +378,6 @@ def org_place_rights(id: int):
)
@app.route('/org/users/')
def org_users():
return render_template('not_implemented.html')
@app.route('/org/contest/')
def org_contest_root():
sess = db.get_session()
......
from operator import or_
from flask import render_template, redirect, url_for, flash, request
from flask_wtf import FlaskForm
import werkzeug.exceptions
import wtforms
from typing import Optional, List
import mo
import mo.db as db
import mo.rights
import mo.util
from mo.web import app
class PagerForm(FlaskForm):
limit = wtforms.IntegerField()
offset = wtforms.IntegerField()
next = wtforms.SubmitField("Další")
previous = wtforms.SubmitField("Předchozí")
class UsersFilterForm(PagerForm):
# participants
year = wtforms.IntegerField("Ročník")
school_code = wtforms.StringField("Škola")
# rounds->participations
round_year = wtforms.IntegerField("Ročník")
round_category = wtforms.SelectField("Kategorie", choices=['*'] + sorted(db.get_categories()))
round_seq = wtforms.SelectField("Kolo", choices=['*'] + sorted(db.get_seqs()))
contest_site_code = wtforms.StringField("Soutěžní místo")
participation_state = wtforms.SelectField('Účast', choices=[('*', '*')] + list(db.PartState.choices()))
submit = wtforms.SubmitField("Filtrovat")
@app.route('/org/users/')
def org_users():
sess = db.get_session()
q = sess.query(db.User).filter_by(is_admin=False, is_org=False)
filter = UsersFilterForm(request.args)
filter_errors = []
participant_filter = sess.query(db.Participant.user_id)
participant_filter_apply = False
if filter.year.data:
participant_filter = participant_filter.filter_by(year=filter.year.data)
participant_filter_apply = True
print(filter.school_code.data)
if filter.school_code.data:
place = db.place_by_code(filter.school_code.data)
if place:
participant_filter = participant_filter.filter_by(school=place.place_id)
participant_filter_apply = True
else:
filter_errors.append("Neexistující kód školy")
if participant_filter_apply:
q = q.filter(db.User.user_id.in_(participant_filter))
round_filter = sess.query(db.Round.round_id)
round_filter_apply = False
if filter.round_year.data:
round_filter = round_filter.filter_by(year=filter.round_year.data)
round_filter_apply = True
if filter.round_category.data and filter.round_category.data != "*":
round_filter = round_filter.filter_by(category=filter.round_category.data)
round_filter_apply = True
if filter.round_seq.data and filter.round_seq.data != "*":
round_filter = round_filter.filter_by(seq=filter.round_seq.data)
round_filter_apply = True
contest_filter = sess.query(db.Contest.contest_id)
contest_filter_apply = False
if round_filter_apply:
contest_filter = contest_filter.filter(db.Contest.round_id.in_(round_filter))
contest_filter_apply = True
if filter.contest_site_code.data:
place = db.place_by_code(filter.contest_site_code.data)
if place:
contest_filter = contest_filter.filter_by(place_id=place.place_id)
contest_filter_apply = True
else:
filter_errors.append("Neexistující kód soutěžního místa")
participation_filter = sess.query(db.Participation.user_id)
participation_filter_apply = False
if contest_filter_apply:
participation_filter = participation_filter.filter(db.Participation.contest_id.in_(contest_filter))
participation_filter_apply = True
if filter.participation_state.data and filter.participation_state.data != '*':
participation_filter = participation_filter.filter_by(state=filter.participation_state.data)
participation_filter_apply = True
if participation_filter_apply:
q = q.filter(db.User.user_id.in_(participation_filter))
# print(str(q))
count = q.count()
if not filter.offset.data:
filter.offset.data = 0
if not filter.limit.data:
filter.limit.data = 50
if filter.previous.data:
filter.offset.data = max(0, filter.offset.data - 50)
if filter.next.data:
filter.offset.data = min(count // 50 * 50, filter.offset.data + 50)
q = q.offset(filter.offset.data)
q = q.limit(filter.limit.data)
users = q.all()
return render_template('org_users.html', users=users, count=count, filter=filter, filter_errors=filter_errors)
class OrgsFilterForm(PagerForm):
# TODO: filtering by roles?
submit = wtforms.SubmitField("Filtrovat")
@app.route('/org/users/orgs/')
def org_users_orgs():
sess = db.get_session()
q = sess.query(db.User).filter(or_(db.User.is_admin, db.User.is_org))
filter = OrgsFilterForm(request.args)
# TODO: filtering by roles?
count = q.count()
if not filter.offset.data:
filter.offset.data = 0
if not filter.limit.data:
filter.limit.data = 50
if filter.previous.data:
filter.offset.data = max(0, filter.offset.data - 50)
if filter.next.data:
filter.offset.data = min(count // 50 * 50, filter.offset.data + 50)
q = q.offset(filter.offset.data)
q = q.limit(filter.limit.data)
users = q.all()
return render_template('org_users_orgs.html', users=users, count=count, filter=filter, filter_errors=None)
@app.route('/org/user/<int:id>/')
def org_user(id: int):
return render_template('not_implemented.html')
@app.route('/org/user/<int:id>/edit')
def org_user_edit(id: int):
return render_template('not_implemented.html')
@app.route('/org/user/new/', defaults={'type': None})
@app.route('/org/user/new/<type>/')
def org_user_new(type: Optional[str]):
return render_template('not_implemented.html')
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block body %}
<a class="pull-right btn btn-primary" href="{{ url_for('org_user_new') }}">Nový soutěžící</a>
<h2>Soutěžící</h2>
{% if filter_errors %}
<div class="alert alert-danger" role="alert">
{{ filter_errors|join("<br>") }}
</div>
{% endif %}
<form action="" method="GET" class="form" role="form">
<div class="row">
<div class='col-sm-2'><strong>Účast v kole:</strong></div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.round_year) }}
</div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.round_category) }}
</div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.round_seq) }}
</div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.contest_site_code, placeholder='Kód / #ID') }}
</div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.participation_state) }}
</div>
</div>
<div class="row">
<div class='col-sm-2'><strong>Registrace:</strong></div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.year) }}
</div>
<div class="form-group col-sm-2">
{{ wtf.form_field(filter.school_code, placeholder='Kód / #ID') }}
</div>
<div class="form-group col-sm-6 btn-group">
{{ wtf.form_field(filter.submit, class='btn btn-primary') }}
{% if filter.offset.data > 0 %}
{{ wtf.form_field(filter.previous) }}
{% else %}
<button class="btn" disabled>Předchozí</button>
{% endif %}
{% if count > filter.offset.data + filter.limit.data %}
{{ wtf.form_field(filter.next) }}
{% else %}
<button class="btn" disabled>Další</button>
{% endif %}
{% set max = filter.offset.data + filter.limit.data if filter.offset.data + filter.limit.data < count else count %}
<br><br>Zobrazuji záznamy <b>{{filter.offset.data + 1}}</b><b>{{ max }}</b> z <b>{{count}} nalezených soutěžících</b>.
</div>
</div>
<input type="hidden" name="offset" value="{{filter.offset.data}}">
<input type="hidden" name="limit" value="{{filter.limit.data}}">
</form>
{% if users %}
<table class="table">
<thead>
<tr>
<th>Jméno</th><th>Příjmení</th><th>E-mail</th><th>Akce</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td>{{ user.first_name }}</td><td>{{ user.last_name }}</td>
<td><a href="mailto:{{ user.email }}">{{ user.email }}</a></td>
<td class='btn-group'>
<a class="btn btn-xs btn-default" href="{{ url_for('org_user', id=user.user_id) }}">Detail</a>
<a class="btn btn-xs btn-default" href="{{ url_for('org_user_edit', id=user.user_id) }}">Edit</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
Zadanému filtru nevyhovují žádní soutěžící.
{% endif %}
{% endblock %}
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block body %}
<a class="pull-right btn btn-primary" href="{{ url_for('org_user_new', type='org') }}">Nový organizátor</a>
<h2>Organizátoři</h2>
{% if filter_errors %}
<div class="alert alert-danger" role="alert">
{{ filter_errors|join("<br>") }}
</div>
{% endif %}
<form action="" method="GET" class="form" role="form">
<div class="row">
<div class="form-group col-sm-6 btn-group">
{% if filter.offset.data > 0 %}
{{ wtf.form_field(filter.previous) }}
{% else %}
<button class="btn" disabled>Předchozí</button>
{% endif %}
{% if count > filter.offset.data + filter.limit.data %}
{{ wtf.form_field(filter.next) }}
{% else %}
<button class="btn" disabled>Další</button>
{% endif %}
{% set max = filter.offset.data + filter.limit.data if filter.offset.data + filter.limit.data < count else count %}
<br><br>Zobrazuji záznamy <b>{{filter.offset.data + 1}}</b><b>{{ max }}</b> z <b>{{count}} nalezených organizátorů</b>.
</div>
</div>
<input type="hidden" name="offset" value="{{filter.offset.data}}">
<input type="hidden" name="limit" value="{{filter.limit.data}}">
</form>
{% if users %}
<table class="table">
<thead>
<tr>
<th>Jméno</th><th>Příjmení</th><th>E-mail</th><th>Akce</th>
</tr>
</thead>
{% for user in users %}
<tr>
<td>{{ user.first_name }}</td><td>{{ user.last_name }}</td>
<td><a href="mailto:{{ user.email }}">{{ user.email }}</a></td>
<td class='btn-group'>
<a class="btn btn-xs btn-default" href="{{ url_for('org_user', id=user.user_id) }}">Detail</a>
<a class="btn btn-xs btn-default" href="{{ url_for('org_user_edit', id=user.user_id) }}">Edit</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
Zadanému filtru nevyhovují žádní organizátoři.
{% endif %}
{% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment