feat(importer): ranked autor candidates z preselekcją najlepszego#240
Open
mpasternak wants to merge 6 commits into
Open
feat(importer): ranked autor candidates z preselekcją najlepszego#240mpasternak wants to merge 6 commits into
mpasternak wants to merge 6 commits into
Conversation
Wizard importera publikacji (CrossRef) ma case zglaszany przez usera: w bazie istnieje 2 autorow o tym samym nazwisku (Lech-Marańda Ewa / Lech-Maranda Ewa), CrossRef daje "Eva Lech-Maranda". Stary kod zwracal None (ambiguity) → user wpadal na unmatched, mial probowac manualnie. Nowy framework discovery (znajdz_kandydatow_autora) zwraca POSORTOWANA liste kandydatow: - 1.00 — exact iexact pelne imiona + nazwisko - 0.95 — exact iexact pierwsze imie + nazwisko - 0.85 — PL↔EN (warianty v↔w + klastry imion + Unaccent nazwiska) Brak strategii "tylko nazwisko" — musi sie zgadzac przynajmniej imie w jakiejs formie, zeby nie zwracac 100 Kowalskich. Sortowanie DESC po (pewnosc, ORCID, tytul, liczba publikacji, pk). Komparator.porownaj_author zwraca WynikPorownania z .sugerowany + .kandydaci. _auto_match_authors zapisuje liste do nowej tabeli M2M ImportedAuthor_Candidate z metadanymi (pewnosc, powod, publikacji). UI wizardu: rozwijana lista alternatyw z badge'ami przy "Autor w BPP" gdy >1 kandydatów. Klikniecie alternatywy POSTuje author-match z innym pk → row sie odswieza. matchuj_autora przepisany jako thin wrapper z disambiguatorami (jednostka / tytul_str jako tie-breakery, NIE hard filtry) i fallbackami do historycznej jednostki / ORCID-tytulu. BC zachowane dla wszystkich istniejacych call-sites (PBN, polon, dyscypliny, crossref). Liczenie publikacji per kandydat: 3 zagregowane queries zamiast 30 per-instance count() (skalowanie z liczba kandydatow * 3 tabele). Testy: 614 passed (15 nowych dla znajdz_kandydatow_autora + 4 dla _auto_match_authors + 2 BC regresje znalezione przez self-review). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…umny
Trzy zmiany UX zglaszane przez usera po pierwszej iteracji:
1. Modal "Edycja autora" mial wymuszone height:70vh — przy malej
zawartosci (3 pola formularza) byl wieksy niz potrzeba. Zmiana
na height:auto + max-height:90vh + top:5vh (Foundation Reveal
ma domyslnie bottom:0 ktore tez trzeba zresetowac do auto).
2. Klik w caly wiersz wczesniej tez otwieral modal. Konfliktowal z
innymi klikalnymi elementami w wierszu — dropdown kandydatow,
formy hx-post do przepiecia autora, przycisk ORCID. Wylaczono
row-handler, modal otwiera tylko ".btn-edit-author".
3. Kolumny "Autor w BPP" + "Jednostka" zlaczone w jedna ("Autor /
jednostka"). Po kliku na kandydata w dropdownie zmiana jednostki
jest natychmiast widoczna w tej samej komorce. Format kazdego
kandydata w dropdownie: "Autor · jednostka" zamiast samego autora
— od razu widac "skad on jest", co pomaga przy disambiguacji
homonimow z roznych wydzialow.
Prefetch select_related rozszerzony o autor__aktualna_jednostka
zeby nie zrobic N+1 przy renderowaniu kandydatow.
Playwright test zaktualizowany — klika ".btn-edit-author" zamiast
calego wiersza.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…dydatow Tekst byl ledwo czytelny — Foundation <small> daje 80% rozmiaru bazowego font-size, plus w komorce tabeli juz mamy default size mniejszy niz body. Wynik: trudne do przeczytania. Zachowane <small> z poprzednich iteracji UI (kolumna ORCID, kolumna dyscyplina) — to nie jest zmiana mojego feature, zostawiam jak bylo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tora
Faza A (quick wins, bez przebudowy):
- Tabela skondensowana z 8 do 6 kolumn: ORCID dostawcy pod nazwiskiem
w "Autor (dane dostawcy)", "Źródło dyscypliny" wciągnięte do komorki
dyscypliny jako "źródło: ...". "Autor w BPP / jednostka" dostaje
width:40% — najszersza, bo niesie najwiecej informacji.
- Link "↗" do /admin/bpp/autor/<id>/change/ obok wybranego autora
ORAZ obok kazdego kandydata w dropdownie — user moze zweryfikowac
ID, jednostke, historie publikacji.
- Affordance dla "kliknij kandydata, aby zmienic wybor":
- chevron "›" przed nazwiskiem kandydata
- label "Kliknij innego kandydata, aby zmienic wybor" nad lista
- hover background-color zmienia sie na #f0f0f0
- wybrany kandydat ma stale tlo #e8f4ff (badge "wybrany")
- Wiersz tabeli zachowuje jasnoszare tlo (#fafafa) gdy <details>
kandydatow jest rozwiniety — handler 'toggle' togluje klase
.row-details-open.
- Select2 w modalu: dropdownParent: $('body') zamiast $modal
(modal ma overflow:auto ktore wycinalo dropdown).
Faza B (in-place edycja autor/jednostka/dyscyplina):
- Nowy URL author-edit-form (GET): renderuje wiersz w trybie edit
z 3 select2 inline + Save/Cancel.
- Nowy URL author-row (GET): renderuje normalny wiersz — uzywany
jako cancel z trybu edit.
- Klik na maly button "olowek" w komorce "Autor w BPP / jednostka"
→ hx-get edit-form → swap calego wiersza z edit-template.
- Submit (Save ✓) → POST author-match (juz istnieje) → swap z
normalnym wierszem przez ten sam mechanizm.
- Cancel (✗) → GET author-row → swap z normalnym wierszem (bez zmian).
- htmx:afterSwap event reinicjuje select2 w nowym wierszu
(autocomplete dla autor/jednostka, statyczne dyscypliny dla autora
+ roku publikacji).
- Modal "Edytuj (modal)" zostaje jako fallback dla edge case "wymus
autora calkowicie spoza kandydatow" — przeszedl rename z "Edytuj".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…a + linki User feedback: poprzednia iteracja UI (skondensowane kolumny + inline edit przez pencil + dropdown kandydatow w wierszu) byla GORSZA niz wczesniej. Cofamy to wszystko i przenosimy wybor autora do modala. Tabela (revert do 8 kolumn): - # | Autor (dane dostawcy) | ORCID | Dopasowanie | Autor w BPP | Jednostka | Dyscyplina | Zrodlo dyscypliny | Akcje - Inline pencil button usuniety — modal jest jedyna sciezka edycji. - W kolumnie "Dopasowanie" pod statusem pojawia sie badge "X kandydatow" gdy znajdz_kandydatow_autora znalazl wielu — link wzrokowy ze user powinien otworzyc modal. - Dropdown kandydatow w wierszu USUNIETY (partial author_candidates). Modal (rozbudowany): - Nowy partial modal_candidates.html — lista klikalnych kandydatow z badge'ami (pewnosc, powod strategii, liczba publikacji, ORCID, PBN). Wybrany podswietlony (modal-candidate-selected). - Sekcja kandydatow ladowana AJAX-em przy otwarciu modala (AuthorCandidatesModalView GET zwraca HTML partial). - Pod selectem autora linki do: - admin BPP (/admin/bpp/autor/<pk>/change/) - publiczny widok BPP (/bpp/autor/<slug>/ — pokazuje prace autora) - ORCID (https://orcid.org/<orcid>) — jesli ma - PBN (https://pbn.nauka.gov.pl/core/#/person/view/<pbn_uid_id>) — jesli ma pbn_uid_id - AuthorInfoView (GET) zwraca JSON {pk, slug, display, orcid, pbn_uid_id} — JS odpala go po zmianie autora w select2 i aktualizuje linki dynamicznie. - Klik na kandydata: przepisuje select2 autora + jednostki, odswieza linki + dyscypliny, podswietla wybrany. Usuniete (po revertcie): - URL/View AuthorEditFormView, AuthorRowView - Template author_row_edit.html - Template author_candidates.html (dropdown w wierszu) - Inline edit CSS/JS (grid select2 + Save/Cancel + reinit po swap) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ORCID w tabeli
User feedback po pierwszej iteracji:
1. Caly wiersz tabeli znow klikalny -> otwiera modal. Wzorzec
wraca, ale teraz btn-edit-author w wierszu zachowuje stopPropagation
(zeby nie open dwa razy gdyby user kliknal precyzyjnie w przycisk).
2. Wciecia + bold w modalu. Lista kandydatow ma padding-left:1rem,
sekcja linkow autora rowniez. Pola formularza (label > "Autor w BPP",
"Jednostka", "Dyscyplina") maja font-weight:bold + padding-left:1rem.
3. User-friendly etykiety:
- "admin BPP" -> "otworz w module redagowania"
- "strona w BPP (prace)" -> "otworz strone autora"
- "PBN" -> "strona w PBN"
- "ORCID" -> "strona ORCID"
- "iexact" / "iexact_pierwsze_imie" / "polish_english" -> dokladne /
pierwsze imie / wariant PL/EN (przez powod_display property na
modelu ImportedAuthor_Candidate)
- "0.85" / "1.00" -> "85%" / "100%" (przez pewnosc_procent property)
4. Pod nazwiskiem matched_autor w kolumnie "Autor w BPP" pokazujemy
ORCID jesli autor go ma. Plus badge "X kandydatow" przenosi sie z
kolumny "Dopasowanie" tutaj — kolumna "Dopasowanie" zostaje czysta
(tylko status), zeby DataTables filter mogl agregowac po
unikalnych wartosciach (4 zamiast 4 * liczba kandydatow).
5. Auto-okreslanie dyscypliny w modalu: gdy dla wybranego autora +
roku publikacji autocomplete zwraca DOKLADNIE jedna dyscypline a
user nie ma jeszcze nic wybranego, JS auto-selectuje ja. Backend
mial juz ten mechanizm (ostatnia_dyscyplina w AuthorMatchView).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
znajdz_kandydatow_autora) zwracający posortowaną listę kandydatów z metadanymi (pewność, powód, liczba publikacji) zamiast pojedynczegoAutor | NoneLech-Marańda EwavsLech-Maranda Ewadla wsadu CrossRef-owegoEva Lech-Maranda) z preselekcją najlepszego (więcej publikacji, ORCID, tytuł)matchuj_autoraprzepisany jako thin wrapper nad nowym API — disambiguatory (jednostka, tytuł) działają jak tie-breakery, nie jak hard filtry — pełne BC dla wszystkich istniejących callerów (PBN, polon, dyscypliny, crossref)Architektura
Brak strategii "tylko nazwisko" — musi się zgadzać przynajmniej imię w jakiejś formie, żeby nie zwracać listy 100 Kowalskich z różnymi imionami.
Wizard
_auto_match_authors:WYMAGA_INGERENCJIzsugerowanym→ preselectmatched_autor, zapis doImportedAuthor_Candidate(M2M z metadanymi). UI pokazuje<details>z listą alternatyw.Reprodukcja zgłoszenia użytkownika
CrossRef DOI
10.1016/j.cyto.2013.08.002zawiera autora{given: "Eva", family: "Lech-Maranda"}. W bazie są 2 autorów (z diakrytykiem i bez). Wcześniej: statusUNMATCHED. Teraz:AUTO_LOOSEz preselectowanym tym z ORCID/większą liczbą publikacji + dropdown z drugim do ręcznej zmiany.Test plan
znajdz_kandydatow_autora(strategie, ranking, deduplikacja, case Lech-Maranda)_auto_match_authors(zapis kandydatów do M2M, render template'a)import_common,importer_publikacji,crossref_bppmatchuj_autora(PBN, polon, dyscypliny, ewaluacja2021) — pre-existing failure w celery mock test niezwiązanyDecyzje projektowe (potwierdzone przed implementacją)
ImportedAuthor_Candidatezamiast JSONField — wybrana dla explainability w admin🤖 Generated with Claude Code