Projet

Général

Profil

Bug #1988

Historique des actions de l'utilisateur.

Ajouté par Mikaël Ates (de retour le 29 avril) il y a plus de 11 ans. Mis à jour il y a plus de 8 ans.

Statut:
Rejeté
Priorité:
Normal
Assigné à:
-
Version cible:
Début:
20 novembre 2012
Echéance:
% réalisé:

50%

Temps estimé:
Patch proposed:
Non
Planning:

Description

Concevoir un système de log des actions de l'utilisateur, lisible par un non informaticien, qui soit accessible depuis l'icone historique positionnée sur la ligne d'un accès.


Fichiers

Révisions associées

Révision a01d85be (diff)
Ajouté par Serghei Mihai il y a presque 10 ans

logging actions on models with django_journal

Closes #1988

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 11 ans

Pourrais-tu lister les évènements qui doivent être pris en compte ?

  • login
  • logout
  • modification/création d'un objet en base ? avec le détail ? tous les
    objets ? certains ?
  • suppression des objets ?

Est-ce que ce système d'historique doit être accessible via plusieurs
entrées (là tu demande de pouvoir lister pour un User, mais est-ce qu'on
pourrait vouloir filtrer par dossier par exemple, et voir qui a fait
quoi sur un dossier ?) ?

Est-ce qu'il doit contenir des évènements sans lien avec un utilisateur
(par exemple quand on pousse vers la facturation vers la sécu. en tâche
de fond) ?

#2

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 11 ans

  • Version cible changé de 0.1 à 0.2

Evénements:

  • login/logout * validation automatique et déverrouillage * création/modification/suppression rendez-vous/actes, dossiers patient, accès et tout objet métier

On doit pouvoir lister par utilisateur et par objet bien que dans l'application il n'est prévue que de voir l'historique des actions de l'utilisateur (dans la partie accès).

Les évènements qui sont sans liens avec les utilisateurs sont à logger ailleurs.
Les rapports de télétransmission seront sûrement stoqués en base avec un model dédié.

#3

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 11 ans

  • Version cible changé de 0.2 à 0.6
#4

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 11 ans

  • Version cible changé de 0.6 à 0.9
#5

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a presque 11 ans

  • Projet changé de APS42 à Calebasse
  • Priorité changé de Normal à Bas
  • Version cible 0.9 supprimé
#6

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a presque 10 ans

  • Assigné à mis à Serghei Mihai
  • Priorité changé de Bas à Haut
  • Version cible mis à 1.1.3

Visiblement on aurait tout ce qu'il faut avec reversion ?

#7

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a presque 10 ans

  • Priorité changé de Haut à Immediat
  • Patch proposed mis à Non

Ca devient critique pour le support.

#8

Mis à jour par Benjamin Dauvergne il y a presque 10 ans

Regardez https://pypi.python.org/pypi/django-journal c'est ce que j'ai développé pour docbow, il y a des paquets dans nos dépôts.

C'est assez simple à utiliser:


import django_journal
django_journal.record('my-tag', '{user} did this to {that}',
           user=request.user, that=model_instance)

Des index sont créés sur les variables de template, il est par exemple possible de retrouver tous les logs qui utilisent '{user}' dans leur template pour un utilisateur donné. Le tag permet d'indiquer une grande famille d'évènement 'act-creation', 'act-delete', etc.. Si on utilise le middleware, on a automatiquement l'ip et l'utilisateur qui sont renseignés en passant par la méthode installée sur request.record().

#9

Mis à jour par Serghei Mihai il y a presque 10 ans

Log des actions sur les modèles, certains forms et views

#10

Mis à jour par Serghei Mihai il y a presque 10 ans

  • % réalisé changé de 0 à 50
  • Patch proposed changé de Non à Oui
#11

Mis à jour par Frédéric Péters il y a presque 10 ans

        act.last_validation_state = last_validation_state
+       get_request().record('new-act','{obj_id} created by {user} from {ip}', obj_id=act.id)
        act.save()

Est-ce qu'on n'obtient pas le act.id uniquement après l'appel à save() ?

+        self.request.record('new-act',
+                            '{obj_id} created by {user} from {ip}',
+                            obj_id=self.object.id)

Le même message de log est produit à deux endroits différents, d'expérience c'est utile d'avoir une info différente.

Ou, autre commentaire, ces lignes de log sont enregistrées au mauvais endroit, et il ne devrait y en avoir qu'une, dans le save().

