diff --git a/debug_toolbar/panels/sql/forms.py b/debug_toolbar/panels/sql/forms.py index 6cc1554a1..ac17e68ec 100644 --- a/debug_toolbar/panels/sql/forms.py +++ b/debug_toolbar/panels/sql/forms.py @@ -77,7 +77,7 @@ def clean_hash(self): return hash def reformat_sql(self): - return reformat_sql(self.cleaned_data["sql"]) + return reformat_sql(self.cleaned_data["sql"], with_toggle=False) def make_hash(self, data): m = hmac.new(key=force_bytes(settings.SECRET_KEY), digestmod=hashlib.sha1) diff --git a/debug_toolbar/panels/sql/panel.py b/debug_toolbar/panels/sql/panel.py index fac9c473b..075bc9324 100644 --- a/debug_toolbar/panels/sql/panel.py +++ b/debug_toolbar/panels/sql/panel.py @@ -213,7 +213,7 @@ def duplicate_key(query): query["form"] = SQLSelectForm(auto_id=None, initial=copy(query)) if query["sql"]: - query["sql"] = reformat_sql(query["sql"]) + query["sql"] = reformat_sql(query["sql"], with_toggle=True) query["rgb_color"] = self._databases[alias]["rgb_color"] try: query["width_ratio"] = (query["duration"] / self._sql_time) * 100 diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py index 5babe15d2..e22c9ab09 100644 --- a/debug_toolbar/panels/sql/utils.py +++ b/debug_toolbar/panels/sql/utils.py @@ -21,22 +21,32 @@ def process(self, stream): yield T.Text, "" -def reformat_sql(sql): +def reformat_sql(sql, with_toggle=False): + formatted = parse_sql(sql, aligned_indent=True) + if not with_toggle: + return formatted + simple = simplify(parse_sql(sql, aligned_indent=False)) + uncollapsed = '{}'.format(simple) + collapsed = '{}'.format(formatted) + return collapsed + uncollapsed + + +def parse_sql(sql, aligned_indent=False): stack = sqlparse.engine.FilterStack() + stack.enable_grouping() + if aligned_indent: + stack.stmtprocess.append( + sqlparse.filters.AlignedIndentFilter(char=" ", n="
") + ) stack.preprocess.append(BoldKeywordFilter()) # add our custom filter stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings - return swap_fields("".join(stack.run(sql))) + return "".join(stack.run(sql)) -def swap_fields(sql): +def simplify(sql): expr = r"SELECT (...........*?) FROM" - subs = ( - r"SELECT " - r'••• ' - r'\1 ' - r"FROM" - ) - return re.sub(expr, subs, sql) + sub = r"SELECT ••• FROM" + return re.sub(expr, sub, sql) def contrasting_color_generator():