diff --git a/chrome-extension/panel.js b/chrome-extension/panel.js index 7d71a11..4db1096 100644 --- a/chrome-extension/panel.js +++ b/chrome-extension/panel.js @@ -87,7 +87,6 @@ db_time: dbTime, app_time: appTime, total_time: dbTime + appTime, - has_duplicates: !!devbarHeaders['devbar-duplicates'], duplicates: [] }; } @@ -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 ? `⚠ ${data.duplicates?.length || ''} dup` : ''} + ${data.duplicates?.length ? `⚠ ${data.duplicates.length} dup` : ''} ${formatTime(currentRequest.timestamp)} `; - if (data.has_duplicates && data.duplicates?.length > 0) { + if (data.duplicates?.length > 0) { html += `
${data.duplicates.map(dup => `
${escapeHtml(dup.sql)} ${(dup.duration ?? 0).toFixed(1)}ms
` ).join('')}
`; @@ -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 ? `` : ''} + ${req.data.duplicates?.length ? `` : ''} ${formatTime(req.timestamp)} `; diff --git a/src/django_devbar/middleware.py b/src/django_devbar/middleware.py index a68bede..d95f039 100644 --- a/src/django_devbar/middleware.py +++ b/src/django_devbar/middleware.py @@ -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 @@ -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"] @@ -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: @@ -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"], diff --git a/src/django_devbar/templates/django_devbar/devbar.html b/src/django_devbar/templates/django_devbar/devbar.html index 795085e..d8b3949 100644 --- a/src/django_devbar/templates/django_devbar/devbar.html +++ b/src/django_devbar/templates/django_devbar/devbar.html @@ -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; } @@ -85,7 +86,7 @@ } @media (max-width: 640px) { #django-devbar { display: none; } } -
+
queries {{ query_count }} · db {{ db_time|floatformat:0 }}ms · app {{ app_time|floatformat:0 }}ms{{ duplicates_html|safe }} diff --git a/src/django_devbar/tracker.py b/src/django_devbar/tracker.py index 86f0db5..9de26c0 100644 --- a/src/django_devbar/tracker.py +++ b/src/django_devbar/tracker.py @@ -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(), } diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 2ca9444..133e347 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -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}, @@ -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): @@ -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": [], }, ) diff --git a/tests/test_tracker.py b/tests/test_tracker.py index 90c0be4..d5b815f 100644 --- a/tests/test_tracker.py +++ b/tests/test_tracker.py @@ -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() @@ -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() @@ -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