Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
commit
43854c4f06
10 changed files with 193 additions and 245 deletions
175
data/flat.json
175
data/flat.json
File diff suppressed because one or more lines are too long
|
@ -337,8 +337,8 @@
|
|||
"sort_order": 33,
|
||||
"title": "Výsledková listina",
|
||||
"tree": 1,
|
||||
"url": "zadani/vysledkova-listina/",
|
||||
"urlaspattern": false
|
||||
"url": "seminar_aktualni_vysledky",
|
||||
"urlaspattern": true
|
||||
},
|
||||
"model": "sitetree.treeitem",
|
||||
"pk": 16
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
,anet,erebus,25.03.2020 22:21,file:///home/anet/.config/libreoffice/4;
|
|
@ -316,3 +316,77 @@ class JednoHodnoceniForm(forms.ModelForm):
|
|||
OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm,
|
||||
extra = 0,
|
||||
)
|
||||
|
||||
# FIXME: Ideálně by mělo být součástí třídy níž, ale neumím to udělat
|
||||
DATE_FORMAT = '%Y-%m-%d'
|
||||
|
||||
class OdevzdavatkoTabulkaFiltrForm(forms.Form):
|
||||
"""Form pro filtrování přehledové odevzdávátkové tabulky
|
||||
|
||||
Inspirováno https://kam.mff.cuni.cz/mffzoom/"""
|
||||
|
||||
# Věci definované níž se importují i ve views pro odevzdávátko (Inspirováno https://docs.djangoproject.com/en/3.1/ref/models/fields/#field-choices)
|
||||
|
||||
RESITELE_RELEVANTNI = 'relevantni'
|
||||
RESITELE_LETOSNI = 'letosni'
|
||||
RESITELE_CHOICES = [
|
||||
(RESITELE_RELEVANTNI, 'Relevantní řešitelé'), # I.e. nezobrazovat prázdné řádky tabulky
|
||||
(RESITELE_LETOSNI, 'Všichni letošní'),
|
||||
# Možná: všechny vč. historických?
|
||||
]
|
||||
|
||||
PROBLEMY_MOJE = 'moje'
|
||||
PROBLEMY_LETOSNI = 'letosni'
|
||||
PROBLEMY_CHOICES = [
|
||||
(PROBLEMY_MOJE, 'Moje problémy'), # Letošní problémy, které mají v sobě nebo v nadproblémech přiřazeného daného orga
|
||||
(PROBLEMY_LETOSNI, 'Všechny letošní'),
|
||||
# TODO: *hlavní problémy, možná všechny...
|
||||
# XXX: Chtělo by to i "aktuálně zadané...
|
||||
]
|
||||
|
||||
# TODO: Typy problémů (problémy, úlohy, ostatní, všechny)? Jen některá řešení (obodovaná/neobodovaná, víc řešitelů, ...)?
|
||||
|
||||
|
||||
def gen_terminy():
|
||||
import datetime
|
||||
from time import strftime
|
||||
|
||||
aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik
|
||||
aktualni_cislo = m.Nastaveni.get_solo().aktualni_cislo
|
||||
|
||||
result = []
|
||||
|
||||
for cislo in m.Cislo.objects.filter(
|
||||
rocnik=aktualni_rocnik,
|
||||
poradi__lte=aktualni_cislo.poradi,
|
||||
).reverse(): # Standardně se řadí od nejnovějšího čísla
|
||||
# Předem je mi líto kohokoliv, kdo tyhle řádky bude číst...
|
||||
if cislo.datum_vydani is not None and cislo.datum_vydani <= datetime.date.today():
|
||||
result.append((
|
||||
strftime(DATE_FORMAT, cislo.datum_vydani.timetuple()),
|
||||
f"Vydání {cislo.poradi}. čísla"))
|
||||
if cislo.datum_preddeadline is not None and cislo.datum_preddeadline <= datetime.date.today():
|
||||
result.append((
|
||||
strftime(DATE_FORMAT, cislo.datum_preddeadline.timetuple()),
|
||||
f"Předdeadline {cislo.poradi}. čísla"))
|
||||
if cislo.datum_deadline_soustredeni is not None and cislo.datum_deadline_soustredeni <= datetime.date.today():
|
||||
result.append((
|
||||
strftime(DATE_FORMAT, cislo.datum_deadline_soustredeni.timetuple()),
|
||||
f"Sous. deadline {cislo.poradi}. čísla"))
|
||||
if cislo.datum_deadline is not None and cislo.datum_deadline <= datetime.date.today():
|
||||
result.append((
|
||||
strftime(DATE_FORMAT, cislo.datum_deadline.timetuple()),
|
||||
f"Finální deadline {cislo.poradi}. čísla"))
|
||||
result.append((
|
||||
strftime(DATE_FORMAT, datetime.date.today().timetuple()), f"Dnes"))
|
||||
|
||||
return result
|
||||
|
||||
# NOTE: Initial definuji pro jednotlivé fieldy, aby to bylo tady a nebylo potřeba to řešit ve views...
|
||||
resitele = forms.ChoiceField(choices=RESITELE_CHOICES, initial=RESITELE_RELEVANTNI)
|
||||
problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES, initial=PROBLEMY_MOJE)
|
||||
|
||||
# choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem...
|
||||
terminy = gen_terminy()
|
||||
reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-2])
|
||||
reseni_do = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-1])
|
||||
|
|
|
@ -19,18 +19,15 @@
|
|||
{% if clanek.cislo.pdf %}
|
||||
<a href="{{ clanek.cislo.pdf.url }}">
|
||||
{{ clanek.nazev }}
|
||||
({% for r in clanek.reseni_set.first.resitele.all %}
|
||||
{{r}}
|
||||
{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
({% for r in clanek.reseni_set.first.resitele.all %}{{r}}{% if not forloop.last %}, {% endif %}{% endfor %})
|
||||
</a>
|
||||
)
|
||||
|
||||
{% else %}
|
||||
{{ clanek.nazev }}
|
||||
({% for r in clanek.reseni_set.first.resitele.all %}
|
||||
{% for r in clanek.reseni_set.first.resitele.all %}
|
||||
{{r}},
|
||||
{% endfor %}
|
||||
vyšlo v čísle {{clanek.cislo}})
|
||||
(vyšlo v čísle {{clanek.cislo}})
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endwith %}
|
||||
|
|
|
@ -4,6 +4,14 @@
|
|||
|
||||
{% block content %}
|
||||
|
||||
<form method=get action=.>
|
||||
{{ filtr.resitele }}
|
||||
{{ filtr.problemy }}
|
||||
Od: {{ filtr.reseni_od }}
|
||||
Do: {{ filtr.reseni_do }}
|
||||
<input type=submit value="→">
|
||||
</form>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td></td> {# Prázdná buňka v levém horním rohu #}
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
|
||||
<h1>
|
||||
{% block nadpis1a %}{% block nadpis1b %}
|
||||
Průběžné výsledky {{ vysledkovka.rocnik }}. ročníku
|
||||
Průběžné výsledky {{ rocnik.rocnik }}. ročníku
|
||||
{% endblock %}{% endblock %}
|
||||
</h1>
|
||||
|
||||
{% if vysledkovka %}
|
||||
{% if radky_vysledkovky %}
|
||||
{% include "seminar/vysledkovka_rocnik.html" %}
|
||||
{% else %}
|
||||
<p>V tomto ročníku zatím žádné výsledky nejsou.</p>
|
||||
|
@ -23,7 +23,7 @@
|
|||
{% if user.je_org and vysledkovka_s_neverejnymi %}
|
||||
<div class='mam-org-only'>
|
||||
<h1>Výsledky včetně neveřejných</h1>
|
||||
{% with vysledkovka_s_neverejnymi as vysledkovka %}
|
||||
{% with vysledkovka_s_neverejnymi as radky_vysledkovky %}
|
||||
{% include "seminar/vysledkovka_rocnik.html" %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
|
|
|
@ -9,8 +9,8 @@ urlpatterns = [
|
|||
# path('<int:rocnik>/t<int:tematko>/', views.TematkoView),
|
||||
|
||||
# Organizatori
|
||||
path('co-je-MaM/organizatori/', views.CojemamOrganizatoriView.as_view(), name='organizatori'),
|
||||
path('co-je-MaM/organizatori/organizovali/', views.CojemamOrganizatoriStariView.as_view(), name='stari_organizatori'),
|
||||
path('o-nas/organizatori/', views.CojemamOrganizatoriView.as_view(), name='organizatori'),
|
||||
path('o-nas/organizatori/organizovali/', views.CojemamOrganizatoriStariView.as_view(), name='stari_organizatori'),
|
||||
|
||||
# Archiv
|
||||
path('archiv/rocniky/', views.ArchivView.as_view(), name="seminar_archiv_rocniky"),
|
||||
|
@ -19,15 +19,15 @@ urlpatterns = [
|
|||
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'),
|
||||
path('cislo/<int:rocnik>.<str:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
|
||||
path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'),
|
||||
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
|
||||
path('treenode/<int:pk>/json/', views.TreeNodeJSONView.as_view(), name='seminar_treenode_json'),
|
||||
path('treenode/text/<int:pk>/', views.TextWebView.as_view(), name='seminar_textnode_web'),
|
||||
path('treenode/editor/pridat/<str:co>/<int:pk>/<str:kam>/', views.TreeNodePridatView.as_view(), name='treenode_pridat'),
|
||||
path('treenode/editor/smazat/<int:pk>/', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'),
|
||||
path('treenode/editor/odvesitpryc/<int:pk>/', views.TreeNodeOdvesitPrycView.as_view(), name='treenode_odvesitpryc'),
|
||||
path('treenode/editor/podvesit/<int:pk>/<str:kam>/', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'),
|
||||
path('treenode/editor/prohodit/<int:pk>/', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'),
|
||||
path('treenode/sirotcinec/', views.SirotcinecView.as_view(), name='seminar_treenode_sirotcinec'),
|
||||
#path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
|
||||
#path('treenode/<int:pk>/json/', views.TreeNodeJSONView.as_view(), name='seminar_treenode_json'),
|
||||
#path('treenode/text/<int:pk>/', views.TextWebView.as_view(), name='seminar_textnode_web'),
|
||||
#path('treenode/editor/pridat/<str:co>/<int:pk>/<str:kam>/', views.TreeNodePridatView.as_view(), name='treenode_pridat'),
|
||||
#path('treenode/editor/smazat/<int:pk>/', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'),
|
||||
#path('treenode/editor/odvesitpryc/<int:pk>/', views.TreeNodeOdvesitPrycView.as_view(), name='treenode_odvesitpryc'),
|
||||
#path('treenode/editor/podvesit/<int:pk>/<str:kam>/', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'),
|
||||
#path('treenode/editor/prohodit/<int:pk>/', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'),
|
||||
#path('treenode/sirotcinec/', views.SirotcinecView.as_view(), name='seminar_treenode_sirotcinec'),
|
||||
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
|
||||
|
||||
# Soustredeni
|
||||
|
@ -58,9 +58,9 @@ urlpatterns = [
|
|||
|
||||
# Zadani
|
||||
# path('zadani/aktualni/', views.AktualniZadaniView.as_view(), name='seminar_aktualni_zadani'),
|
||||
path('zadani/aktualni/', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
|
||||
path('zadani/temata/', views.ZadaniTemataView, name='seminar_temata'),
|
||||
#path('zadani/vysledkova-listina/', views.ZadaniAktualniVysledkovkaView, name='seminar_vysledky'),
|
||||
path('aktualni/zadani/', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
|
||||
#path('aktualni/temata/', views.ZadaniTemataView, name='seminar_temata'),
|
||||
path('aktualni/vysledkova-listina/', views.ZadaniAktualniVysledkovkaView, name='seminar_aktualni_vysledky'),
|
||||
path('stare-novinky/', views.StareNovinkyView.as_view(), name='stare_novinky'),
|
||||
|
||||
# Clanky
|
||||
|
@ -132,16 +132,16 @@ urlpatterns = [
|
|||
),
|
||||
|
||||
path('prihlaska/',views.prihlaskaView, name='seminar_prihlaska'),
|
||||
path('login/', views.LoginView.as_view(), name='login'),
|
||||
path('logout/', views.LogoutView.as_view(), name='logout'),
|
||||
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('reset_password/', views.PasswordResetView.as_view(), name='reset_password'),
|
||||
path('change_password/', views.PasswordChangeView.as_view(), name='change_password'),
|
||||
path('reset_password_done/', views.PasswordResetDoneView.as_view(), name='reset_password_done'),
|
||||
path('reset_password_confirm/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
|
||||
path('reset_password_complete/', views.PasswordResetCompleteView.as_view(), name='reset_password_complete'),
|
||||
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'),
|
||||
path('reset-hesla/potvrzeni/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
|
||||
path('reset-hesla/hotovo/', views.PasswordResetCompleteView.as_view(), name='reset_password_complete'),
|
||||
path(
|
||||
'resitel_edit',
|
||||
'resitel/osobni-udaje/',
|
||||
login_required(views.resitelEditView, login_url='/login/'),
|
||||
name='seminar_resitel_edit'
|
||||
),
|
||||
|
@ -150,9 +150,9 @@ urlpatterns = [
|
|||
path('profil/', views.profilView, name='profil'),
|
||||
|
||||
# Autocomplete
|
||||
path('autocomplete/skola/',views.SkolaAutocomplete.as_view(), name='autocomplete_skola'),
|
||||
path('autocomplete/resitel/', org_required(views.ResitelAutocomplete.as_view()), name='autocomplete_resitel'),
|
||||
path('autocomplete/problem/odevzdatelny',views.OdevzdatelnyProblemAutocomplete.as_view(), name='autocomplete_problem_odevzdatelny'),
|
||||
path('api/autocomplete/skola/',views.SkolaAutocomplete.as_view(), name='autocomplete_skola'),
|
||||
path('api/autocomplete/resitel/', org_required(views.ResitelAutocomplete.as_view()), name='autocomplete_resitel'),
|
||||
path('api/autocomplete/problem/odevzdatelny',views.OdevzdatelnyProblemAutocomplete.as_view(), name='autocomplete_problem_odevzdatelny'),
|
||||
|
||||
path('temp/add_solution', org_required(views.AddSolutionView.as_view()), name='seminar_vloz_reseni'),
|
||||
path('temp/nahraj_reseni', resitel_required(views.NahrajReseniView.as_view()), name='seminar_nahraj_reseni'),
|
||||
|
|
|
@ -12,6 +12,7 @@ import logging
|
|||
|
||||
import seminar.models as m
|
||||
import seminar.forms as f
|
||||
from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm
|
||||
from seminar.utils import aktivniResitele, resi_v_rocniku
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -41,28 +42,55 @@ class TabulkaOdevzdanychReseniView(ListView):
|
|||
|
||||
def inicializuj_osy_tabulky(self):
|
||||
"""Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů"""
|
||||
# FIXME: jméno metody není vypovídající...
|
||||
# NOTE: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistují ty objekty (?). TODO: Otestovat
|
||||
# TODO: Prefetches, Select related, ...
|
||||
self.resitele = m.Resitel.objects.all()
|
||||
self.problemy = m.Problem.objects.all()
|
||||
self.reseni = m.Reseni.objects.all()
|
||||
|
||||
form = FiltrForm(self.request.GET)
|
||||
if form.is_valid():
|
||||
fcd = form.cleaned_data
|
||||
resitele = fcd["resitele"]
|
||||
problemy = fcd["problemy"]
|
||||
reseni_od = fcd["reseni_od"]
|
||||
reseni_do = fcd["reseni_do"]
|
||||
else:
|
||||
resitele = FiltrForm.get_initial_for_field(FormFiltr.resitele, "resitele")
|
||||
problemy = FiltrForm.get_initial_for_field(FormFiltr.problemy, "problemy")
|
||||
resitele_od = FiltrForm.get_initial_for_field(FormFiltr.resitele_od, "resitele_od")
|
||||
resitele_do = FiltrForm.get_initial_for_field(FormFiltr.resitele_do, "resitele_do")
|
||||
|
||||
|
||||
# Filtrujeme!
|
||||
aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci
|
||||
if resitele == FiltrForm.RESITELE_RELEVANTNI:
|
||||
logger.warning("Někdo chtěl v tabulce jen relevantní řešitele a měl smůlu :-(")
|
||||
resitele = FiltrForm.RESITELE_LETOSNI # Fall-through
|
||||
elif resitele == FiltrForm.RESITELE_LETOSNI:
|
||||
self.resitele = resi_v_rocniku(aktualni_rocnik)
|
||||
|
||||
if problemy == FiltrForm.PROBLEMY_MOJE:
|
||||
org = m.Organizator.objects.get(osoba__user=self.request.user)
|
||||
from django.db.models import Q
|
||||
self.problemy = self.problemy.filter(Q(autor=org)|Q(garant=org)|Q(opravovatele=org), stav=m.Problem.STAV_ZADANY)
|
||||
elif problemy == FiltrForm.PROBLEMY_LETOSNI:
|
||||
self.problemy = self.problemy.filter(stav=m.Problem.STAV_ZADANY)
|
||||
#self.problemy = list(filter(lambda problem: problem.rocnik() == aktualni_rocnik, self.problemy)) # DB HOG? # FIXME: některé problémy nemají ročník....
|
||||
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
||||
self.problemy = self.problemy.non_polymorphic()
|
||||
|
||||
self.reseni = self.reseni.filter(cas_doruceni__date__gte=reseni_od, cas_doruceni__date__lte=reseni_do)
|
||||
|
||||
def get_queryset(self):
|
||||
self.inicializuj_osy_tabulky()
|
||||
self.akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
|
||||
self.resitele = resi_v_rocniku(self.akt_rocnik)
|
||||
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
||||
self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic()
|
||||
|
||||
qs = super().get_queryset()
|
||||
qs = qs.filter(problem__in=self.problemy).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba')
|
||||
qs = qs.filter(problem__in=self.problemy, reseni__in=self.reseni, reseni__resitele__in=self.resitele).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba')
|
||||
return qs
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
# FIXME: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistuje Nastavení.
|
||||
self.akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
|
||||
self.resitele = resi_v_rocniku(self.akt_rocnik)
|
||||
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
||||
self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic()
|
||||
# self.resitele, self.reseni a self.problemy jsou již nastavené
|
||||
|
||||
ctx = super().get_context_data(*args, **kwargs)
|
||||
ctx['problemy'] = self.problemy
|
||||
|
@ -100,6 +128,10 @@ class TabulkaOdevzdanychReseniView(ListView):
|
|||
hodnoty.append(resiteluv_radek)
|
||||
ctx['radky'] = list(zip(self.resitele, hodnoty))
|
||||
|
||||
ctx['filtr'] = FiltrForm(initial=self.request.GET)
|
||||
# Pro použití hacku na automatické {{form.media}} v template:
|
||||
ctx['form'] = ctx['filtr']
|
||||
|
||||
return ctx
|
||||
|
||||
# Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji?
|
||||
|
|
|
@ -29,7 +29,7 @@ from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm
|
|||
import seminar.forms as f
|
||||
import seminar.templatetags.treenodes as tnltt
|
||||
import seminar.views.views_rest as vr
|
||||
from seminar.views.vysledkovka import vysledkovka_rocniku, vysledkovka_cisla
|
||||
from seminar.views.vysledkovka import vysledkovka_rocniku, vysledkovka_cisla, body_resitelu
|
||||
|
||||
from datetime import timedelta, date, datetime, MAXYEAR
|
||||
from django.utils import timezone
|
||||
|
@ -185,7 +185,7 @@ class TNLData(object):
|
|||
return [cls.from_treenode(treenode)]
|
||||
else:
|
||||
found = []
|
||||
for tn in all_children(treenode):
|
||||
for tn in treelib.all_children(treenode):
|
||||
result = cls.filter_treenode(tn, predicate)
|
||||
# Result by v tuhle chvíli měl být seznam TNLDat odpovídající treenodům, jež matchnuly predikát.
|
||||
for tnl in result:
|
||||
|
@ -487,29 +487,32 @@ def ZadaniTemataView(request):
|
|||
# return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka, "rocnik" : nastaveni.aktualni_rocnik().rocnik})
|
||||
#
|
||||
|
||||
#def ZadaniAktualniVysledkovkaView(request):
|
||||
# nastaveni = get_object_or_404(Nastaveni)
|
||||
# # Aktualni verejna vysledkovka
|
||||
# vysledkovka = vysledkovka_rocniku(nastaveni.aktualni_rocnik)
|
||||
# # kdyz neni verejna vysledkovka, tak zobraz starou
|
||||
# if not vysledkovka:
|
||||
# try:
|
||||
# minuly_rocnik = Rocnik.objects.get(
|
||||
# prvni_rok=(nastaveni.aktualni_rocnik.prvni_rok-1))
|
||||
# vysledkovka = vysledkovka_rocniku(minuly_rocnik)
|
||||
# except ObjectDoesNotExist:
|
||||
# pass
|
||||
# # vysledkovka s neverejnyma vysledkama
|
||||
# vysledkovka_s_neverejnymi = vysledkovka_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False)
|
||||
# return render(
|
||||
# request,
|
||||
# 'seminar/zadani/AktualniVysledkovka.html',
|
||||
# {
|
||||
# 'nastaveni': nastaveni,
|
||||
# 'vysledkovka': vysledkovka,
|
||||
# 'vysledkovka_s_neverejnymi': vysledkovka_s_neverejnymi,
|
||||
# }
|
||||
# )
|
||||
def ZadaniAktualniVysledkovkaView(request):
|
||||
nastaveni = get_object_or_404(Nastaveni)
|
||||
# Aktualni verejna vysledkovka
|
||||
vysledkovka = vysledkovka_rocniku(nastaveni.aktualni_rocnik)
|
||||
cisla = cisla_rocniku(nastaveni.aktualni_rocnik)
|
||||
# kdyz neni verejna vysledkovka, tak zobraz starou
|
||||
if not vysledkovka:
|
||||
try:
|
||||
minuly_rocnik = Rocnik.objects.get(
|
||||
prvni_rok=(nastaveni.aktualni_rocnik.prvni_rok-1))
|
||||
vysledkovka = vysledkovka_rocniku(minuly_rocnik)
|
||||
cisla = cisla_rocniku(minuly_rocnik)
|
||||
except ObjectDoesNotExist:
|
||||
pass
|
||||
# vysledkovka s neverejnyma vysledkama
|
||||
vysledkovka_s_neverejnymi = vysledkovka_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False)
|
||||
return render(
|
||||
request,
|
||||
'seminar/zadani/AktualniVysledkovka.html',
|
||||
{
|
||||
'nastaveni': nastaveni,
|
||||
'radky_vysledkovky': vysledkovka,
|
||||
'cisla': cisla,
|
||||
'vysledkovka_s_neverejnymi': vysledkovka_s_neverejnymi,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
### Titulni strana
|
||||
|
@ -969,7 +972,7 @@ class ClankyResitelView(generic.ListView):
|
|||
queryset = []
|
||||
skupiny_clanku = group_by_rocnik(clanky)
|
||||
for skupina in skupiny_clanku:
|
||||
skupina.sort(key=lambda clanek: clanek.kod_v_rocniku)
|
||||
skupina.sort(key=lambda clanek: clanek.kod_v_rocniku())
|
||||
for clanek in skupina:
|
||||
queryset.append(clanek)
|
||||
return queryset
|
||||
|
|
Loading…
Reference in a new issue