diff --git a/ckan/i18n/check_po_files.py b/ckan/i18n/check_po_files.py index a918087d232..10997f3fa3e 100755 --- a/ckan/i18n/check_po_files.py +++ b/ckan/i18n/check_po_files.py @@ -11,7 +11,6 @@ ''' import re -import polib import paste.script.command def simple_conv_specs(s): @@ -98,6 +97,8 @@ class CheckPoFiles(paste.script.command.Command): parser = paste.script.command.Command.standard_parser(verbose=True) def command(self): + import polib + test_simple_conv_specs() test_mapping_keys() test_replacement_fields() diff --git a/ckan/lib/app_globals.py b/ckan/lib/app_globals.py index bcba9203990..4445a6607de 100644 --- a/ckan/lib/app_globals.py +++ b/ckan/lib/app_globals.py @@ -29,6 +29,38 @@ 'ckan.site_custom_css', ] +config_details = { + 'ckan.favicon': {}, # default gets set in config.environment.py + 'ckan.template_head_end': {}, + 'ckan.template_footer_end': {}, + # has been setup in load_environment(): + 'ckan.site_id': {}, + 'ckan.recaptcha.publickey': {'name': 'recaptcha_publickey'}, + 'ckan.recaptcha.privatekey': {'name': 'recaptcha_publickey'}, + 'ckan.template_title_deliminater': {'default': '-'}, + 'ckan.template_head_end': {}, + 'ckan.template_footer_end': {}, + 'ckan.dumps_url': {}, + 'ckan.dumps_format': {}, + 'ckan.api_url': {}, + + # split string + 'search.facets': {'default': 'groups tags res_format license', + 'type': 'split', + 'name': 'facets'}, + 'package_hide_extras': {'type': 'split'}, + 'plugins': {'type': 'split'}, + + # bool + 'openid_enabled': {'default': 'true', 'type' : 'bool'}, + 'debug': {'default': 'false', 'type' : 'bool'}, + 'ckan.debug_supress_header' : {'default': 'false', 'type' : 'bool'}, + + # int + 'ckan.datasets_per_page': {'default': '20', 'type': 'int'}, +} + + # A place to store the origional config options of we override them _CONFIG_CACHE = {} @@ -139,29 +171,27 @@ def _check_uptodate(self): self._mutex.release() def _init(self): - self.favicon = config.get('ckan.favicon', '/images/icons/ckan.ico') - facets = config.get('search.facets', 'groups tags res_format license') - self.facets = facets.split() - # has been setup in load_environment(): - self.site_id = config.get('ckan.site_id') - - self.template_head_end = config.get('ckan.template_head_end', '') - self.template_footer_end = config.get('ckan.template_footer_end', '') - - # hide these extras fields on package read - package_hide_extras = config.get('package_hide_extras', '').split() - self.package_hide_extras = package_hide_extras - - self.openid_enabled = asbool(config.get('openid_enabled', 'true')) + # process the config_details to set globals + for name, options in config_details.items(): + if 'name' in options: + key = options['name'] + elif name.startswith('ckan.'): + key = name[5:] + else: + key = name + value = config.get(name, options.get('default', '')) - self.recaptcha_publickey = config.get('ckan.recaptcha.publickey', '') - self.recaptcha_privatekey = config.get('ckan.recaptcha.privatekey', '') + data_type = options.get('type') + if data_type == 'bool': + value = asbool(value) + elif data_type == 'int': + value = int(value) + elif data_type == 'split': + value = value.split() - datasets_per_page = int(config.get('ckan.datasets_per_page', '20')) - self.datasets_per_page = datasets_per_page + setattr(self, key, value) - self.debug_supress_header = asbool(config.get('ckan.debug_supress_header', 'false')) app_globals = _Globals() del _Globals diff --git a/ckan/lib/base.py b/ckan/lib/base.py index 904c61a00bd..e7003f245dd 100644 --- a/ckan/lib/base.py +++ b/ckan/lib/base.py @@ -128,6 +128,10 @@ def render_template(): # Jinja2 templates if template_type == 'jinja2': + # We don't want to have the config in templates it should be + # accessed via g (app_globals) as this gives us flexability such + # as changing via database settings. + del globs['config'] # TODO should we raise error if genshi filters?? return render_jinja2(template_name, globs) diff --git a/ckan/lib/cli.py b/ckan/lib/cli.py index d8f43742f42..b23d6ed239a 100644 --- a/ckan/lib/cli.py +++ b/ckan/lib/cli.py @@ -1,3 +1,5 @@ +import collections +import csv import os import datetime import sys @@ -578,9 +580,12 @@ class UserCmd(CkanCommand): user - lists users user list - lists users user - shows user properties - user add [apikey=] [password=] - - add a user (prompts for password if - not supplied) + user add [=] + - add a user (prompts for password + if not supplied). + Field can be: apikey + password + email user setpass - set user password (prompts) user remove - removes user from users user search - searches for a user name @@ -677,53 +682,37 @@ def add(self): if len(self.args) < 2: print 'Need name of the user.' - return - username = self.args[1] - user = model.User.by_name(unicode(username)) - if user: - print 'User "%s" already found' % username sys.exit(1) + username = self.args[1] - # parse args - apikey = None - password = None - args = self.args[2:] - if len(args) == 1 and not (args[0].startswith('password') or \ - args[0].startswith('apikey')): - # continue to support the old syntax of just supplying - # the apikey - apikey = args[0] - else: - # new syntax: password=foo apikey=bar - for arg in args: - split = arg.find('=') - if split == -1: - split = arg.find(' ') - if split == -1: - raise ValueError('Could not parse arg: %r (expected "--