Skip to content

fix(pbn-import): dopasowanie autorów po nazwisku + odporne przypisywanie dyscyplin#348

Merged
mpasternak merged 14 commits into
feature/multi-hosted-configfrom
feature/pbn-dyscypliny-autoprzypisanie
Jun 12, 2026
Merged

fix(pbn-import): dopasowanie autorów po nazwisku + odporne przypisywanie dyscyplin#348
mpasternak merged 14 commits into
feature/multi-hosted-configfrom
feature/pbn-dyscypliny-autoprzypisanie

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Podsumowanie

Trzy powiązane wady integracji oświadczeń PBN (integruj_oswiadczenia_z_instytucji_pojedyncza_praca), ujawnione w sesji importu #11:

  1. Koniec twardego crasha na konflikcie dyscyplin. Gdy oba sloty Autor_Dyscyplina (dyscyplina + subdyscyplina) są zajęte, a PBN przynosi trzecią — zamiast raise Exception (które wywalało całą sesję importu) leci raport discipline_conflict_no_room (ostry warning) i import jedzie dalej.
  2. Dopasowanie autora po imieniu/nazwisku. Usunięto przedwczesny raport author_not_found (odpalał się przed ratunkiem). Współautor o tym samym imieniu/nazwisku (inne ID) → author_matched_by_name (informacyjny), dyscyplina przypisana bez podmiany autora pracy. Autor spoza listy współautorów → author_needs_manual_fix z opisowym komunikatem; nigdy nie dopisujemy autora do publikacji.
  3. Auto-przypisanie dyscypliny z PBN. Brak przypisań → utworzenie Autor_Dyscyplina (100%); wolny slot → dopisanie subdyscypliny (rebalans 50/50 tylko gdy brak danych użytkownika). Każda auto-akcja zostawia ślad w logu/uwagach.

Nowy, testowalny helper przypisz_dyscypline_pbn (slot-aware, race-safe get_or_create, nigdy nie podnosi wyjątku) enkapsuluje logikę slotów; duża funkcja tylko mapuje wynik na log + inconsistency_callback.

Nowe typy niespójności zarejestrowane end-to-end u konsumenta (ImportInconsistency.INCONSISTENCY_TYPE_CHOICES + odznaki admina, discipline_conflict_no_room → warning, migracja 0012) — żeby dashboard pokazywał etykiety PL, właściwy kolor i filtrował po nowych typach.

Spec + plan: docs/superpowers/{specs,plans}/2026-06-0*-pbn-import-dyscypliny-*.md

Kluczowy fakt korektności

Wydawnictwo_*_Autor.save() woła clean()/_waliduj_dyscypline (authors.py:99-103). Dlatego gałąź konfliktu celowo NIE ustawia rec.dyscyplina_naukowa na dyscyplinę, której autor nie ma — inaczej finalny save() podniósłby ValidationError (czyli z powrotem crash).

Plan testów

  • Unit przypisz_dyscypline_pbn: 7 testów (4 wyniki enuma + reguła procentów 100 / 50:50 / nietykanie ręcznych danych / procent=None→50:50).
  • Integracyjne: konflikt nie wywala importu; PBN zgłasza subdyscyplinę autora → rec=sub bez konfliktu; dopasowanie po nazwisku zamiast author_not_found (+ lock-in braku swapu); autor spoza pracy → manual_fix (autor niedopisany); auto-przypisanie 100% bez crasha na walidującym save().
  • uv run pytest src/pbn_integrator/tests/test_dyscypliny.py src/pbn_integrator/tests/test_statements.py15 passed.
  • ruff check + format czyste (migracje celowo poza zasięgiem ruff).

Odroczony follow-up (poza zakresem)

Pre-istniejący swap rec.autor = aut w tier-4 znormalizowanym (author_replaced, statements.py:~166) ma ten sam utajony crash na walidującym save() i brak wpisu w mapie odznak admina — do osobnego potraktowania spójnie z decyzją „brak podmiany autora".

🤖 Generated with Claude Code

mpasternak and others added 14 commits June 7, 2026 21:47
…porne przypisywanie dyscyplin

Projekt rozwiązania trzech wad integracji oświadczeń PBN:
- twardy crash sesji importu na konflikcie dyscyplin → raportowana niespójność,
- przedwczesny raport author_not_found → auto-dopasowanie współautora o tym
  samym imieniu/nazwisku (inne ID) + raport informacyjny,
- auto-zakładanie Autor_Dyscyplina z PBN z procentami (100 / 50:50) i śladem
  w logu/uwagach.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- F1: gałąź konfliktu vs bezwarunkowy rec.save() (statements.py:299) — nie
  zostawiać rec.dyscyplina ustawionej na D, by zapis nie utrwalił niespójnej
  pary (autor, dyscyplina) (save() nie woła clean()).
- F2: cykl typów raportów — author_not_found (126) usunięty, author_auto_fixed
  (236) → author_matched_by_name, no_override_without_disciplines/manual_fix
  zostają.
- F3: update_or_create osłonięty savepointem (transaction.atomic).
- F4: konsolidacja powtórzonych elem.get_bpp_discipline().

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…dyscypliny

4 taski TDD: helper przypisz_dyscypline_pbn (Task 1), wpięcie + koniec crasha
(Task 2), raporty dopasowania autora (Task 3), weryfikacja + pre-commit (Task 4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rocenty

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…update_fields, typy

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…st raise

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ub, brak konfliktu

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…thor_not_found

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…dmiany autora

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… + auto-assign test

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(no-swap, Task5, follow-up)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…a (spójnie)

Usuwa rec.autor=aut + mid-flow rec.save() (walidujący => ten sam utajony crash)
oraz raport author_replaced; author_matched_by_name leci wspólnie dla tier 2/3/4.
Dodaje odznakę admina dla historycznych author_replaced.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak mpasternak merged commit 8aaf5d4 into feature/multi-hosted-config Jun 12, 2026
3 checks passed
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