Skip to content

OpenAIRE enrichment: remaining uncovered fields (URLs, OA status, funding) #262

Description

@nuest

Follow-up to the OpenAIRE enrichment extension that added journal pagination (volume/issue/first_page/last_page), language, and publisher (alongside the original abstract/keywords/authors). This issue tracks the OpenAIRE Graph API fields we deliberately did not wire into enrichment yet, with the complications that make each one more than a one-line addition.

Enrichment lives in works/harvesting/openaire.py (ENRICHABLE_FIELDS + build_openaire_fields), applied fill-if-empty via works/harvesting/enrichment.py::apply_enrichment.

1. Landing-page URLs (instances[].urls, instances[].pids)

OpenAIRE returns one or more access locations per research product.

  • Complication: Work.url is URLField(unique=True). A fill-if-empty assignment can collide with an existing work's URL and raise IntegrityError mid-sweep. Needs explicit collision handling (skip-on-collision, or pick the first non-colliding URL), and a policy decision on which of several instance URLs to prefer (landing page vs. PDF vs. publisher). May overlap with the existing Work.locations JSON ("Also available at") rather than the scalar url.

2. Open-access status / access rights / license (bestAccessRight, instances[].accessRight, instances[].license)

  • Complication: Overlaps the existing Work.openalex_open_access_status (OpenAlex-derived). Adding an OpenAIRE-derived OA field needs a precedence decision (which source wins) and vocabulary normalization — OpenAIRE uses COAR access-right URIs / labels (OPEN, CLOSED, EMBARGO, RESTRICTED) whereas OpenAlex uses gold/green/hybrid/bronze/closed. Either a new dedicated field + mapping table, or a documented reconciliation onto the existing field.

3. Funding / projects (projects[])

OpenAIRE's strongest unique signal: funder name, funding stream, grant/award id, project acronym + title.

  • Complication: Multi-valued and structured (a work can have several projects); there is no model representation today. Would need a new related model (or a structured JSON field) plus serializer/landing-page/admin surfacing and provenance keys. Out of scope for a fill-if-empty scalar enrichment; warrants its own design.

Smaller follow-ups

  • Journal/container name (container.name): captured by OpenAIRE but Work has no dedicated journal/container-name field (the journal title is currently derived from Work.source.name). Could add a field, or keep deriving from source.
  • type is intentionally excluded — OpenAIRE's coarse publication/dataset is less useful than the per-source default.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions