[debug-toolbar] add registry panel
authorLaurent Peuch <cortex@worlddomination.be>
Thu, 14 Nov 2019 15:40:35 +0100
changeset 12766 682d0790997f
parent 12765 771c99f16780
child 12767 d50661367401
[debug-toolbar] add registry panel Closes #17219866
cubicweb/debug.py
cubicweb/pyramid/bwcompat.py
cubicweb/pyramid/debug_toolbar_templates/registry.dbtmako
cubicweb/pyramid/debugtoolbar_panels.py
--- a/cubicweb/debug.py	Thu Nov 14 01:01:00 2019 +0100
+++ b/cubicweb/debug.py	Thu Nov 14 15:40:35 2019 +0100
@@ -25,6 +25,7 @@
     "controller": [],
     "rql": [],
     "sql": [],
+    "vreg": [],
 }
 
 
--- a/cubicweb/pyramid/bwcompat.py	Thu Nov 14 01:01:00 2019 +0100
+++ b/cubicweb/pyramid/bwcompat.py	Thu Nov 14 15:40:35 2019 +0100
@@ -93,6 +93,9 @@
                                  ctrlid, req.path, controller,
                                  inspect.getsourcefile(controller.__class__),
                                  inspect.getsourcelines(controller.__class__)[1])
+                        emit_to_debug_channel("vreg", {
+                            "vreg": vreg,
+                        })
                         emit_to_debug_channel("controller", {
                             "kind": ctrlid,
                             "request": req,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cubicweb/pyramid/debug_toolbar_templates/registry.dbtmako	Thu Nov 14 15:40:35 2019 +0100
@@ -0,0 +1,93 @@
+% if vreg:
+
+<div id="registry-store">
+    <div class="row">
+        <div class="col-md-3">
+            <nav id="registry-store-categories">
+                <ul class="nav nav-pills nav-stacked">
+                    % for category in sorted(vreg.keys()):
+                    <li role="presentation"><a href="#detail-${category}">${category}</a></li>
+                    % endfor
+                </ul>
+            </nav>
+        </div>
+
+        <div class="col-md-9">
+            % for category, data in sorted(vreg.items(), key=lambda x: x[0]):
+            <div class="anchor">
+                <a class="anchor" id="detail-${category}"></a>
+                <h4>${category.title()}</h4>
+                <table class="table table-bordered table-striped">
+                    % for key, values in sorted(data.items(), key=lambda x: x[0]):
+                    <tr>
+                        <th>${key}</th>
+                        <td>
+                            <ul>
+                                % for value in values:
+                                <li>
+                                    % if isinstance(value, type):
+                                    ${value.__module__}.${value.__name__}
+                                    % else:
+                                    ${value}
+                                    % endif
+
+                                    <ul>
+                                        % if hasattr(value, "cw_etype"):
+                                        <li>regid: '${value.cw_etype}'</li>
+                                        % elif hasattr(value, "__regid__"):
+                                        <li>regid: '${value.__regid__}'</li>
+                                        % endif
+
+                                        % if hasattr(value, "__select__"):
+                                            <li>select: '${value.__select__}'</li>
+                                            % if hasattr(value.__select__, "func_name"):
+                                            <li>select name: '${value.__select__.func_name}'</li>
+                                            % endif
+                                            % if hasattr(value.__select__, "score"):
+                                            <li>select score: '${value.__select__.score}'</li>
+                                            % endif
+                                        % endif
+
+                                        <li>registries: ${value.__registries__}</li>
+
+                                        % if hasattr(value, "rest_attr"):
+                                        <li>rest_attr: '${value.rest_attr}'</li>
+                                        % endif
+
+                                        % if hasattr(value, "fetch_attrs"):
+                                        <li>fetch_attrs: '${value.fetch_attrs}'</li>
+                                        % endif
+
+                                        % if hasattr(value, "cw_skip_copy_for"):
+                                        <li>cw_skip_copy_for: '${value.cw_skip_copy_for}'</li>
+                                        % endif
+
+                                        % if hasattr(value, "e_schema"):
+                                        <li>e_schema: '${value.e_schema}'</li>
+                                        % endif
+                                    </ul>
+                                </li>
+                                % endfor
+                            </ul>
+                        </td>
+                    </tr>
+                    % endfor
+                </table>
+            </div>
+            % endfor
+        </div>
+    </div>
+</div>
+
+% else:
+<p>No registry store got collected, is it a bug?</p>
+% endif
+
+<style>
+a.anchor {
+    display: block;
+    position: relative;
+    top: -150px;
+    visibility: hidden;
+}
+</style>
--- a/cubicweb/pyramid/debugtoolbar_panels.py	Thu Nov 14 01:01:00 2019 +0100
+++ b/cubicweb/pyramid/debugtoolbar_panels.py	Thu Nov 14 15:40:35 2019 +0100
@@ -54,6 +54,29 @@
         unsubscribe_to_debug_channel("controller", self.collect_controller)
 
 
+class RegistryDebugPanel(DebugPanel):
+    """
+    CubicWeb registry content and decisions debug panel
+    """
+
+    name = 'Registry'
+    title = 'Registry Store'
+    nav_title = 'Registry Store'
+
+    has_content = True
+    template = 'cubicweb.pyramid:debug_toolbar_templates/registry.dbtmako'
+
+    def __init__(self, request):
+        self.data = {'vreg': None}
+        subscribe_to_debug_channel("vreg", self.collect_vreg)
+
+    def collect_vreg(self, message):
+        self.data["vreg"] = message["vreg"]
+
+    def process_response(self, response):
+        unsubscribe_to_debug_channel("vreg", self.collect_vreg)
+
+
 class RQLDebugPanel(DebugPanel):
     """
     CubicWeb RQL debug panel
@@ -167,5 +190,6 @@
 
 def includeme(config):
     config.add_debugtoolbar_panel(CubicWebDebugPanel)
+    config.add_debugtoolbar_panel(RegistryDebugPanel)
     config.add_debugtoolbar_panel(RQLDebugPanel)
     config.add_debugtoolbar_panel(SQLDebugPanel)