First things to implement a event change log

This commit is contained in:
2020-09-29 15:28:48 +02:00
parent 6ddef0c736
commit 9addc237bd
6 changed files with 166 additions and 14 deletions

View File

@@ -2,6 +2,7 @@
from __future__ import unicode_literals
import datetime
import difflib
import json
import logging
import os
import re
@@ -16,12 +17,12 @@ from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import get_language, ugettext_lazy as _
from django_countries.fields import CountryField
from . import get_ghost_user
from .. import choices
from .. import config
from .. import signals
from ..workflow import DefaultWorkflow
from . import get_ghost_user
from .eventchange import EventChange
logger = logging.getLogger(__name__)
@@ -292,9 +293,8 @@ class Event(models.Model):
logger.warning('Event is not created by its owner (Current user: %s, Owner: %s)!', self.editor, owner)
self.owner = owner
creating = True
elif not implicit_update:
else:
original = Event.objects.get(id=self.id)
original_text = original.render_as_text(show_internal_fields=True)
if not self.editor or not self.editor.is_authenticated:
self.editor = self.owner
@@ -305,13 +305,40 @@ class Event(models.Model):
logger.info('Event created: %s', self)
signals.event_created.send(sender=self.__class__, event=self)
self.workflow.update_status('draft', self.editor)
elif not implicit_update:
modified_text = self.render_as_text(show_internal_fields=True)
o_lines = original_text.split('\n')
m_lines = modified_text.split('\n')
diff_lines = list(difflib.unified_diff(o_lines, m_lines, n=len(m_lines), lineterm=''))
logger.info('Event updated: %s', self)
signals.event_updated.send(sender=self.__class__, event=self, diff=diff_lines, user=self.editor)
else:
change = EventChange(event=self, user=self.editor, operation='update', content=self.diff(original))
change.save()
if not implicit_update:
logger.info('Event updated: %s', self)
signals.event_updated.send(sender=self.__class__, event=self, diff=self.diff(original, fmt='human_readable'), user=self.editor)
def diff(self, event, fmt='json'):
if fmt == 'human_readable':
from_text = event.render_as_text(show_internal_fields=True)
to_text = self.render_as_text(show_internal_fields=True)
from_lines = from_text.split('\n')
to_lines = to_text.split('\n')
diff_lines = list(difflib.unified_diff(from_lines, to_lines, n=len(from_lines), lineterm=''))
diff_text = '\n'.join(diff_lines[3:])
elif fmt == 'json':
fields = self._meta.get_fields()
changes = []
for field in fields:
field_name = field.name
from_value = getattr(event, field_name)
to_value = getattr(self, field_name)
if from_value != to_value:
change = {
'field': field_name,
'refer': str(from_value),
'current': str(to_value),
}
changes.append(change)
diff_text = json.dumps(changes)
else:
raise ValueError("Event.diff(): Unsupported format: {}".format(fmt))
return diff_text
def is_deadline_expired(self):
today = datetime.date.today()