From cfdbcc8ee1f9eb54cc932d74d07d323e3b85c63e Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 7 Mar 2023 23:59:42 +0100 Subject: [PATCH 1/7] =?UTF-8?q?Omezen=C3=AD=20na=20po=C4=8Det=20adres=20v?= =?UTF-8?q?=20hlavi=C4=8Dce=20mail=C5=AF=20z=20testwebu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Není úplně žádoucí, aby se v mailu z testwebu poslala spousta adres, protože je to náchylné na automatické zpracování v případě, že se k takovému mailu dostane někdo další. --- various/mail_prefixer.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/various/mail_prefixer.py b/various/mail_prefixer.py index 14d4386b..2af0b3f7 100644 --- a/various/mail_prefixer.py +++ b/various/mail_prefixer.py @@ -7,6 +7,11 @@ Used to distinguish testing emails from production ones.""" from django.core.mail.backends.smtp import EmailBackend as DjangoSMTPBackend 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): # method _send is not probably meant to be monkey_patched, so we patch send_messages instead. def send_messages(self, messages): @@ -16,10 +21,13 @@ class PrefixingMailBackend(DjangoSMTPBackend): if message.from_email != settings.SERVER_EMAIL: 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: - To: {message.to} - Cc: {message.cc} - Bcc: {message.bcc} + To: {to} + Cc: {cc} + Bcc: {bcc} """+ "\n\n" + message.body message.to = settings.TESTOVACI_EMAILOVA_KONFERENCE message.cc = [] From 99161d016d6e698f7564290f0e26523cb3aedb9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Sun, 26 Mar 2023 01:52:17 +0100 Subject: [PATCH 2/7] =?UTF-8?q?Apr=C3=ADl=202023?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/templates/base.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mamweb/templates/base.html b/mamweb/templates/base.html index fc2ff76e..b10103e5 100644 --- a/mamweb/templates/base.html +++ b/mamweb/templates/base.html @@ -170,6 +170,22 @@ rotace_a_posun($('.container'), randomUhel()); {% endif %} + {% if april == 2023 %} + + {% endif %} {% render_block "js" %} From cd9aa73a34f71549941c4165eefb9b15a38bc3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 29 Mar 2023 20:29:00 +0200 Subject: [PATCH 3/7] =?UTF-8?q?hotfix:=20p=C5=99ihl=C3=A1=C5=A1ky?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personalni/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/personalni/views.py b/personalni/views.py index a52f7f5f..88bc8697 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -264,7 +264,7 @@ def prihlaskaView(request): err_logger.warning(f'Zaregistrovala se osoba s kolizním jménem. ID osob: {[o.id for o in kolize]}') r = s.Resitel( - prezdivka_resitele=fcd['prezdivka_resitele'], + prezdivka_resitele=fcd['prezdivka_resitele'] if fcd['prezdivka_resitele'] != "" else None, rok_maturity = fcd['rok_maturity'], zasilat = fcd['zasilat'], zasilat_cislo_emailem = fcd['zasilat_cislo_emailem'] From b8a9d67cc287b1eb00cd8612f125caf3971c8793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 17 Apr 2023 20:15:39 +0200 Subject: [PATCH 4/7] send_mail -> EmailMessage --- korektury/admin.py | 9 +++++++-- korektury/views.py | 9 +++++++-- odevzdavatko/views.py | 10 +++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/korektury/admin.py b/korektury/admin.py index f2b0a319..5f92c542 100644 --- a/korektury/admin.py +++ b/korektury/admin.py @@ -12,7 +12,7 @@ from django.contrib import admin from reversion.admin import VersionAdmin from korektury.models import KorekturovanePDF -from django.core.mail import send_mail +from django.core.mail import EmailMessage from django.urls import reverse # Register your models here. @@ -64,6 +64,11 @@ Popis souboru: S pozdravem a korekturám zdar! Korekturovátko ''' - send_mail(predmet,text,odesilatel,[prijemce]) + EmailMessage( + subject=predmet, + body=text, + from_email=odesilatel, + to=[prijemce], + ).send() admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin) diff --git a/korektury/views.py b/korektury/views.py index efeab19d..564e1331 100644 --- a/korektury/views.py +++ b/korektury/views.py @@ -8,7 +8,7 @@ from django.views import generic from django.utils.translation import ugettext as _ from django.conf import settings 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 .models import Oprava,Komentar,KorekturovanePDF, Organizator @@ -207,7 +207,12 @@ class KorekturyView(generic.TemplateView): print("---- Konec upozornění") 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): context = super().get_context_data(**kwargs) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 2390d27f..d3c74812 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -1,7 +1,7 @@ from django.core.exceptions import PermissionDenied from django.views.generic import ListView, DetailView, FormView 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.views.generic import ListView, DetailView, FormView, CreateView 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_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, - 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í? - recipient_list=list(prijemci), - ) + to=list(prijemci), + ).send() return formularOKView(self.request, text='Řešení úspěšně odevzdáno') From 397aacf8991ecc1d80ddd5b3a096fa16cb360d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 17 Apr 2023 20:41:01 +0200 Subject: [PATCH 5/7] =?UTF-8?q?Pos=C3=ADl=C3=A1n=C3=AD=20e-mail=C5=AF=20p?= =?UTF-8?q?=C5=99=C3=ADjemc=C5=AFm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0112_prijemce_zasilat_cislo_emailem.py | 18 ++++++++++++++++++ seminar/models/personalni.py | 2 ++ seminar/models/tvorba.py | 4 ++++ 3 files changed, 24 insertions(+) create mode 100644 seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py diff --git a/seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py b/seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py new file mode 100644 index 00000000..8efaf925 --- /dev/null +++ b/seminar/migrations/0112_prijemce_zasilat_cislo_emailem.py @@ -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'), + ), + ] diff --git a/seminar/models/personalni.py b/seminar/models/personalni.py index 9ac85e51..2cb8539a 100644 --- a/seminar/models/personalni.py +++ b/seminar/models/personalni.py @@ -192,6 +192,8 @@ class Prijemce(SeminarModelBase): help_text='Které osobě či na jakou adresu se mají zasílat čísla', 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: a možná taky posílání na mail a možná taky přes něj chceme posílat i řešitelům diff --git a/seminar/models/tvorba.py b/seminar/models/tvorba.py index f2feb569..855c90f4 100644 --- a/seminar/models/tvorba.py +++ b/seminar/models/tvorba.py @@ -265,6 +265,7 @@ class Cislo(SeminarModelBase): poslat_z_mailu = 'zadani@mam.mff.cuni.cz' predmet = 'Vyšlo číslo {}'.format(self.kod()) + # TODO Možná nechceme všem psát „Ahoj“, např. příjemcům… text_mailu = 'Ahoj,\n' \ 'na adrese {} najdete nejnovější číslo.\n' \ '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, resitele_vsichni.exclude(zasilat=pm.Resitel.ZASILAT_NIKAM)) + 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): super().save(*args, **kwargs) self.vygeneruj_nahled() From 254e7949ef99672e8b2b563d9670a1a94635c8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 17 Apr 2023 21:44:18 +0200 Subject: [PATCH 6/7] =?UTF-8?q?SQLite=20ne=C5=BEere=20date?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models/personalni.py | 1 + 1 file changed, 1 insertion(+) diff --git a/seminar/models/personalni.py b/seminar/models/personalni.py index 9ac85e51..f871981a 100644 --- a/seminar/models/personalni.py +++ b/seminar/models/personalni.py @@ -402,6 +402,7 @@ class Organizator(SeminarModelBase): 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_do = models.DateTimeField('Organizuje do', blank=True, null=True) From 5b698cce4267757136f8ddfa8d69b142ae692563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 17 Apr 2023 22:16:44 +0200 Subject: [PATCH 7/7] =?UTF-8?q?Oprava=20migrac=C3=AD=20po=20p=C5=99edchoz?= =?UTF-8?q?=C3=ADm=20mergey=20(0f5b2b128f794ea746a6a404055f1ae77fa9a125)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cislo_papirove.py => 0113_resitel_zasilat_cislo_papirove.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename seminar/migrations/{0112_resitel_zasilat_cislo_papirove.py => 0113_resitel_zasilat_cislo_papirove.py} (95%) diff --git a/seminar/migrations/0112_resitel_zasilat_cislo_papirove.py b/seminar/migrations/0113_resitel_zasilat_cislo_papirove.py similarity index 95% rename from seminar/migrations/0112_resitel_zasilat_cislo_papirove.py rename to seminar/migrations/0113_resitel_zasilat_cislo_papirove.py index 63660ddc..9539f328 100644 --- a/seminar/migrations/0112_resitel_zasilat_cislo_papirove.py +++ b/seminar/migrations/0113_resitel_zasilat_cislo_papirove.py @@ -29,7 +29,7 @@ def vrat_nikam(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('seminar', '0111_nikam2nezasilat_papirove'), + ('seminar', '0112_prijemce_zasilat_cislo_emailem'), ] operations = [