diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index 06bb9c58ac1..16b54381494 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1011,6 +1011,71 @@ def setup_class(cls): def teardown_class(cls): p.unload('image_view') + def test_resource_view_create(self): + user = factories.User() + env = {'REMOTE_USER': user['name'].encode('ascii')} + + owner_org = factories.Organization( + users=[{'name': user['id'], 'capacity': 'admin'}] + ) + dataset = factories.Dataset(owner_org=owner_org['id']) + resource = factories.Resource(package_id=dataset['id']) + + url = url_for('resource.edit_view', + id=resource['package_id'], + resource_id=resource['id'], + view_type='image_view') + + app = self._get_test_app() + response = app.post( + url, {'title': 'Test Image View'}, extra_environ=env + ).follow(extra_environ=env) + response.mustcontain('Test Image View') + + def test_resource_view_edit(self): + user = factories.User() + env = {'REMOTE_USER': user['name'].encode('ascii')} + + owner_org = factories.Organization( + users=[{'name': user['id'], 'capacity': 'admin'}] + ) + dataset = factories.Dataset(owner_org=owner_org['id']) + resource = factories.Resource(package_id=dataset['id']) + + resource_view = factories.ResourceView(resource_id=resource['id']) + url = url_for('resource.edit_view', + id=resource_view['package_id'], + resource_id=resource_view['resource_id'], + view_id=resource_view['id']) + + app = self._get_test_app() + response = app.post( + url, {'title': 'Updated RV Title'}, extra_environ=env + ).follow(extra_environ=env) + response.mustcontain('Updated RV Title') + + def test_resource_view_delete(self): + user = factories.User() + env = {'REMOTE_USER': user['name'].encode('ascii')} + + owner_org = factories.Organization( + users=[{'name': user['id'], 'capacity': 'admin'}] + ) + dataset = factories.Dataset(owner_org=owner_org['id']) + resource = factories.Resource(package_id=dataset['id']) + + resource_view = factories.ResourceView(resource_id=resource['id']) + url = url_for('resource.edit_view', + id=resource_view['package_id'], + resource_id=resource_view['resource_id'], + view_id=resource_view['id']) + + app = self._get_test_app() + response = app.post( + url, {'delete': 'Delete'}, extra_environ=env + ).follow(extra_environ=env) + response.mustcontain('This resource has no views') + def test_existent_resource_view_page_returns_ok_code(self): resource_view = factories.ResourceView() diff --git a/ckan/views/resource.py b/ckan/views/resource.py index c88bcb4eb6a..8957265bff8 100644 --- a/ckan/views/resource.py +++ b/ckan/views/resource.py @@ -611,11 +611,6 @@ def _prepare(self, id, resource_id): def post(self, package_type, id, resource_id, view_id=None): context, extra_vars = self._prepare(id, resource_id) - - to_preview = request.POST.pop(u'preview', False) - if to_preview: - context[u'preview'] = True - to_delete = request.POST.pop(u'delete', None) data = clean_dict( dict_fns.unflatten( tuplize_dict( @@ -624,7 +619,13 @@ def post(self, package_type, id, resource_id, view_id=None): ) ) data.pop(u'save', None) + + to_preview = data.pop(u'preview', False) + if to_preview: + context[u'preview'] = True + to_delete = data.pop(u'delete', None) data[u'resource_id'] = resource_id + data[u'view_type'] = request.args.get(u'view_type') try: if to_delete: @@ -662,22 +663,24 @@ def get( extra_vars.update(post_extra) package_type = _get_package_type(id) + data = extra_vars[u'data'] view_type = None # view_id exists only when updating if view_id: - try: - old_data = get_action(u'resource_view_show')( - context, { - u'id': view_id - } - ) - data = extra_vars[u'data'] or old_data - view_type = old_data.get(u'view_type') - # might as well preview when loading good existing view - if not extra_vars[u'errors']: - to_preview = True - except (NotFound, NotAuthorized): - return base.abort(404, _(u'View not found')) + if not data: + try: + data = get_action(u'resource_view_show')( + context, { + u'id': view_id + } + ) + except (NotFound, NotAuthorized): + return base.abort(404, _(u'View not found')) + + view_type = data.get(u'view_type') + # might as well preview when loading good existing view + if not extra_vars[u'errors']: + to_preview = True view_type = view_type or request.args.get(u'view_type') data[u'view_type'] = view_type