fix(pbn-import): dopasowanie autorów po nazwisku + odporne przypisywanie dyscyplin#348
Merged
mpasternak merged 14 commits intoJun 12, 2026
Conversation
…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>
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.
Podsumowanie
Trzy powiązane wady integracji oświadczeń PBN (
integruj_oswiadczenia_z_instytucji_pojedyncza_praca), ujawnione w sesji importu #11:Autor_Dyscyplina(dyscyplina + subdyscyplina) są zajęte, a PBN przynosi trzecią — zamiastraise Exception(które wywalało całą sesję importu) leci raportdiscipline_conflict_no_room(ostry warning) i import jedzie dalej.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_fixz opisowym komunikatem; nigdy nie dopisujemy autora do publikacji.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-safeget_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-*.mdKluczowy fakt korektności
Wydawnictwo_*_Autor.save()wołaclean()/_waliduj_dyscypline(authors.py:99-103). Dlatego gałąź konfliktu celowo NIE ustawiarec.dyscyplina_naukowana dyscyplinę, której autor nie ma — inaczej finalnysave()podniósłbyValidationError(czyli z powrotem crash).Plan testów
przypisz_dyscypline_pbn: 7 testów (4 wyniki enuma + reguła procentów 100 / 50:50 / nietykanie ręcznych danych /procent=None→50:50).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.py→ 15 passed.Odroczony follow-up (poza zakresem)
Pre-istniejący swap
rec.autor = autw tier-4 znormalizowanym (author_replaced,statements.py:~166) ma ten sam utajony crash na walidującymsave()i brak wpisu w mapie odznak admina — do osobnego potraktowania spójnie z decyzją „brak podmiany autora".🤖 Generated with Claude Code