From a666a3fea454140159c3c9d08f1b3e50f18dccb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 3 Jan 2023 19:04:45 +0100 Subject: [PATCH 1/7] =?UTF-8?q?hotfix:=20nemohl=20odevzd=C3=A1vat=20=C5=99?= =?UTF-8?q?e=C5=A1itel=20samotn=C3=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/forms.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index a31122dd..223d807f 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -82,6 +82,13 @@ class NahrajReseniForm(forms.ModelForm): ) } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # FIXME Z nějakého důvodu se do této třídy dostaneme i bez resitele + if 'resitele' in self.fields: + # FIXME Mnohem hezčí by to bylo u definice resitele výše, ale nepodařilo se mi to. + self.fields['resitele'].required = False + ReseniSPrilohamiFormSet = inlineformset_factory(m.Reseni,m.PrilohaReseni, form = NahrajReseniForm, fields = ('soubor','res_poznamka'), From af6628367f546a6a2264d8ae5e5dc57666d017da Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 4 Jan 2023 01:51:02 +0100 Subject: [PATCH 2/7] =?UTF-8?q?Testy:=20Schov=C3=A1v=C3=A1me=20si=20datab?= =?UTF-8?q?=C3=A1zi=20nap=C5=99=C3=AD=C4=8D=20b=C4=9Bhy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Při běžení testů nejdéle trvá namigrovat (prázdnou) databázi. Toto tento krok přeskočí. By default django pro testy používá in-memory SQLite3 databázi, která se schovat přirozeně nedá. Používání souborů trvá déle (data níž), ale další běhy už jsou rychlé. Zatím nevím, jestli se někde nemůže omylem schovávat nějaký nežádoucí stav, ale testy mi i opakovaně běží, takže se to asi nerozbíjí úplně moc. Na první pohled je uložená databáze prázdná. Pro produkci a CI bych klidně běžel testy od nuly, tam nevadí čekat pár desítek sekund až jednotky minut na výsledek. Tato optimalizace je důležitá jen pro lokální vývoj, kde je žádoucí mít testy co nejrychlejší. V .gitignore už přesně toto jméno souboru je. Nevím proč, ale možná to tak bylo by default v některém dávném Djangu. Data --- Spouštěl jsem příkaz `time ./manage.py test [--keepdb] api`. Běhy byly relativně konzistentní (±1 s) a trvaly u mě: - In memory SQLite (default): 26 s - První spuštění s db na disku (HDD): 44 s - Následná spuštění: 7.7 s Data jsou nejspíš zkreslena tím, že všechno je nejspíš nacachované v systému, ale i tak je vidět zřetelné zrychlení. Původní motivace: úplně triviální a nedatabázový test na starém notebooku běžel kolem 3:14, což je zoufale nepoužitelné když si chci napsat testy jako pomůcku pro vývoj. --- make/test | 2 +- mamweb/settings_local.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/make/test b/make/test index 155d03fa..e3fa9f52 100755 --- a/make/test +++ b/make/test @@ -6,4 +6,4 @@ set -exuo pipefail ensure_web_installed trap - ERR # Testy nejspíš selžou, ale nechceme kolem toho dělat další chybovou hlášku. -./manage.py test -v2 +./manage.py test -v2 --keepdb diff --git a/mamweb/settings_local.py b/mamweb/settings_local.py index 540c0453..4d98cd38 100644 --- a/mamweb/settings_local.py +++ b/mamweb/settings_local.py @@ -40,7 +40,10 @@ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db-local.sqlite3'), - } + 'TEST': { + 'NAME': os.path.join(BASE_DIR, 'db-test.sqlite3'), + }, + }, } #DATABASES = { # 'default': { From 3a1aade3a2bd215510b361eeb19c88fb2454628a Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Wed, 4 Jan 2023 02:11:15 +0100 Subject: [PATCH 3/7] Testy: bereme parametry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Umožňuje testovat konkrétní moduly a nespouštět vždy všechno. --- make/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/test b/make/test index e3fa9f52..45de21f1 100755 --- a/make/test +++ b/make/test @@ -6,4 +6,4 @@ set -exuo pipefail ensure_web_installed trap - ERR # Testy nejspíš selžou, ale nechceme kolem toho dělat další chybovou hlášku. -./manage.py test -v2 --keepdb +./manage.py test -v2 --keepdb "$@" From e6b8998edd4a67dbd9b72e6145bffa7445af0ad0 Mon Sep 17 00:00:00 2001 From: MaM Web user Date: Wed, 4 Jan 2023 21:30:52 +0100 Subject: [PATCH 4/7] =?UTF-8?q?Jid=C3=A1=C5=A1:=20hotfix:=20smaz=C3=A1n?= =?UTF-8?q?=C3=AD=20p=C5=99ezd=C3=ADvky=20v=20osobn=C3=ADch=20=C3=BAdaj?= =?UTF-8?q?=C3=ADch?= 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 d7d52540..a52f7f5f 100644 --- a/personalni/views.py +++ b/personalni/views.py @@ -160,7 +160,7 @@ def resitelEditView(request): if resitel_edit: ## Změny v řešiteli - resitel_edit.prezdivka_resitele = fcd['prezdivka_resitele'] + resitel_edit.prezdivka_resitele = fcd['prezdivka_resitele'] if fcd['prezdivka_resitele'] != '' else None resitel_edit.skola = fcd['skola'] resitel_edit.rok_maturity = fcd['rok_maturity'] resitel_edit.zasilat = fcd['zasilat'] From 4623adb249974a09e341acef2b29083ca1404b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 24 Jan 2023 20:57:32 +0100 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20od=C5=99=C3=A1dkov=C3=A1n=C3=AD=20ve?= =?UTF-8?q?=20feedbacku=20v=20hodnot=C3=ADku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/templates/odevzdavatko/detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odevzdavatko/templates/odevzdavatko/detail.html b/odevzdavatko/templates/odevzdavatko/detail.html index 06f69609..f1591725 100644 --- a/odevzdavatko/templates/odevzdavatko/detail.html +++ b/odevzdavatko/templates/odevzdavatko/detail.html @@ -90,7 +90,7 @@ {{ h.problem }} {{ h.body }} - {{ h.feedback }} + {{ h.feedback | linebreaks }} {% endfor %} From fad2a1bc47d5848baa2093e0e5edbc45846fb6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 30 Jan 2023 20:27:42 +0100 Subject: [PATCH 6/7] =?UTF-8?q?Nikam=20->=20Nezas=C3=ADlat=20pap=C3=ADrov?= =?UTF-8?q?=C4=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0111_nikam2nezasilat_papirove.py | 18 ++++++++++++++++++ seminar/models/personalni.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 seminar/migrations/0111_nikam2nezasilat_papirove.py diff --git a/seminar/migrations/0111_nikam2nezasilat_papirove.py b/seminar/migrations/0111_nikam2nezasilat_papirove.py new file mode 100644 index 00000000..683d71d7 --- /dev/null +++ b/seminar/migrations/0111_nikam2nezasilat_papirove.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-01-30 19:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0110_resitel_prezdivka'), + ] + + operations = [ + migrations.AlterField( + model_name='resitel', + name='zasilat', + field=models.CharField(choices=[('domu', 'Domů'), ('do_skoly', 'Do školy'), ('nikam', 'Nezasílat papírově')], default='domu', max_length=32, verbose_name='kam zasílat'), + ), + ] diff --git a/seminar/models/personalni.py b/seminar/models/personalni.py index 3e64af45..9ac85e51 100644 --- a/seminar/models/personalni.py +++ b/seminar/models/personalni.py @@ -229,7 +229,7 @@ class Resitel(SeminarModelBase): ZASILAT_CHOICES = [ (ZASILAT_DOMU, 'Domů'), (ZASILAT_DO_SKOLY, 'Do školy'), - (ZASILAT_NIKAM, 'Nikam'), + (ZASILAT_NIKAM, 'Nezasílat papírově'), ] zasilat = models.CharField('kam zasílat', max_length=32, choices=ZASILAT_CHOICES, blank=False, default=ZASILAT_DOMU) From 3dab39645029e9651ffbef0c8174a6b8d19d5d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Mon, 30 Jan 2023 20:58:37 +0100 Subject: [PATCH 7/7] =?UTF-8?q?E-mail=20p=C5=99ipom=C3=ADnaj=C3=ADc=C3=AD?= =?UTF-8?q?=20=C5=99e=C5=A1itel=C5=AFm=20mo=C5=BEnost=20Nezas=C3=ADlat=20p?= =?UTF-8?q?ap=C3=ADrov=C4=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models/tvorba.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/seminar/models/tvorba.py b/seminar/models/tvorba.py index 7e04b213..f2c10e3e 100644 --- a/seminar/models/tvorba.py +++ b/seminar/models/tvorba.py @@ -270,21 +270,27 @@ class Cislo(SeminarModelBase): 'Vaše M&M\n'.format(odkaz) # Prijemci e-mailu - emaily = map(lambda r: r.osoba.email, filter(lambda r: r.zasilat_cislo_emailem, aktivniResitele(self))) - - if not settings.POSLI_MAILOVOU_NOTIFIKACI: - print("Poslal bych upozornění na tyto adresy: ", " ".join(emaily)) - return + resitele_vsichni = aktivniResitele(self).filter(zasilat_cislo_emailem=True) + + def posli(text, resitele): + emaily = map(lambda resitel: resitel.osoba.email, resitele) + if not settings.POSLI_MAILOVOU_NOTIFIKACI: + print("Poslal bych upozornění na tyto adresy: ", " ".join(emaily)) + return + + email = EmailMessage( + subject=predmet, + body=text, + from_email=poslat_z_mailu, + bcc=list(emaily) + #bcc = příjemci skryté kopie + ) - email = EmailMessage( - subject=predmet, - body=text_mailu, - from_email=poslat_z_mailu, - bcc=list(emaily) - #bcc = příjemci skryté kopie - ) + email.send() - email.send() + posli(text_mailu, resitele_vsichni.filter(zasilat=pm.Resitel.ZASILAT_NIKAM)) + posli(text_mailu + 'P. S. Také by vám brzy měla přijít papírová verze. 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. Děkujeme. (Čísla vždy můžete nalézt v našem archivu a dál vám budou chodit e-mailem.)\n', + resitele_vsichni.exclude(zasilat=pm.Resitel.ZASILAT_NIKAM)) def save(self, *args, **kwargs): super().save(*args, **kwargs)