Repository navigation
feat(eurocris): encje Projekt i Finansowanie — sety projects i funding (#701, #702) - #719
Merged
Merged
Conversation
Projekt techniczny rozbudowy modelu danych o encje CERIF Project i Funding: nowy model Projekt (Grant zostaje etykietą numeru grantu), Projekt_Autor z rolą, Instytucja_Finansujaca jako Funder eksportowany w secie OrgUnits, Finansowanie 1:N z typem ze słownika OpenAIRE. Mapowania skonfrontowane z XSD profilu leżącym w repozytorium (src/cerif_export/tests/xsd/) — w szczególności struktura Project/Funded (By = referencja do OrgUnit findera, As = osadzone <Funding>), dedykowane elementy RORID/FundRefID/GrantDOI oraz wymóg atrybutu scheme dla klasyfikacji Status i Subject. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Plan rozbity na 7 zadań: modele (fundament), następnie równolegle admin, seed grantodawców i fundament eksportu, potem buildery Project/Funding, OriginatesFrom i domknięcie testami integralności. Uzupełnienie speca: profil łączy publikację z projektem elementem Publication/OriginatesFrom (XSD l. 698, analogicznie Patent l. 871), osadzającym pełne <Project>. Bez niego sety byłyby pełne, walidator zielony, a agregator dostałby dwie rozłączne listy — czyli brak tego, po co powstało #709. Dopisana też sekcja o znanych odstępstwach (Subject bez mapowania na Fields of Science, brak Project/Type). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Identyfikatory FundRef i ROR potwierdzone krzyżowo w obu rejestrach (Crossref Funder Registry + external_ids rekordu ROR), nie przepisane z pamięci. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ych (#701) Wprowadzanie danych o projektach badawczych z poziomu admina: ProjektAdmin z inline'ami zespołu i finansowania, osobny słownik instytucji finansujących. Formset zespołu duplikuje bazowy UniqueConstraint „jeden kierownik na projekt", żeby redaktor dostał komunikat walidacji zamiast pięćsetki z IntegrityError. Admin grantu pokazuje i wyszukuje powiązany projekt, ustawienia uczelni dostają przełącznik eksportu kwot finansowania do CERIF. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ect/Funding (#702) Stałe TYP_PROJECT/TYP_FUNDING i schematy klasyfikacji własnych, wpisy pj/fn/if w rejestrze identyfikatorów, słownik typów finansowania wg vocabularies/openaire_funding_types.xsd oraz eksport grantodawcy jako CERIF OrgUnit (RORID, FundRefID, ElectronicAddress). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ding (#701, #702) Buildery ``cerif/project.py`` i ``cerif/funding.py`` oraz providery obu setów. ``Project/Funded/By`` jest referencją do OrgUnit-a grantodawcy, ``Project/Funded/As`` osadza pełne ``<Funding>`` (ta sama funkcja serializująca, więc kontrola 5b walidatora spełniona trywialnie). ``ZbioryWidocznosci`` dostaje zbiór ``grantodawcy``: bez niego ``zawiera()`` zwracało dla ``Instytucja_Finansujaca`` False, więc ``Funding/Funder`` i ``Project/Funded/By`` osadzały OrgUnit-a bez ``@id`` — referencję nie do rozwiązania w harveście. ``Project/Team`` powstaje wyłącznie gdy osoby są widoczne; przy ``Uczelnia.eksport_cerif_osoby=False`` znika razem z kontenerem. ``Funding/Amount`` wychodzi wyłącznie za zgodą ``Uczelnia.eksport_cerif_kwoty`` — przełącznik wystawia ``KontekstSerializacji.kwoty_dozwolone``. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ektami (#701) Publikacje i patenty osadzają w ``OriginatesFrom`` pełny element ``<Project>`` (grupa podstawień ``ProjectFunding__SubstitutionGroupHead``), a ten w ``Funded/As`` — swoje ``<Funding>``. Dzięki temu agregator dostaje łańcuch publikacja → projekt → finansowanie zamiast dwóch rozłącznych list. ``RekordBPPBaza`` dostaje ``GenericRelation`` do ``Grant_Rekordu`` — bez odwrotnej relacji nie dało się prefetchować grantów od strony rekordu. Zmiana nie tworzy kolumny, więc nie wymaga migracji; zmienia natomiast kaskadę kasowania (wiersze ``Grant_Rekordu`` znikają razem z rekordem, zamiast zostawać sierotami). Zbiory widoczności providerów publikacji i patentów obejmują teraz także zespół projektu, jego jednostkę realizującą i grantodawców — inaczej osadzony projekt referowałby encje bez ``@id``. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…#702) Nowy `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 `eksport_cerif_osoby` i `eksport_cerif_kwoty`. Pokrywa Consortium/Coordinator, Team/PrincipalInvestigator, Team/Member, Funded/By, Funded/As i Funding/Funder, także w projekcie osadzonym w `Publication/OriginatesFrom`. Sekcje A1 i A2 dokumentu euroCRIS opisane na stan faktyczny: co zaimplementowano i co świadomie pominięto (Project/Type, strona WWW, afiliacje zespołu, partnerzy zewnętrzni, własne schematy Subject i Status). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nsowanie) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Zamyka #701 (encja
Project) i #702 (encjaFunding) z parasola #709.Problem
Sety
openaire_cris_projectsiopenaire_cris_fundingbyły puste (ProviderPusty). Profil OpenAIRE wymaga istnienia setów, nie ich zapełnienia, więc walidator przechodził — a OpenAIRE nie widział łańcucha publikacja ↔ projekt ↔ finansowanie, czyli głównej rzeczy, jaką CRIS ma do pokazania.Przyczyna leżała w modelu danych:
Grantmiał cztery pola i był etykietą numeru grantu, nie encją projektu. Encja finansującego nie istniała.Co wnosi ten PR
Modele (
src/bpp/models/projekt.py):Projekt,Projekt_Autor(z rolą i bazowymUniqueConstraintna jednego kierownika),Instytucja_Finansujaca,Finansowanie.Grantzostaje etykietą numeru grantu z FK do projektu (SET_NULL) — dzięki czemu istniejąca generyczna relacjaGrant_Rekordustaje się relacją publikacja↔projekt bez migracji danych.Seed (migracja
0486): 7 polskich grantodawców (NCN, NCBR, MNiSW, FNP, NAWA, ABM, KE). Każdy identyfikator potwierdzony krzyżowo — FundRef z Crossrefa i rekord ROR wymieniający ten sam FundRef wexternal_ids. Żadna pozycja nie weszła bez potwierdzonego identyfikatora.Admin:
ProjektAdminz inline'ami zespołu i finansowania,Instytucja_FinansujacaAdmin,projektwGrantAdmin(z filtrem „granty bez projektu"),eksport_cerif_kwotywUczelniaAdmin.Eksport CERIF: buildery
<Project>i<Funding>, dwa nowe providery, grantodawcy dołożeni do setuopenaire_cris_orgunits(wymóg integralności —Funding/Fundermusi wskazywać na OrgUnit obecny w harveście), orazPublication/OriginatesFromiPatent/OriginatesFromosadzające pełne<Project>.Rzeczy warte uwagi recenzenta
OriginatesFromto sedno. Bez niego sety byłyby pełne, walidator zielony, a agregator dostałby dwie rozłączne listy. Element osadza pełne<Project>(grupa podstawieńProjectFunding__SubstitutionGroupHead), nie referencję.Uczelnia.eksport_cerif_kwoty, wzoremeksport_cerif_osoby. Dane zostają w bazie do użytku wewnętrznego.Teampodlegaeksport_cerif_osoby— przy wyłączonym przełączniku projekt wychodzi bezPrincipalInvestigatoriMember, bo referencja do nieobecnego rekordu byłaby wisząca.FundRefIDw XSD ma wzorzechttps://doi.org/10.13039/<cyfry>, a model trzyma sam numer — serializer normalizuje.GenericRelation(Grant_Rekordu)naRekordBPPBazazmienia kaskadę kasowania: usunięcie publikacji kasuje teraz jej wierszeGrant_Rekorduzamiast zostawiać sieroty. To poprawa, ale realna zmiana zachowania poza eksportem.Świadome pominięcia
Udokumentowane w
docs/deweloper/eurocris-co-jeszcze.md(sekcje A1/A2 przepisane na stan faktyczny):Project/Type(BPP nie ma typologii projektów),Projekt.strona_www(profil nie ma elementu),Team/*/Affiliation(Projekt_Autornie niesie jednostki), partnerzy zewnętrzni (brak encji instytucji zewnętrznej), front i API, mapowanie dyscyplin na Fields of Science (SubjectiStatusidą z własnym schematem, bo profil nie dostarcza słownika).Testy
make tests-without-playwright→ 9179 passed, 4 skipped, 1 xfailed. Sam pakietcerif_export: 397 (było 313).Najważniejszy jest
test_integralnosc_projektow.py— harvestuje wszystkie sety przez warstwę OAI i sprawdza, że każdy identyfikator referowany z<Project>,<Funding>i osadzonegoOriginatesFromistnieje jako@idrekordu w swoim secie, w obu stanach obu przełączników uczelni. Jego czułość zweryfikowano mutacjami kodu produkcyjnego (odcięciewidoczne_projekty()→ 6 z 10 testów pada).Baseline odświeżony (
0485–0486).Do zrobienia przed wdrożeniem
openaire-cris-validator2.1.1 na żywym endpoincie z dumpem produkcyjnym — krok akceptacyjny dla człowieka, jak przy #699. Testy sprawdzają zgodność ze schematem i integralność wewnątrz harvestu; walidator sprawdza cały protokół.Specyfikacja i plan:
docs/superpowers/specs/2026-08-05-eurocris-projekt-finansowanie-design.md,docs/superpowers/plans/2026-08-05-eurocris-projekt-finansowanie.md.🤖 Generated with Claude Code