diff --git a/.github/workflows/dependency-audit.yml b/.github/workflows/dependency-audit.yml index d8e824a36..07324d919 100644 --- a/.github/workflows/dependency-audit.yml +++ b/.github/workflows/dependency-audit.yml @@ -6,17 +6,24 @@ # - pull_request: PR-y dotykajace zaleznosci nie merguja sie z aktywnym CVE # - weekly cron: nowo-disclosed CVE wykryte tez na "spokojnym" lockfile # -# Tool: uv-secure (natively reads uv.lock z hashami SHA-256, lepszy -# match dla naszego setupu niz pip-audit ktory potrzebuje requirements.txt). +# Tool: pip-audit (PyPA-official, autorzy pip-a). Wczesniej uzywalismy +# uv-secure ale projekt zostal zarchiwizowany 18 kwietnia 2026 (read-only +# repo, ostatnie release v0.17.2). Stale CVE database = false sense of +# security. pip-audit jest aktywnie maintained przez PyPA i czyta z tego +# samego PyPI Advisory DB co uv-secure. +# +# uv.lock -> requirements.txt przez `uv export --no-dev` (jak w multi-scanner). # # Polityka: -# - HIGH/CRITICAL z dostepnym fix-em: failure (musi byc PR podbijajacy dep) -# - LOW/MEDIUM: warning w job summary, nie blokuje -# - --ignore-unfixed: nie blokujemy na CVE bez fix-a (nie da sie nic zrobic) +# - Vulnerability z fix-em dostepnym (fix_versions non-empty): failure. +# pip-audit nie ma natywnego severity filter, ale fix-availability juz +# jest dobrym proxy: jezeli upstream wypuscil fix, znaczy ze warto bumpnac. +# - Vuln bez fixa: warning w job summary, nie blokuje (nic nie da sie zrobic). +# - Whitelist znanych non-impact CVE przez --ignore-vuln (patrz job ponizej). # # Defense-in-depth: drugi job (multi-scanner) odpala OSV-Scanner, Grype # i Trivy na SBOM-ie wygenerowanym z uv.lock. Wszystkie report-only - -# uv-secure pozostaje jedynym gate-em release-u. +# pip-audit pozostaje jedynym gate-em release-u. name: Dependency vulnerability scan @@ -41,8 +48,8 @@ permissions: contents: read jobs: - uv-secure: - name: uv-secure scan + pip-audit: + name: pip-audit scan runs-on: ubuntu-latest steps: - name: Checkout @@ -53,28 +60,57 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 - - name: Run uv-secure (HIGH+CRITICAL gate) + - name: Export uv.lock -> requirements.txt (prod-only) run: | - uvx --from uv-secure uv-secure \ - --severity high \ - --ignore-unfixed \ - --no-desc \ - uv.lock - - - name: Run uv-secure (full report - non-blocking) + mkdir -p /tmp/audit + uv export --no-dev --format requirements-txt --no-hashes --quiet \ + -o /tmp/audit/requirements.txt + + # Whitelist znanych non-impact CVE. + # --- + # CVE-2026-42304 / GHSA-grgv-6hw6-v9g4 (twisted < 26.4.0rc2): + # DoS w twisted.names.dns.Name.decode przez glebokie DNS compression + # pointer chains. BPP NIE uruchamia DNS-servera Twisted (twisted jest + # transitive zaleznoscia daphne + autobahn dla WebSocket/Channels, + # bez modulu twisted.names). Fix dostepny tylko w 26.4.0rc2 (release + # candidate) - nie wprowadzamy RC do produkcji do czasu stable release. + # Re-evaluate przy bumpie twisted do 26.x stable. + - name: Run pip-audit (gate on fixable) + run: | + uvx --from pip-audit pip-audit \ + --requirement /tmp/audit/requirements.txt \ + --disable-pip \ + --no-deps \ + --format columns \ + --ignore-vuln CVE-2026-42304 + + - name: Run pip-audit (JSON full report - non-blocking) if: always() run: | - # Pelny raport ze wszystkimi findings (LOW/MEDIUM tez) jako - # job summary - nie failuje workflow, ale daje widocznosc. + uvx --from pip-audit pip-audit \ + --requirement /tmp/audit/requirements.txt \ + --disable-pip \ + --no-deps \ + --format json \ + --output /tmp/audit/full.json || true { - echo "## uv-secure full report" + echo "## pip-audit full report" echo "" - echo '```' - uvx --from uv-secure uv-secure \ - --show-severity \ - --no-desc \ - uv.lock || true - echo '```' + count=$(jq '[.dependencies[]?.vulns[]?] | length' \ + /tmp/audit/full.json 2>/dev/null || echo 0) + if [ "$count" -gt 0 ]; then + echo "Znaleziono **$count** vulnerabilities (vs gate-policy)." + echo "" + echo '| Pakiet | Wersja | CVE | Fix versions |' + echo '|---|---|---|---|' + jq -r ' + .dependencies[]? | . as $p | + .vulns[]? | + "| \($p.name) | \($p.version) | \(.id) | \(.fix_versions | join(", ")) |" + ' /tmp/audit/full.json | sort -u + else + echo "Brak findings." + fi } >> "$GITHUB_STEP_SUMMARY" # Defense-in-depth: trzy dodatkowe skanery (OSV/Grype/Trivy) na SBOM diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..dba550628 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,60 @@ +name: Docs + +# Buduje dokumentacje MkDocs Material w trybie --strict jako PR check. +# Workflow nie konsumuje zadnych nieZaufanych inputow (issue/PR titles, +# commit messages), wiec wzorce z https://github.blog/security/... +# nie maja tu zastosowania. + +on: + push: + branches: + - dev + - master + paths: + - docs/** + - mkdocs.yml + - .readthedocs.yaml + - .github/workflows/docs.yml + pull_request: + branches: + - dev + paths: + - docs/** + - mkdocs.yml + - .readthedocs.yaml + - .github/workflows/docs.yml + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build: + name: mkdocs build --strict + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: docs/requirements.txt + + - name: Install MkDocs + plugins + run: pip install -r docs/requirements.txt + + - name: Build docs (strict mode) + run: mkdocs build --strict --verbose + + - name: Upload built site as artifact + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: docs-site + path: site/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 81a07e3d0..075dca39d 100644 --- a/.gitignore +++ b/.gitignore @@ -53,8 +53,8 @@ coverage.xml # Django stuff: *.log -# Sphinx documentation -docs/_build/ +# MkDocs build output +site/ # PyBuilder target/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index faed04697..74b2132d3 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,5 +5,9 @@ build: tools: python: "3.11" -sphinx: - configuration: docs/conf.py +mkdocs: + configuration: mkdocs.yml + +python: + install: + - requirements: docs/requirements.txt diff --git a/HISTORY.md b/HISTORY.md new file mode 100644 index 000000000..31a916c60 --- /dev/null +++ b/HISTORY.md @@ -0,0 +1,3864 @@ +# Historia zmian + + + +## bpp 202605.1372 (2026-05-04) + +### Naprawione + +- Naprawiono healthcheck lekkiego `authserver`-a, który zwracał + `503 Service Unavailable` przez `AttributeError` na nieistniejącym + `settings.CELERY_BROKER_URL`. Sonda Redis jest teraz pomijana, gdy + ustawienia nie konfigurują brokera Celery — `authserver` nie używa + kolejki zadań, więc jego stan zdrowia nie zależy od Redis-a. Sonda + PostgreSQL działa bez zmian. + +## bpp 202605.1371 (2026-05-04) + +### Naprawione + +- Batchowe enqueueowanie do PBN + (`queue_pbn_export_batch`) raportuje teraz nieoczekiwane + błędy do Rollbara i logów zamiast cicho je połykać. + Wcześniej blok `except Exception: pass` w pętli po + rekordach pochłaniał wszystkie wyjątki (DB error, + integrity error, programmer error) — pojedynczy zły + rekord nie zatrzymywał batcha, ale operator nie miał + żadnej widoczności co poszło nie tak. Brakujące rekordy + (`DoesNotExist`) i już-w-kolejce + (`AlreadyEnqueuedError`) nadal są pomijane bez alertu — + to nie są błędy. +- Endpoint `/health/` faktycznie sprawdza teraz dostępność + PostgreSQL (`SELECT 1`) i Redisa (`PING` z 2-sekundowym + timeoutem) i zwraca `503` z listą niedostępnych komponentów + zamiast bezwarunkowego `200 OK`. Docker healthcheck + serwisów `appserver` / `authserver` wykrywa teraz awarię + bazy lub brokera — wcześniej kontener pozostawał oznaczony + jako „healthy” mimo że strona nie była w stanie obsłużyć + żadnego requestu. +- Endpointy `/bpp/api/upload-punktacja-zrodla/`, + `/bpp/api/punktacja-zrodla/`, `/bpp/api/rok-habilitacji/`, + `/bpp/api/ostatnia-jednostka-i-dyscyplina/` oraz + `/bpp/api/pubmed-id/` wymagają teraz zalogowania. + Wcześniej były `csrf_exempt` bez sprawdzania + uwierzytelnienia — w szczególności + `upload-punktacja-zrodla` przyjmował anonimowe POST-y + i tworzył wpisy `Punktacja_Zrodla` w bazie. Adminowy JS + nadal działa bez zmian (sesja zalogowanego użytkownika); + zmiana blokuje wyłącznie wywołania nieautoryzowane. +- Naprawiono auto-uzupełnianie jednostki i dyscypliny przy dodawaniu + autora w publicznym formularzu „Zgłoś publikację”. Skrypt + `autorform_dependant.js` wysyłał POST do + `/bpp/api/ostatnia-jednostka-i-dyscyplina/` bez tokenu CSRF — + publiczne `base.html` (w przeciwieństwie do admin-owego) nie ma + globalnego `$.ajaxSetup` dodającego nagłówek `X-CSRFToken`, + więc żądanie kończyło się odpowiedzią 403 i pola nie były + wypełniane. Skrypt czyta teraz `csrfmiddlewaretoken` z ukrytego + pola formularza i dokleja go do danych żądania. +- Strony przeglądania `/bpp/browse/autorzy/`, + `/bpp/browse/zrodla/` i `/bpp/browse/jednostki/` + generują listę aktywnych literek alfabetu jednym zapytaniem + `SELECT DISTINCT` zamiast 26+ osobnych `EXISTS`-ów + (po jednym na każdą literkę z osobnym matchingiem dla + polskich znaków). Polskie diakrytyki nadal mapują się na + kanoniczne litery (`Ą` → `A`, `Ł` → `L` itd.). +- Task `pbn_downloader_app.tasks.download_institution_publications` + nie wykonuje już redundantnego sprawdzenia stanu + „running” poza transakcją. Atomowy check-and-create + w `create_task_with_lock` nadal zapobiega duplikatom; + usunięcie wcześniejszego, nie-atomowego check-a likwiduje + race-window, w którym dwa workery przechodziły check, oba + otrzymywały `ValueError` w wyścigu o lock i jeden niepotrzebnie + failował zamiast po prostu czekać. +- Taski importu dyscyplin (`stworz_kolumny`, + `przeanalizuj_import_dyscyplin`, + `integruj_import_dyscyplin`) faktycznie ryglują rekord + `Import_Dyscyplin` przez `SELECT ... FOR UPDATE`. + Wcześniej wywołanie `select_for_update().filter(pk=pk)` + zwracało leniwy `QuerySet`, który nigdy nie był ewaluowany — + SQL z klauzulą `FOR UPDATE` nie szedł do bazy, a lock + realnie nie istniał. Przy równoczesnym przetwarzaniu tego + samego importu (np. user kliknie „Przeanalizuj” dwa razy + pod rząd) workery mogły deptać sobie po polach FSM. +- `test_health_check_returns_503_when_db_down` zatruwał blocker + `pytest-django` dla całego workera xdist (`monkeypatch.setattr` na + `ConnectionProxy` wstrzykiwał bound `_blocking_wrapper` do + `connections[default].__dict__`, co nadpisywało class-level patch + i czyniło `django_db_blocker.unblock()` bezskutecznym). Multiseek + testy padały deterministycznie 50 errors w `setup_databases`. + Patch zmieniony na `health._check_db` (symetrycznie do testu + redis-down). Dodatkowo middleware `test_logging_*` w + `test_page_validation.py` zyskały autouse fixture wpinający + `caplog.handler` bezpośrednio do loggera `django.request` — + po zmianie `propagate=False` z commita audytu caplog nie widział + WARNING-ów o zablokowanych żądaniach. + +### Usprawnienie + +- Admin interface dla aplikacji `importer_publikacji`: superuser może + przeglądać historię importu publikacji (model `ImportSession` z + oryginalnym tekstem BibTeX w polu `raw_data`) oraz dopasowanych + autorów (model `ImportedAuthor`). Obie klasy zarejestrowane w + Django adminie jako read-only (bez możliwości ręcznego tworzenia + lub edycji, podgląd tylko). Lista sesji wspiera filtrowanie po statusie, + dostawcy, dacie i autorach; wyszukiwanie po identyfikatorze, tytule, + DOI; szczegóły sesji pokazują sformatowane JSON `raw_data`, + `normalized_data`, `matched_data` oraz tabelę autorów z + linkami do dopasowanych obiektów BPP. + +- Deduplikator autorów: gruntowna przebudowa UI. Tytuł i pozycje + menu uproszczone z "Deduplikator autorów PBN" na "Deduplikator + autorów" (bez znacznika BETA), wpis dodany dodatkowo do podmenu + "Operacje". Tryb skanowania (PBN/ogólny) prezentowany jest jako + kolorowy badge przy "Główny rekord autora", filtr "Pokaż wyniki" + zmieniony z radio-buttonów na poziomy button-group. + + Przyciski na karcie każdego potencjalnego duplikatu pogrupowane + w trzy logiczne sekcje: Podgląd (otwórz wyd. ciągłe/zwarte, + redagowanie, stronę główną, PBN), Decyzja ("Nie jest duplikatem + głównego autora", usuń autora bez publikacji), Scalanie (cztery + warianty scalania). Przyciski "Scal + ustaw dyscyplinę" oraz + "Scal + ustaw subdyscyplinę" są ukryte, gdy główny autor nie ma + żadnej dyscypliny. + + Powody podobieństwa renderowane są jako kolorowe chipy z ikonami + Foundation, z tonami match/info/weak/warn dobranymi do siły + przesłanki. Procent pewności jest sklampowany do zakresu 0–100% + (wcześniej widoczne były wartości typu 140% wynikające z surowego + score). + + Naprawione: oznaczenie autora jako nie-duplikat (przycisk + "Nie jest duplikatem głównego autora") wykonuje się teraz przez + AJAX z fadeOut karty, zamiast przeładowywać widok i przeskakiwać + do kolejnego głównego autora. Naprawiono też "Scal wszystkie", + który dla kandydatów z trybu ogólnego zwracał błąd 400 (JS + wysyłał `main_scientist_id` zamiast `main_autor_id`); brakujące + parametry trafiają teraz dodatkowo do Rollbara. + +- Deduplikator autorów: nowy tryb "ogólny" znajdujący duplikaty wśród + autorów spoza listy pracowników instytucji w PBN. Jeden przycisk + "Skanuj duplikaty" uruchamia obie fazy (PBN + ogólna) sekwencyjnie. + Widok pozwala filtrować wyniki radio-button-em (PBN/Ogólny/Oba), + eksport XLSX zawiera kolumnę "Tryb". Anulowanie fazy ogólnej skutkuje + statusem "Częściowo zakończone" — wyniki PBN pozostają dostępne. + +- Formularz zgłaszania publikacji: pomocniczy tekst pola „Link do publikacji + lub DOI" jest teraz dobierany w zależności od kombinacji rodzaju publikacji + i formy dostępu — m.in. fragment o katalogach BN/NUKAT pojawia się tylko + przy monografii i rozdziale w dostępie ograniczonym, a wzmianka o PBN + znika dla publikacji typu „Inne". Dla rodzaju „Inne" pole nie jest + wymagane (ponieważ tych publikacji nie wysyłamy do PBN); dla dostępu + ograniczonego pozostaje wymagany plik PDF. + +- Logi backendu Django zawierają teraz timestamp w formacie + ISO oraz nazwę loggera, co pozwala korelować zdarzenia + między równoczesnymi workerami w produkcji bez polegania + wyłącznie na timestampach z `systemd` / Celery. Domyślnie + skonfigurowane są też loggery `django.security` + (SuspiciousOperation, DisallowedHost, niewłaściwy CSRF token), + `django.request` (4xx/5xx requestów) i `celery` + (retry, ack, errors). Dotychczasowy logger `pbn_import` + zachowuje swój dawny czysty format (bez timestampu) na + potrzeby UI pełnotekstowego importu. + +- Polecenie `manage.py run_site` strumieniuje teraz logi + runservera, celery i PostgreSQL równocześnie do jednego + terminala z kolorowymi prefiksami (`web`, `celery`, `pg`) + — jak `docker compose up`. Linie z różnych procesów są + serializowane przez wątkowy multiplekser, więc się nie sklejają. + Dodatkowo na lokalnym dev-stacku z `run_site` cookie banner + jest automatycznie ukrywany — endpoint auto-loginu ustawia + cookie `cookielaw_accepted=1` w odpowiedzi z przekierowaniem, + co przy zwyczajowym workflow (uruchom `run_site` → przeglądarka + otwiera autologin → przekierowanie na `/`) eliminuje banner. + +- Task `zaktualizuj_liczbe_cytowan` (pobieranie liczby + cytowań z Web of Science) używa teraz + `celery_singleton.Singleton` z 2-godzinnym lockiem + w Redisie i `time_limit=2h`. Dwa równoczesne uruchomienia + (np. ręczne kliknięcie + zaplanowany cron) nie odpytają już + zewnętrznego API podwójnie, a zawieszony WoS request + nie zablokuje workera w nieskończoność. + +- `manage.py run_site` zapisuje teraz numer portu runservera do + gitignored pliku `.run_site_port` (analogicznie do + `.run_site_token`). Agent kodujący nie musi już parsować bannera + ani logów — składa URL z `cat .run_site_port` + `cat .run_site_token`. Plik jest ulotny: kasowany na exit run_site. + +- `manage.py run_site` zapisuje teraz porty PostgreSQL i Redis-a + (testcontainers) do gitignored plików `.run_site_pg_port` i + `.run_site_redis_port` (analogicznie do `.run_site_port`). Agent + kodujący może podpiąć `psql` / `redis-cli` bez parsowania bannera + — w stdoucie banner zawiera teraz gotowe snippety dla obu narzędzi. + Pliki są ulotne: kasowane na exit run_site. + +### Usunięto + +- Usunięto pozostałości po niezainstalowanej integracji + Sentry: moduł `django_bpp.sentry_support`, jego test, + endpoint `/sentry_test/` oraz sekcja `SENTRYSDK_*` + w `.env.example`. Projekt używa Rollbara — żadne + ustawienie Sentry nie było aktywne, a artefakty wprowadzały + w błąd. Endpointy `/test_403/`, `/test_500/` + i `/test_exception/` (do podglądu stron błędów i + weryfikacji integracji Rollbara) pozostają. + + Z `package.json` usunięto pakiet `font-awesome 4.1.0` + (nie był importowany przez bundle ani template'y; biblioteka + po EOL z dostępnymi CVE). Aktywnie używany `jqueryui 1.11.1` + zostaje — wymiana wymaga osobnej, większej zmiany. + + Z `bpp/tasks.py` usunięto martwą funkcję `my_limit()` + i moduł-globalny słownik `task_limits` — funkcja nie była + nigdzie wywoływana, a per-procesowy słownik nie miał szans + działać poprawnie z wieloma workerami. + +## bpp 202605.1370 (2026-05-02) + +### Naprawione + +- Importer publikacji wywalał się z `TypeError: '>' not supported between instances of 'NoneType' and 'int'` przy próbie utworzenia rekordu, gdy + dane źródłowe (np. BibTeX) nie zawierały roku publikacji. Po stronie + `ISlot` dodano obsługę `rok=None` (zwracane jest `CannotAdapt`, + sloty nie są liczone), a w samym imporcie `_create_publication` + waliduje obecność roku i zgłasza czytelny komunikat zamiast pełnego + tracebacku. +- Naprawa testów Playwright (Chromium) padających na CI od commit-a `bafd8f209` (session-scoped `channels_live_server`). Daphne subprocess fork-uje z pytest worker process-u i dziedziczy monkey-patch `pytest_django._blocking_wrapper` na `BaseDatabaseWrapper.ensure_connection`, przez co każde zapytanie do DB w middleware (`django_countdown`, `bpp_setup_wizard`) crashowało z `RuntimeError: Database access not allowed` → 500 → puste strony → timeout-y Playwright. Fix: `set_database_connection` w subprocesie Daphne przywraca oryginalną implementację `ensure_connection`. + +### Usprawnienie + +- Dodano polecenia `dump_pbn_token` i `load_pbn_token` do + przenoszenia tokenu PBN użytkownika między instancjami BPP — bez + zrzutu całej bazy. `dump_pbn_token --user=` wypisuje JSON + z tokenem i datą jego ostatniej aktualizacji na stdout, a + `load_pbn_token --user=` czyta ten JSON ze stdin i ustawia + te same wartości lokalnemu użytkownikowi. + + W `run_site` dodano flagę `--get-pbn-token-from USERNAME@SSH-HOST`, która automatyzuje ten transfer — łączy się po + SSH ze wskazanym hostem (alias z `~/.ssh/config`), uruchamia + `dump_pbn_token` w kontenerze `appserver` z katalogu + `bpp-deploy` i wynik wgrywa do lokalnej bazy. Domyślne ścieżki i + nazwę serwisu można nadpisać flagami `--remote-deploy-path` i + `--remote-compose-service`. + +- Nowa komenda `manage.py run_site` — uruchamia dev stack BPP w testcontainerach + na losowych portach (PG + Redis), opcjonalnie odtwarza dump bazy + (`--from-dump path`, autodetect `.sql` / `.sql.gz` / `.dump`), tworzy + superusera `admin/admin`, odpala `runserver` i otwiera przeglądarkę. + Eliminuje konflikty portów przy wielu konfiguracjach BPP na jednym serwerze. + +## bpp 202604.1369 (2026-04-28) + +### Naprawione + +- Naprawiono generowanie `src/baseline-sql/baseline.sql`: komenda + `baseline_rebuild` uruchamia teraz `pg_dump` *wewnątrz* + testcontenera (`docker exec`) zamiast używać klienta z hosta. + Gdy host miał nowszy major PostgreSQL niż obraz bazowy + (`iplweb/bpp_dbserver:psql-16.13`), `pg_dump` w wersji 17 + wstawiał do dumpa dyrektywę `SET transaction_timeout = 0;`, + której PostgreSQL 16 nie zna — przez co odtworzenie baseline'u + na docelowej wersji się wywalało. Klient i serwer są teraz + zawsze w tym samym majorze. Dodatkowo scrubber wycina takie + linie jako safety net na wypadek przyszłych nowych dyrektyw. +- Naprawiono komunikat o przeterminowanym haśle, który pojawiał się + użytkownikom zalogowanym przez Microsoft (`microsoft_auth`) lub + ORCID (`orcid_integration`) bez formularza zmiany hasła. Hasłem + takich kont zarządza zewnętrzny IdP, więc polityka wygasania nie + powinna ich w ogóle obejmować — middleware + `ConditionalPasswordChangeMiddleware` już to respektował, ale + context processor `password_status` z `django-password-policies` + nadal sprawdzał wiek hasła w bazie i ustawiał + `password_change_required = True` w kontekście szablonu, przez co + `base.html` renderował callout bez formularza (zmienna `form` + istnieje tylko w widoku zmiany hasła, do którego middleware słusznie + nie przekierowywał). Dodano + `django_bpp.context_processors.conditional_password_status`, + który symetrycznie pomija sprawdzenie dla backendów OAuth z + `EXTERNAL_AUTH_BACKENDS` i deleguje do oryginalnego context + processora wyłącznie dla zwykłego logowania `ModelBackend`. + +### Usprawnienie + +- CI: shardy `pytest` w workflow `Tests` nie odpalają już `make assets` przy starcie. Obraz `test-runner` ma zapieczone CSS i `.mo` + z buildu obrazu (stage `test-runner` w `docker/bpp_base/Dockerfile`), + więc `conftest.py` honoruje teraz zmienną `BPP_SKIP_ASSETS_BUILD=1` + ustawioną w `docker-compose.test.ci.yml`. + + Wcześniej każdy z ośmiu równoległych shardów wpadał w + `pytest_configure` i — z powodu braku sentinela + `node_modules/.installed` w obrazie — odpalał pełny `yarn install` + + `grunt build` przed pierwszym testem. Lokalny dev nie jest zmieniony: + bez tej zmiennej `conftest.py` nadal uruchamia `make assets` jako + safety net. + +- Pipeline release-u (`make new-release` oraz `make release`) + weryfikuje teraz zaleznosci pod katem znanych CVE PRZED zbumpieniem + wersji i wystartowaniem builda. Nowy target `make scan-deps` + generuje SBOM (CycloneDX) z `uv.lock` przez `uv export --no-dev` + i puszcza go przez OSV-Scanner, Grype oraz Trivy. Jezeli ktorykolwiek + skaner znajdzie HIGH/CRITICAL CVE, `make` zatrzyma sie z exit 1 i + release nie ruszy — zeby pominac (na wlasna odpowiedzialnosc), uzyj + `./bin/scan-deps.sh --no-gate`. Wymagane narzedzia: `brew install osv-scanner grype trivy`. + + Workflow `dependency-audit.yml` rozszerzony o drugi job + `multi-scanner`, ktory na CI generuje ten sam SBOM i odpala te + same trzy skanery jako defense-in-depth obok istniejacego gate-u + `uv-secure`. Nowe skanery sa report-only (zapisuja markdown do + `GITHUB_STEP_SUMMARY`, nie blokuja merga) — chodzi o widocznosc + findings, ktorych nie wykryla baza `uv-secure`, bez ryzyka + zablokowania PR-a falszywym pozytywem z innej bazy CVE. + +## bpp 202604.1368 (2026-04-28) + +### Naprawione + +- Naprawiono migrację `0413_bppuser_autor_onetoone`, która kończyła + się błędem `cannot ALTER TABLE "bpp_bppuser" because it has pending trigger events` na bazach z istniejącymi danymi. Migracja została + oznaczona jako nieatomowa, dzięki czemu deferred triggery (`denorm`) + odpalane przez `RunPython` wystrzeliwują przed kolejnymi + `ALTER TABLE` na tej samej tabeli. + +## bpp 202604.1367 (2026-04-28) + +### Naprawione + +- `MaliciousRequestBlockingMiddleware` blokował legalne żądania + DataTables AJAX, jeśli tabela miała wiele kolumn — biblioteka + serializuje per-kolumnowe metadane (`columns[N][data]`, + `[search][value]`, …) do query stringu, który łatwo przekraczał + limit 2048 znaków. Konsekwencja: kontrolki DataTables na widokach + `/api/...` zwracały HTTP 444 zamiast danych, a integracyjne testy + Playwright (m.in. `import_dyscyplin`) timeout'owały się czekając + na dane, których serwer odmówił. + + Dwie zmiany: + + - Limit `MAX_FULL_PATH_LENGTH` podniesiony 2048 → 4096 znaków + (mieści typowy DataTables-payload bez otwierania drzwi rekurencyjnym + `?next=` od skanerów, bo te i tak obsługuje osobny check). + - Ścieżki zawierające `/api/` są zwolnione z check'u długości pełnego + URL — endpointy API legalnie generują wzdęte query stringi, a + scanner-boty z rekurencyjnymi przekierowaniami i tak nie kierują + swoich łańcuchów na `/api/`. (middleware-api-whitelist) + +- Pełen suite testów Playwright zostaje przyspieszony z ~3:50 do ~2:24 + (−85 s, −38 %) bez utraty pokrycia. + + Główne źródło zysku — naprawa ukrytego buga w + `django_bpp.playwright_util.select_select2_autocomplete`: pierwszy + `wait_for_selector` na `#select2-{id}-container` trafiał w pełen + 30-sekundowy timeout w testach gdzie ten wariant markupu nie istnieje + (formularze inline django-grappelli admin), zanim wpadał do bloku + `except` z fallbackowym selektorem siostrzanym. Helper jest używany + w 64 miejscach — każde wywołanie traciło ~30 s. Najwolniejsze testy + jak `test_changeform_add_full_flow` (3 wywołania select2) traciły + ~90 s na samych timeoutach. + + Naprawa: race obu selektorów przez listę `", "` w jednym + `wait_for_selector` — zwracamy się do `.select2-selection` (zawsze + klikalny element) zamiast container'a. Efekt: + + - `test_changeform_add_full_flow`: 97 s → 8 s + - `test_admin_wydawnictwo_ciagle_dowolnie_zapisane_nazwisko`: + 67 s → 8 s + - `test_procent_odpowiedzialnosci_*_dwoch_autorow` cluster: + 37–48 s → 12–18 s + + Drugi front — eliminacja antywzorców `wait_for_load_state(networkidle)` + i sztywnych `wait_for_timeout()` w testach Playwright, zastępowane + warunkowymi waitami (`expect(...).to_have_value()`, + `page.expect_navigation`, polling DB/listy dialogów): + + - `test_integracyjny` (import dyscyplin): 75 s → 13 s — usunięte + sztywne sleepy i `networkidle` na stronie z otwartym WebSocketem + - `test_multiseek_*` (6 testów): 30+ s → ~2 s — `expect_navigation` + zamiast `networkidle` po klikach search + - `test_smoke` crawler: usunięty `networkidle` w pętli (zawsze + trafiał w 10 s timeout bo strony BPP mają long-polling) + - `test_toz_tamze`, `test_admin_forms`, `test_clarivate`, + `test_change_form_pbn_isbn_doi_etc`, `test_change_form_pubmed`, + `test_crossref_api_sync_playwright` — sztywne `wait_for_timeout` + zamienione na polling licznika rekordów / listy dialogów / wartości + pól; w przypadku dialog handlerów polling musi pompować event loop + przez `page.wait_for_timeout` (a nie `time.sleep`), bo handler + odpala się tylko gdy Playwright przetwarza eventy. (playwright-suite-speedup) + +- Naprawiono blokowanie zapytań AJAX widgetów DataTables przez + `MaliciousRequestBlockingMiddleware`. Limit długości pełnego URL-a + (`MAX_FULL_PATH_LENGTH`) został podniesiony z 2048 na 8192 — DataTables + przy ~10 kolumnach generuje query string z percent-encoded metadanymi + kolumn (`columns%5B0%5D%5Bdata%5D=…`) przekraczający 2 KB, ale dobrze + mieszczący się w 8 KB (zgodnie z domyślnym `large_client_header_buffers` + nginxa i `LimitRequestLine` Apacha). Eksponencjalnie rosnące łańcuchy + `?next=` produkowane przez bot-skannery nadal są łapane — albo przez + nowy próg, albo przez detektor zagnieżdżonego `?next=`. + +- Naprawiono błąd teardown testów `TransactionTestCase` (m.in. testów + Playwright z `transaction=True`) — `TRUNCATE` Django flush'a wywalał + się na FK z niezarządzanej tabeli `bpp_rekord_mat` do zarządzanej + `bpp_charakter_formalny`. Monkey-patch `_fixture_teardown` (dodający + `allow_cascade=True` i retry przy deadlocku) został przeniesiony z + `src/fixtures/conftest.py` do `src/conftest.py`: ten pierwszy plik + jest siostrzanym katalogiem względem testów i pytest go automatycznie + NIE ładuje dla testów spoza `src/fixtures/`, więc patch nigdy nie + zaczepiał się dla większości testów transakcyjnych. + +- Naprawiono losowe failowanie kilku testów Playwrighta uruchamianych + równolegle z `-n auto`. Testy używające session-scoped fixture + `channels_live_server` (jeden Daphne na worker, reuse między + testami) były wrażliwe na pollution stanu w shared ASGI procesie: + wycieki konekcji DB i race między test'em a serwerem na widoczność + commitowanych danych. + + Dodano function-scoped warianty `admin_page_per_test` i + `preauth_asgi_page_per_test` (oparte o istniejący + `channels_live_server_per_test`) — każdy test dostaje świeży + proces Daphne. Przepięto na nie testy: + + - `test_bpp_notifications` + - `test_global_search_logged_in` + - `test_procent_odpowiedzialnosci_baseModel_AutorFormset_jeden_autor` + - `test_procent_odpowiedzialnosci_baseModel_AutorFormset_dwoch_autorow` + - `test_procent_odpowiedzialnosci_baseModel_AutorFormset_dobrze_potem_zle_dwoch_autorow` + + Pozostałe testy (~67) nadal używają szybkiego session-scoped + `channels_live_server` — bez regresji wydajności. + +## bpp 202604.1366 (2026-04-27) + +### Naprawione + +- Rozszerzono `MaliciousRequestBlockingMiddleware` o dwie dodatkowe + heurystyki ograniczające szum w logach od skanerów bezpieczeństwa: + + - Pełny URL (ścieżka + query string) dłuższy niż 2048 znaków zwraca + HTTP 444. Dotychczasowy limit 1024 znaków obejmował tylko + `request.path` i przepuszczał wzdęte query stringi. + - Parametr `next=` zawierający kolejne `?next=` (po dekodowaniu + query stringu przez Django) jest blokowany jako odcisk bota + podążającego za przekierowaniami logowania bez cookies — typowy + wzorzec rekurencyjnie zakodowanych łańcuchów krążących między + `/accounts/login/` a `/admin/login/`. + + Pojedynczy, prawidłowy `next=` (np. po nieautoryzowanej próbie + wejścia do widoku `toz`) pozostaje dozwolony. (blokada-zagnezdzonych-next) + +- Naprawiono renderowanie paginacji w widokach z HTMX (np. `/pbn_export_queue/`), + gdzie stopka strony lądowała pomiędzy pagerem a tabelą. Przyczyną była + minifikacja HTML aplikowana do fragmentów ładowanych przez + `hx-swap="innerHTML"` — `minify-html` zaprojektowany dla pełnych + dokumentów restrukturyzował niezamknięte/puste tagi (m.in. pusty + `
  • `) w partial-ach, rozjeżdżając DOM po wstawieniu. + + Wprowadzono prewencję systemową przeciwko regresjom tej klasy: + + - `BppMinifyHtmlMiddleware` omija minifikację gdy żądanie ma nagłówek + `HX-Request: true` (wszystkie HTMX-owe partial-e bypassują minifier). + - Linter `djlint` dodany do pre-commit z aktywnymi regułami + strukturalnymi (H020 puste-tag-pair, H025 orphan-tag) — wykrywa + podobne pułapki przed merge-em. + - Test integralności `test_html_minify_integrity.py` weryfikuje że + typowe trefne wzorce (puste `
  • `, `

    `, ``) po + minifikacji nie rozjeżdżają struktury DOM, plus że HTMX-owe requesty + są właściwie bypassowane. + + Dodatkowo style paginacji `pagination_with_anchor.html` przeniesione z + inline ` + + +

    +

    Moje ostatnie publikacje

    +
    + Ładowanie publikacji... +
    +
    + + + + +``` + +Uwagi dotyczące CORS +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +CORS (Cross-Origin Resource Sharing) to mechanizm bezpieczeństwa przeglądarek internetowych, który kontroluje +dostęp do zasobów między różnymi domenami. Gdy strona internetowa próbuje pobrać dane z innej domeny +(np. strona autora z domeny `autor.pl` próbuje pobrać dane z `bpp.uczelnia.pl`), przeglądarka +sprawdza, czy serwer docelowy zezwala na takie połączenie. + +System BPP domyślnie konfiguruje nagłówki CORS tak, aby umożliwić pobieranie danych API przez przeglądarki +internetowe z różnych lokalizacji. Oznacza to, że endpoint `/api/v1/recent_author_publications/` jest +standardowo dostępny dla zewnętrznych stron WWW. + +Jednak ze względu na różne uwarunkowania konfiguracyjne (np. dodatkowe proxy, loadbalancery, specyficzne +ustawienia serwera WWW lub wymagania bezpieczeństwa instytucji), domyślna konfiguracja CORS może okazać się +niewystarczająca. + +W przypadku wystąpienia błędów CORS (widocznych w konsoli przeglądarki jako błędy typu "CORS policy blocked"), +należy skontaktować się z administratorem systemu BPP w celu dostosowania konfiguracji do konkretnych potrzeb. diff --git a/docs/api.rst b/docs/api.rst deleted file mode 100644 index c7ab1ab43..000000000 --- a/docs/api.rst +++ /dev/null @@ -1,482 +0,0 @@ -API systemu BPP -=============== - -System BPP oferuje API tylko-do-odczytu dla obiektów bazodanowych zawierających istotne informacje takie jak: wydawnictwa ciągłe, -wydawnictwa zwarte, patenty, autorzy, jednostki i inne. - -API dostępne jest dla użytkowników niezalogowanych. - -API dostępne jest w formie "przyjaznej developerom", to znaczy, ze po wejściu w nie możemy -korzystając ze zwykłej przeglądarki WWW zapoznać się z udostępnianymi przez API możliwościami -a następnie płynnie przełączyć się w tryb JSON, aby pobierać dane czytelne nieco mniej dla -człowieka, a bardziej dla komputera. - -.. image:: images/api/api_1.png - -API dla raportów slotu - uczelnia ---------------------------------- - -BPP umożliwia tworzenie i pobieranie raportu slotów - uczelnia za pomocą API. Taka funkcja -wymaga jednak zalogowania jako użytkownik będący członkiem grupy "generowanie raportów". - -#. Aby utworzyć raport slotów - uczelnia przez API, należy wejść w przeglądarce na stronę: - - ``/api/v1/raport_slotow_uczelnia/`` - - Przeglądarka poprosi nas o zalogowanie się za pomoca loginu i hasła. Na samym dole - strony zobaczymy formularz, który umożliwia utworzenie raportu przez API: - - .. image:: images/api/api_2.png - -#. Aby utworzyć raport slotów - uczelnia przez API za pomocą polecenia ``curl(1)``, - możemy w systemowej powłoce napisać: - - .. code-block:: shell - - curl -X POST -u login:haslo https://adres.serwera/api/v1/raport_slotow_uczelnia/ - -#. Zwrotnie otrzymamy kod JSON z danymi raportu: - - .. code-block:: json - - { - "id": "https://adres.serwera/api/v1/raport_slotow_uczelnia/c9d4b477-4cc5-4922-a499-fce43fd37be1/", - "created_on": "2023-02-21T23:25:36.864007+01:00", - "last_updated_on": "2023-02-21T23:25:36.864018+01:00", - "started_on": null, - "finished_on": null, - "finished_successfully": false, - "od_roku": 2023, - "do_roku": 2023, - "akcja": "slot", - "slot": "1.0000", - "minimalny_pk": "0.00", - "dziel_na_jednostki_i_wydzialy": true, - "pokazuj_zerowych": false - } - - W powyższym przykładzie dana nas interesująca to numer ID raportu, czyli w tym przykładzie - będzie to ``c9d4b477-4cc5-4922-a499-fce43fd37be1``. - -#. Dane raportu zwracane są asynchronicznie. Oznacza to, że dopóki raport nie otrzyma wartości - w polach ``finished_successfully`` oraz ``finished_on``, oznacza to, że nie jest jeszcze - utworzony. Należy cyklicznie odświeżać dane raportu np co 5-10 sekund, aż pojawi się - wartość w tych polach: - - ``curl -u login:haslo https://adres.serwera/api/v1/raport_slotow_uczelnia/c9d4b477-4cc5-4922-a499-fce43fd37be1/`` - - .. warning:: - - Utworzenie zbyt dużej ilości raportów na raz skutecznie zapcha kolejkę przetwarzania - asynchronicznego i utrudni kolejnym użytkownikom korzystanie z serwera. - - -#. Następnie możliwe będzie pobranie pojedynczych wierszy tego raportu. Przez stronę WWW - potrzebne będzie doklikanie się do strony: - - ``/api/v1/raport_slotow_uczelnia_wiersz/?parent=c9d4b477-4cc5-4922-a499-fce43fd37be1`` - - Jak łatwo zauważyć, będzie tam lista wierszy raportu, zawierająca informacje o autorze, jednostce, - dyscyplinie, zebranym slocie i sumie PkD dla autora. - - .. image:: images/api/api_3.png - - Zapytanie o te wszystkie dane z pomocą polecenia ``curl(1)`` zwróci nam tekst w - formacie JSON: - - ``curl -u login:haslo "https://adres.serwera/api/v1/raport_slotow_uczelnia_wiersz/?parent=c9d4b477-4cc5-4922-a499-fce43fd37be1" | python -m json.tool`` - - **UWAGA**: tutaj na końcu nie dajemy slash. - -#. dane w formacie JSON są stronnicowane, po kilka wpisów na stronę, aby nie przeciążać serwera. Warto zwrócić - uwagę na parametry ``count``, ``next`` i ``previous``, znajdujące się w słowniku. - -Pobieranie danych z systemu BPP przez JSON HTTP REST API --------------------------------------------------------- - -System BPP udostępnia szereg endpoint'ów REST API dla pobierania danych o publikacjach i powiązanych obiektach. -API jest tylko-do-odczytu i nie wymaga autoryzacji dla dostępu do danych publikacji. - -Główne endpoint'y API -~~~~~~~~~~~~~~~~~~~~ - -System udostępnia następujące główne endpoint'y dla pobierania danych publikacji: - -* ``/api/v1/wydawnictwo_ciagle/`` - wydawnictwa ciągłe (artykuły w czasopismach) -* ``/api/v1/wydawnictwo_zwarte/`` - wydawnictwa zwarte (książki, rozdziały) -* ``/api/v1/patent/`` - patenty -* ``/api/v1/praca_doktorska/`` - prace doktorskie -* ``/api/v1/praca_habilitacyjna/`` - prace habilitacyjne - -Dane pomocnicze dostępne są przez następujące endpoint'y: - -* ``/api/v1/autor/`` - autorzy -* ``/api/v1/jednostka/`` - jednostki organizacyjne -* ``/api/v1/uczelnia/`` - uczelnie -* ``/api/v1/wydawca/`` - wydawcy -* ``/api/v1/zrodlo/`` - źródła publikacji -* ``/api/v1/charakter_formalny/`` - charaktery formalne - -Przykłady użycia CURL -~~~~~~~~~~~~~~~~~~~~ - -#. **Pobranie listy wydawnictw ciągłych:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/wydawnictwo_ciagle/" | python -m json.tool - - To polecenie zwróci listę wydawnictw ciągłych w formacie JSON z paginacją. - -#. **Pobranie konkretnego wydawnictwa ciągłego:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/wydawnictwo_ciagle/123/" | python -m json.tool - - Gdzie ``123`` to ID konkretnego wydawnictwa. - -#. **Filtrowanie wydawnictw po roku:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/wydawnictwo_ciagle/?rok__gte=2020&rok__lte=2023" | python -m json.tool - - To polecenie zwróci wydawnictwa z lat 2020-2023. - -#. **Pobranie wydawnictw zmienionych w określonym okresie:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/wydawnictwo_ciagle/?ostatnio_zmieniony__gte=2023-01-01T00:00:00Z" | python -m json.tool - - To polecenie zwróci wydawnictwa zmienione od 1 stycznia 2023 roku. - -#. **Pobranie listy autorów:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/autor/" | python -m json.tool - -#. **Pobranie konkretnego autora:** - - .. code-block:: shell - - curl "https://adres.serwera/api/v1/autor/456/" | python -m json.tool - - Gdzie ``456`` to ID konkretnego autora. - -Przykłady użycia w Postman -~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - Postman to darmowe narzędzie do testowania API. Można je pobrać ze strony https://www.postman.com/downloads/ - -#. **Konfiguracja podstawowa:** - - * Method: GET - * URL: ``https://adres.serwera/api/v1/wydawnictwo_ciagle/`` - * Headers: ``Accept: application/json`` - -#. **Pobieranie z filtrowaniem po roku:** - - * Method: GET - * URL: ``https://adres.serwera/api/v1/wydawnictwo_ciagle/`` - * Params: - * ``rok__gte``: ``2020`` - * ``rok__lte``: ``2023`` - -#. **Pobieranie z paginacją:** - - * Method: GET - * URL: ``https://adres.serwera/api/v1/wydawnictwo_ciagle/`` - * Params: - * ``page``: ``2`` - * ``page_size``: ``50`` - -#. **Pobieranie konkretnego rekordu:** - - * Method: GET - * URL: ``https://adres.serwera/api/v1/wydawnictwo_ciagle/123/`` - -Format odpowiedzi -~~~~~~~~~~~~~~~~ - -API zwraca dane w formacie JSON. Przykład odpowiedzi dla listy wydawnictw: - -.. code-block:: json - - { - "count": 1500, - "next": "https://adres.serwera/api/v1/wydawnictwo_ciagle/?page=2", - "previous": null, - "results": [ - { - "id": 123, - "tytul": "Przykładowy tytuł artykułu", - "rok": 2023, - "charakter_formalny": { - "nazwa": "Artykuł w czasopiśmie" - }, - "autorzy_set": [ - { - "autor": { - "imiona": "Jan", - "nazwisko": "Kowalski" - } - } - ], - "ostatnio_zmieniony": "2023-12-01T10:30:00Z" - } - ] - } - -Parametry filtrowania -~~~~~~~~~~~~~~~~~~~ - -Większość endpoint'ów obsługuje następujące parametry filtrowania: - -* ``rok`` - filtrowanie po roku publikacji -* ``rok__gte`` - publikacje od podanego roku (włącznie) -* ``rok__lte`` - publikacje do podanego roku (włącznie) -* ``ostatnio_zmieniony`` - filtrowanie po dacie ostatniej modyfikacji -* ``ostatnio_zmieniony__gte`` - rekordy zmienione od podanej daty -* ``charakter_formalny`` - filtrowanie po charakterze formalnym publikacji - -Paginacja -~~~~~~~~ - -Wszystkie listy są paginowane. Odpowiedzi zawierają: - -* ``count`` - łączna liczba rekordów -* ``next`` - URL do następnej strony (jeśli istnieje) -* ``previous`` - URL do poprzedniej strony (jeśli istnieje) -* ``results`` - aktualne wyniki - -Domyślnie zwracane jest 20 rekordów na stronę. Można to zmienić parametrem ``page_size``. - -API dla ostatnich publikacji autora ------------------------------------ - -System BPP udostępnia specjalny endpoint umożliwiający pobranie listy ostatnich publikacji konkretnego autora. -Jest to przydatne dla autorów, którzy chcą wyświetlić swoją listę prac na własnej stronie internetowej. - -Endpoint -~~~~~~~~ - -Aby pobrać ostatnie publikacje autora, należy użyć następującego endpoint'u: - -``/api/v1/recent_author_publications/{id}/`` - -Gdzie ``{id}`` to identyfikator autora w systemie BPP. - -Funkcjonalność -~~~~~~~~~~~~~ - -* Zwraca 25 ostatnich publikacji autora -* Publikacje są sortowane według daty ostatniej modyfikacji (od najnowszej) -* Dla każdej publikacji zwracany jest: - - * Identyfikator publikacji - * Pełny opis bibliograficzny - * Data ostatniej modyfikacji - * URL do szczegółowej strony publikacji w systemie BPP - -Format odpowiedzi -~~~~~~~~~~~~~~~~ - -.. code-block:: json - - { - "autor_id": 123, - "autor_nazwa": "prof. dr hab. Jan Kowalski", - "count": 25, - "publications": [ - { - "id": "[1, 456]", - "opis_bibliograficzny": "Kowalski J., Nowak A.: Przykładowy tytuł artykułu. Czasopismo Naukowe 2023, vol. 15, s. 123-145.", - "ostatnio_zmieniony": "2023-12-15T14:30:00+01:00", - "url": "https://bpp.uczelnia.pl/bpp/browse/praca/przykładowy-tytuł-artykułu-kowalski-j-nowak-a-2023" - }, - { - "id": "[1, 457]", - "opis_bibliograficzny": "Kowalski J.: Monografia naukowa. Wydawnictwo Uczelniane, Warszawa 2023, ISBN 978-83-1234-567-8.", - "ostatnio_zmieniony": "2023-11-20T10:15:00+01:00", - "url": "https://bpp.uczelnia.pl/bpp/browse/praca/monografia-naukowa-kowalski-j-2023" - } - ] - } - -Przykład użycia CURL -~~~~~~~~~~~~~~~~~~ - -.. code-block:: shell - - curl "https://bpp.uczelnia.pl/api/v1/recent_author_publications/123/" | python -m json.tool - -Przykład integracji na stronie WWW autora -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Poniżej znajduje się przykładowy kod JavaScript, który może być użyty na stronie internetowej autora -do automatycznego pobierania i wyświetlania listy jego publikacji: - -.. code-block:: html - - - - - - Moje publikacje - - - -
    -

    Moje ostatnie publikacje

    -
    - Ładowanie publikacji... -
    -
    - - - - - -Uwagi dotyczące CORS -~~~~~~~~~~~~~~~~~~~ - -CORS (Cross-Origin Resource Sharing) to mechanizm bezpieczeństwa przeglądarek internetowych, który kontroluje -dostęp do zasobów między różnymi domenami. Gdy strona internetowa próbuje pobrać dane z innej domeny -(np. strona autora z domeny ``autor.pl`` próbuje pobrać dane z ``bpp.uczelnia.pl``), przeglądarka -sprawdza, czy serwer docelowy zezwala na takie połączenie. - -System BPP domyślnie konfiguruje nagłówki CORS tak, aby umożliwić pobieranie danych API przez przeglądarki -internetowe z różnych lokalizacji. Oznacza to, że endpoint ``/api/v1/recent_author_publications/`` jest -standardowo dostępny dla zewnętrznych stron WWW. - -Jednak ze względu na różne uwarunkowania konfiguracyjne (np. dodatkowe proxy, loadbalancery, specyficzne -ustawienia serwera WWW lub wymagania bezpieczeństwa instytucji), domyślna konfiguracja CORS może okazać się -niewystarczająca. - -W przypadku wystąpienia błędów CORS (widocznych w konsoli przeglądarki jako błędy typu "CORS policy blocked"), -należy skontaktować się z administratorem systemu BPP w celu dostosowania konfiguracji do konkretnych potrzeb. diff --git a/docs/assets/mathjax-config.js b/docs/assets/mathjax-config.js new file mode 100644 index 000000000..daf3bc42b --- /dev/null +++ b/docs/assets/mathjax-config.js @@ -0,0 +1,19 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.startup.output.clearCache(); + MathJax.typesetClear(); + MathJax.texReset(); + MathJax.typesetPromise(); +}); diff --git a/docs/authors.md b/docs/authors.md new file mode 100644 index 000000000..a09344f29 --- /dev/null +++ b/docs/authors.md @@ -0,0 +1,11 @@ +# Autorzy + +## Programiści + +- Michał Pasternak \ + +## Bibliotekarze + +- Elżbieta Drożdż \ +- Renata Birska \ +- Małgorzata Zając \ diff --git a/docs/authors.rst b/docs/authors.rst deleted file mode 100644 index e122f914a..000000000 --- a/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100755 index fdf331003..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,286 +0,0 @@ -#!/usr/bin/env python -# -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import os -import sys - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# sys.path.insert(0, os.path.abspath('.')) - -# Get the project root dir, which is the parent dir of this -cwd = os.getcwd() -project_root = os.path.dirname(cwd) - -# Insert the project root dir as the first element in the PYTHONPATH. -# This lets us ensure that the source package is imported, and that its -# version is used. -sys.path.insert(0, os.path.join(project_root, "src")) - -from django_bpp.version import VERSION - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.viewcode", - "sphinx.ext.imgmath", - "sphinx.ext.autosectionlabel", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix of source filenames. -source_suffix = ".rst" - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Bibliografia Publikacji Pracowników" -copyright = "2005-2025, iplweb.pl Michał Pasternak" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = VERSION -# The full version, including alpha/beta/rc tags. -version = VERSION - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# language = None - -# There are two options for replacing |today|: either, you set today to -# some non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ["_build"] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built -# documents. -# keep_warnings = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "default" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -# html_title = None - -# A shorter title for the navigation bar. Default is the same as -# html_title. -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the -# top of the sidebar. -# html_logo = None - -# The name of an image file (within the static path) to use as favicon -# of the docs. This file should be a Windows icon file (.ico) being -# 16x16 or 32x32 pixels large. -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) -# here, relative to this directory. They are copied after the builtin -# static files, so a file named "default.css" will overwrite the builtin -# "default.css". -html_static_path = ["_static"] - -# If not '', a 'Last updated on:' timestamp is inserted at every page -# bottom, using the given strftime format. -# html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names -# to template names. -# html_additional_pages = {} - -# If false, no module index is generated. -# html_domain_indices = True - -# If false, no index is generated. -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. -# Default is True. -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. -# Default is True. -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages -# will contain a tag referring to it. The value of this option -# must be the base URL from which the finished HTML is served. -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = "django_bppdoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # 'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ( - "index", - "django-bpp.tex", - "Bibliografia Publikacji Pracowników", - "Michał Pasternak", - "manual", - ), -] - -# The name of an image file (relative to this directory) to place at -# the top of the title page. -# latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings -# are parts, not chapters. -# latex_use_parts = False - -# If true, show page references after internal links. -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# latex_appendices = [] - -# If false, no module index is generated. -# latex_domain_indices = True - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ( - "index", - "django-bpp", - "Bibliografia Publikacji Pracowników", - ["Michał Pasternak"], - 1, - ) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - "index", - "amms_planop2xls", - "Bibliografia Publikacji Pracowników", - "Michał Pasternak", - "django_bpp", - "One line description of project.", - "Miscellaneous", - ), -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..4592c438a --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,44 @@ +# Rozwijanie oprogramowania + +Cenimy sobie wszystkie uwagi, nawet te krytyczne. Każda z nich może pomóc, podobnie +każdy z nas może zostać współautorem niniejszego oprogramowania. + +Możesz dołożyć się do tego projektu na różne sposoby: + +## Zgłaszanie błędów + +Zgłaszaj błędy w oprogramowaniu pod adresem +[github.com/iplweb/bpp/issues](https://github.com/iplweb/bpp/issues). + +Jeżeli zgłaszasz błąd, prosimy, opisz: + +- Twój system operacyjny i wersję przeglądarki WWW, +- szczegóły dotyczące konfiguracji Twojego komputera, które mogą pomóc + w powieleniu a następnie usunięciu błędu, +- szczegółową instrukcję krok-po-kroku jak spowodować wystąpienie błędu + +## Naprawianie błędów + +Przejrzyj zgłoszenia na GitHub w poszukiwaniu błędów, które możesz naprawić. + +## Zaimplementuj nowe funkcje + +Przejrzyj zgłoszenia na GitHub w poszukiwaniu zgłoszeń zawierających +zapotrzebowanie na nowe funkcje. Wszystko, co oznaczone "enhancement" +lub "help wanted" czeka na osobę, która się tym zajmie. + +## Napisz dokumentację + +BPP zawsze może skorzystać z nowej dokumentacji, bądź to w formie instrukcji, +docstrings lub artykułów na sieci, prezentacji itp. + +## Zgłoś uwagi + +Najlepszy sposób na zgłoszenie swoich uwag to wypełnienie formularza pod adresem +[github.com/iplweb/bpp/issues](https://github.com/iplweb/bpp/issues). + +Jeżeli proponujesz nową funkcję: + +- Wyjaśnij, w jaki sposób ma działać +- Pamiętaj, że ten projekt rozwijany jest na zasadach opensource i Twój wkład + jest mile widziany diff --git a/docs/contributing.rst b/docs/contributing.rst deleted file mode 100644 index e582053ea..000000000 --- a/docs/contributing.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CONTRIBUTING.rst diff --git a/docs/edycja_autor.md b/docs/edycja_autor.md new file mode 100644 index 000000000..4a9b48aa6 --- /dev/null +++ b/docs/edycja_autor.md @@ -0,0 +1,32 @@ +# Edycja danych autorów + +## Pole *Aktualne miejsce pracy* dla autora + +Wartość pola *Aktualne miejsce pracy* która widnieje w module redagowania +dla Autora jest wartością tylko-do-odczytu a jej wartość obliczana jest na podstawie +wpisów powiązań autora z jednostką: + +![Zrzut ekranu przedstawiający kilka powiązań autora z jednostkami.](images/admin/autor_jednostka/autor_jednostka.png) + +!!! note + + Pole *Aktualne miejsce pracy* używane jest w raportach oraz do + podpowiadania jednostki przy dopisywaniu autora do rekordu publikacji. + + +Algorytm ustalania aktualnego miejsca pracy działa w sposób następujący: + +1. jeżeli któreś z miejsc pracy ma atrybut *Podstawowe miejce pracy* ustawiony na "TAK" i data + zakończenia pracy jest pusta lub większa od obecnej, to takie miejsce będzie wybrane jako aktualne +2. jeżeli autor nie ma żadnego miejsca pracy ustawionego jako podstawowe, to system jako aktualne + miejsce pracy wybierze to, w którym autor nie zakończył pracy (data zakończenia pracy jest pusta + lub większa od obecnej) i gdzie autor rozpoczął pracę najpóźniej (data rozpoczęcia pracy jest + najwyższa) +3. jeżeli autor ma kilka miejsc pracy i w żadnym nie ma ustawionego atrybutu *Podstawowe miejsce pracy* + oraz daty rozpoczęcia i zakończenia pracy są puste, system jako *Aktualne miejsce pracy* wybierze + to powiązanie, które do systemu BPP zostało dopisane najpóźniej (jego numer ID jest największy) + +!!! warning + + dany autor może mieć tylko jedno powiązanie oznaczone jako *Podstawowe miejsce pracy*. + diff --git a/docs/edycja_autor.rst b/docs/edycja_autor.rst deleted file mode 100644 index 9292fd758..000000000 --- a/docs/edycja_autor.rst +++ /dev/null @@ -1,33 +0,0 @@ -Edycja danych autorów -===================== - -Pole *Aktualne miejsce pracy* dla autora ----------------------------------------- - -Wartość pola *Aktualne miejsce pracy* która widnieje w module redagowania -dla Autora jest wartością tylko-do-odczytu a jej wartość obliczana jest na podstawie -wpisów powiązań autora z jednostką: - -.. image:: images/admin/autor_jednostka/autor_jednostka.png - :alt: Zrzut ekranu przedstawiający kilka powiązań autora z jednostkami. - -.. note:: Pole *Aktualne miejsce pracy* używane jest w raportach oraz do - podpowiadania jednostki przy dopisywaniu autora do rekordu publikacji. - -Algorytm ustalania aktualnego miejsca pracy działa w sposób następujący: - -#. jeżeli któreś z miejsc pracy ma atrybut *Podstawowe miejce pracy* ustawiony na "TAK" i data - zakończenia pracy jest pusta lub większa od obecnej, to takie miejsce będzie wybrane jako aktualne - -#. jeżeli autor nie ma żadnego miejsca pracy ustawionego jako podstawowe, to system jako aktualne - miejsce pracy wybierze to, w którym autor nie zakończył pracy (data zakończenia pracy jest pusta - lub większa od obecnej) i gdzie autor rozpoczął pracę najpóźniej (data rozpoczęcia pracy jest - najwyższa) - -#. jeżeli autor ma kilka miejsc pracy i w żadnym nie ma ustawionego atrybutu *Podstawowe miejsce pracy* - oraz daty rozpoczęcia i zakończenia pracy są puste, system jako *Aktualne miejsce pracy* wybierze - to powiązanie, które do systemu BPP zostało dopisane najpóźniej (jego numer ID jest największy) - - - -.. warning:: dany autor może mieć tylko jedno powiązanie oznaczone jako *Podstawowe miejsce pracy*. diff --git a/docs/edycja_jednostka.rst b/docs/edycja_jednostka.md similarity index 71% rename from docs/edycja_jednostka.rst rename to docs/edycja_jednostka.md index 4778c7fb3..0b1a16dbd 100644 --- a/docs/edycja_jednostka.rst +++ b/docs/edycja_jednostka.md @@ -1,23 +1,19 @@ -Edycja danych jednostek -======================= +# Edycja danych jednostek -Pole *Aktualny wydział* ------------------------ +## Pole *Aktualny wydział* Pole *Aktualny wydział* jest polem tylko-do-odczytu, zaś jego wartość obliczana jest na podstawie powiązań jednostki z wydziałem. Rozwiązane jest to w ten sposób, ponieważ jednostki mogą w niektórych przypadkach zmieniać wydział. W takiej sytuacji można wpisać datę takiej zmiany. -Pole *Skupia pracowników* -------------------------- +## Pole *Skupia pracowników* Pole używane w raportach. Określa, czy jednostka skupia obecnych, aktualnych, żyjących pracowników uczelni. W przypadku jednostek "wirtualnych" (jednostek, które faktycznie nie istnieją, a dodane do BPP zostały celem usprawnienia zarządzania danymi) wskazane jest odznaczenie tego pola. -Pole *Zarządzaj automatycznie* ------------------------------- +## Pole *Zarządzaj automatycznie* Pole to określa, czy dana jednostka będzie zarządzana przez system automatycznie przy imporcie danych z zewnętrznych źródeł. @@ -27,5 +23,8 @@ Przykładowo, jeżeli utworzymy jednostkę "wirtualną" to przy synchronizacji d ulegałaby skasowaniu bądź zaznaczeniu, że nie jest jednostką aktualną. Zatem, dla takich jednostek, należy odznaczyć to pole. -.. note:: W obecnym kształcie systemu BPP, pole to używane jest przy :ref:`imporcie pracowników ` - przez procedurę :ref:`odpinania nieaktualnych miejsc pracy `. +!!! note + + W obecnym kształcie systemu BPP, pole to używane jest przy [imporcie pracowników](import_pracownikow.md) + przez procedurę [odpinania nieaktualnych miejsc pracy](import_pracownikow.md#odpinanie-nieaktualnych-miejsc-pracy). + diff --git a/docs/edycja_uczelnia.rst b/docs/edycja_uczelnia.md similarity index 71% rename from docs/edycja_uczelnia.rst rename to docs/edycja_uczelnia.md index 76811bea8..8d1a133ba 100644 --- a/docs/edycja_uczelnia.rst +++ b/docs/edycja_uczelnia.md @@ -1,49 +1,43 @@ -Edycja danych uczelni -===================== +# Edycja danych uczelni -Wejście do ustawień Uczelni ---------------------------- +## Wejście do ustawień Uczelni Aby wejść do ustawień Uczelni, musimy najpierw się zalogować do systemu. W tym celu na pierwszym ekranie na górnej belce nawigacji klikamy w "zaloguj" -.. image:: images/admin/edycja_uczelnia/edycja_uczelnia_0.png +![image](images/admin/edycja_uczelnia/edycja_uczelnia_0.png) Po zalogowaniu się, na górnej belce nawigacji pojawi się opcja "redagowanie": -.. image:: images/admin/edycja_uczelnia/edycja_uczelnia_1.png +![image](images/admin/edycja_uczelnia/edycja_uczelnia_1.png) Po wejściu w redagowanie, z górnej belki nawigacji wybieramy "Struktura" a następnie "Uczelnia": -.. image:: images/admin/edycja_uczelnia/edycja_uczelnia_2.png +![image](images/admin/edycja_uczelnia/edycja_uczelnia_2.png) W systemie powinien być jeden rekord określający dane uczelni. Aby wejśc dalej, klikamy w nazwę Uczelni: -.. image:: images/admin/edycja_uczelnia/edycja_uczelnia_3.png +![image](images/admin/edycja_uczelnia/edycja_uczelnia_3.png) Następnie otworzy nam się puszka Pandory tzn. formularz ustawień uczelni. W chwili tworzenia niniejszej dokumentacji zajmuje on około 5 ekranów. Użytkownicy końcowi a nawet administratorzy nie będą tu zaglądać zbyt często, ale mimo to doradzamy rozwagę w edycji ustawień obiektu uczelnia. -Integracja z Web Of Science ---------------------------- +## Integracja z Web Of Science Po rozwinięciu zakładki "Clarivate Analytics API" możemy uzupełnić nazwę użytkownika i hasło do Clarivate Analytics API. W ten sposób będziemy mogli zaciągać liczbę cytowań dla rekordów i autorów. -Integracja z PBN ----------------- +## Integracja z PBN Jeżeli w PBN uzyskaliśmy rolę "Menedżer aplikacji", możemy utworzyc token aplikacji i wpisać te dane do BPP. Umożliwi -to autoryzowanie użytkownika loginem w PBN (na głównej stronie, menu operacje -> autoryzuj w PBN) a następnie +to autoryzowanie użytkownika loginem w PBN (na głównej stronie, menu operacje -\> autoryzuj w PBN) a następnie możliwe będzie wysyłanie prac do PBN przy ich zapisywaniu. W ten sposób dane publikacji wpisujemy tylko raz (do BPP), a ręczne ich wysyłanie do PBN nie jest potrzebne. -.. image:: images/admin/edycja_uczelnia/edycja_uczelnia_4.png +![image](images/admin/edycja_uczelnia/edycja_uczelnia_4.png) - -Obca jednostka --------------- +## Obca jednostka W systemie BPP powinna znajdować się jedna i wyłącznie jedna *Obca jednostka*. @@ -52,4 +46,7 @@ Jest to taka jednostka, do której trafiają autorzy, którzy afiliują na jedno Aby określić *Obcą jednostkę* należy wejść w module Redagowanie➡Struktura➡Uczelnie, wybrać nasza uczelnię i następnie wybrać jednostkę w polu *Obca jednostka* i zapisać taki rekord. -.. note:: warto, aby *Obca jednostka* miała odznaczone :ref:`Pole *Skupia pracowników*` oraz :ref:`Pole *Zarządzaj automatycznie*` +!!! note + + warto, aby *Obca jednostka* miała odznaczone [Pole *Skupia pracowników*](edycja_jednostka.md#pole-skupia-pracowników) oraz [Pole *Zarządzaj automatycznie*](edycja_jednostka.md#pole-zarządzaj-automatycznie) + diff --git a/docs/edycja_wydawnictwo.rst b/docs/edycja_wydawnictwo.md similarity index 50% rename from docs/edycja_wydawnictwo.rst rename to docs/edycja_wydawnictwo.md index 548d4097e..8029d74fc 100644 --- a/docs/edycja_wydawnictwo.rst +++ b/docs/edycja_wydawnictwo.md @@ -1,31 +1,22 @@ -Edycja danych rekordów - wydawnictwa zwarte, ciągłe, patenty, itp -================================================================= +# Edycja danych rekordów - wydawnictwa zwarte, ciągłe, patenty, itp -Dodawanie autorów do rekordów ------------------------------ +## Dodawanie autorów do rekordów Aby dodać autora do rekordu, podczas dodawania lub edycji nowego rekordu kliknij "Dodaj kolejne powiązanie autora z wyd. ciągłym / wyd. zwartym / patentem ...". -Zmiana kolejności autorów ------------------------------ +## Zmiana kolejności autorów Aby zmienić kolejność autorów, skorzystaj z przycisku przeciągania oraz techniki "przeciągnij i upuść". Po prostu kliknij i przytrzymaj lewym przyciskiem myszy na przycisku przeciągania i przeciągnij dane powiązanie autora z rekordem w górę lub w dół. Przycisk przeciągania wygląda w następujący sposób: -.. image:: images/editor/przycisk_przeciagania.png - :alt: Przycisk przeciągania +![Przycisk przeciągania](images/editor/przycisk_przeciagania.png) Możesz "zwinąć" formularz powiązania autora z rekordem aby zmiana kolejności autorów była łatwiejsza, co ma szczególne znaczenie na monitorach o niewielkiej rozdzielczości. -Działania te również prezentuje film `Zmiana kolejności autorów`_ . +Działania te również prezentuje film [Zmiana kolejności autorów](https://www.youtube.com/embed/oruEX3CykH8) . -.. raw:: html - - - - -.. _Zmiana kolejności autorów: https://www.youtube.com/embed/oruEX3CykH8 + diff --git a/docs/history.md b/docs/history.md new file mode 100644 index 000000000..baa15dc5f --- /dev/null +++ b/docs/history.md @@ -0,0 +1,3 @@ +{% + include-markdown "../HISTORY.md" +%} diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 250649964..000000000 --- a/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../HISTORY.rst diff --git a/docs/import_pracownikow.md b/docs/import_pracownikow.md new file mode 100644 index 000000000..255da3b7f --- /dev/null +++ b/docs/import_pracownikow.md @@ -0,0 +1,86 @@ +# Import pracowników + +Funkcja importu pracowników pozwala zaimportować dane pracowników uczelni +za pomocą pliku w formacie XLS. Domyślnie obsługiwany jest format danych, +który może zostać utworzony przez eksport z oprogramowania [Egeria](https://egeria.comarch.pl) . + +## Jak uruchomić? + +Aby uruchomić tą funkcję, należy po zalogowaniu się do serwisu z menu +głównego wybrać opcję operacje➡import pracowników. + +Zrzut ekranu przedstawiający menu z opcją importu pracowników + +## Kontrola dostępu + +Dostęp do funkcji importu pracowników mają: +- członkowie grupy *wprowadzanie danych* +- superużytkownicy. + +## Przykładowy plik importu + +Przykładowy plik importu można pobrać z serwisu BPP klikając w przycisk "pobierz plik wzorcowy" +znajdujący się w opcji importu pracowników. Plik można równiez pozyskać z repozytorium +kodu źródłowego BPP -- [plik wzorcowy na GitHub](https://github.com/iplweb/bpp/blob/dev/src/import_pracownikow/tests/testdata.xlsx). + +Zrzut ekranu przedstawiający przycisk importu pracowników + +## Warunki importu danych + +Warunkiem importu jest, aby: +- każda jednostka występująca w pliku XLS miała jeden i tylko jeden pasujący po + nazwie odpowiednik po stronie systemu BPP, +- każdy autor występujący w pliku XLS miał jeden i tylko jeden pasujący do niego + odpowiednik, po kodzie ORCID lub po imieniu, nazwisku i tytule. + +Import osób rozwiązany jest w ten sposób, ponieważ: +- format XLS oprogramowania [Egeria](https://egeria.comarch.pl) nie zawiera danych które jednoznacznie identyfikują jednostki, + stąd dopasowanie odbywa się po nazwie. W sytuacji, gdyby w pliku XLS znajdowały się + jednostki o choćby minimalnie róznej nazwie, system mógłby nie dopasować ich i utworzyć nowe + jednostki, +- podobnie z autorami - procedura importu pracowników nie tworzy nowych rekordów dla autorów. W przyszłości + może pojawić się wersja procedury importu dodająca nowe osoby do systemu. + +## Uruchomienie procedury importu po dodaniu pliku + +Aby uruchomić procedure importu danych, wystarczy dodać plik do systemu przy pomocy formularza. + +!!! info + + Po dodaniu pliku i zatwierdzeniu formularza, procedura importu danych + rozpocznie się automatycznie. + + +## Odpinanie nieaktualnych miejsc pracy + +Po zaimportowaniu listy pracowników system prezentuje raport z dokonanych zmian. + +Zrzut ekranu przedstawiający raport ze zmian dokonanych przez procedurę importu + +W sytuacji, gdy w systemie znajdują się osoby, które mają przypisane zatrudnienie w jednostkach, +a miejsca te nie występują w pliku importu danych, system zaproponuje "odpięcie" tych miejsc pracy. +Operacja ta polega na przypisaniu w polu "zakończył pracę" dla danego powiązania Autor+Jednostka +daty poprzedzającej dzień importu danych. Listę tych osób znajdziemy pod raportem z dokonanych zmian: + +Zrzut ekranu przedstawiający listę osób proponowaną przez system do odpięcia + +Powiązania Autor+Jednostka na takiej liście charakteryzują się następującymi cechami: + +- nie wystąpiły w pliku importu - jezeli danego powiązania Autor+Jednostka nie ma w pliku importu, uznane zostanie + ono za nieaktualne. +- powiązanie Autor+Jednostka dotyczy jednostki, która ma zaznaczone + [pole Zarządzaj automatycznie](edycja_jednostka.md#pole-zarządzaj-automatycznie) na `TAK` +- powiazanie Autor+Jednostka nie dotyczy [obcej jednostki](edycja_uczelnia.md#obca-jednostka) + +!!! warning + + W przypadku importowania przez XLS rekordów wyłącznie kilku osób, warto + **nie** korzystać z opcji odpinania nieaktualnych miejsc pracy, gdyż wówczas odepniemy miejsca pracy + praktycznie w całej bazie. + + +!!! note + + procedura "odpinająca" miejsca pracy jest szczególnie przydatna, jeżeli chcemy mieć + zaktualizowane informacje dla pola — por. [Pole *Aktualne miejsce pracy* dla autora](edycja_autor.md#pole-aktualne-miejsce-pracy-dla-autora) + diff --git a/docs/import_pracownikow.rst b/docs/import_pracownikow.rst deleted file mode 100644 index 8bd15b485..000000000 --- a/docs/import_pracownikow.rst +++ /dev/null @@ -1,101 +0,0 @@ -Import pracowników -================== - -Funkcja importu pracowników pozwala zaimportować dane pracowników uczelni -za pomocą pliku w formacie XLS. Domyślnie obsługiwany jest format danych, -który może zostać utworzony przez eksport z oprogramowania Egeria_ . - -Jak uruchomić? --------------- - -Aby uruchomić tą funkcję, należy po zalogowaniu się do serwisu z menu -głównego wybrać opcję operacje➡import pracowników. - -.. image:: images/import_pracownikow/jak_uruchomic.png - :alt: Zrzut ekranu przedstawiający menu z opcją importu pracowników - :width: 50% - -Kontrola dostępu ----------------- - -Dostęp do funkcji importu pracowników mają: - * członkowie grupy *wprowadzanie danych* - * superużytkownicy. - -Przykładowy plik importu ------------------------- - -Przykładowy plik importu można pobrać z serwisu BPP klikając w przycisk "pobierz plik wzorcowy" -znajdujący się w opcji importu pracowników. Plik można równiez pozyskać z repozytorium -kodu źródłowego BPP -- `plik wzorcowy na GitHub`_. - -|Plik wzorcowy| - -.. |Plik wzorcowy| image:: images/import_pracownikow/pobierz_plik_wzorcowy.png - :alt: Zrzut ekranu przedstawiający przycisk importu pracowników - :width: 50% - -Warunki importu danych ----------------------- - -Warunkiem importu jest, aby: - * każda jednostka występująca w pliku XLS miała jeden i tylko jeden pasujący po - nazwie odpowiednik po stronie systemu BPP, - * każdy autor występujący w pliku XLS miał jeden i tylko jeden pasujący do niego - odpowiednik, po kodzie ORCID lub po imieniu, nazwisku i tytule. - -Import osób rozwiązany jest w ten sposób, ponieważ: - * format XLS oprogramowania Egeria_ nie zawiera danych które jednoznacznie identyfikują jednostki, - stąd dopasowanie odbywa się po nazwie. W sytuacji, gdyby w pliku XLS znajdowały się - jednostki o choćby minimalnie róznej nazwie, system mógłby nie dopasować ich i utworzyć nowe - jednostki, - * podobnie z autorami - procedura importu pracowników nie tworzy nowych rekordów dla autorów. W przyszłości - może pojawić się wersja procedury importu dodająca nowe osoby do systemu. - - -Uruchomienie procedury importu po dodaniu pliku ------------------------------------------------ - -Aby uruchomić procedure importu danych, wystarczy dodać plik do systemu przy pomocy formularza. - -.. important:: Po dodaniu pliku i zatwierdzeniu formularza, procedura importu danych - rozpocznie się automatycznie. - -Odpinanie nieaktualnych miejsc pracy --------------------------------------- - -Po zaimportowaniu listy pracowników system prezentuje raport z dokonanych zmian. - -.. image:: images/import_pracownikow/raport_ze_zmian.png - :alt: Zrzut ekranu przedstawiający raport ze zmian dokonanych przez procedurę importu - :width: 70% - -W sytuacji, gdy w systemie znajdują się osoby, które mają przypisane zatrudnienie w jednostkach, -a miejsca te nie występują w pliku importu danych, system zaproponuje "odpięcie" tych miejsc pracy. -Operacja ta polega na przypisaniu w polu "zakończył pracę" dla danego powiązania Autor+Jednostka -daty poprzedzającej dzień importu danych. Listę tych osób znajdziemy pod raportem z dokonanych zmian: - -.. image:: images/import_pracownikow/propozycja_odpiecia.png - :alt: Zrzut ekranu przedstawiający listę osób proponowaną przez system do odpięcia - :width: 70% - -Powiązania Autor+Jednostka na takiej liście charakteryzują się następującymi cechami: - -* nie wystąpiły w pliku importu - jezeli danego powiązania Autor+Jednostka nie ma w pliku importu, uznane zostanie - ono za nieaktualne. - -* powiązanie Autor+Jednostka dotyczy jednostki, która ma zaznaczone - :ref:`pole Zarządzaj automatycznie ` na `TAK` - -* powiazanie Autor+Jednostka nie dotyczy :ref:`obcej jednostki ` - -.. warning:: W przypadku importowania przez XLS rekordów wyłącznie kilku osób, warto - **nie** korzystać z opcji odpinania nieaktualnych miejsc pracy, gdyż wówczas odepniemy miejsca pracy - praktycznie w całej bazie. - - -.. note:: procedura "odpinająca" miejsca pracy jest szczególnie przydatna, jeżeli chcemy mieć - zaktualizowane informacje dla pola -- por. :ref:`Pole *Aktualne miejsce pracy* dla autora` - -.. _Egeria: https://egeria.comarch.pl -.. _plik wzorcowy na GitHub: https://github.com/iplweb/bpp/blob/dev/src/import_pracownikow/tests/testdata.xlsx diff --git a/docs/importer_publikacji.md b/docs/importer_publikacji.md new file mode 100644 index 000000000..718620358 --- /dev/null +++ b/docs/importer_publikacji.md @@ -0,0 +1,234 @@ +# Importer publikacji + +## Wprowadzenie + +Moduł **Importer publikacji** umożliwia import rekordów publikacji do systemu BPP +na podstawie danych pobranych z zewnętrznych źródeł. Import odbywa się w formie +wielokrokowego kreatora (wizarda), który prowadzi użytkownika przez kolejne etapy: +od pobrania danych, przez dopasowanie typu publikacji, źródła i autorów, aż po +utworzenie rekordu w bazie danych. + +Moduł dostępny jest z menu Redagowanie, w pozycji "Import publikacji". + +## Wymagane uprawnienia + +Aby korzystać z importera, użytkownik musi spełniać jeden z warunków: + +- posiadać status **pracownika** (`is_staff = True`), lub +- należeć do grupy **"wprowadzanie danych"**. + +## Dostawcy danych (providerzy) + +System obsługuje import z wielu źródeł danych. Każde źródło nazywane jest +**dostawcą** (providerem). Obecnie dostępni są: + +### CrossRef + +Dostawca **CrossRef** umożliwia import publikacji na podstawie identyfikatora DOI. + +- **Dane wejściowe:** DOI publikacji (np. `10.1234/example.2024`) +- **Sposób działania:** System pobiera metadane publikacji z bazy CrossRef API. + Wymagane jest, aby DOI był wcześniej zbuforowany w tabeli `CrossrefAPICache` + (np. przez wcześniejsze wyszukiwanie w komparatorze). +- **Automatycznie rozpoznawane dane:** + - tytuł, rok, DOI, tom, numer, strony + - autorzy (imię, nazwisko, ORCID) + - nazwa czasopisma lub wydawcy + - ISSN, E-ISSN, ISBN, E-ISBN + - typ publikacji (np. `journal-article`, `book`, `book-chapter`) + - język, abstrakt, słowa kluczowe, URL, licencja + +### BibTeX + +Dostawca **BibTeX** umożliwia import publikacji na podstawie wklejonego kodu BibTeX. + +- **Dane wejściowe:** Kod BibTeX wklejony w pole tekstowe, np.: + + ``` bibtex + @article{klucz2024, + title = {Tytuł publikacji}, + author = {Kowalski, Jan and Nowak, Anna}, + year = {2024}, + journal = {Nazwa Czasopisma}, + doi = {10.1234/example} + } + ``` + +- **Sposób działania:** System parsuje kod BibTeX i wyodrębnia metadane. + Obsługiwane są formaty autorów `Nazwisko, Imię` oraz `Imię Nazwisko`. + Wiele wpisów w jednym bloku BibTeX jest dozwolone, ale importowany jest + **tylko pierwszy wpis**. + +- **Mapowanie typów BibTeX na typy CrossRef:** + + - `article` → `journal-article` + - `book` → `book` + - `inbook`, `incollection` → `book-chapter` + - `inproceedings`, `conference` → `proceedings-article` + - `phdthesis`, `mastersthesis` → `dissertation` + - `proceedings` → `proceedings` + +## Kroki importu + +### Krok 1: Pobranie danych + +Po wybraniu dostawcy i wpisaniu identyfikatora (DOI) lub wklejeniu kodu BibTeX +użytkownik klika przycisk "Pobierz". System: + +1. Waliduje dane wejściowe zgodnie z regułami wybranego dostawcy. +2. Pobiera i normalizuje metadane publikacji. +3. Tworzy **sesję importu** z pobranymi danymi. +4. Automatycznie dopasowuje język publikacji. +5. Automatycznie dopasowuje typ publikacji (charakter formalny) na podstawie + mapowania CrossRef (patrz: konfiguracja Crossref Mapper w instrukcji + administratora). +6. Automatycznie dopasowuje autorów do istniejących rekordów w BPP. +7. Uzupełnia brakujące dyscypliny z danych zgłoszeń publikacji (jeśli istnieje + pasujące zgłoszenie). + +Na stronie głównej importera widoczna jest także lista ostatnich sesji importu +danego użytkownika, umożliwiając kontynuację przerwanych importów. + +### Krok 2: Weryfikacja typu publikacji + +W tym kroku użytkownik weryfikuje i ewentualnie koryguje: + +- **Charakter formalny** -- typ publikacji w systemie BPP (np. artykuł + w czasopiśmie, książka, rozdział). Jeśli dostępne jest mapowanie CrossRef, + pole jest wstępnie wypełnione. +- **Typ KBN** -- klasyfikacja MNiSW. +- **Język** -- język publikacji. +- **Typ wydawnictwa** -- czy jest to wydawnictwo zwarte (książka/rozdział) + czy ciągłe (artykuł w czasopiśmie). + +System automatycznie wykrywa **duplikaty** -- szuka istniejących rekordów +po DOI (z normalizacją) oraz po tytule (dokładne porównanie). Jeśli znaleziono +potencjalne duplikaty, wyświetlane jest ostrzeżenie. Użytkownik może kontynuować +import mimo wykrycia duplikatów. + +### Krok 3: Dopasowanie źródła + +W zależności od typu wydawnictwa: + +**Wydawnictwo ciągłe** (artykuł w czasopiśmie): + +- Wymagane jest wskazanie **źródła** (czasopisma) z bazy BPP. +- System próbuje automatycznie dopasować źródło na podstawie nazwy + czasopisma z danych dostawcy. + +**Wydawnictwo zwarte** (książka, rozdział): + +- Wymagane jest wskazanie **wydawcy** z bazy BPP lub wpisanie opisu wydawcy. +- System próbuje automatycznie dopasować wydawcę na podstawie nazwy + z danych dostawcy. + +### Krok 4: Dopasowanie autorów + +Najważniejszy krok importu. System wyświetla listę autorów z danych dostawcy +wraz z informacją o statusie dopasowania: + +- **Dokładne** (zielony) -- automatyczne dokładne dopasowanie do autora w BPP. +- **Luźne** (żółty) -- automatyczne częściowe dopasowanie (np. skrócone imię). +- **Ręczne** (niebieski) -- dopasowanie wykonane ręcznie przez użytkownika. +- **Niedopasowany** (czerwony) -- brak dopasowania; wymaga interwencji. + +Dla każdego autora wyświetlane są: + +- Imię i nazwisko z danych dostawcy +- ORCID (jeśli dostępny) +- Dopasowany autor, jednostka i dyscyplina w BPP +- Źródło dyscypliny (skąd pochodzi automatycznie wypełniona wartość) + +**Edycja dopasowania autora** + +Kliknięcie ikony ołówka przy autorze rozwija formularz edycji z polami: + +- **Autor w BPP** -- wyszukiwanie autora (autouzupełnianie). +- **Jednostka** -- wyszukiwanie jednostki (autouzupełnianie). +- **Dyscyplina** -- lista rozwijana z dyscyplinami przypisanymi autorowi + na dany rok. + +Po wybraniu autora system automatycznie podpowiada jednostkę i dyscyplinę +na podstawie aktualnych danych w BPP. + +**Źródło dyscypliny** + +Przy automatycznie wypełnionej dyscyplinie system wyświetla informację +o jej pochodzeniu: + +- *(Jedyna dyscyplina autora)* -- autor ma dokładnie jedną dyscyplinę + na rok publikacji w tabeli `Autor_Dyscyplina`. +- *(Z aplikacji zgłoszeń publikacji)* -- dyscyplina pochodzi z pasującego + zgłoszenia publikacji (moduł "Zgłoś publikację"). +- *(Wybór użytkownika)* -- dyscyplina została wybrana ręcznie. + +**Tworzenie autorów dla niedopasowanych** + +Jeśli istnieją niedopasowani autorzy, dostępny jest przycisk +"Utwórz autorów dla niedopasowanych". System: + +1. Sprawdza, czy autor ma ORCID -- jeśli tak i istnieje autor z takim ORCID + w BPP, dopasowuje go. +2. W przeciwnym razie tworzy nowy rekord autora w BPP. +3. Przypisuje wszystkich nowych/dopasowanych autorów do **obcej jednostki** + skonfigurowanej w ustawieniach uczelni. + +!!! note + + Operacja wymaga skonfigurowanej "obcej jednostki" w rekordzie uczelni. + W przypadku jej braku wyświetlany jest komunikat o błędzie. + + +**Ustawianie ORCID** + +Jeśli dostawca dostarczył identyfikator ORCID dla autora, a dopasowany autor +w BPP nie ma jeszcze ORCID, system umożliwia jego ustawienie -- pojedynczo +(przycisk przy autorze) lub grupowo (przycisk "Ustaw ORCIDy"). + +Warunki ustawienia ORCID: + +- Autor importowany ma ORCID od dostawcy. +- Jest dopasowany do autora w BPP. +- Autor w BPP nie ma przypisanego ORCID. +- Ten sam autor BPP nie jest dopasowany wielokrotnie w danej sesji. + +### Krok 5: Przegląd końcowy + +Podsumowanie wszystkich danych przed utworzeniem rekordu: + +- Metadane publikacji (tytuł, rok, DOI, tom, numer, strony itp.) +- Dopasowane źródło lub wydawca +- Lista autorów z jednostkami i dyscyplinami + +Użytkownik potwierdza dane i przechodzi do utworzenia rekordu. + +### Krok 6: Utworzenie rekordu + +System tworzy rekord publikacji w BPP: + +- **Wydawnictwo ciągłe** -- z przypisanym źródłem (czasopismem). +- **Wydawnictwo zwarte** -- z przypisanym wydawcą i danymi ISBN. + +Do rekordu dodawani są wszyscy dopasowani autorzy z odpowiednimi jednostkami, +dyscyplinami i typem odpowiedzialności "autor". Autorzy przypisani do obcej +jednostki oznaczani są jako nieafiliowani. + +Automatycznie uzupełniana jest punktacja na podstawie danych źródła +dla danego roku (jeśli dostępne). + +Rekord otrzymuje adnotację `Dodano przez importer publikacji (nazwa dostawcy)`. + +Po utworzeniu wyświetlana jest strona potwierdzenia z linkiem do edycji +rekordu w module redagowania. + +## Anulowanie importu + +Na każdym etapie importu dostępny jest przycisk "Anuluj", który po potwierdzeniu +oznacza sesję jako anulowaną. Anulowane sesje nie są wyświetlane na liście +ostatnich importów. + +## Kontynuacja przerwanego importu + +Jeśli użytkownik przerwie import (np. zamknie przeglądarkę), może go +kontynuować z listy ostatnich sesji na stronie głównej importera. +Sesja zostanie wznowiona od ostatniego zapisanego kroku. diff --git a/docs/importer_publikacji.rst b/docs/importer_publikacji.rst deleted file mode 100644 index 16309c4cd..000000000 --- a/docs/importer_publikacji.rst +++ /dev/null @@ -1,247 +0,0 @@ -Importer publikacji -------------------- - -Wprowadzenie -============ - -Moduł **Importer publikacji** umożliwia import rekordów publikacji do systemu BPP -na podstawie danych pobranych z zewnętrznych źródeł. Import odbywa się w formie -wielokrokowego kreatora (wizarda), który prowadzi użytkownika przez kolejne etapy: -od pobrania danych, przez dopasowanie typu publikacji, źródła i autorów, aż po -utworzenie rekordu w bazie danych. - -Moduł dostępny jest z menu Redagowanie, w pozycji "Import publikacji". - -Wymagane uprawnienia -==================== - -Aby korzystać z importera, użytkownik musi spełniać jeden z warunków: - -* posiadać status **pracownika** (``is_staff = True``), lub -* należeć do grupy **"wprowadzanie danych"**. - -Dostawcy danych (providerzy) -============================ - -System obsługuje import z wielu źródeł danych. Każde źródło nazywane jest -**dostawcą** (providerem). Obecnie dostępni są: - -CrossRef -~~~~~~~~ - -Dostawca **CrossRef** umożliwia import publikacji na podstawie identyfikatora DOI. - -* **Dane wejściowe:** DOI publikacji (np. ``10.1234/example.2024``) -* **Sposób działania:** System pobiera metadane publikacji z bazy CrossRef API. - Wymagane jest, aby DOI był wcześniej zbuforowany w tabeli ``CrossrefAPICache`` - (np. przez wcześniejsze wyszukiwanie w komparatorze). -* **Automatycznie rozpoznawane dane:** - - - tytuł, rok, DOI, tom, numer, strony - - autorzy (imię, nazwisko, ORCID) - - nazwa czasopisma lub wydawcy - - ISSN, E-ISSN, ISBN, E-ISBN - - typ publikacji (np. ``journal-article``, ``book``, ``book-chapter``) - - język, abstrakt, słowa kluczowe, URL, licencja - -BibTeX -~~~~~~ - -Dostawca **BibTeX** umożliwia import publikacji na podstawie wklejonego kodu BibTeX. - -* **Dane wejściowe:** Kod BibTeX wklejony w pole tekstowe, np.: - - .. code-block:: bibtex - - @article{klucz2024, - title = {Tytuł publikacji}, - author = {Kowalski, Jan and Nowak, Anna}, - year = {2024}, - journal = {Nazwa Czasopisma}, - doi = {10.1234/example} - } - -* **Sposób działania:** System parsuje kod BibTeX i wyodrębnia metadane. - Obsługiwane są formaty autorów ``Nazwisko, Imię`` oraz ``Imię Nazwisko``. - Wiele wpisów w jednym bloku BibTeX jest dozwolone, ale importowany jest - **tylko pierwszy wpis**. -* **Mapowanie typów BibTeX na typy CrossRef:** - - - ``article`` → ``journal-article`` - - ``book`` → ``book`` - - ``inbook``, ``incollection`` → ``book-chapter`` - - ``inproceedings``, ``conference`` → ``proceedings-article`` - - ``phdthesis``, ``mastersthesis`` → ``dissertation`` - - ``proceedings`` → ``proceedings`` - -Kroki importu -============= - -Krok 1: Pobranie danych -~~~~~~~~~~~~~~~~~~~~~~~~ - -Po wybraniu dostawcy i wpisaniu identyfikatora (DOI) lub wklejeniu kodu BibTeX -użytkownik klika przycisk "Pobierz". System: - -1. Waliduje dane wejściowe zgodnie z regułami wybranego dostawcy. -2. Pobiera i normalizuje metadane publikacji. -3. Tworzy **sesję importu** z pobranymi danymi. -4. Automatycznie dopasowuje język publikacji. -5. Automatycznie dopasowuje typ publikacji (charakter formalny) na podstawie - mapowania CrossRef (patrz: konfiguracja Crossref Mapper w instrukcji - administratora). -6. Automatycznie dopasowuje autorów do istniejących rekordów w BPP. -7. Uzupełnia brakujące dyscypliny z danych zgłoszeń publikacji (jeśli istnieje - pasujące zgłoszenie). - -Na stronie głównej importera widoczna jest także lista ostatnich sesji importu -danego użytkownika, umożliwiając kontynuację przerwanych importów. - -Krok 2: Weryfikacja typu publikacji -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -W tym kroku użytkownik weryfikuje i ewentualnie koryguje: - -* **Charakter formalny** -- typ publikacji w systemie BPP (np. artykuł - w czasopiśmie, książka, rozdział). Jeśli dostępne jest mapowanie CrossRef, - pole jest wstępnie wypełnione. -* **Typ KBN** -- klasyfikacja MNiSW. -* **Język** -- język publikacji. -* **Typ wydawnictwa** -- czy jest to wydawnictwo zwarte (książka/rozdział) - czy ciągłe (artykuł w czasopiśmie). - -System automatycznie wykrywa **duplikaty** -- szuka istniejących rekordów -po DOI (z normalizacją) oraz po tytule (dokładne porównanie). Jeśli znaleziono -potencjalne duplikaty, wyświetlane jest ostrzeżenie. Użytkownik może kontynuować -import mimo wykrycia duplikatów. - -Krok 3: Dopasowanie źródła -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -W zależności od typu wydawnictwa: - -**Wydawnictwo ciągłe** (artykuł w czasopiśmie): - -* Wymagane jest wskazanie **źródła** (czasopisma) z bazy BPP. -* System próbuje automatycznie dopasować źródło na podstawie nazwy - czasopisma z danych dostawcy. - -**Wydawnictwo zwarte** (książka, rozdział): - -* Wymagane jest wskazanie **wydawcy** z bazy BPP lub wpisanie opisu wydawcy. -* System próbuje automatycznie dopasować wydawcę na podstawie nazwy - z danych dostawcy. - -Krok 4: Dopasowanie autorów -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Najważniejszy krok importu. System wyświetla listę autorów z danych dostawcy -wraz z informacją o statusie dopasowania: - -* **Dokładne** (zielony) -- automatyczne dokładne dopasowanie do autora w BPP. -* **Luźne** (żółty) -- automatyczne częściowe dopasowanie (np. skrócone imię). -* **Ręczne** (niebieski) -- dopasowanie wykonane ręcznie przez użytkownika. -* **Niedopasowany** (czerwony) -- brak dopasowania; wymaga interwencji. - -Dla każdego autora wyświetlane są: - -* Imię i nazwisko z danych dostawcy -* ORCID (jeśli dostępny) -* Dopasowany autor, jednostka i dyscyplina w BPP -* Źródło dyscypliny (skąd pochodzi automatycznie wypełniona wartość) - -**Edycja dopasowania autora** - -Kliknięcie ikony ołówka przy autorze rozwija formularz edycji z polami: - -* **Autor w BPP** -- wyszukiwanie autora (autouzupełnianie). -* **Jednostka** -- wyszukiwanie jednostki (autouzupełnianie). -* **Dyscyplina** -- lista rozwijana z dyscyplinami przypisanymi autorowi - na dany rok. - -Po wybraniu autora system automatycznie podpowiada jednostkę i dyscyplinę -na podstawie aktualnych danych w BPP. - -**Źródło dyscypliny** - -Przy automatycznie wypełnionej dyscyplinie system wyświetla informację -o jej pochodzeniu: - -* *(Jedyna dyscyplina autora)* -- autor ma dokładnie jedną dyscyplinę - na rok publikacji w tabeli ``Autor_Dyscyplina``. -* *(Z aplikacji zgłoszeń publikacji)* -- dyscyplina pochodzi z pasującego - zgłoszenia publikacji (moduł "Zgłoś publikację"). -* *(Wybór użytkownika)* -- dyscyplina została wybrana ręcznie. - -**Tworzenie autorów dla niedopasowanych** - -Jeśli istnieją niedopasowani autorzy, dostępny jest przycisk -"Utwórz autorów dla niedopasowanych". System: - -1. Sprawdza, czy autor ma ORCID -- jeśli tak i istnieje autor z takim ORCID - w BPP, dopasowuje go. -2. W przeciwnym razie tworzy nowy rekord autora w BPP. -3. Przypisuje wszystkich nowych/dopasowanych autorów do **obcej jednostki** - skonfigurowanej w ustawieniach uczelni. - -.. note:: - Operacja wymaga skonfigurowanej "obcej jednostki" w rekordzie uczelni. - W przypadku jej braku wyświetlany jest komunikat o błędzie. - -**Ustawianie ORCID** - -Jeśli dostawca dostarczył identyfikator ORCID dla autora, a dopasowany autor -w BPP nie ma jeszcze ORCID, system umożliwia jego ustawienie -- pojedynczo -(przycisk przy autorze) lub grupowo (przycisk "Ustaw ORCIDy"). - -Warunki ustawienia ORCID: - -* Autor importowany ma ORCID od dostawcy. -* Jest dopasowany do autora w BPP. -* Autor w BPP nie ma przypisanego ORCID. -* Ten sam autor BPP nie jest dopasowany wielokrotnie w danej sesji. - -Krok 5: Przegląd końcowy -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Podsumowanie wszystkich danych przed utworzeniem rekordu: - -* Metadane publikacji (tytuł, rok, DOI, tom, numer, strony itp.) -* Dopasowane źródło lub wydawca -* Lista autorów z jednostkami i dyscyplinami - -Użytkownik potwierdza dane i przechodzi do utworzenia rekordu. - -Krok 6: Utworzenie rekordu -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -System tworzy rekord publikacji w BPP: - -* **Wydawnictwo ciągłe** -- z przypisanym źródłem (czasopismem). -* **Wydawnictwo zwarte** -- z przypisanym wydawcą i danymi ISBN. - -Do rekordu dodawani są wszyscy dopasowani autorzy z odpowiednimi jednostkami, -dyscyplinami i typem odpowiedzialności "autor". Autorzy przypisani do obcej -jednostki oznaczani są jako nieafiliowani. - -Automatycznie uzupełniana jest punktacja na podstawie danych źródła -dla danego roku (jeśli dostępne). - -Rekord otrzymuje adnotację ``Dodano przez importer publikacji (nazwa dostawcy)``. - -Po utworzeniu wyświetlana jest strona potwierdzenia z linkiem do edycji -rekordu w module redagowania. - -Anulowanie importu -================== - -Na każdym etapie importu dostępny jest przycisk "Anuluj", który po potwierdzeniu -oznacza sesję jako anulowaną. Anulowane sesje nie są wyświetlane na liście -ostatnich importów. - -Kontynuacja przerwanego importu -================================ - -Jeśli użytkownik przerwie import (np. zamknie przeglądarkę), może go -kontynuować z listy ostatnich sesji na stronie głównej importera. -Sesja zostanie wznowiona od ostatniego zapisanego kroku. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..92a5fff07 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,28 @@ +# Bibliografia Publikacji Pracowników + +System informatyczny do zarządzania bibliografią publikacji pracowników +naukowych. Oprogramowanie przeznaczone jest dla bibliotek naukowych +i uniwersyteckich w Polsce. + +Oprogramowanie dystrybuowane jest na zasadach otwartoźródłowej +[licencji MIT](https://pl.wikipedia.org/wiki/Licencja_MIT). Repozytorium +projektu: [github.com/iplweb/bpp](https://github.com/iplweb/bpp). + +## O dokumentacji + +Niniejsza dokumentacja podzielona jest na sekcje: + +- **Instrukcja użytkownika** — opisuje codzienne czynności redakcyjne + ([edycja uczelni](edycja_uczelnia.md), [jednostek](edycja_jednostka.md), + [autorów](edycja_autor.md), [wydawnictw](edycja_wydawnictwo.md)) + oraz [wyszukiwanie i redagowanie](wyszukiwanie_redagowanie.md). +- **Instrukcja administratora** — konfiguracja + ([ogólna](usage_admin.md), [PBN](konfiguracja_pbn.md)), importy + ([publikacji](importer_publikacji.md), [pracowników](import_pracownikow.md)) + oraz moduł [zgłaszania publikacji](zglos_publikacje.md). +- **Funkcje zaawansowane** — + [raporty i rankingi](raporty_rankingi.md), [sloty](sloty.md), + [integracja z PBN](pbn.md), [konfiguracja zaawansowana](advanced.md). +- **API i rozwój** — [API REST](api.md), [rozwijanie projektu](contributing.md). +- **Informacje o projekcie** — [autorzy](authors.md), + [historia zmian](history.md). diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 0c2560693..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,72 +0,0 @@ -Witamy w dokumentacji systemu Bibliografia Publikacji Pracowników -================================================================= - -Contents: - -Wprowadzenie -============ - -.. toctree:: - :maxdepth: 2 - - readme - -Instrukcja użytkownika -====================== - -.. toctree:: - :maxdepth: 2 - - edycja_uczelnia - edycja_jednostka - edycja_autor - edycja_wydawnictwo - wyszukiwanie_redagowanie - -Instrukcja administratora -========================= - -.. toctree:: - :maxdepth: 2 - - usage_admin - importer_publikacji - zglos_publikacje - konfiguracja_pbn - import_pracownikow - -Funkcje zaawansowane -==================== - -.. toctree:: - :maxdepth: 2 - - raporty_rankingi - sloty - pbn - advanced - -API i rozwój -============= - -.. toctree:: - :maxdepth: 2 - - api - contributing - -Informacje o projekcie -====================== - -.. toctree:: - :maxdepth: 2 - - authors - history - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/konfiguracja_pbn.md b/docs/konfiguracja_pbn.md new file mode 100644 index 000000000..28cc8f5c9 --- /dev/null +++ b/docs/konfiguracja_pbn.md @@ -0,0 +1,184 @@ +# Konfiguracja integracji z serwisami PBN + +System BPP oferuje integrację z Polską Bibliografią Naukową (PBN), umożliwiając automatyczne +wysyłanie publikacji do PBN oraz pobieranie danych ze źródeł PBN. Niniejsza dokumentacja +przedstawia sposób konfiguracji tej integracji przez panel administracyjny. + +## Wymagania wstępne + +Przed rozpoczęciem konfiguracji należy: + +1. Posiadać konto w systemie PBN z uprawnieniami Importer Publikacji. +2. Założyć aplikację w systemie PBN - z konta z poziomem uprawnień Menedżer Aplikacji - i otrzymać dane dostępowe: + - **Identyfikator aplikacji** (App ID) + - **Token aplikacji** (App Token) +3. Mieć uprawnienia administratora w systemie BPP aby skonfigurować dostęp do PBN w systemie BPP + +## Dostęp do konfiguracji + +Konfigurację integracji z PBN wykonuje się w module Redagowania: + +1. Zaloguj się do panelu administracyjnego BPP +2. Przejdź do sekcji **BPP** +3. Wybierz z górnej belki menu **Struktura** a następnie **Uczelnia (Instytut)** +4. Kliknij na nazwę swojej instytucji, aby edytować jej ustawienia +5. Przewiń do sekcji **Konfiguracja PBN** + +## Konfiguracja parametrów PBN + +W formularzu edycji uczelni/instytucji znajdziesz następujące pola związane z integracją PBN: + +### Podstawowe ustawienia API + +**Adres API w PBN** +- **Pole:** `pbn_api_root` +- **Domyślna wartość:** `https://pbn-micro-alpha.opi.org.pl` +- **Opis:** Adres serwera testowego API PBN. W wersji produkcyjnej należy ustawić `https://pbn.nauka.gov.pl/` +- **Format:** Pełny adres URL (np. `https://pbn-micro-alpha.opi.org.pl`) + +**Nazwa aplikacji w PBN** +- **Pole:** `pbn_app_name` +- **Wymagane:** Tak +- **Opis:** Identyfikator aplikacji otrzymany przy rejestracji w PBN +- **Maksymalna długość:** 128 znaków + +**Token aplikacji w PBN** +- **Pole:** `pbn_app_token` +- **Wymagane:** Tak +- **Opis:** Token bezpieczeństwa aplikacji otrzymany z PBN +- **Maksymalna długość:** 128 znaków +- **Uwaga:** Pole to zawiera dane poufne + +**Odpowiednik w PBN** +- **Pole:** `pbn_uid` +- **Opis:** Instytucja w bazie PBN odpowiadająca Twojej uczelni +- **Uwaga:** Pole to zostanie automatycznie wypełnione po zaimportowaniu danych instytucji z PBN + +Opcje eksportu danych +-------------------- + +**Kasuj oświadczenia rekordu przed wysłaniem do PBN** +- **Pole:** `pbn_api_kasuj_przed_wysylka` +- **Domyślnie:** Nie zaznaczone +- **Opis:** Gdy zaznaczone, system usunie wszystkie istniejące oświadczenia publikacji w PBN przed przesłaniem nowych danych + +**Nie wysyłaj do PBN prac z punktami MNISW = 0** +- **Pole:** `pbn_api_nie_wysylaj_prac_bez_pk` +- **Domyślnie:** Nie zaznaczone +- **Opis:** Blokuje wysyłanie do PBN publikacji bez punktów MNiSW + +**Wysyłaj prace bez oświadczeń** +- **Pole:** `pbn_wysylaj_bez_oswiadczen` +- **Domyślnie:** Nie zaznaczone +- **Opis:** Umożliwia wysyłanie do PBN publikacji bez oświadczeń dyscyplinowych. Takie publikacje trafiają do repozytorium PBN zamiast do systemu ewaluacyjnego i nie zawierają informacji o dyscyplinach naukowych autorów + +**Wysyłaj zawsze PBN UID uczelni jako afiliację** +- **Pole:** `pbn_api_afiliacja_zawsze_na_uczelnie` +- **Domyślnie:** Zaznaczone +- **Opis:** Gdy zaznaczone, wszystkie publikacje będą afiliowane do uczelni, a nie do konkretnych jednostek organizacyjnych; + zachowanie to jest obecnie domyślne - pole używane było w czasach, gdy publikacja mogła być afiliowana na konkretną + jednostkę uczelni/instytucji w PBN (na Klinikę, Dział, Katedrę itp...). + +**Użytkownik BPP dla PBN API** +- **Pole:** `pbn_api_user` +- **Opis:** Użytkownik systemu BPP odpowiedzialny za automatyczne operacje z PBN wykonywane przez procesy systemowe +- **Uwaga:** Ten użytkownik musi wykonać autoryzację w PBN, aby umożliwić automatyczne operacje (w tle) + +## Zapisywanie konfiguracji + +Po wypełnieniu wszystkich wymaganych pól: + +1. Sprawdź poprawność wprowadzonych danych +2. Kliknij **Zapisz** u dołu formularza +3. System wyświetli komunikat potwierdzający zapisanie zmian + +## Autoryzacja w systemie PBN + +Po skonfigurowaniu podstawowych parametrów należy wykonać autoryzację: + +1. Przejdź do głównej strony systemu BPP +2. W menu wybierz **Operacje** → **Autoryzuj w PBN** +3. System przekieruje Cię do strony logowania PBN +4. Zaloguj się używając swoich danych dostępowych PBN +5. Potwierdź udzielenie uprawnień aplikacji BPP +6. Zostaniesz automatycznie przekierowany z powrotem do BPP + +Po pomyślnej autoryzacji system będzie mógł komunikować się z PBN w Twoim imieniu. + +## Weryfikacja konfiguracji + +Aby sprawdzić czy konfiguracja działa prawidłowo: + +1. W panelu administracyjnym przejdź do **PBN API** → **Instytucje** +2. Jeśli lista nie jest pusta, oznacza to, że komunikacja z PBN działa +3. Sprawdź czy w polu **Odpowiednik w PBN** w ustawieniach uczelni została automatycznie wybrana odpowiednia instytucja + +## Import danych słownikowych + +Po skonfigurowaniu integracji zaleca się import podstawowych danych słownikowych z PBN: + +1. Przejdź do **Operacje** → **Import danych PBN** +2. Wybierz **Importuj dyscypliny i punkty źródeł** +3. System automatycznie pobierze aktualne słowniki z PBN + +## Typowe problemy i rozwiązania + +**Problem:** Komunikat "Brak nazwy aplikacji dla API PBN" +- **Rozwiązanie:** Wypełnij pole "Nazwa aplikacji w PBN" w ustawieniach uczelni + +**Problem:** Komunikat "Brak tokena aplikacji dla API PBN" +- **Rozwiązanie:** Wypełnij pole "Token aplikacji w PBN" w ustawieniach uczelni + +**Problem:** Komunikat "Token aplikacji PBN nieprawidłowy" +- **Rozwiązanie:** Sprawdź poprawność skopiowanego tokena w PBN, upewnij się że nie ma dodatkowych spacji + +**Problem:** Komunikat "Najpierw wykonaj autoryzację w PBN API" +- **Rozwiązanie:** Wykonaj proces autoryzacji opisany w sekcji "Autoryzacja w systemie PBN" + +**Problem:** Brak możliwości wysyłania publikacji do PBN +- **Rozwiązanie:** Upewnij się, że pole "Odpowiednik w PBN" jest wypełnione i że wykonano autoryzację użytkownika + +## Operacje na publikacjach + +Po skonfigurowaniu integracji możesz: + +**Wysyłać pojedyncze publikacje do PBN:** +1. Otwórz publikację w panelu administracyjnym +2. Użyj przycisku **Wyślij do PBN** (jeśli dostępny) +3. System automatycznie wyśle publikację i pobierze z powrotem dane wraz z PBN UID + +**Importować dane publikacji z PBN:** +- System może automatycznie pobierać informacje o publikacjach już istniejących w PBN +- Możliwe jest też pobieranie abstraktów i innych metadanych + +**Zarządzać oświadczeniami dyscyplin:** +- System automatycznie wysyła oświadczenia dotyczące dyscyplin naukowych autorów +- Możliwa jest również wysyłka samych oświadczeń bez całej publikacji + +## Bezpieczeństwo danych + +**Ważne informacje dotyczące bezpieczeństwa:** + +- Token aplikacji PBN jest informacją poufną - nie udostępniaj go osobom trzecim +- System automatycznie szyfruje i zabezpiecza dane dostępowe +- Wszystkie operacje z PBN są logowane w systemie +- W przypadku podejrzenia naruszenia bezpieczeństwa natychmiast zmień token w systemie PBN + +**Zalecenia:** + +- Regularnie sprawdzaj logi operacji PBN w panelu administracyjnym +- Monitoruj powiadomienia systemowe dotyczące integracji z PBN +- W razie problemów skontaktuj się z administratorem systemu + +## Wsparcie techniczne + +W przypadku problemów z konfiguracją integracji PBN: + +1. Skonsultuj się z administratorem swojego systemu BPP +2. W przypadku problemów po stronie PBN skontaktuj się z pomocą techniczną PBN (Helpdesk) +3. Dla błędów systemowych BPP zgłoś problem do zespołu rozwoju systemu + +## Dodatkowe zasoby + +- Dokumentacja użytkownika PBN dostępna na stronie: +- Pomoc techniczna PBN: kontakt dostępny przez stronę PBN diff --git a/docs/konfiguracja_pbn.rst b/docs/konfiguracja_pbn.rst deleted file mode 100644 index 7d8d15528..000000000 --- a/docs/konfiguracja_pbn.rst +++ /dev/null @@ -1,201 +0,0 @@ -======================================= -Konfiguracja integracji z serwisami PBN -======================================= - -System BPP oferuje integrację z Polską Bibliografią Naukową (PBN), umożliwiając automatyczne -wysyłanie publikacji do PBN oraz pobieranie danych ze źródeł PBN. Niniejsza dokumentacja -przedstawia sposób konfiguracji tej integracji przez panel administracyjny. - -Wymagania wstępne -================= - -Przed rozpoczęciem konfiguracji należy: - -1. Posiadać konto w systemie PBN z uprawnieniami Importer Publikacji. -2. Założyć aplikację w systemie PBN - z konta z poziomem uprawnień Menedżer Aplikacji - i otrzymać dane dostępowe: - - - **Identyfikator aplikacji** (App ID) - - **Token aplikacji** (App Token) - -3. Mieć uprawnienia administratora w systemie BPP aby skonfigurować dostęp do PBN w systemie BPP - -Dostęp do konfiguracji -====================== - -Konfigurację integracji z PBN wykonuje się w module Redagowania: - -1. Zaloguj się do panelu administracyjnego BPP -2. Przejdź do sekcji **BPP** -3. Wybierz z górnej belki menu **Struktura** a następnie **Uczelnia (Instytut)** -4. Kliknij na nazwę swojej instytucji, aby edytować jej ustawienia -5. Przewiń do sekcji **Konfiguracja PBN** - -Konfiguracja parametrów PBN -=========================== - -W formularzu edycji uczelni/instytucji znajdziesz następujące pola związane z integracją PBN: - -Podstawowe ustawienia API -------------------------- - -**Adres API w PBN** - - **Pole:** ``pbn_api_root`` - - **Domyślna wartość:** ``https://pbn-micro-alpha.opi.org.pl`` - - **Opis:** Adres serwera testowego API PBN. W wersji produkcyjnej należy ustawić ``https://pbn.nauka.gov.pl/`` - - **Format:** Pełny adres URL (np. ``https://pbn-micro-alpha.opi.org.pl``) - -**Nazwa aplikacji w PBN** - - **Pole:** ``pbn_app_name`` - - **Wymagane:** Tak - - **Opis:** Identyfikator aplikacji otrzymany przy rejestracji w PBN - - **Maksymalna długość:** 128 znaków - -**Token aplikacji w PBN** - - **Pole:** ``pbn_app_token`` - - **Wymagane:** Tak - - **Opis:** Token bezpieczeństwa aplikacji otrzymany z PBN - - **Maksymalna długość:** 128 znaków - - **Uwaga:** Pole to zawiera dane poufne - -**Odpowiednik w PBN** - - **Pole:** ``pbn_uid`` - - **Opis:** Instytucja w bazie PBN odpowiadająca Twojej uczelni - - **Uwaga:** Pole to zostanie automatycznie wypełnione po zaimportowaniu danych instytucji z PBN - -Opcje eksportu danych --------------------- - -**Kasuj oświadczenia rekordu przed wysłaniem do PBN** - - **Pole:** ``pbn_api_kasuj_przed_wysylka`` - - **Domyślnie:** Nie zaznaczone - - **Opis:** Gdy zaznaczone, system usunie wszystkie istniejące oświadczenia publikacji w PBN przed przesłaniem nowych danych - -**Nie wysyłaj do PBN prac z punktami MNISW = 0** - - **Pole:** ``pbn_api_nie_wysylaj_prac_bez_pk`` - - **Domyślnie:** Nie zaznaczone - - **Opis:** Blokuje wysyłanie do PBN publikacji bez punktów MNiSW - -**Wysyłaj prace bez oświadczeń** - - **Pole:** ``pbn_wysylaj_bez_oswiadczen`` - - **Domyślnie:** Nie zaznaczone - - **Opis:** Umożliwia wysyłanie do PBN publikacji bez oświadczeń dyscyplinowych. Takie publikacje trafiają do repozytorium PBN zamiast do systemu ewaluacyjnego i nie zawierają informacji o dyscyplinach naukowych autorów - -**Wysyłaj zawsze PBN UID uczelni jako afiliację** - - **Pole:** ``pbn_api_afiliacja_zawsze_na_uczelnie`` - - **Domyślnie:** Zaznaczone - - **Opis:** Gdy zaznaczone, wszystkie publikacje będą afiliowane do uczelni, a nie do konkretnych jednostek organizacyjnych; - zachowanie to jest obecnie domyślne - pole używane było w czasach, gdy publikacja mogła być afiliowana na konkretną - jednostkę uczelni/instytucji w PBN (na Klinikę, Dział, Katedrę itp...). - -**Użytkownik BPP dla PBN API** - - **Pole:** ``pbn_api_user`` - - **Opis:** Użytkownik systemu BPP odpowiedzialny za automatyczne operacje z PBN wykonywane przez procesy systemowe - - **Uwaga:** Ten użytkownik musi wykonać autoryzację w PBN, aby umożliwić automatyczne operacje (w tle) - -Zapisywanie konfiguracji -======================== - -Po wypełnieniu wszystkich wymaganych pól: - -1. Sprawdź poprawność wprowadzonych danych -2. Kliknij **Zapisz** u dołu formularza -3. System wyświetli komunikat potwierdzający zapisanie zmian - -Autoryzacja w systemie PBN -=========================== - -Po skonfigurowaniu podstawowych parametrów należy wykonać autoryzację: - -1. Przejdź do głównej strony systemu BPP -2. W menu wybierz **Operacje** → **Autoryzuj w PBN** -3. System przekieruje Cię do strony logowania PBN -4. Zaloguj się używając swoich danych dostępowych PBN -5. Potwierdź udzielenie uprawnień aplikacji BPP -6. Zostaniesz automatycznie przekierowany z powrotem do BPP - -Po pomyślnej autoryzacji system będzie mógł komunikować się z PBN w Twoim imieniu. - -Weryfikacja konfiguracji -======================== - -Aby sprawdzić czy konfiguracja działa prawidłowo: - -1. W panelu administracyjnym przejdź do **PBN API** → **Instytucje** -2. Jeśli lista nie jest pusta, oznacza to, że komunikacja z PBN działa -3. Sprawdź czy w polu **Odpowiednik w PBN** w ustawieniach uczelni została automatycznie wybrana odpowiednia instytucja - -Import danych słownikowych -========================== - -Po skonfigurowaniu integracji zaleca się import podstawowych danych słownikowych z PBN: - -1. Przejdź do **Operacje** → **Import danych PBN** -2. Wybierz **Importuj dyscypliny i punkty źródeł** -3. System automatycznie pobierze aktualne słowniki z PBN - -Typowe problemy i rozwiązania -============================= - -**Problem:** Komunikat "Brak nazwy aplikacji dla API PBN" - - **Rozwiązanie:** Wypełnij pole "Nazwa aplikacji w PBN" w ustawieniach uczelni - -**Problem:** Komunikat "Brak tokena aplikacji dla API PBN" - - **Rozwiązanie:** Wypełnij pole "Token aplikacji w PBN" w ustawieniach uczelni - -**Problem:** Komunikat "Token aplikacji PBN nieprawidłowy" - - **Rozwiązanie:** Sprawdź poprawność skopiowanego tokena w PBN, upewnij się że nie ma dodatkowych spacji - -**Problem:** Komunikat "Najpierw wykonaj autoryzację w PBN API" - - **Rozwiązanie:** Wykonaj proces autoryzacji opisany w sekcji "Autoryzacja w systemie PBN" - -**Problem:** Brak możliwości wysyłania publikacji do PBN - - **Rozwiązanie:** Upewnij się, że pole "Odpowiednik w PBN" jest wypełnione i że wykonano autoryzację użytkownika - -Operacje na publikacjach -========================= - -Po skonfigurowaniu integracji możesz: - -**Wysyłać pojedyncze publikacje do PBN:** - 1. Otwórz publikację w panelu administracyjnym - 2. Użyj przycisku **Wyślij do PBN** (jeśli dostępny) - 3. System automatycznie wyśle publikację i pobierze z powrotem dane wraz z PBN UID - -**Importować dane publikacji z PBN:** - - System może automatycznie pobierać informacje o publikacjach już istniejących w PBN - - Możliwe jest też pobieranie abstraktów i innych metadanych - -**Zarządzać oświadczeniami dyscyplin:** - - System automatycznie wysyła oświadczenia dotyczące dyscyplin naukowych autorów - - Możliwa jest również wysyłka samych oświadczeń bez całej publikacji - -Bezpieczeństwo danych -===================== - -**Ważne informacje dotyczące bezpieczeństwa:** - -- Token aplikacji PBN jest informacją poufną - nie udostępniaj go osobom trzecim -- System automatycznie szyfruje i zabezpiecza dane dostępowe -- Wszystkie operacje z PBN są logowane w systemie -- W przypadku podejrzenia naruszenia bezpieczeństwa natychmiast zmień token w systemie PBN - -**Zalecenia:** - -- Regularnie sprawdzaj logi operacji PBN w panelu administracyjnym -- Monitoruj powiadomienia systemowe dotyczące integracji z PBN -- W razie problemów skontaktuj się z administratorem systemu - -Wsparcie techniczne -=================== - -W przypadku problemów z konfiguracją integracji PBN: - -1. Skonsultuj się z administratorem swojego systemu BPP -2. W przypadku problemów po stronie PBN skontaktuj się z pomocą techniczną PBN (Helpdesk) -3. Dla błędów systemowych BPP zgłoś problem do zespołu rozwoju systemu - -Dodatkowe zasoby -================ - -- Dokumentacja użytkownika PBN dostępna na stronie: https://pbn.nauka.gov.pl -- Pomoc techniczna PBN: kontakt dostępny przez stronę PBN diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 671a70a49..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,242 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\amms_planop2xls.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\amms_planop2xls.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/docs/pbn.md b/docs/pbn.md new file mode 100644 index 000000000..01eb6e0d0 --- /dev/null +++ b/docs/pbn.md @@ -0,0 +1,83 @@ +# Integracja z PBN API - dla adminsitratora + +1. Celem uzyskania dostępu do PBN API, należy po stronie PBN z użytkownika mającego + rolę "Menadżer aplikacji" utworzyć aplikację o danym identyfikatorze (np. "BPP") oraz + token dla tej aplikacji. W serwisie testowym po zalogowaniu można te dane podejrzeć + pod adresem + +2. Adres zwrotny ("callback") dla aplikacji należy ustawić jako + +3. Identyfikator i token aplikacji należy wpisać do ustawień obiektu Uczelnia w module + "Redagowanie" (Redagowanie -\> Struktura -\> Uczelnia -\> zakładka "PBN API") + +4. Podczas edycji powyższych ustawień należy zwrócić uwagę na adres PBN API, + dla serwisu testowego w momencie tworzenia niniejszej dokumentacji jest to + domyślnie . Jeżeli korzystamy z wersji + produkcyjnej to należy ten adres zaktualizować. + +5. Integrację z PBN API kontrolują dwa ustawienia obiektu "Uczelnia". + + - "integracja z PBN API": gdy zaznaczone, system będzie cyklicznie pobierał + informacje z PBNu do bazy BPP; dane te można obejrzeć w module redagowania + oraz użyć ich do ręcznego ustawiania odpowiedników PBN dla rekordów z BPP + - "aktualizuj rekordy w PBN na bieżąco": to ustawienie sprawia, że po zapisywaniu + rekordów w BPP są one na bieżąco wysyłane do PBN. W chwili tworzenia niniejszej + dokumentacji ta opcja może nieco spowolnić zapisywanie rekordów w module redagowania, + gdyż system każdorazowo wysyła dane do PBN i czeka na potwierdzenie. W przypadku + niepowodzenia użytkownik dostaje adekwatny komunikat, ale brak dostępności serwerów + PBN czy prowadzone na nich prace serwisowe nie powinien mieć wpływu na edycję bazy + BPP + +6. Dla integracji z PBN warto podać również konto użytkownika BPP które będzie używane + do celów wgrywania danych na serwer - pod warunkiem, że ów użytkownik wcześniej + zaloguje się do BPP i dokona autoryzacji swojego konta w PBN API. + +7. Rekordy publikacji aby były dodane do PBN musza spełniać następujące warunki: + + - określony DOI lub strona WWW, + - charakter formalny musi mieć określony rodzaj dla PBN, + - język musi mieć określony odpowiednik dla PBN, + - jednostki muszą mieć określony odpowiednik dla PBN, + - zrodlo musi mieć okreslony odpowiednik dla PBN, + - wydawca musi mieć określony odpowiednik dla PBN, + - autorzy mogą lecz nie muszą mieć określony odpowiednik dla PBN, + - autorzy powinni mieć uzupełnione numery ORCID, + - autorzy muszą mieć przypisaną dyscyplinę naukową (w przypadku wysyłania prac z oświadczeniami). + +8. System umożliwia także wysyłanie prac **bez oświadczeń** do PBN. Takie prace są wysyłane + do repozytorium PBN i nie zawierają informacji o dyscyplinach naukowych autorów. + Prace bez oświadczeń wysyła się identycznie jak prace z oświadczeniami - z poziomu + panelu Redagowania systemu BPP. Użytkownik otrzymuje informację o tym, że praca została + wysłana bez oświadczeń. + + Możliwość wysyłki prac bez oświadczeń zależy od **konfiguracji systemu** - należy + ją włączyć w panelu Redagowania, w zakładce Struktura → Uczelnia/Instytut, w sekcji + ustawień PBN API. + +## Wgrywanie wyłącznie opłat do PBN przez API + +Pojedyncze rekordy: + +``` shell +bpp-manage.py pbn_client upload_publication_fee pub:wydawnictwo_ciagle:{id rekordu} +``` + +Wszystkie rekordy: + +``` shell +bpp-manage.py pbn_upload_fees +``` + +!!! note + + Procedura `pbn_upload_fees` w przypadku wgrywania informacji o płatnościach + dla publikacji która nigdy nie była wcześniej wgrywana do PBN (nie posiada numeru + PBN UID czyli "odpowiednika PBN") wgra taką pracę na serwer. + + +## Kody błędów + +Podczas synchronizacji z PBN mogą wystąpić m.in. następujące wyjątki: + +- PraceSerwisoweException: po stronie PBN trwają prace serwisowe - zamiast odpowiedzi API + w formacie JSON, serwer PBN zwraca stronę błędu z pszczółkami, diff --git a/docs/pbn.rst b/docs/pbn.rst deleted file mode 100644 index 82d3c91d2..000000000 --- a/docs/pbn.rst +++ /dev/null @@ -1,85 +0,0 @@ -Integracja z PBN API - dla adminsitratora -========================================= - -#. Celem uzyskania dostępu do PBN API, należy po stronie PBN z użytkownika mającego - rolę "Menadżer aplikacji" utworzyć aplikację o danym identyfikatorze (np. "BPP") oraz - token dla tej aplikacji. W serwisie testowym po zalogowaniu można te dane podejrzeć - pod adresem https://pbn-micro-alpha.opi.org.pl/auth/pbn/api/manager/applications/0 - -#. Adres zwrotny ("callback") dla aplikacji należy ustawić jako https://nazwa.serwera.bpp/pbn_api/callback - -#. Identyfikator i token aplikacji należy wpisać do ustawień obiektu Uczelnia w module - "Redagowanie" (Redagowanie -> Struktura -> Uczelnia -> zakładka "PBN API") - -#. Podczas edycji powyższych ustawień należy zwrócić uwagę na adres PBN API, - dla serwisu testowego w momencie tworzenia niniejszej dokumentacji jest to - domyślnie https://pbn-micro-alpha.opi.org.pl/ . Jeżeli korzystamy z wersji - produkcyjnej to należy ten adres zaktualizować. - -#. Integrację z PBN API kontrolują dwa ustawienia obiektu "Uczelnia". - - - "integracja z PBN API": gdy zaznaczone, system będzie cyklicznie pobierał - informacje z PBNu do bazy BPP; dane te można obejrzeć w module redagowania - oraz użyć ich do ręcznego ustawiania odpowiedników PBN dla rekordów z BPP - - "aktualizuj rekordy w PBN na bieżąco": to ustawienie sprawia, że po zapisywaniu - rekordów w BPP są one na bieżąco wysyłane do PBN. W chwili tworzenia niniejszej - dokumentacji ta opcja może nieco spowolnić zapisywanie rekordów w module redagowania, - gdyż system każdorazowo wysyła dane do PBN i czeka na potwierdzenie. W przypadku - niepowodzenia użytkownik dostaje adekwatny komunikat, ale brak dostępności serwerów - PBN czy prowadzone na nich prace serwisowe nie powinien mieć wpływu na edycję bazy - BPP - -#. Dla integracji z PBN warto podać również konto użytkownika BPP które będzie używane - do celów wgrywania danych na serwer - pod warunkiem, że ów użytkownik wcześniej - zaloguje się do BPP i dokona autoryzacji swojego konta w PBN API. - -#. Rekordy publikacji aby były dodane do PBN musza spełniać następujące warunki: - - - określony DOI lub strona WWW, - - charakter formalny musi mieć określony rodzaj dla PBN, - - język musi mieć określony odpowiednik dla PBN, - - jednostki muszą mieć określony odpowiednik dla PBN, - - zrodlo musi mieć okreslony odpowiednik dla PBN, - - wydawca musi mieć określony odpowiednik dla PBN, - - autorzy mogą lecz nie muszą mieć określony odpowiednik dla PBN, - - autorzy powinni mieć uzupełnione numery ORCID, - - autorzy muszą mieć przypisaną dyscyplinę naukową (w przypadku wysyłania prac z oświadczeniami). - -#. System umożliwia także wysyłanie prac **bez oświadczeń** do PBN. Takie prace są wysyłane - do repozytorium PBN i nie zawierają informacji o dyscyplinach naukowych autorów. - Prace bez oświadczeń wysyła się identycznie jak prace z oświadczeniami - z poziomu - panelu Redagowania systemu BPP. Użytkownik otrzymuje informację o tym, że praca została - wysłana bez oświadczeń. - - Możliwość wysyłki prac bez oświadczeń zależy od **konfiguracji systemu** - należy - ją włączyć w panelu Redagowania, w zakładce Struktura → Uczelnia/Instytut, w sekcji - ustawień PBN API. - -Wgrywanie wyłącznie opłat do PBN przez API ------------------------------------------- - -Pojedyncze rekordy: - -.. code-block:: shell - - bpp-manage.py pbn_client upload_publication_fee pub:wydawnictwo_ciagle:{id rekordu} - -Wszystkie rekordy: - -.. code-block:: shell - - bpp-manage.py pbn_upload_fees - -.. note:: - - Procedura ``pbn_upload_fees`` w przypadku wgrywania informacji o płatnościach - dla publikacji która nigdy nie była wcześniej wgrywana do PBN (nie posiada numeru - PBN UID czyli "odpowiednika PBN") wgra taką pracę na serwer. - -Kody błędów ------------ - -Podczas synchronizacji z PBN mogą wystąpić m.in. następujące wyjątki: - -* PraceSerwisoweException: po stronie PBN trwają prace serwisowe - zamiast odpowiedzi API - w formacie JSON, serwer PBN zwraca stronę błędu z pszczółkami, diff --git a/docs/raporty_rankingi.rst b/docs/raporty_rankingi.md similarity index 78% rename from docs/raporty_rankingi.rst rename to docs/raporty_rankingi.md index 5abd291be..847fb2e4b 100644 --- a/docs/raporty_rankingi.rst +++ b/docs/raporty_rankingi.md @@ -1,8 +1,6 @@ -Raporty i rankingi ------------------- +# Raporty i rankingi -Ranking autorów -~~~~~~~~~~~~~~~ +## Ranking autorów Do rankingu autorów wchodzą prace z jednostek, które mają zaznaczone pole "Wchodzi do raportów". Pole to domyślnie przyjmuje wartość "PRAWDA". diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 000000000..9423fdbc3 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,10 @@ +# BPP — Bibliografia Publikacji Pracowników + +Bibliografia Publikacji Pracowników to system informatyczny do zarządzania +bibliografią publikacji pracowników naukowych. Oprogramowanie przeznaczone +jest dla bibliotek naukowych i uniwersyteckich w Polsce. + +Oprogramowanie dystrybuowane jest na zasadach otwartoźródłowej [licencji MIT](https://pl.wikipedia.org/wiki/Licencja_MIT). + +Pełne informacje o projekcie znajdują się w pliku [README.md](https://github.com/iplweb/bpp/blob/dev/README.md) w głównym +katalogu repozytorium. diff --git a/docs/readme.rst b/docs/readme.rst deleted file mode 100644 index e3c16b81a..000000000 --- a/docs/readme.rst +++ /dev/null @@ -1,14 +0,0 @@ -BPP — Bibliografia Publikacji Pracowników -========================================== - -Bibliografia Publikacji Pracowników to system informatyczny do zarządzania -bibliografią publikacji pracowników naukowych. Oprogramowanie przeznaczone -jest dla bibliotek naukowych i uniwersyteckich w Polsce. - -Oprogramowanie dystrybuowane jest na zasadach otwartoźródłowej `licencji MIT`_. - -Pełne informacje o projekcie znajdują się w pliku `README.md`_ w głównym -katalogu repozytorium. - -.. _licencji MIT: https://pl.wikipedia.org/wiki/Licencja_MIT -.. _README.md: https://github.com/iplweb/bpp/blob/dev/README.md diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..7b3a5fb79 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +mkdocs-material>=9.5 +mkdocs-autorefs>=1.0 +mkdocs-glightbox>=0.4 +mkdocs-include-markdown-plugin>=7.1 diff --git a/docs/sloty.md b/docs/sloty.md new file mode 100644 index 000000000..08deaad2c --- /dev/null +++ b/docs/sloty.md @@ -0,0 +1,295 @@ +# Obliczanie slotów + +## Uwagi ogólne + +1. System przelicza sloty w momencie zapisu rekordu pracy (dla wydawnictwa ciągłego + lub wydawnictwa zwartego) w momencie naciśniecia przycisku "Zapisz" w module redagowania. +2. Jeżeli daną pracę uda się dopasować do odpowiedniego algorytmu kalkulacji punktów, + użytkownik otrzyma komunikat na górze ekranu. Podobnie otrzyma komunikat, jeżeli nie da + się takiej publikacji dopasować. +3. Reguły dla poszczególnych typów prac - warunki, które musi spełnić dany rekord, aby + został włączony algorytm - opisane są poniżej. +4. W chwili tworzenia niniejszej dokumentacji system powinien liczyć punkty dla prac + z lat 2017-2021 (dla roku 2021 używany jest identyczny algorytm jak dla 2020) + +## Rodzaje autorów + +System rozróżnia cztery rodzaje autorów w powiązaniach autor-dyscyplina: + +**N - naukowiec w N** +- Wliczany do liczby N (parametr ewaluacyjny) +- Liczone są dla niego sloty +- Standardowy pracownik naukowy zaliczany do ewaluacji + +**D - doktorant** +- Nie jest wliczany do liczby N +- Liczone są dla niego sloty +- Osoba na studiach doktoranckich + +**B - badawczy** +- Nie jest wliczany do liczby N +- Liczone są dla niego sloty +- Pracownik o charakterze badawczym (np. post-doc, badacz bez etatu naukowego) + +**Z - inny lub techniczny** +- Nie jest wliczany do liczby N +- Nie liczą się dla niego sloty +- Pracownik techniczny, administracyjny lub inny niebędący pracownikiem badawczym + +### Jak system decyduje o rodzaju autora podczas importu z POLON? + +System automatycznie przypisuje każdyemu pracownikowi odpowiedni rodzaj autora podczas importu danych z pliku POLON. +Decyzja opiera się na dwóch kluczowych informacjach: oświadczeniu pracownika o dyscyplinach oraz charakterze jego zatrudnienia. + +**Krok 1: Sprawdzenie oświadczenia o dyscyplinach** + +System najpierw patrzy na kolumnę **"OSWIADCZENIE_N"** w pliku POLON: + +- **Jeżeli pracownik złożył oświadczenie N** (w kolumnie "OSWIADCZENIE_N" wpisano "tak"): + - System odnotowuje, że pracownik jest zaliczany do liczby N + - Pobiera dyscypliny z kolumn "DYSCYPLINA_N" i "DYSCYPLINA_N_KOLEJNA" + - **Pracownik otrzymuje rodzaj: N (naukowiec w N)** +- **Jeżeli pracownik nie złożył oświadczenia N** (kolumna pusta lub inna wartość): + - System odnotowuje, że pracownik nie jest zaliczany do liczby N + - Przechodzi do analizy charakteru zatrudnienia + +**Krok 2: Analiza charakteru zatrudnienia** + +Następnie system sprawdza kolumnę **"GRUPA_STANOWISK"**: + +- **Jeżeli pracownik jest zatrudniony na stanowisku badawczym**: + + - "pracownik badawczo-dydaktyczny" + - "pracownik badawczo-techniczny" + + System odnotowuje charakter badawczy zatrudnienia. + +- **W pozostałych przypadkach** (np. pracownik techniczny, administracyjny): + + - System odnotowuje charakter niebadawczy zatrudnienia. + +**Krok 3: Przypisanie rodzaju autora - nowe wpisy** + +Gdy system tworzy nowy wpis dla pracownika, stosuje następującą kolejność: + +1. **Jeżeli pracownik złożył oświadczenie N** → rodzaj autora = **N** +2. **Jeżeli nie złożył oświadczenia N, ale pracuje na stanowisku badawczym** → rodzaj autora = **B** +3. **W pozostałych przypadkach** → rodzaj autora = **Z** + +**Krok 4: Aktualizacja istniejących wpisów** + +Gdy system aktualizuje już istniejącego pracownika: + +- **Jeżeli pracownik złożył oświadczenie N**: + - Zawsze ustawia rodzaj autora na **N** (nawet jeżeli wcześniej był D, B lub Z) + - Nawet doktorant staje się naukowcem w N +- **Jeżeli pracownik nie złożył oświadczenia N**: + - **Gdy wcześniej był N** → zmienia na **Z** + - **Gdy wcześniej był Z i pracuje badawczo** → zmienia na **B** + - **Gdy wcześniej był B i nie pracuje badawczo** → zmienia na **Z** + - **Doktorantów (D) pozostawia bez zmian** + +**Przykłady w praktyce** + +- **Pracownik badawczo-dydaktyczny z oświadczeniem N**: + - Oświadczenie N: "tak" + - Stanowisko: "pracownik badawczo-dydaktyczny" + - **Wynik**: Rodzaj autora = **N** (oświadczenie N ma pierwszeństwo) +- **Pracownik techniczny bez oświadczenia N**: + - Oświadczenie N: puste + - Stanowisko: "pracownik techniczny" + - **Wynik**: Rodzaj autora = **Z** +- **Post-doc bez oświadczenia N**: + - Oświadczenie N: puste + - Stanowisko: "pracownik badawczo-techniczny" + - **Wynik**: Rodzaj autora = **B** + +**Co warto wiedzieć?** + +- Oświadczenie N ma **najwyższy priorytet** - ważniejsze niż rodzaj zatrudnienia +- System **ignoruje wielkość liter** przy sprawdzaniu pól +- Wszystkie zmiany rodzaju autora są **zapisywane w logu** +- Po zmianie rodzaju autora system **aktualizuje powiązania** z publikacjami +- **Doktoranci są chronieni** - ich rodzaj autora nigdy nie jest zmieniany + +## Progi algorytmu + +- w kodzie oprogramowania opracowane są niniejsze procedury obliczające punkty, +- obliczenia dokonywane są wewnętrznie z precyzją zmiennoprzecinkową, następnie + prezentowane są zaokrąglone z dokładnością do 4 miejsc po przecinku, +- w poniższych wzorach matematycznych litery oznaczają: + - PK: punkty MNiSW/MEiN, wcześniej zwane *punkty KBN* + - k: liczba autorów/redaktorów dla rekordu z danej dyscypliny, którzy mają w powiązaniu rekordu + z autorem wybraną daną dyscyplinę oraz zaznaczone pole *Afiliuje* na *tak*, + - m: liczba wszystkich autorów rekordu. + +### Próg nr 1 + +Punkty PKd dla rekordu, dla danej dyscypliny: + +$$ +PK_{d} = PK +$$ + +Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: + +$$ +PKd_{Aut} = \frac{ PKd}{k} +$$ + +Slot dla autora: + +$$ +slot_{Aut} = \frac {1}{k} +$$ + +Slot dla dyscypliny: + +$$ +slot_{d} = 1 +$$ + +Slot dla dyscypliny nie będzie liczony jeżeli nie ma żadnych autorów w danej dyscyplinie, tzn +gdy żaden z autorów nie jest afiliowany na jednostki uczelni. + +### Próg nr 2 + +Punkty PKd dla rekordu, dla danej dyscypliny: + +$$ +PK_{d} = PK * \sqrt { \frac{k}{m} } +$$ + +Zakładamy, że mnożnik z powyższego przykładu (pierwiastek kwadratowy z k/m) nie będzie mniejszy, jak 0.1. Jeżeli będzie mniejszy, +to zostanie użyta wartość 0.1, chyba, że wszyscy autorzy z danej dyscypliny nie będą mieli afiliacji, wówczas zostanie użyta +wartość 0. + +Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: + +$$ +PKd_{Aut} = \frac{ PKd}{k} +$$ + +Slot dla autora: + +$$ +slot_{Aut} = \sqrt { \frac{k}{m} } * \frac {1}{k} +$$ + +Slot dla dyscypliny: + +$$ +slot_{d} = \sqrt { \frac{k}{m} } +$$ + +### Próg nr 3 + +Punkty PKd dla rekordu, dla danej dyscypliny: + +$$ +PK_{d} = PK * \frac{k}{m} +$$ + +Zakładamy, że mnożnik z powyższego przykładu (wynik dzielenia k/m) nie będzie mniejszy, jak 0.1. Jeżeli będzie mniejszy, +to zostanie użyta wartość 0.1, chyba, że wszyscy autorzy z danej dyscypliny nie będą mieli afiliacji, wówczas zostanie użyta +wartość 0. + +Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: + +$$ +PKd_{Aut} = \frac{ PKd}{k} +$$ + +Slot dla autora: + +$$ +slot_{Aut} = { \frac{1}{m} } +$$ + +Slot dla dyscypliny: + +$$ +slot_{d} = { \frac{1}{m * k} } +$$ + +## Wydawnictwa ciągłe + +1. Charakter formalny rekordu nie ma znaczenia +2. Dla zakresu lat 2017-2018, punkty MNiSW/MEiN muszą wynosić odpowoednio: + - powyżej 30 dla progu 1. algorytmu + - 20 lub 25 dla progu 2. algorytmu + - poniżej 20 i powyżej zera dla progu 3. algorytmu +3. Dla zakresu lat 2019-2021, punkty MNiSW/MEiN muszą wynosić odpowiednio: + - 200, 140, 100 dla progu 1. algorytmu + - 70 lub 40 dla progu 2. algorytmu + - mniejsze lub równe jak 20 ale powyżej zera dla progu 3. algorytmu + +## Wydawnictwa zwarte + +1. Charakter formalny rekordu ma znaczenie, a konkretnie pole charakteru formalnego określające + "Charakter dla slotów". To pole może przyjmować wartości: książka, rozdział, referat. W + zależności od wartości pola "charakter dla slotów" rekord dopasowywany będzie do + odpowiednich grup. +2. Pole "typ odpowiedzialności" dla osób powiązanych z danym rekordem ma znaczenie. Jeżeli + wszystkie powiązane osoby będą miały typ "redaktor", taki rekord będzie traktowany jako redakcja, + jeżeli "autor" - to autorstwo i tak dalej. +3. Charakter dla slotów = refereat: + - punkty MNiSW/MEiN = 15 oraz powiązanie z zewnętrzną bazą danych - nazwa bazy danych + dowolna, skrót nazwy bazy danych równy "WOS". Powiązanie z zewnętrzną baza danych + można dodać dla każdego rekordu, korzystając z formularza na końcu strony edycji + rekordu - próg 3. algorytmu, + - punkty MNiSW/MEiN 200, 140, 100 - próg 1. algorytmu, + - punkty MNiSW/MEiN 70, 40 - próg 2. algorytmu, + - punkty MNiSW/MEiN równe 20: + - gdy wydawca na dany rok ma poziom równy 1: próg 2. algorytmu + - gdy wydawca nieokreślony lub inny poziom: próg 3. algorytmu + - punkty MNiSW/MEiN równe 50 i poziom wydawcy równe 2: próg 1. algorytmu + - punkty MNiSW/MEiN równe 5: próg 3. algorytmu +4. Charakter dla slotów = książka lub rozdział: + - poziom wydawcy równy 2 oraz: + + - autorstwo + książka + punkty MNiSW/MEiN = (200 lub 100), lub + - redakcja + książka + punkty MNiSW/MEiN = (100 lub 50), lub + - rozdział + punkty MNiSW/MEiN = (50 lub 25) + + ... da w rezultacie próg 1. algorytmu + + - poziom wydawcy równy 1 oraz: + + - autorstwo + książka + punkty MNiSW/MEiN = (80 lub 40 lub 100), lub + - redakcja + książka + punkty MNiSW/MEiN = (20 lub 10), lub + - rozdział + punkty MNiSW/MEiN = (20 lub 10) + + ... da w rezultacie próg 2. algorytmu + + - poziom wydawcy inny lub bez określenia wydawcy oraz: + + - książka + autorstwo + punkty MNiSW/MEiN = (20 lub 10), lub + - książka + redakcja + punkty MNiSW/MEiN = (5 lub 2.5), lub + - rozdział + punkty MNiSW/MEiN = (5 lub 2.5) + + ... da w rezultacie próg 3. algorytmu. + + - warunek "książka" lub "rozdział" dopasowywany jest z uwzględnieniem + pola "charakter dla slotów" dla danego charakteru formalnego rekordu, + + - warunek "autorstwo" lub "redakcja" dopasowywany jest uwzględniając + pole "typ odpowiedzialności" przy powiązaniu osoby z rekordem, a konkretnie + jego pod-pole "typ ogólny". Jeżeli będzie tam wartość "autor" lub + "redaktor", system postąpi odpowiednio do wartości pola. Jeżeli rekord + będzie posiadał jednocześnie autorów oraz redaktorów lub też rekord + nie będzie posiadał ani autorów, ani redaktorów, system wyświeli komunikat + o braku możliwości obliczenia slotów. + +## Wydawnictwa HST + +Dla dyscyplin będących w grupie HST (nauki humanistyczne, nauki społeczne, teologia): + +- jeżeli publikacja zawiera wyłącznie takie dyscypliny, należy zwiększyć punktację PK + w sposób przewidziany w ustawie (czyli zamiast 80 punktów PK wpisujemy od razu 120), +- jeżeli publikacja zawiera dyscypliny HST oraz dyscypliny "zwykłe", wpisujemy punktację bazową; + system w takim przypadku zwiększy o 1.5x punktację bazową dla dyscyplin HST przy obliczeniach + punktacji za slot. + +W ten sposób może dochodzić do rozbieżności w raportach, gdy zbierana (sumowana) jest punktacja PK całego rekordu +nie zaś punktacja slotu. diff --git a/docs/sloty.rst b/docs/sloty.rst deleted file mode 100644 index f93f21d1e..000000000 --- a/docs/sloty.rst +++ /dev/null @@ -1,330 +0,0 @@ -Obliczanie slotów -================= - -Uwagi ogólne ------------- - -#. System przelicza sloty w momencie zapisu rekordu pracy (dla wydawnictwa ciągłego - lub wydawnictwa zwartego) w momencie naciśniecia przycisku "Zapisz" w module redagowania. - -#. Jeżeli daną pracę uda się dopasować do odpowiedniego algorytmu kalkulacji punktów, - użytkownik otrzyma komunikat na górze ekranu. Podobnie otrzyma komunikat, jeżeli nie da - się takiej publikacji dopasować. - -#. Reguły dla poszczególnych typów prac - warunki, które musi spełnić dany rekord, aby - został włączony algorytm - opisane są poniżej. - -#. W chwili tworzenia niniejszej dokumentacji system powinien liczyć punkty dla prac - z lat 2017-2021 (dla roku 2021 używany jest identyczny algorytm jak dla 2020) - -Rodzaje autorów ---------------- - -System rozróżnia cztery rodzaje autorów w powiązaniach autor-dyscyplina: - -**N - naukowiec w N** - - Wliczany do liczby N (parametr ewaluacyjny) - - Liczone są dla niego sloty - - Standardowy pracownik naukowy zaliczany do ewaluacji - -**D - doktorant** - - Nie jest wliczany do liczby N - - Liczone są dla niego sloty - - Osoba na studiach doktoranckich - -**B - badawczy** - - Nie jest wliczany do liczby N - - Liczone są dla niego sloty - - Pracownik o charakterze badawczym (np. post-doc, badacz bez etatu naukowego) - -**Z - inny lub techniczny** - - Nie jest wliczany do liczby N - - Nie liczą się dla niego sloty - - Pracownik techniczny, administracyjny lub inny niebędący pracownikiem badawczym - -Jak system decyduje o rodzaju autora podczas importu z POLON? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -System automatycznie przypisuje każdyemu pracownikowi odpowiedni rodzaj autora podczas importu danych z pliku POLON. -Decyzja opiera się na dwóch kluczowych informacjach: oświadczeniu pracownika o dyscyplinach oraz charakterze jego zatrudnienia. - -**Krok 1: Sprawdzenie oświadczenia o dyscyplinach** - -System najpierw patrzy na kolumnę **"OSWIADCZENIE_N"** w pliku POLON: - -* **Jeżeli pracownik złożył oświadczenie N** (w kolumnie "OSWIADCZENIE_N" wpisano "tak"): - - System odnotowuje, że pracownik jest zaliczany do liczby N - - Pobiera dyscypliny z kolumn "DYSCYPLINA_N" i "DYSCYPLINA_N_KOLEJNA" - - **Pracownik otrzymuje rodzaj: N (naukowiec w N)** - -* **Jeżeli pracownik nie złożył oświadczenia N** (kolumna pusta lub inna wartość): - - System odnotowuje, że pracownik nie jest zaliczany do liczby N - - Przechodzi do analizy charakteru zatrudnienia - -**Krok 2: Analiza charakteru zatrudnienia** - -Następnie system sprawdza kolumnę **"GRUPA_STANOWISK"**: - -* **Jeżeli pracownik jest zatrudniony na stanowisku badawczym**: - - "pracownik badawczo-dydaktyczny" - - "pracownik badawczo-techniczny" - - System odnotowuje charakter badawczy zatrudnienia. - -* **W pozostałych przypadkach** (np. pracownik techniczny, administracyjny): - - System odnotowuje charakter niebadawczy zatrudnienia. - -**Krok 3: Przypisanie rodzaju autora - nowe wpisy** - -Gdy system tworzy nowy wpis dla pracownika, stosuje następującą kolejność: - -1. **Jeżeli pracownik złożył oświadczenie N** → rodzaj autora = **N** -2. **Jeżeli nie złożył oświadczenia N, ale pracuje na stanowisku badawczym** → rodzaj autora = **B** -3. **W pozostałych przypadkach** → rodzaj autora = **Z** - -**Krok 4: Aktualizacja istniejących wpisów** - -Gdy system aktualizuje już istniejącego pracownika: - -* **Jeżeli pracownik złożył oświadczenie N**: - - Zawsze ustawia rodzaj autora na **N** (nawet jeżeli wcześniej był D, B lub Z) - - Nawet doktorant staje się naukowcem w N - -* **Jeżeli pracownik nie złożył oświadczenia N**: - - **Gdy wcześniej był N** → zmienia na **Z** - - **Gdy wcześniej był Z i pracuje badawczo** → zmienia na **B** - - **Gdy wcześniej był B i nie pracuje badawczo** → zmienia na **Z** - - **Doktorantów (D) pozostawia bez zmian** - -**Przykłady w praktyce** - -* **Pracownik badawczo-dydaktyczny z oświadczeniem N**: - - Oświadczenie N: "tak" - - Stanowisko: "pracownik badawczo-dydaktyczny" - - **Wynik**: Rodzaj autora = **N** (oświadczenie N ma pierwszeństwo) - -* **Pracownik techniczny bez oświadczenia N**: - - Oświadczenie N: puste - - Stanowisko: "pracownik techniczny" - - **Wynik**: Rodzaj autora = **Z** - -* **Post-doc bez oświadczenia N**: - - Oświadczenie N: puste - - Stanowisko: "pracownik badawczo-techniczny" - - **Wynik**: Rodzaj autora = **B** - -**Co warto wiedzieć?** - -* Oświadczenie N ma **najwyższy priorytet** - ważniejsze niż rodzaj zatrudnienia -* System **ignoruje wielkość liter** przy sprawdzaniu pól -* Wszystkie zmiany rodzaju autora są **zapisywane w logu** -* Po zmianie rodzaju autora system **aktualizuje powiązania** z publikacjami -* **Doktoranci są chronieni** - ich rodzaj autora nigdy nie jest zmieniany - -Progi algorytmu ---------------- - -* w kodzie oprogramowania opracowane są niniejsze procedury obliczające punkty, - -* obliczenia dokonywane są wewnętrznie z precyzją zmiennoprzecinkową, następnie - prezentowane są zaokrąglone z dokładnością do 4 miejsc po przecinku, - -* w poniższych wzorach matematycznych litery oznaczają: - - - PK: punkty MNiSW/MEiN, wcześniej zwane *punkty KBN* - - k: liczba autorów/redaktorów dla rekordu z danej dyscypliny, którzy mają w powiązaniu rekordu - z autorem wybraną daną dyscyplinę oraz zaznaczone pole *Afiliuje* na *tak*, - - m: liczba wszystkich autorów rekordu. - -Próg nr 1 -~~~~~~~~~ - -Punkty PKd dla rekordu, dla danej dyscypliny: - -.. math:: - - PK_{d} = PK - -Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: - -.. math:: - - PKd_{Aut} = \frac{ PKd}{k} - -Slot dla autora: - -.. math:: - - slot_{Aut} = \frac {1}{k} - -Slot dla dyscypliny: - -.. math:: - - slot_{d} = 1 - -Slot dla dyscypliny nie będzie liczony jeżeli nie ma żadnych autorów w danej dyscyplinie, tzn -gdy żaden z autorów nie jest afiliowany na jednostki uczelni. - -Próg nr 2 -~~~~~~~~~ - -Punkty PKd dla rekordu, dla danej dyscypliny: - -.. math:: - - PK_{d} = PK * \sqrt { \frac{k}{m} } - -Zakładamy, że mnożnik z powyższego przykładu (pierwiastek kwadratowy z k/m) nie będzie mniejszy, jak 0.1. Jeżeli będzie mniejszy, -to zostanie użyta wartość 0.1, chyba, że wszyscy autorzy z danej dyscypliny nie będą mieli afiliacji, wówczas zostanie użyta -wartość 0. - -Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: - -.. math:: - - PKd_{Aut} = \frac{ PKd}{k} - -Slot dla autora: - -.. math:: - - slot_{Aut} = \sqrt { \frac{k}{m} } * \frac {1}{k} - -Slot dla dyscypliny: - -.. math:: - - slot_{d} = \sqrt { \frac{k}{m} } - -Próg nr 3 -~~~~~~~~~ - -Punkty PKd dla rekordu, dla danej dyscypliny: - -.. math:: - - PK_{d} = PK * \frac{k}{m} - -Zakładamy, że mnożnik z powyższego przykładu (wynik dzielenia k/m) nie będzie mniejszy, jak 0.1. Jeżeli będzie mniejszy, -to zostanie użyta wartość 0.1, chyba, że wszyscy autorzy z danej dyscypliny nie będą mieli afiliacji, wówczas zostanie użyta -wartość 0. - -Punkty PKdAut dla rekordu, dla autora z danej dyscypliny: - -.. math:: - - PKd_{Aut} = \frac{ PKd}{k} - -Slot dla autora: - -.. math:: - - slot_{Aut} = { \frac{1}{m} } - -Slot dla dyscypliny: - -.. math:: - - slot_{d} = { \frac{1}{m * k} } - -Wydawnictwa ciągłe ------------------- - -#. Charakter formalny rekordu nie ma znaczenia - -#. Dla zakresu lat 2017-2018, punkty MNiSW/MEiN muszą wynosić odpowoednio: - - * powyżej 30 dla progu 1. algorytmu - * 20 lub 25 dla progu 2. algorytmu - * poniżej 20 i powyżej zera dla progu 3. algorytmu - -#. Dla zakresu lat 2019-2021, punkty MNiSW/MEiN muszą wynosić odpowiednio: - - * 200, 140, 100 dla progu 1. algorytmu - * 70 lub 40 dla progu 2. algorytmu - * mniejsze lub równe jak 20 ale powyżej zera dla progu 3. algorytmu - -Wydawnictwa zwarte ------------------- - -#. Charakter formalny rekordu ma znaczenie, a konkretnie pole charakteru formalnego określające - "Charakter dla slotów". To pole może przyjmować wartości: książka, rozdział, referat. W - zależności od wartości pola "charakter dla slotów" rekord dopasowywany będzie do - odpowiednich grup. - -#. Pole "typ odpowiedzialności" dla osób powiązanych z danym rekordem ma znaczenie. Jeżeli - wszystkie powiązane osoby będą miały typ "redaktor", taki rekord będzie traktowany jako redakcja, - jeżeli "autor" - to autorstwo i tak dalej. - -#. Charakter dla slotów = refereat: - - * punkty MNiSW/MEiN = 15 oraz powiązanie z zewnętrzną bazą danych - nazwa bazy danych - dowolna, skrót nazwy bazy danych równy "WOS". Powiązanie z zewnętrzną baza danych - można dodać dla każdego rekordu, korzystając z formularza na końcu strony edycji - rekordu - próg 3. algorytmu, - - * punkty MNiSW/MEiN 200, 140, 100 - próg 1. algorytmu, - - * punkty MNiSW/MEiN 70, 40 - próg 2. algorytmu, - - * punkty MNiSW/MEiN równe 20: - - - gdy wydawca na dany rok ma poziom równy 1: próg 2. algorytmu - - gdy wydawca nieokreślony lub inny poziom: próg 3. algorytmu - - * punkty MNiSW/MEiN równe 50 i poziom wydawcy równe 2: próg 1. algorytmu - - * punkty MNiSW/MEiN równe 5: próg 3. algorytmu - -#. Charakter dla slotów = książka lub rozdział: - - * poziom wydawcy równy 2 oraz: - - - autorstwo + książka + punkty MNiSW/MEiN = (200 lub 100), lub - - redakcja + książka + punkty MNiSW/MEiN = (100 lub 50), lub - - rozdział + punkty MNiSW/MEiN = (50 lub 25) - - ... da w rezultacie próg 1. algorytmu - - * poziom wydawcy równy 1 oraz: - - - autorstwo + książka + punkty MNiSW/MEiN = (80 lub 40 lub 100), lub - - redakcja + książka + punkty MNiSW/MEiN = (20 lub 10), lub - - rozdział + punkty MNiSW/MEiN = (20 lub 10) - - ... da w rezultacie próg 2. algorytmu - - * poziom wydawcy inny lub bez określenia wydawcy oraz: - - - książka + autorstwo + punkty MNiSW/MEiN = (20 lub 10), lub - - książka + redakcja + punkty MNiSW/MEiN = (5 lub 2.5), lub - - rozdział + punkty MNiSW/MEiN = (5 lub 2.5) - - ... da w rezultacie próg 3. algorytmu. - - * warunek "książka" lub "rozdział" dopasowywany jest z uwzględnieniem - pola "charakter dla slotów" dla danego charakteru formalnego rekordu, - - * warunek "autorstwo" lub "redakcja" dopasowywany jest uwzględniając - pole "typ odpowiedzialności" przy powiązaniu osoby z rekordem, a konkretnie - jego pod-pole "typ ogólny". Jeżeli będzie tam wartość "autor" lub - "redaktor", system postąpi odpowiednio do wartości pola. Jeżeli rekord - będzie posiadał jednocześnie autorów oraz redaktorów lub też rekord - nie będzie posiadał ani autorów, ani redaktorów, system wyświeli komunikat - o braku możliwości obliczenia slotów. - -Wydawnictwa HST ---------------- - -Dla dyscyplin będących w grupie HST (nauki humanistyczne, nauki społeczne, teologia): - -* jeżeli publikacja zawiera wyłącznie takie dyscypliny, należy zwiększyć punktację PK - w sposób przewidziany w ustawie (czyli zamiast 80 punktów PK wpisujemy od razu 120), - -* jeżeli publikacja zawiera dyscypliny HST oraz dyscypliny "zwykłe", wpisujemy punktację bazową; - system w takim przypadku zwiększy o 1.5x punktację bazową dla dyscyplin HST przy obliczeniach - punktacji za slot. - -W ten sposób może dochodzić do rozbieżności w raportach, gdy zbierana (sumowana) jest punktacja PK całego rekordu -nie zaś punktacja slotu. diff --git a/docs/usage_admin.md b/docs/usage_admin.md new file mode 100644 index 000000000..d4505bbf5 --- /dev/null +++ b/docs/usage_admin.md @@ -0,0 +1,397 @@ +# Instrukcja dla administratora + +## Konfiguracja sposobu prezentacji danych dla użytkowników niezalogowanych + +### Ustawienia globalne - rekord uczelni + +- po zainstalowaniu systemu, gdy baza danych jest pusta, potrzebujesz + utworzyć obiekt "Uczelnia" za pomocą funkcji Redagowanie➡Struktura➡Uczelnia, +- za pomocą tejże opcji możesz ustawić logo uczelni oraz ikonę favicon (czyli + zmniejszoną ikonę strony wyświetlającą się w pasku adresu przeglądarki oraz + na urządzeniach przenośnych), +- za pomocą tej opcji ustawić możesz domyślą wartość pola "afiliuje" dla rekordów + wiążących rekordy prac (wydawnictwo ciągłe, zwarte i patent) z autorami + +#### Kolejnośc i zakres wyświetlanych wydziałów + +- aby ustalić kolejność i zakres wyświetlanych wydziałów uczelni, potrzebujesz + przejrzeć obiekty "Wydział" znajdujące się poniżej formularza dla rekordu + Uczelni. Skorzystaj z funkcji Redagowanie➡Struktura➡Uczelnie. Wydziały mogą + być wyświetlane lub nie, możesz za pomocą tej funkcji ustawić je w określonej + kolejności. + + !!! note + + wydziały w module interfejsu uzytkownika niezalogowanego nie są wyświelane + alfabetycznie a zgodnie z ustaloną kolejnością. + + +- aby obejrzeć szczegóły wydziału skorzystaj z opcji + Redagowanie➡Struktura➡Wydział + +- pozostałe części serwisu dla użytkowników niezalogowanych wyświetlają + dane w formacie kolumnowym, posortowane alfabetycznie. + +#### Ukrywanie autorów na stronach jednostek + +Aby ukryć informacje na temat autora na stronie jednostki, należy skorzystać +z opcji "Pokazuj na stronach jednostek". W przypadku doktorantów lub autorów +którzy nie są pracownikami danej jednostki należy je odznaczyć. + +Po wybraniu dowolnego autora w module Redagowanie➡Wprowadzanie danych➡Autorzy +odznacz to pole i zapisz rekord, aby nie wyświetlać autora na stronie jednostki. + +![image](images/admin/pokazuj_na_stronach_jednostek.png) + +#### Ukrywanie lub wyświetlanie raportów na stronie głównej + +Celem konfiguracji sposobu wyświetlania strony głównej jak i innych elementów +serwisu, skorzystaj z opcji Redagowanie➡Struktura➡Uczelnie, a następnie w sekcji +"Strona wizualna" wyedytuj ustawienia dotyczące pokazywania różnych opcji +(rankingi, raporty, opcje rekordu). Niektóre ustawienia umożliwiają wyświetlanie +lub chowanie danego elementu, niektóre umożliwiają wyświetlenie danego elementu +tylko dla użytkowników zalogowanych. + +![image](images/admin/uczelnia_strona_wizualna.png) + +#### Ukrywanie lub wyświetlanie formularzy wyszukiwania + +Gdy stworzysz formularz wyszukiwania w opcji Wyszukaj, możesz go zapisać. W ten +sposób formularz będzie dostępny w późniejszym czasie. Podczas zapisywania formularza +(opcja ta dostępna jest jedynie dla zalogowanych użytkowników) masz możliwość +określenia, czy chcesz, aby ten formularz widoczny był również dla innych +osób. + +Jeżeli chcesz później schować lub pokazać takie formularze, skorzystaj z opcji +Redagowanie➡Administracja➡Formularze wyszukiwania. Kliknij nazwę takiego +formularza, następnie zaznacz lub odznacz opcję "Publiczny" i zapisz rekord + +## Sposób kalkulacji dyscyplin + +1. Dyscyplina i subdyscyplina naukowa przypisana autorowi na dany rok zawiera się w rekordzie `Autor_Dyscyplina`. +2. Dyscyplina naukowa którą autor deklaruje dla danej publikacji jest określana przez bibliotekarza + każdorazowo dla powiązania autora do rekordu. +3. Zachowanie systemu podczas zmiany przypisań dyscyplin na dany rok opisuje niniejsza instrukcja + w części [Zachowanie procedur utrzymujących integrację danych (triggerów) dla przypisań autora do dyscypliny](#zachowanie-procedur-utrzymujących-integrację-danych-triggerów-dla-przypisań-autora-do-dyscypliny). +4. Od wersji oprogramowania `1.0.30-dev3` system nie domniemuje automatycznie dyscypliny + dla danego przypisania autora do rekordu w przypadku braku takiej informacji. Innymi słowy, + **pole "Dyscyplina" przy powiązaniu autora z rekordem musi być wypełnione**. Jeżeli jest puste, + system nie bierze takiego autora pod uwagę przy kalkulacji dyscypliny. Zatem: +5. Dyscyplina dla danego autora przy przypisaniu do rekordu istniejącego musi być explicte wpisana. +6. Dyscyplina naukowa dla nowych rekordów: system podczas wpisywania nowego rekordu, po wybraniu + imienia i nazwiska autora przy powiązaniu autora do rekordu będzie starał się podpowiedzieć dyscyplinę + dla danego roku - w sytuacji, gdy autor ma wpisaną jedną. +7. W sytuacji gdy autor ma wpisane dwie dyscypliny dla danego roku, system nie podpowiada dyscypliny, + pozostawiając to do decyzji bibliotekarza. + +## Zachowanie procedur utrzymujących integrację danych (triggerów) dla przypisań autora do dyscypliny + +### Założenia + +1. przypisanie autora do dyscypliny (rekord `Autor_Dyscyplina`) na dany rok musi mieć główną dyscyplinę; +2. pole subdyscyplina może być puste, +3. procenty udziału dyscypliny i subdyscypliny, zsumowane, nie mogą przekroczyć 100% + +### Zachowanie + +1. **dopisanie dyscypliny** (utworzenie rekordu `Autor_Dyscyplina`) na dany rok **nie powoduje** żadnych + zmian w rekordach powiązanych; jeżeli autor miał jakieś przypisania do rekordów, pole "Dyscyplina" + pozostaje w nich puste tzn ma nadal + + Rekordy te można będzie za pomocą zapytania bazodanowego przypisać do zadanych dyscyplin, + jeżeli taka jest wola i decyzja redaktora / osób odpowiedzialnych za merytoryczną zawartość bazy + danych. + +2. **zmiana dyscypliny lub subdyscypliny** na **inną** powoduje zmianę dyscypliny przypisanej dla + powiązań autor + rekord dla danego roku, dla danego autora - we wszystkich rekordach, które + mają „starą” dyscyplinę lub subdyscyplinę - na nową + +3. **zmiana subdyscypliny** na **pustą** powoduje zmianę dyscypliny przypisanej dla + powiązań autor + rekord dla danego roku, dla danego autora - we wszystkich rekordach, które + mają „starą” subdyscyplinę - na pustą. + +4. **usunięcie przypisania** autora do dyscypliny (rekord `Autor_Dyscyplina`) powoduje ustawienie + wartości pustej (`NULL`) dla danego roku, dla danego autora - we wszystkich rekordach, do + których przypisany jest dany autor. + +## Pola "... ogólny" ("typ ogólny", "charakter ogólny" itp) + +W kilku miejscach systemu możemy natknąć się na pola nazwane w sposób +"... ogólny", "... dla eksportu", "... dla slotów" itp. + +Przykładowo, +charakter formalny dla rekordów (Redagowanie➡Dane systemowe➡Charaktery formalne) +ma takie pola w chwili pisania tej dokumentacji: + +- charakter PBN +- charakter dla slotów +- rodzaj dla PBN +- nazwa w PRIMO + +Podobnie typ odpowiedzialności autora, czyli rekord określający czy osoba +przypisana do rekordu jest jego autorem czy np. redaktorem bądź tłumaczem +(Redagowanie➡Dane systemowe➡Typy odpowiedzialności) posiada: + +- ogólny typ odpowiedzialności + +Tego typu pola wydają się w pewnym sensie dublować informacje zawarte już w innych +polach rekordu. + +Przykładowo typ odpowiedzialności "autor korespondencyjny" może mieć +pozornie zdublowaną informację "autor" jako typ ogólny. Podobnie, charakter formalny +"książka w języku polskim" może mieć pozornie zdublowaną informację "charkater dla slotów" +równe "książka". + +Tego typu zapis danych jest jednak jak najbardziej celową i świadomą decyzją ze strony autorów +oprogramowania BPP. + +Dzięki temu możemy sobie pozwolić na dowolnie zapisaną +nazwę danego charakteru formalnego bądź odpowiedzialności autora. W ten sposób +nie musimy np zmieniać informacji historycznej w systemie, bądź dokładać sobie +pracy w razie importu danych z zewnętrznych źródeł. Nazwa charakteru bądź typu odpowiedzialności +może byc w takim układzie dowolna. + +System jednak potrzebuje wiedzieć dokładnie na potrzeby obliczeń, raportów i eksportu +danych, czy np. tekstowe określenie "autor korespondencyjny" czy "redaktor korespondencyjny wydania polskiego" +to autor, tłumacz czy redaktor - i właśnie dla takiego celu stworzone zostały pola +"... ogólne". Pola z charakterem "ogólnym" danego rekordu zawiera kilka rodzajów typów, odgórnie +zdefiniowanych w kodzie programu, które to potem w tym kodzie są wykorzystywane - na +potrzeby procedur liczących, raportujących, eksportujących dane itp. + +## Konfiguracja rodzaju i kolejności wyświetlanych kolumn w module redagowania + +System umożliwia zmianę rodzaju i ilości wyświetlanych kolumn w module redagowania. W tym celu +użytkownik posiadający uprawnienia administratora po zalogowaniu się powinien w module redagowania +wejść w opcję Administracja -\> Kolumny w module redagowania: + +![image](images/admin/dynamic_columns/dynamic_columns_1.png) + +Następnie wyświetli się nam tabelka. W prawym górnym rogu, za pomocą opcji "Filtruj" wybieramy, +dla którego modułu chcemy skonfigurować kolumny. Klikamy na przycisk "Filtruj" + +![image](images/admin/dynamic_columns/dynamic_columns_2.png) + +I wybieramy interesujący nas moduł: + +![image](images/admin/dynamic_columns/dynamic_columns_3.png) + +Następnie możemy - za pomocą szarego prostokątu po prawej stronie - zmieniać kolejność kolumn. +Wystarczy najechac na niego myszą i przeciągnąć (ang. *drag and drop*): + +![image](images/admin/dynamic_columns/dynamic_columns_4.png) + +Można też wybrane kolumny podświetlić za pomocą ptaszków (ang. *checkbox*) po lewej stronie i +na dole tabeli wybrać jedno z działań np włączyć lub wyłączyć grupowo wiele pól na raz. + +![image](images/admin/dynamic_columns/dynamic_columns_5.png) + +!!! note + + Niektóre kolumny w kodzie programu ustawione są jako *zawsze* *widoczne* i nie będą + dostępne do edycji. Nie będzie można zmienić ich kolejności ani ich schować. + + +!!! note + + Im więcej kolumn wybranych, tym więcej danych musi przetworzyć system. Im mniej + - tym tabele będą wyświetlały się szybciej. + + +## Uzupełnianie pustych dat oświadczeń PBN w rekordach publikacji + +W systemie BPP może wystąpić sytuacja, gdy rekordy powiązań autorów z publikacjami +(Wydawnictwo_Ciagle_Autor, Wydawnictwo_Zwarte_Autor) nie mają wypełnionych dat oświadczeń +potrzebnych do prawidłowej integracji z PBN. System udostępnia procedury do automatycznego +wypełnienia tych dat oraz wysłania oświadczeń do PBN. + +#### Procedura uzupełniania dat oświadczeń + +1. **Wypełnienie pustych dat oświadczeń** + + Pierwszym krokiem jest uruchomienie procedury, która automatycznie ustawi daty oświadczeń + na podstawie daty utworzenia rekordu publikacji: + + ``` bash + python src/manage.py ustaw_daty_oswiadczenia_pbn + ``` + + Ta procedura: + + - Wyszukuje wszystkie rekordy powiązań autor-publikacja z pustymi datami oświadczeń + - Uwzględnia tylko publikacje z rokiem wydania \>= 2022 + - Ustawia datę oświadczenia na datę utworzenia nadrzędnego rekordu publikacji + - Aktualizuje rekordy w tabelach `Wydawnictwo_Ciagle_Autor` i `Wydawnictwo_Zwarte_Autor` + + !!! note + + Przed właściwym uruchomieniem procedury zaleca się wykonanie testu za pomocą opcji `--dry-run`, + aby sprawdzić, które rekordy zostaną zaktualizowane: + + ``` bash + python src/manage.py ustaw_daty_oswiadczenia_pbn --dry-run + ``` + + +2. **Autoryzacja w systemie PBN** + + Przed wysyłaniem oświadczeń należy się upewnić, że system jest autoryzowany w PBN. + W przypadku braku autoryzacji należy wykonać procedurę logowania opisaną w dokumentacji + konfiguracji PBN. + +3. **Aktualizacja danych lokalnych przed pierwszym importem** + + Przed pierwszym wysłaniem oświadczeń do PBN należy upewnić się, że dane lokalne publikacji + są aktualne i zsynchronizowane z systemem PBN. W tym celu należy pobrać publikacje z profilu + instytucji za pomocą API v2: + + ``` bash + python src/manage.py pbn_pobierz_publikacje_z_instytucji_v2 + ``` + + Ta procedura: + + - Pobiera wszystkie publikacje z profilu instytucji w systemie PBN + - Synchronizuje dane lokalne z danymi w PBN + - Zapewnia spójność przed wysyłką oświadczeń + +4. **Wysyłanie oświadczeń do PBN** + + Po uzupełnieniu dat oświadczeń można przystąpić do ich wysłania do systemu PBN: + + ``` bash + python src/manage.py pbn_wyslij_oswiadczenia_instytucji --year 2023 + ``` + + Opcje dostępne przy wysyłaniu oświadczeń: + + - `--year ` - wysyła oświadczenia dla wszystkich publikacji z określonego roku + - `--dry-run` - tryb testowy, pokazuje co zostałoby wysłane bez faktycznej wysyłki + - `:` - wysyła oświadczenie dla konkretnej publikacji (np. `wydawnictwo_ciagle:123`) + + !!! warning + + Podczas wysyłania publikacji do PBN, jeżeli w API v2 PBN znajdą się publikacje, + których nie ma w lokalnej bazie danych, zostaną one automatycznie pobrane, + a ich nazwy wypisane na standardowym wyjściu programu. + + +#### Przykład kompletnej procedury + +``` bash +# 1. Test uzupełniania dat (opcjonalnie) +python src/manage.py ustaw_daty_oswiadczenia_pbn --dry-run + +# 2. Uzupełnienie dat oświadczeń +python src/manage.py ustaw_daty_oswiadczenia_pbn + +# 3. Aktualizacja danych lokalnych (przed pierwszym importem) +python src/manage.py pbn_pobierz_publikacje_z_instytucji_v2 + +# 4. Wysłanie oświadczeń dla publikacji z 2023 roku +python src/manage.py pbn_wyslij_oswiadczenia_instytucji --year 2023 +``` + +!!! note + + Wszystkie powyższe operacje wymagają prawidłowej konfiguracji integracji z PBN + oraz autoryzacji użytkownika w systemie PBN. Szczegóły konfiguracji znajdują + się w dokumentacji [konfiguracja PBN](konfiguracja_pbn.md). + + +## Konfiguracja mapowania charakterów CrossRef API na charaktery formalne BPP + +System BPP umożliwia integrację z CrossRef API do pobierania danych publikacji. +Aby prawidłowo zaimportować dane z CrossRef, konieczne jest skonfigurowanie mapowania +między charakterami formalnej publikacji używanymi przez CrossRef API a charakterami +formalnymi zdefiniowanymi w systemie BPP. + +Dostępne charaktery CrossRef API +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +System CrossRef API wykorzystuje następujące typy charakterów publikacji: + +- `journal-article` - artykuły w czasopismach +- `proceedings-article` - artykuły w materiałach konferencyjnych +- `book` - książki +- `book-chapter` - rozdziały w książkach +- `edited-book` - książki redagowane +- `proceedings` - materiały konferencyjne +- `monograph` - monografie +- `reference-book` - książki referencyjne/podręczniki +- `book-series` - serie książkowe +- `book-set` - zestawy książek +- `book-section` - sekcje książek +- `book-part` - części książek +- `dissertation` - dysertacje/prace doktorskie +- `posted-content` - treści opublikowane online (preprints, itp.) +- `peer-review` - recenzje +- `other` - inne typy publikacji + +Konfiguracja mapowania w module Redagowania +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +Aby skonfigurować mapowanie charakterów CrossRef na charaktery formalne BPP: + +1. **Wejście do modułu administracyjnego** + + Zaloguj się jako administrator i przejdź do modułu Redagowania pod adresem `/admin/` + +2. **Przejście do konfiguracji mapowania** + + W sekcji "Dane systemowe" znajdź i kliknij opcję **"Crossref Mapper"** + +3. **Przeglądanie istniejących mapowań** + + Wyświetli się lista wszystkich dostępnych charakterów CrossRef API wraz z ich + aktualnymi mapowaniami na charaktery formalne BPP: + +4. **Konfiguracja mapowania** + + Dla każdego charakteru CrossRef: + + 1) Kliknij na rekord, który chcesz skonfigurować + 2) W polu "Charakter formalny bpp" wybierz odpowiedni charakter z listy rozwijanej + 3) Zapisz zmiany przyciskiem "Zapisz" + +Ważne zasady mapowania +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +!!! warning + + **Jeden rodzaj CrossRef może mieć tylko jedno mapowanie na charakter formalny systemu BPP.** + System nie pozwoli na przypisanie tego samego charakteru CrossRef do dwóch różnych + charakterów formalnych BPP. + + +!!! note + + \* Mapowanie jest opcjonalne - charaktery CrossRef mogą pozostać bez przypisania + \* Rekordy bez mapowania będą wyświetlane jako "\[brak zamapowania\]" + \* Zmiana mapowania wpłynie na wszystkie przyszłe importy z CrossRef API + + +Przykłady typowych mapowań +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +Poniżej przedstawiono sugerowane mapowania dla typowych charakterów: + +- `journal-article` → "Artykuł w czasopiśmie" +- `book` → "Książka" +- `book-chapter` → "Rozdział w książce" +- `edited-book` → "Książka redagowana" +- `proceedings-article` → "Artykuł w materiałach konferencyjnych" +- `proceedings` → "Materiały konferencyjne" + +!!! note + + Dokładne nazwy charakterów formalnych mogą się różnić w zależności od konfiguracji + danej instancji systemu BPP. Należy dopasować mapowanie do charakterów formalnych + zdefiniowanych w danej uczelni. + + +Weryfikacja poprawności mapowania +\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~~ + +Po skonfigurowaniu mapowań zaleca się przeprowadzenie testowego importu - +wykonaj próbny import publikacji z CrossRef API aby sprawdzić, czy +charaktery są poprawnie przypisywane diff --git a/docs/usage_admin.rst b/docs/usage_admin.rst deleted file mode 100644 index b6b35da7d..000000000 --- a/docs/usage_admin.rst +++ /dev/null @@ -1,419 +0,0 @@ -============================= -Instrukcja dla administratora -============================= - -Konfiguracja sposobu prezentacji danych dla użytkowników niezalogowanych ------------------------------------------------------------------------- - -Ustawienia globalne - rekord uczelni -==================================== - -* po zainstalowaniu systemu, gdy baza danych jest pusta, potrzebujesz - utworzyć obiekt "Uczelnia" za pomocą funkcji Redagowanie➡Struktura➡Uczelnia, - -* za pomocą tejże opcji możesz ustawić logo uczelni oraz ikonę favicon (czyli - zmniejszoną ikonę strony wyświetlającą się w pasku adresu przeglądarki oraz - na urządzeniach przenośnych), - -* za pomocą tej opcji ustawić możesz domyślą wartość pola "afiliuje" dla rekordów - wiążących rekordy prac (wydawnictwo ciągłe, zwarte i patent) z autorami - -Kolejnośc i zakres wyświetlanych wydziałów -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -* aby ustalić kolejność i zakres wyświetlanych wydziałów uczelni, potrzebujesz - przejrzeć obiekty "Wydział" znajdujące się poniżej formularza dla rekordu - Uczelni. Skorzystaj z funkcji Redagowanie➡Struktura➡Uczelnie. Wydziały mogą - być wyświetlane lub nie, możesz za pomocą tej funkcji ustawić je w określonej - kolejności. - - .. note:: - - wydziały w module interfejsu uzytkownika niezalogowanego nie są wyświelane - alfabetycznie a zgodnie z ustaloną kolejnością. - -* aby obejrzeć szczegóły wydziału skorzystaj z opcji - Redagowanie➡Struktura➡Wydział - -* pozostałe części serwisu dla użytkowników niezalogowanych wyświetlają - dane w formacie kolumnowym, posortowane alfabetycznie. - -Ukrywanie autorów na stronach jednostek -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Aby ukryć informacje na temat autora na stronie jednostki, należy skorzystać -z opcji "Pokazuj na stronach jednostek". W przypadku doktorantów lub autorów -którzy nie są pracownikami danej jednostki należy je odznaczyć. - -Po wybraniu dowolnego autora w module Redagowanie➡Wprowadzanie danych➡Autorzy -odznacz to pole i zapisz rekord, aby nie wyświetlać autora na stronie jednostki. - -.. image:: images/admin/pokazuj_na_stronach_jednostek.png - -Ukrywanie lub wyświetlanie raportów na stronie głównej -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Celem konfiguracji sposobu wyświetlania strony głównej jak i innych elementów -serwisu, skorzystaj z opcji Redagowanie➡Struktura➡Uczelnie, a następnie w sekcji -"Strona wizualna" wyedytuj ustawienia dotyczące pokazywania różnych opcji -(rankingi, raporty, opcje rekordu). Niektóre ustawienia umożliwiają wyświetlanie -lub chowanie danego elementu, niektóre umożliwiają wyświetlenie danego elementu -tylko dla użytkowników zalogowanych. - -.. image:: images/admin/uczelnia_strona_wizualna.png - - -Ukrywanie lub wyświetlanie formularzy wyszukiwania -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Gdy stworzysz formularz wyszukiwania w opcji Wyszukaj, możesz go zapisać. W ten -sposób formularz będzie dostępny w późniejszym czasie. Podczas zapisywania formularza -(opcja ta dostępna jest jedynie dla zalogowanych użytkowników) masz możliwość -określenia, czy chcesz, aby ten formularz widoczny był również dla innych -osób. - -Jeżeli chcesz później schować lub pokazać takie formularze, skorzystaj z opcji -Redagowanie➡Administracja➡Formularze wyszukiwania. Kliknij nazwę takiego -formularza, następnie zaznacz lub odznacz opcję "Publiczny" i zapisz rekord - -Sposób kalkulacji dyscyplin ---------------------------- - -1. Dyscyplina i subdyscyplina naukowa przypisana autorowi na dany rok zawiera się w rekordzie ``Autor_Dyscyplina``. - -2. Dyscyplina naukowa którą autor deklaruje dla danej publikacji jest określana przez bibliotekarza - każdorazowo dla powiązania autora do rekordu. - -3. Zachowanie systemu podczas zmiany przypisań dyscyplin na dany rok opisuje niniejsza instrukcja - w części :ref:`zachowanie-procedur`. - -4. Od wersji oprogramowania ``1.0.30-dev3`` system nie domniemuje automatycznie dyscypliny - dla danego przypisania autora do rekordu w przypadku braku takiej informacji. Innymi słowy, - **pole "Dyscyplina" przy powiązaniu autora z rekordem musi być wypełnione**. Jeżeli jest puste, - system nie bierze takiego autora pod uwagę przy kalkulacji dyscypliny. Zatem: - -5. Dyscyplina dla danego autora przy przypisaniu do rekordu istniejącego musi być explicte wpisana. - -6. Dyscyplina naukowa dla nowych rekordów: system podczas wpisywania nowego rekordu, po wybraniu - imienia i nazwiska autora przy powiązaniu autora do rekordu będzie starał się podpowiedzieć dyscyplinę - dla danego roku - w sytuacji, gdy autor ma wpisaną jedną. - -7. W sytuacji gdy autor ma wpisane dwie dyscypliny dla danego roku, system nie podpowiada dyscypliny, - pozostawiając to do decyzji bibliotekarza. - -.. _zachowanie-procedur: - -Zachowanie procedur utrzymujących integrację danych (triggerów) dla przypisań autora do dyscypliny --------------------------------------------------------------------------------------------------- - -Założenia -========= - -1. przypisanie autora do dyscypliny (rekord ``Autor_Dyscyplina``) na dany rok musi mieć główną dyscyplinę; - -2. pole subdyscyplina może być puste, - -3. procenty udziału dyscypliny i subdyscypliny, zsumowane, nie mogą przekroczyć 100% - -Zachowanie -========== - -1. **dopisanie dyscypliny** (utworzenie rekordu ``Autor_Dyscyplina``) na dany rok **nie powoduje** żadnych - zmian w rekordach powiązanych; jeżeli autor miał jakieś przypisania do rekordów, pole "Dyscyplina" - pozostaje w nich puste tzn ma nadal - - Rekordy te można będzie za pomocą zapytania bazodanowego przypisać do zadanych dyscyplin, - jeżeli taka jest wola i decyzja redaktora / osób odpowiedzialnych za merytoryczną zawartość bazy - danych. - -2. **zmiana dyscypliny lub subdyscypliny** na **inną** powoduje zmianę dyscypliny przypisanej dla - powiązań autor + rekord dla danego roku, dla danego autora - we wszystkich rekordach, które - mają „starą” dyscyplinę lub subdyscyplinę - na nową - -3. **zmiana subdyscypliny** na **pustą** powoduje zmianę dyscypliny przypisanej dla - powiązań autor + rekord dla danego roku, dla danego autora - we wszystkich rekordach, które - mają „starą” subdyscyplinę - na pustą. - -4. **usunięcie przypisania** autora do dyscypliny (rekord ``Autor_Dyscyplina``) powoduje ustawienie - wartości pustej (``NULL``) dla danego roku, dla danego autora - we wszystkich rekordach, do - których przypisany jest dany autor. - - -Pola "... ogólny" ("typ ogólny", "charakter ogólny" itp) --------------------------------------------------------- - -W kilku miejscach systemu możemy natknąć się na pola nazwane w sposób -"... ogólny", "... dla eksportu", "... dla slotów" itp. - -Przykładowo, -charakter formalny dla rekordów (Redagowanie➡Dane systemowe➡Charaktery formalne) -ma takie pola w chwili pisania tej dokumentacji: - -* charakter PBN -* charakter dla slotów -* rodzaj dla PBN -* nazwa w PRIMO - -Podobnie typ odpowiedzialności autora, czyli rekord określający czy osoba -przypisana do rekordu jest jego autorem czy np. redaktorem bądź tłumaczem -(Redagowanie➡Dane systemowe➡Typy odpowiedzialności) posiada: - -* ogólny typ odpowiedzialności - -Tego typu pola wydają się w pewnym sensie dublować informacje zawarte już w innych -polach rekordu. - -Przykładowo typ odpowiedzialności "autor korespondencyjny" może mieć -pozornie zdublowaną informację "autor" jako typ ogólny. Podobnie, charakter formalny -"książka w języku polskim" może mieć pozornie zdublowaną informację "charkater dla slotów" -równe "książka". - -Tego typu zapis danych jest jednak jak najbardziej celową i świadomą decyzją ze strony autorów -oprogramowania BPP. - -Dzięki temu możemy sobie pozwolić na dowolnie zapisaną -nazwę danego charakteru formalnego bądź odpowiedzialności autora. W ten sposób -nie musimy np zmieniać informacji historycznej w systemie, bądź dokładać sobie -pracy w razie importu danych z zewnętrznych źródeł. Nazwa charakteru bądź typu odpowiedzialności -może byc w takim układzie dowolna. - -System jednak potrzebuje wiedzieć dokładnie na potrzeby obliczeń, raportów i eksportu -danych, czy np. tekstowe określenie "autor korespondencyjny" czy "redaktor korespondencyjny wydania polskiego" -to autor, tłumacz czy redaktor - i właśnie dla takiego celu stworzone zostały pola -"... ogólne". Pola z charakterem "ogólnym" danego rekordu zawiera kilka rodzajów typów, odgórnie -zdefiniowanych w kodzie programu, które to potem w tym kodzie są wykorzystywane - na -potrzeby procedur liczących, raportujących, eksportujących dane itp. - - -Konfiguracja rodzaju i kolejności wyświetlanych kolumn w module redagowania ---------------------------------------------------------------------------- - -System umożliwia zmianę rodzaju i ilości wyświetlanych kolumn w module redagowania. W tym celu -użytkownik posiadający uprawnienia administratora po zalogowaniu się powinien w module redagowania -wejść w opcję Administracja -> Kolumny w module redagowania: - -.. image:: images/admin/dynamic_columns/dynamic_columns_1.png - -Następnie wyświetli się nam tabelka. W prawym górnym rogu, za pomocą opcji "Filtruj" wybieramy, -dla którego modułu chcemy skonfigurować kolumny. Klikamy na przycisk "Filtruj" - -.. image:: images/admin/dynamic_columns/dynamic_columns_2.png - -I wybieramy interesujący nas moduł: - -.. image:: images/admin/dynamic_columns/dynamic_columns_3.png - -Następnie możemy - za pomocą szarego prostokątu po prawej stronie - zmieniać kolejność kolumn. -Wystarczy najechac na niego myszą i przeciągnąć (ang. *drag and drop*): - -.. image:: images/admin/dynamic_columns/dynamic_columns_4.png - -Można też wybrane kolumny podświetlić za pomocą ptaszków (ang. *checkbox*) po lewej stronie i -na dole tabeli wybrać jedno z działań np włączyć lub wyłączyć grupowo wiele pól na raz. - -.. image:: images/admin/dynamic_columns/dynamic_columns_5.png - -.. note:: Niektóre kolumny w kodzie programu ustawione są jako *zawsze* *widoczne* i nie będą - dostępne do edycji. Nie będzie można zmienić ich kolejności ani ich schować. - -.. note:: Im więcej kolumn wybranych, tym więcej danych musi przetworzyć system. Im mniej - - tym tabele będą wyświetlały się szybciej. - - -Uzupełnianie pustych dat oświadczeń PBN w rekordach publikacji --------------------------------------------------------------- - -W systemie BPP może wystąpić sytuacja, gdy rekordy powiązań autorów z publikacjami -(Wydawnictwo_Ciagle_Autor, Wydawnictwo_Zwarte_Autor) nie mają wypełnionych dat oświadczeń -potrzebnych do prawidłowej integracji z PBN. System udostępnia procedury do automatycznego -wypełnienia tych dat oraz wysłania oświadczeń do PBN. - -Procedura uzupełniania dat oświadczeń -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1. **Wypełnienie pustych dat oświadczeń** - - Pierwszym krokiem jest uruchomienie procedury, która automatycznie ustawi daty oświadczeń - na podstawie daty utworzenia rekordu publikacji: - - .. code-block:: bash - - python src/manage.py ustaw_daty_oswiadczenia_pbn - - Ta procedura: - - - Wyszukuje wszystkie rekordy powiązań autor-publikacja z pustymi datami oświadczeń - - Uwzględnia tylko publikacje z rokiem wydania >= 2022 - - Ustawia datę oświadczenia na datę utworzenia nadrzędnego rekordu publikacji - - Aktualizuje rekordy w tabelach ``Wydawnictwo_Ciagle_Autor`` i ``Wydawnictwo_Zwarte_Autor`` - - .. note:: - - Przed właściwym uruchomieniem procedury zaleca się wykonanie testu za pomocą opcji ``--dry-run``, - aby sprawdzić, które rekordy zostaną zaktualizowane: - - .. code-block:: bash - - python src/manage.py ustaw_daty_oswiadczenia_pbn --dry-run - -2. **Autoryzacja w systemie PBN** - - Przed wysyłaniem oświadczeń należy się upewnić, że system jest autoryzowany w PBN. - W przypadku braku autoryzacji należy wykonać procedurę logowania opisaną w dokumentacji - konfiguracji PBN. - -3. **Aktualizacja danych lokalnych przed pierwszym importem** - - Przed pierwszym wysłaniem oświadczeń do PBN należy upewnić się, że dane lokalne publikacji - są aktualne i zsynchronizowane z systemem PBN. W tym celu należy pobrać publikacje z profilu - instytucji za pomocą API v2: - - .. code-block:: bash - - python src/manage.py pbn_pobierz_publikacje_z_instytucji_v2 - - Ta procedura: - - - Pobiera wszystkie publikacje z profilu instytucji w systemie PBN - - Synchronizuje dane lokalne z danymi w PBN - - Zapewnia spójność przed wysyłką oświadczeń - -4. **Wysyłanie oświadczeń do PBN** - - Po uzupełnieniu dat oświadczeń można przystąpić do ich wysłania do systemu PBN: - - .. code-block:: bash - - python src/manage.py pbn_wyslij_oswiadczenia_instytucji --year 2023 - - Opcje dostępne przy wysyłaniu oświadczeń: - - - ``--year `` - wysyła oświadczenia dla wszystkich publikacji z określonego roku - - ``--dry-run`` - tryb testowy, pokazuje co zostałoby wysłane bez faktycznej wysyłki - - ``:`` - wysyła oświadczenie dla konkretnej publikacji (np. ``wydawnictwo_ciagle:123``) - - .. warning:: - - Podczas wysyłania publikacji do PBN, jeżeli w API v2 PBN znajdą się publikacje, - których nie ma w lokalnej bazie danych, zostaną one automatycznie pobrane, - a ich nazwy wypisane na standardowym wyjściu programu. - -Przykład kompletnej procedury -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - # 1. Test uzupełniania dat (opcjonalnie) - python src/manage.py ustaw_daty_oswiadczenia_pbn --dry-run - - # 2. Uzupełnienie dat oświadczeń - python src/manage.py ustaw_daty_oswiadczenia_pbn - - # 3. Aktualizacja danych lokalnych (przed pierwszym importem) - python src/manage.py pbn_pobierz_publikacje_z_instytucji_v2 - - # 4. Wysłanie oświadczeń dla publikacji z 2023 roku - python src/manage.py pbn_wyslij_oswiadczenia_instytucji --year 2023 - -.. note:: - - Wszystkie powyższe operacje wymagają prawidłowej konfiguracji integracji z PBN - oraz autoryzacji użytkownika w systemie PBN. Szczegóły konfiguracji znajdują - się w dokumentacji :doc:`konfiguracja_pbn`. - - -Konfiguracja mapowania charakterów CrossRef API na charaktery formalne BPP --------------------------------------------------------------------------- - -System BPP umożliwia integrację z CrossRef API do pobierania danych publikacji. -Aby prawidłowo zaimportować dane z CrossRef, konieczne jest skonfigurowanie mapowania -między charakterami formalnej publikacji używanymi przez CrossRef API a charakterami -formalnymi zdefiniowanymi w systemie BPP. - -Dostępne charaktery CrossRef API -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -System CrossRef API wykorzystuje następujące typy charakterów publikacji: - -* ``journal-article`` - artykuły w czasopismach -* ``proceedings-article`` - artykuły w materiałach konferencyjnych -* ``book`` - książki -* ``book-chapter`` - rozdziały w książkach -* ``edited-book`` - książki redagowane -* ``proceedings`` - materiały konferencyjne -* ``monograph`` - monografie -* ``reference-book`` - książki referencyjne/podręczniki -* ``book-series`` - serie książkowe -* ``book-set`` - zestawy książek -* ``book-section`` - sekcje książek -* ``book-part`` - części książek -* ``dissertation`` - dysertacje/prace doktorskie -* ``posted-content`` - treści opublikowane online (preprints, itp.) -* ``peer-review`` - recenzje -* ``other`` - inne typy publikacji - -Konfiguracja mapowania w module Redagowania -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Aby skonfigurować mapowanie charakterów CrossRef na charaktery formalne BPP: - -1. **Wejście do modułu administracyjnego** - - Zaloguj się jako administrator i przejdź do modułu Redagowania pod adresem ``/admin/`` - -2. **Przejście do konfiguracji mapowania** - - W sekcji "Dane systemowe" znajdź i kliknij opcję **"Crossref Mapper"** - - -3. **Przeglądanie istniejących mapowań** - - Wyświetli się lista wszystkich dostępnych charakterów CrossRef API wraz z ich - aktualnymi mapowaniami na charaktery formalne BPP: - - -4. **Konfiguracja mapowania** - - Dla każdego charakteru CrossRef: - - a) Kliknij na rekord, który chcesz skonfigurować - b) W polu "Charakter formalny bpp" wybierz odpowiedni charakter z listy rozwijanej - c) Zapisz zmiany przyciskiem "Zapisz" - - -Ważne zasady mapowania -~~~~~~~~~~~~~~~~~~~~~ - -.. warning:: - **Jeden rodzaj CrossRef może mieć tylko jedno mapowanie na charakter formalny systemu BPP.** - System nie pozwoli na przypisanie tego samego charakteru CrossRef do dwóch różnych - charakterów formalnych BPP. - -.. note:: - * Mapowanie jest opcjonalne - charaktery CrossRef mogą pozostać bez przypisania - * Rekordy bez mapowania będą wyświetlane jako "[brak zamapowania]" - * Zmiana mapowania wpłynie na wszystkie przyszłe importy z CrossRef API - -Przykłady typowych mapowań -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Poniżej przedstawiono sugerowane mapowania dla typowych charakterów: - -* ``journal-article`` → "Artykuł w czasopiśmie" -* ``book`` → "Książka" -* ``book-chapter`` → "Rozdział w książce" -* ``edited-book`` → "Książka redagowana" -* ``proceedings-article`` → "Artykuł w materiałach konferencyjnych" -* ``proceedings`` → "Materiały konferencyjne" - -.. note:: - Dokładne nazwy charakterów formalnych mogą się różnić w zależności od konfiguracji - danej instancji systemu BPP. Należy dopasować mapowanie do charakterów formalnych - zdefiniowanych w danej uczelni. - -Weryfikacja poprawności mapowania -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Po skonfigurowaniu mapowań zaleca się przeprowadzenie testowego importu - -wykonaj próbny import publikacji z CrossRef API aby sprawdzić, czy -charaktery są poprawnie przypisywane diff --git a/docs/wyszukiwanie_redagowanie.md b/docs/wyszukiwanie_redagowanie.md new file mode 100644 index 000000000..83caeced6 --- /dev/null +++ b/docs/wyszukiwanie_redagowanie.md @@ -0,0 +1,240 @@ +# Wyszukiwanie i filtrowanie rekordów w module Redagowanie + +## Wyszukiwanie globalne + +Cały moduł Redagowanie, podobnie jak i moduł dla użytkowników niezalogowanych +wyposażony jest w globalne wyszukiwanie. Na górze ekranu znajduje się pole +tekstowe, w które możemy wpisać część tytułu rekordu aby przeszukać jednocześnie +wydawnictwa ciągłe, zwarte, patenty, habilitacje, doktoraty, autorów, jednostki +i źródła. W ten sposób wygodnie można przejść do pożądanego rekordu. + +![image](images/admin/wyszukiwanie_globalne.png) + +Po wpisaniu ciągu znaków otrzymujemy rozwijaną listę z rekordami różnego rodzaju: + +![image](images/admin/wyszukiwanie_globalne_2.png) + +!!! note + + Do tego pola możemy wprowadzić numer ID rekordu aby znaleźć rekord o tym ID. + + +## Filtrowanie konkretnych tabel + +### Filtr tekstowy + +Większość tabel w module Redagowanie wyposażona jest w okno filtru tekstowego. +Możemy tam wpisać dowolny ciąg znaków (włącznie z numerem ID), w ten sposób +powodując, ze system wyszuka prace zawierające ten ciąg znaków. Zazwyczaj +przeszukiwane jest pole "tytuł oryginalny", "źródło", "informacje", "szczegóły", +"adnotacje", "rok" ale dla specyficznych tabel mogą być to również inne pola. + +![image](images/admin/wyszukiwanie.png) + +### Filtr precyzyjny + +Filtrowanie precyzyjne pozwala nam wybrać prace w bardziej szczegółowy sposób, +na podstawie konkretnych pól. Przykładowo, na poniższym rysunku przedstawione są +dostępne filtry dla tabeli "Wydawnictwo ciągłe". + +![image](images/admin/filtry.png) + +Na poniższym rysunku z kolei przedstawione są przykładowe opcje dla pola "Język". + +image + +### Filtrowanie przy pomocy języka zapytań + +Część tabel w module Redagowanie umożliwia wyszukiwanie rekordów przy pomocy języka +zapytań [DjangoQL](https://github.com/ivelum/djangoql#language-reference) . Można poznać to po tym, że w polu filtru tekstowego będzie widniała, +domyślnie wyłączona, kontrolka typu "checkbox" - jak na zrzucie ekranu ponizej: + +![image](images/admin/djangoql_1.png) + +Kontrolka pusta - wyłaczona, oznacza, że filtrowanie DjangoQL jest wyłączone; wyszukiwanie za +pomocą tekstu będzie wyglądało tak, jak opisane w sekcji [Filtr tekstowy](#filtr-tekstowy). + +Po włączeniu kontrolki będziemy mieli możliwość wpisania nie tekstu do wyszukania, ale +zapytania w języku [DjangoQL](https://github.com/ivelum/djangoql#language-reference) . Przykładowo, dla tabeli wydawnictw ciągłych chcielibyśmy +wyszukać rekordy opublikowane w roku 2010 lub 2020 powinniśmy wpisać: + +``` python +rok = 2010 or rok = 2020 +``` + +Wybór rzecz jasna zatwierdzamy klawiszem ENTER lub klikając w lupę. W rezultacie otrzymujemy wynik wyszukiwania: + +![image](images/admin/djangoql_2.png) + +Spróbujmy czegoś trudniejszego. Wyszukajmy prace, których impact factor jest większy od 2 i charakter +formalny to artykuł lub ksiażka. Redaktor na pewno zauważy, że podczas pisania tekstu przy włączonym wyszukiwaniu +[DjangoQL](https://github.com/ivelum/djangoql#language-reference) system próbuje podpowiadać nazwy kolumn: + +![image](images/admin/djangoql_3.png) + +Po wpisaniu kilku znaków więcej i naciśnięciu kropki otrzymujemy podopowiedzi wszystkich pól obiektu +"Charakter formalny", które możemy przeszukac: + +![image](images/admin/djangoql_4.png) + +Dokończmy nasze zapytanie: + +``` python +(charakter_formalny.skrot = "KSP" or charakter_formalny.skrot = "AC") and impact_factor > 2 +``` + +Jak widać na zrzucie ekranu poniżej, zadziałało ono: + +![image](images/admin/djangoql_5.png) + +Jeżeli wpiszemy zapytanie niepoprawnie, nic się nie stanie. System nie wykona takiego zapytania, +informując nas o błedzie składniowym. Przykładowo gdy zamiast operatora `or` użyjemy polskiego +słowa `lub`, system poinformuje nas o tym w taki sposób: + +![image](images/admin/djangoql_6.png) + +### Przykładowe zapytania w DjangoQL + +#### Rekordy z dyscyplinami + +Załózmy, że chcemy odfiltrować wszystkie rekordy z uzupełnionymi dyscyplinami -- rekordy, gdzie przynajmniej +jedna dyscyplina jest uzupełniona. + +Z uwagi na sposób w jaki budowane +są zapytania po stronie bazy danych i z uwagi na strukturę danych, zapytanie takie jak poniżej nie da pożądanych +efektów: + +``` python +autorzy_set.dyscyplina_naukowa != None +``` + +To zapytanie znajdzie rekordy, gdzie **wszystkie** dyscypliny są wypełnione - czyli, że każdy podpięty do +rekordu autor ma określoną dyscyplinę; jeżeli przynajmniej jeden autor nie ma dyscypliny, to nie pojawi się +na liście wyników. + +Aby wyszukać rekordy z dyscyplinami, gdzie przynajmniej jeden autor ma dyscyplinę, zapytanie można sformułować w taki sposób: + +``` python +autorzy_set.dyscyplina_naukowa.nazwa ~ "a" +or autorzy_set.dyscyplina_naukowa.nazwa ~ "i" +``` + +W ten sposób szukamy prac z dyscypliną naukową zawierającą w nazwie literkę “A” (czyli wszystkie oprócz “rolnictwo i ogrodnictwo”) oraz literkę “I”. + +#### Rekordy w źródłach bez odpowiedników w PBN + +Aby znaleźć wszystkie wydawnictwa ciągłe, gdzie wpisana jest jakas dyscyplina, a **ich źródło** nie ma odpowiednika PBN, +a rok jest większy lub równy jak 2017, należy dla wydawnictw wpisać taki kod DjangoQL: + +``` python +(autorzy_set.dyscyplina_naukowa.nazwa ~ "a" or autorzy_set.dyscyplina_naukowa.nazwa ~ "i") +and rok >= 2017 +and zrodlo.pbn_uid = None +``` + +Autorzy ukryci, z aktualnym miejscem pracy określonym, innymi niż 'Obca jednostka' +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Aby znaleźć autorów z atrybutem "pokazuj" ustalonym na "nie", z aktualnym miejscem +pracy nie-pustym, ale innym, niż "Obca jednostka", w tabeli autorów wpisujemy następujące +zapytanie DjangoQL: + +``` python +pokazuj = False and aktualna_jednostka.nazwa != "Obca jednostka" +and aktualna_jednostka != None +``` + +#### Źródła bez odpowiednika w PBN, które mają publikacje w roku 2022 + +Po wejściu w Redagowanie -\> Źródła, + +``` python +pbn_uid = None and wydawnictwo_ciagle.rok = 2022 +``` + +#### Publikacje za lata 2020-2021 z określonym odpowiednikiem PBN oraz nieokreśloną informacją o płatności + +Po wejściu w Redagowanie -\> Wydawnictwa ciągłe/zwarte, + +``` python +pbn_uid != None and opl_pub_cost_free != None and rok >= 2020 and rok <= 2021 +``` + +#### Autorzy z kół naukowych (SKN) z ukrytymi profilami + +Wyszukiwanie autorów z ukrytymi profilami, którzy mają w swoich publikacjach jednostkę zawierającą "SKN" +w nazwie. Przydatne do znalezienia studentów z kół naukowych, którzy mają ukryte profile. + +Po wejściu w Redagowanie -\> Autorzy, można użyć następujących zapytań: + +Wyszukiwanie po ciągu znaków "SKN" w nazwie jednostki: + +``` python +autorzy.autor_jednostka.jednostka.nazwa ~ "SKN" and autorzy.pokazuj = False +``` + +Wyszukiwanie po rodzaju jednostki - koło naukowe (dowolna jednostka wśród jednostek autora): + +``` python +autorzy.autor_jednostka.jednostka.rodzaj_jednostki = "kolo_naukowe" and autorzy.pokazuj = False +``` + +Wyszukiwanie po aktualnej jednostce autora: + +``` python +autorzy.aktualna_jednostka.rodzaj_jednostki = "kolo_naukowe" and autorzy.pokazuj = False +``` + +Przykład zapytania w kontekście publikacji - znajdowanie publikacji ciągłych z autorami z kół naukowych +z ukrytymi profilami. Po wejściu w Redagowanie -\> Wydawnictwa ciągłe: + +``` python +autorzy.autor_jednostka.jednostka.nazwa ~ "SKN" and autorzy.pokazuj = False +``` + +#### Operatory logiczne a ich kolejność + +Operatory logiczne `and` (czyli po polsku `i`) oraz operator logiczny `or` (czyli po polsku `lub`) +zachowują się podobnie jak mnożenie i dodawanie. Odpowiednikiem mnożenia jest operator `and`, zaś odpowiednikiem +dodawania jest operator `lub`. Oznacza to, że ciąg zapytań `and` jest traktowany jak jedna całość: + +``` python +rok = 2020 and charakter_formalny.skrot = "KSP" and impact_factor > 2 +``` + +To zapytanie wyszuka prace z 2020 roku, z charakterem formalnym "KSP" czyli "książka polska" i z impact +factorem większym od 2. + +Dołożenie operatora `or` do takiego ciągu zapytań może nie dać dobrych efektów: + +``` python +rok = 2020 or rok = 2021 and charakter_formalny.skrot = "KSP" and impact_factor > 2 +``` + +Takie zapytanie znajdzie **wszystkie** rekordy z 2020 roku oraz prace z 2021 roku, z charakterem formalnym +"KSP" czyli "książka polska" i z impact factorem większym od 2. Rekordy z 2020 roku wygenerują się +wszystkie, ponieważ operator `or` działa jak dodawanie. Porównajmy pierwsze zapytanie: + +``` python +10 * 20 * 30 # <-- tak możemy przedstawić pierwsze przykładowe zapytanie +# wynik to 6000 +``` + +... a tak drugie: + +``` python +10 + 20 * 30 * 40 # <-- tak możemy przedsatwić drugie przykładowe zapytanie +# wynik działań to nie 36000, a 24010... +``` + +Na pierwszy rzut oka widać, co trzeba zrobić -- dodać nawiasy: + +``` python +(rok = 2020 or rok = 2021) and charakter_formalny.skrot = "KSP" and impact_factor > 2 +``` + +Analogicznie w przykładzie matematycznym: + +``` python +(10 + 20) * 30 * 40 # wynik to 36000 +``` diff --git a/docs/wyszukiwanie_redagowanie.rst b/docs/wyszukiwanie_redagowanie.rst deleted file mode 100644 index c48c676ed..000000000 --- a/docs/wyszukiwanie_redagowanie.rst +++ /dev/null @@ -1,286 +0,0 @@ - - -Wyszukiwanie i filtrowanie rekordów w module Redagowanie --------------------------------------------------------- - -Wyszukiwanie globalne -~~~~~~~~~~~~~~~~~~~~~~~~ - -Cały moduł Redagowanie, podobnie jak i moduł dla użytkowników niezalogowanych -wyposażony jest w globalne wyszukiwanie. Na górze ekranu znajduje się pole -tekstowe, w które możemy wpisać część tytułu rekordu aby przeszukać jednocześnie -wydawnictwa ciągłe, zwarte, patenty, habilitacje, doktoraty, autorów, jednostki -i źródła. W ten sposób wygodnie można przejść do pożądanego rekordu. - -.. image:: images/admin/wyszukiwanie_globalne.png - -Po wpisaniu ciągu znaków otrzymujemy rozwijaną listę z rekordami różnego rodzaju: - -.. image:: images/admin/wyszukiwanie_globalne_2.png - -.. note:: - - - Do tego pola możemy wprowadzić numer ID rekordu aby znaleźć rekord o tym ID. - -Filtrowanie konkretnych tabel -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Filtr tekstowy -++++++++++++++ - -Większość tabel w module Redagowanie wyposażona jest w okno filtru tekstowego. -Możemy tam wpisać dowolny ciąg znaków (włącznie z numerem ID), w ten sposób -powodując, ze system wyszuka prace zawierające ten ciąg znaków. Zazwyczaj -przeszukiwane jest pole "tytuł oryginalny", "źródło", "informacje", "szczegóły", -"adnotacje", "rok" ale dla specyficznych tabel mogą być to również inne pola. - -.. image:: images/admin/wyszukiwanie.png - -Filtr precyzyjny -++++++++++++++++ - -Filtrowanie precyzyjne pozwala nam wybrać prace w bardziej szczegółowy sposób, -na podstawie konkretnych pól. Przykładowo, na poniższym rysunku przedstawione są -dostępne filtry dla tabeli "Wydawnictwo ciągłe". - -.. image:: images/admin/filtry.png - -Na poniższym rysunku z kolei przedstawione są przykładowe opcje dla pola "Język". - -.. image:: images/admin/filtry_jezyk.png - :width: 30% - -Filtrowanie przy pomocy języka zapytań -++++++++++++++++++++++++++++++++++++++ - -Część tabel w module Redagowanie umożliwia wyszukiwanie rekordów przy pomocy języka -zapytań `DjangoQL`_ . Można poznać to po tym, że w polu filtru tekstowego będzie widniała, -domyślnie wyłączona, kontrolka typu "checkbox" - jak na zrzucie ekranu ponizej: - -.. image:: images/admin/djangoql_1.png - -Kontrolka pusta - wyłaczona, oznacza, że filtrowanie DjangoQL jest wyłączone; wyszukiwanie za -pomocą tekstu będzie wyglądało tak, jak opisane w sekcji `Filtr tekstowy`_. - -Po włączeniu kontrolki będziemy mieli możliwość wpisania nie tekstu do wyszukania, ale -zapytania w języku `DjangoQL`_ . Przykładowo, dla tabeli wydawnictw ciągłych chcielibyśmy -wyszukać rekordy opublikowane w roku 2010 lub 2020 powinniśmy wpisać: - -.. code-block:: python - - rok = 2010 or rok = 2020 - -Wybór rzecz jasna zatwierdzamy klawiszem ENTER lub klikając w lupę. W rezultacie otrzymujemy wynik wyszukiwania: - -.. image:: images/admin/djangoql_2.png - -.. note :: Język zapytań DjangoQL działa w kontekście danej tabeli. Oznacza to, że zapytanie ``rok = 2020`` da zupełnie - poprawne wyniki w kontekście tabeli wydawnictw ciągłych lub zwartych, zaś uruchomione w tabeli źródeł zwróci błąd. - Będzie tak dlatego, że źródła w swoim opisie nie posiadają pola ``rok``. Przykłady w tym rozdziale operaują na tabelach - wydawnictw. - -Spróbujmy czegoś trudniejszego. Wyszukajmy prace, których impact factor jest większy od 2 i charakter -formalny to artykuł lub ksiażka. Redaktor na pewno zauważy, że podczas pisania tekstu przy włączonym wyszukiwaniu -`DjangoQL`_ system próbuje podpowiadać nazwy kolumn: - -.. image:: images/admin/djangoql_3.png - -Po wpisaniu kilku znaków więcej i naciśnięciu kropki otrzymujemy podopowiedzi wszystkich pól obiektu -"Charakter formalny", które możemy przeszukac: - -.. image:: images/admin/djangoql_4.png - -.. note :: Część nazw pól może być oczywista już na pierwszy rzut oka, jak na przykład ``charakter_formalny.nazwa`` czy - ``charakter_formalny.skrot``. Pozostałe mogą nie być tak oczywiste, ale nie przejmujemy się tym - - część pól może mieć znaczenie dla systemu i ich przeszukiwanie przez użytkownika nie będzie mu w żaden - sposób przydatne. Przykładem mogą być widoczne na zrzucie ekranu pola nazwane ``lft``, ``rght``, ``parent``, - ``level``, które odpowiadają za drzewiastą strukturę tabeli charakterów formalnych i ich interpretacją - zajmują się odpowiednie procedury po stronie oprogramowania i bazy danych. - -Dokończmy nasze zapytanie: - -.. code-block:: python - - (charakter_formalny.skrot = "KSP" or charakter_formalny.skrot = "AC") and impact_factor > 2 - -Jak widać na zrzucie ekranu poniżej, zadziałało ono: - -.. image:: images/admin/djangoql_5.png - -Jeżeli wpiszemy zapytanie niepoprawnie, nic się nie stanie. System nie wykona takiego zapytania, -informując nas o błedzie składniowym. Przykładowo gdy zamiast operatora ``or`` użyjemy polskiego -słowa ``lub``, system poinformuje nas o tym w taki sposób: - -.. image:: images/admin/djangoql_6.png - -Przykładowe zapytania w DjangoQL -++++++++++++++++++++++++++++++++ - -Rekordy z dyscyplinami -"""""""""""""""""""""" - -Załózmy, że chcemy odfiltrować wszystkie rekordy z uzupełnionymi dyscyplinami -- rekordy, gdzie przynajmniej -jedna dyscyplina jest uzupełniona. - -Z uwagi na sposób w jaki budowane -są zapytania po stronie bazy danych i z uwagi na strukturę danych, zapytanie takie jak poniżej nie da pożądanych -efektów: - -.. code-block:: python - - autorzy_set.dyscyplina_naukowa != None - -To zapytanie znajdzie rekordy, gdzie **wszystkie** dyscypliny są wypełnione - czyli, że każdy podpięty do -rekordu autor ma określoną dyscyplinę; jeżeli przynajmniej jeden autor nie ma dyscypliny, to nie pojawi się -na liście wyników. - -Aby wyszukać rekordy z dyscyplinami, gdzie przynajmniej jeden autor ma dyscyplinę, zapytanie można sformułować w taki sposób: - -.. code-block:: python - - autorzy_set.dyscyplina_naukowa.nazwa ~ "a" - or autorzy_set.dyscyplina_naukowa.nazwa ~ "i" - -W ten sposób szukamy prac z dyscypliną naukową zawierającą w nazwie literkę “A” (czyli wszystkie oprócz “rolnictwo i ogrodnictwo”) oraz literkę “I”. - -Rekordy w źródłach bez odpowiedników w PBN -"""""""""""""""""""""""""""""""""""""""""" - -Aby znaleźć wszystkie wydawnictwa ciągłe, gdzie wpisana jest jakas dyscyplina, a **ich źródło** nie ma odpowiednika PBN, -a rok jest większy lub równy jak 2017, należy dla wydawnictw wpisać taki kod DjangoQL: - -.. code-block:: python - - (autorzy_set.dyscyplina_naukowa.nazwa ~ "a" or autorzy_set.dyscyplina_naukowa.nazwa ~ "i") - and rok >= 2017 - and zrodlo.pbn_uid = None - -Autorzy ukryci, z aktualnym miejscem pracy określonym, innymi niż 'Obca jednostka' -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -Aby znaleźć autorów z atrybutem "pokazuj" ustalonym na "nie", z aktualnym miejscem -pracy nie-pustym, ale innym, niż "Obca jednostka", w tabeli autorów wpisujemy następujące -zapytanie DjangoQL: - -.. code-block:: python - - pokazuj = False and aktualna_jednostka.nazwa != "Obca jednostka" - and aktualna_jednostka != None - - -Źródła bez odpowiednika w PBN, które mają publikacje w roku 2022 -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -Po wejściu w Redagowanie -> Źródła, - -.. code-block:: python - - pbn_uid = None and wydawnictwo_ciagle.rok = 2022 - -Publikacje za lata 2020-2021 z określonym odpowiednikiem PBN oraz nieokreśloną informacją o płatności -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -Po wejściu w Redagowanie -> Wydawnictwa ciągłe/zwarte, - -.. code-block:: python - - pbn_uid != None and opl_pub_cost_free != None and rok >= 2020 and rok <= 2021 - -Autorzy z kół naukowych (SKN) z ukrytymi profilami -""""""""""""""""""""""""""""""""""""""""""""""""""" - -Wyszukiwanie autorów z ukrytymi profilami, którzy mają w swoich publikacjach jednostkę zawierającą "SKN" -w nazwie. Przydatne do znalezienia studentów z kół naukowych, którzy mają ukryte profile. - -Po wejściu w Redagowanie -> Autorzy, można użyć następujących zapytań: - -Wyszukiwanie po ciągu znaków "SKN" w nazwie jednostki: - -.. code-block:: python - - autorzy.autor_jednostka.jednostka.nazwa ~ "SKN" and autorzy.pokazuj = False - -.. note :: Operator ``~`` oznacza, że w nazwie jednostki ma być ciąg znaków "SKN" - -Wyszukiwanie po rodzaju jednostki - koło naukowe (dowolna jednostka wśród jednostek autora): - -.. code-block:: python - - autorzy.autor_jednostka.jednostka.rodzaj_jednostki = "kolo_naukowe" and autorzy.pokazuj = False - -Wyszukiwanie po aktualnej jednostce autora: - -.. code-block:: python - - autorzy.aktualna_jednostka.rodzaj_jednostki = "kolo_naukowe" and autorzy.pokazuj = False - -.. note :: Ostatnie zapytanie może nie dać rezultatów, jeżeli autorzy z kół naukowych nie mają obecnie - przypisanej aktualnej jednostki jako koło naukowe. - -Przykład zapytania w kontekście publikacji - znajdowanie publikacji ciągłych z autorami z kół naukowych -z ukrytymi profilami. Po wejściu w Redagowanie -> Wydawnictwa ciągłe: - -.. code-block:: python - - autorzy.autor_jednostka.jednostka.nazwa ~ "SKN" and autorzy.pokazuj = False - -.. note :: W przypadku wydawnictw ciągłych to zapytanie może znaleźć nawet 1618 prac. Dodatkowo można - filtrować wyniki przy pomocy filtrów z boku ekranu. - -Operatory logiczne a ich kolejność -"""""""""""""""""""""""""""""""""" - -Operatory logiczne ``and`` (czyli po polsku ``i``) oraz operator logiczny ``or`` (czyli po polsku ``lub``) -zachowują się podobnie jak mnożenie i dodawanie. Odpowiednikiem mnożenia jest operator ``and``, zaś odpowiednikiem -dodawania jest operator ``lub``. Oznacza to, że ciąg zapytań ``and`` jest traktowany jak jedna całość: - -.. code-block:: python - - rok = 2020 and charakter_formalny.skrot = "KSP" and impact_factor > 2 - -To zapytanie wyszuka prace z 2020 roku, z charakterem formalnym "KSP" czyli "książka polska" i z impact -factorem większym od 2. - -Dołożenie operatora ``or`` do takiego ciągu zapytań może nie dać dobrych efektów: - -.. code-block:: python - - rok = 2020 or rok = 2021 and charakter_formalny.skrot = "KSP" and impact_factor > 2 - -Takie zapytanie znajdzie **wszystkie** rekordy z 2020 roku oraz prace z 2021 roku, z charakterem formalnym -"KSP" czyli "książka polska" i z impact factorem większym od 2. Rekordy z 2020 roku wygenerują się -wszystkie, ponieważ operator ``or`` działa jak dodawanie. Porównajmy pierwsze zapytanie: - -.. code-block:: python - - 10 * 20 * 30 # <-- tak możemy przedstawić pierwsze przykładowe zapytanie - # wynik to 6000 - -... a tak drugie: - -.. code-block:: python - - 10 + 20 * 30 * 40 # <-- tak możemy przedsatwić drugie przykładowe zapytanie - # wynik działań to nie 36000, a 24010... - -Na pierwszy rzut oka widać, co trzeba zrobić -- dodać nawiasy: - -.. code-block:: python - - (rok = 2020 or rok = 2021) and charakter_formalny.skrot = "KSP" and impact_factor > 2 - -Analogicznie w przykładzie matematycznym: - -.. code-block:: python - - (10 + 20) * 30 * 40 # wynik to 36000 - - -.. note :: Podobnie jak w matematyce mnożenie przed dodawaniem -- operator logiczny - ``and`` ma pierwszeństwo przed operatorem logicznym ``or``. Po więcej informacji zapraszamy - na `Wikipedię`_ - - -.. _DjangoQL: https://github.com/ivelum/djangoql#language-reference -.. _Wikipedię: https://pl.wikipedia.org/wiki/Operator_logiczny diff --git a/docs/zglos_publikacje.rst b/docs/zglos_publikacje.md similarity index 70% rename from docs/zglos_publikacje.rst rename to docs/zglos_publikacje.md index 6f07ab42b..f7b2a8c90 100644 --- a/docs/zglos_publikacje.rst +++ b/docs/zglos_publikacje.md @@ -1,23 +1,24 @@ -Zgłaszanie publikacji ---------------------- +# Zgłaszanie publikacji -Proces -====== +## Proces -.. note:: Jednym z założeń systemu BPP jest najwyższa jakość danych przechowywanych w bazie. Pracownicy +!!! note + + Jednym z założeń systemu BPP jest najwyższa jakość danych przechowywanych w bazie. Pracownicy naukowi instytucji mogą zgłaszać swoje publikacje, jednak nie jest to proces jednoznaczny z dopisaniem pracy do bazy. Zgłoszenia publikacji mogą być przeglądane i weryfikowane przez bibliotekarzy i w następnej kolejności mogą do bazy zostać dopisane. Bez założenia loginu i przypisania uprawnień pracownik naukowy nie jest w stanie dopisywać żadnych rekordów do bazy. + Moduł "zgłoś publikację" umożliwia zgłaszanie publikacji użytkownikom nie mającym loginu do systemu, np pracownikom naukowym uczelni. -.. image:: images/admin/zglos_publikacje/zglos_publikacje_0.png +![image](images/admin/zglos_publikacje/zglos_publikacje_0.png) Po kliknięciu w link użytkownik otrzymuje formularz: -.. image:: images/admin/zglos_publikacje/zglos_publikacje_2.png +![image](images/admin/zglos_publikacje/zglos_publikacje_2.png) W zależności od wybranych przez użytkownika opcji, formularz ma różną ilość kroków. @@ -27,25 +28,23 @@ oraz czy publikacja jest dostępna w sieci pod jakimś adresem. Jeżeli pole "Dostępna w sieci pod adresem" jest puste, w następnym kroku zostanie wyświetlona prośba o wysłanie załącznika PDF z pełnym tekstem zgłaszanej publikacji. -.. image:: images/admin/zglos_publikacje/zglos_publikacje_3.png +![image](images/admin/zglos_publikacje/zglos_publikacje_3.png) Następnie system zapyta o autorów publikacji. Można wpisywać autorów wraz z dyscyplinami - jest to szczególnie ważne dla autorów wielodyscyplinowych. Można też nic nie wpisywać: -.. image:: images/admin/zglos_publikacje/zglos_publikacje_4.png +![image](images/admin/zglos_publikacje/zglos_publikacje_4.png) Jeżeli "rodzaj zgłaszanej publikacji" to "artykuł naukowy lub monografia", w ostatnim kroku zostanie wyświetlony do uzupełnienia formularz opłat za publikację, chyba, ze skonfigurowano inaczej. -.. image:: images/admin/zglos_publikacje/zglos_publikacje_5.png +![image](images/admin/zglos_publikacje/zglos_publikacje_5.png) Po pomyślnym zakończeniu zgłaszania publikacji użytkownik zobaczy informację z podziękowaniem: -.. image:: images/admin/zglos_publikacje/zglos_publikacje_6.png +![image](images/admin/zglos_publikacje/zglos_publikacje_6.png) - -Powiadamianie redaktorów -======================== +## Powiadamianie redaktorów W ostatnim kroku system informował nas o powiadomieniu redaktorów systemu o nowym zgłoszeniu. Kto otrzymuje takie powiadomienia? @@ -54,9 +53,9 @@ Domyślnie otrzymają takie powiadomienie wszystkie osoby, które są w grupie " Jeżeli jednak mamy użytkowników w systemie dopisanych do grupy "wprowadzanie danych", wówczas tylko tacy użytkownicy otrzymają powiadomienia o nowych zgłoszeniach. Możemy ich do niej dopisać, korzystając z opcji -Redagowanie -> Administracja -> Użytkownicy. +Redagowanie -\> Administracja -\> Użytkownicy. -Możemy też rozdzielać powiadomienia wg wydziałów uczelni. Za pomocą opcji Redagowanie -> Administracja -> Obsługa zgłoszeń +Możemy też rozdzielać powiadomienia wg wydziałów uczelni. Za pomocą opcji Redagowanie -\> Administracja -\> Obsługa zgłoszeń prac - wydziały możemy dopisać konkretnych użytkowników do konkretnych wydziałów. W sytuacji, gdy zgłaszający publikację wypełni przynajmniej jednego autora i jego jednostkę, powiadomienie o tym zgłoszeniu trafi do przypisanej osoby - według wydziału pierwszej, skupiającej pracowników jednostki autora, wg kolejności autorów @@ -69,38 +68,34 @@ Nic nie stoi na przeszkodzie, aby przypisać też osoby powiadamiane w przypadku do obcej jednostki (przydzielając jej wirtualny wydział np "obcy wydział") - w tej sytuacji powiadomienia będą mogły otrzymać osoby gdy np praca nie ma żadnego autora z uczelni. +## Zwracanie zgłoszenia -Zwracanie zgłoszenia -==================== - -W przypadku, gdyby zgłoszenie wymagało poprawek, po wejściu w nie w module redagowania (Redagowanie -> Wprowadzanie danych --> Zgłoszenia publikacji -> tytuł zgłoszenia) szukamy przycisku "Zwróć do autora", który znajduje się na belce nad +W przypadku, gdyby zgłoszenie wymagało poprawek, po wejściu w nie w module redagowania (Redagowanie -\> Wprowadzanie danych +-\> Zgłoszenia publikacji -\> tytuł zgłoszenia) szukamy przycisku "Zwróć do autora", który znajduje się na belce nad formularzem. Po kliknięciu możemy wpisać powód zwrócenia zgłoszenia. Autor otrzyma e-mail z powodem zwrócenia zgłoszenia oraz z linkiem do edycji zgłoszenia. Gdy je zatwierdzi, redaktor otrzyma powiadomienie wg reguł jak wyżej. -Wymaganie zalogowania -===================== +## Wymaganie zalogowania Moduł może zostać skonfigurowany tak, aby wymagać zalogowania się przez użytkownika. W ten sposób, przy jednoczesnej -włączonej integracji z :ref:`LDAP (ActiveDirectory) ` możemy wymagać od użytkowników zalogowania się na swoje konto w sieci -intranet -- nie trzeba każdemu zakładać loginu i hasła. +włączonej integracji z [LDAP (ActiveDirectory)](advanced.md#konfiguracja-ldap-activedirectory) możemy wymagać od użytkowników zalogowania się na swoje konto w sieci +intranet — nie trzeba każdemu zakładać loginu i hasła. -W tym celu należy wejsć w :ref:`edycję danych uczelni ` i zaznaczyć "Pokazuj opcję 'Zgłoś nową publikację'" jako +W tym celu należy wejsć w [edycję danych uczelni](edycja_uczelnia.md) i zaznaczyć "Pokazuj opcję 'Zgłoś nową publikację'" jako "tylko dla zalogowanych". Jeżeli chcemy umożliwić dodawanie zgłoszeń publikacji osobom niezalogowanym należy powyższą opcję ustawić jako "zawsze". Jeżeli chcemy w ogóle wyłączyć możliwość dodawania zgłoszeń publikacji, należy wybrać tam "nigdy". -.. image:: images/admin/zglos_publikacje/zglos_publikacje_1.png +![image](images/admin/zglos_publikacje/zglos_publikacje_1.png) -Wymaganie wpisania informacji o opłatach za publikację -====================================================== +## Wymaganie wpisania informacji o opłatach za publikację W przypadku, gdy użytkownik w pierwszym formularzu przy zgłaszaniu publikacji wybierze "artykuł lub monografia", domyślnie zostanie zapytany w ostatnim formularzu o opłaty. -Możemy wyłaczyć tą opcję i nie pytać o opłaty. W tym celu należy wejsć w :ref:`edycję danych uczelni ` +Możemy wyłaczyć tą opcję i nie pytać o opłaty. W tym celu należy wejsć w [edycję danych uczelni](edycja_uczelnia.md) i odnaleźc zakładkę "Zgłaszanie publikacji": -.. image:: images/admin/zglos_publikacje/zglos_publikacje_7.png +![image](images/admin/zglos_publikacje/zglos_publikacje_7.png) diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..db28ccd54 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,113 @@ +site_name: Bibliografia Publikacji Pracowników +site_description: Dokumentacja systemu BPP (Bibliografia Publikacji Pracowników) +site_url: https://bpp.readthedocs.io/ +repo_url: https://github.com/iplweb/bpp +repo_name: iplweb/bpp +edit_uri: edit/dev/docs/ +copyright: Copyright © 2005-2026 iplweb.pl — Michał Pasternak + +docs_dir: docs + +theme: + name: material + language: pl + features: + - navigation.instant + - navigation.tracking + - navigation.sections + - navigation.top + - navigation.indexes + - toc.follow + - content.code.copy + - content.action.edit + - search.suggest + - search.highlight + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/brightness-7 + name: Tryb ciemny + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/brightness-4 + name: Tryb jasny + icon: + repo: fontawesome/brands/github + +plugins: + - search: + lang: + - en + - autorefs + - glightbox + - include-markdown + +exclude_docs: | + superpowers/ + requirements.txt + +markdown_extensions: + - admonition + - attr_list + - md_in_html + - tables + - footnotes + - def_list + - pymdownx.arithmatex: + generic: true + - pymdownx.details + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - toc: + permalink: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + +extra_javascript: + - assets/mathjax-config.js + - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js + +nav: + - Wprowadzenie: + - index.md + - readme.md + - Instrukcja użytkownika: + - Uczelnia: edycja_uczelnia.md + - Jednostki: edycja_jednostka.md + - Autorzy: edycja_autor.md + - Wydawnictwa: edycja_wydawnictwo.md + - Wyszukiwanie i redagowanie: wyszukiwanie_redagowanie.md + - Instrukcja administratora: + - Ogólna: usage_admin.md + - Importer publikacji: importer_publikacji.md + - Zgłaszanie publikacji: zglos_publikacje.md + - Konfiguracja PBN: konfiguracja_pbn.md + - Import pracowników: import_pracownikow.md + - Funkcje zaawansowane: + - Raporty i rankingi: raporty_rankingi.md + - Sloty: sloty.md + - Integracja z PBN: pbn.md + - Zaawansowane: advanced.md + - API i rozwój: + - API REST: api.md + - Rozwijanie projektu: contributing.md + - Operacje: + - Channels broadcast (flake): CHANNELS_BROADCAST_FLAKE.md + - macOS WeasyPrint: MACOS_WEASYPRINT.md + - Praktyki bezpieczeństwa: SECURITY_PRACTICES.md + - Polityka bezpieczeństwa: SECURITY.md + - O projekcie: + - Autorzy: authors.md + - Historia zmian: history.md diff --git a/pyproject.toml b/pyproject.toml index 819c391d6..c08584a7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -421,7 +421,6 @@ dev = [ "django-dynamic-fixture>=1.8.0", "django-webtest==1.9.14", "WebTest==3.0.0", - "Sphinx>=7,<9", "coveralls>=4.1.0,<5", "psutil>=7.2.2", # pytest 8.x: pytest-testcontainers-django (0.2.0) deklaruje pytest<9. @@ -475,7 +474,11 @@ dev = [ package = "bpp" version = "202605.1372" package_dir = "src" -filename = "HISTORY.rst" +filename = "HISTORY.md" +start_string = "\n" +underlines = ["", "", ""] +title_format = "## bpp {version} ({project_date})" +issue_format = "[#{issue}](https://github.com/iplweb/bpp/issues/{issue})" [[tool.towncrier.type]] directory = "bugfix" diff --git a/src/bpp/newsfragments/+django-formdefaults-package.feature.rst b/src/bpp/newsfragments/+django-formdefaults-package.feature.md similarity index 100% rename from src/bpp/newsfragments/+django-formdefaults-package.feature.rst rename to src/bpp/newsfragments/+django-formdefaults-package.feature.md diff --git a/src/bpp/newsfragments/+extract-django-dynamic-admin-columns.removal.rst b/src/bpp/newsfragments/+extract-django-dynamic-admin-columns.removal.md similarity index 100% rename from src/bpp/newsfragments/+extract-django-dynamic-admin-columns.removal.rst rename to src/bpp/newsfragments/+extract-django-dynamic-admin-columns.removal.md diff --git a/src/bpp/newsfragments/+get-post-mutations.bugfix.rst b/src/bpp/newsfragments/+get-post-mutations.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+get-post-mutations.bugfix.rst rename to src/bpp/newsfragments/+get-post-mutations.bugfix.md diff --git a/src/bpp/newsfragments/+komparator-pbn-udzialy-permissions.bugfix.rst b/src/bpp/newsfragments/+komparator-pbn-udzialy-permissions.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+komparator-pbn-udzialy-permissions.bugfix.rst rename to src/bpp/newsfragments/+komparator-pbn-udzialy-permissions.bugfix.md diff --git a/src/bpp/newsfragments/+pbn-client-http-timeouts.bugfix.rst b/src/bpp/newsfragments/+pbn-client-http-timeouts.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+pbn-client-http-timeouts.bugfix.rst rename to src/bpp/newsfragments/+pbn-client-http-timeouts.bugfix.md diff --git a/src/bpp/newsfragments/+pbn-tasks-advisory-lock.bugfix.rst b/src/bpp/newsfragments/+pbn-tasks-advisory-lock.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+pbn-tasks-advisory-lock.bugfix.rst rename to src/bpp/newsfragments/+pbn-tasks-advisory-lock.bugfix.md diff --git a/src/bpp/newsfragments/+remove-create-test-db-app.removal.rst b/src/bpp/newsfragments/+remove-create-test-db-app.removal.md similarity index 100% rename from src/bpp/newsfragments/+remove-create-test-db-app.removal.rst rename to src/bpp/newsfragments/+remove-create-test-db-app.removal.md diff --git a/src/bpp/newsfragments/+xlsx-formula-injection.bugfix.rst b/src/bpp/newsfragments/+xlsx-formula-injection.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+xlsx-formula-injection.bugfix.rst rename to src/bpp/newsfragments/+xlsx-formula-injection.bugfix.md diff --git a/src/bpp/newsfragments/+zglos-publikacje-autocomplete-xss.bugfix.rst b/src/bpp/newsfragments/+zglos-publikacje-autocomplete-xss.bugfix.md similarity index 100% rename from src/bpp/newsfragments/+zglos-publikacje-autocomplete-xss.bugfix.rst rename to src/bpp/newsfragments/+zglos-publikacje-autocomplete-xss.bugfix.md