Skip to content

fix: wyszukiwanie po ISBN — wydawnictwo nadrzędne i wyszukiwarki globalne - #802

Open
mpasternak wants to merge 2 commits into
devfrom
fix-isbn-wyszukiwanie-nadrzednego
Open

fix: wyszukiwanie po ISBN — wydawnictwo nadrzędne i wyszukiwarki globalne#802
mpasternak wants to merge 2 commits into
devfrom
fix-isbn-wyszukiwanie-nadrzednego

Conversation

@mpasternak

@mpasternak mpasternak commented Sep 6, 2026

Copy link
Copy Markdown
Member

Wyszukiwanie po ISBN nie działało w czterech miejscach naraz. PR naprawia
wszystkie, opierając je na jednym module bpp.util.isbn.

Ustalenia empiryczne (produkcyjne /api/v1/search/publications)

zapytanie wynik
isbn z myślnikami — nawet gdy PBN przechowuje ISBN właśnie z myślnikami 0
isbn w formie kanonicznej trafia
ISBN-10 gdy PBN ma ISBN-13 (i odwrotnie) 0
isbn + type="BOOK" dla realnej „okładki" 0
isbn + type="EDITED_BOOK" albo bez type trafia
title + type="BOOK" dla pracy zbiorowej 0
isbn + type="CHAPTER" 0

PBN indeksuje ISBN bez separatorów, ale zapytania NIE normalizuje. Kanonizacja
przed wysyłką jest więc poprawna i zostaje — wysyłanie surowego wpisu użytkownika
pogorszyłoby sytuację.

W danych referencyjnych wydawnictwa nadrzędne mają w PBN rodzaj EDITED_BOOK
(272 rekordy) kontra BOOK (2). Własne ISBN-y BPP zapisywane są tak, jak wpisał je
użytkownik: 236 z myślnikami, 146 bez.

Commit 1 — wydawnictwo nadrzędne

  1. type="BOOK" w zapytaniach do PBN — odcinało EDITED_BOOK, czyli
    praktycznie wszystkie realne wydawnictwa nadrzędne. Główna przyczyna
    zgłoszenia. ISBN i DOI idą teraz bez type, tytuł dwoma leniwymi
    zapytaniami (EDITED_BOOK, potem BOOK — pole type w API PBN jest
    skalarem). Drugie zapytanie odpala się tylko, gdy pierwsze się wyczerpie.
  2. isbnlib.notisbn() w qualify_query — funkcja liczy cyfrę kontrolną,
    więc ISBN z literówką przestawał być rozpoznawany jako ISBN i trafiał do
    gałęzi wyszukiwania po tytule. Cicho, bez komunikatu, zero wyników.
  3. Pole „Wydawnictwo nadrzędne" nie szukało po ISBN w ogóle — ani w module
    redakcyjnym, ani w wyszukiwarce publicznej, ani w zglos_publikacje.

Etykieta „Pobierz z PBN…" pokazuje teraz to, co wpisał użytkownik, zamiast formy
skanonizowanej.

Commit 2 — wyszukiwarki globalne

Wyszukiwarka publiczna porównywała ISBN dosłownie (isbn__iexact), bez
żadnej normalizacji po którejkolwiek stronie. Wyszukiwarka redakcyjna
normalizowała, ale niejednakowo: strona zapytania zdejmowała kropki, myślniki
i spacje i nie ruszała wielkości liter, strona bazy (normalized_db_isbn)
zdejmowała wyłącznie myślnik i sprowadzała do małych liter — przez co ISBN-10
z cyfrą kontrolną „X" przepadał na samej różnicy wielkości litery, a ISBN
zapisany ze spacjami nie był znajdowany nigdy. Żadna nie zaglądała do e_isbn.

Zbiór wyników jest świadomie nadzbiorem dotychczasowego: warunek ISBN-owy
nie jest bramkowany na wyglada_jak_isbn (dopasowanie jest równościowe, więc
zwykły tytuł i tak niczego nie trafi), a odziedziczony limit len(ni) < 20
zniknął, bo w wersji publicznej takiego limitu nie było.

normalized_db_isbn usunięte razem z eksportem z import_common.core — po tej
zmianie nie miało już użytkowników.

Nowy moduł bpp.util.isbn

  • wyglada_jak_isbn() — rozpoznanie po kształcie ciągu, bez sumy kontrolnej
    (13 cyfr wymaga prefiksu GS1 978/979, żeby przypadkowe liczby nie wpadały
    w gałąź ISBN-ową),
  • warianty_isbn() — forma kanoniczna plus odpowiedniki ISBN-13 i ISBN-10,
  • isbn_znormalizowany(pole) — wyrażenie ORM normalizujące stronę bazodanową,
  • adnotacje_isbn() / warunek_po_isbn() — para do wyszukiwarek globalnych,
  • filtruj_tytul_lub_isbn() — filtr „tytuł albo ISBN" dla autocomplete'ów.

Testy

48 nowych testów: jednostkowe helperów, kształt zapytań do PBN (asercja, że dla
ISBN nie leci type, a dla tytułu lecą dwa zapytania), lenistwo iteratora,
wyszukiwanie lokalne w każdej kombinacji zapisu ISBN-u (myślniki po jednej,
drugiej lub żadnej stronie, spacje, cyfra kontrolna X, ISBN-10 kontra ISBN-13,
e_isbn), oraz regresja na ISBN ze złą sumą kontrolną. Do tego testy kontrolne
pilnujące, że wyszukiwanie po tytule dalej działa.

