Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions baseline-sql/baseline.meta.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"git_sha": "eb4a48a411f1fce569d541cfaaa38a4705024fb8",
"git_sha": "d1683194bf37a1b950ca7020021729094de6b95c",
"last_migration": {
"admin": "0003_logentry_add_action_flag_choices",
"admin_dashboard": "0001_initial",
"auth": "0012_alter_user_first_name_max_length",
"axes": "0010_accessattemptexpiration",
"bpp": "0484_cerif_walidacja_ror",
"bpp": "0486_seed_instytucje_finansujace",
"channels_broadcast": "0001_initial",
"constance": "0003_drop_pickle",
"contenttypes": "0002_remove_content_type_name",
Expand Down Expand Up @@ -75,5 +75,5 @@
"zglos_publikacje": "0027_zgloszenie_zaimportowane"
},
"meta_version": 1,
"postgres_version": "PostgreSQL 16.13 (Debian 16.13-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit"
"postgres_version": "PostgreSQL 16.13 (Debian 16.13-1.pgdg13+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit"
}
643 changes: 575 additions & 68 deletions baseline-sql/baseline.sql

Large diffs are not rendered by default.

128 changes: 93 additions & 35 deletions docs/deweloper/eurocris-co-jeszcze.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
> Poszczególne sekcje mają odpowiadające im issues: A1 → #701, A2 → #702,
> A3 → #703, A4 → #704, B → #705 i #706, D → #707, F1 → #708.

Data: 2026-08-04
Data: 2026-08-04, aktualizacja 2026-08-05 (sekcje A1 i A2 — zrobione).
Kontekst: po wdrożeniu aplikacji `cerif_export` (wariant A).

## Stan wyjściowy
Expand All @@ -16,7 +16,8 @@ CRIS Managers 1.2.0**. `openaire-cris-validator` 2.1.1 przechodzi w całości

Zaimplementowane encje: `Publication` (wydawnictwa ciągłe i zwarte, prace
doktorskie i habilitacyjne, źródła jako kanały wydawnicze), `Person`,
`OrgUnit`, `Patent`, `Event`, `Service`.
`OrgUnit`, `Patent`, `Event`, `Service`, a od #701/#702 również `Project`
i `Funding` (sekcje A1 i A2).

**Zgodność formalna jest osiągnięta.** Wszystko poniżej to różnica między
„przechodzi walidator" a „daje uczelni to, po co się w to wchodzi".
Expand All @@ -25,36 +26,91 @@ doktorskie i habilitacyjne, źródła jako kanały wydawnicze), `Person`,

## A. Encje niezaimplementowane — największa realna wartość

Sety istnieją, ale są puste. Profil na to pozwala (wymaga istnienia setu, nie
jego zapełnienia), więc walidator przechodzi. Natomiast OpenAIRE nie zobaczy
przez to najważniejszego, co CRIS ma do pokazania: **powiązań publikacja ↔
projekt ↔ finansowanie**.

### A1. `Project` — set `openaire_cris_projects`

Model `Grant` (`src/bpp/models/grant.py`) ma cztery pola: `nazwa_projektu`,
`zrodlo_finansowania`, `numer_projektu`, `rok`. To w praktyce etykieta numeru
grantu przypinana do publikacji, nie encja projektu.

Do dodania: `StartDate`/`EndDate` (dziś tylko `rok`), `Acronym`,
`PrincipalInvestigator`, `Coordinator`/`Partner`/`Contractor`, `Team`/`Member`,
`Abstract`, `Subject`, `Keyword`, `Status`, `Funded/By/As`.

Zakres: model + admin + UI + migracja danych. **5–7 osobodni.**

To jest zmiana produktowa, nie tylko eksportowa — dotyka formularzy, którymi
redakcja wprowadza dane. Warto ją brać razem z A2.

### A2. `Funding` — set `openaire_cris_funding`

Nie istnieje. `Grant.zrodlo_finansowania` to `TextField`. Brak encji
finansującego (Funder = `OrgUnit` z `FundRefID`), brak kwot, brak `GrantDOI`.

`Funding/Type` jest w profilu **obowiązkowy**, ze słownika OpenAIRE Funding
Types (Funding Programme / Call / Tender / Gift / Internal Funding / Contract
/ Award / Grant).

