Custom formatters

A list of validators and formatters that can be overridden in Salesman.

Price formatter

Displaying prices in Salesman is controlled using a price formatter function. The default formatter function is set to salesman.core.utils.format_price() and returns a value formated with two decimal places.

Tip

Price formatter can be used (among other things) to display a price with a symbol or even a converted price to another currency based on the request that’s received in the context.

You can change the price formatter by providing a dotted path in SALESMAN_PRICE_FORMATTER setting that points to your custom formatter function.

def format_price(value: Decimal, context: dict = {}) -> str:
    """
    Default price format function. Can be overriden by providing a
    dotted path to a function in ``SALESMAN_PRICE_FORMATTER`` setting.

    Args:
        value (Decimal): Number value to be formatted
        context (dict, optional): Format context data. Defaults to {}.

    Returns:
        str: Formatted price as a string
    """
    return f'{value:.2f}'

Your custom function should accept a value argument of type Decimal and a context dictionary that contains additional render data like request and either the basket or order object. The function should return a formatted price as a string.

Admin JSON formatter

When displaying JSON data in admin, a formatter function is used. The default function salesman.admin.utils.format_json() uses the Pygments library to create the default JSON display. You can override the JSON formatter by providing a dotted path to a function in SALESMAN_ADMIN_JSON_FORMATTER setting.

def format_json(value: dict, context: dict = {}) -> str:
    """
    Format json and add color using pygments with fallback.

    Args:
        value (dict): Dict to be formated to json
        context (dict, optional): Format context data. Defaults to {}.

    Returns:
        str: JSON formated html string
    """
    output = json.dumps(value, indent=2)
    output = pygments_highlight(output, 'json', 'tango')
    style = pygments_css('tango')
    styled = context.get('styled', True)  # Used for testing.
    if styled and style:
        html = (
            f'<style>{style}</style>'
            f'<pre class="highlight" style="margin: 0; padding: 1em;">{output}</pre>'
        )
    else:
        html = f'<pre style="margin: 0;">{output}</pre>'
    return format_html('<div>{}</div>', mark_safe(html))

Your custom formatter should accept a dictionary value and return the HTML string. It also receives a context dictionary with additional context. Either an order or order_item boolean will be passed in depending on the formatting location.