Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • devel
  • fo
  • fo-base
  • honza/add-contestant
  • honza/kolo-vs-soutez
  • honza/mr6
  • honza/mr7
  • honza/mra
  • honza/mrd
  • honza/mrf
  • honza/submit-images
  • jh-stress-test-wip
  • jirka/typing
  • jk/issue-196
  • jk/issue-96
  • master
  • mj/submit-images
  • shorten-schools
18 results

Target

Select target project
  • mj/mo-submit
1 result
Select Git revision
  • devel
  • fo
  • fo-base
  • honza/add-contestant
  • honza/kolo-vs-soutez
  • honza/mr6
  • honza/mr7
  • honza/mra
  • honza/mrd
  • honza/mrf
  • honza/submit-images
  • jh-stress-test-wip
  • jirka/typing
  • jk/issue-196
  • jk/issue-96
  • master
  • mj/submit-images
  • shorten-schools
18 results
Show changes
Showing
with 388 additions and 202 deletions
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set round = contest.round %}
{% set site_id = site.place_id if site else None %}
{% block title %}
{{ "Založení řešení" if edit_form else "Tabulka řešení" }} {% if site %}soutěžního místa {{ site.name }}{% else %}{{ contest.place.name_locative() }}{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, site=site, action="Založení řešení" if edit_form else "Tabulka řešení") }}
{{ ctx.breadcrumbs(action="Založení řešení" if edit_form else "Tabulka řešení") }}
{% endblock %}
{% block pretitle %}
{% if contest.state in [RoundState.grading, RoundState.closed] %}
<div class="btn-group pull-right">
<a class="btn btn-default" href="{{ url_for('org_score', contest_id=contest.contest_id) }}">Výsledky {{ round.get_level().name_genitive() }}</a>
<a class="btn btn-default" href="{{ url_for('org_score', round_id=round.round_id) }}">Výsledky kola</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score') }}">Výsledky {{ round.get_level().name_genitive() }}</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score', ct_id=None) }}">Výsledky kola</a>
</div>
{% endif %}
{% endblock %}
......@@ -48,9 +47,9 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
<th rowspan=2>Účastník
<th rowspan=2>Stav účasti</th>
{% for task in tasks %}<th colspan=4>
<a href="{{ url_for('org_contest_task', contest_id=contest.contest_id, site_id=site_id, task_id=task.task_id) }}">{{ task.code }}</a>
{% if sc.allow_edit_points %}
<a title="Editovat body" href="{{ url_for('org_contest_task_points', contest_id=contest.contest_id, task_id=task.task_id) }}" class="icon pull-right"></a>
<a href="{{ ctx.url_for('org_contest_task', task_id=task.task_id) }}">{{ task.code }}</a>
{% if rights.can_edit_points() %}
<a title="Editovat body" href="{{ ctx.url_for('org_contest_task_points', task_id=task.task_id) }}" class="icon pull-right"></a>
{% endif %}
{% endfor %}
<th rowspan=2>Body celkem
......@@ -61,7 +60,7 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
</thead>
{% for pion in pions %}
{% set u = pion.user %}
<tr class="state-{{ pion.state.name }}>
<tr class="state-{{ pion.state.name }}">
<th>{{ u|pion_link(contest.contest_id) }}
<td>{{ pion.state.friendly_name() }}
{% set sum_points = [] %}
......@@ -109,7 +108,7 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
{% else %}–{% endif %}
<td>
{% endif %}
<a class="btn btn-xs btn-link icon" title="Detail řešení" href="{{ url_for('org_submit_list', contest_id=contest.contest_id, user_id=u.user_id, task_id=task.task_id, site_id=site_id) }}">🔍</a>
<a class="btn btn-xs btn-link icon" title="Detail řešení" href="{{ ctx.url_for('org_submit_list', user_id=u.user_id, task_id=task.task_id) }}">🔍</a>
{% endfor %}
<th>{{ sum_points|sum|decimal }}</th>
</tr>
......@@ -118,9 +117,9 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
<tr><td><td>
{% for task in tasks %}
<td colspan=4><div class='btn-group'>
<a class='btn btn-xs btn-primary' href="{{ url_for('org_contest_task_download', contest_id=contest.contest_id, site_id=site_id, task_id=task.task_id) }}">Stáhnout</a>
{% if sc.allow_upload_feedback %}
<a class='btn btn-xs btn-primary' href="{{ url_for('org_contest_task_upload', contest_id=contest.contest_id, site_id=site_id, task_id=task.task_id) }}">Nahrát</a>
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_download', task_id=task.task_id) }}">Stáhnout</a>
{% if rights.can_upload_feedback() %}
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_upload', task_id=task.task_id) }}">Nahrát</a>
{% endif %}
</div>
{% endfor %}
......@@ -130,13 +129,13 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
{% if edit_form %}
<div class='btn-group'>
{{ wtf.form_field(edit_form.submit, class="btn btn-primary") }}
<a class="btn btn-default" href="{{ url_for('org_contest_solutions', id=contest.contest_id, site_id=site_id) }}">Zrušit</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_solutions') }}">Zrušit</a>
</div>
</form>
{% else %}
<div class='btn-group'>
{% if sc.allow_create_solutions %}
<a class="btn btn-primary" href="{{ url_for('org_contest_solutions_edit', id=contest.contest_id, site_id=site_id) }}">Založit řešení</a>
{% if rights.can_create_solutions() %}
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_solutions_edit') }}">Založit řešení</a>
{% endif %}
</div>
{% endif %}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set contest = sc.contest %}
{% set ct_id = contest.contest_id %}
{% set round = sc.round %}
{% set site = sc.site %}
{% set site_id = site.place_id if site else None %}
{% set task = sc.task %}
{% set allow_edit_points=rights.can_edit_points() %}
{% set allow_upload_solutions=rights.can_upload_solutions() %}
{% set allow_upload_feedback=rights.can_upload_feedback() %}
{% block title %}{{ "Zadávání bodů" if points_form else "Založení řešení" if create_form else "Odevzdaná řešení" }} úlohy {{ task.code }} {{ task.name }}{% endblock %}
{% block title %}{{ "Zadávání bodů" if points_form else "Založení řešení" if create_form else "Odevzdaná řešení" }} úlohy {{ ctx.task.code }} {{ ctx.task.name }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, site=site, task=task, action="Zadávání bodů" if points_form else "Založení řešení" if create_form else None) }}
{{ ctx.breadcrumbs(action="Zadávání bodů" if points_form else "Založení řešení" if create_form else None) }}
{% endblock %}
{% block pretitle %}
<div class="btn-group pull-right">
<a class="btn btn-default" href="{{ url_for('org_contest_solutions', id=ct_id, site_id=site_id) }}">Všechny úlohy</a>
{% if contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-default" href="{{ url_for('org_score', contest_id=ct_id) }}">Výsledky {{ round.get_level().name_genitive() }}</a>
<a class="btn btn-default" href="{{ url_for('org_score', round_id=round.round_id) }}">Výsledky kola</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_solutions', task_id=None) }}">Všechny úlohy</a>
{% if ctx.contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-default" href="{{ ctx.url_for('org_score', task_id=None) }}">Výsledky {{ ctx.round.get_level().name_genitive() }}</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score', ct_id=None, task_id=None) }}">Výsledky kola</a>
{% endif %}
</div>
{% endblock %}
......@@ -29,26 +26,26 @@
<form class="form" method="POST">
{{ form.csrf_token }}
{% endif %}
{% with for_user=None, for_task=task, rows=rows %}
{% with for_user=None, for_task=ctx.task, rows=rows %}
{% include "parts/org_solution_table.html" %}
{% endwith %}
{% if form %}
<div class='btn-group'>
{{ wtf.form_field(form.submit, class="btn btn-primary" ) }}
<a class="btn btn-default" href="{{ url_for('org_contest_task', contest_id=ct_id, task_id=task.task_id, site_id=site_id) }}">Zrušit</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_task') }}">Zrušit</a>
</div>
</form>
{% else %}
<div class='btn-group'>
<a class='btn btn-primary' href="{{ url_for('org_contest_task_download', contest_id=ct_id, site_id=site_id, task_id=task.task_id) }}">Stáhnout řešení</a>
{% if sc.allow_upload_feedback %}
<a class='btn btn-primary' href="{{ url_for('org_contest_task_upload', contest_id=ct_id, site_id=site_id, task_id=task.task_id) }}">Nahrát opravená řešení</a>
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_download') }}">Stáhnout řešení</a>
{% if allow_upload_feedback %}
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_upload') }}">Nahrát opravená řešení</a>
{% endif %}
{% if sc.allow_create_solutions %}
<a class="btn btn-primary" href="{{ url_for('org_contest_task_create', contest_id=ct_id, task_id=task.task_id, site_id=site_id) }}">Založit řešení</a>
{% if allow_create_solutions %}
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_task_create') }}">Založit řešení</a>
{% endif %}
{% if not site and sc.allow_edit_points %}
<a class="btn btn-primary" href="{{ url_for('org_contest_task_points', contest_id=ct_id, task_id=task.task_id) }}">Zadat body</a>
{% if not ctx.site and allow_edit_points %}
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_task_points') }}">Zadat body</a>
{% endif %}
</div>
{% endif %}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set contest = sc.contest %}
{% set contest = ctx.contest %}
{% set ct_id = contest.contest_id %}
{% set round = sc.round %}
{% set user = sc.user %}
{% set round = ctx.round %}
{% set user = ctx.user %}
{% block title %}{{ round.round_code() }}: účastník {{ user.full_name() }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, user=user) }}
{{ ctx.breadcrumbs() }}
{% endblock %}
{% block body %}
......@@ -15,14 +15,14 @@
<h4>Rychlé odkazy</h4>
Soutěžní kolo:
<div class="btn-group">
<a class="btn btn-default" href="{{ url_for('org_round_list', id=round.round_id) }}">Účastníci</a>
<a class="btn btn-default" href="{{ url_for('org_score', round_id=round.round_id) }}">Výsledky</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_generic_list', ct_id=None) }}">Účastníci</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score', ct_id=None) }}">Výsledky</a>
</div>
<br>{{ round.get_level().name|capitalize }}:
<div class="btn-group">
<a class="btn btn-default" href="{{ url_for('org_contest_solutions', id=ct_id) }}">Tabulka řešení</a>
<a class="btn btn-default" href="{{ url_for('org_contest_list', id=ct_id) }}">Účastníci</a>
<a class="btn btn-default" href="{{ url_for('org_score', contest_id=ct_id) }}">Výsledky</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_solutions') }}">Tabulka řešení</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_generic_list') }}">Účastníci</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score') }}">Výsledky</a>
</div>
</div>
......@@ -40,12 +40,12 @@
<thead>
<tr><th colspan='2'>Účast v kole
</thead>
<tr><td>{{ round.get_level().name|capitalize }}:<td><a href='{{ url_for('org_contest', id=ct_id) }}'>{{ contest.place.name }}</a>
<tr><td>Soutěžní místo:<td><a href='{{ url_for('org_contest', id=ct_id, site_id=sc.pion.place_id) }}'>{{ sc.pion.place.name }}</a>
<tr><td>Stav účasti:<td>{{ sc.pion.state.friendly_name() }}
<tr><td>{{ round.get_level().name|capitalize }}:<td><a href='{{ ctx.url_for('org_contest') }}'>{{ contest.place.name }}</a>
<tr><td>Soutěžní místo:<td><a href='{{ ctx.url_for('org_contest', site_id=ctx.pion.place_id) }}'>{{ ctx.pion.place.name }}</a>
<tr><td>Stav účasti:<td>{{ ctx.pion.state.friendly_name() }}
</table>
<a class="btn btn-default" href="{{ url_for('org_user', id=user.user_id) }}">Detail uživatele</a>
<a class="btn btn-default" href="{{ user|user_url }}">Detail uživatele</a>
{% include "parts/org_submit_warning.html" %}
......
......@@ -3,7 +3,7 @@
{% block title %}Zadání kola {{ round.round_code() }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, action="Zadáni") }}
{{ ctx.breadcrumbs(action="Zadáni") }}
{% endblock %}
{% block body %}
......
......@@ -3,7 +3,7 @@
{% block title %}Stažení řešení úlohy {{ task.code }} {{ task.name }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, site=site, task=task, action="Stažení řešení") }}
{{ ctx.breadcrumbs(action="Stažení řešení") }}
{% endblock %}
{% block body %}
......@@ -14,10 +14,14 @@
</table>
<p>Zde si můžete stáhnout všechna řešení této úlohy
{% if contest %}
{% if ctx.site %}
{{ ctx.site.name_locative() }}.
{% elif contest %}
{{ contest.place.name_locative() }}.
{% elif ctx.hier_place %}
{{ ctx.hier_place.name_locative() }}.
{% else %}
ze všech oblastí tohoto kola.
ze všech soutěží tohoto kola.
{% endif %}
Pozor na to, že jich může být poměrně hodně (viz celková velikost dat výše).
......
......@@ -3,7 +3,7 @@
{% block title %}Dávkové bodování úlohy {{ task.code }} {{ task.name }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, task=task, action="Dávkové bodování") }}
{{ ctx.breadcrumbs(action="Dávkové bodování") }}
{% endblock %}
{% block body %}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set site_id = site.place_id if site else None %}
{% block title %}Nahrání opravených řešení úlohy {{ task.code }} {{ task.name }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, site=site, task=task, action="Nahrání opravených řešení") }}
{{ ctx.breadcrumbs(action="Nahrání opravených řešení") }}
{% endblock %}
{% block body %}
......
......@@ -5,7 +5,7 @@
Import dat do {% if contest %}soutěže {{ contest.place.name_locative() }}{% else %}kola {{ round.round_code() }}{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, action="Import dat") }}
{{ ctx.breadcrumbs(action="Import dat") }}
{% endblock %}
{% block body %}
......@@ -33,7 +33,7 @@ Import dat do {% if contest %}soutěže {{ contest.place.name_locative() }}{% el
Detaily fungování importu najdete v <a href='{{ url_for('doc_import') }}'>dokumentaci</a>.
{% if not contest %}
<p><em>Pozor, zde se importuje do všech oblastí najednou, takže je nutné uvádět
<p><em>Pozor, zde se importuje do více soutěží najednou, takže je nutné uvádět
kód oblasti. Nechcete raději importovat do konkrétní oblasti?</em>
{% endif %}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}
{% if contest %}
Seznam účastníků {% if site %}v soutěžním místě {{ site.name }}{% else %}{{ contest.place.name_locative() }}{% endif %}
{% else %}
Seznam účastníků kola {{ round.round_code() }}
{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ ctx.breadcrumbs(action="Seznam účastníků" if table else "E-maily", table=False if table else True) }}
{% endblock %}
{% set id = contest.contest_id %}
{% set site_id = site.place_id if site else None %}
{% block body %}
<div class="form-frame">
<form action="" method="GET" class="form form-inline" role="form">
<div class="form-row">
{% if not contest %}
{{ wtf.form_field(filter.contest_place, placeholder='Kód', size=8) }}
{% endif %}
{% if not site %}
{{ wtf.form_field(filter.participation_place, size=8) }}
{% endif %}
{{ wtf.form_field(filter.school, size=8) }}
{{ wtf.form_field(filter.participation_state) }}
</div>
<div class="form-row" style="margin-top: 5px;">
<div class="btn-group">
{{ wtf.form_field(filter.submit, class='btn btn-primary') }}
{% if table %}
<button class="btn btn-default" name="format" value="cs_csv" title="Stáhnout celý výsledek v CSV">↓ CSV</button>
<button class="btn btn-default" name="format" value="tsv" title="Stáhnout celý výsledek v TSV">↓ TSV</button>
{% endif %}
</div>
{% if table %}
<div style="float: right">
Stránka {{ filter.offset.data // filter.limit.data + 1}} z {{ (count / filter.limit.data)|round(0, 'ceil')|int }}:
<div class="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 %}
</div>
<input type="hidden" name="offset" value="{{filter.offset.data}}">
<input type="hidden" name="limit" value="{{filter.limit.data}}">
</div>
{% set max = filter.offset.data + filter.limit.data if filter.offset.data + filter.limit.data < count else count %}
{% if count > 0 %}
Zobrazuji záznamy <b>{{filter.offset.data + 1}}</b><b>{{ max }}</b> z <b>{{count}} nalezených účastníků</b>.
{% else %}
<b>Nebyly nalezeny žádné záznamy účastníků.</b>
{% endif %}
{% else %}
Celkem <b>{{count|inflected('nalezený účastník', 'nalezení účastníci', 'nalezených účastníků')}}</b>.
{% endif %}
</div>
</form>
</div>
{% if table %}
{% if action_form %}
<form action="" method="POST" class="form form-horizontal" role="form">
{% endif %}
{{ table.to_html() }}
{% if contest %}
<a class="btn btn-primary" href="{{ url_for('org_contest_add_user', ct_id=contest.contest_id, site_id=site.place_id if site else None) }}">Přidat účastníka</a>
{% endif %}
<a class="btn btn-default"
title="Zobrazí emailové adresy ve snadno zkopírovatelném formátu"
href="{{ ctx.url_for('org_generic_list_emails', **request.args) }}">
Vypsat e-mailové adresy
</a>
{% if action_form %}
{{ action_form.csrf_token }}
<h3>Provést akci</h3>
<div class="form-frame">
<div class="form-group">
<label class="control-label col-sm-2">Provést akci na:</label>
<div class="col-sm-5 radio">
<label>
<input id="action_on-0" name="action_on" type="radio" value="all" required{% if action_form.action_on.data == 'all' %} checked{% endif %}>
všech vyfiltrovaných účastnících
</label>
</div><div class="col-sm-5 radio">
<label>
<input id="action_on-1" name="action_on" type="radio" value="checked" required{% if action_form.action_on.data == 'checked' %} checked{% endif %}>
pouze zaškrtnutých účastnících
</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="participation_state">Stav účasti</label>
<div class="col-sm-6">{{ wtf.form_field(action_form.participation_state, form_type='inline') }}</div>
<div class="col-sm-4">{{ wtf.form_field(action_form.set_participation_state, form_type='inline', class='btn btn-primary') }}</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="participation_place">Soutěžní místo</label>
<div class="col-sm-6">{{ wtf.form_field(action_form.participation_place, form_type='inline', placeholder='Kód místa') }}</div>
<div class="col-sm-4">{{ wtf.form_field(action_form.set_participation_place, form_type='inline', class='btn btn-primary') }}</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="contest_place">
{{ round.get_level().name|capitalize }}
</label>
<div class="col-sm-6">
{{ wtf.form_field(action_form.contest_place, form_type='inline', placeholder='Kód místa') }}
<p class="help-block">
{{ round.get_level().name_locative("V tomto", "V této", "V tomto") }} musí existovat soutěž pro {{ round.name|lower }} kategorie {{ round.category }}.
</p>
</div>
<div class="col-sm-4">{{ wtf.form_field(action_form.set_contest, form_type='inline', class='btn btn-primary', value='Přesunout do ' + round.get_level().name_genitive('jiného', 'jiné', 'jiného')) }}</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="contest_place">Smazání účasti</label>
<div class="col-sm-6"><p class="help-block">Dojde ke smazání účasti v tomto kole, ne účastníka z ročníku.</p></div>
<div class="col-sm-4">{{ wtf.form_field(action_form.remove_participation, form_type='inline', class='btn btn-danger') }}</div>
</div>
</div>
</form>
{% else %}
<p>
<i>Nemáte právo k editaci účastníků v {{ round.get_level().name_locative("v tomto", "v této", "v tomto") }}.</i>
</p>
{% endif %}
{% else %}
<h3>E-mailové adresy</h3>
{% if emails %}
<pre>{{ emails|join('\n')|escape }}</pre>
<textarea id="emails-textarea" style="display: none">{{ emails|join('\n')|escape }}</textarea>
<p>
<a class="btn btn-primary" href="{{ mailto_link }}">Vytvořit e-mail pro {{ count|inflected("adresáta", "adresáty", "adresátů") }}</a>
<button class="btn btn-default" id="copy-emails">Zkopírovat všechny adresy do schránky</button>
<script type="text/javascript">
var ta = document.getElementById('emails-textarea');
document.getElementById('copy-emails').addEventListener('click', function () {
ta.style.display = 'block';
ta.select();
document.execCommand('copy', false);
ta.style.display = 'none';
});
</script>
</p>
<p>E-mailové adresy účastníků prosím vkládejte do pole pro <b>skrytou kopii (Bcc)</b>, ať si navzájem nevidí své e-maily.</p>
{% else %}<i>Žádné e-mailové adresy k vypsání.</i>{% endif %}
{% endif %}
{% endblock %}
......@@ -2,34 +2,46 @@
{% block title %}Organizátorské rozhraní{% endblock %}
{% block body %}
{% if contests %}
{% if overview %}
<h3>Moje soutěže</h3>
<table class="table table-bordered table-condensed greyhead">
{% set curr = namespace(level=-1) %}
{% for c in contests %}
{% if curr.level != c.round.level %}
{% for o in overview %}
{% if curr.level != o.round.level %}
<thead><tr>
<th>ID
<th>Kategorie
<th>Kolo
<th>{{ c.round.get_level().name|capitalize }}
<th>{{ o.round.get_level().name|capitalize }}
<th>Stav
<th>Moje role
<th>Odkazy
</thead>
{% set curr.level = c.round.level %}
{% set curr.level = o.round.level %}
{% endif %}
{% if o.contest %}
{% set detail_url = url_for('org_contest', ct_id=o.contest.contest_id) %}
{% elif o.place.level == 0 %}
{% set detail_url = url_for('org_round', round_id=o.round.round_id) %}
{% else %}
{% set detail_url = url_for('org_round', round_id=o.round.round_id, hier_id=o.place.place_id) %}
{% endif %}
<tr>
<td><a href='{{ url_for('org_contest', id=c.contest_id) }}'>{{ c.round.round_code() }}</a>
<td class="text-center"><b>{{ c.round.category }}</b>
<td>{{ c.round.name }}
<td>{{ c.place.name }}
<td class="rstate-{{c.state.name}}">{{ c.state.friendly_name() }}
<td>{% for r in contest_roles[c.contest_id] %}{{ role_type_names[r] }}{% if not loop.last %}<br>{% endif %}{% endfor %}
<td><a href='{{ detail_url }}'>{{ o.round.round_code() }}</a>
<td class="text-center"><b>{{ o.round.category }}</b>
<td>{{ o.round.name }}
{% if o.contest %}
<td>{{ o.place.name }}
<td class="rstate-{{o.contest.state.name}}">{{ o.contest.state.friendly_name() }}
{% else %}
<td><i>{{ o.place.name_locative() }}</i>
<td>
<a class="btn btn-xs btn-primary" href='{{ url_for('org_contest', id=c.contest_id) }}'>Detail</a>
{% endif %}
<td>{% for r in o.role_list %}{{ role_type_names[r] }}{% if not loop.last %}<br>{% endif %}{% endfor %}
<td><a class="btn btn-xs btn-primary" href='{{ detail_url }}'>Detail</a>
{% endfor %}
</table>
......@@ -41,9 +53,9 @@
<li><a href='{{ url_for('doc_garant') }}'>Návod pro garanty</a> (může se hodit i ostatním organizátorům)
<li><a href='{{ url_for('static', filename='doc/import-navod.pdf') }}'>Podrobnější návod k importům</a> (PDF)
<li>Export všech škol:
<a href='{{ url_for('org_export_skoly', format='en_csv') }}'>CSV s čárkami</a>,
<a href='{{ url_for('org_export_skoly', format='cs_csv') }}'>CSV se středníky</a>,
<a href='{{ url_for('org_export_skoly', format='tsv') }}'>TSV</a>
<a href='{{ url_for('org_export_schools', format='en_csv') }}'>CSV s čárkami</a>,
<a href='{{ url_for('org_export_schools', format='cs_csv') }}'>CSV se středníky</a>,
<a href='{{ url_for('org_export_schools', format='tsv') }}'>TSV</a>
<li><a href='https://docs.google.com/document/d/1XXk7Od-ZKtfmfNa-9FpFjUqmy0Ekzf2-2q3EpSWyn1w/edit?usp=sharing'>Návod na tvorbu PDF</a>
</ul>
......
......@@ -54,7 +54,7 @@
<form action="" method="POST" class="form form-inline" role="form">
{{ form_add_role.csrf_token() }}
{{ wtf.form_field(form_add_role.role) }}
{{ wtf.form_field(form_add_role.place_code, placeholder='Kód', size=8) }}
{{ wtf.form_field(form_add_role.place, size=8) }}
{{ wtf.form_field(form_add_role.year, type='number', size=3, maxlength=2) }}
{{ wtf.form_field(form_add_role.category, size=2, maxlength=2) }}
{{ wtf.form_field(form_add_role.seq, type='number', size=3, maxlength=2) }}
......
......@@ -8,6 +8,7 @@
<div class="form-frame">
<form action="" method="GET" role="form">
{{ filter.is_role_filter }}
<div class="row">
<div class='col-sm-2'><strong>Filtr organizátorů</strong></div>
<div class="col-sm-3">
......@@ -17,8 +18,35 @@
{{ wtf.form_field(filter.search_email, placeholder='Libovolná část e-mailu') }}
</div>
</div>
{% if filter.is_role_filter.data %}
<div class="row">
<div class='col-sm-2'><strong>Filtr podle rolí</strong><p>Hledá pouze organizátory, kteří mají přidělenu nějakou roli.</p></div>
<div class="col-sm-2">
{{ wtf.form_field(filter.search_role, size=filter.search_role.choices|length, class="form-control no-scroll") }}
</div>
<div class="col-sm-2">
{{ wtf.form_field(filter.search_year, placeholder='Např. 65-67,70') }}
{{ wtf.form_field(filter.search_category, placeholder='Např. A,P,Z9') }}
</div>
<div class="col-sm-2">
{{ wtf.form_field(filter.search_seq, placeholder='Např. 1,3-4') }}
</div>
<div class="col-sm-2">
<span title="Omezí role na ty, které jsou přiděleny k dané oblasti a nebo její podoblasti.">{{ wtf.form_field(filter.search_in_place) }}</span>
<span title="Omezí role na ty, které mají právo k dané oblasti. Tedy mohou být přiděleny i k nadřazené oblasti.">{{ wtf.form_field(filter.search_right_for_place) }}</span>
</div>
<div class="col-sm-2">
{{ wtf.form_field(filter.search_place_level, size=filter.search_place_level.choices|length, class="form-control no-scroll" ) }}
</div>
</div>
{% endif %}
<div class="btn-group">
{{ wtf.form_field(filter.submit, class='btn btn-primary') }}
{% if filter.is_role_filter.data %}
{{ wtf.form_field(filter.hide_role_filter) }}
{% else %}
{{ wtf.form_field(filter.show_role_filter) }}
{% endif %}
{% if filter.offset.data > 0 %}
{{ wtf.form_field(filter.previous) }}
{% else %}
......@@ -52,10 +80,15 @@
<tr>
<td>{{ user.first_name }}</td><td>{{ user.last_name }}</td>
<td>{{ user.email|mailto }}{{ user|user_flags }}</td>
<td>{% if user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% else %}
<td>{% if user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% endif %}
{% if user.roles|count > 0 %}
<ul>
{% for role in user.roles %}
{% if role.user_role_id in marked_roles_id %}
<li><b>{{ role }}</b></li>
{% else %}
<li>{{ role }}</li>
{% endif %}
{%- endfor %}
</ul>
{% endif %}</td>
......
......@@ -72,7 +72,7 @@
{% for c in contests %}
<tr>
{% set r = c.round %}
<td><a href='{{ url_for('org_contest', id=c.contest_id) }}'>{{ r.round_code() }}</a>
<td><a href='{{ url_for('org_contest', ct_id=c.contest_id) }}'>{{ r.round_code() }}</a>
<td>{{ r.year }}
<td>{{ r.category }}
<td>{{ r.name }}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set in_hier = ctx.hier_id != None %}
{% set can_manage_round = rights.have_right(Right.manage_round) and not in_hier %}
{% set can_manage_contest = rights.have_right(Right.manage_contest) %}
{% set can_view_contestants = rights.have_right(Right.view_contestants) %}
{% set can_handle_submits = rights.have_right(Right.view_submits) %}
{% set can_upload = rights.can_upload_feedback() %}
{% set can_view_statement = rights.can_view_statement() %}
{% set can_add_contest = g.gatekeeper.rights_generic().have_right(Right.add_contest) %}
{% block title %}{{ round.name }} {{ round.round_code() }}{% endblock %}
{% block title %}
{% if in_hier %}
{{ round.round_code() }}: {{ ctx.hier_place.name }}
{% else %}
{{ round.name }} {{ round.round_code() }}
{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round) }}
{{ ctx.breadcrumbs() }}
{% endblock %}
{% block body %}
<table class=data style="float: left; margin-right: 10px;">
<thead>
<tr><th colspan=2>Parametry kola <i>(nelze editovat)</i>
<tr><th colspan=2>Parametry kola{% if can_manage_round %} <i>(nelze editovat)</i>{% endif %}
</thead>
<tr><td>Ročník<td>{{ round.year }}
<tr><td>Kategorie<td>{{ round.category }}
......@@ -22,7 +36,7 @@
<tr><td>Skupina kol:<td>
{% for r in group_rounds %}
{% if r == round %}<i>{{ r.name }} {{ r.round_code() }} (toto kolo)</i><br>
{% else %}<a href="{{ url_for('org_round', id=r.round_id) }}">{{ r.name }} {{ r.round_code() }}</a><br>
{% else %}<a href="{{ url_for('org_round', round_id=r.round_id) }}">{{ r.name }} {{ r.round_code() }}</a><br>
{% endif %}
{% endfor %}
{% endif %}
......@@ -34,6 +48,8 @@
{% with state=round.ct_state() %}
<tr><td>Stav pro účastníky<td class='rstate-{{state.name}}'>{{ state.friendly_name() }}
{% endwith %}
<tr><td>Režim přihlašování<td>{{ round.enroll_mode.friendly_name() }}
<tr><td>Popis v přihlášce<td>{{ round.enroll_advert }}
</table>
<table class=data style="float: left;">
<thead>
......@@ -48,7 +64,7 @@
{% if not statement_exists %}
<span class=error>soubor neexistuje</span>
{% elif can_view_statement %}
<a href='{{ url_for('org_task_statement', id=round.round_id) }}'>stáhnout</a>
<a href='{{ ctx.url_for('org_task_statement') }}'>stáhnout</a>
{% else %}
není dostupné
{% endif %}
......@@ -57,7 +73,7 @@
{% endif %}
<thead>
<tr><th colspan=2>Nastavení výsledkové listiny{% if round.is_subround() %}
<i>(přejato z <a href="{{ url_for('org_round', id=round.master.round_id) }}">{{ round.master.round_code() }}</a>)</i>
<i>(přejato z <a href="{{ url_for('org_round', round_id=round.master.round_id) }}">{{ round.master.round_code() }}</a>)</i>
{% endif %}
</thead>
<tr><td>Výsledková listina<td>{{ round.master.score_mode.friendly_name() }}
......@@ -67,49 +83,74 @@
</table>
<div style="clear: both;"></div>
{% if can_view_contestants or can_manage_contest or can_manage_round or round.has_messages %}
<div class="btn-group">
<a class="btn btn-primary" href='{{ url_for('org_round_list', id=round.round_id) }}'>Seznam účastníků</a>
{% if round.state in [RoundState.grading, RoundState.closed, RoundState.delegate] %}
<a class="btn btn-primary" href='{{ url_for('org_score', round_id=round.round_id) }}'>Výsledky</a>
{% if can_view_contestants %}
<a class="btn btn-primary" href='{{ ctx.url_for('org_generic_list') }}'>Seznam účastníků</a>
{% endif %}
{% if can_view_contestants and round.state in [RoundState.grading, RoundState.closed, RoundState.delegate] and not in_hier %}
<a class="btn btn-primary" href='{{ ctx.url_for('org_score') }}'>Výsledky</a>
{% endif %}
{% if can_manage_contestants %}
<a class="btn btn-default" href='{{ url_for('org_round_import', id=round.round_id) }}'>Importovat data</a>
{% if can_manage_contest %}
<a class="btn btn-default" href='{{ ctx.url_for('org_generic_import') }}'>Importovat data</a>
{% endif %}
{% if can_manage_round %}
<a class="btn btn-default" href='{{ url_for('org_round_edit', id=round.round_id) }}'>Nastavení a termíny</a>
<a class="btn btn-default" href='{{ url_for('org_edit_statement', id=round.round_id) }}'>Zadání</a>
<a class="btn btn-default" href='{{ ctx.url_for('org_round_edit') }}'>Nastavení a termíny</a>
<a class="btn btn-default" href='{{ ctx.url_for('org_edit_statement') }}'>Zadání</a>
{% endif %}
{% if round.has_messages %}
<a class="btn btn-default" href='{{ url_for('org_round_messages', id=round.round_id) }}'>Zprávičky</a>
<a class="btn btn-default" href='{{ ctx.url_for('org_round_messages') }}'>Zprávičky</a>
{% endif %}
{% if g.user.is_admin %}
{% if g.user.is_admin and not in_hier %}
<a class="btn btn-default" href='{{ log_url('round', round.round_id) }}'>Historie</a>
{% endif %}
</div>
{% endif %}
<h3>Soutěže</h3>
{% if contests_counts %}
{% if reg_total.num_contests %}
{% set show_contests = reg_stats[0].contest != None %}
<table class=data>
<thead>
<tr>
{% if show_contests %}
<th>{{ round.get_level().name|capitalize }}
<th>Stav
{% else %}
<th>{{ reg_stats[0].region.type_name()|capitalize }}
<th>Počet soutěží
<th>Stavy soutěží
{% endif %}
<th>Počet účastníků
<th>Počet přihlášek
</tr>
</thead>
{% for (c, count) in contests_counts %}
{% for rs in reg_stats %}
<tr>
<td><a href='{{ url_for('org_contest', id=c.contest_id) }}'>{{ c.place.name }}</a>
{% with state=c.state %}
{% if show_contests %}
<td><a href='{{ url_for('org_contest', ct_id=rs.contest.contest_id) }}'>{{ rs.region.name }}</a>
{% with state=rs.contest.state %}
<td class='rstate-{{state.name}}'>{{ state.friendly_name() }}
{% endwith %}
<td>{{ count }}
{% else %}
<td><a href='{{ ctx.url_for('org_round', hier_id=rs.region.place_id) }}'>{{ rs.region.name }}</a>
<td>{{ rs.num_contests }}
<td>{% for s in rs.contest_states %}<span class='rstate-{{s.name}}'>{{ s.friendly_name() }}</span> {% endfor %}
{% endif %}
<td>{{ rs.num_active_pants }}
<td>{{ rs.num_unconfirmed_pants }}
{% endfor %}
<tfoot>
<tr>
<th>Celkem
{% if show_contests %}
<th>
<th>{{ contests_counts|sum(attribute=1) }}
{% else %}
<th>{{ reg_total.num_contests }}
<th>
{% endif %}
<th>{{ reg_total.num_active_pants }}
<th>{{ reg_total.num_unconfirmed_pants }}
</tr>
</tfoot>
</table>
......@@ -120,13 +161,13 @@
{% if can_add_contest %}
<form action="" method="POST" class="form-inline">
{{ form_add_contest.csrf_token() }}
{{ wtf.form_field(form_add_contest.place_code) }}
{{ wtf.form_field(form_add_contest.place) }}
{{ wtf.form_field(form_add_contest.create_contest) }}
</form>
{% endif %}
<h3>Úlohy</h3>
{% if tasks %}
{% if task_info %}
<table class=data>
<thead>
<tr>
......@@ -138,15 +179,15 @@
{% if can_handle_submits or can_upload %}<th>Dávkové operace{% endif %}
</tr>
</thead>
{% for task in tasks %}
{% for task, sol_count in task_info %}
<tr>
<td>{{ task.code }}
<td>{{ task.name }}
<td>{{ task.sol_count }}
<td>{{ sol_count }}
<td>{{ task.max_points|decimal|none_value('–') }}
{% if can_manage_round %}
<td><div class="btn-group">
<a class="btn btn-xs btn-primary" href="{{ url_for('org_round_task_edit', id=round.round_id, task_id=task.task_id) }}">Editovat</a>
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_round_task_edit', task_id=task.task_id) }}">Editovat</a>
{% if task.sol_count == 0 %}
<form action="" method="POST" onsubmit="return confirm('Opravdu nenávratně smazat?')" class="btn-group">
{{ form_delete_task.csrf_token() }}
......@@ -162,13 +203,13 @@
{% if can_handle_submits or can_upload %}
<td><div class="btn-group">
{% if can_handle_submits %}
<a class="btn btn-xs btn-primary" href="{{ url_for('org_round_task_download', round_id=round.round_id, task_id=task.task_id) }}">Stáhnout ZIP</a>
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_generic_batch_download', task_id=task.task_id) }}">Stáhnout ZIP</a>
{% endif %}
{% if can_upload %}
<a class="btn btn-xs btn-primary" href="{{ url_for('org_round_task_upload', round_id=round.round_id, task_id=task.task_id) }}">Nahrát ZIP</a>
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_generic_batch_upload', task_id=task.task_id) }}">Nahrát ZIP</a>
{% endif %}
{% if can_upload %}
<a class="btn btn-xs btn-default" href="{{ url_for('org_round_task_batch_points', round_id=round.round_id, task_id=task.task_id) }}">Nahrát body</a>
<a class="btn btn-xs btn-default" href="{{ ctx.url_for('org_generic_batch_points', task_id=task.task_id) }}">Nahrát body</a>
{% endif %}
</div>
{% endif %}
......@@ -179,7 +220,7 @@
<p>Zatím nebyly přidány žádné úlohy.</p>
{% endif %}
{% if can_manage_round %}
<a class="btn btn-primary right-float" href="{{ url_for('org_round_task_new', id=round.round_id) }}">Nová úloha</a>
<a class="btn btn-primary right-float" href="{{ ctx.url_for('org_round_task_new') }}">Nová úloha</a>
{% endif %}
{% endblock %}
......@@ -3,7 +3,7 @@
{% block title %}Editace kola {{ round.round_code() }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, action="Editace") }}
{{ ctx.breadcrumbs(action="Editace") }}
{% endblock %}
{% block body %}
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Seznam účastníků kola {{ round.round_code() }}{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, action="Seznam účastníků" if table else "E-maily", table=False if table else True) }}
{% endblock %}
{% set id = round.round_id %}
{% block body %}
<div class="form-frame">
<form action="" method="GET" class="form form-inline" role="form">
<div class="form-row">
{{ wtf.form_field(filter.contest_place, placeholder='Kód', size=8) }}
{{ wtf.form_field(filter.participation_place, placeholder='Kód', size=8) }}
{{ wtf.form_field(filter.school, placeholder='Kód', size=8) }}
{{ wtf.form_field(filter.participation_state) }}
</div>
<div class="form-row" style="margin-top: 5px;">
<div class="btn-group">
{{ wtf.form_field(filter.submit, class='btn btn-primary') }}
{% if table %}
<button class="btn btn-default" name="format" value="cs_csv" title="Stáhnout celý výsledek v CSV">↓ CSV</button>
<button class="btn btn-default" name="format" value="tsv" title="Stáhnout celý výsledek v TSV">↓ TSV</button>
{% endif %}
</div>
{% if table %}
<div style="float: right">
Stránka {{ filter.offset.data // filter.limit.data + 1}} z {{ (count / filter.limit.data)|round(0, 'ceil')|int }}:
<div class="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 %}
</div>
<input type="hidden" name="offset" value="{{filter.offset.data}}">
<input type="hidden" name="limit" value="{{filter.limit.data}}">
</div>
{% set max = filter.offset.data + filter.limit.data if filter.offset.data + filter.limit.data < count else count %}
{% if count > 0 %}
Zobrazuji záznamy <b>{{filter.offset.data + 1}}</b><b>{{ max }}</b> z <b>{{count}} nalezených účastníků</b>.
{% else %}
<b>Nebyly nalezeny žádné záznamy účastníků.</b>
{% endif %}
{% else %}
Celkem <b>{{count|inflected('nalezený účastník', 'nalezení účastníci', 'nalezených účastníků')}}</b>.
{% endif %}
</div>
</form>
</div>
{% if table %}
{% include 'parts/org_participants_table_actions.html' %}
{% if form_actions %}
<br>
<i>Upozornění: Můžete editovat jen účastníky soutěžící v oblastech, ke kterým máte právo.</i>
{% endif %}
{% else %}
{% include 'parts/org_participants_emails.html' %}
{% endif %}
{% endblock %}
......@@ -3,7 +3,7 @@
{% block title %}{{ round.name }} {{ round.round_code() }} – zprávičky{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, action='Zprávičky') }}
{{ ctx.breadcrumbs(action='Zprávičky') }}
{% endblock %}
{% block body %}
......
......@@ -5,7 +5,7 @@
{% if task %}Editace úlohy {{ task.code }} {{ task.name }}{% else %}Nová úloha{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, task=task, action="Nová úloha" if not task else None) }}
{{ ctx.breadcrumbs(action="Nová úloha" if not ctx.task else None) }}
{% endblock %}
{% block body %}
......
......@@ -14,7 +14,7 @@
</thead>
{% for r in rounds %}
<tr>
<td><a href='{{ url_for('org_round', id=r.round_id) }}'>{{ r.round_code() }}</a>
<td><a href='{{ url_for('org_round', round_id=r.round_id) }}'>{{ r.round_code() }}</a>
<td>{{ r.year }}
<td>{{ r.category }}
<td>{{ r.seq }}{{ r.part_code() }}
......@@ -23,4 +23,10 @@
<td class='rstate-{{r.state.name}}'>{{ r.state.friendly_name() }}
{% endfor %}
</table>
{% if history %}
<p><a class='btn btn-default' href='{{ url_for('org_rounds') }}'>Aktuální ročník</a>
{% else %}
<p><a class='btn btn-default' href='{{ url_for('org_rounds_history') }}'>Všechny ročníky</a>
{% endif %}
{% endblock %}
......@@ -4,14 +4,14 @@
{{ round.round_code() }}: Výsledky pro {{ round.name|lower }} kategorie {{ round.category }}{% if contest %} {{ contest.place.name_locative() }}{% endif %}
{% endblock %}
{% block breadcrumbs %}
{{ contest_breadcrumbs(round=round, contest=contest, action="Výsledky oblasti" if contest else "Výsledky kola") }}
{{ ctx.breadcrumbs(action="Výsledky oblasti" if contest else "Výsledky kola") }}
{% endblock %}
{% block pretitle %}
<div class="btn-group pull-right">
{% if contest %}
<a class="btn btn-default" href="{{ url_for('org_contest_solutions', id=contest.contest_id) }}">Odevzdaná řešení</a>
<a class="btn btn-default" href="{{ url_for('org_score', round_id=round.round_id) }}">Výsledky kola</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_solutions') }}">Odevzdaná řešení</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_score', ct_id=None) }}">Výsledky kola</a>
{% endif %}
</div>
{% endblock %}
......@@ -42,7 +42,7 @@
{% if group_rounds|length > 1 %}
<p>Toto je <b>sdílená výsledková listina</b> pro několik kol:
{% for r in group_rounds %}{% if loop.index > 1 %}, {% endif %}<a href="{{ url_for('org_round', id=r.round_id) }}">{{ r.round_code() }} {{ r.name }}</a>{% endfor %}.
{% for r in group_rounds %}{% if loop.index > 1 %}, {% endif %}<a href="{{ url_for('org_round', round_id=r.round_id) }}">{{ r.round_code() }} {{ r.name }}</a>{% endfor %}.
Jsou v ní započítány body ze všech úloh těchto kol.</p>
{% endif %}
......