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
	
	 MaM Web user
						MaM Web user