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