Zakres: nowy model + Funder + powiązanie z `Project`. **4–6 osobodni.**
Sety istnieją, ale bywają puste. Profil na to pozwala (wymaga istnienia setu,
nie jego zapełnienia), więc walidator przechodzi. Natomiast OpenAIRE nie
zobaczy przez to najważniejszego, co CRIS ma do pokazania: **powiązań
publikacja ↔ projekt ↔ finansowanie**.

Łańcuch publikacja ↔ projekt ↔ finansowanie jest już zamknięty (A1 i A2);
otwarte zostają `Product` i `Equipment`.

### A1. `Project` — set `openaire_cris_projects` ✅ ZROBIONE (#701)

Model `Grant` (`src/bpp/models/grant.py`) pozostał tym, czym był: etykietą
numeru grantu przypinaną do publikacji. Obok niego stanął **`Projekt`**
(`src/bpp/models/projekt.py`) — pełna encja projektu badawczego, a `Grant`
dostał do niego FK. Dzięki temu istniejące numery grantów nie wymagają
migracji: redakcja podpina je do projektów stopniowo, a rekordy bez projektu
działają dalej po staremu.

Zaimplementowane:

- **model + admin** — `Projekt` (tytuł PL/EN, akronim, daty rozpoczęcia
i zakończenia, status, abstrakt PL/EN, dyscypliny, słowa kluczowe,
jednostka realizująca), `Projekt_Autor` (zespół: kierownik / wykonawca /
współwykonawca);
- **eksport** — `src/cerif_export/cerif/project.py`,
`src/cerif_export/providers/projekty.py`: `Acronym`, `Title` (PL i EN),
`StartDate`, `EndDate`, `Consortium/Coordinator`, `Team/PrincipalInvestigator`
i `Team/Member`, `Funded/By` + `Funded/As`, `Subject`, `Keyword`, `Abstract`,
`Status`;
- **powiązanie z dorobkiem** — `Publication/OriginatesFrom`
i `Patent/OriginatesFrom` osadzają pełny `<Project>`. To ogniwo, dla którego
cała sekcja A w ogóle ma sens: bez niego agregator dostaje dwie rozłączne
listy.

Świadomie pominięte:

| Element | Dlaczego |
|---|---|
| `Project/Type` | Profil oczekuje `cfGenericURIClassification__Type` ze schematem typologii projektów (badawczy / wdrożeniowy / infrastrukturalny). BPP takiej typologii nie prowadzi, a wpisanie wszystkim tej samej wartości byłoby twierdzeniem bez pokrycia w danych. |
| `Projekt.strona_www` | Sekwencja `Project` nie ma elementu na adres strony. Wciśnięcie URL-a do generycznego `Identifier` mówiłoby, że to identyfikator projektu — czym adres strony nie jest. |
| `Team/*/Affiliation` | `Projekt_Autor` nie niesie jednostki, a podstawienie `Projekt.jednostka` twierdziłoby, że każdy członek zespołu pracuje w jednostce realizującej. Bywa nieprawdą przy projektach międzyjednostkowych. |
| `Consortium/Partner`, `Consortium/Contractor` | Wymagają encji instytucji zewnętrznej (partner spoza uczelni), której BPP nie ma. `Jednostka` opisuje wyłącznie strukturę własnej uczelni. |
| Front publiczny i API dla projektów | Poza zakresem: zmiana miała domknąć eksport CERIF, a nie wprowadzić projekty do serwisu i do `/api/v1/`. |

Uwaga o schematach klasyfikacji: `Status` i `Subject` używają **własnych**
przestrzeni nazw (`const.SCHEMAT_STATUSU_PROJEKTU`, `const.SCHEMAT_DYSCYPLIN`),
bo profil nie dostarcza słownika ani dla statusu projektu, ani dla polskiej
klasyfikacji dyscyplin naukowych — a mapowanie dyscyplin na Fields of Science
jest osobną decyzją merytoryczną, nie techniczną. Własny schemat jawnie nazywa
pochodzenie wartości; to lepsze i od pominięcia danych, i od podszycia się pod
cudzy słownik.

### A2. `Funding` — set `openaire_cris_funding` ✅ ZROBIONE (#702)

Zaimplementowane:

