Compare commits

...

9 commits

Author SHA1 Message Date
ec0174dcdd Merge remote-tracking branch 'origin/master' into vylepseni_odevzdavatka
# Conflicts:
#	odevzdavatko/templates/odevzdavatko/detail.html
2023-02-06 21:14:13 +01:00
a6a57de3cf Merge pull request 'Zrychlení testů' (!21) from faster_tests into master
Reviewed-on: #21
2023-02-06 20:49:09 +01:00
3dab396450 E-mail připomínající řešitelům možnost Nezasílat papírově 2023-01-30 20:58:37 +01:00
fad2a1bc47 Nikam -> Nezasílat papírově 2023-01-30 20:33:23 +01:00
4623adb249 fix: odřádkování ve feedbacku v hodnotíku 2023-01-24 20:57:32 +01:00
MaM Web user
e6b8998edd Jidáš: hotfix: smazání přezdívky v osobních údajích 2023-01-04 21:30:52 +01:00
Pavel "LEdoian" Turinsky
3a1aade3a2 Testy: bereme parametry
Umožňuje testovat konkrétní moduly a nespouštět vždy všechno.
2023-01-04 02:11:15 +01:00
Pavel "LEdoian" Turinsky
af6628367f Testy: Schováváme si databázi napříč běhy
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.
2023-01-04 01:51:02 +01:00
a666a3fea4 hotfix: nemohl odevzdávat řešitel samotný 2023-01-03 19:04:45 +01:00
8 changed files with 51 additions and 17 deletions

View file

@ -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 "$@"

View file

@ -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': {

View file

@ -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'),

View file

@ -108,7 +108,7 @@
<td class="bodovani">{{ h.body_celkem }}</td>
<td class="bodovani teamovaCast">{{ h.body_neprepocitane }}</td>
<td class="bodovani teamovaCast">{{ h.body_neprepocitane_celkem }}</td>
<td>{{ h.feedback }}</td>
<td>{{ h.feedback | linebreaks }}</td>
</tr>
{% endfor %}
</table>

View file

@ -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']

View file

@ -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'),
),
]

View file

@ -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)

View file

@ -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)))
resitele_vsichni = aktivniResitele(self).filter(zasilat_cislo_emailem=True)
if not settings.POSLI_MAILOVOU_NOTIFIKACI:
print("Poslal bych upozornění na tyto adresy: ", " ".join(emaily))
return
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_mailu,
from_email=poslat_z_mailu,
bcc=list(emaily)
#bcc = příjemci skryté kopie
)
email = EmailMessage(
subject=predmet,
body=text,
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)