+ get_request().record('act-update', '{obj_id} updated by {user} from {ip} with: {changes}', changes=changes)

obj_id n'est pas défini.

#12

Mis à jour par Serghei Mihai il y a presque 10 ans

  • Statut changé de Nouveau à Résolu (à déployer)
  • % réalisé changé de 50 à 100

Appliqué par commit calebasse|commit:a01d85be752cd242f076febde54a56d1d9d0f677.

#13

Mis à jour par Frédéric Péters il y a presque 10 ans

Ça a été commité sans doute par erreur. (et en tout cas avec des erreurs)

#14

Mis à jour par Serghei Mihai il y a presque 10 ans

Poussé trop vite.

Frédéric Péters a écrit :

[...]

Est-ce qu'on n'obtient pas le act.id uniquement après l'appel à save() ?

[...]

Le même message de log est produit à deux endroits différents, d'expérience c'est utile d'avoir une info différente.

Corrigé, merci.

Ou, autre commentaire, ces lignes de log sont enregistrées au mauvais endroit, et il ne devrait y en avoir qu'une, dans le save().

Initialement j'étais parti sur ça, mais je voulais avoir plus de détails sur les modifications effectuées sur les modèles, et logguer en dehors du save me permet de voir ses modifications sans analyser les modifications sur l'objet.

[...]

obj_id n'est pas défini.

Je fais un nouveau patch

#15

Mis à jour par Jérôme Schneider il y a presque 10 ans

Il manque également la dépendance sur django-journal dans le requirements.txt et le setup.py.

#16

Mis à jour par Serghei Mihai il y a presque 10 ans

Interception des actions via les signaux post_save et pre_delete.
Le setup mis à jour également.

#17

Mis à jour par Benjamin Dauvergne il y a presque 10 ans

Idéalement il ne vaut mieux pas logger les id des objets et plutôt directement l'objet c'est toute la magie de la bibliothèque de gérer ça proprement et de mettre des liens vers les vues d'admin dans les logs, donc plutôt que

        act.last_validation_state = last_validation_state
+       get_request().record('new-act','{obj_id} created by {user} from {ip}', obj_id=act.id)
        act.save()

faire plutôt ça

        act.last_validation_state = last_validation_state
+       get_request().record('new-act', '{act} created', act=act)
        act.save()

L'utilisateur et l'IP sont déjà sauvés et affichés dans les listing, pas besoin de les sauver explicitement. Si l'objet est effacé on verra dans les logs l'ID de l'objet avec l'anotation "deleted" au lieu d'un lien vers sa vue.

#19

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 9 ans

  • Statut changé de Résolu (à déployer) à En cours
  • Version cible changé de 1.1.3 à 1.3

Cela fonctionne bien mais il manque des détails. Avant de préciser lesquels je déplace la demande à la prochaine version et la met en cours.

#20

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 9 ans

Les messages de log ne sont pas assez explicites.

Par exemple lors de la création de rendez-vous il faudrait avoir les détails des champs de ce rendez-vous.
Lors de la modification, il faudrait avoir le détail de ce qui a été modifié.

#21

Mis à jour par Serghei Mihai il y a plus de 9 ans

Je peux stocker les détails lors de l'ajout ou modification d'un modèle sous forme d'un dictionnaire.
Si le journal doit être consultable par les secretaires, je pense qu'il faudrait repenser les logging afin d'avoir une interface plus épurée et claire.

#22

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 9 ans

  • % réalisé changé de 100 à 50

Ok pour le stockage du detail.

#23

Mis à jour par Benjamin Dauvergne il y a plus de 9 ans

Pour stocker des informations variables avec un message on peut toujours faire ça (en vrai python sur un pseudo example):

    template = "created object" 
    kwargs = {}
    if info1:
        template += " with info1 {info1}" 
        kwargs['info1'] = info1
    if info2:
        template += " with info2 {info2}" 
        kwargs['info1'] = info2
    request.record(template, **kwargs)

Le dico kwargs est automatiquement transformé en clé-valeurs dans les tables du journal.

#24

Mis à jour par Frédéric Péters il y a environ 9 ans

  • Patch proposed changé de Oui à Non
#25

Mis à jour par Benjamin Dauvergne il y a presque 9 ans

  • Priorité changé de Immediat à Normal
#26

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 8 ans

  • Assigné à Serghei Mihai supprimé

Formats disponibles : Atom PDF