# Registr smluv

Aplikace pro transparentní evidenci smluv a informací s nimi spojených.

## Struktura projektu
```
.
├── registry                = Nastavení projektu, URLs.
├── shared                  = Sdílené modely, templaty a statické soubory pro všechny ostatní aplikace.
├── contracts               = Aplikace pro samotné smlouvy.
├── users                   = Aplikace pro uživatele.
├── static_src              = Zdrojové CSS a JS, které příkazem 'make build' buildujeme.
├── requirements            = Pythonové závislosti z PyPI.
└── env.example             = Příklad .env souboru.
```

## Konfigurace

Je třeba definovat minimálně následující environment proměnné:
| proměnná | popis |
| --- | --- |
| `DATABASE_URL` | URL pro připojení k databázi ve formátu `postgresql://username:password@host:5432/database_name` |
| `SECRET_KEY` | Tajný klíč např. pro šifrování |
| `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 |
| `DEFAULT_COUNTRY` | Defaultní země podepisujících stran, např. `Česká republika` |
| `DEFAULT_CONTRACTEE_NAME` | Defaultní jméno naší podepisující strany |
| `DEFAULT_CONTRACTEE_STREET` | Defaultní ulice a č.p. naší podepisující strany |
| `DEFAULT_CONTRACTEE_ZIP` | Defaultní PSČ naší podepisující strany |
| `DEFAULT_CONTRACTEE_DISTRICT` | Defaultní obec naší podepisující strany |
| `DEFAULT_CONTRACTEE_ICO_NUMBER` | Defaultní IČO naší podepisující strany |

V produkci je potřeba:
| proměnná | popis |
| --- | --- |
| `ALLOWED_HOSTS` | Seznam domén, skrz které se na server lze připojovat. [Více info](https://docs.djangoproject.com/en/4.1/ref/settings/#allowed-hosts) |

## Vývoj

V produkci používáme Docker. Při vývoji se hodí přiložený `Makefile`, pro automatizování často prováděných akcí. Pro nápovědu zavolej:

```bash
$ make help
```

### Lokální setup

Požadavky:
- Python 3.9+
- Linuxové prostředí, na Windows netestováno

Zkopíruj `env.example` do `.env`, nastav potřebné proměnné.

Vytvoř virtualenv:

```bash
$ 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žij třeba [Pyenv](https://github.com/pyenv/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:

```bash
$ source .venv/bin/activate
```

Pro shell lze vytvořit alias. Do `~/.bash_profile`, `~/.zshrc` nebo jiného
konfiguračního souboru dle tvého shellu přidej:

```bash
$ alias senv='source .venv/bin/activate'
```

A pak můžeš virtualenv aktivovat pouze jednoduchým voláním:

```bash
$ senv
```

Pro sofistikovanější řešení, které aktivuje virtualenv při změně adresáře na
adresář s projektem, slouží nástroj [direnv](https://direnv.net/).

Deaktivace virtualenv se dělá příkazem:

```bash
$ deactivate
```

### Instalace závislostí

Spusť:

```bash
$ make install
```

Tím se nainstalují Pythonové závislosti a virtuální Node.js 19x nutné k buildu statických souborů.

### Build statických souborů

Spusť:

```bash
$ make build
```

Tím se vytvoří CSS a JS soubory, které se dají použít v prohlížečovém prostředí.

### Spuštění development serveru

Django development server na portu `8012` se spustí příkazem:

```bash
$ make run
```

Poté můžeš web otevřít na adrese [http://localhost:8012](http://localhost:8012).

### Code quality

K formátování kódu se používá [black](https://github.com/psf/black). Doporučujeme
ho nainstalovat do tvého editoru, 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](https://github.com/timothycrosley/isort/).

### Pre-commit hooky

Použivá se [pre-commit](https://pre-commit.com/) framework pro management git
pre-commit hooks.

Máš-li pre-commit framework [nainstalovaný](https://pre-commit.com/#installation),
spusť příkaz:

```bash
$ 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:

```bash
$ make hooks
```