diff --git a/ckan/model/package.py b/ckan/model/package.py index 56997589436..8ef4fae9aa0 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -556,6 +556,19 @@ def set_rating(self, user_or_ip, rating): rating=rating) meta.Session.add(rating) + @property + @maintain.deprecated() + def extras_list(self): + '''DEPRECATED in 2.9 + + Returns a list of the dataset's extras, as PackageExtra object + NB includes deleted ones too (state='deleted') + ''' + from package_extra import PackageExtra + return meta.Session.query(PackageExtra) \ + .filter_by(package_id=self.id) \ + .all() + class RatingValueException(Exception): pass diff --git a/ckan/tests/model/test_package_extra.py b/ckan/tests/model/test_package_extra.py new file mode 100644 index 00000000000..f1494e27da2 --- /dev/null +++ b/ckan/tests/model/test_package_extra.py @@ -0,0 +1,36 @@ +# encoding: utf-8 + +from nose.tools import assert_equal + +from ckan import model +from ckan.tests import helpers, factories + + +class TestPackage(object): + + def setup(self): + helpers.reset_db() + + def test_extras_list(self): + extras = [ + {u'key': u'subject', u'value': u'science'}, + {u'key': u'accuracy', u'value': u'metre'}, + {u'key': u'sample_years', u'value': u'2012-2013'}, + ] + dataset = factories.Dataset(extras=extras) + # delete the 'subject' extra + extras = extras[1:] + helpers.call_action(u'package_patch', id=dataset['id'], extras=extras) + # unrelated extra, to check it doesn't affect things + factories.Dataset(extras=[{u'key': u'foo', u'value': u'bar'}]) + + pkg = model.Package.by_name(dataset['name']) + assert isinstance(pkg.extras_list[0], model.PackageExtra) + assert_equal( + set([(pe.package_id, pe.key, pe.value, pe.state) + for pe in pkg.extras_list]), + set([(dataset['id'], u'subject', u'science', u'deleted'), + (dataset['id'], u'accuracy', u'metre', u'active'), + (dataset['id'], u'sample_years', u'2012-2013', u'active'), + ]) + )