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 -> 404library_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.