diff --git a/seminar/urls.py b/seminar/urls.py index 7ba7c239..a488f362 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -18,7 +18,7 @@ urlpatterns = [ path('rocnik//', views.RocnikView.as_view(), name='seminar_rocnik'), path('cislo/./', views.CisloView.as_view(), name='seminar_cislo'), - path('problem//', views.ProblemView.as_view(), name='seminar_problem'), + path('problem//', views.problemView, name='seminar_problem'), #path('treenode//', views.TreeNodeView.as_view(), name='seminar_treenode'), #path('treenode//json/', views.TreeNodeJSONView.as_view(), name='seminar_treenode_json'), #path('treenode/text//', views.TextWebView.as_view(), name='seminar_textnode_web'), diff --git a/seminar/views/__init__.py b/seminar/views/__init__.py index a9eb3ea9..163f2535 100644 --- a/seminar/views/__init__.py +++ b/seminar/views/__init__.py @@ -2,3 +2,6 @@ from .views_all import * from .autocomplete import * from .views_rest import * from .odevzdavatko import * + +# Dočsasné views +from .docasne import * diff --git a/seminar/views/docasne.py b/seminar/views/docasne.py new file mode 100644 index 00000000..da34d2e6 --- /dev/null +++ b/seminar/views/docasne.py @@ -0,0 +1,16 @@ +from http import HTTPStatus +import seminar.models as m +from django.shortcuts import render, get_object_or_404 + +def problemView(request, pk): + # Pokud problém neexistuje, hodíme obyčejnou 404 + # Taktéž v případě, že takový problém nemá být vidět + problem = get_object_or_404(m.Problem, id=pk, stav__in=[m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY]) + # Problém existuje, neumíme ho zobrazit, renderujeme nějakou haluz + template = 'universal.html' + ctx = { + 'raw_html': f'

Obsah nelze zobrazit

Požadovaný problém {problem.nazev} sice existuje, ale aktuálně jej nelze zobrazit. Omlouváme se za potíže

', + } + status_code = HTTPStatus.NOT_FOUND + return render(request, template, context=ctx, status=status_code) + diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index ef29e0b0..13091008 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -360,33 +360,34 @@ class TextWebView(generic.DetailView): return JsonResponse(model_to_dict(self.object,exclude='do_cisla')) -class ProblemView(generic.DetailView): - model = s.Problem - # Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView - template_name = TreeNodeView.template_name - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - user = self.request.user - # Teď potřebujeme doplnit tnldata do kontextu. - # Ošklivý type switch, hezčí by bylo udělat to polymorfni. FIXME. - if False: - # Hezčí formátování zbytku :-P - pass - elif isinstance(self.object, s.Clanek) or isinstance(self.object, s.Konfera): - # Tyhle Problémy mají ŘešeníNode - context['tnldata'] = TNLData.from_treenode(self.object.reseninode,user) - elif isinstance(self.object, s.Uloha): - # FIXME: Teď vždycky zobrazujeme i vzorák! Možná by bylo hezčí/lepší mít to stejně jako pro Téma: procházet jen dosažitelné z Ročníku / čísla / whatever - tnl_zadani = TNLData.from_treenode(self.object.ulohazadaninode,user) - tnl_vzorak = TNLData.from_treenode(self.object.ulohavzoraknode,user) - context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak]) - elif isinstance(self.object, s.Tema): - rocniknode = self.object.rocnik.rocniknode - context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, s.TemaVCisleNode)) - else: - raise ValueError("Obecný problém nejde zobrazit.") - return context +# FIXME: Pozor, níž je ještě jeden ProblemView! +#class ProblemView(generic.DetailView): +# model = s.Problem +# # Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView +# template_name = TreeNodeView.template_name +# +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) +# user = self.request.user +# # Teď potřebujeme doplnit tnldata do kontextu. +# # Ošklivý type switch, hezčí by bylo udělat to polymorfni. FIXME. +# if False: +# # Hezčí formátování zbytku :-P +# pass +# elif isinstance(self.object, s.Clanek) or isinstance(self.object, s.Konfera): +# # Tyhle Problémy mají ŘešeníNode +# context['tnldata'] = TNLData.from_treenode(self.object.reseninode,user) +# elif isinstance(self.object, s.Uloha): +# # FIXME: Teď vždycky zobrazujeme i vzorák! Možná by bylo hezčí/lepší mít to stejně jako pro Téma: procházet jen dosažitelné z Ročníku / čísla / whatever +# tnl_zadani = TNLData.from_treenode(self.object.ulohazadaninode,user) +# tnl_vzorak = TNLData.from_treenode(self.object.ulohavzoraknode,user) +# context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak]) +# elif isinstance(self.object, s.Tema): +# rocniknode = self.object.rocnik.rocniknode +# context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, s.TemaVCisleNode)) +# else: +# raise ValueError("Obecný problém nejde zobrazit.") +# return context #class AktualniZadaniView(generic.TemplateView): @@ -681,29 +682,30 @@ class RocnikView(generic.DetailView): return context -class ProblemView(generic.DetailView): - model = Problem - - # Používáme funkci, protože přímo template_name neumí mít v přiřazení dost logiky. Ledaže by se to udělalo polymorfně... - def get_template_names(self, **kwargs): - # FIXME: Switch podle typu není hezký, ale nechtělo se mi to přepisovat celé. Správně by se tohle mělo řešit polymorfismem. - spravne_templaty = { - s.Uloha: "uloha", - s.Tema: "tema", - s.Konfera: "konfera", - s.Clanek: "clanek", - } - context = super().get_context_data(**kwargs) - return ['seminar/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html'] - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - # Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče. - if not context['object'].verejne() and not self.request.user.je_org: - raise PermissionDenied() - if isinstance(context['object'], Clanek): - context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni') - return context +# FIXME: Pozor, výš je ještě jeden ProblemView! +#class ProblemView(generic.DetailView): +# model = Problem +# +# # Používáme funkci, protože přímo template_name neumí mít v přiřazení dost logiky. Ledaže by se to udělalo polymorfně... +# def get_template_names(self, **kwargs): +# # FIXME: Switch podle typu není hezký, ale nechtělo se mi to přepisovat celé. Správně by se tohle mělo řešit polymorfismem. +# spravne_templaty = { +# s.Uloha: "uloha", +# s.Tema: "tema", +# s.Konfera: "konfera", +# s.Clanek: "clanek", +# } +# context = super().get_context_data(**kwargs) +# return ['seminar/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html'] +# +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) +# # Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče. +# if not context['object'].verejne() and not self.request.user.je_org: +# raise PermissionDenied() +# if isinstance(context['object'], Clanek): +# context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni') +# return context