Skip to content

feat(profil-autora): Faza 1 — konfigurowalne sekcje podstrony autora + pola profilu#385

Open
mpasternak wants to merge 6 commits into
devfrom
feature/profil-autora
Open

feat(profil-autora): Faza 1 — konfigurowalne sekcje podstrony autora + pola profilu#385
mpasternak wants to merge 6 commits into
devfrom
feature/profil-autora

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Cel

Faza 1 funkcji „edytowalny profil autora + przebudowa podstrony autora”.
Pełna specyfikacja (z sesji brainstormingu) w repo:
docs/superpowers/specs/2026-06-18-profil-autora-i-podstrona-design.md.

Podstrona autora (/autor/<pk|slug>/) przestaje być „metadane + jeden
formularz wyszukiwania”, a staje się zestawem konfigurowalnych sekcji
(kolejność / widoczność / limit) renderowanych nad stałym nagłówkiem
tożsamości. Dane sekcji pochodzą z cache Rekord/Autorzy/AuthorConnection.

Co wchodzi w tej Fazie 1

Model

  • Autor: zdjecie (ImageField), biogram + biogram_format (md/html),
    uklad_profilu (JSONField), cached_property biogram_html.
  • Nowy WybranaPublikacjaAutora (GenericFK do polimorficznej publikacji).
  • Migracja 0444.

Logika (czysta, TDD)

  • bpp.util.biogram.renderuj_biogram: Markdown/HTML → bezpieczny HTML przez
    nowy safe_biogram_html (bogatszy zestaw tagów niż wąski globalny
    safe_html; usuwa treść script/style; linki rel="nofollow noopener").
  • bpp.util.obrazy.przetworz_zdjecie_autora: EXIF → center-crop → WebP 400×400.
  • bpp.profil_autora: rejestr 15 typów sekcji + walidacja i rozwiązywanie
    układu (wymuszona wyszukiwarka, forward-compat dla nowych sekcji).
  • bpp.profil_autora_dane: buildery danych każdej sekcji + auto-ukrywanie
    pustych.

Render

  • AutorView: render sekcji wg uklad_profilu (lub domyślnego, wariant
    „biogram-najpierw”; domyślnie ON także wykres publikacji w latach i
    współautorzy) + linki do raportu autora (bieżący rok / ostatnie 4 lata /
    szczegółowy formularz) pokazywane tylko gdy
    DefinicjaRaportu(slug="raport-autorow").widoczny_dla(request).
  • browse/autor.html przebudowany: stały nagłówek (z awatarem) + pętla sekcji;
    formularz wyszukiwania wydzielony do autor_sekcje/wyszukiwarka.html;
    partiale wszystkich sekcji; sekcja „kod do osadzenia” bez zmian.
  • Sekcja współautorów: lista z AuthorConnection + CTA do istniejącego
    wizualnego browsera sieci 2D/3D (bez nowej wizualizacji).
  • SCSS sekcji w _autor-bem.scss.

Admin

  • Fieldset „Profil na podstronie autora” (zdjęcie / biogram / format / układ),
    przetwarzanie i walidacja zdjęcia (≤5 MB → WebP) w AutorForm.clean_zdjecie,
    inline wybranych publikacji.

Testy

39 nowych testów w src/bpp/tests/test_profil/ (TDD: czyste jednostki —
biogram, zdjęcie, układ; modele; integracja widoku — render biogramu/
wyszukiwarki, ukrywanie sekcji, linki raportu public/inactive). Cała suita
test_profil + istniejące test_autor_autorzy zielone (43) na świeżym
kontenerze — bez regresji. manage.py check czysty, pre-commit (ruff/djLint/
TruffleHog) czysty.

⚠️ Do zrobienia przy scalaniu

make baseline-update (migracja 0444 zmienia schemat) — commit
baseline-sql/baseline.sql + baseline.meta.json. Świadomie nie robione w
branchu, żeby nie produkować konfliktów na wielkim pliku.

