{# Copyright (C) 2025 CERN. Flask-MultiProfiler is free software; you can redistribute it and/or modify it under the terms of the MIT License; see LICENSE file for more details. #} {# Macro for rendering a complete request-response query #} {% macro render_query(request, response) %} {% set req_data = request.parsed_data or {} %} {% set resp_data = response.parsed_data or {} %} {% set method = req_data.method or "GET" %} {% set path = req_data.path or "/" %} {% set status_code = resp_data.status_code %} {% set duration_ms = resp_data.duration_ms %}
{{ method }} {{ path }} {% if status_code %} {% set status_class = "success" if 200 <= status_code < 300 else "error" if status_code >= 400 else "info" %} {{ status_code }} {% endif %} {% if duration_ms %} {{ "%.1f"|format(duration_ms) }}ms {% endif %}
{{ render_request_body_only(request, req_data) }} {{ render_response_body_only(response, resp_data) }}
{% if request.stack_trace %} {{ render_stack_trace(request.stack_trace, "Stack Trace", true) }} {% endif %}
{% endmacro %} {# Macro for rendering an orphaned request (no response) #} {% macro render_orphaned_request(request) %} {% set req_data = request.parsed_data or {} %}
⚠ ORPHANED REQUEST No response received
{{ render_request(request, req_data) }}
{% endmacro %} {# Macro for rendering an orphaned response (no request) #} {% macro render_orphaned_response(response) %} {% set resp_data = response.parsed_data or {} %}
⚠ ORPHANED RESPONSE No matching request found
{{ render_response(response, resp_data) }}
{% endmacro %} {# Macro for rendering a request entry #} {% macro render_request(query, parsed_data) %} {% set method = parsed_data.method or "GET" %} {% set path = parsed_data.path or "/" %} {% set query_params = parsed_data.query_params or {} %} {% set headers = parsed_data.headers or {} %} {% set body_json = parsed_data.body_json %} {% set query_params_str = query_params.items()|map('join', '=')|join('&') if query_params else '' %} {% set interesting_headers = {} %} {% if headers %} {% for key, value in headers.items() %} {% if not (key == 'Content-Type' and value == 'application/json') %} {% set _ = interesting_headers.update({key: value}) %} {% endif %} {% endfor %} {% endif %} {% set headers_str = interesting_headers.items()|map('join', ': ')|join('\n') if interesting_headers else 'None' %}
REQUEST {{ method }} {{ path }} {{ query.timestamp.strftime("%H:%M:%S.%f")[:-3] }}
Query Parameters:
{{ query_params_str if query_params_str else "None" }}
{% if interesting_headers and interesting_headers|length > 0 %}
Headers:
{{ headers_str }}
{% endif %} {% if body_json %}
{{ body_json | json_pretty }}
{% endif %} {% if query.stack_trace %} {{ render_stack_trace(query.stack_trace, "Stack Trace") }} {% endif %}
{% endmacro %} {# Macro for rendering a response entry #} {% macro render_response(query, parsed_data) %} {% set status_code = parsed_data.status_code %} {% set duration_ms = parsed_data.duration_ms %} {% set body_json = parsed_data.body_json %} {% set parse_error = parsed_data.parse_error %} {% set status_class = "" %} {% if status_code %} {% set status_class = "success" if 200 <= status_code < 300 else "error" if status_code >= 400 else "info" %} {% endif %}
RESPONSE {% if status_code %} {{ status_code }} {% endif %} {% if duration_ms %} {{ "%.1f"|format(duration_ms) }}ms {% endif %} {{ query.timestamp.strftime("%H:%M:%S.%f")[:-3] }}
{% if body_json or parse_error or parsed_data.body %}
{% if body_json %}
{{ body_json | json_pretty }}
{% elif parse_error %}
Parse Error: {{ parse_error }}
{% elif parsed_data.body %}
{{ parsed_data.body }}
{% endif %}
{% endif %}
{% endmacro %} {# Macro for rendering request body only (for side-by-side display) #} {% macro render_request_body_only(query, parsed_data) %} {% set method = parsed_data.method or "GET" %} {% set path = parsed_data.path or "/" %} {% set query_params = parsed_data.query_params or {} %} {% set headers = parsed_data.headers or {} %} {% set body_json = parsed_data.body_json %} {% set query_params_str = query_params.items()|map('join', '=')|join('&') if query_params else '' %} {% set interesting_headers = {} %} {% if headers %} {% for key, value in headers.items() %} {% if not (key == 'Content-Type' and value == 'application/json') %} {% set _ = interesting_headers.update({key: value}) %} {% endif %} {% endfor %} {% endif %} {% set headers_str = interesting_headers.items()|map('join', ': ')|join('\n') if interesting_headers else 'None' %}
REQUEST {{ method }} {{ path }}{% if query_params_str %}?{{ query_params_str }}{% endif %} {{ query.timestamp.strftime("%H:%M:%S.%f")[:-3] }}
{% if interesting_headers and interesting_headers|length > 0 %}
Headers:
{{ headers_str }}
{% endif %} {% if body_json %}
{{ body_json | json_pretty }}
{% endif %}
{% endmacro %} {# Macro for rendering response body only (for side-by-side display) #} {% macro render_response_body_only(query, parsed_data) %} {% set status_code = parsed_data.status_code %} {% set duration_ms = parsed_data.duration_ms %} {% set body_json = parsed_data.body_json %} {% set parse_error = parsed_data.parse_error %} {% set status_class = "" %} {% if status_code %} {% set status_class = "success" if 200 <= status_code < 300 else "error" if status_code >= 400 else "info" %} {% endif %}
RESPONSE {% if status_code %} {{ status_code }} {% endif %} {% if duration_ms %} {{ "%.1f"|format(duration_ms) }}ms {% endif %} {{ query.timestamp.strftime("%H:%M:%S.%f")[:-3] }}
{% if body_json or parse_error or parsed_data.body %}
{% if body_json %}
{{ body_json | json_pretty }}
{% elif parse_error %}
Parse Error: {{ parse_error }}
{% elif parsed_data.body %}
{{ parsed_data.body }}
{% endif %}
{% endif %}
{% endmacro %} {# Macro for rendering an unparsed entry #} {% macro render_unparsed(query) %}
UNPARSED {{ query.timestamp.strftime("%H:%M:%S.%f")[:-3] }}
{{ query.message }}
{% endmacro %} {# Macro for rendering a master panel item (compact view) #} {% macro render_master_item(item, index) %}
{% if item.type == "query" %} {% set req_data = item.request.parsed_data or {} %} {% set resp_data = item.response.parsed_data or {} %} {% set method = req_data.method or "GET" %} {% set path = req_data.path or "/" %} {% set status_code = resp_data.status_code %} {% set duration_ms = resp_data.duration_ms %} {% set status_class = "success" if status_code and 200 <= status_code < 300 else "error" if status_code and status_code >= 400 else "info" %}
{{ method }} {{ path }} {% if status_code %} {{ status_code }} {% endif %}
{% if duration_ms %} {{ "%.1f"|format(duration_ms) }}ms {% endif %} [{{ index + 1 }}]
{% elif item.type == "orphaned_request" %} {% set req_data = item.request.parsed_data or {} %} {% set method = req_data.method or "GET" %} {% set path = req_data.path or "/" %}
{{ method }} {{ path }} ⚠ NO RESPONSE
[{{ index + 1 }}]
{% elif item.type == "orphaned_response" %} {% set resp_data = item.response.parsed_data or {} %} {% set status_code = resp_data.status_code %} {% set duration_ms = resp_data.duration_ms %} {% set status_class = "success" if status_code and 200 <= status_code < 300 else "error" if status_code and status_code >= 400 else "info" %}
⚠ NO REQUEST {% if status_code %} {{ status_code }} {% endif %}
{% if duration_ms %} {{ "%.1f"|format(duration_ms) }}ms {% endif %} [{{ index + 1 }}]
{% elif item.type == "unparsed" %}
⚠ UNPARSED {{ item.entry.message[:50] }}...
[{{ index + 1 }}]
{% endif %}
{% endmacro %} {# Macro for rendering a detail panel item (full view) #} {% macro render_detail_item(item, index) %}
{% if item.type == "query" %}

Query Details [{{ index + 1 }}]

{{ render_query(item.request, item.response) }} {% elif item.type == "orphaned_request" %}

Orphaned Request [{{ index + 1 }}]

{{ render_orphaned_request(item.request) }} {% elif item.type == "orphaned_response" %}

Orphaned Response [{{ index + 1 }}]

{{ render_orphaned_response(item.response) }} {% elif item.type == "unparsed" %}

Unparsed Entry [{{ index + 1 }}]

{{ render_unparsed(item.entry) }} {% endif %}
{% endmacro %} {# Macro for rendering stack frame with locals #} {% macro render_frame(frame, index) %}
{{ frame.filename }}: {{ frame.lineno }} in {{ frame.function }}
{% if frame.locals %} {% endif %}
{% if frame.source_context %}
{%- for line_info in frame.source_context.lines %}
{{ "%4d"|format(line_info.lineno) }} {{ line_info.code }}
{%- endfor %}
        
{% endif %} {% if frame.locals %}
{% for name, info in frame.locals.items() %} {% endfor %}
Variable Type Value
{{ name }} {{ info.type }} {{ render_value(info) }}
{% endif %}
{% endmacro %} {# Macro for rendering values - now much simpler with primitive data #} {% macro render_value(value_info) %} {% if not value_info %} No value information {% else %} {{ value_info.display|e }} {% if value_info.truncated %} ⚠ truncated {% endif %} {% endif %} {% endmacro %} {# Macro for rendering stack trace with toggle for locals/source #} {% macro render_stack_trace(stack_trace, title="Stack Trace", expanded=False) %}

{{ title }} (most recent call first)

{% for frame in stack_trace %} {{ render_frame(frame, loop.index0) }} {% endfor %}
{% endmacro %}