Skip to content

fix(pbn): WillNotExportError to brak danych, nie awaria — czytelny komunikat#679

Open
mpasternak wants to merge 2 commits into
devfrom
fix/pbn-oczekiwane-bledy-bez-rollbara
Open

fix(pbn): WillNotExportError to brak danych, nie awaria — czytelny komunikat#679
mpasternak wants to merge 2 commits into
devfrom
fix/pbn-oczekiwane-bledy-bez-rollbara

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Problem

sprobuj_wyslac_do_pbn ma osobną gałąź except dla każdego spodziewanego
przypadku
SameDataUploadedRecently, AccessDeniedException,
PKZeroExportDisabled, NeedsPBNAuthorisationException,
ResourceLockedException, PBNValidationError — każda z konkretnym
komunikatem dla redaktora i bez raportu do Rollbara.

Pozostałe podklasy WillNotExportError (DOIorWWWMissing,
LanguageMissingPBNUID, StatementsMissing, CharakterFormalnyMissingPBNUID)
takiej gałęzi nie miały, więc wpadały do except Exception — tego
z komentarzem:

# Zaloguj problem do Rollbar, bo w sumie nie wiadomo, co to za problem na tym etapie...
rollbar.report_exc_info(sys.exc_info())

Skutki:

  1. Redaktor dostawał generyczne „Nie można zsynchronizować obiektu … Kod
    błędu: Musi być DOI lub adres WWW" zamiast czytelnej instrukcji.
  2. Rollbar dostawał item na każde wystąpienie
    (#1475,
    #1473) — mimo że
    system działał poprawnie, a poprawka leży po stronie danych rekordu.

Warto zaznaczyć: kolejka eksportu (pbn_export_queue/models.py) klasyfikuje te
same wyjątki poprawnie, jako RodzajBledu.MERYTORYCZNY. Rozjazd był wyłącznie
w ścieżce z panelu admina.

Rozwiązanie

Osobna gałąź except WillNotExportError, tuż przed except Exception.
Komunikat wyjątku jest już napisany po polsku i wprost mówi, czego brakuje —
podajemy go redaktorowi (escape'owany), z prośbą o uzupełnienie danych.

PKZeroExportDisabled zostaje na swojej wcześniejszej gałęzi: to też
podklasa WillNotExportError, ale ma inny, konfiguracyjny komunikat („eksport
prac z PK=0 jest wyłączony"). Kolejność gałęzi to gwarantuje, a istniejący
test_sprobuj_wyslac_do_pbn_pk_zero tego pilnuje.

Testy

Nowy parametryzowany test_sprobuj_wyslac_do_pbn_will_not_export_czytelny_komunikat_bez_rollbar
(dla DOIorWWWMissing i LanguageMissingPBNUID) — TDD, oba przypadki najpierw
padały na assert "Kod błędu" not in text. Wzorowany na istniejącym
test_sprobuj_wyslac_do_pbn_validation_error_czytelny_komunikat_bez_rollbar,
czyli na konwencji, którą repo już stosuje dla tej samej klasy problemu.

  • src/pbn_api/tests/test_bpp_admin_helpers.py — 18 passed
  • src/pbn_export_queue — 166 passed (klasyfikacja w kolejce bez zmian)

🤖 Generated with Claude Code

https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH

mpasternak and others added 2 commits July 25, 2026 00:25
…munikat

sprobuj_wyslac_do_pbn ma osobną gałąź except dla każdego spodziewanego
przypadku (SameDataUploadedRecently, AccessDeniedException,
PKZeroExportDisabled, NeedsPBNAuthorisationException, ResourceLockedException,
PBNValidationError) — każda z konkretnym komunikatem dla redaktora i bez
raportu do Rollbara.

Pozostałe podklasy WillNotExportError (DOIorWWWMissing, LanguageMissingPBNUID,
StatementsMissing, CharakterFormalnyMissingPBNUID) takiej gałęzi nie miały,
więc wpadały do `except Exception` — opatrzonego komentarzem "w sumie nie
wiadomo, co to za problem na tym etapie". Skutki: redaktor dostawał generyczne
"Kod błędu: Musi być DOI lub adres WWW", a Rollbar item na każde wystąpienie
(#1475, #1473), mimo że system działał poprawnie, a poprawka leży po stronie
danych rekordu.

Komunikat wyjątku jest już napisany po polsku i wprost mówi, czego brakuje —
podajemy go redaktorowi wprost (escape'owany), z prośbą o uzupełnienie danych.

PKZeroExportDisabled zostaje na swojej wcześniejszej gałęzi: to podklasa
WillNotExportError, ale ma inny, konfiguracyjny komunikat. Kolejność gałęzi
to gwarantuje, a istniejący test tego pilnuje.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
- Twierdziłem w opisie, że "istniejący test pilnuje kolejności gałęzi".
  NIEPRAWDA: ciąg "Eksport prac z PK=0" nie występował w żadnym teście,
  a testy kolejki idą ścieżką raise_exceptions=True, gdzie obie gałęzie
  robią `raise e` — są więc na kolejność niewrażliwe. Przestawienie gałęzi
  nie wywaliłoby niczego. Dokładam PKZeroExportDisabled do parametryzacji;
  zweryfikowane mutacją (przeniesienie WillNotExportError ponad
  PKZeroExportDisabled → test pada).

- escape(e) dało się usunąć bez żadnego czerwonego testu. Komunikaty
  zawierają dane sterowane przez użytkownika (LanguageMissingPBNUID
  wstrzykuje nazwę języka, CharakterFormalnyMissingPBNUID nazwę charakteru
  formalnego — oba ze słowników edytowalnych w adminie), a admin/base.html
  renderuje komunikaty przez `|safe`. Dokładam test escapowania, lustro
  istniejącego ..._validation_error_escapuje_html.

- Sufiks "Uzupełnij dane rekordu" był mylący dla dwóch przypadków:
  CharakterFormalnyMissingPBNUID (poprawka w słowniku, nie w rekordzie)
  oraz gołego WillNotExportError podnoszonego przez Uczelnia.pbn_client()
  przy braku autoryzacji w PBN — ta ścieżka JEST osiągalna wewnątrz try,
  bo authorize() woła się leniwie przy 403. Teraz: "Popraw dane rekordu
  lub konfigurację".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant