Náhradní problemView, který nebude zbytečně házet 403
This commit is contained in:
parent
e7ce91f165
commit
6e9eb4548f
4 changed files with 72 additions and 51 deletions
|
@ -18,7 +18,7 @@ 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('problem/<int:pk>/', views.problemView, 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'),
|
||||
|
|
|
@ -2,3 +2,6 @@ from .views_all import *
|
|||
from .autocomplete import *
|
||||
from .views_rest import *
|
||||
from .odevzdavatko import *
|
||||
|
||||
# Dočsasné views
|
||||
from .docasne import *
|
||||
|
|
16
seminar/views/docasne.py
Normal file
16
seminar/views/docasne.py
Normal file
|
@ -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'<h2>Obsah nelze zobrazit</h2><p>Požadovaný problém {problem.nazev} sice existuje, ale aktuálně jej nelze zobrazit. Omlouváme se za potíže</p>',
|
||||
}
|
||||
status_code = HTTPStatus.NOT_FOUND
|
||||
return render(request, template, context=ctx, status=status_code)
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue