From f635f9e47b8f58e1f1c5e1736f28736637036e75 Mon Sep 17 00:00:00 2001 From: Serghei MIHAI Date: Tue, 15 Jul 2014 16:22:44 +0200 Subject: [PATCH] logging actions on models with django_journal Closes #1988 --- calebasse/actes/models.py | 10 +++++++++- calebasse/actes/views.py | 11 +++++++++++ calebasse/agenda/forms.py | 10 ++++++++-- calebasse/agenda/models.py | 10 ++++++++++ calebasse/agenda/views.py | 1 - calebasse/dossiers/models.py | 12 ++++++++++++ calebasse/personnes/models.py | 4 ++++ calebasse/settings.py | 2 ++ 8 files changed, 56 insertions(+), 4 deletions(-) diff --git a/calebasse/actes/models.py b/calebasse/actes/models.py index ff50c70..3030999 100644 --- a/calebasse/actes/models.py +++ b/calebasse/actes/models.py @@ -8,7 +8,6 @@ from calebasse.actes.validation_states import VALIDATION_STATES from calebasse.ressources.models import ServiceLinkedAbstractModel from ..middleware.request import get_request - class ActValidationState(models.Model): class Meta: @@ -48,6 +47,7 @@ class ActManager(models.Manager): act=act,state_name='NON_VALIDE', author=author, previous_state=None) 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() return act @@ -201,6 +201,8 @@ class Act(models.Model): self.valide = True else: self.valide = False + get_request().record('act-update', '{obj_id} state changed to {state} by {user} from {ip}', + obj_id=self.id, state=last_validation_state, user=author) self.save() def is_billable(self): @@ -223,6 +225,7 @@ class Act(models.Model): def save(self, *args, **kwargs): if self.parent_event and not self.parent_event.canceled: super(Act, self).save(*args, **kwargs) + get_request().record('act-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def duration(self): '''Return a displayable duration for this field.''' @@ -262,6 +265,11 @@ class Act(models.Model): pass return None + def delete(self): + obj_id = self.id + super(Act, self).delete() + get_request().record('act-delete', '{obj_id} deleted by {user} from {ip}', obj_id=obj_id) + class Meta: verbose_name = u"Acte" verbose_name_plural = u"Actes" diff --git a/calebasse/actes/views.py b/calebasse/actes/views.py index 325ab3f..f620745 100644 --- a/calebasse/actes/views.py +++ b/calebasse/actes/views.py @@ -74,6 +74,7 @@ class ActListingView(ListView): def get_context_data(self, **kwargs): ctx = super(ActListingView, self).get_context_data(**kwargs) ctx['search_form'] = self.search_form + self.request.record('acts-view', 'act listing by {user} from {ip}') return ctx class NewAct(NewAppointmentView): @@ -85,6 +86,9 @@ class NewAct(NewAppointmentView): def form_valid(self, form): result = super(NewAct, self).form_valid(form) self.object.act.save() + self.request.record('new-act', + '{obj_id} created by {user} from {ip}', + obj_id=self.object.id) return result act_listing = ActListingView.as_view() @@ -100,6 +104,8 @@ class DeleteActView(DeleteView): if self.object.event: self.object.event.delete() if not self.object.is_billed: + self.request.record('act-delete', '{obj_id} deleted by {user} from {ip}', + obj_id=self.object.id) self.object.delete() return HttpResponse(status=204) @@ -119,6 +125,10 @@ class UpdateActView(UpdateView): self.object.event.participants = doctors self.object.event.act_type = self.object.act_type self.object.event.save() + self.request.record('act-update', + '{obj_id} updated by {user} from {ip} with: {changes}', + obj_id=self.object.id, + changes={'participants': doctors, 'act_type': self.object.act_type}) return result update_act = UpdateActView.as_view() @@ -133,6 +143,7 @@ class RebillActView(UpdateView): act.is_billed = False act.healthcare = None act.save() + self.request.record('rebill-act', '{obj_id} rebilled by {user} from {ip}', obj_id=act.id) return super(RebillActView, self).post(request, *args, **kwarg) rebill_act = RebillActView.as_view() diff --git a/calebasse/agenda/forms.py b/calebasse/agenda/forms.py index d78d086..73a946b 100644 --- a/calebasse/agenda/forms.py +++ b/calebasse/agenda/forms.py @@ -43,8 +43,6 @@ class NewAppointmentForm(BaseForm): 'start_datetime': forms.HiddenInput, } - - def __init__(self, instance, service=None, **kwargs): self.service = None super(NewAppointmentForm, self).__init__(instance=instance, **kwargs) @@ -100,6 +98,9 @@ class NewAppointmentForm(BaseForm): if commit: appointment.patient = patient appointment.save() + get_request().record('new-eventwithact', + '{obj_id} created by {user} from {ip}', + obj_id=appointment.id) self.save_m2m() appointment.services = [self.service] @@ -120,6 +121,9 @@ class UpdateAppointmentForm(NewAppointmentForm): appointment.clean() if commit: appointment.save() + get_request().record('update-eventwithact', + '{obj_id} saved by {user} from {ip}', + obj_id=appointment.id) self.save_m2m() appointment.services = [self.service] return appointment @@ -205,6 +209,8 @@ class NewEventForm(BaseForm): event.clean() if commit: event.save() + get_request().record('new-event', '{obj_id} created by {user} from {ip}', + obj_id=event.id) event.services = [self.service] return event diff --git a/calebasse/agenda/models.py b/calebasse/agenda/models.py index 11d9057..83e7bd5 100644 --- a/calebasse/agenda/models.py +++ b/calebasse/agenda/models.py @@ -11,6 +11,9 @@ from django import forms from calebasse.agenda import managers from calebasse.utils import weeks_since_epoch, weekday_ranks from calebasse.personnes.models import Holiday + +from ..middleware.request import get_request + from interval import Interval __all__ = ( @@ -357,6 +360,8 @@ class Event(models.Model): assert self.start_datetime is not None self.sanitize() # init periodicity fields super(Event, self).save(*args, **kwargs) + get_request().record('event-save', '{obj_id} saved by {user} from {ip}', + obj_id=self.id) self.acts_cleaning() def delete(self, *args, **kwargs): @@ -533,6 +538,10 @@ class EventWithAct(Event): def update_act(self, act): '''Update an act to match details of the meeting''' self.init_act(act) + changes = {'delta': self.timedelta(), 'act_type': self.act_type, + 'patient': self.patient, 'date': self.start_datetime.date(), + 'time': self.start_datetime.time(), 'parent': self} + get_request().record('act-update', '{obj_id} updated by {user} from {ip} with: {changes}', changes=changes) act.save() def init_act(self, act): @@ -549,6 +558,7 @@ class EventWithAct(Event): '''Force event_type to be patient meeting.''' self.event_type = EventType(id=1) super(EventWithAct, self).save(*args, **kwargs) + get_request().record('eventwithact-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def is_event_absence(self): return self.act.is_absent() diff --git a/calebasse/agenda/views.py b/calebasse/agenda/views.py index eb8f46a..0d261d7 100644 --- a/calebasse/agenda/views.py +++ b/calebasse/agenda/views.py @@ -239,7 +239,6 @@ class NewEventView(CreateView): messages.add_message(self.request, messages.INFO, u'Evénement enregistré avec succès.') return super(NewEventView, self).form_valid(form) - class BaseEventView(UpdateView): model = Event form_class = UpdateEventForm diff --git a/calebasse/dossiers/models.py b/calebasse/dossiers/models.py index 639fb58..2d78d66 100644 --- a/calebasse/dossiers/models.py +++ b/calebasse/dossiers/models.py @@ -20,6 +20,8 @@ from calebasse.ressources.models import (ServiceLinkedAbstractModel, NamedAbstractModel) from calebasse.actes.models import Act +from ..middleware.request import get_request + DEFAULT_ACT_NUMBER_DIAGNOSTIC = 6 DEFAULT_ACT_NUMBER_TREATMENT = 30 DEFAULT_ACT_NUMBER_PROLONGATION = 10 @@ -237,6 +239,7 @@ class FileState(models.Model): datetime(self.date_selected.year, self.date_selected.month, self.date_selected.day) super(FileState, self).save(**kwargs) + get_request().record('filestate-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def __unicode__(self): return self.status.name + ' ' + str(self.date_selected) @@ -249,7 +252,10 @@ class FileState(models.Model): if self.patient.last_state == self: self.patient.last_state = self.previous_state self.patient.save() + obj_id = self.id super(FileState, self).delete(*args, **kwargs) + get_request().record('filestate-delete', '{obj_id} deleted by {user} from {ip}', + obj_id=obj_id) class PatientAddress(models.Model): @@ -291,6 +297,7 @@ class PatientAddress(models.Model): if self.city: self.display_name += self.city + ' ' super(PatientAddress, self).save(**kwargs) + get_request().record('patientaddress-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) class PatientContact(People): class Meta: @@ -569,6 +576,7 @@ class PatientRecord(ServiceLinkedAbstractModel, PatientContact): if not getattr(self, 'service', None): raise Exception('The field service is mandatory.') super(PatientRecord, self).save(*args, **kwargs) + get_request().record('patientrecord-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def get_state(self): return self.last_state @@ -626,7 +634,9 @@ class PatientRecord(ServiceLinkedAbstractModel, PatientContact): def delete(self, *args, **kwargs): if self.can_be_deleted(): + obj_id = self.id super(PatientRecord, self).delete(*args, **kwargs) + get_request().record('patientrecord-delete', '{obj_id} by {user} from {ip}', obj_id=obj_id) def get_ondisk_directory(self, service): if not settings.PATIENT_FILES_BASE_DIRECTORY: @@ -1015,4 +1025,6 @@ def create_patient(first_name, last_name, service, creator, patient.save() patient.policyholder = patient.patientcontact patient.save() + get_request().record('new-patient', '{first_name} {last_name} ({id}) created by {user} from {ip}', + first_name=patient.first_name, last_name=patient.last_name, id=patient.id) return patient diff --git a/calebasse/personnes/models.py b/calebasse/personnes/models.py index 2050018..aa8662f 100644 --- a/calebasse/personnes/models.py +++ b/calebasse/personnes/models.py @@ -21,6 +21,8 @@ from interval import Interval from model_utils import Choices from model_utils.managers import PassThroughManager +from ..middleware.request import get_request + class Role(NamedAbstractModel): users = models.ManyToManyField(User, verbose_name=u'Utilisateurs', blank=True) @@ -49,6 +51,7 @@ class People(BaseModelMixin, models.Model): else: self.display_name = self.last_name.upper() super(People, self).save(**kwargs) + get_request().record('people-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def __unicode__(self): return self.display_name @@ -93,6 +96,7 @@ class Worker(People): if not self.initials: self.initials = self.get_initials() super(Worker, self).save(**kwargs) + get_request().record('worker-save', '{obj_id} saved by {user} from {ip}', obj_id=self.id) def is_active(self): return self.enabled diff --git a/calebasse/settings.py b/calebasse/settings.py index 2b9093f..1ee7a4f 100644 --- a/calebasse/settings.py +++ b/calebasse/settings.py @@ -113,6 +113,7 @@ MIDDLEWARE_CLASSES = ( 'reversion.middleware.RevisionMiddleware', # Entr'ouvert wsgi middleware to expose version 'entrouvert.djommon.middleware.VersionMiddleware', + 'django_journal.middleware.JournalMiddleware', ) ROOT_URLCONF = 'calebasse.urls' @@ -165,6 +166,7 @@ INSTALLED_APPS = ( 'calebasse.statistics', 'calebasse.middleware.request', 'south', + 'django_journal', ) INTERNAL_IPS=('127.0.0.1',) -- 2.0.1