Skip to content

fix(importer): wieloliniowy BibTeX wywalał import 500 (Freshdesk #344)#407

Open
mpasternak wants to merge 3 commits into
devfrom
fix/importer-bibtex-multiline-authors-344
Open

fix(importer): wieloliniowy BibTeX wywalał import 500 (Freshdesk #344)#407
mpasternak wants to merge 3 commits into
devfrom
fix/importer-bibtex-multiline-authors-344

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Freshdesk #344 — „błąd serwera (500)" przy imporcie BibTeX

Root cause

Lista autorów w realnym BibTeX-ie jest łamana na osobne linie:

author = {Wierda, William G. and
          Brown, Jennifer R. and
          ...}

_parse_authors dzielił po literalnym " and " (ze spacją). Separator " and\n" (z nową linią) nie pasował → wszyscy autorzy lądowali w jednym ImportedAuthor. Wynikowy given_name/zapisany_jako (>700 znaków) przekraczał varchar(255)/(512)StringDataRightTruncationDataError w ImportedAuthor.objects.create (authors.py:90).

Dotyczyło każdego wieloliniowego wpisu (większość kopiowanych z czasopism/Zotero), nie tylko tego z ticketu. Przed #241 (synchroniczny import bez try/except) = surowy 500; po #241 = IMPORT_FAILED.

Zmiany

Plik Co Punkt z ticketu
providers/bibtex.py _parse_authors split po \s+and\s+ root cause
views/authors.py _auto_match_single_author przycinanie pól do limitów kolumn (255/50/512) defense-in-depth
providers/bibtex.py _clean_pages normalizacja unicode myślników (– — − ‒ ―) → ASCII - pages = {S180—S180}
providers/bibtex.py fetch koniec cichego except: return None → log + re-raise łykanie wyjątków
django_bpp/celery_tasks.py handle_task_failure jawne exc_info z einfo Rollbar milczał
templates/.../task_progress.html + step_task_status.html polling na root partiala (hx-swap=outerHTML), błąd zatrzymuje odświeżanie HTMX mrugał co 3s
admin.py created_record_link logowanie zamiast cichego except łykanie wyjątków

Testy

  • test_freshdesk_344.py — dokładny wieloliniowy wpis z ticketu (przed: 1 autor, po: 7), pełny pipeline fetch_session_task, normalizacja stron (S180—S180S180-S180).
  • test_views_task_status.py — partial postępu pilnuje every 3s, partial błędu go nie ma.
  • Cała suita importer_publikacji zielona (418 passed, 1 skipped).

🤖 Generated with Claude Code

mpasternak and others added 3 commits June 21, 2026 13:23
Design spec dla Freshdesk #329: trzecia gałąź 'W:' dla wydawnictwa
nadrzędnego pochodzącego z surowego JSON-a PBN (object.book) przez
akcesor book_title na pbn_api.Publication, oraz mechanizm Hybrid
synchronizacji dbtemplate (komenda update_dbtemplates + akcja w adminie
'Zaciągnij z dysku' z diffem DB↔dysk i przebudową cache).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rozdziały importowane z PBN trzymają rodzica w JSON-ie publikacji pod
object.book, bez ustawionego FK BPP ani kurowanego wydawnictwo_nadrzedne_w_pbn.
Dotąd nic tego nie renderowało.

- pbn_api.Publication: akcesory book / book_title (analogiczne do journal),
  bo szablon nie umie wywołać value_or_none('object','book','title').
- opis_bibliograficzny.html: trzecia gałąź 'W:' -> praca.pbn_uid.book_title.
- testy: book/book_title (4) + render z object.book + pierwszeństwo FK BPP.

Uwaga: w istniejących instalacjach dbtemplate opis_bibliograficzny.html w
bazie zasłania dysk (problem #329 warstwa 2) — sama ta zmiana NIE pokaże
poprawki, dopóki dbtemplate nie zostanie zsynchronizowany (Część B).

Refs #329

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Lista autorów w realnym BibTeX-ie jest zwykle łamana na osobne linie
("... and\n   Następny, Autor"), a `_parse_authors` dzielił po literalnym
`" and "` (ze spacją). Separator `" and\n"` nie pasował → WSZYSCY autorzy
lądowali w jednym `ImportedAuthor`. Wynikowy `given_name`/`zapisany_jako`
(>700 znaków) przekraczał varchar(255)/(512) → StringDataRightTruncation
→ DataError w `ImportedAuthor.objects.create` → 500 (przed #241) /
IMPORT_FAILED (po #241).

Zmiany:
- bibtex._parse_authors: split po `\s+and\s+` (dowolny biały znak wokół
  "and"). Root cause.
- authors._auto_match_single_author: przycinanie pól do limitów kolumn
  (255/50/512) — defense-in-depth, żeby żaden wpis nie wywalił już importu
  na długości pola.
- bibtex._clean_pages: normalizacja unicode myślników (– — − ‒ ―) do ASCII
  '-', żeby pierwsza_strona/ostatnia_strona poprawnie rozbijały zakres
  (np. 'S180—S180').
- bibtex.fetch: koniec cichego `except Exception: return None` — log +
  re-raise (błąd trafia do Rollbara, nie znika jako "dostawca nic nie
  zwrócił").
- celery_tasks.handle_task_failure: jawne `exc_info` z `einfo` sygnału —
  bez tego report_exc_info() sięgał po wyczyszczone sys.exc_info() i do
  Rollbara szedł pusty raport (dlatego ten 500 nie pojawiał się w Rollbarze).
- task_status: polling HTMX przeniesiony na root partiala postępu
  (hx-swap=outerHTML) — partial błędu (bez hx-trigger) zatrzymuje
  odświeżanie co 3s, więc traceback przestaje "mrugać" i da się go
  zaznaczyć.
- admin.created_record_link: logowanie zamiast cichego połykania wyjątku.

Testy: test_freshdesk_344.py (dokładny wieloliniowy wpis z ticketu — przed
fixem 1 autor, po fixie 7; normalizacja stron) + 2 testy polling/błąd w
test_views_task_status.py. Cała suita importer_publikacji zielona.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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