Browse Source

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.
notifikace_zpetne_vazby
Karel Balej 2 years ago
parent
commit
c8b2d07605
  1. 22
      odevzdavatko/forms.py
  2. 1
      odevzdavatko/templates/odevzdavatko/detail.html
  3. 31
      odevzdavatko/views.py

22
odevzdavatko/forms.py

@ -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):

1
odevzdavatko/templates/odevzdavatko/detail.html

@ -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>

31
odevzdavatko/views.py

@ -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…
Cancel
Save