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