Skip to content

feat(eksport-autora): limity startów eksportu dla niezalogowanych - #937

Merged
mpasternak merged 2 commits into
devfrom
feat/eksport-autora-limity-anon
Oct 24, 2026
Merged

mpasternak merged 2 commits into
devfrom
feat/eksport-autora-limity-anon

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Zmiany

Eksport publikacji autora (BibTeX/RIS, zadanie Celery) zlecany przez niezalogowanych użytkowników dostaje dwa limity:

  1. Limit startów na IP — domyślnie 10 nowych zadań na godzinę z jednego IP (DJANGO_BPP_EKSPORT_AUTORA_LIMIT_ANON_IP_NA_GODZINE, 0 = wyłączony). IP ustalane przez django_bpp.client_ip.get_client_ip; licznik atomowy w cache (cache.add + cache.incr, wzór z zglos_publikacje/limity.py). Po przekroczeniu: komunikat na stronie eksportu, HTTP 429, nic nie jest kolejkowane.
  2. Limit anonimowych zadań w kolejce — domyślnie najwyżej 20 zadań anonimowych w stanie pending/running (DJANGO_BPP_EKSPORT_AUTORA_LIMIT_ANON_W_KOLEJCE, 0 = wyłączony). Zadania starsze niż 1 h nie są liczone (zawieszone np. po restarcie workera nie blokują anonimów na stałe). Sprawdzenie i create idą w jednej transakcji pod pg_advisory_xact_lock, więc równoległe starty nie przekroczą limitu. Po przekroczeniu: „Za dużo eksportów w toku, spróbuj za kilka minut” (HTTP 503).

Szczegóły:

  • Deduplikacja do istniejącego zadania działa jak dotąd i nie zużywa żadnego z limitów.
  • Limit kolejki sprawdzany jest przed limitem IP — odmowa z powodu pełnej kolejki nie zużywa puli IP.
  • Nowe pole AutorEksportTask.zlecone_anonimowo + migracja 0499_autoreksporttask_zlecone_anonimowo (baseline nie odświeżony — do zrobienia przy scalaniu wg zasad repo).
  • Zalogowani i redakcja: bez zmian.
  • Dokumentacja: docs/administrator/zaawansowane.md (sekcja „Limity eksportu publikacji autora dla niezalogowanych”), newsfragment eksport-autora-limity-anon.feature.rst.

Testy

Nowy plik src/bpp/tests/test_profil/test_eksport_limity_anon.py (LocMem cache, ALTCHA mockowana jak w test_eksport_captcha.py): 11. start z tego samego IP odrzucony, inne IP przechodzi, deduplikacja nie zużywa limitu, 0 wyłącza, zalogowani bez limitu IP; pełna kolejka odrzuca anonima, zalogowany przechodzi, zadania completed/failed i zalogowanych się nie liczą, stare wiszące się nie liczą, deduplikacja przy pełnej kolejce przechodzi, odmowa kolejki nie zużywa limitu IP.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ

mpasternak and others added 2 commits October 24, 2026 22:53
- limit nowych zadań eksportu na IP klienta (domyślnie 10/h,
  DJANGO_BPP_EKSPORT_AUTORA_LIMIT_ANON_IP_NA_GODZINE, 0 = wyłączony),
- globalny limit anonimowych zadań w toku (domyślnie 20,
  DJANGO_BPP_EKSPORT_AUTORA_LIMIT_ANON_W_KOLEJCE, 0 = wyłączony),
  sprawdzany pod pg_advisory_xact_lock razem z utworzeniem zadania,
- nowe pole AutorEksportTask.zlecone_anonimowo (migracja 0499),
- deduplikacja do istniejącego zadania nie zużywa limitów,
- zalogowanych i redakcji zmiana nie dotyczy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ
@mpasternak
mpasternak force-pushed the feat/eksport-autora-limity-anon branch from b0c09c2 to d4274aa Compare October 24, 2026 20:53
@mpasternak
mpasternak merged commit df20757 into dev Oct 24, 2026
24 checks passed
@mpasternak
mpasternak deleted the feat/eksport-autora-limity-anon branch October 24, 2026 20:59
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