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
13 changes: 6 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 5 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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.
Expand Down Expand Up @@ -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/<id>`, Auswertung des `Accept`-Headers, optional RDF/XML
- [ ] Gutenberg Block für die Download-Card
- [ ] Mehrsprachigkeit (WPML/Polylang)
Expand Down
4 changes: 2 additions & 2 deletions includes/class-rest-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down
10 changes: 5 additions & 5 deletions includes/class-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'
);
Expand Down Expand Up @@ -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' );
Expand All @@ -215,7 +215,7 @@ public static function render_harvesting_info(): void {
$jsonld = add_query_arg( array( 'full' => '1' ), $base );

echo '<p class="description" style="max-width: 780px;">';
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 '</p>';

self::render_harvest_url_row( __( 'DCAT-AP.de · Turtle (empfohlen)', 'open-data-wizard' ), (string) $turtle );
Expand All @@ -224,7 +224,7 @@ public static function render_harvesting_info(): void {
echo '<p class="description" style="max-width: 780px; margin-top: 10px;">';
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 '</p>';
Expand Down
Binary file modified languages/open-data-wizard-en_US.mo
Binary file not shown.
15 changes: 9 additions & 6 deletions languages/open-data-wizard-en_US.po
Original file line number Diff line number Diff line change
Expand Up @@ -1852,20 +1852,23 @@ 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)"

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."
15 changes: 9 additions & 6 deletions languages/open-data-wizard.pot
Original file line number Diff line number Diff line change
Expand Up @@ -1470,20 +1470,23 @@ 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 ""

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 ""
Loading