odevzdavatko: zjednodušení editace hodnocení řešení
Formset pro Hodnoceni se nyní generuje pomocí factory. Do šablony se propisuje ID Hodnoceni, takže je možné spolehlivě identifikovat dané hodnocení a například detekovat, zda se změnilo.
This commit is contained in:
parent
288c8ad459
commit
c8b2d07605
3 changed files with 16 additions and 38 deletions
|
@ -1,7 +1,6 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
from dal import autocomplete
|
from dal import autocomplete
|
||||||
from django.forms import formset_factory
|
from django.forms.models import modelformset_factory, inlineformset_factory
|
||||||
from django.forms.models import inlineformset_factory
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from seminar.models import Resitel
|
from seminar.models import Resitel
|
||||||
|
@ -85,19 +84,14 @@ ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class JednoHodnoceniForm(forms.ModelForm):
|
HodnoceniFormSet = modelformset_factory(
|
||||||
class Meta:
|
m.Hodnoceni,
|
||||||
model = m.Hodnoceni
|
fields=('id', 'problem', 'body', 'deadline_body', 'feedback',),
|
||||||
fields = ('problem', 'body', 'deadline_body', 'feedback',)
|
extra=0,
|
||||||
widgets = {
|
widgets={
|
||||||
'problem': autocomplete.ModelSelect2(
|
'problem': autocomplete.ModelSelect2(url='autocomplete_problem',),
|
||||||
url='autocomplete_problem',
|
|
||||||
),
|
|
||||||
'feedback': forms.Textarea(attrs={'rows': 1, 'cols': 30, 'class': 'feedback'}),
|
'feedback': forms.Textarea(attrs={'rows': 1, 'cols': 30, 'class': 'feedback'}),
|
||||||
}
|
},
|
||||||
|
|
||||||
OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm,
|
|
||||||
extra = 0,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class PoznamkaReseniForm(forms.ModelForm):
|
class PoznamkaReseniForm(forms.ModelForm):
|
||||||
|
|
|
@ -112,6 +112,7 @@ $(document).ready(function(){
|
||||||
<td class="has_smazat_hodnoceni"><a href="#" class="smazat_hodnoceni" id="id_{{subform.prefix}}-jsremove" title="Smazat hodnocení"><img src="{% static "odevzdavatko/cross.png" %}" alt="Smazat"></a></td>
|
<td class="has_smazat_hodnoceni"><a href="#" class="smazat_hodnoceni" id="id_{{subform.prefix}}-jsremove" title="Smazat hodnocení"><img src="{% static "odevzdavatko/cross.png" %}" alt="Smazat"></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
{{ subform.id }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
|
@ -221,9 +221,8 @@ class DetailReseniView(DetailView):
|
||||||
|
|
||||||
def get_context_data(self, **kw):
|
def get_context_data(self, **kw):
|
||||||
reseni = get_object_or_404(m.Reseni, id=self.kwargs['pk'])
|
reseni = get_object_or_404(m.Reseni, id=self.kwargs['pk'])
|
||||||
initial = m.Hodnoceni.objects.filter(reseni=reseni).values('problem', 'body', 'deadline_body', 'feedback',)
|
|
||||||
ctx = super().get_context_data(**kw)
|
ctx = super().get_context_data(**kw)
|
||||||
ctx['form'] = f.OhodnoceniReseniFormSet(initial=initial)
|
ctx['form'] = f.HodnoceniFormSet(queryset=m.Hodnoceni.objects.filter(reseni=reseni))
|
||||||
ctx['poznamka_form'] = f.PoznamkaReseniForm(instance=reseni)
|
ctx['poznamka_form'] = f.PoznamkaReseniForm(instance=reseni)
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
@ -231,34 +230,18 @@ class DetailReseniView(DetailView):
|
||||||
def hodnoceniReseniView(request, pk, *args, **kwargs):
|
def hodnoceniReseniView(request, pk, *args, **kwargs):
|
||||||
reseni = get_object_or_404(m.Reseni, pk=pk)
|
reseni = get_object_or_404(m.Reseni, pk=pk)
|
||||||
template_name = 'odevzdavatko/detail.html'
|
template_name = 'odevzdavatko/detail.html'
|
||||||
form_class = f.OhodnoceniReseniFormSet
|
form_class = f.HodnoceniFormSet
|
||||||
success_url = reverse('odevzdavatko_detail_reseni', kwargs={'pk': pk})
|
success_url = reverse('odevzdavatko_detail_reseni', kwargs={'pk': pk})
|
||||||
|
|
||||||
# FIXME: Použit initial i tady a nebastlit hodnocení tak nízkoúrovňově
|
hodnoceni_formset = f.HodnoceniFormSet(request.POST, queryset=m.Hodnoceni.objects.filter(reseni=reseni))
|
||||||
# Also: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#django.forms.ModelForm
|
|
||||||
formset = f.OhodnoceniReseniFormSet(request.POST)
|
|
||||||
poznamka_form = f.PoznamkaReseniForm(request.POST, instance=reseni)
|
poznamka_form = f.PoznamkaReseniForm(request.POST, instance=reseni)
|
||||||
# TODO: Napsat validaci formuláře a formsetu
|
# TODO: Napsat validaci formuláře a formsetu
|
||||||
if not (formset.is_valid() and poznamka_form.is_valid()):
|
if not (hodnoceni_formset.is_valid() and poznamka_form.is_valid()):
|
||||||
raise ValueError(formset.errors, poznamka_form.errors)
|
raise ValueError(hodnoceni_formset.errors, poznamka_form.errors)
|
||||||
|
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
# Poznámka je jednoduchá na zpracování:
|
if poznamka_form.has_changed(): poznamka_form.save()
|
||||||
poznamka_form.save()
|
if hodnoceni_formset.has_changed(): hodnoceni_formset.save()
|
||||||
|
|
||||||
# Smažeme všechna dosavadní hodnocení tohoto řešení
|
|
||||||
qs = m.Hodnoceni.objects.filter(reseni=reseni)
|
|
||||||
logger.info(f"Will delete {qs.count()} objects: {qs}")
|
|
||||||
qs.delete()
|
|
||||||
|
|
||||||
# Vyrobíme nová podle formsetu
|
|
||||||
for form in formset:
|
|
||||||
hodnoceni = m.Hodnoceni(
|
|
||||||
reseni=reseni,
|
|
||||||
**form.cleaned_data,
|
|
||||||
)
|
|
||||||
logger.info(f"Creating Hodnoceni: {hodnoceni}")
|
|
||||||
hodnoceni.save()
|
|
||||||
|
|
||||||
return redirect(success_url)
|
return redirect(success_url)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue