Skip to content

Commit

Permalink
[#2204] Add actions for clearing all or certain types of views
Browse files Browse the repository at this point in the history
  • Loading branch information
amercader committed Feb 17, 2015
1 parent 9290b44 commit 6fd1ed6
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 1 deletion.
16 changes: 16 additions & 0 deletions ckan/logic/action/delete.py
Expand Up @@ -139,6 +139,22 @@ def resource_view_delete(context, data_dict):
model.repo.commit()


def resource_view_clear(context, data_dict):
'''Delete all resource views, or all of a particular type.
:param view_types: specific types to delete (optional)
:type view_types: list
'''
model = context['model']

_check_access('resource_view_clear', context, data_dict)

view_types = data_dict.get('view_types')
model.ResourceView.delete_all(view_types)
model.repo.commit()


def package_relationship_delete(context, data_dict):
'''Delete a dataset (package) relationship.
Expand Down
2 changes: 1 addition & 1 deletion ckan/logic/action/get.py
Expand Up @@ -1061,7 +1061,7 @@ def resource_view_show(context, data_dict):

def resource_view_list(context, data_dict):
'''
Return the metadata of a resource_view.
Return the list of resource views for a particular resource.
:param id: the id of the resource
:type id: string
Expand Down
5 changes: 5 additions & 0 deletions ckan/logic/auth/delete.py
Expand Up @@ -53,6 +53,11 @@ def resource_view_delete(context, data_dict):
return resource_delete(context, {'id': resource_id})


def resource_view_clear(context, data_dict):
# sysadmins only
return {'success': False}


def related_delete(context, data_dict):
model = context['model']
user = context['user']
Expand Down
10 changes: 10 additions & 0 deletions ckan/model/resource_view.py
Expand Up @@ -49,5 +49,15 @@ def delete_not_in_view_types(cls, view_types):

return query.delete(synchronize_session='fetch')

@classmethod
def delete_all(cls, view_types=[]):
'''Delete all Resource Views, or all of a particular type'''
query = meta.Session.query(ResourceView)

if view_types:
query = query.filter(ResourceView.view_type.in_(view_types))

return query.delete(synchronize_session='fetch')


meta.mapper(ResourceView, resource_view_table)
57 changes: 57 additions & 0 deletions ckan/new_tests/logic/action/test_delete.py
Expand Up @@ -73,6 +73,63 @@ def test_delete_wrong_id_raises_not_found_error(self):
assert_raises(logic.NotFound, helpers.call_action, 'resource_view_delete',
context={}, **params)


class TestClearResourceViews(object):

@classmethod
def setup_class(cls):
if not p.plugin_loaded('image_view'):
p.load('image_view')
if not p.plugin_loaded('recline_view'):
p.load('recline_view')

helpers.reset_db()

@classmethod
def teardown_class(cls):
p.unload('image_view')
p.unload('recline_view')

def test_resource_view_clear(self):
factories.ResourceView(view_type='image_view')
factories.ResourceView(view_type='image_view')

factories.ResourceView(view_type='recline_view')
factories.ResourceView(view_type='recline_view')

count = model.Session.query(model.ResourceView).count()

assert_equals(count, 4)

helpers.call_action('resource_view_clear', context={})

count = model.Session.query(model.ResourceView).count()

assert_equals(count, 0)

def test_resource_view_clear_with_types(self):
factories.ResourceView(view_type='image_view')
factories.ResourceView(view_type='image_view')

factories.ResourceView(view_type='recline_view')
factories.ResourceView(view_type='recline_view')

count = model.Session.query(model.ResourceView).count()

assert_equals(count, 4)

helpers.call_action('resource_view_clear', context={},
view_types=['image_view'])

view_types = model.Session.query(model.ResourceView.view_type).all()

assert_equals(len(view_types), 2)
for view_type in view_types:
assert_equals(view_type[0], 'recline_view')


class TestDeleteTags(object):

def test_tag_delete_with_unicode_returns_unicode_error(self):
# There is not a lot of call for it, but in theory there could be
# unicode in the ActionError error message, so ensure that comes
Expand Down
26 changes: 26 additions & 0 deletions ckan/new_tests/logic/auth/test_delete.py
Expand Up @@ -111,3 +111,29 @@ def test_org_user_can_delete(self):
id=resource_view['id'])

assert_equals(response, True)


class TestResourceViewClear(object):

def test_anon_cant_clear(self):
context = {'user': None, 'model': model}
params = {}
nose.tools.assert_raises(logic.NotAuthorized, helpers.call_auth,
'resource_view_clear', context=context,
**params)

def test_normal_user_cant_clear(self):
user = factories.User()

context = {'user': user['name'], 'model': model}

nose.tools.assert_raises(logic.NotAuthorized, helpers.call_auth,
'resource_view_clear', context=context)

def test_sysadmin_user_can_clear(self):
user = factories.User(sysadmin=True)

context = {'user': user['name'], 'model': model}
response = helpers.call_auth('resource_view_clear', context=context)

assert_equals(response, True)

0 comments on commit 6fd1ed6

Please sign in to comment.