diff --git a/docs/REFACTORING_STATUS.md b/docs/REFACTORING_STATUS.md index 856b166..1b1ddc7 100644 --- a/docs/REFACTORING_STATUS.md +++ b/docs/REFACTORING_STATUS.md @@ -224,20 +224,77 @@ curl -sI https://nordabiznes.pl/release-notes | head -1 --- +## Metodologia Bezpiecznego Wdrażania (OBOWIĄZKOWA) + +> **INCYDENT 2026-01-31:** Awaria produkcji spowodowana niedziałającymi aliasami. +> Szablony używały `url_for('admin_seo')` ale alias nie został utworzony. + +### Zasady PRZED przeniesieniem trasy do blueprintu + +1. **NAJPIERW zaktualizuj szablony** - zmień `url_for('stara_nazwa')` na `url_for('blueprint.endpoint')` +2. **Wdróż zmianę szablonów** - przetestuj na produkcji +3. **DOPIERO POTEM** przenieś trasę do blueprintu + +### Zasada: Pełne nazwy blueprintów (NIE aliasy) + +```python +# ❌ BŁĘDNIE - aliasy są zawodne +url_for('admin_seo') + +# ✅ PRAWIDŁOWO - pełna nazwa blueprintu +url_for('admin.admin_seo') +``` + +**Dlaczego:** Aliasy mogą nie działać dla tras w oddzielnych plikach. Pełne nazwy są jawne i niezawodne. + +### Checklist PRZED każdym deploy + +```bash +# 1. Test importu +python3 -c "from app import app; print('OK')" + +# 2. Test renderowania strony głównej (NIE tylko status!) +curl -s https://localhost:5000/ | head -50 + +# 3. Test url_for dla przeniesionych endpointów +python3 -c " +from app import app +from flask import url_for +with app.test_request_context(): + print(url_for('admin.admin_seo')) # Musi działać +" + +# 4. Dopiero po pozytywnych testach - deploy na PROD +``` + +### Procedura przenoszenia trasy (NOWA) + +1. **Audit szablonów** - znajdź wszystkie `url_for('nazwa_trasy')` w templates/ +2. **Zaktualizuj szablony** - zmień na `url_for('blueprint.nazwa_trasy')` +3. **Wdróż szablony** - commit, push, deploy, test PROD +4. **Utwórz trasę w blueprincie** - skopiuj kod do blueprints/ +5. **Skomentuj trasę w app.py** - prefix `_old_` +6. **Test lokalny** - import + renderowanie stron +7. **Deploy** - commit, push, deploy +8. **Test PROD** - sprawdź czy strony się renderują +9. **Cleanup** - usuń martwy kod z app.py + +--- + ## Lekcje na przyszłość -1. **url_for w blueprintach:** +1. **url_for w szablonach:** + - **ZAWSZE używaj pełnych nazw:** `url_for('blueprint.endpoint')` + - **NIE polegaj na aliasach** - są zawodne - Wewnątrz blueprintu: `url_for('.endpoint')` (z kropką) - - W szablonach: `url_for('blueprint.endpoint')` (pełna nazwa) - - Aliasy: `url_for('stara_nazwa')` = `url_for('blueprint.nowa_nazwa')` 2. **Kolejność operacji:** - - Najpierw blueprinty + aliasy - - Potem dezaktywacja duplikatów + - **NAJPIERW szablony** - zaktualizuj url_for + - Potem blueprinty - Cleanup dopiero po teście PROD 3. **Bezpieczeństwo:** - - Zawsze zachowuj martwy kod do weryfikacji + - Zawsze testuj renderowanie stron, nie tylko status HTTP - Prefix `_old_` dla zdezaktywowanych funkcji - Rollback: odkomentuj `@app.route`