fonzarely/regine-photos-archiverpublic Fork
⑂ main
Commits
⬇ Clone ▾
git clone https://git.rickub.com/fonzarely/regine-photos-archiver.git
git clone ssh://git@rickub.com/fonzarely/regine-photos-archiver.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
duplicates a1d9142 · on main · Fabien Champigny · Sep 22, 2026
data-model.md · 116 lines · 7.0 KBmarkdown
Blame HistoryOpen raw

Data Model: Importation de photos depuis une carte mémoire

Entités dérivées de spec.md § Key Entities et Functional Requirements. Réutilise sans les redéfinir : RootLocation (specs/004-categorisation-dossiers), CameraTags/CollisionResolution/boitiers (specs/002-profil-boitiers-optionnel).

Fichier candidat à l'import

Champ Type Règles
chemin_source Path Emplacement sur la carte mémoire
checksum str (SHA-256) Calculé au fil de la copie (FR-001)
deja_importe bool True si ce checksum figure déjà dans un import précédent (FR-004) — exclu de l'analyse si True
date_prise_vue datetime | None Tag EXIF DateTimeOriginal ; None si absent ou aberrant (FR-003)
date_aberrante bool True si date_prise_vue est hors plage plausible (ex. avant 1990) — exclu du calcul de plage (FR-003)
type énumération : maitre | associe Fichier maître (RAW/JPEG/TIFF issu du boîtier) ou fichier associé (sidecar) — cf. constitution Principe I

Groupe d'import

Champ Type Règles
fichiers list[FichierCandidat] Sous-ensemble de fichiers nouveaux partageant une plage de dates contiguë (FR-005)
plage_dates (date, date) Bornes de la plage couverte par le groupe
titre str | None Saisi par l'utilisateur (FR-010)
destination DestinationChoisie Résultat de l'étape FR-007

DestinationChoisie

Champ Type Règles
type énumération : nouveau_dossier | nouveau_sous_dossier | fusion | nouveau_parent Choix explicite de l'utilisateur (FR-007)
dossier_cible Path | None Requis si type in {nouveau_sous_dossier, fusion}
root_location RootLocation | None Résolu via regine_core.dossier.root.determine_root (specs/004) uniquement si type in {nouveau_dossier, nouveau_parent} ; hérité du parent sinon (FR-006 de specs/004)
necessite_checkout_archive bool True si type == fusion et dossier_cible n'existe qu'archivé, pas en local (FR-009) — déclenche un appel à regine_core.archive.checkout (specs/005-checkout-reconciliation) avant d'intégrer les nouveaux fichiers

Dossier de format

Créé à la demande lors du classement (FR-020), pas une entité stockée — un simple sous-répertoire résultant du déplacement d'un fichier maître déjà renommé.

Champ Type Règles
nom str raw, jpeg, tiff, ou le nom de l'extension elle-même pour un format maître marginal — cf. regine_core.import_carte.copie.dossier_de_format (partagée avec specs/006-gui-tri-consultation, jamais redéfinie ici)
fichiers list[FichierCandidat] Fichiers maîtres de ce format, plus leurs fichiers associés (même dossier que leur maître, cf. classement.py)

Renommage

Champ Type Règles
nom_origine str Nom donné par le boîtier (avant import)
nom_final str date_titre_nomOrigine.ext (FR-013)
fichiers_lies list[Path] Fichiers associés (JPEG jumeau, sidecars) renommés de façon synchronisée (FR-014)

Historique des imports (FR-004 révisé, 2026-09-22)

Persisté dans la base de contexte centralisée (regine_core.config.db, specs/003), table checksums_importes — un enregistrement par somme de contrôle déjà importée, alimenté à chaque import réussi.

Champ Type Règles
checksum str (SHA-256), clé primaire Un enregistrement par fichier distinct déjà importé, tous imports confondus
dossier_destination str (chemin) Dossier de l'espace de travail local où ce fichier a été publié (push.publier_localement)
date_import str (ISO 8601) Horodatage de l'enregistrement — mis à jour si le même checksum est réimporté vers un nouveau dossier

Identifiant pérenne

Champ Type Règles
valeur str (UUID) Généré à l'import, un par fichier maître (FR-017)
champ_xmp "xmpMM:DocumentID" Champ standard réutilisé (cf. research.md § 3), écrit via exiftool

Relations

