diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ac9ff5..935fe64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -116,7 +116,7 @@ DCAT-AP-Konformitätsfixes aus der SHACL-Validierung des Harvest-Endpoints. ### ✅ Validierung - Die mit dem echten Plugin-Code erzeugte Turtle-Ausgabe wurde per **pySHACL** gegen die gebündelten offiziellen Shapes geprüft: **GovData DCAT-AP.de → `Conforms: True`**; - **EU DCAT-AP 3.0 → `Conforms: True`** (mit geladenen Vokabularen, wie im echten MQA/piveau). + **EU DCAT-AP 3.0 → `Conforms: True`** (mit geladenen Vokabularen, wie in produktiven Harvestern). Die im Standalone-Lauf verbleibenden `sh:class`-Meldungen betreffen ausschließlich nicht mitgeladene EU-Vokabulare, nicht die Ausgabe des Plugins. - Neue Regressionstests für das `byteSize`-Literal und die `dct:format`-Sanitisierung. Gesamt: 187. @@ -125,20 +125,19 @@ DCAT-AP-Konformitätsfixes aus der SHACL-Validierung des Harvest-Endpoints. ## [2.33.0] — 2026-07-31 -Bereitstellung für Metadaten-Harvesting durch piveau/Civora (z. B. Datenatlas Zivilgesellschaft). +Bereitstellung für Metadaten-Harvesting durch externe Open-Data-Portale. ### ✨ Added - **Voll-Katalog-Endpoint (`?full=1`):** Der Catalog-Endpoint liefert auf Wunsch **alle veröffentlichten Datensätze in einem Abruf** (ohne Paginierung) als ein `dcat:Catalog` - → `dcat:Dataset` → `dcat:Distribution` — der Bereitstellungspunkt, den piveaus - `importing-rdf`-Konnektor erwartet. Der Katalog trägt ein stabiles `@id` und `foaf:homepage`. + → `dcat:Dataset` → `dcat:Distribution` — der Bereitstellungspunkt, den RDF-Harvester + erwarten. Der Katalog trägt ein stabiles `@id` und `foaf:homepage`. - **Turtle-Serialisierung (`?format=turtle`):** Neuer dependency-freier JSON-LD→Turtle-Serializer (`includes/class-rdf.php`) liefert denselben Graphen als `text/turtle` (roh, via `rest_pre_serve_request`). `json`/`jsonld` bleiben verfügbar. Format-Alias `ttl` wird akzeptiert. -- **Admin-Harvest-Box:** Unter _Datensätze → Einstellungen → Harvesting (piveau/Civora)_ werden die +- **Admin-Harvest-Box:** Unter _Datensätze → Einstellungen → Harvesting_ werden die kopierfertigen Katalog-URLs (Turtle + JSON-LD) samt Onboarding-Hinweis angezeigt. -- **README-Abschnitt „Harvesting durch piveau/Civora"** inkl. Onboarding-Schritten und der 9 mit - dem Betreiber (DKSR) zu klärenden Fragen. +- **README-Abschnitt „Harvesting durch externe Open-Data-Portale"** mit den Harvest-URLs. ### ✅ Tests - Neuer Turtle-Serializer durch `tests/test-rdf.php` abgesichert (Prefixe, benannte Subjekte, diff --git a/CLAUDE.md b/CLAUDE.md index 23227c5..3f31089 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -754,9 +754,9 @@ Neue technische Festlegungen gehören dorthin, nicht in README oder CLAUDE.md. - **UX-Paket B (v2.29.0–v2.32.0):** Pflichtfeld-Sternchen statt CF-`set_required` (Entwürfe bleiben speicherbar), Fehlermeldungen mit Tab-Angabe + „Zum Feld springen", einheitliche Prozent-Anzeige der Qualität, entschlacktes Tab 1, konsistente Begriffe („Thema"/„Schlagworte"). -- **Harvest-Endpoint für piveau/Civora (v2.33.0):** `/catalog?full=1` (vollständiger Katalog in einem +- **Harvest-Endpoint (v2.33.0):** `/catalog?full=1` (vollständiger Katalog in einem Dokument) + `&format=turtle` über den dependency-freien `ODW_Rdf`-Serializer; Admin-Box mit den - kopierfertigen URLs. Gegen die gebündelten SHACL-Shapes validiert (GovData DCAT-AP.de: konform). + kopierfertigen URLs. Gegen die gebündelten SHACL-Shapes validiert (DCAT-AP.de: konform). - **Reproduzierbare Abhängigkeiten (v2.34.0):** `vendor/` ist nicht mehr eingecheckt (siehe Quick Start). ### ☐ Noch offen / geplant diff --git a/README.md b/README.md index 9d26206..f5c2826 100644 --- a/README.md +++ b/README.md @@ -166,9 +166,9 @@ Diese URLs können bei einer Open-Data-Plattform als Harvest-Quelle eingetragen **Delta-Parameter:** `since` (erforderlich, ISO 8601), `page`, `per_page`, `format` — liefert nur Datensätze, die nach dem angegebenen Zeitstempel geändert wurden, plus Tombstones für gelöschte Datensätze -### 🌾 Harvesting durch piveau/Civora (Datenatlas Zivilgesellschaft) +### 🌾 Harvesting durch externe Open-Data-Portale -Portale auf Basis von **piveau/Civora** — etwa der [Datenatlas Zivilgesellschaft](https://datenatlas-zivilgesellschaft.de) — holen Metadaten per **Pull-Harvesting** ab: Sie geben dem Betreiber **eine stabile URL**, unter der Ihr **kompletter Katalog als ein DCAT-AP.de-Dokument** liegt. Genau dafür bietet der Catalog-Endpoint einen **Voll-Modus**: +Viele Open-Data-Portale holen Metadaten per **Pull-Harvesting** ab: Sie hinterlegen beim Portal **eine stabile URL**, unter der Ihr **kompletter Katalog als ein DCAT-AP.de-Dokument** liegt. Genau dafür bietet der Catalog-Endpoint einen **Voll-Modus**: ``` # Vollständiger Katalog als Turtle (empfohlen für RDF-Harvester) @@ -178,28 +178,11 @@ GET https://deine-website.de/wp-json/datenatlas/v1/catalog?full=1&format=turtle GET https://deine-website.de/wp-json/datenatlas/v1/catalog?full=1 → application/ld+json ``` -- **`full=1`** liefert **alle veröffentlichten Datensätze in einem Abruf** (ohne Paginierung) als `dcat:Catalog` → `dcat:Dataset` → `dcat:Distribution` — das Muster, das piveaus `importing-rdf`-Konnektor erwartet. +- **`full=1`** liefert **alle veröffentlichten Datensätze in einem Abruf** (ohne Paginierung) als `dcat:Catalog` → `dcat:Dataset` → `dcat:Distribution` — das Muster, das RDF-Harvester erwarten. - **`format=turtle`** serialisiert denselben Graphen als **Turtle** (`text/turtle`) — ohne externe RDF-Bibliothek. JSON-LD (`application/ld+json`) und `json` bleiben verfügbar. - Die Datensatz-URIs (`@id`) sind **über Releases stabil** (an die Post-ID gebunden), sodass Harvester Aktualisierungen/Löschungen korrekt zuordnen und keine Duplikate anlegen. -Die fertigen Harvest-URLs zeigt das Plugin **kopierfertig unter _Datensätze → Einstellungen → Harvesting (piveau/Civora)_** an. - -#### So melden Sie den Katalog beim Datenatlas an -1. **Vorab validieren** — das Dokument gegen den [EU-DCAT-AP-SHACL-Validator](https://www.itb.ec.europa.eu/shacl/dcat-ap/upload) **und** die [GovData-DCAT-AP.de-SHACL-Validation](https://github.com/GovDataOfficial/DCAT-AP.de-SHACL-Validation) prüfen; alle `sh:Violation` beheben (siehe [SHACL-Abschnitt](#-dcat-ap-validierung-shacl)). -2. **Onboarding per E-Mail** — dem Datenatlas-Team **(a)** die gewählte URL, **(b)** die Serialisierung (Turtle/JSON-LD), **(c)** einen gewünschten Katalognamen und **(d)** ein Aktualisierungsintervall mitteilen. Einrichtung laut Datenatlas-Doku ca. 1–2 Wochen (Testläufe + Mapping). - -#### Vor der Anmeldung mit dem Betreiber (DKSR) zu klären -1. **DCAT-AP-Version** — prüft Civora gegen DCAT-AP.de 2.0 oder 3.0 (bzw. reines DCAT-AP 3.0)? -2. **Serialisierung/`inputFormat`** — Turtle, RDF/XML oder JSON-LD? Welcher `Content-Type`? -3. **Identifier-Konvention** — Regeln für `dct:identifier`/Dataset-URIs (Idempotenz bei Updates)? -4. **Delete-Semantik** — Vollabgleich (Datensatz verschwindet → gelöscht) oder explizites Statusfeld? -5. **Paginierung** — ab welcher Katalogröße ist Hydra-Paginierung erwünscht? -6. **Katalog-Ebene** — genau ein `dcat:Catalog` je Organisation? Wie wird der Katalogname/-slug festgelegt? -7. **Domänenfelder** — sollen sozialwissenschaftliche Felder (CESSDA, GND) mit ausgeliefert werden? -8. **Intervall & Monitoring** — welches Harvest-Intervall, und gibt es Zugang zu Job-/Fehlerberichten? -9. **Pflichtfeld `dcat:theme`** — ist das EU-`data-theme`-Vokabular verpflichtend, und wie werden zivilgesellschaftliche Themen darauf gemappt? - -> **Push-API?** piveau bietet zwar einen API-Push (`PUT` mit `X-API-Key`), der Schlüssel liegt aber beim **Katalogbetreiber**, nicht beim Datenanbieter — und der Datenatlas dokumentiert keinen Anbieter-Push. Der richtige Weg für dieses Plugin ist daher der **Pull** über die obige Katalog-URL. +Die fertigen Harvest-URLs zeigt das Plugin **kopierfertig unter _Datensätze → Einstellungen → Harvesting_** an. ### ✅ DCAT-AP 3.0 Konformität Alle Ausgaben sind DCAT-AP 3.0 konform und in JSON-LD serialisiert. @@ -347,7 +330,7 @@ Neue technische Festlegungen gehören in dieses Dokument (nicht in die anwendero - [x] Phase E: Multi-Distribution — wiederholbare Distributionen (opt-in) - [x] Phase 3 UX: Tooltip-Popups (ⓘ) und Live-Wizard-Vorschau (Tab 5) - [x] UX-Ausbau (Paket B, v2.29–2.32): Pflichtfeld-Sternchen + Publish-Validierung, Fehlermeldungen mit „Zum Feld springen", einheitliche Prozent-Qualitätsanzeige, entschlacktes Tab 1, konsistente Begriffe („Thema"/„Schlagworte"), Batch-Import im Admin-Design -- [x] Harvest-Endpoint für piveau/Civora: Voll-Katalog (`?full=1`) + **Turtle**-Serialisierung (v2.33.0) +- [x] Harvest-Endpoint: Voll-Katalog (`?full=1`) + **Turtle**-Serialisierung (v2.33.0) - [ ] Content Negotiation vervollständigen: Turtle auch für `/datasets/`, Auswertung des `Accept`-Headers, optional RDF/XML - [ ] Gutenberg Block für die Download-Card - [ ] Mehrsprachigkeit (WPML/Polylang) diff --git a/includes/class-rest-api.php b/includes/class-rest-api.php index c752532..eb3f28c 100644 --- a/includes/class-rest-api.php +++ b/includes/class-rest-api.php @@ -84,7 +84,7 @@ public static function register_routes(): void { 'validate_callback' => fn( $v ) => in_array( $v, array( 'json', 'jsonld' ), true ), ); - // Der Katalog kann zusätzlich Turtle liefern (für RDF-Harvester wie piveau/Civora). + // Der Katalog kann zusätzlich Turtle liefern (für RDF-Harvester). $catalog_format_arg = array( 'default' => 'jsonld', 'sanitize_callback' => 'sanitize_text_field', @@ -124,7 +124,7 @@ public static function register_routes(): void { ), // full=1 liefert den vollständigen Katalog (alle veröffentlichten // Datensätze) in einem Dokument — der Bereitstellungspunkt für - // Pull-Harvesting durch piveau/Civora. + // Pull-Harvesting durch externe Open-Data-Portale. 'full' => array( 'default' => 0, 'sanitize_callback' => 'absint', diff --git a/includes/class-settings.php b/includes/class-settings.php index 9839a6b..e81f59f 100644 --- a/includes/class-settings.php +++ b/includes/class-settings.php @@ -166,10 +166,10 @@ static function (): void { add_settings_field( 'cache_ttl', __( 'Cache-Laufzeit (Sekunden)', 'open-data-wizard' ), array( self::class, 'field_cache_ttl' ), 'odw-settings', 'odw_section_api' ); - // --- Harvesting (piveau/Civora) — reine Info-Sektion, keine Felder. --- + // --- Harvesting — reine Info-Sektion, keine Felder. --- add_settings_section( 'odw_section_harvesting', - __( 'Harvesting (piveau/Civora)', 'open-data-wizard' ), + __( 'Harvesting', 'open-data-wizard' ), array( self::class, 'render_harvesting_info' ), 'odw-settings' ); @@ -201,7 +201,7 @@ static function (): void { /** * Renders the harvesting info box: the stable, public catalog URLs an external - * portal (piveau/Civora, e.g. the Datenatlas Zivilgesellschaft) can pull. + * Open-Data-Portal can pull. */ public static function render_harvesting_info(): void { $base = rest_url( 'datenatlas/v1/catalog' ); @@ -215,7 +215,7 @@ public static function render_harvesting_info(): void { $jsonld = add_query_arg( array( 'full' => '1' ), $base ); echo '

