Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
9.1 KiB
203 lines
9.1 KiB
{% extends "base.html" %}
|
|
{% load static %}
|
|
{% load deadliny %}
|
|
{% load mail %}
|
|
{% load jmena %}
|
|
|
|
{# Přišlo mi to hezčí, než psát všude if. #}
|
|
{% block custom_css %}
|
|
{% if object.resitele.count == 1 %}
|
|
<style>.teamovaCast {display: none}</style>
|
|
{% endif %}
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
|
|
{% if edit %}
|
|
<script src="{% static 'odevzdavatko/dynamic_formsets_for_detail.js' %}"></script>
|
|
<script src="{% static 'odevzdavatko/check_for_detail.js' %}"></script>
|
|
<script type="text/javascript">
|
|
$(document).ready(function () {
|
|
const zaskrtavatko = document.getElementById('pridat-jmena-resitelu');
|
|
zaskrtavatko.addEventListener('change', () => {
|
|
for (var priloha of document.getElementsByClassName("reseni-ke-stazeni")) {
|
|
let new_download = zaskrtavatko.checked ? priloha.dataset.altFilename : '';
|
|
priloha.setAttribute('download', new_download);
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
{% endif %}
|
|
|
|
|
|
<p>Řešené problémy: {{ object.problem.all | join:", " }}</p>
|
|
|
|
{% if edit %}
|
|
<p>Řešitelé:
|
|
{% for r in object.resitele.all %}
|
|
{{ r }}
|
|
{# DjangoTemplates neumí spojovat řetězce (https://stackoverflow.com/q/4386168), tak si necháváme vyrobit subject mailu ve view. #}
|
|
({% maillink r.osoba.email to=r.osoba.email subject=predmetmailu %}){% if forloop.revcounter0 != 0 %}, {% endif %}
|
|
{% endfor %}
|
|
</p>
|
|
<p>
|
|
{% maillink "Poslat mail všem řešitelům" bcc=maily_vsech_resitelu subject=predmetmailu %}
|
|
</p>
|
|
{% else %}
|
|
<p>Řešitelé: {{ object.resitele.all | join:", " }}</p>
|
|
{% endif %}
|
|
|
|
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
|
<p>Forma: {{ object.get_forma_display }}</p>
|
|
|
|
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}</p>
|
|
|
|
{# Soubory: #}
|
|
<h3>Přílohy:</h3>
|
|
{% if object.prilohy.all %}
|
|
<table class="dosla_reseni">
|
|
<tr><th>Soubor</th><th>Řešitelova poznámka</th><th>Datum</th></tr>
|
|
{% for priloha in object.prilohy.all %}
|
|
<tr>
|
|
<td><a class='reseni-ke-stazeni'
|
|
href="{{ priloha.soubor.url }}"
|
|
download
|
|
data-alt-filename="{{object.resitele.first.osoba | jmeno_jako_prefix }}_{{ object.id }}_{{ priloha.split | last}}"
|
|
>{{ priloha.split | last }}</a></td>
|
|
<td>{{ priloha.res_poznamka }}</td>
|
|
<td>{{ priloha.vytvoreno }}</td></tr>
|
|
{% endfor %}
|
|
</table>
|
|
{% if edit %} {# FIXME: tohle nesouvisí s editací, ale s tím, jestli je člověk org… #}
|
|
<br>
|
|
<input type=checkbox id="pridat-jmena-resitelu">
|
|
<label class="field-label" for="pridat-jmena-resitelu">Uvést jméno řešitele v názvu souboru při stažení.</label>
|
|
{% endif %}
|
|
{% else %}
|
|
<p>Žádné přílohy</p>
|
|
{% endif %}
|
|
|
|
{% if edit %}
|
|
<form method=post onsubmit="return zkontroluj_hodnoceni();">
|
|
{# Poznámka #}
|
|
<h3>Neveřejná poznámka:</h3>
|
|
<p>{{ poznamka_form.poznamka }}</p>
|
|
|
|
|
|
<script>vporadku=true;</script>
|
|
{% for h in hodnoceni %}{% if h.body < 0.0 %}
|
|
<script>
|
|
if(vporadku){
|
|
vporadku=false;
|
|
alert(
|
|
"Pozor! Některé hodnocení má záporné body.\n\n" +
|
|
"Buď jde o záměr, nebo o špatné zadáný počet bodů (např. součet bodů za úlohu) nebo se něco pokazilo.\n\n" +
|
|
"Pokud se to děje neočekávaně a opakovaně, napiš webařům :)"
|
|
);
|
|
}
|
|
</script>
|
|
{% endif %}{% endfor %}
|
|
|
|
|
|
{# Hodnocení: #}
|
|
<h3>Hodnocení:</h3>
|
|
<table>
|
|
{% csrf_token %}
|
|
{{ form.management_form }}
|
|
</table>
|
|
<table id="form_set">
|
|
<tr><th>Problém</th><th>{# 📖 #}🧍</th><th>{# 🔵 #}🧍∑</th><th class="teamovaCast">{# 💪 #}🧑🤝🧑</th><th class="teamovaCast">{# ❤ #}🧑🤝🧑∑</th><th>Deadline pro body</th><th>Zpětná vazba pro řešitele</th></tr>
|
|
{% for subform in form %}
|
|
<tbody>
|
|
<tr class="hodnoceni">
|
|
<td>{{ subform.problem }}</td>
|
|
<td class="bodovani">{{ subform.body }}</td>
|
|
<td class="bodovani">{{ subform.body_celkem }}</td>
|
|
<td class="bodovani teamovaCast">{{ subform.body_neprepocitane }}</td>
|
|
<td class="bodovani teamovaCast">{{ subform.body_neprepocitane_celkem }}</td>
|
|
<td>{{ subform.deadline_body }}</td>
|
|
<td>{{ subform.feedback }}</td>
|
|
<td class="has_smazat_hodnoceni"><a href="#" class="smazat_hodnoceni" id="id_{{subform.prefix}}-jsremove" title="Smazat hodnocení"><img src="{% static "odevzdavatko/cross.png" %}" alt="Smazat"></a></td>
|
|
</tr>
|
|
</tbody>
|
|
{% endfor %}
|
|
</table>
|
|
|
|
|
|
<a href="#" title="Přidat hodnocení"> <img src="{% static "odevzdavatko/plus.png" %}" id="pridat_hodnoceni" alt="Přidat hodnocení"></a> <br/>
|
|
<input type=submit value="Uložit"></form>
|
|
|
|
<table id="empty_form" style="display: none;">
|
|
<tr class="hodnoceni">
|
|
<td>{{ form.empty_form.problem }}</td>
|
|
<td class="bodovani">{{ form.empty_form.body }}</td>
|
|
<td class="bodovani">{{ form.empty_form.body_celkem }}</td>
|
|
<td class="bodovani teamovaCast">{{ form.empty_form.body_neprepocitane }}</td>
|
|
<td class="bodovani teamovaCast">{{ form.empty_form.body_neprepocitane_celkem }}</td>
|
|
<td>{{ form.empty_form.deadline_body }}</td>
|
|
<td>{{ form.empty_form.feedback }}</td>
|
|
<td class="has_smazat_hodnoceni"><a href="#" class="smazat_hodnoceni" id="id_{{form.empty_form.prefix}}-jsremove" title="Smazat hodnocení"><img src="{% static "odevzdavatko/cross.png" %}" alt="Smazat"></a></td>
|
|
</tr>
|
|
</table>
|
|
|
|
{% else %}
|
|
<h3>Hodnocení:</h3>
|
|
<table class="dosla_reseni">
|
|
<tr><th>Problém</th><th>{# 📖 #}🧍</th><th>{# 🔵 #}🧍∑</th><th class="teamovaCast">{# 💪 #}🧑🤝🧑</th><th class="teamovaCast">{# ❤ #}🧑🤝🧑∑</th><th>Zpětná vazba od opravovatele</th></tr>
|
|
{% for h in hodnoceni %}
|
|
<tr class="hodnoceni">
|
|
<td>{{ h.problem }}</td>
|
|
<td class="bodovani">{{ h.body }}</td>
|
|
<td class="bodovani">{{ h.body_celkem }}</td>
|
|
<td class="bodovani teamovaCast">{{ h.body_neprepocitane }}</td>
|
|
<td class="bodovani teamovaCast">{{ h.body_neprepocitane_celkem }}</td>
|
|
<td>{{ h.feedback | linebreaks }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
{% endif %}
|
|
|
|
<h3>Vysvětlivky:</h3>
|
|
<dl>
|
|
<dt>{# 📖 #}🧍</dt>
|
|
<dd>Body za toto řešení.</dd>
|
|
|
|
<dt>{# 🔵 #}🧍∑</dt>
|
|
<dd>Body za tento problém/úlohu (součet za všechna řešení).</dd>
|
|
|
|
<dt class="teamovaCast">{# 💪 #}🧑🤝🧑</dt>
|
|
<dd class="teamovaCast">Body, které by dostal tým, kdyby to řešil jako jeden řešitel, za toto řešení.</dd>
|
|
|
|
<dt class="teamovaCast">{# ❤ #}🧑🤝🧑∑</dt>
|
|
<dd class="teamovaCast">Body, které by dostal tým, kdyby to řešil jako jeden řešitel, za tento problém/úlohu (součet za všechna řešení).</dd>
|
|
</dl>
|
|
|
|
|
|
{% if edit %}
|
|
<h3>Návod pro hodnocení:</h3>
|
|
Sloupce:
|
|
<ol>
|
|
<li>Pokud to neudělal řešitel, je třeba pomocí pluska přidat řádky (případně křížkem smazat) a vyplnit problémy tak, aby zde byly všechny, které řešení řeší (body zadáváme přímo k úlohám, ne k témátku samotnému).</li>
|
|
<li>Pak je třeba do jednoho ze 2 nebo 4 sloupců vyplnit body (lze udělovat desetiny, setiny už udělovat nejde):
|
|
<ul>
|
|
<li>TLDR: pokud si počítáš a kontroluješ vše sám, vyplňuj do nejlevějšího. Pokud naopak vždy vyplňuješ to, kolik řešení má dostat bodů (bez ohledu na počet řešitelů a předchozí odevzdání), vyplňuj nejpravější.</li>
|
|
<li>Zaprvé je třeba dávat pozor, že řešitel už mohl dostat body za danou úlohu (to je rozdíl mezi lichými a sudými sloupci).</li>
|
|
<li>Zadruhé řešení, na kterém se spolupracovalo, dostává body přepočítané podle vzorečku <a href="https://mam.matfyz.cz/jak-resit/podrobneji/">zde dole</a>. To dělá rozdíl mezi prvními a druhými dvěma sloupci, pokud se oboje zobrazují.</li>
|
|
<li>Co který sloupec znamená, je napsáno výše ve vysvětlivkách.
|
|
</ul>
|
|
</li>
|
|
<li>Pokud nemáš důvod, deadline neměň. Sloupeček s deadlinem znamená, do kterého deadlinu se započítají body (nemusí se shodovat s deadlinem řešení).</li>
|
|
<li>Poslední sloupec je na zpětnou vazbu řešiteli, tedy (na rozdíl od Neveřejné poznámky, která je určena pro synchronizaci orgů) ji uvidí řešitelé. Zatím jen pasivně (nechodí e-mail). Pohled řešitele si můžete prohlédnout <a href="{% url 'odevzdavatko_resitel_reseni' reseni.id %}">zde</a>. Pokud chcete z nějakého důvodu napsat řešitelům e-mail, klikněte na „Poslat mail všem řešitelům“.</li>
|
|
</ol>
|
|
|
|
Další poznámky
|
|
<ul>
|
|
<li>Pokud chceš zadané body smazat (rozmyslel sis to a ohodnotíš to později), smaž body v libovolném sloupeci.</li>
|
|
<li>Ne, soubory si zatím nejde stáhnout lépe než proklikáním všech řešeních. Stejně tak nejde hromadně bodovat. Třeba někdy půjde.</li>
|
|
<li>Pokud řešitel odevzdal něco nesouvisejícího, nebo něco duplicitně, tak mu za to dejte nulu a jako problém nastavte něco, co odevzdal (ať se mu ve výsledkovce nezobrazuje 0 na špatném místě). A upozorni ho.</li>
|
|
<li>Ano, lze zadávat záporné body (např. za podvádění), web vás bude silně upozorňovat, ale jinak mu to nevadí.</li>
|
|
<li>Libovolné problémy s hodnotítkem řeš s {% maillink 'webaři' to='web@mam.mff.cuni.cz' subject='Hodnotítko' %}.</li>
|
|
</ul>
|
|
{% endif %}
|
|
|
|
{% endblock %}
|
|
|