Carte mémoire ──▶ FichierCandidat (checksum, date) ──▶ Historique des imports (détection doublon, FR-004)
                                                              │
                                                              ▼
                                                    Groupe d'import (découpage jour par jour)
                                                              │
                                                              ▼
                                                    DestinationChoisie ──▶ RootLocation (specs/004)
                                                              │
                                                              ▼
                                                    Renommage (par fichier maître + fichiers liés)
                                                              │
                                                              ▼
                                              Dossier de format (classement, FR-020)
                                                              │
                                                              ▼
                                    Identifiant pérenne (écrit en XMP) ──▶ Confirmation ──▶ Copie de travail locale
                                                                                                    │
                                                                                  (plus tard, séparément)
                                                                                                    ▼
                                                                                    regine reconcile ──▶ Archive

Collision de nom d'origine entre deux FichierCandidat de même nom_origine mais checksum différent → déléguée à regine_core.camera_profile.resolve_collision (specs/002-profil-boitiers-optionnel), pas redéfinie ici.

État / transitions (par groupe d'import)

[Groupe d'import]
   Proposé (découpage automatique, titre non saisi)
        │ utilisateur détache des jours (FR-005/006)
        ▼
   Découpé en sous-groupes (chacun redevient "Proposé")
        │ utilisateur saisit titre + destination (+ catégorie si nouveau_dossier/nouveau_parent)
        ▼
   Destination résolue (RootLocation déterminé ou hérité — chemin d'archive calculé, pas encore écrit)
        │ renommage local (FR-013/014) + classement par format (FR-020) + identifiant pérenne (FR-017)
        ▼
   Prêt pour publication locale (résumé affiché, FR-018)
        │ confirmation explicite de l'utilisateur
        ▼
   Copie de travail locale (FR-019) — dossier terminal de l'import
        │ (hors périmètre de ce module) sélection/retouche par le photographe,
        │ puis `regine reconcile` déclenché explicitement quand prêt
        ▼
   Archivé (specs/005-checkout-reconciliation)
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Data Model: Importation de photos depuis une carte mémoire

Entités dérivées de `spec.md` § Key Entities et Functional Requirements. Réutilise sans les redéfinir : `RootLocation` (`specs/004-categorisation-dossiers`), `CameraTags`/`CollisionResolution`/`boitiers` (`specs/002-profil-boitiers-optionnel`).

## Fichier candidat à l'import

| Champ | Type | Règles |
|---|---|---|
| `chemin_source` | Path | Emplacement sur la carte mémoire |
| `checksum` | str (SHA-256) | Calculé au fil de la copie (FR-001) |
| `deja_importe` | bool | `True` si ce checksum figure déjà dans un import précédent (FR-004) — exclu de l'analyse si `True` |
| `date_prise_vue` | `datetime \| None` | Tag EXIF `DateTimeOriginal` ; `None` si absent ou aberrant (FR-003) |
| `date_aberrante` | bool | `True` si `date_prise_vue` est hors plage plausible (ex. avant 1990) — exclu du calcul de plage (FR-003) |
| `type` | énumération : `maitre` \| `associe` | Fichier maître (RAW/JPEG/TIFF issu du boîtier) ou fichier associé (sidecar) — cf. constitution Principe I |

## Groupe d'import

| Champ | Type | Règles |
|---|---|---|
| `fichiers` | `list[FichierCandidat]` | Sous-ensemble de fichiers nouveaux partageant une plage de dates contiguë (FR-005) |
| `plage_dates` | `(date, date)` | Bornes de la plage couverte par le groupe |
| `titre` | `str \| None` | Saisi par l'utilisateur (FR-010) |
| `destination` | `DestinationChoisie` | Résultat de l'étape FR-007 |

## DestinationChoisie

| Champ | Type | Règles |
|---|---|---|
| `type` | énumération : `nouveau_dossier` \| `nouveau_sous_dossier` \| `fusion` \| `nouveau_parent` | Choix explicite de l'utilisateur (FR-007) |
| `dossier_cible` | `Path \| None` | Requis si `type in {nouveau_sous_dossier, fusion}` |
| `root_location` | `RootLocation \| None` | Résolu via `regine_core.dossier.root.determine_root` (specs/004) uniquement si `type in {nouveau_dossier, nouveau_parent}` ; hérité du parent sinon (FR-006 de specs/004) |
| `necessite_checkout_archive` | bool | `True` si `type == fusion` et `dossier_cible` n'existe qu'archivé, pas en local (FR-009) — déclenche un appel à `regine_core.archive.checkout` (`specs/005-checkout-reconciliation`) avant d'intégrer les nouveaux fichiers |

## Dossier de format

Créé à la demande lors du classement (FR-020), pas une entité stockée — un simple sous-répertoire résultant du déplacement d'un fichier maître déjà renommé.

| Champ | Type | Règles |
|---|---|---|
| `nom` | str | `raw`, `jpeg`, `tiff`, ou le nom de l'extension elle-même pour un format maître marginal — cf. `regine_core.import_carte.copie.dossier_de_format` (partagée avec `specs/006-gui-tri-consultation`, jamais redéfinie ici) |
| `fichiers` | `list[FichierCandidat]` | Fichiers maîtres de ce format, plus leurs fichiers associés (même dossier que leur maître, cf. `classement.py`) |

## Renommage

| Champ | Type | Règles |
|---|---|---|
| `nom_origine` | str | Nom donné par le boîtier (avant import) |
| `nom_final` | str | `date_titre_nomOrigine.ext` (FR-013) |
| `fichiers_lies` | `list[Path]` | Fichiers associés (JPEG jumeau, sidecars) renommés de façon synchronisée (FR-014) |

## Historique des imports (FR-004 révisé, 2026-09-22)

Persisté dans la base de contexte centralisée (`regine_core.config.db`, `specs/003`), table `checksums_importes` — un enregistrement par somme de contrôle déjà importée, alimenté à chaque import réussi.

| Champ | Type | Règles |
|---|---|---|
| `checksum` | str (SHA-256), clé primaire | Un enregistrement par fichier distinct déjà importé, tous imports confondus |
| `dossier_destination` | str (chemin) | Dossier de l'espace de travail local où ce fichier a été publié (`push.publier_localement`) |
| `date_import` | str (ISO 8601) | Horodatage de l'enregistrement — mis à jour si le même checksum est réimporté vers un nouveau dossier |

## Identifiant pérenne

| Champ | Type | Règles |
|---|---|---|
| `valeur` | str (UUID) | Généré à l'import, un par fichier maître (FR-017) |
| `champ_xmp` | `"xmpMM:DocumentID"` | Champ standard réutilisé (cf. research.md § 3), écrit via exiftool |

## Relations

```text
Carte mémoire ──▶ FichierCandidat (checksum, date) ──▶ Historique des imports (détection doublon, FR-004)
                                                              │
                                                              ▼
                                                    Groupe d'import (découpage jour par jour)
                                                              │
                                                              ▼
                                                    DestinationChoisie ──▶ RootLocation (specs/004)
                                                              │
                                                              ▼
                                                    Renommage (par fichier maître + fichiers liés)
                                                              │
                                                              ▼
                                              Dossier de format (classement, FR-020)
                                                              │
                                                              ▼
                                    Identifiant pérenne (écrit en XMP) ──▶ Confirmation ──▶ Copie de travail locale
                                                                                                    │
                                                                                  (plus tard, séparément)
                                                                                                    ▼
                                                                                    regine reconcile ──▶ Archive
```

Collision de nom d'origine entre deux `FichierCandidat` de même `nom_origine` mais `checksum` différent → déléguée à `regine_core.camera_profile.resolve_collision` (`specs/002-profil-boitiers-optionnel`), pas redéfinie ici.

## État / transitions (par groupe d'import)

```text
[Groupe d'import]
   Proposé (découpage automatique, titre non saisi)
        │ utilisateur détache des jours (FR-005/006)
        ▼
   Découpé en sous-groupes (chacun redevient "Proposé")
        │ utilisateur saisit titre + destination (+ catégorie si nouveau_dossier/nouveau_parent)
        ▼
   Destination résolue (RootLocation déterminé ou hérité — chemin d'archive calculé, pas encore écrit)
        │ renommage local (FR-013/014) + classement par format (FR-020) + identifiant pérenne (FR-017)
        ▼
   Prêt pour publication locale (résumé affiché, FR-018)
        │ confirmation explicite de l'utilisateur
        ▼
   Copie de travail locale (FR-019) — dossier terminal de l'import
        │ (hors périmètre de ce module) sélection/retouche par le photographe,
        │ puis `regine reconcile` déclenché explicitement quand prêt
        ▼
   Archivé (specs/005-checkout-reconciliation)
```