diff --git a/ckan/config/environment.py b/ckan/config/environment.py index 1b0151e11b1..897c3321cb6 100644 --- a/ckan/config/environment.py +++ b/ckan/config/environment.py @@ -9,7 +9,6 @@ from paste.deploy.converters import asbool import sqlalchemy from pylons import config -from pylons.i18n import _, ungettext from genshi.template import TemplateLoader from genshi.filters.i18n import Translator @@ -18,10 +17,12 @@ import ckan.plugins as p import ckan.lib.helpers as h import ckan.lib.app_globals as app_globals +import ckan.lib.jinja_extensions as jinja_extensions + +from ckan.common import _, ungettext log = logging.getLogger(__name__) -import lib.jinja_extensions # Suppress benign warning 'Unbuilt egg for setuptools' warnings.simplefilter('ignore', UserWarning) @@ -297,22 +298,22 @@ def genshi_lookup_attr(cls, obj, key): # Create Jinja2 environment - env = lib.jinja_extensions.Environment( - loader=lib.jinja_extensions.CkanFileSystemLoader(template_paths), + env = jinja_extensions.Environment( + loader=jinja_extensions.CkanFileSystemLoader(template_paths), autoescape=True, extensions=['jinja2.ext.do', 'jinja2.ext.with_', - lib.jinja_extensions.SnippetExtension, - lib.jinja_extensions.CkanExtend, - lib.jinja_extensions.CkanInternationalizationExtension, - lib.jinja_extensions.LinkForExtension, - lib.jinja_extensions.ResourceExtension, - lib.jinja_extensions.UrlForStaticExtension, - lib.jinja_extensions.UrlForExtension] + jinja_extensions.SnippetExtension, + jinja_extensions.CkanExtend, + jinja_extensions.CkanInternationalizationExtension, + jinja_extensions.LinkForExtension, + jinja_extensions.ResourceExtension, + jinja_extensions.UrlForStaticExtension, + jinja_extensions.UrlForExtension] ) env.install_gettext_callables(_, ungettext, newstyle=True) # custom filters - env.filters['empty_and_escape'] = lib.jinja_extensions.empty_and_escape - env.filters['truncate'] = lib.jinja_extensions.truncate + env.filters['empty_and_escape'] = jinja_extensions.empty_and_escape + env.filters['truncate'] = jinja_extensions.truncate config['pylons.app_globals'].jinja_env = env # CONFIGURATION OPTIONS HERE (note: all config options will override diff --git a/ckan/controllers/api.py b/ckan/controllers/api.py index ee1f34f6ebd..4455e204dae 100644 --- a/ckan/controllers/api.py +++ b/ckan/controllers/api.py @@ -5,12 +5,9 @@ import glob import urllib -from pylons import c, request, response -from pylons.i18n import _, gettext -from paste.util.multidict import MultiDict from webob.multidict import UnicodeMultiDict +from paste.util.multidict import MultiDict -import ckan.rating import ckan.model as model import ckan.logic as logic import ckan.lib.base as base @@ -20,6 +17,8 @@ import ckan.lib.jsonp as jsonp import ckan.lib.munge as munge +from ckan.common import _, c, request, response + log = logging.getLogger(__name__) @@ -159,7 +158,7 @@ def action(self, logic_function, ver=None): except KeyError: log.error('Can\'t find logic function: %s' % logic_function) return self._finish_bad_request( - gettext('Action name not known: %s') % str(logic_function)) + _('Action name not known: %s') % str(logic_function)) context = {'model': model, 'session': model.Session, 'user': c.user, 'api_version': ver} @@ -172,12 +171,12 @@ def action(self, logic_function, ver=None): except ValueError, inst: log.error('Bad request data: %s' % str(inst)) return self._finish_bad_request( - gettext('JSON Error: %s') % str(inst)) + _('JSON Error: %s') % str(inst)) if not isinstance(request_data, dict): # this occurs if request_data is blank log.error('Bad request data - not dict: %r' % request_data) return self._finish_bad_request( - gettext('Bad request data: %s') % + _('Bad request data: %s') % 'Request data JSON decoded to %r but ' 'it needs to be a dictionary.' % request_data) try: @@ -265,7 +264,7 @@ def list(self, ver=None, register=None, subregister=None, id=None): action = self._get_action_from_map(action_map, register, subregister) if not action: return self._finish_bad_request( - gettext('Cannot list entity of this type: %s') % register) + _('Cannot list entity of this type: %s') % register) try: return self._finish_ok(action(context, {'id': id})) except NotFound, e: @@ -296,7 +295,7 @@ def show(self, ver=None, register=None, subregister=None, action = self._get_action_from_map(action_map, register, subregister) if not action: return self._finish_bad_request( - gettext('Cannot read entity of this type: %s') % register) + _('Cannot read entity of this type: %s') % register) try: return self._finish_ok(action(context, data_dict)) except NotFound, e: @@ -331,12 +330,12 @@ def create(self, ver=None, register=None, subregister=None, data_dict.update(request_data) except ValueError, inst: return self._finish_bad_request( - gettext('JSON Error: %s') % str(inst)) + _('JSON Error: %s') % str(inst)) action = self._get_action_from_map(action_map, register, subregister) if not action: return self._finish_bad_request( - gettext('Cannot create new entity of this type: %s %s') % + _('Cannot create new entity of this type: %s %s') % (register, subregister)) try: @@ -390,12 +389,12 @@ def update(self, ver=None, register=None, subregister=None, data_dict.update(request_data) except ValueError, inst: return self._finish_bad_request( - gettext('JSON Error: %s') % str(inst)) + _('JSON Error: %s') % str(inst)) action = self._get_action_from_map(action_map, register, subregister) if not action: return self._finish_bad_request( - gettext('Cannot update entity of this type: %s') % + _('Cannot update entity of this type: %s') % register.encode('utf-8')) try: response_data = action(context, data_dict) @@ -439,7 +438,7 @@ def delete(self, ver=None, register=None, subregister=None, action = self._get_action_from_map(action_map, register, subregister) if not action: return self._finish_bad_request( - gettext('Cannot delete entity of this type: %s %s') % + _('Cannot delete entity of this type: %s %s') % (register, subregister or '')) try: response_data = action(context, data_dict) @@ -462,11 +461,11 @@ def search(self, ver=None, register=None): id = request.params['since_id'] if not id: return self._finish_bad_request( - gettext(u'No revision specified')) + _(u'No revision specified')) rev = model.Session.query(model.Revision).get(id) if rev is None: return self._finish_not_found( - gettext(u'There is no revision with id: %s') % id) + _(u'There is no revision with id: %s') % id) since_time = rev.timestamp elif 'since_time' in request.params: since_time_str = request.params['since_time'] @@ -476,7 +475,7 @@ def search(self, ver=None, register=None): return self._finish_bad_request('ValueError: %s' % inst) else: return self._finish_bad_request( - gettext("Missing search term ('since_id=UUID' or " + + _("Missing search term ('since_id=UUID' or " + " 'since_time=TIMESTAMP')")) revs = model.Session.query(model.Revision).\ filter(model.Revision.timestamp > since_time) @@ -486,7 +485,7 @@ def search(self, ver=None, register=None): params = MultiDict(self._get_search_params(request.params)) except ValueError, e: return self._finish_bad_request( - gettext('Could not read parameters: %r' % e)) + _('Could not read parameters: %r' % e)) # if using API v2, default to returning the package ID if # no field list is specified @@ -543,10 +542,10 @@ def search(self, ver=None, register=None): except search.SearchError, e: log.exception(e) return self._finish_bad_request( - gettext('Bad search option: %s') % e) + _('Bad search option: %s') % e) else: return self._finish_not_found( - gettext('Unknown register: %s') % register) + _('Unknown register: %s') % register) @classmethod def _get_search_params(cls, request_params): @@ -555,7 +554,7 @@ def _get_search_params(cls, request_params): qjson_param = request_params['qjson'].replace('\\\\u', '\\u') params = h.json.loads(qjson_param, encoding='utf8') except ValueError, e: - raise ValueError(gettext('Malformed qjson value') + ': %r' + raise ValueError(_('Malformed qjson value: %r') % e) elif len(request_params) == 1 and \ len(request_params.values()[0]) < 2 and \ diff --git a/ckan/controllers/feed.py b/ckan/controllers/feed.py index e1ea58fa511..c22aa1080c7 100644 --- a/ckan/controllers/feed.py +++ b/ckan/controllers/feed.py @@ -21,16 +21,17 @@ # TODO fix imports import logging import urlparse +from urllib import urlencode import webhelpers.feedgenerator from pylons import config -from pylons.i18n import _ -from urllib import urlencode -from ckan import model -from ckan.lib.base import BaseController, c, request, response, json, abort, g +import ckan.model as model +import ckan.lib.base as base import ckan.lib.helpers as h -from ckan.logic import get_action, NotFound +import ckan.logic as logic + +from ckan.common import _, g, c, request, response, json # TODO make the item list configurable ITEMS_LIMIT = 20 @@ -55,7 +56,7 @@ def _package_search(data_dict): data_dict['rows'] = ITEMS_LIMIT # package_search action modifies the data_dict, so keep our copy intact. - query = get_action('package_search')(context, data_dict.copy()) + query = logic.get_action('package_search')(context, data_dict.copy()) return query['count'], query['results'] @@ -151,7 +152,7 @@ def _create_atom_id(resource_path, authority_name=None, date_string=None): return ':'.join(['tag', tagging_entity, resource_path]) -class FeedController(BaseController): +class FeedController(base.BaseController): base_url = config.get('ckan.site_url') def _alternate_url(self, params, **kwargs): @@ -170,9 +171,9 @@ def group(self, id): try: context = {'model': model, 'session': model.Session, 'user': c.user or c.author} - group_dict = get_action('group_show')(context, {'id': id}) - except NotFound: - abort(404, _('Group not found')) + group_dict = logic.get_action('group_show')(context, {'id': id}) + except logic.NotFound: + base.abort(404, _('Group not found')) data_dict, params = self._parse_url_params() data_dict['fq'] = 'groups:"%s"' % id @@ -281,9 +282,9 @@ def custom(self): try: page = int(request.params.get('page', 1)) except ValueError: - abort(400, _('"page" parameter must be a positive integer')) + base.abort(400, _('"page" parameter must be a positive integer')) if page < 0: - abort(400, _('"page" parameter must be a positive integer')) + base.abort(400, _('"page" parameter must be a positive integer')) limit = ITEMS_LIMIT data_dict = { @@ -433,9 +434,9 @@ def _parse_url_params(self): try: page = int(request.params.get('page', 1)) or 1 except ValueError: - abort(400, _('"page" parameter must be a positive integer')) + base.abort(400, _('"page" parameter must be a positive integer')) if page < 0: - abort(400, _('"page" parameter must be a positive integer')) + base.abort(400, _('"page" parameter must be a positive integer')) limit = ITEMS_LIMIT data_dict = { diff --git a/ckan/controllers/home.py b/ckan/controllers/home.py index 7a9fe062a0d..2c55cd4fc9e 100644 --- a/ckan/controllers/home.py +++ b/ckan/controllers/home.py @@ -1,5 +1,4 @@ -from pylons.i18n import _ -from pylons import g, c, config, cache +from pylons import config, cache import sqlalchemy.exc import ckan.logic as logic @@ -9,6 +8,8 @@ import ckan.model as model import ckan.lib.helpers as h +from ckan.common import _, g, c + CACHE_PARAMETERS = ['__cache', '__no_cache__'] # horrible hack diff --git a/ckan/controllers/related.py b/ckan/controllers/related.py index 68a68c8c1d1..690f82faee2 100644 --- a/ckan/controllers/related.py +++ b/ckan/controllers/related.py @@ -1,15 +1,14 @@ +import urllib + 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.navl.dictization_functions as df -import pylons.i18n as i18n +from ckan.common import _, c -_ = i18n._ -import urllib -c = base.c abort = base.abort _get_action = logic.get_action diff --git a/ckan/controllers/revision.py b/ckan/controllers/revision.py index 32809602cc3..bbfb2c4b610 100644 --- a/ckan/controllers/revision.py +++ b/ckan/controllers/revision.py @@ -1,14 +1,14 @@ from datetime import datetime, timedelta -from pylons.i18n import get_lang, _ -from pylons import c, request - -from ckan.logic import NotAuthorized, check_access +from pylons.i18n import get_lang +import ckan.logic as logic import ckan.lib.base as base import ckan.model as model import ckan.lib.helpers as h +from ckan.common import _, c, request + class RevisionController(base.BaseController): @@ -18,15 +18,15 @@ def __before__(self, action, **env): context = {'model': model, 'user': c.user or c.author} if c.user: try: - check_access('revision_change_state', context) + logic.check_access('revision_change_state', context) c.revision_change_state_allowed = True - except NotAuthorized: + except logic.NotAuthorized: c.revision_change_state_allowed = False else: c.revision_change_state_allowed = False try: - check_access('site_read', context) - except NotAuthorized: + logic.check_access('site_read', context) + except logic.NotAuthorized: base.abort(401, _('Not authorized to see this page')) def index(self): diff --git a/ckan/controllers/tag.py b/ckan/controllers/tag.py index 699d31fceb3..631a8523f98 100644 --- a/ckan/controllers/tag.py +++ b/ckan/controllers/tag.py @@ -1,11 +1,12 @@ -from pylons.i18n import _ -from pylons import request, c, config +from pylons import config import ckan.logic as logic import ckan.model as model import ckan.lib.base as base import ckan.lib.helpers as h +from ckan.common import _, request, c + LIMIT = 25 diff --git a/ckan/controllers/user.py b/ckan/controllers/user.py index d79d68a64e8..6bebf4e9b8e 100644 --- a/ckan/controllers/user.py +++ b/ckan/controllers/user.py @@ -1,8 +1,7 @@ import logging from urllib import quote -from pylons import session, c, g, request, config -from pylons.i18n import _ +from pylons import config import genshi import ckan.lib.i18n as i18n @@ -17,6 +16,8 @@ import ckan.lib.mailer as mailer import ckan.lib.navl.dictization_functions as dictization_functions +from ckan.common import _, session, c, g, request + log = logging.getLogger(__name__) diff --git a/ckan/lib/activity_streams.py b/ckan/lib/activity_streams.py index fa1a7f04e87..6c4908a5ff2 100644 --- a/ckan/lib/activity_streams.py +++ b/ckan/lib/activity_streams.py @@ -1,13 +1,13 @@ import re -import datetime -from pylons.i18n import _ from webhelpers.html import literal import ckan.lib.helpers as h import ckan.lib.base as base import ckan.logic as logic +from ckan.common import _ + # get_snippet_*() functions replace placeholders like {user}, {dataset}, etc. # in activity strings with HTML representations of particular users, datasets, # etc. diff --git a/ckan/lib/alphabet_paginate.py b/ckan/lib/alphabet_paginate.py index b75bf27e83b..5bffd70594b 100644 --- a/ckan/lib/alphabet_paginate.py +++ b/ckan/lib/alphabet_paginate.py @@ -15,12 +15,13 @@ ''' from itertools import dropwhile import re + from sqlalchemy import __version__ as sqav from sqlalchemy.orm.query import Query -from pylons.i18n import _ from webhelpers.html.builder import HTML from routes import url_for + class AlphaPage(object): def __init__(self, collection, alpha_attribute, page, other_text, paging_threshold=50, controller_name='tag'): diff --git a/ckan/lib/base.py b/ckan/lib/base.py index 7f944a3393b..c72f09f09db 100644 --- a/ckan/lib/base.py +++ b/ckan/lib/base.py @@ -6,12 +6,12 @@ import time from paste.deploy.converters import asbool -from pylons import c, cache, config, g, request, response, session +from pylons import cache, config, session from pylons.controllers import WSGIController from pylons.controllers.util import abort as _abort from pylons.controllers.util import redirect_to, redirect from pylons.decorators import jsonify, validate -from pylons.i18n import _, ungettext, N_, gettext, ngettext +from pylons.i18n import N_, gettext, ngettext from pylons.templating import cached_template, pylons_globals from genshi.template import MarkupTemplate from genshi.template.text import NewTextTemplate @@ -25,7 +25,11 @@ import ckan.lib.app_globals as app_globals from ckan.plugins import PluginImplementations, IGenshiStreamFilter import ckan.model as model -from ckan.common import json + +# These imports are for legacy usages and will be removed soon these should +# be imported directly from ckan.common for internal ckan code and via the +# plugins.toolkit for extensions. +from ckan.common import json, _, ungettext, c, g, request, response log = logging.getLogger(__name__) diff --git a/ckan/lib/email_notifications.py b/ckan/lib/email_notifications.py index 20ae39b6ebf..9b12fcdd082 100644 --- a/ckan/lib/email_notifications.py +++ b/ckan/lib/email_notifications.py @@ -8,12 +8,13 @@ import re import pylons -import pylons.i18n import ckan.model as model import ckan.logic as logic import ckan.lib.base as base +from ckan.common import ungettext + def string_to_timedelta(s): '''Parse a string s and return a standard datetime.timedelta object. @@ -96,7 +97,7 @@ def _notifications_for_activities(activities, user_dict): # say something about the contents of the activities, or single out # certain types of activity to be sent in their own individual emails, # etc. - subject = pylons.i18n.ungettext( + subject = ungettext( "1 new activity from {site_title}", "{n} new activities from {site_title}", len(activities)).format( diff --git a/ckan/lib/formatters.py b/ckan/lib/formatters.py index 9c8b656987a..5e3d51f7c6d 100644 --- a/ckan/lib/formatters.py +++ b/ckan/lib/formatters.py @@ -1,10 +1,11 @@ import datetime -from pylons.i18n import _, ungettext from babel import numbers import ckan.lib.i18n as i18n +from ckan.common import _, ungettext + ################################################## # # diff --git a/ckan/lib/mailer.py b/ckan/lib/mailer.py index c83b4d8fa45..f0e1978ac2c 100644 --- a/ckan/lib/mailer.py +++ b/ckan/lib/mailer.py @@ -7,12 +7,15 @@ from email import Utils from urlparse import urljoin -from pylons.i18n.translation import _ -from pylons import config, g -from ckan import model, __version__ -import ckan.lib.helpers as h +from pylons import config import paste.deploy.converters +import ckan +import ckan.model as model +import ckan.lib.helpers as h + +from ckan.common import _, g + log = logging.getLogger(__name__) class MailerException(Exception): @@ -36,7 +39,7 @@ def _mail_recipient(recipient_name, recipient_email, recipient = u"%s <%s>" % (recipient_name, recipient_email) msg['To'] = Header(recipient, 'utf-8') msg['Date'] = Utils.formatdate(time()) - msg['X-Mailer'] = "CKAN %s" % __version__ + msg['X-Mailer'] = "CKAN %s" % ckan.__version__ # Send the email using Python's smtplib. smtp_connection = smtplib.SMTP() diff --git a/ckan/lib/navl/dictization_functions.py b/ckan/lib/navl/dictization_functions.py index da0908e2dcc..aa4e69b59aa 100644 --- a/ckan/lib/navl/dictization_functions.py +++ b/ckan/lib/navl/dictization_functions.py @@ -1,9 +1,10 @@ import copy import formencode as fe import inspect -from pylons.i18n import _ from pylons import config +from ckan.common import _ + class Missing(object): def __unicode__(self): raise Invalid(_('Missing value')) diff --git a/ckan/lib/navl/validators.py b/ckan/lib/navl/validators.py index f72e2788617..01cbd87567f 100644 --- a/ckan/lib/navl/validators.py +++ b/ckan/lib/navl/validators.py @@ -1,5 +1,11 @@ -from dictization_functions import missing, StopOnError, Invalid -from pylons.i18n import _ +import ckan.lib.navl.dictization_functions as df + +from ckan.common import _ + +missing = df.missing +StopOnError = df.StopOnError +Invalid = df.Invalid + def identity_converter(key, data, errors, context): return diff --git a/ckan/logic/__init__.py b/ckan/logic/__init__.py index e21f222f50e..8f753c8ee5c 100644 --- a/ckan/logic/__init__.py +++ b/ckan/logic/__init__.py @@ -3,14 +3,12 @@ import types import re -from pylons.i18n import _ - -import ckan.lib.base as base import ckan.model as model -from ckan.new_authz import is_authorized -from ckan.lib.navl.dictization_functions import flatten_dict, DataError -from ckan.plugins import PluginImplementations -from ckan.plugins.interfaces import IActions +import ckan.new_authz as new_authz +import ckan.lib.navl.dictization_functions as df +import ckan.plugins as p + +from ckan.common import _, c log = logging.getLogger(__name__) @@ -174,7 +172,7 @@ def tuplize_dict(data_dict): try: key_list[num] = int(key) except ValueError: - raise DataError('Bad key') + raise df.DataError('Bad key') tuplized_dict[tuple(key_list)] = value return tuplized_dict @@ -190,7 +188,7 @@ def untuplize_dict(tuplized_dict): def flatten_to_string_key(dict): - flattented = flatten_dict(dict) + flattented = df.flatten_dict(dict) return untuplize_dict(flattented) @@ -205,7 +203,7 @@ def check_access(action, context, data_dict=None): # # TODO Check the API key is valid at some point too! # log.debug('Valid API key needed to make changes') # raise NotAuthorized - logic_authorization = is_authorized(action, context, data_dict) + logic_authorization = new_authz.is_authorized(action, context, data_dict) if not logic_authorization['success']: msg = logic_authorization.get('msg', '') raise NotAuthorized(msg) @@ -290,7 +288,7 @@ def get_action(action): # Then overwrite them with any specific ones in the plugins: resolved_action_plugins = {} fetched_actions = {} - for plugin in PluginImplementations(IActions): + for plugin in p.PluginImplementations(p.IActions): for name, auth_function in plugin.get_actions().items(): if name in resolved_action_plugins: raise Exception( @@ -317,7 +315,7 @@ def wrapped(context=None, data_dict=None, **kw): context.setdefault('model', model) context.setdefault('session', model.Session) try: - context.setdefault('user', base.c.user or base.c.author) + context.setdefault('user', c.user or c.author) except TypeError: # c not registered pass diff --git a/ckan/logic/action/create.py b/ckan/logic/action/create.py index f7d0913587f..feda4802cb1 100644 --- a/ckan/logic/action/create.py +++ b/ckan/logic/action/create.py @@ -1,9 +1,8 @@ import logging + from pylons import config -from pylons.i18n import _ from paste.deploy.converters import asbool -import ckan.new_authz as new_authz import ckan.lib.plugins as lib_plugins import ckan.logic as logic import ckan.rating as ratings @@ -15,6 +14,8 @@ import ckan.lib.dictization.model_save as model_save import ckan.lib.navl.dictization_functions +from ckan.common import _ + # FIXME this looks nasty and should be shared better from ckan.logic.action.update import _update_package_relationship diff --git a/ckan/logic/action/delete.py b/ckan/logic/action/delete.py index 8c4a7dd8cde..5dcaf88ab9b 100644 --- a/ckan/logic/action/delete.py +++ b/ckan/logic/action/delete.py @@ -1,9 +1,11 @@ -from pylons.i18n import _ import ckan.logic import ckan.logic.action import ckan.plugins as plugins import ckan.lib.dictization.model_dictize as model_dictize + +from ckan.common import _ + validate = ckan.lib.navl.dictization_functions.validate # Define some shortcuts diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index b9d9bda56c7..be5470830c4 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -4,8 +4,6 @@ import datetime from pylons import config -from pylons.i18n import _ -from pylons import c import sqlalchemy import ckan.lib.dictization @@ -21,6 +19,8 @@ import ckan.lib.activity_streams as activity_streams import ckan.new_authz as new_authz +from ckan.common import _ + log = logging.getLogger('ckan.logic') # Define some shortcuts diff --git a/ckan/logic/action/update.py b/ckan/logic/action/update.py index d53a503ad41..d59365f7cc5 100644 --- a/ckan/logic/action/update.py +++ b/ckan/logic/action/update.py @@ -2,24 +2,24 @@ import datetime import json -import pylons -from pylons.i18n import _ from pylons import config from vdm.sqlalchemy.base import SQLAlchemySession -import paste.deploy.converters +import paste.deploy.converters as converters import ckan.plugins as plugins import ckan.logic as logic -import ckan.logic.schema -import ckan.lib.dictization +import ckan.logic.schema as schema_ +import ckan.lib.dictization as dictization import ckan.lib.dictization.model_dictize as model_dictize import ckan.lib.dictization.model_save as model_save import ckan.lib.navl.dictization_functions import ckan.lib.navl.validators as validators import ckan.lib.plugins as lib_plugins -import ckan.lib.email_notifications +import ckan.lib.email_notifications as email_notifications import ckan.lib.search as search +from ckan.common import _, request + log = logging.getLogger(__name__) # Define some shortcuts @@ -130,7 +130,7 @@ def related_update(context, data_dict): user = context['user'] id = _get_or_bust(data_dict, "id") - schema = context.get('schema') or ckan.logic.schema.default_related_schema() + schema = context.get('schema') or schema_.default_related_schema() related = model.Related.get(id) context["related"] = related @@ -170,7 +170,7 @@ def resource_update(context, data_dict): model = context['model'] user = context['user'] id = _get_or_bust(data_dict, "id") - schema = context.get('schema') or ckan.logic.schema.default_update_resource_schema() + schema = context.get('schema') or schema_.default_update_resource_schema() resource = model.Resource.get(id) context["resource"] = resource @@ -343,7 +343,7 @@ def package_relationship_update(context, data_dict): ''' model = context['model'] - schema = context.get('schema') or ckan.logic.schema.default_update_relationship_schema() + schema = context.get('schema') or schema_.default_update_relationship_schema() id, id2, rel = _get_or_bust(data_dict, ['subject', 'object', 'type']) @@ -424,7 +424,7 @@ def _group_or_org_update(context, data_dict, is_org=False): # when editing an org we do not want to update the packages if using the # new templates. if ((not is_org) - and not paste.deploy.converters.asbool( + and not converters.asbool( config.get('ckan.legacy_templates', False)) and 'api_version' not in context): context['prevent_packages_update'] = True @@ -481,7 +481,7 @@ def _group_or_org_update(context, data_dict, is_org=False): activity_dict['activity_type'] = 'deleted group' if activity_dict is not None: activity_dict['data'] = { - 'group': ckan.lib.dictization.table_dictize(group, context) + 'group': dictization.table_dictize(group, context) } activity_create_context = { 'model': model, @@ -552,7 +552,7 @@ def user_update(context, data_dict): model = context['model'] user = context['user'] session = context['session'] - schema = context.get('schema') or ckan.logic.schema.default_update_user_schema() + schema = context.get('schema') or schema_.default_update_user_schema() id = _get_or_bust(data_dict, 'id') user_obj = model.User.get(id) @@ -620,7 +620,7 @@ def task_status_update(context, data_dict): user = context['user'] id = data_dict.get("id") - schema = context.get('schema') or ckan.logic.schema.default_task_status_schema() + schema = context.get('schema') or schema_.default_task_status_schema() if id: task_status = model.TaskStatus.get(id) @@ -830,7 +830,7 @@ def vocabulary_update(context, data_dict): _check_access('vocabulary_update', context, data_dict) - schema = context.get('schema') or ckan.logic.schema.default_update_vocabulary_schema() + schema = context.get('schema') or schema_.default_update_vocabulary_schema() data, errors = _validate(data_dict, schema, context) if errors: model.Session.rollback() @@ -989,15 +989,15 @@ def send_email_notifications(context, data_dict): # If paste.command_request is True then this function has been called # by a `paster post ...` command not a real HTTP request, so skip the # authorization. - if not pylons.request.environ.get('paste.command_request'): + if not request.environ.get('paste.command_request'): _check_access('send_email_notifications', context, data_dict) - if not paste.deploy.converters.asbool( - pylons.config.get('ckan.activity_streams_email_notifications')): + if not converters.asbool( + config.get('ckan.activity_streams_email_notifications')): raise logic.ParameterError('ckan.activity_streams_email_notifications' ' is not enabled in config') - ckan.lib.email_notifications.get_and_send_notifications_for_all_users() + email_notifications.get_and_send_notifications_for_all_users() def package_owner_org_update(context, data_dict): diff --git a/ckan/logic/auth/create.py b/ckan/logic/auth/create.py index 64d5cc3e150..1baf9b61077 100644 --- a/ckan/logic/auth/create.py +++ b/ckan/logic/auth/create.py @@ -1,8 +1,8 @@ -from pylons.i18n import _ - import ckan.logic as logic import ckan.new_authz as new_authz +from ckan.common import _ + def package_create(context, data_dict=None): user = context['user'] diff --git a/ckan/logic/converters.py b/ckan/logic/converters.py index a1270a59146..bc6e9fdf5e4 100644 --- a/ckan/logic/converters.py +++ b/ckan/logic/converters.py @@ -1,9 +1,9 @@ -from pylons.i18n import _ -from ckan import model -from ckan.lib.navl.dictization_functions import Invalid -from ckan.lib.field_types import DateType, DateConvertError -from ckan.logic.validators import tag_length_validator, tag_name_validator, \ - tag_in_vocabulary_validator +import ckan.model as model +import ckan.lib.navl.dictization_functions as df +import ckan.lib.field_types as field_types +import ckan.logic.validators as validators + +from ckan.common import _ def convert_to_extras(key, data, errors, context): extras = data.get(('extras',), []) @@ -20,16 +20,16 @@ def convert_from_extras(key, data, errors, context): def date_to_db(value, context): try: - value = DateType.form_to_db(value) - except DateConvertError, e: - raise Invalid(str(e)) + value = field_types.DateType.form_to_db(value) + except field_types.DateConvertError, e: + raise df.Invalid(str(e)) return value def date_to_form(value, context): try: - value = DateType.db_to_form(value) - except DateConvertError, e: - raise Invalid(str(e)) + value = field_types.DateType.db_to_form(value) + except field_types.DateConvertError, e: + raise df.Invalid(str(e)) return value def free_tags_only(key, data, errors, context): @@ -56,11 +56,11 @@ def callable(key, data, errors, context): v = model.Vocabulary.get(vocab) if not v: - raise Invalid(_('Tag vocabulary "%s" does not exist') % vocab) + raise df.Invalid(_('Tag vocabulary "%s" does not exist') % vocab) context['vocabulary'] = v for tag in new_tags: - tag_in_vocabulary_validator(tag, context) + validators.tag_in_vocabulary_validator(tag, context) for num, tag in enumerate(new_tags): data[('tags', num + n, 'name')] = tag @@ -71,7 +71,7 @@ def convert_from_tags(vocab): def callable(key, data, errors, context): v = model.Vocabulary.get(vocab) if not v: - raise Invalid(_('Tag vocabulary "%s" does not exist') % vocab) + raise df.Invalid(_('Tag vocabulary "%s" does not exist') % vocab) tags = [] for k in data.keys(): @@ -103,7 +103,7 @@ def convert_user_name_or_id_to_id(user_name_or_id, context): result = session.query(model.User).filter_by( name=user_name_or_id).first() if not result: - raise Invalid('%s: %s' % (_('Not found'), _('User'))) + raise df.Invalid('%s: %s' % (_('Not found'), _('User'))) return result.id def convert_package_name_or_id_to_id(package_name_or_id, context): @@ -128,7 +128,7 @@ def convert_package_name_or_id_to_id(package_name_or_id, context): result = session.query(model.Package).filter_by( name=package_name_or_id).first() if not result: - raise Invalid('%s: %s' % (_('Not found'), _('Dataset'))) + raise df.Invalid('%s: %s' % (_('Not found'), _('Dataset'))) return result.id def convert_group_name_or_id_to_id(group_name_or_id, context): @@ -153,5 +153,5 @@ def convert_group_name_or_id_to_id(group_name_or_id, context): result = session.query(model.Group).filter_by( name=group_name_or_id).first() if not result: - raise Invalid('%s: %s' % (_('Not found'), _('Group'))) + raise df.Invalid('%s: %s' % (_('Not found'), _('Group'))) return result.id diff --git a/ckan/logic/validators.py b/ckan/logic/validators.py index f521981fd0d..607494ade73 100644 --- a/ckan/logic/validators.py +++ b/ckan/logic/validators.py @@ -2,27 +2,32 @@ from itertools import count import re -from pylons.i18n import _ - -from ckan.lib.navl.dictization_functions import Invalid, StopOnError, Missing, missing, unflatten -from ckan.logic import check_access, NotAuthorized, NotFound +import ckan.lib.navl.dictization_functions as df +import ckan.logic as logic import ckan.lib.helpers as h from ckan.model import (MAX_TAG_LENGTH, MIN_TAG_LENGTH, PACKAGE_NAME_MIN_LENGTH, PACKAGE_NAME_MAX_LENGTH, PACKAGE_VERSION_MAX_LENGTH, VOCABULARY_NAME_MAX_LENGTH, VOCABULARY_NAME_MIN_LENGTH) -import ckan.new_authz +import ckan.new_authz as new_authz + +from ckan.common import _ + +Invalid = df.Invalid +StopOnError = df.StopOnError +Missing = df.Missing +missing = df.missing def owner_org_validator(key, data, errors, context): value = data.get(key) if value is missing or not value: - if not ckan.new_authz.check_config_permission('create_unowned_dataset'): + if not new_authz.check_config_permission('create_unowned_dataset'): raise Invalid(_('A organization must be supplied')) data.pop(key, None) - raise StopOnError + raise df.StopOnError model = context['model'] group = model.Group.get(value) @@ -303,7 +308,7 @@ def package_version_validator(value, context): def duplicate_extras_key(key, data, errors, context): - unflattened = unflatten(data) + unflattened = df.unflatten(data) extras = unflattened.get('extras', []) extras_keys = [] for extra in extras: @@ -394,16 +399,16 @@ def ignore_not_package_admin(key, data, errors, context): if 'ignore_auth' in context: return - if user and ckan.new_authz.is_sysadmin(user): + if user and new_authz.is_sysadmin(user): return authorized = False pkg = context.get('package') if pkg: try: - check_access('package_change_state',context) + logic.check_access('package_change_state',context) authorized = True - except NotAuthorized: + except logic.NotAuthorized: authorized = False if (user and pkg and authorized): @@ -421,16 +426,16 @@ def ignore_not_group_admin(key, data, errors, context): model = context['model'] user = context.get('user') - if user and ckan.new_authz.is_sysadmin(user): + if user and new_authz.is_sysadmin(user): return authorized = False group = context.get('group') if group: try: - check_access('group_change_state',context) + logic.check_access('group_change_state',context) authorized = True - except NotAuthorized: + except logic.NotAuthorized: authorized = False if (user and group and authorized): @@ -592,6 +597,6 @@ def user_name_exists(user_name, context): def role_exists(role, context): - if role not in ckan.new_authz.ROLE_PERMISSIONS: + if role not in new_authz.ROLE_PERMISSIONS: raise Invalid(_('role does not exist.')) return role diff --git a/ckan/model/license.py b/ckan/model/license.py index 2a0b8e732e8..1b65d6040ec 100644 --- a/ckan/model/license.py +++ b/ckan/model/license.py @@ -1,10 +1,10 @@ import datetime import urllib2 import re -import simplejson as json from pylons import config -from pylons.i18n import _ + +from ckan.common import _, json class License(object): diff --git a/ckan/model/package_relationship.py b/ckan/model/package_relationship.py index 503fc45b654..3ee5cd49a7f 100644 --- a/ckan/model/package_relationship.py +++ b/ckan/model/package_relationship.py @@ -10,7 +10,7 @@ # i18n only works when this is run as part of pylons, # which isn't the case for paster commands. try: - from pylons.i18n import _ + from ckan.common import _ _('') except: def _(txt): diff --git a/ckan/plugins/toolkit.py b/ckan/plugins/toolkit.py index e011184fe56..25882e9395a 100644 --- a/ckan/plugins/toolkit.py +++ b/ckan/plugins/toolkit.py @@ -2,7 +2,6 @@ import os import re -import pylons import paste.deploy.converters as converters import webhelpers.html.tags @@ -74,6 +73,7 @@ def _initialize(self): import ckan.logic as logic import ckan.lib.cli as cli import ckan.lib.plugins as lib_plugins + import ckan.common as common # Allow class access to these modules self.__class__.ckan = ckan @@ -82,9 +82,9 @@ def _initialize(self): t = self._toolkit # imported functions - t['_'] = pylons.i18n._ - t['c'] = pylons.c - t['request'] = pylons.request + t['_'] = common._ + t['c'] = common.c + t['request'] = common.request t['render'] = base.render t['render_text'] = base.render_text t['asbool'] = converters.asbool diff --git a/ckan/tests/functional/test_home.py b/ckan/tests/functional/test_home.py index f69ca90d5da..248810b56ab 100644 --- a/ckan/tests/functional/test_home.py +++ b/ckan/tests/functional/test_home.py @@ -1,4 +1,3 @@ -from pylons import c, session from pylons.i18n import set_lang from ckan.lib.create_test_data import CreateTestData @@ -10,6 +9,8 @@ from ckan.tests.pylons_controller import PylonsTestCase from ckan.tests import search_related, setup_test_search_index +from ckan.common import c, session + class TestHomeController(TestController, PylonsTestCase, HtmlCheckMethods): @classmethod def setup_class(cls):