diff --git a/ckan/config/schema.xml b/ckan/config/schema.xml index 2fb41dd96a1..c337aee3ba2 100644 --- a/ckan/config/schema.xml +++ b/ckan/config/schema.xml @@ -131,10 +131,10 @@ - + diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index 8adb48ac60d..675d47f1712 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -155,6 +155,11 @@ def package_dictize(pkg, context): q = select([rel_rev]).where(rel_rev.c.object_package_id == pkg.id) result = _execute_with_revision(q, rel_rev, context) result_dict["relationships_as_object"] = obj_list_dictize(result, context) + #isopen + # Get an actual Package object, not a PackageRevision + pkg_object = model.Package.get(pkg.id) + result_dict['isopen'] = pkg_object.isopen if isinstance(pkg_object.isopen,bool) else pkg_object.isopen() + return result_dict def group_dictize(group, context): diff --git a/ckan/lib/search/query.py b/ckan/lib/search/query.py index aca72c2d07d..1d01f3c61d5 100644 --- a/ckan/lib/search/query.py +++ b/ckan/lib/search/query.py @@ -280,6 +280,16 @@ def run(self, query): self.count = response.get('numFound', 0) self.results = response.get('docs', []) + # get any extras and add to 'extras' dict + for result in self.results: + extra_keys = filter(lambda x: x.startswith('extras_'), result.keys()) + extras = {} + for extra_key in extra_keys: + value = result.pop(extra_key) + extras[extra_key[len('extras_'):]] = value + if extra_keys: + result['extras'] = extras + # if just fetching the id or name, return a list instead of a dict if query.get('fl') in ['id', 'name']: self.results = [r.get(query.get('fl')) for r in self.results] diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 2a58ebf93e6..7730c633efe 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -438,8 +438,12 @@ def group_package_show(context, data_dict): query = query.order_by(model.package_revision_table.c.revision_timestamp.desc()) if limit: query = query.limit(limit) - pack_rev = query.all() - return _package_list_with_resources(context, pack_rev) + + result = [] + for pkg_rev in query.all(): + result.append(package_dictize(pkg_rev,context)) + + return result def tag_show(context, data_dict): '''Shows tag details''' @@ -457,9 +461,11 @@ def tag_show(context, data_dict): check_access('tag_show',context, data_dict) tag_dict = tag_dictize(tag,context) + extended_packages = [] for package in tag_dict['packages']: - extended_packages.append(_extend_package_dict(package,context)) + pkg = model.Package.get(package['id']) + extended_packages.append(package_dictize(pkg,context)) tag_dict['packages'] = extended_packages @@ -682,8 +688,7 @@ def package_search(context, data_dict): log.warning('package %s in index but not in database' % package) continue - result_dict = table_dictize(pkg, context) - result_dict = _extend_package_dict(result_dict,context) + result_dict = package_dictize(pkg,context) results.append(result_dict) return { diff --git a/ckan/model/package.py b/ckan/model/package.py index ea650b4de3b..eb0da1d2fd1 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -192,6 +192,7 @@ def as_dict(self, ref_package_by='name', ref_group_by='name'): # Set 'license' in _dict to cater for old clients. # Todo: Remove from Version 2? _dict['license'] = self.license.title if self.license else _dict.get('license_id', '') + _dict['isopen'] = self.isopen() tags = [tag.name for tag in self.tags] tags.sort() # so it is determinable _dict['tags'] = tags diff --git a/ckan/tests/lib/test_dictization.py b/ckan/tests/lib/test_dictization.py index d1a60c02e5a..f2987723018 100644 --- a/ckan/tests/lib/test_dictization.py +++ b/ckan/tests/lib/test_dictization.py @@ -43,6 +43,7 @@ def setup_class(cls): 'name': u'roger', 'state': u'active', 'title': u"Roger's books"}], + 'isopen': True, 'license_id': u'other-open', 'maintainer': None, 'maintainer_email': None, diff --git a/ckan/tests/lib/test_solr_package_search.py b/ckan/tests/lib/test_solr_package_search.py index 5d18bcb1faf..6eb0b97b5e2 100644 --- a/ckan/tests/lib/test_solr_package_search.py +++ b/ckan/tests/lib/test_solr_package_search.py @@ -438,16 +438,15 @@ def test_0_basic(self): self._do_search(u'bcd', 'b', 1) self._do_search(u'"cde abc"', 'c', 1) - def test_1_partial_matches(self): - # TODO: solr is not currently set up to allow partial matches - # and extras are not saved as multivalued so these - # tests will fail. Make multivalued or remove these? - from ckan.tests import SkipTest - raise SkipTest - - self._do_search(u'abc', ['a', 'c'], 2) - self._do_search(u'cde', 'c', 1) - self._do_search(u'abc cde', 'c', 1) + def test_1_extras_in_all_fields(self): + response = search.query_for(model.Package).run({'q': 'abc', 'fl': '*'}) + assert response['count'] == 2 + + results = response['results'] + for result in results: + assert 'extras' in result.keys(), result + assert 'department' in result['extras'], result['extras'] + assert result['extras']['department'] in ['abc', 'cde abc'], result['extras']['department'] class TestRank(TestController): @classmethod diff --git a/ckan/tests/lib/test_solr_package_search_synchronous_update.py b/ckan/tests/lib/test_solr_package_search_synchronous_update.py index e18df278777..1ac0e7640df 100644 --- a/ckan/tests/lib/test_solr_package_search_synchronous_update.py +++ b/ckan/tests/lib/test_solr_package_search_synchronous_update.py @@ -1,5 +1,4 @@ -from pylons import config -from ckan import plugins, model +from ckan import model import ckan.lib.search as search from ckan.tests import CreateTestData, setup_test_search_index from test_solr_package_search import TestSearchOverall