Merge branch 'data_migrations' into test
This commit is contained in:
		
						commit
						738bb4fb2d
					
				
					 6 changed files with 106 additions and 5 deletions
				
			
		|  | @ -695,13 +695,13 @@ | |||
| 			"alias": null, | ||||
| 			"description": "", | ||||
| 			"hidden": false, | ||||
| 			"hint": "", | ||||
| 			"hint": "To, co ŘEŠITELÉ poslali", | ||||
| 			"inbreadcrumbs": true, | ||||
| 			"inmenu": true, | ||||
| 			"insitetree": true, | ||||
| 			"parent": 21, | ||||
| 			"sort_order": 37, | ||||
| 			"title": "Odevzdaná řešení", | ||||
| 			"sort_order": 38, | ||||
| 			"title": "Došlá řešení", | ||||
| 			"tree": 1, | ||||
| 			"url": "odevzdavatko_tabulka", | ||||
| 			"urlaspattern": true | ||||
|  | @ -724,7 +724,7 @@ | |||
| 			"inmenu": true, | ||||
| 			"insitetree": true, | ||||
| 			"parent": 21, | ||||
| 			"sort_order": 38, | ||||
| 			"sort_order": 42, | ||||
| 			"title": "Odhlásit se", | ||||
| 			"tree": 1, | ||||
| 			"url": "logout", | ||||
|  | @ -806,5 +806,31 @@ | |||
| 		}, | ||||
| 		"model": "sitetree.treeitem", | ||||
| 		"pk": 41 | ||||
| 	}, | ||||
| 	{ | ||||
| 		"fields": { | ||||
| 			"access_guest": false, | ||||
| 			"access_loggedin": false, | ||||
| 			"access_perm_type": 1, | ||||
| 			"access_permissions": [ | ||||
| 				2 | ||||
| 			], | ||||
| 			"access_restricted": true, | ||||
| 			"alias": null, | ||||
| 			"description": "", | ||||
| 			"hidden": false, | ||||
| 			"hint": "To, co jsem JÁ odevzdal", | ||||
| 			"inbreadcrumbs": true, | ||||
| 			"inmenu": true, | ||||
| 			"insitetree": true, | ||||
| 			"parent": 21, | ||||
| 			"sort_order": 37, | ||||
| 			"title": "Odevzdaná řešení", | ||||
| 			"tree": 1, | ||||
| 			"url": "seminar_resitel_odevzdana_reseni", | ||||
| 			"urlaspattern": true | ||||
| 		}, | ||||
| 		"model": "sitetree.treeitem", | ||||
| 		"pk": 42 | ||||
| 	} | ||||
| ] | ||||
							
								
								
									
										38
									
								
								seminar/templates/seminar/odevzdavatko/resitel_prehled.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								seminar/templates/seminar/odevzdavatko/resitel_prehled.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | |||
| {% extends "base.html" %} | ||||
| {% load static %} | ||||
| {% load deadliny %} | ||||
| 
 | ||||
| {% block custom_css %} | ||||
| <style type=text/css> | ||||
| .dosla_reseni tr th { | ||||
| 	text-align: center; | ||||
| } | ||||
| .dosla_reseni tr th, .dosla_reseni tr td { | ||||
| 	border: 1px solid black; | ||||
| 	padding: 1px 10px 1px 10px; | ||||
| 	border-collapse: collapse; | ||||
| } | ||||
| </style> | ||||
| {% endblock custom_css %} | ||||
| 
 | ||||
| {% block content %} | ||||
| {% for rocnik, hodnoceni in podle_rocniku %} | ||||
| <h1>Ročník {{ rocnik }}</h1> | ||||
| <table class="dosla_reseni"> | ||||
| 	<tr> | ||||
| 		<th>Doručeno</th> | ||||
| 		<th>Problém</th> | ||||
| 		<th>Body</th> | ||||
| 		<th>Deadline</th> | ||||
| 	</tr> | ||||
| 	{% for hodn in hodnoceni %} | ||||
| 	<tr> | ||||
| 		<td>{{ hodn.reseni.cas_doruceni }}</td> | ||||
| 		<td>{{ hodn.problem }}</td> | ||||
| 		<td>{{ hodn.body|default_if_none:"---" }}</td> | ||||
| 		<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td> | ||||
| 	</tr> | ||||
| 	{% endfor %} | ||||
| </table> | ||||
| {% endfor %} | ||||
| {% endblock %} | ||||
|  | @ -11,6 +11,7 @@ | |||
| 
 | ||||
