Maják
Maják je CMS pro Pirátské weby. Postavený je na Wagtail.
Pod pokličkou
Wagtail a Django jsou poměrně vyspělé frameworky. Vždy mysli na to, že problém co řešíš, už pravděpodobně řešil někdo před tebou. A obvykle existuje elegantní řešení.
Pár užitečných odkazů:
A za zmínku stojí Awesome Wagtail jako přehled pluginů a rozšíření pro Wagtail.
Rozšíření která používáme:
-
wagtail-metadata
- upravený template
shared/templates/wagtailmetadata/parts/tags.html
- upravený template
Struktura projektu
.
├── home = app na web úvodní stránky Majáku
├── donate = app na web dary.pirati.cz
├── senate = app na web senat.pirati.cz
├── senat_campaign = app na weby kandidátů na senátory
├── districts = app na web kraje.pirati.cz
├── program2021 = app na prezentaci programu 2021
├── uniweb = app na univerzalni webove stranky
...
├── majak = Django projekt s konfigurací Majáku
├── shared = app se sdílenými static soubory a templaty pro weby
├── calendar_utils = app s modelem a utilitami na iCal kalendáře
├── search = app pro fulltext search (default, asi se k ničemu nepoužívá)
├── tuning = app na tuning administračního rozhraní Majáku
└── users = app s custom user modelem a SSO, apod.
Kalendáře
Pro práci s kalendáři v iCal formátu je připravena appka calendar_utils
.
Poskytuje CalendarMixin
do modelu, který přidá fieldy calendar_url
pro
editaci a calendar
pro vazbu na model Calendar
(který se plní a automaticky
spravuje na pozadí). Typicky se použije ve Wagtail settings pro web, kde stačí
calendar_url
zpřístupnit pro editaci.
Kalendář se stáhne při uložení modelu obsahujícího CalendarMixin
.
Appka přidává management command update_callendars
, který stahuje a updatuje
kalendáře. Je třeba ho pravidelně volat na pozadí (přes CRON).
Jupyter notebooky
Appka Uniweb umí vložit do stránky Jupyter notebook a zobrazit jeho výstup.
Pokud některé buňky nechceš generovat do výstupní stránky, nastav u nich tag "exclude".
Pokud chceš generovat jen výstup dané buňky, použij tag "output"
Pozor: u plotly grafů je nutno zadat tagem "output" výstup buňky s inicializací knihovny, tedy něco kde je "import plotly" apod. Pokud celou takovou buňku vynecháš tagem "exclude", žádné grafy se nezobrazí.
Deployment
Konfigurace
Je třeba nastavit environment proměnné:
proměnná | default | popis |
---|---|---|
DATABASE_URL |
DSN k databázi (např. postgres://user:pass@localhost:5342/majak ) |
|
OIDC_RP_REALM_URL |
OpenID server realm URL (např. http://localhost:8080/auth/realms/master/ ) |
|
OIDC_RP_CLIENT_ID |
OpenID Client ID | |
OIDC_RP_CLIENT_SECRET |
OpenID Client Secret | |
BASE_URL |
https://majak.pirati.cz | základní URL pro notifikační emaily apod. |
V produkci musí být navíc nastaveno:
proměnná | default | popis |
---|---|---|
DJANGO_SECRET_KEY |
tajný šifrovací klíč | |
DJANGO_ALLOWED_HOSTS |
allowed hosts (více hodnot odděleno čárkami) |
Různé:
proměnná | default | popis |
---|---|---|
MAJAK_ENV |
prod |
prod /test /dev prostředí kde Maják běží |
SENTRY_DSN |
pokud je zadáno, pády se reportují do Sentry |
Settings pro appky na weby:
proměnná | default | popis |
---|---|---|
DONATE_PORTAL_REDIRECT_URL |
"" | URL pro přesměrování z darovacího formuláře |
DONATE_PORTAL_REDIRECT_SOURCE |
dary.pirati.cz | identifikátor zdroje pro přesměrování na darovací portál |
DONATE_PORTAL_API_URL |
"" | URL s API darovacího portálu |
Management commands
Přes CRON je třeba na pozadí spouštět Django manage.py
commandy:
-
clearsessions
- maže expirované sessions (denně až týdně) -
publish_scheduled_pages
- publikuje naplánované stránky (každou hodinu) -
update_callendars
- stáhne a aktualizuje kalendáře (několikrát denně)
Přidání nového webu
Doména či subdoména se musí nakonfigurovat v:
- environment proměnné
DJANGO_ALLOWED_HOSTS
- proxy před Majákem
- SSO Client redirect URIs
Vývoj
Pro vývoj je definován pomocný Makefile
pro časté akce. Pro nápovědu zavolej:
$ make help
Lokální instalace a spuštění
Vytvoření virtualenv pro instalaci závislostí
Vytvoř virtualenv:
$ make venv
Vytvoří virtualenv ve složce .venv
. Předpokládá že výchozí python
v terminálu
je Python 3. Pokud tomu tak není, použijte třeba Pyenv
pro instalaci více verzí Pythonu bez rizika rozbití systému.
Aktivace virtualenvu
Před prací na projektu je třeba aktivovat virtualenv. To bohužel nejde dělat
pomocí nástroje make
. Je třeba zavolat příkaz:
$ source .venv/bin/activate
Můžete asi na to vytvořit alias pro shell. Do ~/.bash_profile
nebo ~/.zshrc
nebo jiného konfiguračního souboru dle vašeho shellu přidejte:
alias senv='source .venv/bin/activate'
A pak můžete virtualenv aktivovat pouze jednoduchým voláním:
$ senv
Pro sofistikovanější řešení, které vám aktivuje virtualenv při změně adresáře na adresář s projektem, slouží nástroj direnv.
Deaktivace virtualenvu se dělá příkazem:
$ deactivate
Instalace závislostí
V aktivovaném virtualenvu spusťte:
$ make install
To nainstaluje Pythonní závislosti pro vývoj projektu na lokále.
Nastavení environment proměnných
Environment proměnné (viz konfigurace výše) se načítají ze souboru .env
, který
může vypadat takto:
DATABASE_URL=postgres://db:db@localhost:5432/majak
OIDC_RP_REALM_URL=http://localhost:8080/auth/realms/master/
OIDC_RP_CLIENT_ID=majak
OIDC_RP_CLIENT_SECRET=abcd
Pro lokální vývoj obsahují settings tyto výchozí hodnoty:
DEBUG = True
ALLOWED_HOSTS = ["*"]
MAJAK_ENV = "dev"
Management projektu
Migrace databáze
Aplikuj migrace databáze:
$ make migrate
Při změně modelů vygeneruj migrace pomocí:
$ make migrations
Spuštění development serveru
Django development server na portu 8006
se spustí příkazem:
$ make run
Poté můžete otevřít web na adrese http://localhost:8006
Django shell
Django shell používající shell_plus
z Django extensions spustíte:
$ make shell
Testy
Používá se testovací framework pytest. Spuštění testů:
$ pytest
Případně přes make
, ale bez možnosti parametrizovat spuštění testů:
$ make test
Coverage report:
$ make coverage
Code quality
K formátování kódu se používá black. Doporučujeme ho nainstalovat do vašeho editoru kódu, aby soubory přeformátoval po uložení.
Přeformátování kódu nástrojem black
je součástí pre-commit
hooks (viz níže).
Součástí pre-commit
hooků je také automatické seřazení importů v Pythonních
souborech nástrojem isort.
Pre-commit hooky
Použivá se pre-commit framework pro management git pre-commit hooks.
Máte-li pre-commit framework nainstalovaný spusttě příkaz:
$ make install-hooks
Ten naisntaluje hooky pro projekt. A poté při každém commitu dojde k požadovaným akcím na změněných souborech.
Ručně se dají hooky na všechny soubory spustit příkazem:
$ make hooks
Upgrade závislostí
K upgrade se používají pip-tools (pip install pip-tools
):
$ cd requirements/
$ pip-compile -U base.in
$ pip-compile -U production.in
$ pip-compile -U dev.in
Tím se vygenerují base.txt
, production.txt
a dev.txt
.