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 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):
|
||||
|
|
|
@ -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>
|
||||
</tr>
|
||||
</tbody>
|
||||
{{ subform.id }}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue