Aller au contenu

Commenter et pointer du temps

Deux besoins reviennent sur presque tous les modèles : discuter d’une fiche, et noter le temps passé dessus. Les deux existent, ils sont génériques, et ils s’activent par un mot.

registry.register_model(
"library_title",
module="library",
taggable=True,
commentable=True, # un fil de commentaires
worklog=True, # un pointage de temps
fields=[...],
)

Aucune table à créer, aucune colonne ajoutée. Les deux stockages sont polymorphes : une seule table kws_thread_message et une seule table kws_worklog, repérées par (modèle, identifiant). Le drapeau ne fait qu’une chose : déclarer que votre modèle est un sujet légitime.

Le fil de commentaires

POST /api/v1/threads/records/library_title/1
{"body": "Exemplaire abîmé, à recoller."}
-> {"id": 1}
GET /api/v1/threads/records/library_title/1
-> {"messages":[{"id":1,"author_id":1,"body":"Exemplaire abîmé, à recoller.",
"created_at":"2026-09-06T19:32:02+00:00","edited_at":null}],
"count":1}

Un seul point d’entrée, pour n’importe quel modèle commentable. edited_at distingue un message corrigé d’un message d’origine, et seul son auteur peut le modifier : le serveur répond 403 à quelqu’un d’autre, y compris à un administrateur.

Le pointage de temps

POST /api/v1/worklog/records/library_title/1
{"work_date": "2026-09-06", "duration_minutes": 45,
"description": "Recollage de la reliure"}
-> {"id": 1}
GET /api/v1/worklog/records/library_title/1
-> {"entries":[{"id":1,"user_id":1,"work_date":"2026-09-06","duration_minutes":45,
"description":"Recollage de la reliure","billable":false}],
"total_minutes":45}

La durée est en minutes entières, jamais en heures décimales : 1,5 heure n’a qu’une écriture possible en minutes, et pas trois arrondis possibles. Le total est calculé par le serveur, pas par l’écran qui affiche.

Le drapeau est un refus, pas une décoration

Un modèle sans le drapeau n’est pas « sans commentaires » : il est refusé.

GET /api/v1/worklog/records/library_copy/1 -> 404

library_copy existe, la fiche existe, et le serveur répond quand même 404. C’est volontaire : la surface générique ne doit pas devenir un dépôt libre où n’importe quel client accroche des données à n’importe quelle table. Vous décidez, modèle par modèle, ce qui peut porter une discussion ou du temps.