6
6
from django .templatetags .static import static
7
7
from django .urls import reverse
8
8
from django .utils .translation import ugettext_lazy as _
9
+
9
10
from openwisp_utils .admin import ReceiveUrlAdmin
10
11
11
12
from .. import settings as app_settings
@@ -17,25 +18,35 @@ class TimeStampedEditableAdmin(ModelAdmin):
17
18
"""
18
19
ModelAdmin for TimeStampedEditableModel
19
20
"""
21
+
20
22
def __init__ (self , * args , ** kwargs ):
21
- self .readonly_fields += ('created' , 'modified' ,)
23
+ self .readonly_fields += (
24
+ 'created' ,
25
+ 'modified' ,
26
+ )
22
27
super ().__init__ (* args , ** kwargs )
23
28
24
29
25
30
class BaseAdmin (TimeStampedEditableAdmin ):
26
31
save_on_top = True
27
32
28
33
class Media :
29
- css = {'all' : [static ('netjsongraph/css/src/netjsongraph.css' ),
30
- static ('netjsongraph/css/lib/jquery-ui.min.css' ),
31
- static ('netjsongraph/css/style.css' ),
32
- static ('netjsongraph/css/admin.css' )]}
33
- js = [static ('netjsongraph/js/lib/d3.min.js' ),
34
- static ('netjsongraph/js/lib/jquery-ui.min.js' ),
35
- static ('netjsongraph/js/src/netjsongraph.js' ),
36
- static ('netjsongraph/js/strategy-switcher.js' ),
37
- static ('netjsongraph/js/topology-history.js' ),
38
- static ('netjsongraph/js/visualize.js' )]
34
+ css = {
35
+ 'all' : [
36
+ static ('netjsongraph/css/src/netjsongraph.css' ),
37
+ static ('netjsongraph/css/lib/jquery-ui.min.css' ),
38
+ static ('netjsongraph/css/style.css' ),
39
+ static ('netjsongraph/css/admin.css' ),
40
+ ]
41
+ }
42
+ js = [
43
+ static ('netjsongraph/js/lib/d3.min.js' ),
44
+ static ('netjsongraph/js/lib/jquery-ui.min.js' ),
45
+ static ('netjsongraph/js/src/netjsongraph.js' ),
46
+ static ('netjsongraph/js/strategy-switcher.js' ),
47
+ static ('netjsongraph/js/topology-history.js' ),
48
+ static ('netjsongraph/js/visualize.js' ),
49
+ ]
39
50
40
51
41
52
class AbstractTopologyAdmin (BaseAdmin , ReceiveUrlAdmin , GraphVisualizerUrls ):
@@ -44,9 +55,21 @@ class AbstractTopologyAdmin(BaseAdmin, ReceiveUrlAdmin, GraphVisualizerUrls):
44
55
list_filter = ['parser' , 'strategy' ]
45
56
search_fields = ['label' , 'id' ]
46
57
actions = ['update_selected' , 'unpublish_selected' , 'publish_selected' ]
47
- fields = ['label' , 'parser' , 'strategy' , 'url' , 'key' ,
48
- 'expiration_time' , 'receive_url' , 'published' , 'protocol' ,
49
- 'version' , 'revision' , 'metric' , 'created' ]
58
+ fields = [
59
+ 'label' ,
60
+ 'parser' ,
61
+ 'strategy' ,
62
+ 'url' ,
63
+ 'key' ,
64
+ 'expiration_time' ,
65
+ 'receive_url' ,
66
+ 'published' ,
67
+ 'protocol' ,
68
+ 'version' ,
69
+ 'revision' ,
70
+ 'metric' ,
71
+ 'created' ,
72
+ ]
50
73
receive_url_name = 'receive_topology'
51
74
receive_url_urlconf = app_settings .TOPOLOGY_API_URLCONF
52
75
receive_url_baseurl = app_settings .TOPOLOGY_API_BASEURL
@@ -63,35 +86,45 @@ def get_actions(self, request):
63
86
64
87
def change_view (self , request , object_id , form_url = '' , extra_context = None ):
65
88
extra_context = extra_context or {}
66
- prefix = 'admin:{0}_{1}' .format (self .opts .app_label , self .model .__name__ .lower ())
89
+ prefix = 'admin:{0}_{1}' .format (
90
+ self .opts .app_label , self .model .__name__ .lower ()
91
+ )
67
92
text = _ ('View topology graph' )
68
- extra_context .update ({
69
- 'additional_buttons' : [
70
- {
71
- 'type' : 'button' ,
72
- 'url' : reverse ('{0}_visualize' .format (prefix ), args = [object_id ]),
73
- 'class' : 'visualizelink' ,
74
- 'value' : text ,
75
- 'title' : '{0} (ALT+P)' .format (text )
76
- }
77
- ]
78
- })
93
+ extra_context .update (
94
+ {
95
+ 'additional_buttons' : [
96
+ {
97
+ 'type' : 'button' ,
98
+ 'url' : reverse (
99
+ '{0}_visualize' .format (prefix ), args = [object_id ]
100
+ ),
101
+ 'class' : 'visualizelink' ,
102
+ 'value' : text ,
103
+ 'title' : '{0} (ALT+P)' .format (text ),
104
+ }
105
+ ]
106
+ }
107
+ )
79
108
return super ().change_view (request , object_id , form_url , extra_context )
80
109
81
110
def get_urls (self ):
82
111
options = getattr (self .model , '_meta' )
83
112
url_prefix = '{0}_{1}' .format (options .app_label , options .model_name )
84
113
return [
85
- url (r'^visualize/(?P<pk>[^/]+)/$' ,
114
+ url (
115
+ r'^visualize/(?P<pk>[^/]+)/$' ,
86
116
self .admin_site .admin_view (self .visualize_view ),
87
- name = '{0}_visualize' .format (url_prefix )),
117
+ name = '{0}_visualize' .format (url_prefix ),
118
+ ),
88
119
] + super ().get_urls ()
89
120
90
121
def _message (self , request , rows , suffix , level = messages .SUCCESS ):
91
122
if rows == 1 :
92
123
prefix = _ ('1 {0} was' .format (self .model ._meta .verbose_name ))
93
124
else : # pragma: nocover
94
- prefix = _ ('{0} {1} were' .format (rows , self .model ._meta .verbose_name_plural ))
125
+ prefix = _ (
126
+ '{0} {1} were' .format (rows , self .model ._meta .verbose_name_plural )
127
+ )
95
128
self .message_user (request , '{0} {1}' .format (prefix , suffix ), level = level )
96
129
97
130
def update_selected (self , request , queryset ):
@@ -123,31 +156,40 @@ def update_selected(self, request, queryset):
123
156
if total_ignored > 0 :
124
157
message = _ ("ignored (not using FETCH strategy)" )
125
158
self ._message (request , total_ignored , message , level = messages .WARNING )
126
- update_selected .short_description = _ ('Update selected topologies (FETCH strategy only)' )
159
+
160
+ update_selected .short_description = _ (
161
+ 'Update selected topologies (FETCH strategy only)'
162
+ )
127
163
128
164
def publish_selected (self , request , queryset ):
129
165
rows_updated = queryset .update (published = True )
130
166
self ._message (request , rows_updated , _ ('successfully published' ))
167
+
131
168
publish_selected .short_description = _ ('Publish selected topologies' )
132
169
133
170
def unpublish_selected (self , request , queryset ):
134
171
rows_updated = queryset .update (published = False )
135
172
self ._message (request , rows_updated , _ ('successfully unpublished' ))
173
+
136
174
unpublish_selected .short_description = _ ('Unpublish selected items' )
137
175
138
176
def visualize_view (self , request , pk ):
139
177
graph_url , history_url = self .get_graph_urls (request , pk )
140
178
context = self .admin_site .each_context (request )
141
179
opts = self .model ._meta
142
- context .update ({
143
- 'is_popup' : True ,
144
- 'opts' : opts ,
145
- 'change' : False ,
146
- 'media' : self .media ,
147
- 'graph_url' : graph_url ,
148
- 'history_url' : history_url
149
- })
150
- return TemplateResponse (request , 'admin/%s/visualize.html' % opts .app_label , context )
180
+ context .update (
181
+ {
182
+ 'is_popup' : True ,
183
+ 'opts' : opts ,
184
+ 'change' : False ,
185
+ 'media' : self .media ,
186
+ 'graph_url' : graph_url ,
187
+ 'history_url' : history_url ,
188
+ }
189
+ )
190
+ return TemplateResponse (
191
+ request , 'admin/%s/visualize.html' % opts .app_label , context
192
+ )
151
193
152
194
153
195
class AbstractNodeAdmin (BaseAdmin ):
@@ -159,16 +201,14 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
159
201
extra_context = extra_context or {}
160
202
link_model = self .model .source_link_set .field .model
161
203
admin_url = 'admin:{0}_link_change' .format (self .opts .app_label )
162
- extra_context .update ({
163
- 'node_links' : link_model .objects .select_related ('source' , 'target' )
164
- .only ('source__label' ,
165
- 'target__label' ,
166
- 'cost' ,
167
- 'status' )
168
- .filter (Q (source_id = object_id ) |
169
- Q (target_id = object_id )),
170
- 'admin_url' : admin_url
171
- })
204
+ extra_context .update (
205
+ {
206
+ 'node_links' : link_model .objects .select_related ('source' , 'target' )
207
+ .only ('source__label' , 'target__label' , 'cost' , 'status' )
208
+ .filter (Q (source_id = object_id ) | Q (target_id = object_id )),
209
+ 'admin_url' : admin_url ,
210
+ }
211
+ )
172
212
return super ().change_view (request , object_id , form_url , extra_context )
173
213
174
214
0 commit comments