- **`Instytucja_Finansujaca`** — słownik grantodawców z `ror_id`
i `fundref_id` (Crossref Funder ID), zaseedowany siedmioma pozycjami (NCN,
NCBiR, MNiSW/MEiN, FNP, NAWA, NPRH, ABM);
- **`Finansowanie`** — typ (obowiązkowy, ze słownika OpenAIRE Funding Types),
nazwa programu, numer umowy, `GrantDOI`, kwota + waluta, FK do projektu
i do instytucji;
- **eksport** — `src/cerif_export/cerif/funding.py`,
`src/cerif_export/providers/finansowanie.py`. `Funding/Funder` to
**referencja** do `OrgUnit`; grantodawcy wychodzą w secie
`openaire_cris_orgunits`, bo profil nie ma osobnej encji finansującego.
Ta sama funkcja serializująca obsługuje rekord setu i element osadzony
w `Project/Funded/As` — kontrola 5b walidatora (encja osadzona jest
podzbiorem pełnego rekordu) jest wtedy spełniona trywialnie.

Świadomie pominięte:

| Element | Dlaczego |
|---|---|
| `Funding/Amount` domyślnie | Kwoty grantów bywają objęte klauzulą poufności, więc wychodzą dopiero po włączeniu `Uczelnia.eksport_cerif_kwoty` (domyślnie wyłączone). |
| `Funding/Acronym` | BPP nie ma osobnego pola na skrót finansowania, a wpisanie tam nazwy programu dublowałoby `Name`. |
| `Funding/PartOf`, `Duration`, `OAMandate` | Brak odpowiadających danych w modelu. |
| Numer umowy jako typowany identyfikator | Numer umowy grantowej nie ma w CERIF-ie własnego typu, a atrybut `type` jest obowiązkowy — stąd własny URI (`funding.TYP_ID_NUMER_UMOWY`), zamiast podszycia się pod cudzy słownik. |
| Front publiczny i API dla finansowania | Jak wyżej: zmiana domykała eksport, nie serwis. |

Integralność referencyjna całości (`Consortium/Coordinator`,
`Team/PrincipalInvestigator`, `Team/Member`, `Funded/By`, `Funding/Funder`)
jest pilnowana automatycznie —
`src/cerif_export/tests/test_integralnosc_projektow.py` harvestuje wszystkie
sety przez `ListRecords` i sprawdza, że każdy `@id` z encji osadzonej ma
rekord we właściwym secie, w obu stanach obu przełączników uczelni.

### A3. `Product` — set `openaire_cris_products`

Expand Down Expand Up @@ -145,7 +201,8 @@ zombie w indeksie.
| `Patent/CountryCode`, `Issuer` | BPP nie przechowuje (implicite UPRP) |
| `Event/Type`, `Organizer`, `Sponsor` | `Konferencja` nie ma tych pól; `panstwo` jest tekstem, nie ISO 3166 |
| `Person/ScopusAuthorID`, `ResearcherID`, `ISNI` | BPP przechowuje tylko ORCID i PBN UID |
| `OrgUnit/ISNI`, `GRID`, `FundRefID` | brak (ROR wystarcza, reszta opcjonalna) |
| `OrgUnit/ISNI`, `GRID` | brak (ROR wystarcza, reszta opcjonalna) |
| `OrgUnit/FundRefID` | wychodzi dla instytucji finansujących (`Instytucja_Finansujaca.fundref_id`); dla jednostek i uczelni nadal brak — nie mają Crossref Funder ID |

---

Expand All @@ -155,8 +212,9 @@ zombie w indeksie.
a bez tego eksport jest formalnie poprawny i merytorycznie ubogi.
2. **D (rejestracja + decyzja RODO)** — odblokowuje jakikolwiek efekt.
3. **C (nagrobki)** — im wcześniej, tym mniej śmieci w indeksie.
4. **A1 + A2 (Project + Funding)** — największa wartość merytoryczna,
~10–13 osobodni, wymaga decyzji produktowej o rozbudowie modelu grantów.
4. ~~**A1 + A2 (Project + Funding)**~~ — zrobione (#701, #702). Zostaje
robota redakcji: wprowadzenie projektów i podpięcie do nich numerów
grantów, bo bez danych sety są puste tak samo jak przed zmianą.
5. **A3, A4 (Product, Equipment)** — gdy uczelnia zacznie je rejestrować.
6. **E** — przy okazji, pojedynczo.

Expand Down
Loading
Loading