diff --git a/ckan/tests/legacy/functional/api/test_util.py b/ckan/tests/legacy/functional/api/test_util.py
index 9065d00e7da..3e96ff7900e 100644
--- a/ckan/tests/legacy/functional/api/test_util.py
+++ b/ckan/tests/legacy/functional/api/test_util.py
@@ -17,81 +17,6 @@ def setup_class(cls):
def teardown_class(cls):
model.repo.rebuild_db()
- def test_package_slug_invalid(self):
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='is_slug_valid', ver=2)
-
- response = self.app.get(
- url,
- params={
- 'type': u'package',
- 'slug': u'edit',
- },
- status=200,
- )
- assert_equal(response.body, '{"valid": false}')
- assert_equal(response.headers['Content-Type'], 'application/json;charset=utf-8')
-
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='is_slug_valid', ver=2)
-
- response = self.app.get(
- url,
- params={
- 'type': u'package',
- 'slug': u'new',
- },
- status=200,
- )
- assert_equal(response.body, '{"valid": false}')
- assert_equal(response.headers['Content-Type'], 'application/json;charset=utf-8')
-
- def test_package_slug_valid(self):
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='is_slug_valid', ver=2)
-
- response = self.app.get(
- url,
- params={
- 'type': u'package',
- 'slug': u'A New Title * With & Funny CHARacters',
- },
- status=200,
- )
- assert_equal(response.body, '{"valid": true}')
- assert_equal(response.headers['Content-Type'], 'application/json;charset=utf-8')
-
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='is_slug_valid', ver=2)
-
- response = self.app.get(
- url,
- params={
- 'type': u'package',
- 'slug': u'warandpeace',
- },
- status=200,
- )
- assert_equal(response.body, '{"valid": false}')
- assert_equal(response.headers['Content-Type'], 'application/json;charset=utf-8')
-
- def test_markdown(self):
- markdown = '''##Title'''
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='markdown', ver=2)
-
- response = self.app.get(
- url,
- params={'q': markdown},
- status=200,
- )
- assert_equal(response.body, '"
Title
"')
-
def test_munge_package_name(self):
with self.app.flask_app.test_request_context():
@@ -127,24 +52,3 @@ def test_munge_tag(self):
status=200,
)
assert_equal(response.body, '"test-subject"')
-
- def test_status(self):
-
- with self.app.flask_app.test_request_context():
- url = url_for(controller='api', action='status', ver=2)
-
- response = self.app.get(
- url,
- params={},
- status=200,
- )
- res = json.loads(response.body)
- assert_equal(res['ckan_version'], __version__)
- assert_equal(res['site_url'], 'http://test.ckan.net')
- assert_equal(res['site_title'], 'CKAN')
- assert_equal(res['site_description'], '')
- assert_equal(res['locale_default'], 'en')
-
- assert_equal(type(res['extensions']), list)
- expected_extensions = set(('stats',))
- assert_equal(set(res['extensions']), expected_extensions)
diff --git a/ckan/tests/logic/action/test_get.py b/ckan/tests/logic/action/test_get.py
index 4aa1051edee..2cc2d18ad90 100644
--- a/ckan/tests/logic/action/test_get.py
+++ b/ckan/tests/logic/action/test_get.py
@@ -2,6 +2,7 @@
import nose.tools
+from ckan import __version__
import ckan.logic as logic
import ckan.plugins as p
import ckan.tests.helpers as helpers
@@ -2087,3 +2088,19 @@ def test_followee_list_with_q(self):
eq(len(followee_list), 1)
eq(followee_list[0]['display_name'], 'Environment')
+
+
+class TestStatusShow(helpers.FunctionalTestBase):
+
+ def test_status_show(self):
+
+ status = helpers.call_action(u'status_show')
+
+ eq(status[u'ckan_version'], __version__)
+ eq(status[u'site_url'], u'http://test.ckan.net')
+ eq(status[u'site_title'], u'CKAN')
+ eq(status[u'site_description'], u'')
+ eq(status[u'locale_default'], u'en')
+
+ eq(type(status[u'extensions']), list)
+ eq(status[u'extensions'], [u'stats'])
diff --git a/ckan/views/api.py b/ckan/views/api.py
index c6c5ce63179..ea123a9349a 100644
--- a/ckan/views/api.py
+++ b/ckan/views/api.py
@@ -3,7 +3,6 @@
import os
import cgi
import logging
-import urllib
from flask import Blueprint, make_response
from werkzeug.exceptions import BadRequest
@@ -563,9 +562,9 @@ def rest_delete(ver=API_REST_DEFAULT_VERSION, register=None, subregister=None,
return _finish(409, e.error_dict, content_type=u'json')
-def util_dataset_autocomplete():
- q = request.params.get(u'incomplete', u'')
- limit = request.params.get(u'limit', 10)
+def dataset_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'incomplete', u'')
+ limit = request.args.get(u'limit', 10)
package_dicts = []
if q:
context = {u'model': model, u'session': model.Session,
@@ -580,10 +579,9 @@ def util_dataset_autocomplete():
return _finish_ok(resultSet)
-def util_tag_autocomplete():
- q = request.str_params.get(u'incomplete', u'')
- q = unicode(urllib.unquote(q), u'utf-8')
- limit = request.params.get(u'limit', 10)
+def tag_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'incomplete', u'')
+ limit = request.args.get(u'limit', 10)
tag_names = []
if q:
context = {u'model': model, u'session': model.Session,
@@ -601,9 +599,9 @@ def util_tag_autocomplete():
return _finish_ok(resultSet)
-def util_format_autocomplete():
- q = request.params.get(u'incomplete', u'')
- limit = request.params.get(u'limit', 5)
+def format_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'incomplete', u'')
+ limit = request.args.get(u'limit', 5)
formats = []
if q:
context = {u'model': model, u'session': model.Session,
@@ -619,9 +617,9 @@ def util_format_autocomplete():
return _finish_ok(resultSet)
-def util_user_autocomplete():
- q = request.params.get(u'q', u'')
- limit = request.params.get(u'limit', 20)
+def user_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'q', u'')
+ limit = request.args.get(u'limit', 20)
user_list = []
if q:
context = {u'model': model, u'session': model.Session,
@@ -630,24 +628,24 @@ def util_user_autocomplete():
data_dict = {u'q': q, u'limit': limit}
user_list = get_action(u'user_autocomplete')(context, data_dict)
- return user_list
+ return _finish_ok(user_list)
-def util_group_autocomplete():
- q = request.params.get(u'q', u'')
- limit = request.params.get(u'limit', 20)
+def group_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'q', u'')
+ limit = request.args.get(u'limit', 20)
group_list = []
if q:
context = {u'user': g.user, u'model': model}
data_dict = {u'q': q, u'limit': limit}
group_list = get_action(u'group_autocomplete')(context, data_dict)
- return group_list
+ return _finish_ok(group_list)
-def util_organization_autocomplete():
- q = request.params.get(u'q', u'')
- limit = request.params.get(u'limit', 20)
+def organization_autocomplete(ver=API_REST_DEFAULT_VERSION):
+ q = request.args.get(u'q', u'')
+ limit = request.args.get(u'limit', 20)
organization_list = []
if q:
@@ -655,18 +653,17 @@ def util_organization_autocomplete():
data_dict = {u'q': q, u'limit': limit}
organization_list = get_action(
u'organization_autocomplete')(context, data_dict)
- return organization_list
+ return _finish_ok(organization_list)
-def util_i18n_js_translations(lang):
+def i18n_js_translations(lang, ver=API_REST_DEFAULT_VERSION):
ckan_path = os.path.join(os.path.dirname(__file__), u'..')
source = os.path.abspath(os.path.join(ckan_path, u'public',
u'base', u'i18n', u'{0}.js'.format(lang)))
- headers = {u'Content-Type': CONTENT_TYPES[u'json']}
if not os.path.exists(source):
return u'{}'
translations = open(source, u'r').read()
- return make_response((translations, 200, headers))
+ return _finish_ok(translations)
# Routing
@@ -704,7 +701,7 @@ def util_i18n_js_translations(lang):
u'activity',
]
-rest_version_rule = u'/'
+version_rule = u'/'
rest_root_rule = u'/rest/'.format(
allowed=u','.join(register_list))
rest_id_rule = rest_root_rule + u'/'
@@ -729,21 +726,21 @@ def util_i18n_js_translations(lang):
# number at the start (eg /api/rest/package and /api/rest/2/package)
for rule, view_func, methods in rest_rules:
api.add_url_rule(rule, view_func=view_func, methods=methods)
- api.add_url_rule(rest_version_rule + rule, view_func=view_func,
+ api.add_url_rule(version_rule + rule, view_func=view_func,
methods=methods)
# Util API
-api.add_url_rule(u'/util/dataset/autocomplete',
- view_func=util_dataset_autocomplete)
-api.add_url_rule(u'/util/user/autocomplete',
- view_func=util_user_autocomplete)
-api.add_url_rule(u'/util/tag/autocomplete',
- view_func=util_tag_autocomplete)
-api.add_url_rule(u'/util/group/autocomplete',
- view_func=util_group_autocomplete)
-api.add_url_rule(u'/util/organization/autocomplete',
- view_func=util_organization_autocomplete)
-api.add_url_rule(u'/util/resource/format_autocomplete',
- view_func=util_format_autocomplete)
-api.add_url_rule(u'/i18n/', view_func=util_i18n_js_translations)
+util_rules = [
+ (u'/util/dataset/autocomplete', dataset_autocomplete),
+ (u'/util/user/autocomplete', user_autocomplete),
+ (u'/util/tag/autocomplete', tag_autocomplete),
+ (u'/util/group/autocomplete', group_autocomplete),
+ (u'/util/organization/autocomplete', organization_autocomplete),
+ (u'/util/resource/format_autocomplete', format_autocomplete),
+ (u'/i18n/', i18n_js_translations),
+]
+
+for rule, view_func in util_rules:
+ api.add_url_rule(rule, view_func=view_func)
+ api.add_url_rule(version_rule + rule, view_func=view_func)