feat(import): v5.6.0 unified data import (phases 0-5)
- unified importer framework (app/services/importers/): normalized model, registry, common pipeline (hierarchy, attachments, collections, dedup), async jobs, dry-run preview, column->type mapping - Phase 1: Obsidian, Notion, Logseq/Roam, HTML (Apple Notes/Bear/Ulysses/ OneNote), Google Keep, generic Markdown - Phase 2: typed CSV/TSV, Excel (openpyxl), generic JSON - Phase 3: Word .docx (python-docx), PDF (pypdf), HTML folders - Phase 4: Raindrop, Pocket, Readwise, Shaarli, Netscape bookmarks, .ics, OPML, Standard Notes, Gitea/GitHub issues (+labels/milestones) - Phase 5: incremental re-sync (skip/update/duplicate), partial-error resume, forge repo files, URL web clipper (SSRF guard), batch multi-file + UI queue, Notion relation resolution, exportable JSON reports - /import wizard, API /api/import/*, migration 9 (import_items, import_jobs) - fix: property values stored by property id (correct DB view rendering) - deps: openpyxl, beautifulsoup4, PyYAML, python-docx, pypdf - 43 import tests; full suite 491 green; ruff clean - bump version 5.11.5
This commit is contained in:
+103
@@ -1,5 +1,108 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v5.11.5 (2026-09-13) — v5.6.0 Import de données (Phase 5 — durcissement)
|
||||
|
||||
> Finalise la solution d'import : ré-import incrémental, lots, URL, dépôt forge,
|
||||
> relations Notion et rapports exportables. **v5.6.0 est complet (Phases 0→5).**
|
||||
|
||||
- **Import incrémental / re-sync** — nouveau paramètre `mode` (`skip` par défaut,
|
||||
`update` = mise à jour des pages et upsert des lignes par titre, `duplicate`).
|
||||
Compteurs `pages_updated` / `rows_updated` dans le rapport.
|
||||
- **Erreurs partielles** — l'import continue page par page en cas d'échec
|
||||
(`status: "partial"`, liste `errors`), au lieu d'abandonner.
|
||||
- **Import de dépôt forge** — `POST /api/import/forge-repo` : arborescence
|
||||
Gitea/GitHub → pages (dossiers conservés, fichiers texte, code en blocs ;
|
||||
`GitHubAdapter.list_repo_files`, `GiteaForgeAdapter.list_repo_files`).
|
||||
- **Web clipper** — `POST /api/import/url` : fetch d'une page (garde SSRF :
|
||||
loopback/privé/link-local refusés), conversion HTML → blocs + carte bookmark
|
||||
(OG metadata).
|
||||
- **Lot multi-fichiers** — `POST /api/import/run-batch` (rapport par fichier) et
|
||||
file d'attente dans l'assistant `/import` (sélection multiple, statut par
|
||||
fichier, barre de progression).
|
||||
- **Relations Notion** — `POST /api/import/relations/resolve` : les colonnes
|
||||
texte qui référencent les titres d'une autre collection deviennent des
|
||||
propriétés `relation` (valeurs = ids de `collection_pages`). Auto-exécuté
|
||||
après un import Notion (clé `relations` du rapport).
|
||||
- **Rapport exportable** — `GET /api/import/jobs/{id}/report` (JSON) + bouton
|
||||
« Télécharger le rapport » dans l'UI.
|
||||
- **Correctif** — les lignes importées stockent désormais leurs valeurs par **id
|
||||
de propriété** (au lieu du nom) : rendu correct dans les vues database et
|
||||
compatibilité avec les relations/rollups.
|
||||
- **UI** — assistant `/import` enrichi : multi-fichiers, mode de ré-import,
|
||||
import URL, import forge (issues **et** fichiers), téléchargement du rapport.
|
||||
- **Tests** — `tests/test_v56_import.py` porté à **43 tests** (incrémental ×4,
|
||||
lot, URL ×2, forge-repo ×2, relations, rapport de job). Suite complète
|
||||
**491 verte**, `ruff check` OK.
|
||||
- **Version** — 5.11.5.
|
||||
|
||||
## v5.11.4 (2026-09-13) — v5.6.0 Import de données (Phases 3 & 4)
|
||||
|
||||
> Complète le chantier v5.6.0 : documents/bureautique (Phase 3) et
|
||||
> signets/dev/divers (Phase 4). **v5.6.0 est désormais complet** (5 phases).
|
||||
|
||||
- **Phase 3 — Documents & bureautique**
|
||||
- **Word `.docx`** (`python-docx`) — titres, listes, citations, tableaux GFM
|
||||
et images inline → page ; couvre aussi les exports Google Docs Takeout.
|
||||
- **PDF** (`pypdf`) — extraction texte par page + images → page ; avertissement
|
||||
si pages sans couche texte (scan).
|
||||
- **HTML fichiers/dossier** — détection élargie (archive contenant ≥ 1 HTML),
|
||||
assets collectés comme pièces jointes.
|
||||
- **Phase 4 — Signets, dev & divers**
|
||||
- **Forge issues** — `POST /api/import/forge` (Gitea/GitHub) : issues → collection
|
||||
(Number, State, Labels, Milestone, Assignee, dates, URL, Body) + collections
|
||||
Labels et Milestones. `GitHubAdapter.list_issues/list_labels/list_milestones`
|
||||
ajoutés ; token par utilisateur (`user_oauth_tokens`).
|
||||
- **Signets** — Raindrop.io, Pocket (CSV/HTML), Readwise (highlights CSV/MD),
|
||||
Shaarli (JSON) et signets Netscape HTML → collection (URL, description,
|
||||
tags, date).
|
||||
- **Calendrier `.ics`** — parseur RFC 5545 (VEVENT) → collection d'événements.
|
||||
- **OPML** — flux RSS/outlines → collection (URL, dossier).
|
||||
- **Standard Notes** — sauvegarde JSON → pages (notes chiffrées ignorées).
|
||||
- **UI** — l'assistant `/import` liste désormais les 20 sources, accepte
|
||||
`.docx/.pdf/.ics/.opml` et propose un panneau « import depuis une forge ».
|
||||
- **Dépendances** — `python-docx`, `pypdf` ajoutés.
|
||||
- **Tests** — `tests/test_v56_import.py` étendu à **32 tests** (signets ×5,
|
||||
ics/opml/standard notes, docx, pdf, forge ×4). Suite complète verte,
|
||||
`ruff check` OK.
|
||||
- **Version** — 5.11.4.
|
||||
|
||||
## v5.11.3 (2026-09-13) — v5.6.0 Import de données (Phases 0, 1, 2)
|
||||
|
||||
> Démarre le chantier v5.6.0 « Import de données » avec le **socle unifié**
|
||||
> (Phase 0) et les deux premières familles de sources : **Notes & Markdown**
|
||||
> (Phase 1) et **Données & tableaux** (Phase 2).
|
||||
|
||||
- **Socle d'import unifié (Phase 0)** — package `app/services/importers/` :
|
||||
modèle normalisé (`ImportResult`, `ImportPage`, `ImportAttachment`), interface
|
||||
`Importer` (`detect()` / `parse()`) + registre auto-détection, pipeline commun
|
||||
(hiérarchie `parent_id`, pièces jointes, réécriture des liens, collections +
|
||||
lignes, rapport d'import), jobs d'arrière-plan (`app/services/importers/jobs.py`,
|
||||
polling), déduplication idempotente (table `import_items`), migration 9
|
||||
(`import_items` + `import_jobs`).
|
||||
- **Assistant UI d'import** — page `/import` (template `import.html`) : choix de
|
||||
source ou détection auto, glisser-déposer, **aperçu dry-run**, **mapping
|
||||
colonnes → types** (override des types inférés), barre de progression, rapport.
|
||||
Lien « Assistant d'import avancé » ajouté à la modale Import de l'éditeur.
|
||||
- **API** — `GET /api/import/sources`, `POST /api/import/preview`,
|
||||
`POST /api/import/run` (sync ou `async=true`), `GET /api/import/jobs[/{id}]`.
|
||||
- **Phase 1 — Notes & Markdown** : Obsidian (vault `.zip`, frontmatter YAML,
|
||||
`[[wikilinks]]`, `![[embeds]]`, pièces jointes, hiérarchie de dossiers),
|
||||
Notion (export `.zip`, hiérarchie complète, databases `.csv` → collections,
|
||||
images), Logseq & Roam (outliner, propriétés `key:: value`, pages journal,
|
||||
`{{[[TODO]]}}`), HTML (Apple Notes, Bear, Ulysses, OneNote), Google Keep
|
||||
(Takeout JSON), plus l'import Markdown/`.zip` générique.
|
||||
- **Phase 2 — Données & tableaux** : CSV/TSV **typé** (inférence
|
||||
texte/nombre/date/checkbox/email/url/select/multi_select + mapping manuel),
|
||||
Excel `.xlsx` (une collection par feuille, openpyxl), JSON générique (tableau
|
||||
d'objets → collection).
|
||||
- **Correctif** — `_md_to_blocks` reconnaît désormais les cases à cocher
|
||||
`- [ ]`/`- [x]` (elles étaient absorbées par la branche puces à puces).
|
||||
- **Dépendances** — `openpyxl`, `beautifulsoup4`, `PyYAML` ajoutés.
|
||||
- **Tests** — `tests/test_v56_import.py` : 18 tests (registre, dry-run, CSV typé,
|
||||
dédup, TSV, Excel multi-feuilles, JSON, Obsidian, Notion, Logseq, Roam, HTML,
|
||||
Google Keep, mapping, wizard, job async). Suite complète **463+ verte**,
|
||||
`ruff check` OK.
|
||||
|
||||
## v5.11.2 (2026-09-12) — v5.5.0 Embeds & Média riche (complétion)
|
||||
|
||||
> Valide et complète le chantier v5.5.0 (parité embeds Notion). Une grande
|
||||
|
||||
Reference in New Issue
Block a user