'; - echo esc_html__( 'Externe Portale wie piveau/Civora (z. B. der Datenatlas Zivilgesellschaft) holen Ihre Metadaten selbst ab („Pull-Harvesting"). Geben Sie dem Betreiber dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf.', 'open-data-wizard' ); + echo esc_html__( 'Externe Open-Data-Portale holen Ihre Metadaten in der Regel selbst ab („Pull-Harvesting"). Geben Sie dem Portal dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf.', 'open-data-wizard' ); echo '

'; self::render_harvest_url_row( __( 'DCAT-AP.de · Turtle (empfohlen)', 'open-data-wizard' ), (string) $turtle ); @@ -224,7 +224,7 @@ public static function render_harvesting_info(): void { echo '

'; printf( /* translators: %s: URL of the EU SHACL validator. */ - esc_html__( 'Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße. Zur Anmeldung schicken Sie dem Datenatlas-Team die gewählte URL, das Format, einen gewünschten Katalognamen und ein Aktualisierungsintervall.', 'open-data-wizard' ), + esc_html__( 'Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße.', 'open-data-wizard' ), 'https://www.itb.ec.europa.eu/shacl/dcat-ap/upload' ); echo '

'; diff --git a/languages/open-data-wizard-en_US.mo b/languages/open-data-wizard-en_US.mo index ca2ce29..41c3069 100644 Binary files a/languages/open-data-wizard-en_US.mo and b/languages/open-data-wizard-en_US.mo differ diff --git a/languages/open-data-wizard-en_US.po b/languages/open-data-wizard-en_US.po index 3dea9ab..453e71d 100644 --- a/languages/open-data-wizard-en_US.po +++ b/languages/open-data-wizard-en_US.po @@ -1852,11 +1852,7 @@ msgstr "Who publishes this data? What is it about? Which theme is the dataset as msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie jederzeit unvollständig speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Jedes Feld hat hilfreiche Beispiele, die Sie über das ⓘ-Symbol einblenden." msgstr "Required fields are marked with a red asterisk (*). You can always save an incomplete draft — only publishing requires all mandatory fields to be filled in. Every field has helpful examples that you can reveal via the ⓘ icon." -msgid "Harvesting (piveau/Civora)" -msgstr "Harvesting (piveau/Civora)" -msgid "Externe Portale wie piveau/Civora (z. B. der Datenatlas Zivilgesellschaft) holen Ihre Metadaten selbst ab („Pull-Harvesting\"). Geben Sie dem Betreiber dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf." -msgstr "External portals such as piveau/Civora (e.g. the Datenatlas Zivilgesellschaft) fetch your metadata themselves (\"pull harvesting\"). Give the operator one of the following stable, publicly reachable catalog URLs. They deliver the complete catalog as a DCAT-AP.de document in a single request." msgid "DCAT-AP.de · Turtle (empfohlen)" msgstr "DCAT-AP.de · Turtle (recommended)" @@ -1864,8 +1860,15 @@ msgstr "DCAT-AP.de · Turtle (recommended)" msgid "DCAT-AP.de · JSON-LD" msgstr "DCAT-AP.de · JSON-LD" -msgid "Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße. Zur Anmeldung schicken Sie dem Datenatlas-Team die gewählte URL, das Format, einen gewünschten Katalognamen und ein Aktualisierungsintervall." -msgstr "Tip: Before onboarding, validate the document against the official DCAT-AP SHACL validator (%s) and fix all violations. To onboard, send the Datenatlas team the chosen URL, the format, a desired catalog name and an update interval." msgid "Offene Daten, bereitgestellt von %s." msgstr "Open data provided by %s." + +msgid "Harvesting" +msgstr "Harvesting" + +msgid "Externe Open-Data-Portale holen Ihre Metadaten in der Regel selbst ab („Pull-Harvesting\"). Geben Sie dem Portal dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf." +msgstr "External open data portals usually fetch your metadata themselves (\"pull harvesting\"). Give the portal one of the following stable, publicly reachable catalog URLs. They deliver the complete catalog as a DCAT-AP.de document in a single request." + +msgid "Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße." +msgstr "Tip: Validate the document against the official DCAT-AP SHACL validator (%s) and fix all violations." diff --git a/languages/open-data-wizard.pot b/languages/open-data-wizard.pot index b49eae6..0490f40 100644 --- a/languages/open-data-wizard.pot +++ b/languages/open-data-wizard.pot @@ -1470,11 +1470,7 @@ msgstr "" msgid "Die Pflichtfelder sind mit einem roten Sternchen (*) gekennzeichnet. Als Entwurf können Sie jederzeit unvollständig speichern – erst zum Veröffentlichen müssen alle Pflichtfelder ausgefüllt sein. Jedes Feld hat hilfreiche Beispiele, die Sie über das ⓘ-Symbol einblenden." msgstr "" -msgid "Harvesting (piveau/Civora)" -msgstr "" -msgid "Externe Portale wie piveau/Civora (z. B. der Datenatlas Zivilgesellschaft) holen Ihre Metadaten selbst ab („Pull-Harvesting\"). Geben Sie dem Betreiber dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf." -msgstr "" msgid "DCAT-AP.de · Turtle (empfohlen)" msgstr "" @@ -1482,8 +1478,15 @@ msgstr "" msgid "DCAT-AP.de · JSON-LD" msgstr "" -msgid "Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße. Zur Anmeldung schicken Sie dem Datenatlas-Team die gewählte URL, das Format, einen gewünschten Katalognamen und ein Aktualisierungsintervall." -msgstr "" msgid "Offene Daten, bereitgestellt von %s." msgstr "" + +msgid "Harvesting" +msgstr "" + +msgid "Externe Open-Data-Portale holen Ihre Metadaten in der Regel selbst ab („Pull-Harvesting\"). Geben Sie dem Portal dazu eine der folgenden stabilen, öffentlich erreichbaren Katalog-URLs. Sie liefern den vollständigen Katalog als DCAT-AP.de-Dokument in einem Abruf." +msgstr "" + +msgid "Tipp: Prüfen Sie das Dokument vor der Anmeldung gegen den offiziellen DCAT-AP-SHACL-Validator (%s) und beheben Sie alle Verstöße." +msgstr ""