Completed
Pull Request — master (#26)
by
unknown
01:23
created

RedisServerAdmin.details()   A

Complexity

Conditions 4

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
cc 4
c 3
b 0
f 1
dl 0
loc 8
rs 9.2
1
# vim: set fileencoding=utf-8 :
2
from functools import update_wrapper
3
4
from django.contrib import admin
5
from django.core.urlresolvers import reverse
6
from django.http import HttpResponseForbidden
7
from django.shortcuts import get_object_or_404
8
from django.utils.translation import ugettext_lazy as _
9
10
from .models import RedisServer
11
from .views import inspect
12
from .utils import PY3
13
14
if PY3:
15
    unicode = str
16
17
18
class RedisServerAdmin(admin.ModelAdmin):
19
    class Media:
20
        css = {
21
            'all': ('redisboard/admin.css',)
22
        }
23
24
    list_display = (
25
        '__unicode__',
26
        'status',
27
        'memory',
28
        'clients',
29
        'details',
30
        'cpu_utilization',
31
        'slowlog',
32
        'tools',
33
    )
34
35
    list_filter = 'label', 'hostname'
36
    ordering = ('hostname', 'port')
37
38
    def slowlog(self, obj):
39
        output = [(float('inf'), 'Total: %d items' % obj.stats['slowlog_len'])]
40
        for log in obj.stats['slowlog']:
41
            command = log['command']
42
43
            if len(command) > 255:
44
                command = command[:252] + '...'
45
46
            output.append((
47
                log['duration'],
48
                u'%.1fms: %s' % (log['duration'] / 1000., command),
49
            ))
50
        if output:
51
            return '<br>'.join(l for _, l in sorted(output, reverse=True))
52
        else:
53
            return 'n/a'
54
    slowlog.allow_tags = True
55
    slowlog.long_description = _('Slowlog')
56
57
    def status(self, obj):
58
        return obj.stats['status']
59
    status.long_description = _("Status")
60
61
    def memory(self, obj):
62
        return obj.stats['memory']
63
    memory.long_description = _("Memory")
64
65
    def clients(self, obj):
66
        return obj.stats['clients']
67
    clients.long_description = _("Clients")
68
69
    def tools(self, obj):
70
        return '<a href="%s">%s</a>' % (
71
            reverse("admin:redisboard_redisserver_inspect", args=(obj.id,)),
72
            unicode(_("Inspect"))
73
        )
74
    tools.allow_tags = True
75
    tools.long_description = _("Tools")
76
77
    def details(self, obj):
78
        output = []
79
        brief_details = obj.stats['brief_details']
80
        for k, v in (brief_details.items() if PY3 else brief_details.iteritems()):
81
            output.append('<dt>%s</dt><dd>%s</dd>' % (k, v))
82
        if output:
83
            return '<dl class="details">%s</dl>' % ''.join(output)
84
        return 'n/a'
85
    details.allow_tags = True
86
    details.long_description = _("Details")
87
88
    def cpu_utilization(self, obj):
89
        stats = obj.stats
90
        if stats['status'] != 'UP':
91
            return 'n/a'
92
93
        data = (
94
            'used_cpu_sys',
95
            'used_cpu_sys_children',
96
            'used_cpu_user',
97
            'used_cpu_user_children',
98
        )
99
        data = dict((k, stats['details'][k]) for k in data)
100
        total_cpu = sum(data.values() if PY3 else data.itervalues())
101
        uptime = stats['details']['uptime_in_seconds']
102
        data['cpu_utilization'] = '%.3f%%' % (total_cpu / uptime if uptime else 0)
103
104
        data = sorted(data.items())
105
106
        output = []
107
        for k, v in data:
108
            k = k.replace('_', ' ')
109
            output.append('<dt>%s</dt><dd>%s</dd>' % (k, v))
110
111
        return '<dl class="details">%s</dl>' % ''.join(output)
112
    cpu_utilization.allow_tags = True
113
    cpu_utilization.long_description = _('CPU Utilization')
114
115
    def get_urls(self):
116
        urlpatterns = super(RedisServerAdmin, self).get_urls()
117
        try:
118
            from django.conf.urls import url
119
        except ImportError:
120
            from django.conf.urls.defaults import url
121
122
        def wrap(view):
123
            def wrapper(*args, **kwargs):
124
                return self.admin_site.admin_view(view)(*args, **kwargs)
125
126
            return update_wrapper(wrapper, view)
127
128
        return [url(r'^(\d+)/inspect/$',
129
                    wrap(self.inspect_view),
130
                    name='redisboard_redisserver_inspect')
131
                ] + urlpatterns
132
133
    def inspect_view(self, request, server_id):
134
        server = get_object_or_404(RedisServer, id=server_id)
135
        if (
136
            self.has_change_permission(request, server) and
137
            request.user.has_perm('redisboard.can_inspect')
138
        ):
139
            return inspect(request, server)
140
        else:
141
            return HttpResponseForbidden("You can't inspect this server.")
142
143
144
admin.site.register(RedisServer, RedisServerAdmin)
145