def dataportal_admin(): # items = self._get_config_form_items() if request.method == "POST": data = request.form try: data_dict = logic.clean_dict( dict_fns.unflatten(logic.tuplize_dict(logic.parse_params(request.form, ignore_keys=CACHE_PARAMETERS))) ) del data_dict["save"] data = logic.get_action("config_option_update")({"user": g.user}, data_dict) except logic.ValidationError as e: errors = e.error_dict error_summary = e.error_summary extra_vars = {"data": data, "errors": errors, "error_summary": error_summary} return toolkit.render("admin/dataportal.html", extra_vars=extra_vars) return toolkit.redirect_to("dataportaltheme_blueprint.dataportal_admin") else: admin_schema = schema.update_configuration_schema() data = {} for key in admin_schema: data[key] = config.get(key) extra_vars = {"data": data, "errors": {}} return toolkit.render("admin/dataportal.html", extra_vars=extra_vars)
def reset() -> None: ''' set updatable values from config ''' def get_config_value(key: str, default: str = ''): # type_ignore_reason: engine theoretically uninitialized if model.meta.engine.has_table('system_info'): # type: ignore value = model.get_system_info(key) else: value = None config_value = config.get(key) # sort encodeings if needed # we want to store the config the first time we get here so we can # reset them if needed if key not in _CONFIG_CACHE: _CONFIG_CACHE[key] = config_value if value is not None: log.debug('config `%s` set to `%s` from db' % (key, value)) else: value = _CONFIG_CACHE[key] if value: log.debug('config `%s` set to `%s` from config' % (key, value)) else: value = default set_app_global(key, value) # update the config config[key] = value return value # update the config settings in auto update schema = update_configuration_schema() for key in schema.keys(): get_config_value(key) # custom styling main_css = get_config_value( 'ckan.main_css', DEFAULT_MAIN_CSS_FILE) or DEFAULT_MAIN_CSS_FILE set_main_css(main_css) if app_globals.site_logo: app_globals.header_class = 'header-image' elif not app_globals.site_description: app_globals.header_class = 'header-text-logo' else: app_globals.header_class = 'header-text-logo-tagline'
def config_option_update(context, data_dict): ''' .. versionadded:: 2.4 Allows to modify some CKAN runtime-editable config options It takes arbitrary key, value pairs and checks the keys against the config options update schema. If some of the provided keys are not present in the schema a :py:class:`~ckan.plugins.logic.ValidationError` is raised. The values are then validated against the schema, and if validation is passed, for each key, value config option: * It is stored on the ``system_info`` database table * The Pylons ``config`` object is updated. * The ``app_globals`` (``g``) object is updated (this only happens for options explicitly defined in the ``app_globals`` module. The following lists a ``key`` parameter, but this should be replaced by whichever config options want to be updated, eg:: get_action('config_option_update)({}, { 'ckan.site_title': 'My Open Data site', 'ckan.homepage_layout': 2, }) :param key: a configuration option key (eg ``ckan.site_title``). It must be present on the ``update_configuration_schema`` :type key: string :returns: a dictionary with the options set :rtype: dictionary .. note:: You can see all available runtime-editable configuration options calling the :py:func:`~ckan.logic.action.get.config_option_list` action .. note:: Extensions can modify which configuration options are runtime-editable. For details, check :doc:`/extensions/remote-config-update`. .. warning:: You should only add config options that you are comfortable they can be edited during runtime, such as ones you've added in your own extension, or have reviewed the use of in core CKAN. ''' model = context['model'] _check_access('config_option_update', context, data_dict) schema = schema_.update_configuration_schema() available_options = schema.keys() provided_options = data_dict.keys() unsupported_options = set(provided_options) - set(available_options) if unsupported_options: msg = 'Configuration option(s) \'{0}\' can not be updated'.format( ' '.join(list(unsupported_options))) raise ValidationError(msg, error_summary={'message': msg}) data, errors = _validate(data_dict, schema, context) if errors: model.Session.rollback() raise ValidationError(errors) for key, value in data.iteritems(): # Save value in database model.set_system_info(key, value) # Update CKAN's `config` object config[key] = value # Only add it to the app_globals (`g`) object if explicitly defined # there globals_keys = app_globals.app_globals_from_config_details.keys() if key in globals_keys: app_globals.set_app_global(key, value) # Update the config update timestamp model.set_system_info('ckan.config_update', str(time.time())) log.info('Updated config options: {0}'.format(data)) return data
def config_option_update(context, data_dict): ''' .. versionadded:: 2.4 Allows to modify some CKAN runtime-editable config options It takes arbitrary key, value pairs and checks the keys against the config options update schema. If some of the provided keys are not present in the schema a :py:class:`~ckan.plugins.logic.ValidationError` is raised. The values are then validated against the schema, and if validation is passed, for each key, value config option: * It is stored on the ``system_info`` database table * The Pylons ``config`` object is updated. * The ``app_globals`` (``g``) object is updated (this only happens for options explicitly defined in the ``app_globals`` module. The following lists a ``key`` parameter, but this should be replaced by whichever config options want to be updated, eg:: get_action('config_option_update)({}, { 'ckan.site_title': 'My Open Data site', 'ckan.homepage_layout': 2, }) :param key: a configuration option key (eg ``ckan.site_title``). It must be present on the ``update_configuration_schema`` :type key: string :returns: a dictionary with the options set :rtype: dictionary .. note:: You can see all available runtime-editable configuration options calling the :py:func:`~ckan.logic.action.get.config_option_list` action .. note:: Extensions can modify which configuration options are runtime-editable. For details, check :doc:`/extensions/remote-config-update`. .. warning:: You should only add config options that you are comfortable they can be edited during runtime, such as ones you've added in your own extension, or have reviewed the use of in core CKAN. ''' model = context['model'] _check_access('config_option_update', context, data_dict) schema = schema_.update_configuration_schema() available_options = schema.keys() provided_options = data_dict.keys() unsupported_options = set(provided_options) - set(available_options) if unsupported_options: msg = 'Configuration option(s) \'{0}\' can not be updated'.format( ' '.join(list(unsupported_options))) raise ValidationError(msg, error_summary={'message': msg}) data, errors = _validate(data_dict, schema, context) if errors: model.Session.rollback() raise ValidationError(errors) for key, value in data.iteritems(): # Save value in database model.set_system_info(key, value) # Update the pylons `config` object config[key] = value # Only add it to the app_globals (`g`) object if explicitly defined # there globals_keys = app_globals.app_globals_from_config_details.keys() if key in globals_keys: app_globals.set_app_global(key, value) # Update the config update timestamp model.set_system_info('ckan.config_update', str(time.time())) log.info('Updated config options: {0}'.format(data)) return data