diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 65a8b7ac..804cfde5 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -1,7 +1,6 @@ from django import forms from dal import autocomplete -from django.forms import formset_factory -from django.forms.models import inlineformset_factory +from django.forms.models import modelformset_factory, inlineformset_factory from django.utils import timezone from seminar.models import Resitel @@ -85,19 +84,14 @@ ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, ) -class JednoHodnoceniForm(forms.ModelForm): - class Meta: - model = m.Hodnoceni - fields = ('problem', 'body', 'deadline_body', 'feedback',) - widgets = { - 'problem': autocomplete.ModelSelect2( - url='autocomplete_problem', - ), +HodnoceniFormSet = modelformset_factory( + m.Hodnoceni, + fields=('id', 'problem', 'body', 'deadline_body', 'feedback',), + extra=0, + widgets={ + 'problem': autocomplete.ModelSelect2(url='autocomplete_problem',), 'feedback': forms.Textarea(attrs={'rows': 1, 'cols': 30, 'class': 'feedback'}), - } - -OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm, - extra = 0, + }, ) class PoznamkaReseniForm(forms.ModelForm): diff --git a/odevzdavatko/templates/odevzdavatko/detail.html b/odevzdavatko/templates/odevzdavatko/detail.html index a3f986d5..c7c53440 100644 --- a/odevzdavatko/templates/odevzdavatko/detail.html +++ b/odevzdavatko/templates/odevzdavatko/detail.html @@ -112,6 +112,7 @@ $(document).ready(function(){ Smazat + {{ subform.id }} {% endfor %} diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 3428edaa..995b5840 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -221,9 +221,8 @@ class DetailReseniView(DetailView): def get_context_data(self, **kw): 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['form'] = f.OhodnoceniReseniFormSet(initial=initial) + ctx['form'] = f.HodnoceniFormSet(queryset=m.Hodnoceni.objects.filter(reseni=reseni)) ctx['poznamka_form'] = f.PoznamkaReseniForm(instance=reseni) return ctx @@ -231,34 +230,18 @@ class DetailReseniView(DetailView): def hodnoceniReseniView(request, pk, *args, **kwargs): reseni = get_object_or_404(m.Reseni, pk=pk) template_name = 'odevzdavatko/detail.html' - form_class = f.OhodnoceniReseniFormSet + form_class = f.HodnoceniFormSet success_url = reverse('odevzdavatko_detail_reseni', kwargs={'pk': pk}) - # FIXME: Použit initial i tady a nebastlit hodnocení tak nízkoúrovňově - # Also: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#django.forms.ModelForm - formset = f.OhodnoceniReseniFormSet(request.POST) + hodnoceni_formset = f.HodnoceniFormSet(request.POST, queryset=m.Hodnoceni.objects.filter(reseni=reseni)) poznamka_form = f.PoznamkaReseniForm(request.POST, instance=reseni) # TODO: Napsat validaci formuláře a formsetu - if not (formset.is_valid() and poznamka_form.is_valid()): - raise ValueError(formset.errors, poznamka_form.errors) + if not (hodnoceni_formset.is_valid() and poznamka_form.is_valid()): + raise ValueError(hodnoceni_formset.errors, poznamka_form.errors) with transaction.atomic(): - # Poznámka je jednoduchá na zpracování: - poznamka_form.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() + if poznamka_form.has_changed(): poznamka_form.save() + if hodnoceni_formset.has_changed(): hodnoceni_formset.save() return redirect(success_url)