Skip to content

Commit

Permalink
Merge pull request #728 from Kinto/improve-events-handling
Browse files Browse the repository at this point in the history
Improve events handling
  • Loading branch information
leplatrem committed Jul 21, 2016
1 parent 23c8be9 commit e369d36
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ This document describes changes between each past release.
**Bug fixes**

- Fix Redis get_accessible_object implementation (#725)
- Fix bug where the resource events of a request targetting two groups/collection
from different buckets would be grouped together.


3.3.1 (2016-07-19)
Expand Down
11 changes: 9 additions & 2 deletions kinto/core/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ def __init__(self, payload, request):
self.payload = payload
self.request = request

def __repr__(self):
return "<{klass} action={action} uri={uri}>".format(
klass=self.__class__.__name__,
**self.payload)


class ResourceRead(_ResourceEvent):
"""Triggered when a resource is being read.
Expand Down Expand Up @@ -118,7 +123,8 @@ def get_resource_events(request, after_commit=False):
return events


def notify_resource_event(request, timestamp, data, action, old=None):
def notify_resource_event(request, parent_id, timestamp, data, action,
old=None):
"""
Request helper to stack a resource event.
Expand All @@ -141,10 +147,11 @@ def notify_resource_event(request, timestamp, data, action, old=None):

# Get previously triggered events.
events = request.bound_data.setdefault("resource_events", OrderedDict())

resource_name = request.current_resource_name

# Group events by resource and action.
group_by = resource_name + action.value
group_by = resource_name + parent_id + action.value

if group_by in events:
# Add to impacted records of existing event.
Expand Down
4 changes: 3 additions & 1 deletion kinto/core/resource/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,9 @@ def postprocess(self, result, action=ACTIONS.READ, old=None):
'data': result
}

self.request.notify_resource_event(timestamp=self.timestamp,
parent_id = self.get_parent_id(self.request)
self.request.notify_resource_event(parent_id=parent_id,
timestamp=self.timestamp,
data=result,
action=action,
old=old)
Expand Down
26 changes: 26 additions & 0 deletions kinto/tests/core/resource/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ class ResourceChangedTest(BaseEventTest, unittest.TestCase):

subscribed = (ResourceChanged,)

def test_events_have_custom_representation(self):
self.app.post_json(self.collection_url, self.body,
headers=self.headers, status=201)
self.assertEqual(repr(self.events[0]),
"<ResourceChanged action=create "
"uri=%s>" % self.collection_url)

def test_post_sends_create_action(self):
self.app.post_json(self.collection_url, self.body,
headers=self.headers, status=201)
Expand Down Expand Up @@ -352,6 +359,25 @@ def test_one_event_is_sent_per_resource(self):
self.app.post_json("/batch", body, headers=self.headers)
self.assertEqual(len(self.events), 2)

def test_one_event_is_sent_per_parent_id(self):
# /mushrooms is a UserResource (see testapp.views), which means
# that parent_id depends on the authenticated user.
body = {
"defaults": {
"path": '/mushrooms',
"method": "POST",
"body": self.body
},
"requests": [
{"headers": {"Authorization": "Basic bWF0OjE="}},
{"headers": {"Authorization": "Basic dG90bzp0dXR1"}},
{"headers": {"Authorization": "Basic bWF0OjE="}},
]
}
self.app.post_json("/batch", body, headers=self.headers)
# Two different auth headers, thus two different parent_id:
self.assertEqual(len(self.events), 2)

def test_one_event_is_sent_per_action(self):
body = {
"defaults": {
Expand Down

0 comments on commit e369d36

Please sign in to comment.