Skip to content

Commit

Permalink
[#1258] add validator decorator to user_activity_list
Browse files Browse the repository at this point in the history
 * Add decorator that validates against a given schema
 * Add default_activity_list_schema
 * Refactor user_activity list to use validator decorator
  • Loading branch information
joetsoi committed Nov 5, 2013
1 parent cba4e6c commit 9672aa3
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 2 deletions.
13 changes: 13 additions & 0 deletions ckan/logic/__init__.py
Expand Up @@ -502,6 +502,19 @@ def get_or_bust(data_dict, keys):
return values[0]
return tuple(values)

def validate(schema_func):
''' A decorator that validates an action function against a given schema
'''
def action_decorator(action):
@functools.wraps(action)
def wrapper(context, data_dict, **kwargs):
schema = schema_func()
data_dict, errors = _validate(data_dict, schema, context)
if errors:
raise ValidationError(errors)
return action(context, data_dict)
return wrapper
return action_decorator

def side_effect_free(action):
'''A decorator that marks the given action function as side-effect-free.
Expand Down
5 changes: 3 additions & 2 deletions ckan/logic/action/get.py
Expand Up @@ -2046,6 +2046,7 @@ def vocabulary_show(context, data_dict):
vocabulary_dict = model_dictize.vocabulary_dictize(vocabulary, context)
return vocabulary_dict

@logic.validate(logic.schema.default_activity_list_schema)
def user_activity_list(context, data_dict):
'''Return a user's public activity stream.
Expand All @@ -2071,12 +2072,12 @@ def user_activity_list(context, data_dict):

model = context['model']

user_ref = _get_or_bust(data_dict, 'id') # May be user name or id.
user_ref = data_dict.get('id') # May be user name or id.
user = model.User.get(user_ref)
if user is None:
raise logic.NotFound

offset = int(data_dict.get('offset', 0))
offset = data_dict.get('offset', 0)
limit = int(
data_dict.get('limit', config.get('ckan.activity_list_limit', 31)))

Expand Down
6 changes: 6 additions & 0 deletions ckan/logic/schema.py
Expand Up @@ -540,6 +540,12 @@ def default_dashboard_activity_list_schema():
return schema


def default_activity_list_schema():
schema = default_pagination_schema()
schema['id'] = [not_missing, unicode]
return schema


def default_autocomplete_schema():
schema = {
'q': [not_missing, unicode],
Expand Down
22 changes: 22 additions & 0 deletions ckan/new_tests/logic/action/test_get.py
@@ -0,0 +1,22 @@
import nose.tools
import nose.case
import ckan.logic as logic
import ckan.new_tests.helpers as helpers
import ckan.new_tests.factories as factories

class TestBadLimitQueryParameters(object):
'''test class for #1258 non-int query parameters cause 500 errors'''
@classmethod
def setup_class(cls):
helpers.reset_db()

def teardown(self):
import ckan.model as model
model.repo.rebuild_db()

def test_user_activity_list(self):
user = factories.User()
nose.tools.assert_raises(logic.ValidationError, helpers.call_action,
'user_activity_list', id=user['name'], limit='not_an_int',
offset='not_an_int'
)

0 comments on commit 9672aa3

Please sign in to comment.