diff --git a/ckan/lib/activity_streams_session_extension.py b/ckan/lib/activity_streams_session_extension.py index 3dec8a95173..b591ebb803e 100644 --- a/ckan/lib/activity_streams_session_extension.py +++ b/ckan/lib/activity_streams_session_extension.py @@ -8,10 +8,10 @@ log = logging.getLogger(__name__) -def activity_stream_item(obj, activity_type, revision, user_id): +def activity_stream_item(obj, activity_type, user_id): method = getattr(obj, "activity_stream_item", None) if callable(method): - return method(activity_type, revision, user_id) + return method(activity_type, user_id) else: # Object did not have a suitable activity_stream_item() method; it must # not be a package @@ -41,13 +41,13 @@ def before_commit(self, session): try: object_cache = session._object_cache - revision = session.revision except AttributeError: - # session had no _object_cache or no revision; skipping this commit + # session had no _object_cache; skipping this commit return - if revision.user: - user_id = revision.user.id + user = 'DUNNO' # TODO!! + if user: + user_id = user else: # If the user is not logged in then revision.user is None and # revision.author is their IP address. Just log them as 'not logged @@ -63,7 +63,7 @@ def before_commit(self, session): # logged as changed packages. # Looking for new packages... for obj in object_cache['new']: - activity = activity_stream_item(obj, 'new', revision, user_id) + activity = activity_stream_item(obj, 'new', user_id) if activity is None: continue # The object returns an activity stream item, so we know that the @@ -113,7 +113,7 @@ def before_commit(self, session): continue activity = activity_stream_item( - package, "changed", revision, user_id) + package, "changed", user_id) if activity is None: continue activities[package.id] = activity diff --git a/ckan/logic/schema.py b/ckan/logic/schema.py index 96b2f8a0957..8e6b0cd4352 100644 --- a/ckan/logic/schema.py +++ b/ckan/logic/schema.py @@ -676,8 +676,9 @@ def default_create_resource_view_schema(resource_view): @validator_args def default_create_resource_view_schema_unfiltered( - not_empty, unicode_safe, ignore_missing, empty): + not_empty, resource_id_exists, unicode_safe, ignore_missing, empty): return { + 'resource_id': [not_empty, resource_id_exists], 'title': [not_empty, unicode_safe], 'description': [ignore_missing, unicode_safe], 'view_type': [not_empty, unicode_safe], @@ -708,10 +709,11 @@ def default_update_resource_view_schema(resource_view): @validator_args def default_update_resource_view_schema_changes( - not_missing, not_empty, unicode_safe, ignore, + not_missing, not_empty, unicode_safe, resource_id_exists, ignore, ignore_missing): return { 'id': [not_missing, not_empty, unicode_safe], + 'resource_id': [ignore_missing, resource_id_exists], 'title': [ignore_missing, unicode_safe], 'view_type': [ignore], # cannot change after create 'package_id': [ignore] diff --git a/ckan/model/group_extra.py b/ckan/model/group_extra.py index 24f0473394f..6895125d865 100644 --- a/ckan/model/group_extra.py +++ b/ckan/model/group_extra.py @@ -44,9 +44,8 @@ class GroupExtra( def _create_extra(key, value): return GroupExtra(key=text_type(key), value=value) -# Don't think we need this -# _extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', -# vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) -# setattr(group.Group, 'extras_active', _extras_active) -# group.Group.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', -# creator=_create_extra) +_extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', + vdm.sqlalchemy.stateful.StatefulDict) +setattr(group.Group, 'extras_active', _extras_active) +group.Group.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', + creator=_create_extra) diff --git a/ckan/model/package.py b/ckan/model/package.py index 55f76205a66..0c2189ecfff 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -466,7 +466,6 @@ def activity_stream_item(self, activity_type, user_id): return activity.Activity( user_id, self.id, - '', # revisions are no more "%s package" % activity_type, { 'package': dictized_package, diff --git a/ckan/model/package_extra.py b/ckan/model/package_extra.py index 6a8e3805db4..3bc70399f0d 100644 --- a/ckan/model/package_extra.py +++ b/ckan/model/package_extra.py @@ -55,9 +55,8 @@ def related_packages(self): def _create_extra(key, value): return PackageExtra(key=text_type(key), value=value) -# # don't think we need this? -# _extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', -# vdm.sqlalchemy.stateful.StatefulDict, base_modifier=lambda x: x.get_as_of()) -# setattr(_package.Package, 'extras_active', _extras_active) -# _package.Package.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', -# creator=_create_extra) +_extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras', + vdm.sqlalchemy.stateful.StatefulDict) +setattr(_package.Package, 'extras_active', _extras_active) +_package.Package.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value', + creator=_create_extra) diff --git a/ckan/model/system_info.py b/ckan/model/system_info.py index 61d0d68c3a4..2941aa479ee 100644 --- a/ckan/model/system_info.py +++ b/ckan/model/system_info.py @@ -74,6 +74,6 @@ def set_system_info(key, value): else: obj.value = text_type(value) - from ckan.model import repo - + meta.Session.add(obj) + meta.Session.commit() return True diff --git a/ckan/tests/controllers/test_admin.py b/ckan/tests/controllers/test_admin.py index ad292e315bc..c8871ac250a 100644 --- a/ckan/tests/controllers/test_admin.py +++ b/ckan/tests/controllers/test_admin.py @@ -253,166 +253,3 @@ def test_homepage_style(self): reset_index_response = app.get('/') assert_true('' in reset_index_response) - - -class TestTrashView(helpers.FunctionalTestBase): - '''View tests for permanently deleting datasets with Admin Trash.''' - - @helpers.change_config('debug', True) - def test_trash_view_anon_user(self): - '''An anon user shouldn't be able to access trash view.''' - app = self._get_test_app() - - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, status=403) - - def test_trash_view_normal_user(self): - '''A normal logged in user shouldn't be able to access trash view.''' - user = factories.User() - app = self._get_test_app() - - env = {'REMOTE_USER': user['name'].encode('ascii')} - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, extra_environ=env, status=403) - assert_true('Need to be system administrator to administer' - in trash_response) - - def test_trash_view_sysadmin(self): - '''A sysadmin should be able to access trash view.''' - user = factories.Sysadmin() - app = self._get_test_app() - - env = {'REMOTE_USER': user['name'].encode('ascii')} - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, extra_environ=env, status=200) - # On the purge page - assert_true('form-purge-packages' in trash_response) - - def test_trash_no_datasets(self): - '''Getting the trash view with no 'deleted' datasets should list no - datasets.''' - factories.Dataset() - user = factories.Sysadmin() - app = self._get_test_app() - - env = {'REMOTE_USER': user['name'].encode('ascii')} - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, extra_environ=env, status=200) - - trash_response_html = BeautifulSoup(trash_response.body) - # it's called a 'user list' for some reason - trash_pkg_list = trash_response_html.select('ul.user-list li') - # no packages available to purge - assert_equal(len(trash_pkg_list), 0) - - def test_trash_with_deleted_datasets(self): - '''Getting the trash view with 'deleted' datasets should list the - datasets.''' - user = factories.Sysadmin() - factories.Dataset(state='deleted') - factories.Dataset(state='deleted') - factories.Dataset() - app = self._get_test_app() - - env = {'REMOTE_USER': user['name'].encode('ascii')} - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, extra_environ=env, status=200) - - trash_response_html = BeautifulSoup(trash_response.body) - # it's called a 'user list' for some reason - trash_pkg_list = trash_response_html.select('ul.user-list li') - # Two packages in the list to purge - assert_equal(len(trash_pkg_list), 2) - - def test_trash_purge_deleted_datasets(self): - '''Posting the trash view with 'deleted' datasets, purges the - datasets.''' - user = factories.Sysadmin() - factories.Dataset(state='deleted') - factories.Dataset(state='deleted') - factories.Dataset() - app = self._get_test_app() - - # how many datasets before purge - pkgs_before_purge = model.Session.query(model.Package).count() - assert_equal(pkgs_before_purge, 3) - - env = {'REMOTE_USER': user['name'].encode('ascii')} - trash_url = url_for(controller='admin', action='trash') - trash_response = app.get(trash_url, extra_environ=env, status=200) - - # submit the purge form - purge_form = trash_response.forms['form-purge-packages'] - purge_response = webtest_submit(purge_form, 'purge-packages', - status=302, extra_environ=env) - purge_response = purge_response.follow(extra_environ=env) - # redirected back to trash page - assert_true('Purge complete' in purge_response) - - # how many datasets after purge - pkgs_before_purge = model.Session.query(model.Package).count() - assert_equal(pkgs_before_purge, 1) - - -class TestAdminConfigUpdate(helpers.FunctionalTestBase): - - def teardown(self): - '''Reset the database and clear the search indexes.''' - helpers.reset_db() - - def _update_config_option(self): - sysadmin = factories.Sysadmin() - env = {'REMOTE_USER': sysadmin['name'].encode('ascii')} - app = self._get_test_app() - url = url_for(controller='admin', action='config') - - response = app.get(url=url, extra_environ=env) - form = response.forms[1] - form['ckan.site_title'] = 'My Updated Site Title' - - webtest_submit(form, 'save', status=302, extra_environ=env) - - def test_admin_config_update(self): - '''Changing a config option using the admin interface appropriately - updates value returned by config_option_show, - system_info.get_system_info and in the title tag in templates.''' - - # test value before update - # config_option_show returns default value - before_update = helpers.call_action('config_option_show', - key='ckan.site_title') - assert_equal(before_update, 'CKAN') - - # system_info.get_system_info returns None, or default - # test value before update - before_update = get_system_info('ckan.site_title') - assert_equal(before_update, None) - # test value before update with default - before_update_default = get_system_info('ckan.site_title', - config['ckan.site_title']) - assert_equal(before_update_default, 'CKAN') - - # title tag contains default value - app = self._get_test_app() - home_page_before = app.get('/', status=200) - assert_true('Welcome - CKAN' in home_page_before) - - # update the option - self._update_config_option() - - # test config_option_show returns new value after update - after_update = helpers.call_action('config_option_show', - key='ckan.site_title') - assert_equal(after_update, 'My Updated Site Title') - - # system_info.get_system_info returns new value - after_update = get_system_info('ckan.site_title') - assert_equal(after_update, 'My Updated Site Title') - # test value after update with default - after_update_default = get_system_info('ckan.site_title', - config['ckan.site_title']) - assert_equal(after_update_default, 'My Updated Site Title') - - # title tag contains new value - home_page_after = app.get('/', status=200) - assert_true('Welcome - My Updated Site Title' in home_page_after) diff --git a/ckan/tests/legacy/models/test_group.py b/ckan/tests/legacy/models/test_group.py index e50efc055b9..6e863f0d9f3 100644 --- a/ckan/tests/legacy/models/test_group.py +++ b/ckan/tests/legacy/models/test_group.py @@ -186,53 +186,3 @@ def test_groups_allowed_to_be_its_parent(self): assert_in('cabinet-office', names) assert_not_in('natonal-health-service', names) assert_not_in('nhs-wirral-ccg', names) - -class TestGroupRevisions: - @classmethod - def setup_class(self): - model.Session.remove() - CreateTestData.create() - self.name = u'revisiontest' - - # create pkg - self.descriptions = [u'Written by Puccini', u'Written by Rossini', u'Not written at all', u'Written again', u'Written off'] - self.grp = model.Group(name=self.name) - model.Session.add(self.grp) - self.grp.description = self.descriptions[0] - self.grp.extras['mykey'] = self.descriptions[0] - model.repo.commit_and_remove() - - # edit pkg - for i in range(5)[1:]: - grp = model.Group.by_name(self.name) - grp.description = self.descriptions[i] - grp.extras['mykey'] = self.descriptions[i] - model.repo.commit_and_remove() - - self.grp = model.Group.by_name(self.name) - - @classmethod - def teardown_class(self): - #grp = model.Group.by_name(self.name) - #grp.purge() - #model.repo.commit_and_remove() - model.repo.rebuild_db() - - def test_1_all_revisions(self): - all_rev = self.grp.all_revisions - num_descs = len(self.descriptions) - assert len(all_rev) == num_descs, len(all_rev) - for i, rev in enumerate(all_rev): - assert rev.description == self.descriptions[num_descs - i - 1], \ - '%s != %s' % (rev.description, self.descriptions[i]) - - def test_2_extras(self): - all_rev = self.grp.all_revisions - num_descs = len(self.descriptions) - assert len(all_rev) == num_descs, len(all_rev) - for i, rev in enumerate(all_rev): - #print "REVISION", dir(rev) - #assert rev.extras['mykey'] == self.descriptions[num_descs - i - 1], \ - # '%s != %s' % (rev.extras['mykey'], self.descriptions[i]) - pass - diff --git a/ckan/tests/legacy/models/test_package.py b/ckan/tests/legacy/models/test_package.py index 3c821d39833..5f6e37182a2 100644 --- a/ckan/tests/legacy/models/test_package.py +++ b/ckan/tests/legacy/models/test_package.py @@ -53,8 +53,6 @@ def test_update_package(self): model.Session.clear() outpkg = model.Package.by_name(self.name) assert outpkg.notes == newnotes - assert len(outpkg.all_revisions) > 0 - assert outpkg.all_revisions[0].revision.author == author def test_package_license(self): # Check unregistered license_id causes license to be 'None'. @@ -98,7 +96,6 @@ def setup_class(self): model.Session.add_all([pkg,self.tag,self.tag2,pkg2tag]) model.Session.commit() self.pkg2tag_id = pkg2tag.id - self.rev = rev1 @classmethod def teardown_class(self): @@ -195,107 +192,6 @@ def test_alphabetical_ordering(self): assert tag.packages[0].name == 'annakarenina', tag.packages -class TestPackageRevisions: - @classmethod - def setup_class(self): - model.Session.remove() - model.repo.init_db() - self.name = u'revisiontest' - - # create pkg - self.notes = [u'Written by Puccini', u'Written by Rossini', u'Not written at all', u'Written again', u'Written off'] - self.pkg1 = model.Package(name=self.name) - model.Session.add(self.pkg1) - self.pkg1.notes = self.notes[0] - self.pkg1.extras['mykey'] = self.notes[0] - model.repo.commit_and_remove() - - # edit pkg - for i in range(5)[1:]: - pkg1 = model.Package.by_name(self.name) - pkg1.notes = self.notes[i] - pkg1.extras['mykey'] = self.notes[i] - model.repo.commit_and_remove() - - self.pkg1 = model.Package.by_name(self.name) - - @classmethod - def teardown_class(self): - pkg1 = model.Package.by_name(self.name) - pkg1.purge() - model.repo.commit_and_remove() - model.repo.rebuild_db() - - def test_1_all_revisions(self): - all_rev = self.pkg1.all_revisions - num_notes = len(self.notes) - assert len(all_rev) == num_notes, len(all_rev) - for i, rev in enumerate(all_rev): - assert rev.notes == self.notes[num_notes - i - 1], '%s != %s' % (rev.notes, self.notes[i]) - #assert rev.extras['mykey'] == self.notes[num_notes - i - 1], '%s != %s' % (rev.extras['mykey'], self.notes[i]) - - -class TestRelatedRevisions: - @classmethod - def setup_class(self): - CreateTestData.create() - model.Session.remove() - self.name = u'difftest' - - # create pkg - PackageRevision - self.pkg1 = model.Package(name=self.name) - model.Session.add(self.pkg1) - self.pkg1.version = u'First version' - model.repo.commit_and_remove() - - # edit pkg - PackageRevision - pkg1 = model.Package.by_name(self.name) - pkg1.notes = u'New notes' - model.repo.commit_and_remove() - - # edit pkg - PackageExtraRevision - pkg1 = model.Package.by_name(self.name) - pkg1.extras = {u'a':u'b', u'c':u'd'} - model.repo.commit_and_remove() - - # edit pkg - PackageTagRevision - pkg1 = model.Package.by_name(self.name) - pkg1.add_tag_by_name(u'geo') - pkg1.add_tag_by_name(u'scientific') - model.repo.commit_and_remove() - - # edit pkg - ResourceRevision - pkg1 = model.Package.by_name(self.name) - pkg1.resources_all.append(model.Resource(url=u'http://url1.com', - format=u'xls', - description=u'It is.', - hash=u'abc123')) - model.repo.commit_and_remove() - - # edit pkg - ResourceRevision - pkg1 = model.Package.by_name(self.name) - pkg1.resources_all[0].url = u'http://url1.com/edited' - pkg1.resources_all.append(model.Resource(url=u'http://url2.com')) - model.repo.commit_and_remove() - - # edit pkg - PackageRevision - pkg1 = model.Package.by_name(self.name) - pkg1.notes = u'Changed notes' - model.repo.commit_and_remove() - - self.pkg1 = model.Package.by_name(self.name) - self.res1 = model.Session.query(model.Resource).filter_by(url=u'http://url1.com/edited').one() - self.res2 = model.Session.query(model.Resource).filter_by(url=u'http://url2.com').one() - assert self.pkg1 - - @classmethod - def teardown_class(self): - pkg1 = model.Package.by_name(self.name) - pkg1.purge() - model.repo.commit_and_remove() - model.repo.rebuild_db() - - class TestPackagePurge: @classmethod def setup_class(self):