Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions chrome-extension/panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@
db_time: dbTime,
app_time: appTime,
total_time: dbTime + appTime,
has_duplicates: !!devbarHeaders['devbar-duplicates'],
duplicates: []
};
}
Expand Down Expand Up @@ -218,12 +217,12 @@
${renderMetric('queries', data.count ?? 0)}
${renderMetric('db', formatMs(data.db_time), 'ms')}
${renderMetric('app', formatMs(data.app_time), 'ms')}
${data.has_duplicates ? `<span class="dup-warn">⚠ ${data.duplicates?.length || ''} dup</span>` : ''}
${data.duplicates?.length ? `<span class="dup-warn">⚠ ${data.duplicates.length} dup</span>` : ''}
<span class="metric-label">${formatTime(currentRequest.timestamp)}</span>
</div>
</div>`;

if (data.has_duplicates && data.duplicates?.length > 0) {
if (data.duplicates?.length > 0) {
html += `<div class="dups">${data.duplicates.map(dup =>
`<div class="dup"><code>${escapeHtml(dup.sql)}</code> <span class="dup-time">${(dup.duration ?? 0).toFixed(1)}ms</span></div>`
).join('')}</div>`;
Expand Down Expand Up @@ -256,7 +255,7 @@
${renderMetric('queries', req.data.count ?? 0)}
${renderMetric('db', formatMs(req.data.db_time), 'ms')}
${renderMetric('app', formatMs(req.data.app_time), 'ms')}
${req.data.has_duplicates ? `<span class="dup-warn">⚠</span>` : ''}
${req.data.duplicates?.length ? `<span class="dup-warn">⚠</span>` : ''}
<span class="metric-label">${formatTime(req.timestamp)}</span>
</div>
</div>`;
Expand Down
8 changes: 2 additions & 6 deletions src/django_devbar/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,13 @@ def __call__(self, request):
stats["python_time"] = python_time
stats["total_time"] = total_time

level = "warn" if stats["has_duplicates"] else "ok"

if get_enable_devtools_data():
self._add_devtools_data_header(response, stats)

self._add_server_timing_header(response, stats)

if get_show_bar() and self._can_inject(response):
self._inject_devbar(response, stats, level)
self._inject_devbar(response, stats)

return response

Expand All @@ -64,7 +62,6 @@ def _add_devtools_data_header(self, response, stats):
"db_time": stats["duration"],
"app_time": stats["python_time"],
"total_time": stats["total_time"],
"has_duplicates": stats["has_duplicates"],
}
if stats.get("duplicate_queries"):
extension_data["duplicates"] = stats["duplicate_queries"]
Expand All @@ -89,7 +86,7 @@ def _can_inject(self, response):
return False
return hasattr(response, "content")

def _inject_devbar(self, response, stats, level):
def _inject_devbar(self, response, stats):
content = response.content
matches = list(BODY_CLOSE_RE.finditer(content))
if not matches:
Expand All @@ -104,7 +101,6 @@ def _inject_devbar(self, response, stats, level):
Context(
{
"position": get_position(),
"level": level,
"db_time": stats["duration"],
"app_time": stats["python_time"],
"query_count": stats["count"],
Expand Down
3 changes: 2 additions & 1 deletion src/django_devbar/templates/django_devbar/devbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
color: #f5f5f5;
}
#django-devbar.level-warn { border-left: 3px solid #f59e0b; }
#django-devbar.has-duplicates { border-left: 3px solid #f59e0b; }
#django-devbar span { opacity: 0.7; }
#django-devbar strong { opacity: 1; font-weight: 600; }
#django-devbar details { display: inline; position: relative; }
Expand Down Expand Up @@ -85,7 +86,7 @@
}
@media (max-width: 640px) { #django-devbar { display: none; } }
</style>
<div id="django-devbar" class="level-{{ level }}">
<div id="django-devbar"{% if duplicates_html %} class="has-duplicates"{% endif %}>
<span>queries</span> <strong>{{ query_count }}</strong> <span>·</span>
<span>db</span> <strong>{{ db_time|floatformat:0 }}ms</strong> <span>·</span>
<span>app</span> <strong>{{ app_time|floatformat:0 }}ms</strong>{{ duplicates_html|safe }}
Expand Down
1 change: 0 additions & 1 deletion src/django_devbar/tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ def get_stats():
return {
"count": _query_count.get(),
"duration": _query_duration.get(),
"has_duplicates": bool(_duplicate_log.get()),
"duplicate_queries": _duplicate_log.get(),
}

Expand Down
3 changes: 0 additions & 3 deletions tests/test_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ def test_duplicate_data_in_json_header(self, rf, monkeypatch, settings):
lambda: {
"count": 3,
"duration": 10.0,
"has_duplicates": True,
"duplicate_queries": [
{"sql": "SELECT * FROM foo", "params": "(1,)", "duration": 5.0},
{"sql": "SELECT * FROM bar", "params": "(2,)", "duration": 3.0},
Expand All @@ -173,7 +172,6 @@ def get_response(request):
response = middleware(request)

data = json.loads(response["DevBar-Data"])
assert data["has_duplicates"] is True
assert len(data["duplicates"]) == 2

def test_server_timing_header_always_present(self, rf, monkeypatch):
Expand All @@ -183,7 +181,6 @@ def test_server_timing_header_always_present(self, rf, monkeypatch):
lambda: {
"count": 3,
"duration": 12.5,
"has_duplicates": False,
"duplicate_queries": [],
},
)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def mock_execute(*args):
tracker.tracking_wrapper(mock_execute, "SELECT 1", [], False, {})
tracker.tracking_wrapper(mock_execute, "SELECT 2", [], False, {})

assert tracker.get_stats()["has_duplicates"] is False
assert len(tracker.get_stats()["duplicate_queries"]) == 0

def test_no_duplicates_for_same_sql_different_params(self):
tracker.reset()
Expand All @@ -71,7 +71,7 @@ def mock_execute(*args):
mock_execute, "SELECT * FROM t WHERE id=%s", [2], False, {}
)

assert tracker.get_stats()["has_duplicates"] is False
assert len(tracker.get_stats()["duplicate_queries"]) == 0

def test_duplicates_detected_same_sql_same_params(self):
tracker.reset()
Expand All @@ -86,4 +86,4 @@ def mock_execute(*args):
mock_execute, "SELECT * FROM t WHERE id=%s", [1], False, {}
)

assert tracker.get_stats()["has_duplicates"] is True
assert len(tracker.get_stats()["duplicate_queries"]) == 1