fix(bibtex): klucz doktoratu i habilitacji znów zawiera nazwisko autora#676
fix(bibtex): klucz doktoratu i habilitacji znów zawiera nazwisko autora#676mpasternak wants to merge 2 commits into
Conversation
Praca_Doktorska.autorzy_dla_opisu() zwraca FakeSet — listę udającą queryset, bo doktorat ma dokładnie jednego autora w polu `autor`, a nie relację M2M. FakeSet nie miał metody first(), więc generate_bibtex_key leciało na AttributeError. Wyjątek jest tam połykany (zaloguj_polkniety_wyjatek), więc eksport nie padał — klucz po prostu gubił nazwisko i zostawało samo `<rok>_id<pk>`, a do Rollbara szedł item (#447, 6 wystąpień). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Self-review słusznie wytknął, że FakeSet.first() naprawia JEDEN z czterech kształtów zwracanych przez autorzy_dla_opisu(). bpp.models.util zwraca też: queryset, gołą listę z Prefetch(to_attr=...) oraz [] dla obiektu bez pk. Żaden z listowych nie ma first(), więc dokładnie ten sam AttributeError czekał obok — i jest osiągalny: prefetch_dane_strony_rekordu podstawia listę, a nowy test to potwierdza (padał na 2019_id... zamiast Nowak_2019_id...). generate_bibtex_key bierze teraz pierwszy element przez ten sam idiom, co bpp.models.util: first() gdy jest, inaczej next(iter(...), None). FakeSet.first() zostaje — jest potrzebny — a exists() dostaje komentarz wyjaśniający, że twarde False NIE jest sprzecznością: exists() jest osiągalne tylko po exclude(), które w FakeSet ignoruje warunki, więc False znaczy "brak autorów z odpiętą dyscypliną", nie "brak autorów". Zgodnie z uwagą review NIE dodaję do_rollbar=False w tym except — po tej poprawce nadal jest osiągalny (nazwisko None, błędy bazy), a item #447 był jedynym sygnałem, że coś jest nie tak. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Poprawki po self-reviewReview trafnie zauważył, że pierwszy commit naprawiał objaw, nie przyczynę. Przyczyna:
Review oceniał ścieżkę listową jako „dziś nieosiągalną, bo dwa widoki się nie Czyli dodanie samego
40 passed w Do sprawdzenia po deployuReview słusznie zwraca uwagę, że skoro istniały dwie ścieżki, część z 6 wystąpień Odnotowane, bez zmianDrugi test (habilitacja) faktycznie przechodzi tą samą ścieżką co doktorat — |
Problem
Praca_Doktorska.autorzy_dla_opisu()zwracaFakeSet— listę udającąqueryset, bo doktorat ma dokładnie jednego autora w polu
autor, a nie relacjęwiele-do-wielu.
FakeSetimplementujeall(),select_related(),exclude(),odpiete_dyscypliny(),exists()— ale niefirst().bpp/export/bibtex.py:93woła właśniefirst():→
AttributeError: 'FakeSet' object has no attribute 'first'(Rollbar #447,
6 wystąpień).
Wyjątek jest tam połykany przez
zaloguj_polkniety_wyjatek, więc eksport niepadał — klucz cichcem gubił nazwisko i zostawało samo
<rok>_id<pk>.Rozwiązanie
FakeSet.first()zwracające pierwszy element alboNone.Testy
Nowy
src/bpp/tests/test_export/test_bibtex_klucz_doktoratu.py— TDD, obatesty najpierw padały (
'2020_id…' != 'Kowalski_2020_id…').src/bpp/tests/test_export/— 39 passedUwaga na przyszłość (NIE ruszam w tym PR)
FakeSet.exists()zwraca twardeFalse, mimo że lista ma jeden element.To wygląda na celowe (jakiś kod pewnie sprawdza
exists(), żeby nie renderowaćlisty autorów dla doktoratu), ale jest mylące. Zmiana wymagałaby przejrzenia
wszystkich wywołań
autorzy_set.exists()— osobny temat.🤖 Generated with Claude Code
https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH