# Shopping List

Aplikace pro správu nákupních seznamů vytvořená v Django. Školní projekt základní Django aplikace s moderním UI postaveným na Tailwind CSS a DaisyUI.

## 📋 Funkce

- **Správa nákupních seznamů**
  - Vytváření, úprava a mazání nákupních seznamů
  - Archivace seznamů
  - Duplikace seznamů a ukládání jako šablony
  - Dva různé layouty pro A/B testování

- **Správa položek v seznamech**
  - Přidávání, úprava a mazání položek
  - Označování položek jako zakoupených
  - Množství a jednotky (ks, kg, l, ml, atd.)
  - Poznámky k položkám

- **Správa kategorií**
  - Vytváření a správa kategorií položek
  - Řazení kategorií podle pořadí

- **Uživatelské rozhraní**
  - Moderní, responzivní design
  - Modální dialogy pro přidávání a úpravu
  - Potvrzovací dialogy pro mazání
  - Toast notifikace s různými typy zpráv (SUCCESS, ERROR, WARNING, INFO)
  - Optimalizováno pro mobilní zařízení

- **Autentizace**
  - Přihlášení a odhlášení uživatelů
  - Ochrana stránek vyžadující přihlášení
  - Registrace uživatelů přes Django admin

## 🛠️ Technologie

- **Backend**: Django 5.2.7
- **Frontend**: Tailwind CSS 4.1.13, DaisyUI 5.1.25
- **Databáze**: PostgreSQL
- **WSGI Server**: Gunicorn
- **Package Manager**: uv (Python), pnpm (Node.js)
- **Deployment**: Docker podpora

## 📦 Požadavky

- Python 3.13+
- PostgreSQL 12+
- Node.js (pro build CSS)
- pnpm
- uv (Python package manager)

## 🚀 Instalace

### 1. Klonování repozitáře

```bash
git clone <repository-url>
cd shopping-list
```

### 2. Instalace Python závislostí

```bash
# Instalace uv (pokud ještě nemáte)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Instalace závislostí
uv sync
```

### 3. Instalace Node.js závislostí

```bash
pnpm install
```

### 4. Build CSS

```bash
pnpm build:css
```

### 5. Konfigurace prostředí

Zkopírujte `.env.example` na `.env` a upravte hodnoty:

```bash
cp .env.example .env
```

Upravte `.env` soubor:

```env
SECRET_KEY=your-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1

# Database Configuration (PostgreSQL)
DB_NAME=shopping_list
DB_USER=postgres
DB_PASSWORD=postgres
DB_HOST=localhost
DB_PORT=5432
```

Pro vygenerování nového `SECRET_KEY`:

```bash
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
```

### 6. Nastavení PostgreSQL databáze

Vytvořte databázi v PostgreSQL:

```bash
# Připojení k PostgreSQL
psql -U postgres

# Vytvoření databáze
CREATE DATABASE shopping_list;

# Vytvoření uživatele (volitelné, pokud chcete použít jiného uživatele)
CREATE USER shopping_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE shopping_list TO shopping_user;
\q
```

### 7. Databáze migrace

```bash
# Aktivace virtuálního prostředí
source .venv/bin/activate

# Spuštění migrací
python manage.py migrate

# Vytvoření superuživatele (pro přístup do adminu)
python manage.py createsuperuser
```

### 8. Spuštění vývojového serveru

```bash
python manage.py runserver
```

Aplikace bude dostupná na `http://localhost:8000`

## 🐳 Docker

### Build image

```bash
docker build -t shopping-list .
```

### Spuštění kontejneru

**Poznámka:** Ujistěte se, že máte běžící PostgreSQL databázi, ke které se aplikace může připojit.

```bash
docker run -p 8000:8000 \
  -e SECRET_KEY=your-secret-key \
  -e DEBUG=False \
  -e ALLOWED_HOSTS=localhost,127.0.0.1 \
  -e DB_NAME=shopping_list \
  -e DB_USER=postgres \
  -e DB_PASSWORD=postgres \
  -e DB_HOST=host.docker.internal \
  -e DB_PORT=5432 \
  shopping-list
```

Nebo použijte `.env` soubor:

```bash
docker run -p 8000:8000 --env-file .env shopping-list
```

**Poznámka:** Pokud používáte Docker Desktop, použijte `host.docker.internal` jako `DB_HOST` pro připojení k PostgreSQL běžícímu na hostiteli. Pro Linux použijte IP adresu hostitele nebo název Docker sítě.

### Gunicorn v Docker kontejneru

Aplikace v Docker kontejneru používá Gunicorn WSGI server místo Django development serveru. Gunicorn je konfigurován pomocí `gunicorn.conf.py` souboru.

#### Konfigurace Gunicorn

Gunicorn konfigurace může být upravena pomocí environment proměnných:

