Browse Source

Náhradní problemView, který nebude zbytečně házet 403

middleware_test
MaM Web user 3 years ago
parent
commit
6e9eb4548f
  1. 2
      seminar/urls.py
  2. 3
      seminar/views/__init__.py
  3. 16
      seminar/views/docasne.py
  4. 102
      seminar/views/views_all.py

2
seminar/urls.py

@ -18,7 +18,7 @@ urlpatterns = [
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'), 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('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>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
#path('treenode/<int:pk>/json/', views.TreeNodeJSONView.as_view(), name='seminar_treenode_json'), #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/text/<int:pk>/', views.TextWebView.as_view(), name='seminar_textnode_web'),

3
seminar/views/__init__.py

@ -2,3 +2,6 @@ from .views_all import *
from .autocomplete import * from .autocomplete import *
from .views_rest import * from .views_rest import *
from .odevzdavatko import * from .odevzdavatko import *
# Dočsasné views
from .docasne import *

16
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'<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)

102
seminar/views/views_all.py

@ -360,33 +360,34 @@ class TextWebView(generic.DetailView):
return JsonResponse(model_to_dict(self.object,exclude='do_cisla')) return JsonResponse(model_to_dict(self.object,exclude='do_cisla'))
class ProblemView(generic.DetailView): # FIXME: Pozor, níž je ještě jeden ProblemView!
model = s.Problem #class ProblemView(generic.DetailView):
# Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView # model = s.Problem
template_name = TreeNodeView.template_name # # 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) # def get_context_data(self, **kwargs):
user = self.request.user # context = super().get_context_data(**kwargs)
# Teď potřebujeme doplnit tnldata do kontextu. # user = self.request.user
# Ošklivý type switch, hezčí by bylo udělat to polymorfni. FIXME. # # Teď potřebujeme doplnit tnldata do kontextu.
if False: # # Ošklivý type switch, hezčí by bylo udělat to polymorfni. FIXME.
# Hezčí formátování zbytku :-P # if False:
pass # # Hezčí formátování zbytku :-P
elif isinstance(self.object, s.Clanek) or isinstance(self.object, s.Konfera): # pass
# Tyhle Problémy mají ŘešeníNode # elif isinstance(self.object, s.Clanek) or isinstance(self.object, s.Konfera):
context['tnldata'] = TNLData.from_treenode(self.object.reseninode,user) # # Tyhle Problémy mají ŘešeníNode
elif isinstance(self.object, s.Uloha): # context['tnldata'] = TNLData.from_treenode(self.object.reseninode,user)
# 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 # elif isinstance(self.object, s.Uloha):
tnl_zadani = TNLData.from_treenode(self.object.ulohazadaninode,user) # # 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_vzorak = TNLData.from_treenode(self.object.ulohavzoraknode,user) # tnl_zadani = TNLData.from_treenode(self.object.ulohazadaninode,user)
context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak]) # tnl_vzorak = TNLData.from_treenode(self.object.ulohavzoraknode,user)
elif isinstance(self.object, s.Tema): # context['tnldata'] = TNLData.from_tnldata_list([tnl_zadani, tnl_vzorak])
rocniknode = self.object.rocnik.rocniknode # elif isinstance(self.object, s.Tema):
context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, s.TemaVCisleNode)) # rocniknode = self.object.rocnik.rocniknode
else: # context['tnldata'] = TNLData.filter_treenode(rocniknode, lambda x: isinstance(x, s.TemaVCisleNode))
raise ValueError("Obecný problém nejde zobrazit.") # else:
return context # raise ValueError("Obecný problém nejde zobrazit.")
# return context
#class AktualniZadaniView(generic.TemplateView): #class AktualniZadaniView(generic.TemplateView):
@ -681,29 +682,30 @@ class RocnikView(generic.DetailView):
return context return context
class ProblemView(generic.DetailView): # FIXME: Pozor, výš je ještě jeden ProblemView!
model = Problem #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): # # 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ě...
# 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. # def get_template_names(self, **kwargs):
spravne_templaty = { # # 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.
s.Uloha: "uloha", # spravne_templaty = {
s.Tema: "tema", # s.Uloha: "uloha",
s.Konfera: "konfera", # s.Tema: "tema",
s.Clanek: "clanek", # s.Konfera: "konfera",
} # s.Clanek: "clanek",
context = super().get_context_data(**kwargs) # }
return ['seminar/archiv/problem_' + spravne_templaty[context['object'].__class__] + '.html'] # 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) # def get_context_data(self, **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. # context = super().get_context_data(**kwargs)
if not context['object'].verejne() and not self.request.user.je_org: # # 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.
raise PermissionDenied() # if not context['object'].verejne() and not self.request.user.je_org:
if isinstance(context['object'], Clanek): # raise PermissionDenied()
context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni') # if isinstance(context['object'], Clanek):
return context # context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni')
# return context

Loading…
Cancel
Save