Compare commits

..

1 commit

18 changed files with 49 additions and 161 deletions

View file

@ -1,36 +0,0 @@
FROM python:3.9.18-slim-bullseye
# set work directory
WORKDIR /usr/mamweb-docker
# set environment variables
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc \
locales \
imagemagick \
netcat \
postgresql-client
RUN pip install --upgrade pip
COPY ./requirements.txt .
COPY ./constraints.txt .
RUN pip install -r requirements.txt
# allow correct locales
RUN sed -i '/cs_CZ.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen
ENV LANG cs_CZ.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL cs_CZ.UTF-8
# copy project
COPY . .
# create test data once db is ready
RUN chmod +x /usr/mamweb-docker/docker_entrypoint.sh
ENTRYPOINT ["/usr/mamweb-docker/docker_entrypoint.sh"]

File diff suppressed because one or more lines are too long

View file

@ -1,23 +0,0 @@
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/usr/mamweb-docker
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:13-bullseye
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=mam-web
- POSTGRES_PASSWORD=RoEGG5g7&b # Random generated string corresponding with Django settings
- POSTGRES_DB=mam_docker
volumes:
postgres_data:

View file

@ -1,19 +0,0 @@
#!/bin/sh
echo "Waiting for Postgres..."
while ! nc -z "db" "5432"; do
sleep 0.1
done
echo "PostgreSQL started"
PGPASSWORD="RoEGG5g7&b" # Random generated, corresponds to the one in docker-compose.yml
if psql "postgresql://mam-web:$PGPASSWORD@db:5432/mam_docker" -t -c '\dt' | cut -d \| -f 2 | grep -qw "seminar_cisla"; then
echo "\nExistuje tabulka 'seminar_cisla' v db, testdata pravděpodobně byla vygenerována.\n"
else
python ./manage.py testdata
python ./manage.py loaddata data/*
fi
exec "$@"

View file

@ -1,15 +0,0 @@
Lokální vývoj pomocí dockeru
============================
Přijde vám standardní zprovoznění painful? Docker comes to the rescue. Stačí mít nainstalovaný ``docker`` a spustit ``docker compose up``.
Co se děje under the hood
-------------------------
- ``docker-compose.yml`` specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL db
- ``web`` se buildí z ``Dockerfilu``, mountuje si kořen repa jako svůj volume (takže vidí změny), na konci spouští webserver a vysatvuje ho na port 8000 localhosta
- ``db`` je z ``postgres:13-bullseye`` a má nastavené nějaké parametry, svoje data ukládá jako docker volume
- ``Dockerfile`` staví ``web`` na pythonu3.9 a debianu bullseye (mělo by odpovídat gimlimu) - nainstaluje dependencies, nastaví locale a entrypoint (co se má vykonat při spouštění kontejneru)
- ``docker_entrypoint.sh`` počká na Postgres ready v ``db``, podívá se jestli jsou v něm testdata a když ne, tak je vygeneruje, pak spustí command z compose (i.e. webserver)
- ``mamweb/settings.py`` vybere django settings podle cesty (jako doteď), vybere ``mamweb/settings_docker.py``, které importuje všechno z ``mamweb/settings_local.py``, přepíše jen ``DATABASES`` a ``SECRET_KEY``, aby se jako DB Engine používal Postgres ve vedlejším kontejneru, aby se celý web choval stejně jako ``_test`` a ``_prod`` (``_local`` aktuálně používá DB Engine sqlite3, které se v něčem chová trochu rozdílně)
- kontejner ``web`` se musí nějak připojovat k postgresu v ``db``, k tomu slouží user ``mam-web``, náhodně vygenerované heslo (v ``docker-compose.yml`` a ``docker_entrypoint.sh``, musí se shodovat), db se jmenuje ``mam_docker``

View file

@ -91,7 +91,7 @@ TODO: tabulka není úplná. Pokud na něco narazíte, tak ji prosím doplňte.
Ubuntu 22.10, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "Je potřeba zapnout zdroj ``universe`` a nainstalovat kompilátor C (``gcc``)?"
Linux Mint 21, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, ""
Archlinux 2022.11.01, AUR, vestavěný, vestavěné, ``postgresql-libs``, "Je potřeba céčkový kompilátor (``gcc``); nezapomenout vygenerovat locale ``cs_CZ.UTF-8``"
Archlinux 2022.11.01, AUR, vestavěný, vestavěné, ``postgresql-libs``, "Je potřeba céčkový kompilátor (``gcc``)"
openSUSE Leap 15.4, oficiální (``python39``), předinstalovaný?, ``python39-devel``, ??FIXME!!, "Výchozí verze pythonu je 3.6 a ta je moc stará, potřeba instalovat ``gcc``. Nevím jak sehnat pg_config."
Debian 11, "oficiální, výchozí", ??, ??, ??, "Určitě to tam rozběhat jde, protože Gimli. Nejspíš bude relativně podobné Ubuntu."

View file

@ -68,5 +68,10 @@ class OpravaAdmin(admin.ModelAdmin):
model = Oprava
filter_horizontal = ("informovani_orgove", "tagy",)
class KorekturaTagAdmin(admin.ModelAdmin):
model = KorekturaTag
filter_horizontal = ("informovani_orgove", )
admin.site.register(Oprava, OpravaAdmin)
admin.site.register(KorekturaTag)
admin.site.register(KorekturaTag, KorekturaTagAdmin)

View file

@ -118,9 +118,6 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs):
y=y,
)
Komentar.objects.create(oprava=oprava, autor=autor, text=text)
send_email_notification_komentar(oprava, autor, request)
tagy_raw = q.get('tagy')
if tagy_raw is not None:
oprava.tagy.clear()
@ -128,6 +125,11 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs):
tagy = list(map(int, tagy_raw.split(",")))
oprava.tagy.add(*KorekturaTag.objects.filter(id__in=tagy))
# Pokud je korektura/komentář nová/-ý
if komentar_id == -1:
Komentar.objects.create(oprava=oprava, autor=autor, text=text)
send_email_notification_komentar(oprava, autor, request)
opravy = Oprava.objects.filter(pdf=pdf_id).all()
# Serializovat list je prý security vulnerability, tedy je přidán slovník pro bezpečnost

View file

@ -0,0 +1,19 @@
# Generated by Django 4.2.16 on 2025-06-04 17:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('personalni', '0019_rename_upozorneni_resitel_upozornovat_na_opravy_reseni'),
('korektury', '0028_alter_korekturovanepdf_options_and_more'),
]
operations = [
migrations.AddField(
model_name='korekturatag',
name='informovani_orgove',
field=models.ManyToManyField(blank=True, default=None, help_text='Orgové informovaní při přidání komentáře ke korektuře s daným tagem', related_name='informovan_o_tagu', to='personalni.organizator', verbose_name='Informovaní organizátoři'),
),
]

View file

@ -138,6 +138,13 @@ class KorekturaTag(models.Model):
nazev = models.CharField("název tagu", blank = False, max_length=20, help_text="Název daného tagu, <20 znaků")
barva = ColorField("barva daného tagu", default="#FFFFFF")
informovani_orgove = models.ManyToManyField(
Organizator, blank=True, default=None,
verbose_name='Informovaní organizátoři',
help_text="Orgové informovaní při přidání komentáře ke korektuře s daným tagem",
related_name='informovan_o_tagu',
)
def __str__(self):
return self.nazev

View file

@ -19,11 +19,11 @@
<br>
<i>Klikni na chybu, napiš komentář</i> |
<a href="{{korekturovanepdf.pdf.url}}">stáhnout PDF (bez korektur)</a> |
<a href="../">seznam souborů</a> |
<a href="/admin/korektury/korekturovanepdf/">Spravovat PDF</a> |
<a href="../help">nápověda</a> |
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
<a href="../">🔙 seznam korekturovaných PDF</a> |
<a href="/">🏠 hlavní stránka</a> |
<a href="/">hlavní stránka</a> |
<a href="https://mam.mff.cuni.cz/wiki">wiki</a> |
<hr />

View file

@ -40,6 +40,13 @@ def send_email_notification_komentar(oprava: Oprava, autor: Organizator, request
if email_zobpovedny:
emails.add(email_zobpovedny)
# orgove informovaní při korektuře
for tag in oprava.tagy.all():
for org in tag.informovani_orgove.all():
email_informovany = org.osoba.email
if email_informovany:
emails.add(email_informovany)
# odstran e-mail autora opravy
email = autor.osoba.email
if email:

View file

@ -14,9 +14,6 @@ if "mamweb-test" in os.path.abspath(__file__):
elif "mamweb-prod" in os.path.abspath(__file__):
from .settings_prod import *
elif "mamweb-docker" in os.path.abspath(__file__):
from .settings_docker import *
else:
from .settings_local import *

View file

@ -1,33 +0,0 @@
# -*- coding: utf-8 -*-
#
# Docker nastaveni settings.py
#
# Pro vyber tohoto nastaveni muzete pouzit tez:
# DJANGO_SETTINGS_MODULE=mamweb.settings_docker ./manage.py ...
#
# Import common settings
from .settings_common import * # zatim nutne, casem snad vyresime # noqa
from mamweb.settings_local import * # Import all the settings for local development
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'EZfSzeuDCycKr5ZjiCQ^45ZqFU@8Ke#YDwn9ThqerfEpu^yV#p'
# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mam_docker',
'USER': 'mam-web',
'PASSWORD': 'RoEGG5g7&b', # Random generated string corresponding with docker-compose
'TEST': {
'NAME': 'mam-docker-testdb',
},
"HOST": "db",
"PORT": "5432",
},
}

View file

@ -30,14 +30,10 @@ def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_c
res.resitele.set(res_vyber)
res.save()
deadlines = cisla[poradi_cisla -1 ].deadline_v_cisle.all()
dline = random.choice(deadlines)
# Vytvoření hodnocení.
hod = Hodnoceni.objects.create(
body=rnd.randint(0, uloha.max_body),
deadline_body = dline,
cislo_body=cisla[poradi_cisla - 1],
reseni=res,
problem=uloha
)

View file

@ -12,22 +12,6 @@ POZOR! Kolize jmen! Dva řešitelé mají stejné makro!
{% autoescape off %}
{% load tex %}
\ExplSyntaxOn
\char_set_catcode_other:n{32}% Odsud dál do \char_set_catcode_space:n{32} nesmí být za žádnou cenu jiná mezera (tj. i zlom řádku) než ty mezi jménem a příjmením
\prop_const_from_keyval:Nn\g_tituly%
{%
{% for r in resitele %}{{r|sloz}}={% if r.titul == '' %}{}{% else %}{\titul{{r.titul|sloz}}}{% endif %},%
{% endfor %}}%
\char_set_catcode_space:n{32}
\DeclareDocumentCommand\Titul{mO{#1}}{%
\prop_if_in:NnTF\g_tituly{#1}%
{\prop_item:Nn\g_tituly{#1}}%
{\ClassError{mam}{Titul pro #1 nenalezen!}{}}%
#2%
}
\ExplSyntaxOff
{% for r in resitele %}
{% if r.titul == '' %}
{% spaceless %}

View file

@ -52,7 +52,6 @@
</tbody>
</table>
<p>Tabulka je scrollovatelná. Je v ní {{ vysledkovka.radky_vysledkovky|length }} řešitelů.</p>
<p>Po kliknutí na políčko v záhlaví tabulky se u daného problému zobrazí (/skryje) detailní rozpis, za které podproblémy řešitelé dostali body.</p>
{# TODELETE #}

View file

@ -32,5 +32,3 @@
{% endfor %}
<tbody>
</table>
<p>Tabulka je scrollovatelná. Je v ní {{ vysledkovka.radky_vysledkovky|length }} řešitelů. </p>