Pełna suita bez Playwrighta: 9502 passed, 4 skipped, 1 xfailed.

Poza zakresem

Wydawnictwo_ZwarteAdminAutocomplete (ogólne monografie, nie pole nadrzędnego)
nadal nie rozumie ISBN-u.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN

mpasternak and others added 2 commits September 6, 2026 08:43
Trzy niezależne usterki sprawiały, że ISBN nie znajdował wydawnictwa
nadrzędnego — ani lokalnie, ani w PBN.

1. `type="BOOK"` w zapytaniach do PBN. Wydawnictwo nadrzędne dla rozdziału
   to w PBN prawie zawsze `EDITED_BOOK` (praca zbiorowa pod redakcją);
   w danych referencyjnych stosunek wynosi 272 do 2 na korzyść EDITED_BOOK.
   Filtr odcinał więc niemal cały szukany zasób. ISBN i DOI idą teraz bez
   `type` (filtr `isbn` w API PBN sam z siebie trafia wyłącznie w rekordy
   książkowe — `type="CHAPTER"` z ISBN-em zwraca pustkę), a tytuł dwoma
   leniwymi zapytaniami: EDITED_BOOK, potem BOOK.

2. `isbnlib.notisbn()` do rozpoznawania ISBN-u. Ta funkcja liczy cyfrę
   kontrolną, więc ISBN z literówką przestawał być rozpoznawany jako ISBN
   i trafiał do gałęzi wyszukiwania po tytule — cicho, bez wyników.
   Rozpoznanie idzie teraz po kształcie ciągu (`bpp.util.isbn`), a suma
   kontrolna jest używana wyłącznie tam, gdzie coś liczy: przy przeliczaniu
   ISBN-10 na ISBN-13.

3. Pole „Wydawnictwo nadrzędne" nie szukało po ISBN w ogóle — ani w module
   redakcyjnym, ani w wyszukiwarce publicznej, ani w `zglos_publikacje`.
   ISBN-y zapisywane są tak, jak wpisał je użytkownik (w bazie referencyjnej
   236 rekordów z myślnikami, 146 bez), więc porównanie normalizuje obie
   strony — wpisaną i bazodanową.

Dodatkowo: PBN nie przelicza ISBN-10 na ISBN-13, więc wysyłamy obie formy,
a etykieta opcji „Pobierz z PBN…" pokazuje to, co wpisał użytkownik, zamiast
formy skanonizowanej.

Zachowanie serwera PBN sprawdzone empirycznie na `/api/v1/search/publications`:
ISBN dopasowywany jest dosłownie, po formie kanonicznej — zapytanie z
myślnikami zwraca zero wyników nawet wtedy, gdy PBN przechowuje ISBN właśnie
z myślnikami. Dlatego kanonizacja przed wysyłką zostaje.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN
…lnych

Wyszukiwarka publiczna porównywała ISBN dosłownie:

    qry |= Q(pk__in=Rekord.objects.filter(isbn__iexact=self.q))

Żadnej normalizacji po którejkolwiek stronie — rekord zapisany jako
`978-83-7430-700-0` nie znajdował się po wpisaniu `9788374307000` ani
odwrotnie.

Wyszukiwarka redakcyjna normalizowała, ale niejednakowo: strona zapytania
(`normalize_isbn`) zdejmowała kropki, myślniki i spacje i nie ruszała
wielkości liter, a strona bazy (`normalized_db_isbn`) zdejmowała wyłącznie
myślnik i sprowadzała do małych liter. Skutki: ISBN zapisany w bazie ze
spacjami nie był znajdowany, a ISBN-10 z cyfrą kontrolną „X" przepadał na
samej różnicy wielkości litery. Żadna z wyszukiwarek nie zaglądała do
`e_isbn` ani nie przeliczała ISBN-10 na ISBN-13.

Obie używają teraz wspólnych `warunek_po_isbn` / `adnotacje_isbn` z
`bpp.util.isbn` — normalizacja identyczna po obu stronach porównania,
`isbn` razem z `e_isbn`, plus odpowiednik w drugiej długości.

Zbiór wyników jest świadomie NADZBIOREM dotychczasowego: warunek ISBN-owy
nie jest bramkowany na `wyglada_jak_isbn` (dopasowanie jest równościowe,
więc zwykły tytuł i tak niczego nie trafi), a odziedziczony limit
`len(ni) < 20` zniknął — w wersji publicznej takiego limitu nie było, więc
jego wprowadzenie mogłoby coś zgubić.

`normalized_db_isbn` zostało usunięte razem z eksportem z `import_common.core`
— po tej zmianie nie miało już użytkowników, a zostawienie go groziło tym, że
ktoś sięgnie po wersję z rozjazdem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN
@mpasternak mpasternak changed the title fix(autocomplete): wyszukiwanie wydawnictwa nadrzędnego po ISBN fix: wyszukiwanie po ISBN — wydawnictwo nadrzędne i wyszukiwarki globalne Sep 6, 2026
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