Merge branch 'data_migrations' into test
This commit is contained in:
commit
738bb4fb2d
6 changed files with 106 additions and 5 deletions
|
@ -695,13 +695,13 @@
|
|||
"alias": null,
|
||||
"description": "",
|
||||
"hidden": false,
|
||||
"hint": "",
|
||||
"hint": "To, co ŘEŠITELÉ poslali",
|
||||
"inbreadcrumbs": true,
|
||||
"inmenu": true,
|
||||
"insitetree": true,
|
||||
"parent": 21,
|
||||
"sort_order": 37,
|
||||
"title": "Odevzdaná řešení",
|
||||
"sort_order": 38,
|
||||
"title": "Došlá řešení",
|
||||
"tree": 1,
|
||||
"url": "odevzdavatko_tabulka",
|
||||
"urlaspattern": true
|
||||
|
@ -724,7 +724,7 @@
|
|||
"inmenu": true,
|
||||
"insitetree": true,
|
||||
"parent": 21,
|
||||
"sort_order": 38,
|
||||
"sort_order": 42,
|
||||
"title": "Odhlásit se",
|
||||
"tree": 1,
|
||||
"url": "logout",
|
||||
|
@ -806,5 +806,31 @@
|
|||
},
|
||||
"model": "sitetree.treeitem",
|
||||
"pk": 41
|
||||
},
|
||||
{
|
||||
"fields": {
|
||||
"access_guest": false,
|
||||
"access_loggedin": false,
|
||||
"access_perm_type": 1,
|
||||
"access_permissions": [
|
||||
2
|
||||
],
|
||||
"access_restricted": true,
|
||||
"alias": null,
|
||||
"description": "",
|
||||
"hidden": false,
|
||||
"hint": "To, co jsem JÁ odevzdal",
|
||||
"inbreadcrumbs": true,
|
||||
"inmenu": true,
|
||||
"insitetree": true,
|
||||
"parent": 21,
|
||||
"sort_order": 37,
|
||||
"title": "Odevzdaná řešení",
|
||||
"tree": 1,
|
||||
"url": "seminar_resitel_odevzdana_reseni",
|
||||
"urlaspattern": true
|
||||
},
|
||||
"model": "sitetree.treeitem",
|
||||
"pk": 42
|
||||
}
|
||||
]
|
38
seminar/templates/seminar/odevzdavatko/resitel_prehled.html
Normal file
38
seminar/templates/seminar/odevzdavatko/resitel_prehled.html
Normal file
|
@ -0,0 +1,38 @@
|
|||
{% extends "base.html" %}
|
||||
{% load static %}
|
||||
{% load deadliny %}
|
||||
|
||||
{% block custom_css %}
|
||||
<style type=text/css>
|
||||
.dosla_reseni tr th {
|
||||
text-align: center;
|
||||
}
|
||||
.dosla_reseni tr th, .dosla_reseni tr td {
|
||||
border: 1px solid black;
|
||||
padding: 1px 10px 1px 10px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
</style>
|
||||
{% endblock custom_css %}
|
||||
|
||||
{% block content %}
|
||||
{% for rocnik, hodnoceni in podle_rocniku %}
|
||||
<h1>Ročník {{ rocnik }}</h1>
|
||||
<table class="dosla_reseni">
|
||||
<tr>
|
||||
<th>Doručeno</th>
|
||||
<th>Problém</th>
|
||||
<th>Body</th>
|
||||
<th>Deadline</th>
|
||||
</tr>
|
||||
{% for hodn in hodnoceni %}
|
||||
<tr>
|
||||
<td>{{ hodn.reseni.cas_doruceni }}</td>
|
||||
<td>{{ hodn.problem }}</td>
|
||||
<td>{{ hodn.body|default_if_none:"---" }}</td>
|
||||
<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
<a href="{% url 'logout' %}">Odhlásit se</a><br>
|
||||
<a href="{% url 'seminar_resitel_edit' %}">Upravit údaje</a><br>
|
||||
<a href="{% url 'seminar_resitel_odevzdana_reseni' %}">Odevzdaná řešení</a><br>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
|
|
@ -13,10 +13,20 @@ def deadline_text(datum):
|
|||
}
|
||||
return strings[typ]
|
||||
|
||||
@register.filter(name='deadline_kratseji')
|
||||
def deadline_kratsi_text(datum):
|
||||
typ, cislo, dl = deadline(datum)
|
||||
strings = {
|
||||
TypDeadline.PredDeadline: f"1. deadline {cislo}",
|
||||
TypDeadline.SousDeadline: f"Soustřeďkový deadline {cislo}",
|
||||
TypDeadline.FinalDeadline: f"Finální deadline {cislo}",
|
||||
}
|
||||
return strings[typ]
|
||||
|
||||
@register.filter(name='deadline_html')
|
||||
def deadline_html(datum):
|
||||
typ, _, _ = deadline(datum)
|
||||
text = deadline_text(datum)
|
||||
text = deadline_kratsi_text(datum)
|
||||
classes = {
|
||||
TypDeadline.PredDeadline: 'preddeadline',
|
||||
TypDeadline.SousDeadline: 'sous_deadline',
|
||||
|
|
|
@ -135,6 +135,7 @@ urlpatterns = [
|
|||
path('prihlasit/', views.LoginView.as_view(), name='login'),
|
||||
path('odhlasit/', views.LogoutView.as_view(), name='logout'),
|
||||
path('resitel/', resitel_required(views.ResitelView.as_view()), name='seminar_resitel'),
|
||||
path('resitel/odevzdana_reseni/', resitel_required(views.PrehledOdevzdanychReseni.as_view()), name='seminar_resitel_odevzdana_reseni'),
|
||||
path('reset-hesla/', views.PasswordResetView.as_view(), name='reset_password'),
|
||||
path('zmena-hesla/', views.PasswordChangeView.as_view(), name='change_password'),
|
||||
path('reset-hesla/2/', views.PasswordResetDoneView.as_view(), name='reset_password_done'),
|
||||
|
|
|
@ -25,6 +25,8 @@ logger = logging.getLogger(__name__)
|
|||
# - ReseniProblemuView
|
||||
# - Detail konkrétního řešení -- všechny soubory, datum, ...
|
||||
# - DetailReseniView
|
||||
# - Pro řešitele: přehled jejich odevzdaných řešení
|
||||
# - PrehledOdevzdanychReseni
|
||||
#
|
||||
# Taky se může hodit:
|
||||
# - Tabulka všech řešitelů x všech problémů?
|
||||
|
@ -238,6 +240,29 @@ def hodnoceniReseniView(request, pk, *args, **kwargs):
|
|||
return redirect(success_url)
|
||||
|
||||
|
||||
class PrehledOdevzdanychReseni(ListView):
|
||||
model = m.Hodnoceni
|
||||
template_name = 'seminar/odevzdavatko/resitel_prehled.html'
|
||||
|
||||
def get_queryset(self):
|
||||
if not self.request.user.is_authenticated:
|
||||
raise RuntimeError("Uživatel měl být přihlášený!")
|
||||
resitel = m.Resitel.objects.get(osoba__user=self.request.user)
|
||||
qs = super().get_queryset()
|
||||
qs = qs.filter(reseni__resitele__in=[resitel])
|
||||
return qs
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
ctx = super().get_context_data(*args, **kwargs)
|
||||
# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení.
|
||||
# Chceme to mít seřazené, takže místo comphrerehsion ručně postavíme pole polí. Django templates neumí použít OrderedDict :-/
|
||||
podle_rocniku = []
|
||||
for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: deadline(ho.reseni.cas_doruceni)[1].rocnik):
|
||||
podle_rocniku.append((rocnik, list(hodnoceni)))
|
||||
ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku
|
||||
# TODO: Umožnit stažení / zobrazení řešení
|
||||
return ctx
|
||||
|
||||
# Přehled všech řešení kvůli debugování
|
||||
|
||||
class SeznamReseniView(ListView):
|
||||
|
|
Loading…
Reference in a new issue