Accès contributeur scopé sur leurs propres publications

This commit is contained in:
2026-05-28 18:02:14 +02:00
parent d8053ac82e
commit f93fe77a12
4 changed files with 211 additions and 51 deletions

View File

@@ -17,29 +17,46 @@ Puis activer depuis l'admin WordPress. Dans le cadre du projet THALIM, le clonag
## Utilisation
Une fois activé, le plugin ajoute une page d'administration : **Outils → HAL Import** (capacité requise : `edit_others_posts`).
Deux points d'entrée selon le rôle :
La page propose deux flux d'import :
- **Admin / éditeur** (cap `edit_others_posts`) : **Outils → HAL Import** — UI complète, voit toutes les publications de la structure THALIM, peut filtrer par n'importe quel auteur.
- **Contributeur** (cap `edit_posts` sans `edit_others_posts`) : menu top-level **Importer depuis HAL** — UI réduite scopée sur son propre idHAL (cf. § Mode contributeur).
### 1. Aperçu live + import incrémental
### Aperçu live + import
- Filtres : plage de dates (`producedDate_s`) et auteur (idHAL d'un membre THALIM)
- Liste les publications HAL correspondantes avec statut coloré :
- **vert** : déjà importée (présence du meta `hal_id` côté WP)
- **vert** : déjà importée (présence du meta `hal_id` côté WP). Le statut WP est précisé (« Publié » ou « En attente »). Pour les pending, un bouton **Modifier** ouvre la page d'édition du post.
- **jaune** : prête à être importée (au moins un auteur HAL matche un user WordPress)
- **rouge** : aucun auteur THALIM identifié → ignorée
- Bouton **Importer** : crée tous les posts « prêts » en statut `pending` (à publier après relecture)
- Colonne **Action** :
- Bouton **Importer** par ligne jaune : crée le post correspondant en `pending`
- Bouton global **Importer N publication(s)** au-dessus du tableau : import en masse de toutes les lignes jaunes du tableau courant
- Après chaque import, le cache du tableau est muté en place (la ligne devient verte, les stats sont ajustées) sans nouvel appel HAL
- Cache des aperçus en transient (5 min, clé hashée sur les filtres), rafraîchissable manuellement
- Bouton **Test API** pour vérifier la connexion
### 2. Import en masse via CSV (legacy SPIP)
### Mode contributeur
Permet d'importer des publications anciennes par lots de 100 :
Quand un contributeur ouvre la page :
- Upload d'un CSV avec une colonne `hal_id` + d'un fichier de contexte SPIP (axes/tags/programmes/owner par publication)
- Traitement par batchs séquentiels (cliquer plusieurs fois)
- Rapport CSV téléchargeable en fin de file
- Annulation possible à tout moment
- **Précondition idHAL** : si le user n'a pas renseigné son `identifiant_hal` sur son profil, ou si son idHAL est invalide (absent du référentiel `ref/author`), la page se bloque sur une notice avec un lien vers son profil.
- **Scoping côté serveur** : le filtre auteur est forcé à l'idHAL du contributeur, indépendamment de tout `$_POST['hal_author_id']` reçu. La cache key des aperçus est préfixée par `u<user_id>|` pour éviter toute collision avec le cache admin.
- **UI réduite** : dropdown auteur masqué, panneau de validation des idHAL des autres membres masqué.
- **Notice persistante** rappelant que l'axe thématique est obligatoire avant publication, qu'une image à la une est attendue, etc.
- **Sécurité import unitaire** : `handle_import_single()` vérifie que l'idHAL du contributeur figure bien dans `authIdHal_s` du doc HAL ciblé — un POST forgé sur un `hal_id` d'une autre publi est rejeté.
- **post_author forcé** : l'importer reçoit `force_post_author = get_current_user_id()` (6e param de `import()`) pour que le contributeur soit l'auteur WP du post même s'il est 2e co-auteur dans `authIdHal_s`.
- Le statut `pending` natif de l'importer aligne nativement avec la restriction WP "contributeur = pas de publication directe" — un éditeur ou admin valide ensuite le post.
### Validation des idHAL des membres
Le panneau dépliable « Utilisateurs WordPress avec identifiant HAL » liste tous les users dont le meta `identifiant_hal` est rempli et vérifie chaque idHAL contre le référentiel auteur HAL (`ref/author`). Les idHAL absents du référentiel sont colorés en rouge et comptés dans l'en-tête du panneau. Résultat mis en cache 24h (transient invalidé naturellement quand la liste des users change).
### Features désactivées (code conservé, feature flag à `false`)
- **Card Configuration + bouton Test API** : `Thalim_HAL_Admin_Page::CONFIG_PANEL_ENABLED`
- **Import en masse via CSV (legacy SPIP)** : `Thalim_HAL_Admin_Page::CSV_IMPORT_ENABLED`. Permettait l'upload d'un CSV de `hal_id` + d'un fichier de contexte SPIP (axes/tags/programmes/owner par publication), traités par batchs de 100 avec rapport CSV final. Le code vit dans `includes/trait-admin-page-csv-legacy.php`.
Basculer le flag à `true` dans `class-admin-page.php` pour réactiver.
## Mapping des types HAL → catégories WordPress
@@ -76,12 +93,12 @@ Permet d'importer des publications anciennes par lots de 100 :
## Dédoublonnage
L'import vérifie le meta `hal_id` avant chaque insertion : une publication ne peut pas être importée deux fois. Le `is_imported($hal_id)` est aussi affiché en colonne de statut dans l'aperçu.
L'import vérifie le meta `hal_id` avant chaque insertion : une publication ne peut pas être importée deux fois. `get_imported_post($hal_id)` renvoie l'id et le `post_status` du post correspondant — utilisé dans l'aperçu pour distinguer Publié / En attente.
## Prérequis
- WordPress 6.0+
- PHP 7.4+
- PHP 8.2+ (constantes dans les traits)
- Plugin **Pods** (le pod `post` et le champ user `identifiant_hal`)
- IDs de catégorie WordPress conformes au mapping (8/13/14/15/16/19) — codés en dur dans `DOC_TYPE_MAP`
@@ -89,15 +106,17 @@ L'import vérifie le meta `hal_id` avant chaque insertion : une publication ne p
```
.
├── thalim-hal-importer.php # point d'entrée, constantes, bootstrap
├── thalim-hal-importer.php # point d'entrée, constantes, bootstrap
└── includes/
├── class-hal-api.php # client API HAL (fetch_publications, fetch_by_hal_ids)
├── class-admin-page.php # UI Tools > HAL Import (aperçu + CSV)
── class-importer.php # mapping HAL → posts WP (triple-storage, axes cascade)
├── class-hal-api.php # client API HAL (fetch_publications, fetch_by_hal_ids, validate_hal_ids)
├── class-admin-page.php # UI Tools > HAL Import (aperçu + import unitaire/masse)
── class-importer.php # mapping HAL → posts WP (triple-storage, axes cascade)
├── trait-admin-page-config.php # card Configuration + Test API (désactivé)
└── trait-admin-page-csv-legacy.php # import bulk CSV legacy SPIP (désactivé)
```
## API HAL
- Base : `https://api.archives-ouvertes.fr/search/`
- Structure THALIM : `254015`
- Recherche publications : `https://api.archives-ouvertes.fr/search/` (structure THALIM `254015`)
- Référentiel auteurs : `https://api.archives-ouvertes.fr/ref/author/` (validation des idHAL)
- Documentation : <https://api.archives-ouvertes.fr/docs>