diff options
| -rw-r--r-- | debug_toolbar/forms.py | 2 | ||||
| -rw-r--r-- | debug_toolbar/panels/sql.py | 30 | ||||
| -rw-r--r-- | debug_toolbar/utils/sql.py | 15 | ||||
| -rw-r--r-- | debug_toolbar/utils/sqlparse/filters.py | 14 | ||||
| -rw-r--r-- | debug_toolbar/views.py | 2 | 
5 files changed, 32 insertions, 31 deletions
| diff --git a/debug_toolbar/forms.py b/debug_toolbar/forms.py index d795c17..5955bfc 100644 --- a/debug_toolbar/forms.py +++ b/debug_toolbar/forms.py @@ -2,6 +2,7 @@ from django import forms  from django.conf import settings  from django.core.exceptions import ValidationError  from django.utils.functional import cached_property +from debug_toolbar.utils.sql import reformat_sql  try:      import json @@ -75,7 +76,6 @@ class SQLSelectForm(forms.Form):          return hash      def reformat_sql(self): -        from debug_toolbar.panels.sql import reformat_sql          sql, params = self.cleaned_data['sql'], self.cleaned_data['params']          return reformat_sql(self.cursor.db.ops.last_executed_query(self.cursor, sql, params)) diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index e434014..74729c7 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -1,16 +1,15 @@ -import re  import uuid  from copy import copy  from django.db.backends import BaseDatabaseWrapper -from django.utils.html import escape  from django.utils.translation import ugettext_lazy as _, ungettext_lazy as __  from debug_toolbar.forms import SQLSelectForm  from debug_toolbar.utils.compat.db import connections  from debug_toolbar.middleware import DebugToolbarMiddleware  from debug_toolbar.panels import DebugPanel -from debug_toolbar.utils import sqlparse, render_stacktrace +from debug_toolbar.utils import render_stacktrace +from debug_toolbar.utils.sql import reformat_sql  from debug_toolbar.utils.tracking.db import CursorWrapper  from debug_toolbar.utils.tracking import replace_call @@ -198,28 +197,3 @@ class SQLDebugPanel(DebugPanel):              'queries': [q for a, q in self._queries],              'sql_time': self._sql_time,          }) - - -class BoldKeywordFilter(sqlparse.filters.Filter): -    """sqlparse filter to bold SQL keywords""" -    def process(self, stack, stream): -        """Process the token stream""" -        for token_type, value in stream: -            is_keyword = token_type in sqlparse.tokens.Keyword -            if is_keyword: -                yield sqlparse.tokens.Text, '<strong>' -            yield token_type, escape(value) -            if is_keyword: -                yield sqlparse.tokens.Text, '</strong>' - - -def swap_fields(sql): -    return re.sub('SELECT</strong> (.*?) <strong>FROM', 'SELECT</strong> <a class="djDebugUncollapsed djDebugToggle" href="#">•••</a> ' + -        '<a class="djDebugCollapsed djDebugToggle" href="#">\g<1></a> <strong>FROM', sql) - - -def reformat_sql(sql): -    stack = sqlparse.engine.FilterStack() -    stack.preprocess.append(BoldKeywordFilter())  # add our custom filter -    stack.postprocess.append(sqlparse.filters.SerializerUnicode())  # tokens -> strings -    return swap_fields(''.join(stack.run(sql))) diff --git a/debug_toolbar/utils/sql.py b/debug_toolbar/utils/sql.py new file mode 100644 index 0000000..909edf7 --- /dev/null +++ b/debug_toolbar/utils/sql.py @@ -0,0 +1,15 @@ +import re +from debug_toolbar.utils import sqlparse +from debug_toolbar.utils.sqlparse.filters import BoldKeywordFilter + + +def reformat_sql(sql): +    stack = sqlparse.engine.FilterStack() +    stack.preprocess.append(BoldKeywordFilter())  # add our custom filter +    stack.postprocess.append(sqlparse.filters.SerializerUnicode())  # tokens -> strings +    return swap_fields(''.join(stack.run(sql))) + + +def swap_fields(sql): +    return re.sub('SELECT</strong> (.*?) <strong>FROM', 'SELECT</strong> <a class="djDebugUncollapsed djDebugToggle" href="#">•••</a> ' + +        '<a class="djDebugCollapsed djDebugToggle" href="#">\g<1></a> <strong>FROM', sql) diff --git a/debug_toolbar/utils/sqlparse/filters.py b/debug_toolbar/utils/sqlparse/filters.py index 897cc90..6443a3c 100644 --- a/debug_toolbar/utils/sqlparse/filters.py +++ b/debug_toolbar/utils/sqlparse/filters.py @@ -1,6 +1,7 @@  # -*- coding: utf-8 -*-  import re +from django.utils.html import escape  from debug_toolbar.utils.sqlparse import tokens as T  from debug_toolbar.utils.sqlparse import sql @@ -423,3 +424,16 @@ class OutputPHPFilter(Filter):              varname = self.varname          stmt.tokens = tuple(self._process(stmt.tokens, varname))          return stmt + + +class BoldKeywordFilter(Filter): +    """sqlparse filter to bold SQL keywords""" +    def process(self, stack, stream): +        """Process the token stream""" +        for token_type, value in stream: +            is_keyword = token_type in T.Keyword +            if is_keyword: +                yield T.Text, '<strong>' +            yield token_type, escape(value) +            if is_keyword: +                yield T.Text, '</strong>' diff --git a/debug_toolbar/views.py b/debug_toolbar/views.py index 22b03d9..13a36b1 100644 --- a/debug_toolbar/views.py +++ b/debug_toolbar/views.py @@ -6,10 +6,8 @@ views in any other way is generally not advised.  from django.http import HttpResponseBadRequest  from django.shortcuts import render_to_response -from django.utils import simplejson  from django.views.decorators.csrf import csrf_exempt -  try:      from hashlib import sha1  except ImportError: | 
