Odevzdávátko: Nejprve vybrat téma, pak podúlohy – part 1
This commit is contained in:
		
							parent
							
								
									93fa8c6f2e
								
							
						
					
					
						commit
						ce4ee94fed
					
				
					 6 changed files with 46 additions and 2 deletions
				
			
		|  | @ -87,6 +87,10 @@ class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView): | ||||||
| 		if self.q: | 		if self.q: | ||||||
| 			qs = qs.filter( | 			qs = qs.filter( | ||||||
| 					Q(nazev__icontains=self.q)) | 					Q(nazev__icontains=self.q)) | ||||||
|  | 
 | ||||||
|  | 		nadproblem_id = int(self.forwarded.get("nadproblem_id", -1)) | ||||||
|  | 		if nadproblem_id != -1: | ||||||
|  | 			qs = [problem for problem in qs if problem.hlavni_problem.id == nadproblem_id] | ||||||
| 		return qs | 		return qs | ||||||
| 
 | 
 | ||||||
| class ProblemAutocomplete(autocomplete.Select2QuerySetView): | class ProblemAutocomplete(autocomplete.Select2QuerySetView): | ||||||
|  |  | ||||||
|  | @ -72,6 +72,7 @@ class NahrajReseniForm(forms.ModelForm): | ||||||
| 					attrs = {'data-placeholder--id': '-1', | 					attrs = {'data-placeholder--id': '-1', | ||||||
| 						'data-placeholder--text' : '---', | 						'data-placeholder--text' : '---', | ||||||
| 						'data-allow-clear': 'true'}, | 						'data-allow-clear': 'true'}, | ||||||
|  | 					forward=["nadproblem_id"], | ||||||
| 				), | 				), | ||||||
| 				'resitele': | 				'resitele': | ||||||
| 				autocomplete.ModelSelect2Multiple( | 				autocomplete.ModelSelect2Multiple( | ||||||
|  | @ -82,6 +83,8 @@ class NahrajReseniForm(forms.ModelForm): | ||||||
| 				) | 				) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 	nadproblem_id = forms.IntegerField(required=False, disabled=True, widget=forms.HiddenInput()) | ||||||
|  | 
 | ||||||
| 	def __init__(self, *args, **kwargs): | 	def __init__(self, *args, **kwargs): | ||||||
| 		super().__init__(*args, **kwargs) | 		super().__init__(*args, **kwargs) | ||||||
| 		# FIXME Z nějakého důvodu se do této třídy dostaneme i bez resitele | 		# FIXME Z nějakého důvodu se do této třídy dostaneme i bez resitele | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
|   {% csrf_token %} |   {% csrf_token %} | ||||||
|   <table class='form' id="reseni"> |   <table class='form' id="reseni"> | ||||||
|     <tr> |     <tr> | ||||||
|       {% for field in form %} |       {% for field in form.visible_fields %} | ||||||
|       <td> |       <td> | ||||||
|         <label class="field-label{% if field.field.required %} field-required{% endif %}" for="{{ field.id_for_label }}"> |         <label class="field-label{% if field.field.required %} field-required{% endif %}" for="{{ field.id_for_label }}"> | ||||||
|           {{ field.label }}: |           {{ field.label }}: | ||||||
|  | @ -32,6 +32,10 @@ | ||||||
|     </tr> |     </tr> | ||||||
|   </table> |   </table> | ||||||
| 
 | 
 | ||||||
|  |   {% for field in form.hidden_fields %} | ||||||
|  |     {{ field }} | ||||||
|  |   {% endfor %} | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <hr> | <hr> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | {% extends "base.html" %} | ||||||
|  | {% load static %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  | <h1> | ||||||
|  |   {% block nadpis1a %} | ||||||
|  |     Poslat řešení | ||||||
|  |   {% endblock %} | ||||||
|  | </h1> | ||||||
|  | 
 | ||||||
|  | <h4>Seznam témat k odevzdání</h4> | ||||||
|  | 
 | ||||||
|  | <ul> | ||||||
|  |   {% for problem in object_list %} | ||||||
|  |     <li><a href="{% url 'seminar_nahraj_reseni' problem.id %}">{{ problem }}</a></li> | ||||||
|  |   {% empty %} | ||||||
|  |     <li>Nelze nic odevzdávat.</li> | ||||||
|  |   {% endfor %} | ||||||
|  | </ul> | ||||||
|  | 
 | ||||||
|  | {% endblock %} | ||||||
|  | @ -20,7 +20,8 @@ from . import views | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
| 	path('org/add_solution', org_required(views.PosliReseniView.as_view()), name='seminar_vloz_reseni'), | 	path('org/add_solution', org_required(views.PosliReseniView.as_view()), name='seminar_vloz_reseni'), | ||||||
| 	path('resitel/nahraj_reseni', resitel_required(views.NahrajReseniView.as_view()), name='seminar_nahraj_reseni'), | 	path('resitel/nahraj_reseni', resitel_required(views.NahrajReseniNadproblemView.as_view()), name='seminar_nahraj_reseni'), | ||||||
|  | 	path('resitel/nahraj_reseni/<int:nadproblem_id>/', resitel_required(views.NahrajReseniView.as_view()), name='seminar_nahraj_reseni'), | ||||||
| 	path('resitel/odevzdana_reseni/', resitel_or_org_required(views.PrehledOdevzdanychReseni.as_view()), name='seminar_resitel_odevzdana_reseni'), | 	path('resitel/odevzdana_reseni/', resitel_or_org_required(views.PrehledOdevzdanychReseni.as_view()), name='seminar_resitel_odevzdana_reseni'), | ||||||
| 
 | 
 | ||||||
| 	path('org/reseni/', org_required(views.TabulkaOdevzdanychReseniView.as_view()), name='odevzdavatko_tabulka'), | 	path('org/reseni/', org_required(views.TabulkaOdevzdanychReseniView.as_view()), name='odevzdavatko_tabulka'), | ||||||
|  |  | ||||||
|  | @ -381,6 +381,14 @@ class PosliReseniView(LoginRequiredMixin, FormView): | ||||||
| 		return data | 		return data | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class NahrajReseniNadproblemView(LoginRequiredMixin, ListView): | ||||||
|  | 	model = m.Problem | ||||||
|  | 	template_name = 'odevzdavatko/nahraj_reseni_nadproblem.html' | ||||||
|  | 
 | ||||||
|  | 	def get_queryset(self): | ||||||
|  | 		return super().get_queryset().filter(nadproblem__isnull=True) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class NahrajReseniView(LoginRequiredMixin, CreateView): | class NahrajReseniView(LoginRequiredMixin, CreateView): | ||||||
| 	model = m.Reseni | 	model = m.Reseni | ||||||
| 	template_name = 'odevzdavatko/nahraj_reseni.html' | 	template_name = 'odevzdavatko/nahraj_reseni.html' | ||||||
|  | @ -399,6 +407,9 @@ class NahrajReseniView(LoginRequiredMixin, CreateView): | ||||||
| 			}) | 			}) | ||||||
| 		return super().get(request, *args, **kwargs) | 		return super().get(request, *args, **kwargs) | ||||||
| 
 | 
 | ||||||
|  | 	def get_initial(self): | ||||||
|  | 		return {"nadproblem_id": self.kwargs["nadproblem_id"]} | ||||||
|  | 
 | ||||||
| 	def get_context_data(self,**kwargs): | 	def get_context_data(self,**kwargs): | ||||||
| 		data = super().get_context_data(**kwargs) | 		data = super().get_context_data(**kwargs) | ||||||
| 		if self.request.POST: | 		if self.request.POST: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue