Save user-specific configuration property.

    POST parameters (JSON keys):
        app_name: application name for which the configuration property is
            valid (e.g., proso_models)
        key: name of the property (e.g., predictive_model.class)
        value: value of the property (number, string, boolean, ...,
            e.g, proso.models.prediction.PriorCurrentPredictiveModel)
        condition_key (optional): name of the condition which is used to filter
            the property (e.g., practice_filter)
        condition_value (optional): value for the condition filtering the
            property (e.g., [["context/world"],["category/state"]])

def custom_config(request):
    """
    Save user-specific configuration property.

    POST parameters (JSON keys):
        app_name: application name for which the configuration property is
            valid (e.g., proso_models)
        key: name of the property (e.g., predictive_model.class)
        value: value of the property (number, string, boolean, ...,
            e.g, proso.models.prediction.PriorCurrentPredictiveModel)
        condition_key (optional): name of the condition which is used to filter
            the property (e.g., practice_filter)
        condition_value (optional): value for the condition filtering the
            property (e.g., [["context/world"],["category/state"]])
    """
    if request.method == 'POST':
        config_dict = json_body(request.body.decode('utf-8'))
        CustomConfig.objects.try_create(
            config_dict['app_name'],
            config_dict['key'],
            config_dict['value'],
            request.user.id,
            config_dict.get('condition_key') if config_dict.get('condition_key') else None,
            urllib.parse.unquote(config_dict.get('condition_value')) if config_dict.get('condition_value') else None
        )
        return config(request)
    else:
        return render_json(request, {}, template='common_custom_config.html', help_text=custom_config.__doc__)