def add_default_language_settings(languages_list, var_name='PARLER_LANGUAGES', **extra_defaults): """ Apply extra defaults to the language settings. This function can also be used by other packages to create their own variation of ``PARLER_LANGUAGES`` with extra fields. For example:: from django.conf import settings from parler import appsettings as parler_appsettings # Create local names, which are based on the global parler settings MYAPP_DEFAULT_LANGUAGE_CODE = getattr(settings, 'MYAPP_DEFAULT_LANGUAGE_CODE', parler_appsettings.PARLER_DEFAULT_LANGUAGE_CODE) MYAPP_LANGUAGES = getattr(settings, 'MYAPP_LANGUAGES', parler_appsettings.PARLER_LANGUAGES) # Apply the defaults to the languages MYAPP_LANGUAGES = parler_appsettings.add_default_language_settings(MYAPP_LANGUAGES, 'MYAPP_LANGUAGES', code=MYAPP_DEFAULT_LANGUAGE_CODE, fallback=MYAPP_DEFAULT_LANGUAGE_CODE, hide_untranslated=False ) The returned object will be an :class:`~parler.utils.conf.LanguagesSetting` object, which adds additional methods to the :class:`dict` object. :param languages_list: The settings, in :ref:`PARLER_LANGUAGES` format. :param var_name: The name of your variable, for debugging output. :param extra_defaults: Any defaults to override in the ``languages_list['default']`` section, e.g. ``code``, ``fallback``, ``hide_untranslated``. :return: The updated ``languages_list`` with all defaults applied to all sections. :rtype: LanguagesSetting """ languages_list = LanguagesSetting(languages_list) languages_list.setdefault('default', {}) defaults = languages_list['default'] defaults.setdefault('hide_untranslated', False) # Whether queries with .active_translations() may or may not return the fallback language. if 'fallback' in defaults: #warnings.warn("Please use 'fallbacks' instead of 'fallback' in the 'defaults' section of {0}".format(var_name), DeprecationWarning) defaults['fallbacks'] = [defaults.pop('fallback')] if 'fallback' in extra_defaults: #warnings.warn("Please use 'fallbacks' instead of 'fallback' in parameters for {0} = add_default_language_settings(..)".format(var_name), DeprecationWarning) extra_defaults['fallbacks'] = [extra_defaults.pop('fallback')] defaults.update(extra_defaults) # Also allow to override code and fallback this way. # This function previously existed in appsettings, where it could reference the defaults directly. # However, this module is a more logical place for this function. To avoid circular import problems, # the 'code' and 'fallback' parameters are always passed by the appsettings module. # In case these are missing, default to the original behavior for backwards compatibility. if 'code' not in defaults: from parler import appsettings defaults['code'] = appsettings.PARLER_DEFAULT_LANGUAGE_CODE if 'fallbacks' not in defaults: from parler import appsettings defaults['fallbacks'] = appsettings.PARLER_DEFAULT_LANGUAGE_CODE if not is_supported_django_language(defaults['code']): raise ImproperlyConfigured("The value for {0}['defaults']['code'] ('{1}') does not exist in LANGUAGES".format(var_name, defaults['code'])) for site_id, lang_choices in six.iteritems(languages_list): if site_id == 'default': continue if not isinstance(lang_choices, (list, tuple)): raise ImproperlyConfigured("{0}[{1}] should be a tuple of language choices!".format(var_name, site_id)) for i, choice in enumerate(lang_choices): if not is_supported_django_language(choice['code']): raise ImproperlyConfigured("{0}[{1}][{2}]['code'] does not exist in LANGUAGES".format(var_name, site_id, i)) # Copy all items from the defaults, so you can provide new fields too. for key, value in six.iteritems(defaults): choice.setdefault(key, value) return languages_list
def add_default_language_settings(languages_list, var_name='PARLER_LANGUAGES', **extra_defaults): """ Apply extra defaults to the language settings. This function can also be used by other packages to create their own variation of ``PARLER_LANGUAGES`` with extra fields. For example:: from django.conf import settings from parler import appsettings as parler_appsettings # Create local names, which are based on the global parler settings MYAPP_DEFAULT_LANGUAGE_CODE = getattr(settings, 'MYAPP_DEFAULT_LANGUAGE_CODE', parler_appsettings.PARLER_DEFAULT_LANGUAGE_CODE) MYAPP_LANGUAGES = getattr(settings, 'MYAPP_LANGUAGES', parler_appsettings.PARLER_LANGUAGES) # Apply the defaults to the languages MYAPP_LANGUAGES = parler_appsettings.add_default_language_settings(MYAPP_LANGUAGES, 'MYAPP_LANGUAGES', code=MYAPP_DEFAULT_LANGUAGE_CODE, fallback=MYAPP_DEFAULT_LANGUAGE_CODE, hide_untranslated=False ) The returned object will be an :class:`~parler.utils.conf.LanguagesSetting` object, which adds additional methods to the :class:`dict` object. :param languages_list: The settings, in :ref:`PARLER_LANGUAGES` format. :param var_name: The name of your variable, for debugging output. :param extra_defaults: Any defaults to override in the ``languages_list['default']`` section, e.g. ``code``, ``fallback``, ``hide_untranslated``. :return: The updated ``languages_list`` with all defaults applied to all sections. :rtype: LanguagesSetting """ languages_list = LanguagesSetting(languages_list) languages_list.setdefault('default', {}) defaults = languages_list['default'] defaults.setdefault( 'hide_untranslated', False ) # Whether queries with .active_translations() may or may not return the fallback language. if 'fallback' in defaults: #warnings.warn("Please use 'fallbacks' instead of 'fallback' in the 'defaults' section of {0}".format(var_name), DeprecationWarning) defaults['fallbacks'] = [defaults.pop('fallback')] if 'fallback' in extra_defaults: #warnings.warn("Please use 'fallbacks' instead of 'fallback' in parameters for {0} = add_default_language_settings(..)".format(var_name), DeprecationWarning) extra_defaults['fallbacks'] = [extra_defaults.pop('fallback')] defaults.update( extra_defaults) # Also allow to override code and fallback this way. # This function previously existed in appsettings, where it could reference the defaults directly. # However, this module is a more logical place for this function. To avoid circular import problems, # the 'code' and 'fallback' parameters are always passed by the appsettings module. # In case these are missing, default to the original behavior for backwards compatibility. if 'code' not in defaults: from parler import appsettings defaults['code'] = appsettings.PARLER_DEFAULT_LANGUAGE_CODE if 'fallbacks' not in defaults: from parler import appsettings defaults['fallbacks'] = [appsettings.PARLER_DEFAULT_LANGUAGE_CODE] if not is_supported_django_language(defaults['code']): raise ImproperlyConfigured( "The value for {0}['defaults']['code'] ('{1}') does not exist in LANGUAGES" .format(var_name, defaults['code'])) for site_id, lang_choices in six.iteritems(languages_list): if site_id == 'default': continue if not isinstance(lang_choices, (list, tuple)): raise ImproperlyConfigured( "{0}[{1}] should be a tuple of language choices!".format( var_name, site_id)) for i, choice in enumerate(lang_choices): if not is_supported_django_language(choice['code']): raise ImproperlyConfigured( "{0}[{1}][{2}]['code'] does not exist in LANGUAGES".format( var_name, site_id, i)) # Copy all items from the defaults, so you can provide new fields too. for key, value in six.iteritems(defaults): choice.setdefault(key, value) return languages_list