Logs

Chaque modification effectuée sur un modèle est enregistrée dans la base dans données.

Dès qu’un modèle veut être sauvegardé, deux signaux sont envoyés dans logs.signals : un avant et un après la sauvegarde. En pré-sauvegarde, on récupère l’ancienne version du modèle, si elle existe. En post-sauvegarde, on récupère l’utilisateur et l’IP courants (voir ci-dessous), on convertit les modèles en JSON et on enregistre une entrée Changelog dans la base de données.

Pour récupérer l’utilisateur et son IP, le middleware logs.middlewares.LogsMiddlewares récupère à chaque requête l’utilisateur et l’adresse IP, et les stocke dans le processus courant, afin qu’ils puissent être récupérés par les signaux.

Si jamais la modification ne provient pas d’une requête Web, on suppose qu’elle vient d’une instruction lancée avec manage.py. On récupère alors le nom de l’utilisateur dans l’interface de commandes, et si une note est associée à cet alias, alors on considère que c’est le détenteur de la note qui a effectué cette modification, sur l’adresse IP 127.0.0.1. Sinon, le champ est laissé à None.

Une entrée de Changelog contient les informations suivantes :

  • Utilisateur (ForeignKey vers User, nullable)

  • Adresse IP (GenericIPAddressField)

  • Type de modèle enregistré (ForeignKey vers Model)

  • Identifiant pk de l’instance enregistrée (CharField)

  • Anciennes données (au format JSON, None si création de données)

  • Nouvelles données (au format JSON, None si suppression de données)

  • Action (CharField avec choix create, edit, delete)

  • Date de modification (DateTimeField)

Exemple de Changelog, pour la création d’une transaction de 42424242 centimes d’une note vers une autre :

{
    "id": 42,
    "ip": "192.168.0.1",
    "instance_pk": "1",
    "previous": null,
    "data": "{\"id\":1,\"created_at\":\"2020-03-11T17:24:09.858651+01:00\",\"quantity\":1,\"amount\":42424242,\"reason\":\"Volons la Kfet\",\"valid\":true,\"polymorphic_ctype\":36,\"source\":6,\"destination\":7}",
    "action": "create",
    "timestamp": "2020-03-11T17:24:10.088151+01:00",
    "user": 1,
    "model": 36
}

S’il est préférable de passer en console Postgresql pour parcourir les logs, ils sont trouvables via l’API dans /api/logs, sous réserve d’avoir les droits suffisants (ie. être respo info).

Graphe

Logs graphe