Skip to content

Commit

Permalink
Using the schema to do the default & limit, instead of code. declarat…
Browse files Browse the repository at this point in the history
…ive.
  • Loading branch information
David Read committed Sep 28, 2018
1 parent 7a3128a commit 4e6f428
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 4 deletions.
12 changes: 11 additions & 1 deletion ckan/lib/navl/validators.py
Expand Up @@ -4,7 +4,7 @@

import ckan.lib.navl.dictization_functions as df

from ckan.common import _, json
from ckan.common import _, json, config

missing = df.missing
StopOnError = df.StopOnError
Expand Down Expand Up @@ -163,3 +163,13 @@ def unicode_safe(value):
return text_type(value)
except Exception:
return u'\N{REPLACEMENT CHARACTER}'

def limit_to_configured_maximum(config_option, default_limit):
def callable(key, data, errors, context):

value = data.get(key)
limit = int(config.get(config_option, default_limit))
if value > limit:
data[key] = limit

return callable
2 changes: 1 addition & 1 deletion ckan/lib/search/query.py
Expand Up @@ -312,7 +312,7 @@ def run(self, query, permission_labels=None, **kwargs):
query['q'] = "*:*"

# number of results
rows_to_return = min(1000, int(query.get('rows', 10)))
rows_to_return = query['rows'] # defaulted & made an int by schema
if rows_to_return > 0:
# #1683 Work around problem of last result being out of order
# in SOLR 1.4
Expand Down
5 changes: 3 additions & 2 deletions ckan/logic/schema.py
Expand Up @@ -627,12 +627,13 @@ def default_autocomplete_schema(
def default_package_search_schema(
ignore_missing, unicode_safe, list_of_strings,
natural_number_validator, int_validator, convert_to_json_if_string,
convert_to_list_if_string):
convert_to_list_if_string, limit_to_configured_maximum, default):
return {
'q': [ignore_missing, unicode_safe],
'fl': [ignore_missing, convert_to_list_if_string],
'fq': [ignore_missing, unicode_safe],
'rows': [ignore_missing, natural_number_validator],
'rows': [default(10), natural_number_validator,
limit_to_configured_maximum('ckan.search.rows_max', 1000)],
'sort': [ignore_missing, unicode_safe],
'start': [ignore_missing, natural_number_validator],
'qf': [ignore_missing, unicode_safe],
Expand Down
19 changes: 19 additions & 0 deletions ckan/tests/logic/action/test_get.py
Expand Up @@ -892,6 +892,25 @@ def test_bad_solr_parameter(self):
# SOLR error is 'Missing sort order' or 'Missing_sort_order',
# depending on the solr version.

def _create_bulk_datasets(self, name, count):
from ckan import model
model.repo.new_revision()
pkgs = [model.Package(name='{}_{}'.format(name, i))
for i in range(count)]
model.Session.add_all(pkgs)
model.repo.commit_and_remove()

def test_rows_returned_default(self):
self._create_bulk_datasets('rows_default', 11)
results = logic.get_action('package_search')({}, {})
eq(len(results['results']), 10) # i.e. 'rows' default value

@helpers.change_config('ckan.search.rows_max', '12')
def test_rows_returned_limited(self):
self._create_bulk_datasets('rows_limited', 14)
results = logic.get_action('package_search')({}, {'rows': '15'})
eq(len(results['results']), 12) # i.e. ckan.search.rows_max

def test_facets(self):
org = factories.Organization(name='test-org-facet', title='Test Org')
factories.Dataset(owner_org=org['id'])
Expand Down

0 comments on commit 4e6f428

Please sign in to comment.