Świadomie poza zakresem (Faza 2, osobny PR)

Self-service edytor w „Mój profil” (drag-drop kolejności, przełączniki,
limity, upload zdjęcia z podglądem, live-preview biogramu, picker wyróżnionych
prac), eksport zbiorczy BibTeX/RIS. W Fazie 1 sekcja „eksport” oraz wypełnianie
zdjęcia/biogramu/układu działają przez Django admin.

🤖 Generated with Claude Code

mpasternak and others added 6 commits June 18, 2026 21:40
… autora

Projekt z sesji brainstormingu: konfigurowalne sekcje podstrony autora
(kolejnosc/widocznosc/limit), nowe pola Autor (zdjecie WebP 400x400,
biogram + biogram_format md/html), model WybranaPublikacjaAutora, rejestr
sekcji w kodzie + uklad_profilu JSON, render z auto-ukrywaniem pustych,
linki do raportu wg widoczny_dla, wspolautorzy z AuthorConnection + CTA do
browsera 2D/3D. Dostawa fazowa: Faza 1 (model+render+admin), Faza 2
(self-service edytor + RIS).

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

Czyste jednostki (TDD, 27 testów):
- bpp.util.biogram.renderuj_biogram: Markdown/HTML → bezpieczny HTML przez nowy
  safe_biogram_html (bogatszy zestaw tagów blokowych niż wąski globalny
  safe_html; usuwa treść script/style; linki dostają rel=nofollow noopener).
- bpp.util.obrazy.przetworz_zdjecie_autora: EXIF→crop kwadrat→WebP 400x400.
- bpp.profil_autora: katalog typów sekcji + walidacja i rozwiązywanie układu
  (kolejność/widoczność/limit, wymuszona wyszukiwarka, forward-compat).

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

Autor: zdjecie (ImageField), biogram + biogram_format (md/html),
uklad_profilu (JSONField) oraz cached_property biogram_html.
Nowy model WybranaPublikacjaAutora (GenericFK do polimorficznej publikacji).
Migracja 0444. Baseline odświeżyć przy scalaniu (make baseline-update).

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

- profil_autora_dane: buildery danych każdej sekcji (listy prac, statystyki,
  wykres lat, dyscypliny, źródła, współautorzy z AuthorConnection) + auto-
  ukrywanie pustych sekcji.
- AutorView: render sekcji wg uklad_profilu (lub domyślnego) + linki do
  raportu autora (bieżący rok / 4 lata / formularz) gated DefinicjaRaportu
  .widoczny_dla.
- browse/autor.html: stały nagłówek (z awatarem) + pętla sekcji; formularz
  wyszukiwania wydzielony do sekcji autor_sekcje/wyszukiwarka.html; partiale
  wszystkich sekcji; embed-kod bez zmian.
- AutorAdmin: fieldset profilu (zdjęcie/biogram/format/układ), przetwarzanie
  zdjęcia w AutorForm.clean_zdjecie (≤5MB → WebP 400x400), inline wybranych
  publikacji.
- SCSS: style sekcji (awatar, listy, tabele statystyk, wykres słupkowy,
  współautorzy, linki raportu).

Testy: 4 integracyjne (render biogramu/wyszukiwarki, ukrywanie sekcji,
linki raportu public/inactive). Cała suita test_profil + istniejące
test_autor_autorzy zielone (43) na świeżym kontenerze — bez regresji.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Django-generated migracja miała linie >88 znaków; CI "Lint changed files"
uruchamia ruff-format na zmienionym zakresie z --exit-non-zero-on-fix.
To nowy plik migracji (nie istniejący), więc formatowanie jest dozwolone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Import bpp.util.biogram należy do grupy first-party (po bpp.util), nie do
grupy third-party po tinymce. Poprawka nie trafiła do poprzedniego commita.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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