Merge branch 'master' into reforma_prihlasky_a_posilani
This commit is contained in:
commit
10304313af
10 changed files with 73 additions and 14 deletions
|
@ -12,7 +12,7 @@ from django.contrib import admin
|
||||||
from reversion.admin import VersionAdmin
|
from reversion.admin import VersionAdmin
|
||||||
from korektury.models import KorekturovanePDF
|
from korektury.models import KorekturovanePDF
|
||||||
|
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import EmailMessage
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
@ -64,6 +64,11 @@ Popis souboru:
|
||||||
S pozdravem a korekturám zdar!
|
S pozdravem a korekturám zdar!
|
||||||
Korekturovátko
|
Korekturovátko
|
||||||
'''
|
'''
|
||||||
send_mail(predmet,text,odesilatel,[prijemce])
|
EmailMessage(
|
||||||
|
subject=predmet,
|
||||||
|
body=text,
|
||||||
|
from_email=odesilatel,
|
||||||
|
to=[prijemce],
|
||||||
|
).send()
|
||||||
|
|
||||||
admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin)
|
admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from django.views import generic
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.http import HttpResponseForbidden
|
from django.http import HttpResponseForbidden
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import EmailMessage
|
||||||
from django.db.models import Count,Q
|
from django.db.models import Count,Q
|
||||||
|
|
||||||
from .models import Oprava,Komentar,KorekturovanePDF, Organizator
|
from .models import Oprava,Komentar,KorekturovanePDF, Organizator
|
||||||
|
@ -207,7 +207,12 @@ class KorekturyView(generic.TemplateView):
|
||||||
print("---- Konec upozornění")
|
print("---- Konec upozornění")
|
||||||
return
|
return
|
||||||
|
|
||||||
send_mail(subject, text, from_email, list(emails))
|
EmailMessage(
|
||||||
|
subject=subject,
|
||||||
|
body=text,
|
||||||
|
from_email=from_email,
|
||||||
|
to=list(emails),
|
||||||
|
).send()
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
|
|
@ -170,6 +170,22 @@
|
||||||
rotace_a_posun($('.container'), randomUhel());
|
rotace_a_posun($('.container'), randomUhel());
|
||||||
</script>
|
</script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if april == 2023 %}
|
||||||
|
<script>
|
||||||
|
{# By https://stackoverflow.com/a/34559316 #}
|
||||||
|
function walkText(node) {
|
||||||
|
if (node.nodeType == 3) {
|
||||||
|
node.data = node.data.replace(/M&M/g, "M💘M");
|
||||||
|
}
|
||||||
|
if (node.nodeType == 1 && node.nodeName != "SCRIPT") {
|
||||||
|
for (var i = 0; i < node.childNodes.length; i++) {
|
||||||
|
walkText(node.childNodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
walkText(document.body);
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
{% render_block "js" %}
|
{% render_block "js" %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -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 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
|
||||||
|
@ -449,11 +449,11 @@ class NahrajReseniView(LoginRequiredMixin, CreateView):
|
||||||
seznam = "problému " + str(problemy[0]) if len(problemy) == 1 else 'následujícím problémům:\n' + ', \n'.join(map(str, problemy))
|
seznam = "problému " + str(problemy[0]) if len(problemy) == 1 else 'následujícím problémům:\n' + ', \n'.join(map(str, problemy))
|
||||||
seznam_do_subjectu = "problému " + str(problemy[0]) + ("" if len(problemy) == 1 else f" (a dalším { len(problemy) - 1 })")
|
seznam_do_subjectu = "problému " + str(problemy[0]) + ("" if len(problemy) == 1 else f" (a dalším { len(problemy) - 1 })")
|
||||||
|
|
||||||
send_mail(
|
EmailMessage(
|
||||||
subject="Nové řešení k " + seznam_do_subjectu,
|
subject="Nové řešení k " + seznam_do_subjectu,
|
||||||
message=f"Řešitel{ '' if resitel.pohlavi_muz else 'ka' } { resitel } právě nahrál{'' if resitel.pohlavi_muz else 'a' } nové řešení k { seznam }.\n\nHurá do opravování: { self.object.absolute_url() }",
|
body=f"Řešitel{ '' if resitel.pohlavi_muz else 'ka' } { resitel } právě nahrál{'' if resitel.pohlavi_muz else 'a' } nové řešení k { seznam }.\n\nHurá do opravování: { self.object.absolute_url() }",
|
||||||
from_email="submitovatko@mam.mff.cuni.cz", # FIXME: Chceme to mít radši tady, nebo v nastavení?
|
from_email="submitovatko@mam.mff.cuni.cz", # FIXME: Chceme to mít radši tady, nebo v nastavení?
|
||||||
recipient_list=list(prijemci),
|
to=list(prijemci),
|
||||||
)
|
).send()
|
||||||
|
|
||||||
return formularOKView(self.request, text='Řešení úspěšně odevzdáno')
|
return formularOKView(self.request, text='Řešení úspěšně odevzdáno')
|
||||||
|
|
|
@ -265,7 +265,7 @@ def prihlaskaView(request):
|
||||||
err_logger.warning(f'Zaregistrovala se osoba s kolizním jménem. ID osob: {[o.id for o in kolize]}')
|
err_logger.warning(f'Zaregistrovala se osoba s kolizním jménem. ID osob: {[o.id for o in kolize]}')
|
||||||
|
|
||||||
r = s.Resitel(
|
r = s.Resitel(
|
||||||
prezdivka_resitele=fcd['prezdivka_resitele'],
|
prezdivka_resitele=fcd['prezdivka_resitele'] if fcd['prezdivka_resitele'] != "" else None,
|
||||||
rok_maturity = fcd['rok_maturity'],
|
rok_maturity = fcd['rok_maturity'],
|
||||||
zasilat = fcd['zasilat'],
|
zasilat = fcd['zasilat'],
|
||||||
zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'],
|
zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'],
|
||||||
|
|
18
seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py
Normal file
18
seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 2.2.28 on 2023-04-17 18:38
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('seminar', '0111_nikam2nezasilat_papirove'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='prijemce',
|
||||||
|
name='zasilat_cislo_emailem',
|
||||||
|
field=models.BooleanField(default=False, help_text='True pokud chce příjemce dostávat číslo emailem', verbose_name='zasílat číslo emailem'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -29,7 +29,7 @@ def vrat_nikam(apps, schema_editor):
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('seminar', '0111_nikam2nezasilat_papirove'),
|
('seminar', '0112_prijemce_zasilat_cislo_emailem'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
|
@ -192,6 +192,8 @@ class Prijemce(SeminarModelBase):
|
||||||
help_text='Které osobě či na jakou adresu se mají zasílat čísla',
|
help_text='Které osobě či na jakou adresu se mají zasílat čísla',
|
||||||
on_delete=models.CASCADE)
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
zasilat_cislo_emailem = models.BooleanField('zasílat číslo emailem', help_text='True pokud chce příjemce dostávat číslo emailem', default=False)
|
||||||
|
|
||||||
# FIXME: možná chceme něco jako vazbu na osobu XOR školu a počet kusů k zaslání
|
# FIXME: možná chceme něco jako vazbu na osobu XOR školu a počet kusů k zaslání
|
||||||
# FIXME: a možná taky posílání na mail a možná taky přes něj chceme posílat i řešitelům
|
# FIXME: a možná taky posílání na mail a možná taky přes něj chceme posílat i řešitelům
|
||||||
|
|
||||||
|
@ -404,6 +406,7 @@ class Organizator(SeminarModelBase):
|
||||||
editable=False
|
editable=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Ne, date to nebude. SQLite: invalid literal for int() with base 10: b'17 23:00:00'
|
||||||
organizuje_od = models.DateTimeField('Organizuje od', blank=True, null=True)
|
organizuje_od = models.DateTimeField('Organizuje od', blank=True, null=True)
|
||||||
|
|
||||||
organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True)
|
organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True)
|
||||||
|
|
|
@ -265,6 +265,7 @@ class Cislo(SeminarModelBase):
|
||||||
|
|
||||||
poslat_z_mailu = 'zadani@mam.mff.cuni.cz'
|
poslat_z_mailu = 'zadani@mam.mff.cuni.cz'
|
||||||
predmet = 'Vyšlo číslo {}'.format(self.kod())
|
predmet = 'Vyšlo číslo {}'.format(self.kod())
|
||||||
|
# TODO Možná nechceme všem psát „Ahoj“, např. příjemcům…
|
||||||
text_mailu = 'Ahoj,\n' \
|
text_mailu = 'Ahoj,\n' \
|
||||||
'na adrese {} najdete nejnovější číslo.\n' \
|
'na adrese {} najdete nejnovější číslo.\n' \
|
||||||
'Vaše M&M\n'.format(odkaz)
|
'Vaše M&M\n'.format(odkaz)
|
||||||
|
@ -294,6 +295,9 @@ class Cislo(SeminarModelBase):
|
||||||
posli(text_mailu + 'P. S. Brzy budeme též rozesílat papírovou verzi čísla. Připomínáme, že pokud papírovou verzi čísla nevyužijete, můžete v https://mam.mff.cuni.cz/resitel/osobni-udaje/ zaškrtnout, abychom vám ji neposílali. Čísla vždy můžete nalézt v našem archivu a dál vám budou chodit e-mailem. Děkujeme.\n' + paticka,
|
posli(text_mailu + 'P. S. Brzy budeme též rozesílat papírovou verzi čísla. Připomínáme, že pokud papírovou verzi čísla nevyužijete, můžete v https://mam.mff.cuni.cz/resitel/osobni-udaje/ zaškrtnout, abychom vám ji neposílali. Čísla vždy můžete nalézt v našem archivu a dál vám budou chodit e-mailem. Děkujeme.\n' + paticka,
|
||||||
resitele_vsichni.exclude(zasilat=pm.Resitel.zasilat_cislo_papirove))
|
resitele_vsichni.exclude(zasilat=pm.Resitel.zasilat_cislo_papirove))
|
||||||
|
|
||||||
|
paticka_prijemce = "---\nPokud tyto e-maily nechcete nadále dostávat, prosíme, ozvěte se nám na mam@matfyz.cz."
|
||||||
|
posli(text_mailu + paticka_prijemce, pm.Prijemce.objects.filter(zasilat_cislo_emailem=True))
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
self.vygeneruj_nahled()
|
self.vygeneruj_nahled()
|
||||||
|
|
|
@ -7,6 +7,11 @@ Used to distinguish testing emails from production ones."""
|
||||||
from django.core.mail.backends.smtp import EmailBackend as DjangoSMTPBackend
|
from django.core.mail.backends.smtp import EmailBackend as DjangoSMTPBackend
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
def omezovatko_poctu_mailu(maily:list, maximum:int) -> str:
|
||||||
|
if len(maily) <= maximum: return str(maily)
|
||||||
|
# Aspoň zhruba simulujeme tisk pole…
|
||||||
|
return '[' + ", ".join(f"'{mail}'" for mail in maily[:maximum - 1]) + f', … ({len(maily)} e-mailů) ]'
|
||||||
|
|
||||||
class PrefixingMailBackend(DjangoSMTPBackend):
|
class PrefixingMailBackend(DjangoSMTPBackend):
|
||||||
# method _send is not probably meant to be monkey_patched, so we patch send_messages instead.
|
# method _send is not probably meant to be monkey_patched, so we patch send_messages instead.
|
||||||
def send_messages(self, messages):
|
def send_messages(self, messages):
|
||||||
|
@ -16,10 +21,13 @@ class PrefixingMailBackend(DjangoSMTPBackend):
|
||||||
|
|
||||||
if message.from_email != settings.SERVER_EMAIL:
|
if message.from_email != settings.SERVER_EMAIL:
|
||||||
message.subject = prefix + ' ' + message.subject
|
message.subject = prefix + ' ' + message.subject
|
||||||
|
to = omezovatko_poctu_mailu(message.to, 3)
|
||||||
|
cc = omezovatko_poctu_mailu(message.cc, 3)
|
||||||
|
bcc = omezovatko_poctu_mailu(message.bcc, 3)
|
||||||
message.body = f"""Bylo by posláno na e-maily:
|
message.body = f"""Bylo by posláno na e-maily:
|
||||||
To: {message.to}
|
To: {to}
|
||||||
Cc: {message.cc}
|
Cc: {cc}
|
||||||
Bcc: {message.bcc}
|
Bcc: {bcc}
|
||||||
"""+ "\n\n" + message.body
|
"""+ "\n\n" + message.body
|
||||||
message.to = settings.TESTOVACI_EMAILOVA_KONFERENCE
|
message.to = settings.TESTOVACI_EMAILOVA_KONFERENCE
|
||||||
message.cc = []
|
message.cc = []
|
||||||
|
|
Loading…
Reference in a new issue