Skip to content

Commit

Permalink
controllers.api nicer imports
Browse files Browse the repository at this point in the history
  • Loading branch information
tobes committed Mar 6, 2012
1 parent aeadf51 commit e097dc5
Showing 1 changed file with 47 additions and 40 deletions.
87 changes: 47 additions & 40 deletions ckan/controllers/api.py
@@ -1,33 +1,41 @@
import logging
import cgi
import datetime
import glob

from pylons import c, request, response
from pylons.i18n import _, gettext
from paste.util.multidict import MultiDict
from webob.multidict import UnicodeMultiDict

from ckan.lib.base import BaseController, response, c, _, gettext, request
from ckan.lib.helpers import json, date_str_to_datetime
import ckan.model as model
import ckan.rating
from ckan.lib.search import (query_for, QueryOptions, SearchIndexError, SearchError,
SearchQueryError, DEFAULT_OPTIONS,
convert_legacy_parameters_to_solr)
from ckan.lib.navl.dictization_functions import DataError
from ckan.lib.munge import munge_name, munge_title_to_name, munge_tag
from ckan.logic import get_action, check_access
from ckan.logic import NotFound, NotAuthorized, ValidationError, ParameterError
from ckan.lib.jsonp import jsonpify
from ckan.forms.common import package_exists, group_exists
import ckan.model as model
import ckan.logic as logic
import ckan.lib.base as base
import ckan.lib.helpers as h
import ckan.lib.search as search
import ckan.lib.navl.dictization_functions
import ckan.lib.jsonp as jsonp
import ckan.lib.munge as munge
import ckan.forms.common as common


log = logging.getLogger(__name__)

# shortcuts
get_action = logic.get_action
NotAuthorized = logic.NotAuthorized
NotFound = logic.NotFound
ValidationError = logic.ValidationError
DataError = ckan.lib.navl.dictization_functions.DataError

IGNORE_FIELDS = ['q']
CONTENT_TYPES = {
'text': 'text/plain;charset=utf-8',
'html': 'text/html;charset=utf-8',
'json': 'application/json;charset=utf-8',
}
class ApiController(BaseController):
class ApiController(base.BaseController):

_actions = {}

Expand All @@ -43,7 +51,7 @@ def __call__(self, environ, start_response):
self._identify_user()
try:
context = {'model':model,'user': c.user or c.author}
check_access('site_read',context)
logic.check_access('site_read',context)
except NotAuthorized:
response_msg = self._finish(403, _('Not authorized to see this page'))
# Call start_response manually instead of the parent __call__
Expand All @@ -55,7 +63,7 @@ def __call__(self, environ, start_response):

# avoid status_code_redirect intercepting error responses
environ['pylons.status_code_redirect'] = True
return BaseController.__call__(self, environ, start_response)
return base.BaseController.__call__(self, environ, start_response)

