diff --git a/mamweb/settings_local.py b/mamweb/settings_local.py index 9368524b..4cf76dc2 100644 --- a/mamweb/settings_local.py +++ b/mamweb/settings_local.py @@ -31,6 +31,7 @@ TEMPLATES[0]['OPTIONS']['debug'] = True from ipaddress import ip_network ALLOWED_HOSTS = [str(ip) for ip in ip_network('192.168.0.0/16')] ALLOWED_HOSTS.append('127.0.0.1') +ALLOWED_HOSTS.append('localhost') # Database # https://docs.djangoproject.com/en/1.7/ref/settings/#databases diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index fa5de880..53e06967 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -421,6 +421,10 @@ input { margin: 5px; } +textarea.feedback { + margin: 5px; +} + /* titulni stranka */ diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 6eb2a973..a8538668 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -88,11 +88,12 @@ ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, class JednoHodnoceniForm(forms.ModelForm): class Meta: model = m.Hodnoceni - fields = ('problem', 'body', 'deadline_body') + fields = ('problem', 'body', 'deadline_body', 'feedback',) widgets = { 'problem': autocomplete.ModelSelect2( url='autocomplete_problem_odevzdatelny', # FIXME: Dovolit i starší? - ) + ), + 'feedback': forms.Textarea(attrs={'rows': 1, 'cols': 30, 'class': 'feedback'}), } OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm, diff --git a/odevzdavatko/templates/odevzdavatko/detail.html b/odevzdavatko/templates/odevzdavatko/detail.html index 10f86a14..9f6d31ac 100644 --- a/odevzdavatko/templates/odevzdavatko/detail.html +++ b/odevzdavatko/templates/odevzdavatko/detail.html @@ -91,7 +91,7 @@ $(document).ready(function(){
{# Poznámka #} -

Poznámka:

+

Neveřejná poznámka:

{{ poznamka_form.poznamka }}

{# Hodnocení: #} @@ -101,13 +101,14 @@ $(document).ready(function(){ {{ form.management_form }} - + {% for subform in form %} + @@ -123,6 +124,7 @@ $(document).ready(function(){ +
ProblémBodyDeadline pro body
ProblémBodyDeadline pro bodyZpětná vazba pro řešitele
{{ subform.problem }} {{ subform.body }} {{ subform.deadline_body }}{{ subform.feedback }} Smazat
{{ form.empty_form.problem }} {{ form.empty_form.body }} {{ form.empty_form.deadline_body }}{{ form.empty_form.feedback }} Smazat
diff --git a/odevzdavatko/templates/odevzdavatko/detail_resitele.html b/odevzdavatko/templates/odevzdavatko/detail_resitele.html index 1c7622a7..fb0cb5fb 100644 --- a/odevzdavatko/templates/odevzdavatko/detail_resitele.html +++ b/odevzdavatko/templates/odevzdavatko/detail_resitele.html @@ -37,11 +37,12 @@ {# Hodnocení: #}

Hodnocení:

-{# #} +{# #} {% for h in hodnoceni %} + {# #} {% endfor %} diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 6e0f7c47..6c232172 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -218,10 +218,11 @@ class DetailReseniView(DetailView): self.reseni = get_object_or_404(m.Reseni, id=self.kwargs['pk']) result = [] # Slovníky s klíči problem, body, deadline_body -- initial data pro f.OhodnoceniReseniFormSet for hodn in m.Hodnoceni.objects.filter(reseni=self.reseni): - result.append( - {"problem": hodn.problem, + result.append({ + "problem": hodn.problem, "body": hodn.body, "deadline_body": hodn.deadline_body, + "feedback": hodn.feedback, }) return result @@ -245,30 +246,26 @@ def hodnoceniReseniView(request, pk, *args, **kwargs): formset = f.OhodnoceniReseniFormSet(request.POST) poznamka_form = f.PoznamkaReseniForm(request.POST, instance=reseni) # TODO: Napsat validaci formuláře a formsetu - # TODO: Implementovat větev, kdy formulář validní není. - if formset.is_valid() and poznamka_form.is_valid(): - with transaction.atomic(): - # Poznámka je jednoduchá na zpracování: - poznamka_form.save() + if not (formset.is_valid() and poznamka_form.is_valid()): + raise ValueError(formset.errors, poznamka_form.errors) - # 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: - problem = form.cleaned_data['problem'] - body = form.cleaned_data['body'] - deadline_body = form.cleaned_data['deadline_body'] - hodnoceni = m.Hodnoceni( - problem=problem, - body=body, - deadline_body=deadline_body, + 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() + logger.info(f"Creating Hodnoceni: {hodnoceni}") + hodnoceni.save() return redirect(success_url) @@ -285,6 +282,7 @@ class ResitelReseniView(DetailView): { "problem": hodn.problem, "body": hodn.body, + "feedback": hodn.feedback, # "deadline_body": hodn.deadline_body, } ) diff --git a/seminar/migrations/0108_hodnoceni_feedback.py b/seminar/migrations/0108_hodnoceni_feedback.py new file mode 100644 index 00000000..282849d8 --- /dev/null +++ b/seminar/migrations/0108_hodnoceni_feedback.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.16 on 2022-11-14 19:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0107_zmrazenavysledkovka'), + ] + + operations = [ + migrations.AddField( + model_name='hodnoceni', + name='feedback', + field=models.TextField(blank=True, default='', help_text='Zpětná vazba řešiteli (plain text)', verbose_name='zpětná vazba'), + ), + ] diff --git a/seminar/models/odevzdavatko.py b/seminar/models/odevzdavatko.py index 77ed5018..9ae161c5 100644 --- a/seminar/models/odevzdavatko.py +++ b/seminar/models/odevzdavatko.py @@ -113,6 +113,8 @@ class Hodnoceni(bm.SeminarModelBase): problem = models.ForeignKey(am.Problem, verbose_name='problém', related_name='hodnoceni', on_delete=models.PROTECT) + feedback = models.TextField('zpětná vazba', blank=True, default='', help_text='Zpětná vazba řešiteli (plain text)') + def __str__(self): return "{}, {}, {}".format(self.problem, self.reseni, self.body)
ProblémBodyDeadline pro body
ProblémBodyZpětná vazba od opravovateleDeadline pro body
{{ h.problem }} {{ h.body }}{{ h.feedback }}{{ h.deadline_body }}