Skip to content

Commit

Permalink
[#1251] Refactor "paster view clean"
Browse files Browse the repository at this point in the history
  • Loading branch information
vitorbaptista committed Apr 23, 2014
1 parent 9645614 commit 98358bc
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 9 deletions.
11 changes: 2 additions & 9 deletions ckan/lib/cli.py
Expand Up @@ -2166,11 +2166,7 @@ def clean_views(self):
for plugin in p.PluginImplementations(p.IResourceView):
names.append(str(plugin.info()['name']))

results = model.Session.execute(
'''select view_type, count(*)
from resource_view where view_type not in %s group by 1
''' % str(tuple(names))
).fetchall()
results = model.ResourceView.get_count_not_in_view_types(names)

if not results:
print 'No resource views to delete'
Expand All @@ -2186,10 +2182,7 @@ def clean_views(self):
print 'Not Deleting.'
return

results = model.Session.execute(
'''delete from resource_view where view_type not in %s
''' % str(tuple(names))
)
model.ResourceView.delete_not_in_view_types(names)
model.Session.commit()
print 'Deleted resource views.'

Expand Down
18 changes: 18 additions & 0 deletions ckan/model/resource_view.py
Expand Up @@ -31,5 +31,23 @@ def get(cls, reference):
def get_columns(cls):
return resource_view_table.columns.keys()

@classmethod
def get_count_not_in_view_types(cls, view_types):
'''Returns the count of ResourceView not in the view types list'''
query = meta.Session.query(ResourceView.view_type,
sa.func.count(ResourceView.id)) \
.group_by(ResourceView.view_type) \
.filter(sa.not_(ResourceView.view_type.in_(view_types)))

return query.all()

@classmethod
def delete_not_in_view_types(cls, view_types):
'''Delete the Resource Views not in the received view types list'''
query = meta.Session.query(ResourceView) \
.filter(sa.not_(ResourceView.view_type.in_(view_types)))

return query.delete(synchronize_session='fetch')


meta.mapper(ResourceView, resource_view_table)
51 changes: 51 additions & 0 deletions ckan/new_tests/model/test_resource_view.py
@@ -0,0 +1,51 @@
import nose.tools

import ckan.new_tests.helpers as helpers
import ckan.new_tests.factories as factories
import ckan.model as model

assert_equals = nose.tools.assert_equals
assert_not_equals = nose.tools.assert_not_equals
ResourceView = model.ResourceView


class TestResourceView(object):
@classmethod
def setup_class(cls):
helpers.reset_db()

def setup(self):
model.repo.rebuild_db()

def test_resource_view_get(self):
resource_view_id = factories.ResourceView()['id']
resource_view = ResourceView.get(resource_view_id)

assert_not_equals(resource_view, None)

def test_get_count_view_type(self):
factories.ResourceView(view_type='image')
factories.ResourceView(view_type='webpage')

result = ResourceView.get_count_not_in_view_types(['image'])

assert_equals(result, [('webpage', 1)])

def test_delete_view_type(self):
factories.ResourceView(view_type='image')
factories.ResourceView(view_type='webpage')

ResourceView.delete_not_in_view_types(['image'])

result = ResourceView.get_count_not_in_view_types(['image'])
assert_equals(result, [])

def test_delete_view_type_doesnt_commit(self):
factories.ResourceView(view_type='image')
factories.ResourceView(view_type='webpage')

ResourceView.delete_not_in_view_types(['image'])
model.Session.rollback()

result = ResourceView.get_count_not_in_view_types(['image'])
assert_equals(result, [('webpage', 1)])

0 comments on commit 98358bc

Please sign in to comment.