def _finish(self, status_int, response_data=None,
content_type='text'):
Expand All @@ -71,7 +79,7 @@ def _finish(self, status_int, response_data=None,
if response_data is not None:
response.headers['Content-Type'] = CONTENT_TYPES[content_type]
if content_type == 'json':
response_msg = json.dumps(response_data)
response_msg = h.json.dumps(response_data)
else:
response_msg = response_data
# Support "JSONP" callback.
Expand Down Expand Up @@ -186,19 +194,19 @@ def action(self, logic_function, ver=None):
return_dict['success'] = False
log.error('Validation error: %r' % str(e.error_dict))
return self._finish(409, return_dict, content_type='json')
except ParameterError, e:
except logic.ParameterError, e:
return_dict['error'] = {'__type': 'Parameter Error',
'message': '%s: %s' % \
(_('Parameter Error'), e.extra_msg)}
return_dict['success'] = False
log.error('Parameter error: %r' % e.extra_msg)
return self._finish(409, return_dict, content_type='json')
except SearchQueryError, e:
except search.SearchQueryError, e:
return_dict['error'] = {'__type': 'Search Query Error',
'message': 'Search Query is invalid: %r' % e.args }
return_dict['success'] = False
return self._finish(400, return_dict, content_type='json')
except SearchError, e:
except search.SearchError, e:
return_dict['error'] = {'__type': 'Search Error',
'message': 'Search error: %r' % e.args }
return_dict['success'] = False
Expand Down Expand Up @@ -329,7 +337,7 @@ def create(self, ver=None, register=None, subregister=None, id=None, id2=None):
#TODO make better error message
return self._finish(400, _(u'Integrity Error') + \
': %s - %s' % (e.error, request_data))
except SearchIndexError:
except search.SearchIndexError:
log.error('Unable to add package to search index: %s' % request_data)
return self._finish(500, _(u'Unable to add package to search index') % request_data)
except:
Expand Down Expand Up @@ -377,7 +385,7 @@ def update(self, ver=None, register=None, subregister=None, id=None, id2=None):
#TODO make better error message
return self._finish(400, _(u'Integrity Error') + \
': %s - %s' % (e.error, request_data))
except SearchIndexError:
except search.SearchIndexError:
log.error('Unable to update search index: %s' % request_data)
return self._finish(500, _(u'Unable to update search index') % request_data)

Expand Down Expand Up @@ -432,7 +440,7 @@ def search(self, ver=None, register=None):
elif request.params.has_key('since_time'):
since_time_str = request.params['since_time']
try:
since_time = date_str_to_datetime(since_time_str)
since_time = h.date_str_to_datetime(since_time_str)
except ValueError, inst:
return self._finish_bad_request('ValueError: %s' % inst)
else:
Expand All @@ -454,12 +462,12 @@ def search(self, ver=None, register=None):

try:
if register == 'resource':
query = query_for(model.Resource)
query = search.query_for(model.Resource)

# resource search still uses ckan query parser
options = QueryOptions()
options = search.QueryOptions()
for k, v in params.items():
if (k in DEFAULT_OPTIONS.keys()):
if (k in search.DEFAULT_OPTIONS.keys()):
options[k] = v
options.update(params)
options.username = c.user
Expand All @@ -468,7 +476,7 @@ def search(self, ver=None, register=None):
query_fields = MultiDict()
for field, value in params.items():
field = field.strip()
if field in DEFAULT_OPTIONS.keys() or \
if field in search.DEFAULT_OPTIONS.keys() or \
field in IGNORE_FIELDS:
continue
values = [value]
Expand All @@ -485,11 +493,11 @@ def search(self, ver=None, register=None):
# parameters straight to Solr.
if ver in [1, 2]:
# Otherwise, put all unrecognised ones into the q parameter
params = convert_legacy_parameters_to_solr(params)
query = query_for(model.Package)
params = search.convert_legacy_parameters_to_solr(params)
query = search.query_for(model.Package)
results = query.run(params)
return self._finish_ok(results)
except SearchError, e:
except search.SearchError, e:
log.exception(e)
return self._finish_bad_request(
gettext('Bad search option: %s') % e)
Expand All @@ -501,14 +509,14 @@ def search(self, ver=None, register=None):
def _get_search_params(cls, request_params):
if request_params.has_key('qjson'):
try:
params = json.loads(request_params['qjson'], encoding='utf8')
params = h.json.loads(request_params['qjson'], encoding='utf8')
except ValueError, e:
raise ValueError, gettext('Malformed qjson value') + ': %r' % e
elif len(request_params) == 1 and \
len(request_params.values()[0]) < 2 and \
request_params.keys()[0].startswith('{'):
# e.g. {some-json}='1' or {some-json}=''
params = json.loads(request_params.keys()[0], encoding='utf8')
params = h.json.loads(request_params.keys()[0], encoding='utf8')
else:
params = request_params
if not isinstance(params, (UnicodeMultiDict, dict)):
Expand Down Expand Up @@ -545,7 +553,6 @@ def _calc_throughput(self, ver=None):
period = 10 # Seconds.
timing_cache_path = self._get_timing_cache_path()
call_count = 0
import datetime, glob
for t in range(0, period):
expr = '%s/%s*' % (
timing_cache_path,
Expand All @@ -555,7 +562,7 @@ def _calc_throughput(self, ver=None):
# Todo: Clear old records.
return float(call_count) / period

@jsonpify
@jsonp.jsonpify
def user_autocomplete(self):
q = request.params.get('q', '')
limit = request.params.get('limit', 20)
Expand All @@ -569,7 +576,7 @@ def user_autocomplete(self):
user_list = get_action('user_autocomplete')(context,data_dict)
return user_list

@jsonpify
@jsonp.jsonpify
def group_autocomplete(self):
q = request.params.get('q', '')
t = request.params.get('type', None)
Expand All @@ -591,7 +598,7 @@ def convert_to_dict(user):
return out


@jsonpify
@jsonp.jsonpify
def authorizationgroup_autocomplete(self):
q = request.params.get('q', '')
limit = request.params.get('limit', 20)
Expand All @@ -615,10 +622,10 @@ def is_slug_valid(self):
slug = request.params.get('slug') or ''
slugtype = request.params.get('type') or ''
if slugtype==u'package':
response_data = dict(valid=not bool(package_exists(slug)))
response_data = dict(valid=not bool(common.package_exists(slug)))
return self._finish_ok(response_data)
if slugtype==u'group':
response_data = dict(valid=not bool(group_exists(slug)))
response_data = dict(valid=not bool(common.group_exists(slug)))
return self._finish_ok(response_data)
return self._finish_bad_request('Bad slug type: %s' % slugtype)

Expand Down Expand Up @@ -676,17 +683,17 @@ def format_autocomplete(self):

def munge_package_name(self):
name = request.params.get('name')
munged_name = munge_name(name)
munged_name = munge.munge_name(name)
return self._finish_ok(munged_name)

def munge_title_to_package_name(self):
name = request.params.get('title') or request.params.get('name')
munged_name = munge_title_to_name(name)
munged_name = munge.munge_title_to_name(name)
return self._finish_ok(munged_name)

def munge_tag(self):
tag = request.params.get('tag') or request.params.get('name')
munged_tag = munge_tag(tag)
munged_tag = munge.munge_tag(tag)
return self._finish_ok(munged_tag)

def status(self):
Expand Down

0 comments on commit e097dc5

Please sign in to comment.