Completed
Push — master ( 8124bf...d2c927 )
by Bertrand
01:15
created

CachalotPanel   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 51
rs 10
c 0
b 0
f 0
wmc 16

7 Methods

Rating   Name   Duplication   Size   Complexity  
B collect_invalidations() 0 18 7
A disable_instrumentation() 0 2 1
A enable_instrumentation() 0 2 1
A process_response() 0 2 1
A nav_subtitle() 0 6 3
A enabled() 0 8 2
A __init__() 0 3 1
1
# coding: utf-8
2
3
from __future__ import unicode_literals
4
from collections import defaultdict
5
from datetime import datetime
6
7
from debug_toolbar.panels import Panel
8
from django.apps import apps
9
from django.conf import settings
10
from django.core.cache import cache
11
from django.utils.translation import ugettext_lazy as _
12
from django.utils.timesince import timesince
13
14
from .utils import _get_table_cache_key
15
16
17
class CachalotPanel(Panel):
18
    title = 'Cachalot'
19
    template = 'cachalot/panel.html'
20
21
    def __init__(self, *args, **kwargs):
22
        self.last_invalidation = None
23
        super(CachalotPanel, self).__init__(*args, **kwargs)
24
25
    @property
26
    def enabled(self):
27
        enabled = super(CachalotPanel, self).enabled
28
        if enabled:
29
            self.enable_instrumentation()
30
        else:
31
            self.disable_instrumentation()
32
        return enabled
33
34
    def enable_instrumentation(self):
35
        settings.CACHALOT_ENABLED = True
36
37
    def disable_instrumentation(self):
38
        settings.CACHALOT_ENABLED = False
39
40
    def process_response(self, request, response):
41
        self.collect_invalidations()
42
43
    def collect_invalidations(self):
44
        models = apps.get_models()
45
        data = defaultdict(list)
46
        for db_alias in settings.DATABASES:
47
            model_cache_keys = dict(
48
                [(_get_table_cache_key(db_alias, model._meta.db_table), model)
49
                 for model in models])
50
            for cache_key, timestamp in cache.get_many(
51
                    model_cache_keys.keys()).items():
52
                invalidation = datetime.fromtimestamp(timestamp)
53
                model = model_cache_keys[cache_key]
54
                data[db_alias].append(
55
                    (model._meta.app_label, model.__name__, invalidation))
56
                if self.last_invalidation is None \
57
                        or invalidation > self.last_invalidation:
58
                    self.last_invalidation = invalidation
59
            data[db_alias].sort(key=lambda row: row[2], reverse=True)
60
        self.record_stats({'invalidations_per_db': data.items()})
61
62
    @property
63
    def nav_subtitle(self):
64
        if self.enabled and self.last_invalidation is not None:
65
            return (_('Last invalidation: %s')
66
                    % timesince(self.last_invalidation))
67
        return ''
68