diff --git a/attract/shots/eve_hooks.py b/attract/shots/eve_hooks.py index cd54f48..e9e4681 100644 --- a/attract/shots/eve_hooks.py +++ b/attract/shots/eve_hooks.py @@ -1,9 +1,12 @@ +import itertools import logging from attract.node_types.shot import node_type_shot from pillar.api.nodes import only_for_node_type_decorator import pillar.api.activities import pillar.api.utils.authentication +import pillar.api.utils +import pillar.web.jinja log = logging.getLogger(__name__) only_for_shot = only_for_node_type_decorator(node_type_shot['name']) @@ -29,9 +32,24 @@ def activity_after_replacing_shot(shot, original): validation. """ - # TODO: compare to original, and either mention the things that changed, + # Compare to original, and either mention the things that changed, # or (if they are equal) don't log an activity at all. - register_shot_activity(shot, 'edited shot "%s"' % shot['name']) + changes = list(itertools.islice(pillar.api.utils.doc_diff(shot, original), 2)) + if not changes: + log.info('Not registering replacement of shot %s, as it is identical ' + 'in non-private fields.', shot['_id']) + return + + if len(changes) == 1: + (key, val_shot, _) = changes[0] + human_key = key.rsplit('.', 1)[-1] + if key == 'properties.status': + val_shot = pillar.web.jinja.format_undertitle(val_shot) + descr = 'changed %s to %s in shot "%s"' % (human_key, val_shot, shot['name']) + else: + descr = 'edited shot "%s"' % shot['name'] + + register_shot_activity(shot, descr) @only_for_shot diff --git a/attract/tasks/eve_hooks.py b/attract/tasks/eve_hooks.py index 5315674..94295ae 100644 --- a/attract/tasks/eve_hooks.py +++ b/attract/tasks/eve_hooks.py @@ -1,11 +1,13 @@ import logging +import itertools from flask import current_app from attract.node_types.task import node_type_task from pillar.api.nodes import only_for_node_type_decorator import pillar.api.activities import pillar.api.utils.authentication +import pillar.web.jinja log = logging.getLogger(__name__) only_for_task = only_for_node_type_decorator(node_type_task['name']) @@ -100,9 +102,24 @@ def register_task_activity(task, descr): @only_for_task def activity_after_replacing_task(task, original): - # TODO: compare to original, and either mention the things that changed, + # Compare to original, and either mention the things that changed, # or (if they are equal) don't log an activity at all. - register_task_activity(task, 'edited task "%s"' % task['name']) + changes = list(itertools.islice(pillar.api.utils.doc_diff(task, original), 2)) + if not changes: + log.info('Not registering replacement of task %s, as it is identical ' + 'in non-private fields.', task['_id']) + return + + if len(changes) == 1: + (key, val_task, _) = changes[0] + human_key = key.rsplit('.', 1)[-1] + if key == 'properties.status': + val_task = pillar.web.jinja.format_undertitle(val_task) + descr = 'changed %s to %s in task "%s"' % (human_key, val_task, task['name']) + else: + descr = 'edited task "%s"' % task['name'] + + register_task_activity(task, descr) @only_for_task