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
plan all a196f68 · on main · Fabien Champigny · Sep 18, 2026
data-model.md · 65 lines · 3.1 KBmarkdown
Blame HistoryOpen raw

Data Model: Profil de boîtiers optionnel, déclaré à la demande

Entités dérivées de spec.md § Key Entities et Functional Requirements.

Table boitiers (base de contexte centralisée, specs/003-config-contexte-travail)

Possédée par regine_core.camera_profile (cf. research.md § 2 — corrige le placement provisoire de specs/003-config-contexte-travail/plan.md).

Champ Type Règles
id identifiant interne Clé primaire
modele texte Tag EXIF Model, obligatoire (un boîtier sans modèle lisible n'est identifiable que par étiquetage manuel, cf. Edge Case)
numero_serie texte, nullable Tag EXIF BodySerialNumber, quand présent et exploitable (non vide, non valeur générique)
nom_lisible texte, nullable Attribué par l'utilisateur (via specs/003-config-contexte-travail ou au moment d'un étiquetage manuel) ; NULL tant que non nommé
premiere_rencontre horodatage Date de la première résolution ayant créé cette entrée
source énumération : modele | numero_serie | manuel Méthode ayant permis de créer/distinguer cette entrée

Règle d'unicité : unique sur (modele, numero_serie) quand numero_serie est renseigné ; sinon unique sur modele seul, jusqu'à ce qu'une collision réelle force une entrée source=manuel distincte pour le même modèle (FR-005).

Objets d'échange (non persistés)

CameraTags (retour de regine_core.metadata.exif.read_camera_tags) :

Champ Type
chemin Path
modele str | None
numero_serie str | None

CollisionResolution (retour de regine_core.camera_profile.resolve_collision) :

Champ Type Description
resolues dict[Path, int] Fichier → id de boîtier déterminé automatiquement (modèle ou numéro de série)
a_etiqueter list[list[Path]] Groupes de fichiers encore indistincts, nécessitant un étiquetage manuel (FR-005)

Relation avec le reste du système

Fichier en collision (checksum différent, même nom d'origine — détecté par le module import, hors périmètre)
        │
        ▼
CameraTags (lu via exiftool)
        │
        ▼
resolve_collision() ── regroupe par modele ── distingue par numero_serie ── sinon → a_etiqueter
        │
        ▼
boitiers (id réutilisé pour tout import ultérieur du même modèle/numéro de série, FR-006)

État / transitions

[Boîtier]
   Détecté (modele connu, numero_serie éventuel, nom_lisible=NULL, source=modele|numero_serie)
        │ collision non résolue par modele/numero_serie → étiquetage manuel (FR-005)
        ▼
   Détecté (source=manuel)
        │ utilisateur attribue un nom (specs/003, ou au moment de l'étiquetage manuel)
        ▼
   Nommé (nom_lisible défini)

Un boîtier retiré du profil par l'utilisateur (Edge Case) redevient sujet à une nouvelle résolution s'il réapparaît dans une collision future — pas de suppression physique requise par cette spécification, une simple absence de correspondance suffit à redéclencher le flux normal.

 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
# Data Model: Profil de boîtiers optionnel, déclaré à la demande

Entités dérivées de `spec.md` § Key Entities et Functional Requirements.

## Table `boitiers` (base de contexte centralisée, `specs/003-config-contexte-travail`)

Possédée par `regine_core.camera_profile` (cf. `research.md` § 2 — corrige le placement provisoire de `specs/003-config-contexte-travail/plan.md`).

| Champ | Type | Règles |
|---|---|---|
| `id` | identifiant interne | Clé primaire |
| `modele` | texte | Tag EXIF `Model`, obligatoire (un boîtier sans modèle lisible n'est identifiable que par étiquetage manuel, cf. Edge Case) |
| `numero_serie` | texte, nullable | Tag EXIF `BodySerialNumber`, quand présent et exploitable (non vide, non valeur générique) |
| `nom_lisible` | texte, nullable | Attribué par l'utilisateur (via `specs/003-config-contexte-travail` ou au moment d'un étiquetage manuel) ; `NULL` tant que non nommé |
| `premiere_rencontre` | horodatage | Date de la première résolution ayant créé cette entrée |
| `source` | énumération : `modele` \| `numero_serie` \| `manuel` | Méthode ayant permis de créer/distinguer cette entrée |

**Règle d'unicité** : unique sur (`modele`, `numero_serie`) quand `numero_serie` est renseigné ; sinon unique sur `modele` seul, jusqu'à ce qu'une collision réelle force une entrée `source=manuel` distincte pour le même modèle (FR-005).

## Objets d'échange (non persistés)

**`CameraTags`** (retour de `regine_core.metadata.exif.read_camera_tags`) :

| Champ | Type |
|---|---|
| `chemin` | Path |
| `modele` | `str \| None` |
| `numero_serie` | `str \| None` |

**`CollisionResolution`** (retour de `regine_core.camera_profile.resolve_collision`) :

| Champ | Type | Description |
|---|---|---|
| `resolues` | `dict[Path, int]` | Fichier → `id` de boîtier déterminé automatiquement (modèle ou numéro de série) |
| `a_etiqueter` | `list[list[Path]]` | Groupes de fichiers encore indistincts, nécessitant un étiquetage manuel (FR-005) |

## Relation avec le reste du système

```text
Fichier en collision (checksum différent, même nom d'origine — détecté par le module import, hors périmètre)
        │
        ▼
CameraTags (lu via exiftool)
        │
        ▼
resolve_collision() ── regroupe par modele ── distingue par numero_serie ── sinon → a_etiqueter
        │
        ▼
boitiers (id réutilisé pour tout import ultérieur du même modèle/numéro de série, FR-006)
```

## État / transitions

```text
[Boîtier]
   Détecté (modele connu, numero_serie éventuel, nom_lisible=NULL, source=modele|numero_serie)
        │ collision non résolue par modele/numero_serie → étiquetage manuel (FR-005)
        ▼
   Détecté (source=manuel)
        │ utilisateur attribue un nom (specs/003, ou au moment de l'étiquetage manuel)
        ▼
   Nommé (nom_lisible défini)
```

Un boîtier retiré du profil par l'utilisateur (Edge Case) redevient sujet à une nouvelle résolution s'il réapparaît dans une collision future — pas de suppression physique requise par cette spécification, une simple absence de correspondance suffit à redéclencher le flux normal.