Skip to content

Commit

Permalink
Move inheritance to resource events
Browse files Browse the repository at this point in the history
* Use recent permission.remove_principal() method
* Use ACTIONS constants
  • Loading branch information
leplatrem committed Mar 7, 2016
1 parent 13d901c commit ef25f5f
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 60 deletions.
37 changes: 23 additions & 14 deletions kinto/views/buckets.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from cliquet import resource
from cliquet.events import ResourceChanged, ACTIONS
from pyramid.events import subscriber

from kinto.views import NameGenerator


Expand All @@ -23,33 +26,39 @@ def get_parent_id(self, request):
# Buckets are not isolated by user, unlike Cliquet resources.
return ''

def delete(self):
result = super(Bucket, self).delete()

@subscriber(ResourceChanged,
for_resources=('bucket',),
for_actions=(ACTIONS.DELETE,))
def on_buckets_deleted(event):
"""Some buckets were deleted, delete sub-resources.
"""
storage = event.request.registry.storage

for change in event.impacted_records:
bucket = change['old']
parent_id = '/buckets/%s' % bucket['id']

# Delete groups.
storage = self.model.storage
parent_id = '/buckets/%s' % self.record_id
storage.delete_all(collection_id='group',
parent_id=parent_id,
with_deleted=False)
storage.purge_deleted(collection_id='group',
parent_id=parent_id)

# Delete collections.
deleted = storage.delete_all(collection_id='collection',
parent_id=parent_id,
with_deleted=False)
deleted_collections = storage.delete_all(collection_id='collection',
parent_id=parent_id,
with_deleted=False)
storage.purge_deleted(collection_id='collection',
parent_id=parent_id)

# Delete records.
id_field = self.model.id_field
for collection in deleted:
parent_id = '/buckets/%s/collections/%s' % (self.record_id,
collection[id_field])
for collection in deleted_collections:
parent_id = '/buckets/%s/collections/%s' % (bucket['id'],
collection['id'])
storage.delete_all(collection_id='record',
parent_id=parent_id,
with_deleted=False)
storage.purge_deleted(collection_id='record', parent_id=parent_id)

return result
storage.purge_deleted(collection_id='record',
parent_id=parent_id)
25 changes: 16 additions & 9 deletions kinto/views/collections.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import colander
import jsonschema
from cliquet import resource
from cliquet.events import ResourceChanged, ACTIONS
from jsonschema import exceptions as jsonschema_exceptions
from pyramid.events import subscriber

from kinto.views import NameGenerator

Expand Down Expand Up @@ -50,16 +52,21 @@ def get_parent_id(self, request):
parent_id = '/buckets/%s' % bucket_id
return parent_id

def delete(self):
result = super(Collection, self).delete()

# Delete records.
storage = self.model.storage
parent_id = '%s/collections/%s' % (self.model.parent_id,
self.record_id)
@subscriber(ResourceChanged,
for_resources=('collection',),
for_actions=(ACTIONS.DELETE,))
def on_collections_deleted(event):
"""Some collections were deleted, delete records.
"""
storage = event.request.registry.storage

for change in event.impacted_records:
collection = change['old']
parent_id = '/buckets/%s/collections/%s' % (event.payload['bucket_id'],
collection['id'])
storage.delete_all(collection_id='record',
parent_id=parent_id,
with_deleted=False)
storage.purge_deleted(collection_id='record', parent_id=parent_id)

return result
storage.purge_deleted(collection_id='record',
parent_id=parent_id)
74 changes: 37 additions & 37 deletions kinto/views/groups.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import colander

from cliquet import resource
from cliquet.events import ResourceChanged, ACTIONS
from pyramid.events import subscriber

from kinto.views import NameGenerator

Expand All @@ -26,49 +28,47 @@ def get_parent_id(self, request):
parent_id = '/buckets/%s' % bucket_id
return parent_id

def collection_delete(self):
filters = self._extract_filters()
groups, _ = self.model.get_records(filters=filters)
body = super(Group, self).collection_delete()
permission = self.request.registry.permission
for group in groups:
group_id = self.context.get_permission_object_id(
self.request, group[self.model.id_field])
# Remove the group's principal from all members of the group.
for member in group['members']:
permission.remove_user_principal(
member,
group_id)
return body

def delete(self):
group = self._get_record_or_404(self.record_id)
permission = self.request.registry.permission
body = super(Group, self).delete()
group_id = self.context.permission_object_id
for member in group['members']:
# Remove the group's principal from all members of the group.
permission.remove_user_principal(member, group_id)
return body

def process_record(self, new, old=None):
if old is None:
existing_record_members = set()

@subscriber(ResourceChanged,
for_resources=('group',),
for_actions=(ACTIONS.DELETE,))
def on_groups_deleted(event):
"""Some groups were deleted, remove them from users principals.
"""
permission_backend = event.request.registry.permission

for change in event.impacted_records:
group = change['old']
group_uri = '/buckets/{bucket_id}/groups/{id}'.format(id=group['id'],
**event.payload)
permission_backend.remove_principal(group_uri)


@subscriber(ResourceChanged,
for_resources=('group',),
for_actions=(ACTIONS.CREATE, ACTIONS.UPDATE))
def on_groups_changed(event):
"""Some groups were changed, update users principals.
"""
permission_backend = event.request.registry.permission

for change in event.impacted_records:
if 'old' in change:
existing_record_members = set(change['old'].get('members', []))
else:
existing_record_members = set(old.get('members', []))
new_record_members = set(new['members'])
existing_record_members = set()

group = change['new']
group_uri = '/buckets/{bucket_id}/groups/{id}'.format(id=group['id'],
**event.payload)
new_record_members = set(group.get('members', []))
new_members = new_record_members - existing_record_members
removed_members = existing_record_members - new_record_members

group_principal = self.context.get_permission_object_id(
self.request, self.record_id)
permission = self.request.registry.permission
for member in new_members:
# Add the group to the member principal.
permission.add_user_principal(member, group_principal)
permission_backend.add_user_principal(member, group_uri)

for member in removed_members:
# Remove the group from the member principal.
permission.remove_user_principal(member, group_principal)

return new
permission_backend.remove_user_principal(member, group_uri)

0 comments on commit ef25f5f

Please sign in to comment.