From 2ac58050baf14365f796071a192df0c4b7fce1cc Mon Sep 17 00:00:00 2001 From: Matthias Kestenholz Date: Tue, 22 Dec 2020 10:15:15 +0100 Subject: [PATCH 1/3] Really ugly work in progress hack to fix tests on Django@master --- debug_toolbar/panels/cache.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index bfaf7018b..4a757c28f 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -130,13 +130,20 @@ def decr_version(self, *args, **kwargs): return self.cache.decr_version(*args, **kwargs) -class CacheHandlerPatch(CacheHandler): - def __getitem__(self, alias): - actual_cache = super().__getitem__(alias) - return CacheStatTracker(actual_cache) +# class CacheHandlerPatch(CacheHandler): +# def ____getitem__(self, alias): +# actual_cache = super().__getitem__(alias) +# return CacheStatTracker(actual_cache) +# +# def create_connection(self, alias): +# return CacheStatTracker(super().create_connection(alias)) +# +# +# middleware_cache.caches = CacheHandlerPatch() -middleware_cache.caches = CacheHandlerPatch() +original_caches._original_create_connection = original_caches.create_connection +original_caches.create_connection = lambda alias: CacheStatTracker(original_caches._original_create_connection(alias)) class CachePanel(Panel): @@ -241,12 +248,14 @@ def title(self): ) def enable_instrumentation(self): + return if isinstance(middleware_cache.caches, CacheHandlerPatch): cache.caches = middleware_cache.caches else: cache.caches = CacheHandlerPatch() def disable_instrumentation(self): + return cache.caches = original_caches # While it can be restored to the original, any views that were # wrapped with the cache_page decorator will continue to use a From 430673488290ce146d748fc3a5c75220bcbcb8a8 Mon Sep 17 00:00:00 2001 From: Tim Schilling Date: Sat, 2 Jan 2021 13:08:47 -0600 Subject: [PATCH 2/3] Attempt fix for cache panel and django master. --- debug_toolbar/panels/cache.py | 36 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index 4a757c28f..607b637ae 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -5,7 +5,12 @@ from django.conf import settings from django.core import cache -from django.core.cache import CacheHandler, caches as original_caches +from django.core.cache import ( + DEFAULT_CACHE_ALIAS, + CacheHandler, + cache as original_cache, + caches as original_caches, +) from django.core.cache.backends.base import BaseCache from django.dispatch import Signal from django.middleware import cache as middleware_cache @@ -130,20 +135,12 @@ def decr_version(self, *args, **kwargs): return self.cache.decr_version(*args, **kwargs) -# class CacheHandlerPatch(CacheHandler): -# def ____getitem__(self, alias): -# actual_cache = super().__getitem__(alias) -# return CacheStatTracker(actual_cache) -# -# def create_connection(self, alias): -# return CacheStatTracker(super().create_connection(alias)) -# -# -# middleware_cache.caches = CacheHandlerPatch() +class CacheHandlerPatch(CacheHandler): + def create_connection(self, alias): + return CacheStatTracker(super().create_connection(alias)) -original_caches._original_create_connection = original_caches.create_connection -original_caches.create_connection = lambda alias: CacheStatTracker(original_caches._original_create_connection(alias)) +middleware_cache.caches = CacheHandlerPatch() class CachePanel(Panel): @@ -248,19 +245,18 @@ def title(self): ) def enable_instrumentation(self): - return - if isinstance(middleware_cache.caches, CacheHandlerPatch): - cache.caches = middleware_cache.caches - else: - cache.caches = CacheHandlerPatch() + if not isinstance(middleware_cache.caches, CacheHandlerPatch): + middleware_cache.caches = CacheHandlerPatch() + cache.caches = middleware_cache.caches + cache.cache = cache.caches[DEFAULT_CACHE_ALIAS] def disable_instrumentation(self): - return - cache.caches = original_caches # While it can be restored to the original, any views that were # wrapped with the cache_page decorator will continue to use a # monkey patched cache. middleware_cache.caches = original_caches + cache.caches = original_caches + cache.cache = original_cache def generate_stats(self, request, response): self.record_stats( From 78bcb9358bebd553803c5a3ccca2696f2b6f4ba0 Mon Sep 17 00:00:00 2001 From: Tim Schilling Date: Sat, 2 Jan 2021 13:17:01 -0600 Subject: [PATCH 3/3] Handle the case of existing caches not being wrapped. --- debug_toolbar/panels/cache.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index 607b637ae..e23366e37 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -136,6 +136,14 @@ def decr_version(self, *args, **kwargs): class CacheHandlerPatch(CacheHandler): + def __getitem__(self, alias): + actual_cache = super().__getitem__(alias) + return ( + actual_cache + if isinstance(actual_cache, CacheStatTracker) + else CacheStatTracker(actual_cache) + ) + def create_connection(self, alias): return CacheStatTracker(super().create_connection(alias))