| <a href="{% url 'logout' %}">Odhlásit se</a><br> | ||||
| <a href="{% url 'seminar_resitel_edit' %}">Upravit údaje</a><br> | ||||
| <a href="{% url 'seminar_resitel_odevzdana_reseni' %}">Odevzdaná řešení</a><br> | ||||
| 
 | ||||
| 
 | ||||
| {% endblock %} | ||||
|  |  | |||
|  | @ -13,10 +13,20 @@ def deadline_text(datum): | |||
| 		} | ||||
| 	return strings[typ] | ||||
| 
 | ||||
| @register.filter(name='deadline_kratseji') | ||||
| def deadline_kratsi_text(datum): | ||||
| 	typ, cislo, dl = deadline(datum) | ||||
| 	strings = { | ||||
| 		TypDeadline.PredDeadline: f"1. deadline {cislo}", | ||||
| 		TypDeadline.SousDeadline: f"Soustřeďkový deadline {cislo}", | ||||
| 		TypDeadline.FinalDeadline: f"Finální deadline {cislo}", | ||||
| 		} | ||||
| 	return strings[typ] | ||||
| 
 | ||||
| @register.filter(name='deadline_html') | ||||
| def deadline_html(datum): | ||||
| 	typ, _, _ = deadline(datum) | ||||
| 	text = deadline_text(datum) | ||||
| 	text = deadline_kratsi_text(datum) | ||||
| 	classes = { | ||||
| 		TypDeadline.PredDeadline: 'preddeadline', | ||||
| 		TypDeadline.SousDeadline: 'sous_deadline', | ||||
|  |  | |||
|  | @ -135,6 +135,7 @@ urlpatterns = [ | |||
| 	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('resitel/odevzdana_reseni/', resitel_required(views.PrehledOdevzdanychReseni.as_view()), name='seminar_resitel_odevzdana_reseni'), | ||||
| 	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'), | ||||
|  |  | |||
|  | @ -25,6 +25,8 @@ logger = logging.getLogger(__name__) | |||
| # 	- ReseniProblemuView | ||||
| # - Detail konkrétního řešení -- všechny soubory, datum, ... | ||||
| # 	- DetailReseniView | ||||
| # - Pro řešitele: přehled jejich odevzdaných řešení | ||||
| #	- PrehledOdevzdanychReseni | ||||
| # | ||||
| # Taky se může hodit: | ||||
| # - Tabulka všech řešitelů x všech problémů? | ||||
|  | @ -238,6 +240,29 @@ def hodnoceniReseniView(request, pk, *args, **kwargs): | |||
| 	return redirect(success_url) | ||||
| 
 | ||||
| 
 | ||||
| class PrehledOdevzdanychReseni(ListView): | ||||
| 	model = m.Hodnoceni | ||||
| 	template_name = 'seminar/odevzdavatko/resitel_prehled.html' | ||||
| 
 | ||||
| 	def get_queryset(self): | ||||
| 		if not self.request.user.is_authenticated: | ||||
| 			raise RuntimeError("Uživatel měl být přihlášený!") | ||||
| 		resitel = m.Resitel.objects.get(osoba__user=self.request.user) | ||||
| 		qs = super().get_queryset() | ||||
| 		qs = qs.filter(reseni__resitele__in=[resitel]) | ||||
| 		return qs | ||||
| 	 | ||||
| 	def get_context_data(self, *args, **kwargs): | ||||
| 		ctx = super().get_context_data(*args, **kwargs) | ||||
| 		# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení. | ||||
| 		# Chceme to mít seřazené, takže místo comphrerehsion ručně postavíme pole polí. Django templates neumí použít OrderedDict :-/ | ||||
| 		podle_rocniku = [] | ||||
| 		for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: deadline(ho.reseni.cas_doruceni)[1].rocnik): | ||||
| 			podle_rocniku.append((rocnik, list(hodnoceni))) | ||||
| 		ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku | ||||
| 		# TODO: Umožnit stažení / zobrazení řešení | ||||
| 		return ctx | ||||
| 
 | ||||
| # Přehled všech řešení kvůli debugování | ||||
| 
 | ||||
| class SeznamReseniView(ListView): | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky