cubicweb/pyramid/debugtoolbar_panels.py
changeset 12768 7d2c61d40fe9
parent 12766 682d0790997f
child 12776 3cbcbaead477
--- a/cubicweb/pyramid/debugtoolbar_panels.py	Wed Nov 20 20:46:45 2019 +0100
+++ b/cubicweb/pyramid/debugtoolbar_panels.py	Thu Sep 12 05:59:10 2019 +0200
@@ -54,6 +54,59 @@
         unsubscribe_to_debug_channel("controller", self.collect_controller)
 
 
+class RegistryDecisionsDebugPanel(DebugPanel):
+    """
+    CubicWeb registry decisions debug panel
+    """
+
+    name = 'RegistryDecisions'
+    title = 'Registry Decisions'
+    nav_title = 'Registry Decisions'
+
+    has_content = True
+    template = 'cubicweb.pyramid:debug_toolbar_templates/registry_decisions.dbtmako'
+
+    def __init__(self, request):
+        # clear on every new response
+        self.data = {
+            'registry_decisions': [],
+            'vreg': None,
+            'highlight': highlight_html,
+            'generate_css': generate_css,
+        }
+
+        subscribe_to_debug_channel("vreg", self.collect_vreg)
+        subscribe_to_debug_channel("registry_decisions", self.collect_registry_decisions)
+
+    def collect_vreg(self, message):
+        self.data["vreg"] = message["vreg"]
+
+    def collect_registry_decisions(self, decision):
+        # decision = {
+        #     "all_objects": [],
+        #     "end_score": int,
+        #     "winners": [],
+        #     "registry": obj,
+        #     "args": args,
+        #     "kwargs": kwargs,
+        # }
+        decision["key"] = None
+        self.data["registry_decisions"].append(decision)
+
+    def link_registry_to_their_key(self):
+        if self.data["vreg"]:
+            # use "id" here to be hashable
+            registry_to_key = {id(registry): key for key, registry in self.data["vreg"].items()}
+            for decision in self.data["registry_decisions"]:
+                decision["key"] = registry_to_key.get(id(decision["self"]))
+
+    def process_response(self, response):
+        unsubscribe_to_debug_channel("registry_decisions", self.collect_registry_decisions)
+        unsubscribe_to_debug_channel("vreg", self.collect_vreg)
+
+        self.link_registry_to_their_key()
+
+
 class RegistryDebugPanel(DebugPanel):
     """
     CubicWeb registry content and decisions debug panel
@@ -190,6 +243,7 @@
 
 def includeme(config):
     config.add_debugtoolbar_panel(CubicWebDebugPanel)
+    config.add_debugtoolbar_panel(RegistryDecisionsDebugPanel)
     config.add_debugtoolbar_panel(RegistryDebugPanel)
     config.add_debugtoolbar_panel(RQLDebugPanel)
     config.add_debugtoolbar_panel(SQLDebugPanel)