Skip to content
Snippets Groups Projects

Zakládání soutěží z orgovské hlavní stránky

Merged Martin Mareš requested to merge mj/zakladani into devel
1 file
+ 0
1
Compare changes
  • Side-by-side
  • Inline
+ 42
4
@@ -11,6 +11,7 @@ import mo.rights
import mo.users
from mo.web import app
from mo.web.jinja import user_url
import mo.web.org_round
from mo.web.table import Table, Row, Column
@@ -25,6 +26,7 @@ class OrgOverview:
contest_states: Set[db.RoundState] = field(default_factory=set)
num_active_pants: int = 0
num_unconfirmed_pants: int = 0
create: bool = False
@app.route('/org/')
@@ -68,7 +70,6 @@ def org_index():
.all())
# Soutěžní místa, ke kterým máme nějakou roli
contest_place = aliased(db.Place)
place_rcu = (rcu_base
.filter(not_(db.Round.state.in_([db.RoundState.preparing, db.RoundState.closed]))) # for performance
.filter(db.Place.level >= db.Round.level)
@@ -89,11 +90,11 @@ def org_index():
overview: List[OrgOverview] = []
for r, ct, ur in rcu:
if ct is None and ur.place.level == r.level:
continue
o = overview[-1] if overview else None
if not (o and o.round == r and o.place == ur.place and o.contest == ct):
o = OrgOverview(round=r, place=ur.place, contest=ct)
if ct is None and ur.place.level == r.level:
o.create = True
overview.append(o)
o.role_set.add(ur.role)
@@ -103,7 +104,14 @@ def org_index():
get_stats(overview)
overview = filter_overview(overview)
return render_template('org_index.html', overview=overview, role_type_names=db.role_type_names)
form_add_contest = mo.web.org_round.AddContestForm()
return render_template(
'org_index.html',
overview=overview,
role_type_names=db.role_type_names,
form_add_contest=form_add_contest,
)
def get_stats(overview: List[OrgOverview]) -> None:
@@ -113,6 +121,8 @@ def get_stats(overview: List[OrgOverview]) -> None:
rcs_for: List[Tuple[int, int]] = []
rps_for: List[Tuple[int, int]] = []
for o in overview:
if o.create:
continue
if o.contest:
o.num_contests = 1
o.contest_states.add(o.contest.state)
@@ -160,12 +170,40 @@ def filter_overview(overview: List[OrgOverview]) -> List[OrgOverview]:
else:
# Ostatní role (garanti a pozorovatelé) vidí všechny soutěže
want = True
if want and o.create and not want_create_contest(o):
want = False
if want:
out.append(o)
return out
def want_create_contest(o: OrgOverview) -> bool:
# Založení soutěže nabízíme jen tehdy, pokud už kolo běží. V opačném případě sice
# org také může mít právo soutěž založit, ale v tabulce by vznikala
# spousta balastu o budoucích kolech.
if o.round.state not in [db.RoundState.running, db.RoundState.delegate]:
return False
# Pokud je soutěžní místo škola, omezujeme kategorie podle typu školy
if o.place.type == db.PlaceType.school:
cat = o.round.category
if o.place.school.is_zs:
if cat.startswith("Z"):
return True
if o.place.school.is_ss:
if cat in "ABC":
return True
# Okresní a krajská kola jsou vždy OK
if o.place.level in [1, 2]:
return True
return False
school_export_columns = (
Column(key='code', name='kod'),
Column(key='name', name='nazev'),
Loading