Files
janssen/Python-runner/5_enrich_fulltext_emails_v1.3.md
2026-06-05 21:21:30 +02:00

80 lines
3.6 KiB
Markdown

# 5_enrich_fulltext_emails_v1.3.py
**Krok 5 pipeline** — vytáhne plain-text z emailů v Mongu (`emaily.<schránka>`) a uloží do PostgreSQL (`MongoEmaily.emails`) s tsvector GIN indexem nad konfigurací `soubory` (simple + unaccent).
## Co dělá
1. Vybere první dostupné tělo v tomto pořadí:
- `smime_body_text/html` (rozbaleno krokem 4)
- `body_html` → strip HTML přes BeautifulSoup
- `body_text` (legacy plain)
- `body_preview` (jako fallback)
2. Naplní řádek v PG `emails` (mailbox, subject, sender, recipients, body, attachments_summary, ...) + tsvector se vygeneruje sám.
3. Upsert (`ON CONFLICT (mailbox, message_id) DO UPDATE`).
## Inkrementální logika
Pokud `(mailbox, message_id)` už je v PG a:
- `extractor_version == EXTRACTOR_VERSION` (aktuálně `1.2`)
- `ok = true`
- `modified_at` v Mongo není novější než v PG
**skip**. Nemusíš se bát opakovaného spuštění — vladimirovo přepsání 73k záznamů co teď probíhá je proto, že `EXTRACTOR_VERSION` byl povýšen z 1.1 → 1.2, takže všechny řádky v PG jsou „zastaralé". Po doběhnutí bude další běh skipovat všechno až na nově přibyvší.
## Změny v1.3 vs v1.2
- **Bugfix** `NON_MAILBOX_COLLECTIONS = {"attachments_index", "sync_state"}` — předtím `sync_state` (přibyla s delta syncem) projížděla jako mailbox.
- **`--index-reset`** — před zpracováním schránky `DELETE FROM emails WHERE mailbox=%s`. Force re-extract bez nutnosti povyšovat verzi.
- **Vylepšený per-mailbox header** — ukáže `v Mongu N, v PG M (uptodate K), k zpracovani K`.
- Když `to_process_estimate == 0` → schránku přeskočí úplně (bez iterace cursorem).
## Argumenty
| Argument | Povinný | Hodnoty | Default | Popis |
|---|---|---|---|---|
| `--mailbox` | ne | e-mail | (všechny) | Bez argumentu projede všechny kolekce mimo `NON_MAILBOX_COLLECTIONS` |
| `--limit N` | ne | int | (bez limitu) | Per schránka, jen prvních N emailů (test) |
| `--index-reset` | ne | flag | false | Před zpracováním **smaže** všechny emaily dané schránky v PG. **Bez `--mailbox` smaže CELÝ index!** |
## Varianty volání
```bash
# Všechny schránky, inkrementální:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py
# Jedna schránka:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz
# Test 500 emailů:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --limit 500
# Force reindex jedné schránky:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --index-reset
# DANGEROUS: smaže celý index a postaví znovu (POMALÉ — typicky 30+ minut):
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --index-reset
# Na pozadí, log do souboru:
docker exec -d python-runner bash -c "python /scripts/5_enrich_fulltext_emails_v1.3.py > /scripts/enrich_fulltext.log 2>&1"
```
## Sledování průběhu
```bash
docker exec -it python-runner tail -f /scripts/enrich_fulltext.log
```
V průběhu skript vypisuje každých 200 zpracovaných emailů:
```
[ 38800|p= 5800] OK html 2831ch | CLEAR/RA payment information for invoice #22FV049
```
- první číslo = pozice v cursoru (počet všech emailů co prošlo)
- `p=N` = počet skutečně zprocesovaných (zbytek byl skipnut jako už-aktuální)
- `OK / ERR`, `body_source`, délka, subject
## Závislosti
```bash
docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo
```