diff --git a/docs/notes/2026-01-29.md b/docs/notes/2026-01-29.md new file mode 100644 index 0000000..ddb0924 --- /dev/null +++ b/docs/notes/2026-01-29.md @@ -0,0 +1,103 @@ +# Notatki z prac nad NordaBiz - 2026-01-29 + +## Wykonane zadania + +### 1. Naprawa błędów 500 w blueprintach +- **Problem:** `url_for('classifieds_index')` bez prefixu blueprintu powodował 500 +- **Rozwiązanie:** Zmiana na `url_for('.classifieds_index')` (kropka = aktualny blueprint) +- **Pliki:** `blueprints/community/classifieds/routes.py`, `calendar/routes.py`, `contacts/routes.py` + +### 2. Aktualizacja ikony NordaGPT na stronie głównej +- **Problem:** Stara ikona robota zamiast nowej ikony NordaGPT +- **Rozwiązanie:** Podmiana na SVG z `/static/img/nordagpt-icon.svg` +- **Plik:** `templates/index.html` + +### 3. Integracja wideo z portalem +- **Dodano:** Modal player z wideo w sekcji Edukacja +- **Pliki:** + - `blueprints/education/routes.py` - lista materiałów z URL wideo + - `templates/education/index.html` - player, thumbnails, badge "Nowe" +- **Wideo:** `static/videos/nordabiz-zajawka-final.mp4` + +### 4. Poprawki wideo zajawka (Remotion) +- **Zmiana:** Ostatnia scena - logo Norda Biznes zamiast ikony NordaGPT +- **Poprawka:** Polskie znaki ("Twoja sieć kontaktów", "Izba Przedsiębiorców NORDA") +- **Plik:** `remotion/my-video/src/NordaBizZajawka.tsx` + +### 5. Ukrycie strony /aktualnosci +- Strona pozostaje w kodzie, ale nie jest linkowana +- Zostanie udostępniona w przyszłości na decyzję użytkownika + +### 6. Reorganizacja kategorii ogłoszeń +**Nowe kategorie:** +| Kod | Etykieta | +|-----|----------| +| `internal` | Wewnętrzne | +| `external` | Zewnętrzne | +| `event` | Wydarzenie | +| `opportunity` | Okazja biznesowa | +| `partnership` | Partnerstwo | + +- **Plik:** `database.py` - `CATEGORIES` i `CATEGORY_LABELS` + +### 7. Usunięcie "Nowi członkowie" z footera +- **Plik:** `templates/base.html` + +### 8. Obsługa wielu kategorii dla ogłoszeń (GŁÓWNA FUNKCJONALNOŚĆ) + +**Zmiany w bazie danych:** +- Nowa kolumna: `categories TEXT[]` (tablica PostgreSQL) +- Migracja: `database/migrations/029_add_categories_array.sql` +- Indeks GIN dla szybkiego wyszukiwania + +**Zmiany w backendzie:** +- Formularz admin: checkboxy zamiast select (wiele kategorii) +- Filtrowanie: operator PostgreSQL `@>` dla tablic +- Zachowanie kompatybilności wstecznej (pole `category`) + +**Pliki:** +- `app.py` - routes `admin_announcements_new`, `admin_announcements_edit`, `announcements_list` +- `database.py` - model `Announcement` z nowymi metodami +- `templates/admin/announcements_form.html` - checkboxy kategorii +- `templates/announcements/list.html`, `detail.html` - wyświetlanie wielu badge'ów + +**Składnia SQLAlchemy dla ARRAY:** +```python +# BŁĘDNE (generuje LIKE): +Announcement.categories.contains([category]) + +# POPRAWNE (operator @>): +from sqlalchemy.dialects.postgresql import array as pg_array +query.filter(Announcement.categories.op('@>')(pg_array([category]))) +``` + +### 9. Aktualizacja istniejących ogłoszeń +- ID 11 (Baza zakwaterowania): `{external, opportunity}` +- ID 12 (Tytani Przedsiębiorczości): `{external, event}` + +## Błędy naprawione podczas sesji + +| Błąd | Przyczyna | Rozwiązanie | +|------|-----------|-------------| +| 500 na `/tablica/nowe` | Brak prefixu `.` w url_for | Dodanie kropki | +| 500 na `/ogloszenia?category=X` | `.any()` nie istnieje dla ARRAY | Użycie `.op('@>')` | +| 500 (malformed array literal) | `.contains()` generuje LIKE | Użycie `pg_array()` | + +## Commity + +1. `feat(announcements): Obsługa wielu kategorii dla ogłoszeń` +2. `fix: Poprawka składni SQLAlchemy dla ARRAY contains` +3. `fix: Użycie operatora @> dla PostgreSQL ARRAY contains` + +## Do zrobienia (następna sesja) + +- [ ] Nagranie tutorialu NordaGPT (30s) z użyciem GIFów z portalu +- [ ] Integracja z NotebookLM (podcast o portalu) +- [ ] Widget wideo na dashboardzie dla zalogowanych użytkowników + +## Uwagi techniczne + +- PostgreSQL ARRAY wymaga operatora `@>` do sprawdzania zawierania +- SQLAlchemy `.contains()` dla TEXT[] generuje błędne zapytanie LIKE +- Metoda `.any()` nie istnieje dla kolumn ARRAY w SQLAlchemy 2.0 +- Prawidłowa składnia: `column.op('@>')(pg_array([value]))`