- `GUNICORN_BIND`: Adresa a port pro bindování (default: `0.0.0.0:8000`)
- `GUNICORN_WORKERS`: Počet worker procesů (default: `CPU_COUNT * 2 + 1`)
- `GUNICORN_TIMEOUT`: Timeout pro worker procesy v sekundách (default: `120`)
- `GUNICORN_LOGLEVEL`: Úroveň logování (default: `info`)
- `GUNICORN_MAX_REQUESTS`: Maximální počet požadavků před restartem workeru (default: `1000`)

Příklad spuštění s custom konfigurací:

```bash
docker run -p 8000:8000 \
  -e GUNICORN_WORKERS=4 \
  -e GUNICORN_TIMEOUT=180 \
  -e GUNICORN_LOGLEVEL=debug \
  --env-file .env \
  shopping-list
```

## 🚀 Produkční nasazení

### Spuštění s Gunicorn (bez Docker)

Pro produkční nasazení použijte Gunicorn:

```bash
# Aktivace virtuálního prostředí
source .venv/bin/activate

# Spuštění migrací
python manage.py migrate

# Collect static files
python manage.py collectstatic --noinput

# Spuštění Gunicorn
gunicorn core.wsgi:application --config gunicorn.conf.py
```

### Konfigurace Gunicorn pro produkci

Gunicorn může být konfigurován pomocí environment proměnných (viz výše) nebo přímo upravou `gunicorn.conf.py` souboru.

**Doporučené nastavení pro produkci:**
- `DEBUG=False` v `.env`
- Správně nastavené `ALLOWED_HOSTS`
- Použití reverse proxy (např. Nginx) před Gunicorn
- Nastavení SSL/TLS certifikátů
- Monitoring a logování

## 📁 Struktura projektu

```
shopping-list/
├── core/                 # Django projekt konfigurace
│   ├── settings.py      # Nastavení aplikace
│   ├── urls.py          # Hlavní URL routing
│   └── wsgi.py          # WSGI konfigurace
├── groceries/           # Hlavní Django aplikace
│   ├── models.py        # Databázové modely
│   ├── views.py         # View logika
│   ├── forms.py         # Django formuláře
│   ├── urls.py          # URL routing aplikace
│   └── templatetags/    # Vlastní template tagy
├── templates/           # HTML šablony
│   ├── base.html        # Základní šablona
│   ├── groceries/       # Šablony pro nákupní seznamy
│   └── layout/           # Komponenty layoutu
├── static/              # Statické soubory
│   └── css/             # CSS soubory (Tailwind)
├── .env                 # Environment proměnné (není v gitu)
├── .env.example         # Příklad .env souboru
├── Dockerfile           # Docker build konfigurace
├── gunicorn.conf.py     # Gunicorn konfigurace
├── pyproject.toml       # Python závislosti
├── package.json         # Node.js závislosti
└── manage.py            # Django management script
```

## 🎨 A/B Testování

Aplikace obsahuje dvě verze přehledu nákupních seznamů pro A/B testování:

- **Seznam A** (`/`): Card-based layout
- **Seznam B** (`/v2/`): Table-based layout

Odkazy na obě verze jsou dostupné v hlavním menu.

## 👤 Uživatelé a autentizace

- Registrace uživatelů se provádí přes Django admin (`/admin/`)
- Všichni uživatelé musí být přihlášeni pro přístup k aplikaci
- Po přihlášení jsou uživatelé přesměrováni na přehled nákupních seznamů

## 🔧 Vývoj

### Watch mode pro CSS (automatický rebuild při změnách)

```bash
pnpm watch:css
```

### Vytvoření migrací

```bash
python manage.py makemigrations
python manage.py migrate
```

### Django admin

Přístup na `http://localhost:8000/admin/` po vytvoření superuživatele.

## 📝 Poznámky

- Aplikace používá PostgreSQL databázi
- Ujistěte se, že máte PostgreSQL nainstalovaný a běžící před spuštěním aplikace
- V produkci nastavte `DEBUG=False` v `.env`
- Ujistěte se, že máte správně nastavené `ALLOWED_HOSTS` pro produkci
- Statické soubory jsou servírovány pomocí WhiteNoise middleware
- Databázové přihlašovací údaje jsou konfigurovány pomocí environment proměnných v `.env` souboru
- Pro produkční nasazení se používá Gunicorn WSGI server (v Docker kontejneru i při přímém spuštění)
- Gunicorn konfigurace je v `gunicorn.conf.py` a může být upravena pomocí environment proměnných
- Pro vývoj můžete použít Django development server (`python manage.py runserver`)
- CSS soubory jsou builděny lokálně a commitovány do gitu (Docker neprovádí build CSS)

## 📄 Licence

Školní projekt - CZU INFONP

## 👨‍💻 Autor

Štěpán Farka,
Novotný Jan,
Melichar Tomáš

