Browse Source

odevzdavatko: odesílání upozornění na změnu zpětné vazby

Dojde-li ke změně zpětné vazby u některého z hodnocení řešitelova
řešení, odešle se mu email s jejím obsahem. Toto chování si řešitel může
nastavit v nastavení osobních údajů. V Reply-To headeru emailu je
uvedena emailová adresa uživatele, jenž zpětnou vazbu změnil.
notifikace_zpetne_vazby
Karel Balej 2 years ago
parent
commit
1dfeeaa9d1
  1. 19
      odevzdavatko/views.py
  2. 1
      personalni/forms.py
  3. 9
      personalni/templates/personalni/udaje/edit.html
  4. 1
      personalni/views.py
  5. 18
      seminar/migrations/0110_resitel_upozorneni.py
  6. 2
      seminar/models/personalni.py

19
odevzdavatko/views.py

@ -1,7 +1,7 @@
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.views.generic import ListView, DetailView, FormView from django.views.generic import ListView, DetailView, FormView
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.mail import send_mail from django.core.mail import send_mail, EmailMessage
from django.utils import timezone from django.utils import timezone
from django.views.generic import ListView, DetailView, FormView, CreateView from django.views.generic import ListView, DetailView, FormView, CreateView
from django.views.generic.list import MultipleObjectTemplateResponseMixin,MultipleObjectMixin from django.views.generic.list import MultipleObjectTemplateResponseMixin,MultipleObjectMixin
@ -243,6 +243,23 @@ def hodnoceniReseniView(request, pk, *args, **kwargs):
if poznamka_form.has_changed(): poznamka_form.save() if poznamka_form.has_changed(): poznamka_form.save()
if hodnoceni_formset.has_changed(): hodnoceni_formset.save() if hodnoceni_formset.has_changed(): hodnoceni_formset.save()
zmeny = []
for hodnoceni_form in hodnoceni_formset:
if 'feedback' in hodnoceni_form.changed_data:
zmeny.append(hodnoceni_form.instance)
if zmeny:
adresati = reseni.resitele.filter(upozorneni=True).values_list('osoba__email', flat=True)
if adresati:
email = EmailMessage(
subject='Změna zpětné vazby k Tvému řešení',
body='\n\n'.join([f'{hodnoceni.problem}\n{hodnoceni.feedback}' for hodnoceni in zmeny]) + f'\n\nNechceš-li toto upozornění dostávat, můžeš jej vypnout v nastavení svého účtu.\n\nTvoji organizátoři M&M',
from_email='odevzdavatko@mam.mff.cuni.cz',
to=adresati,
reply_to=[request.user.email] or None,
)
email.send()
return redirect(success_url) return redirect(success_url)

1
personalni/forms.py

@ -177,6 +177,7 @@ class ProfileEditForm(forms.Form):
zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat email s upozorněním na vydání nového čísla', required=False) zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat email s upozorněním na vydání nového čísla', required=False)
spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False) spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False)
upozorneni = forms.BooleanField(label='Chci dostat email, když opravovatel přidá zpětnou vazbu k mému řešení', required=False)
# def clean_username(self): # def clean_username(self):
# err_logger = logging.getLogger('seminar.prihlaska.problem') # err_logger = logging.getLogger('seminar.prihlaska.problem')
# username = self.cleaned_data.get('username') # username = self.cleaned_data.get('username')

9
personalni/templates/personalni/udaje/edit.html

@ -97,6 +97,15 @@
{% include "personalni/udaje/prihlaska_field.html" with field=form.spam %} {% include "personalni/udaje/prihlaska_field.html" with field=form.spam %}
</table> </table>
<hr>
<h4>
Zasílání upozornění na zpětnou vazbu k řešení
</h4>
<table class="form">
{% include "personalni/udaje/prihlaska_field.html" with field=form.upozorneni %}
</table>
<hr> <hr>
<input type="submit" value="Změnit"> <input type="submit" value="Změnit">

1
personalni/views.py

@ -164,6 +164,7 @@ def resitelEditView(request):
resitel_edit.rok_maturity = fcd['rok_maturity'] resitel_edit.rok_maturity = fcd['rok_maturity']
resitel_edit.zasilat = fcd['zasilat'] resitel_edit.zasilat = fcd['zasilat']
resitel_edit.zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'] resitel_edit.zasilat_cislo_emailem = fcd['zasilat_cislo_emailem']
resitel_edit.upozorneni = fcd['upozorneni']
if fcd.get('skola'): if fcd.get('skola'):
resitel_edit.skola = fcd['skola'] resitel_edit.skola = fcd['skola']
else: else:

18
seminar/migrations/0110_resitel_upozorneni.py

@ -0,0 +1,18 @@
# Generated by Django 3.2.16 on 2022-12-19 22:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('seminar', '0109_hodnoceni_feedback'),
]
operations = [
migrations.AddField(
model_name='resitel',
name='upozorneni',
field=models.BooleanField(default=True),
),
]

2
seminar/models/personalni.py

@ -237,6 +237,8 @@ class Resitel(SeminarModelBase):
poznamka = models.TextField('neveřejná poznámka', blank=True, poznamka = models.TextField('neveřejná poznámka', blank=True,
help_text='Neveřejná poznámka k řešiteli (plain text)') help_text='Neveřejná poznámka k řešiteli (plain text)')
upozorneni = models.BooleanField(default=True)
def export_row(self): def export_row(self):
"Slovnik pro pouziti v AESOP exportu" "Slovnik pro pouziti v AESOP exportu"

Loading…
Cancel
Save