1
- import pydot
1
+ import graphviz
2
2
from rest_framework import generics
3
3
from rest_framework .views import APIView
4
4
import tempfile
@@ -49,32 +49,30 @@ def get(self, request, slug):
49
49
tmap = get_object_or_404 (TopologyMap , slug = slug )
50
50
51
51
# Construct the graph
52
- graph = pydot .Dot (graph_type = 'graph' , ranksep = '1' )
52
+ graph = graphviz .Graph ()
53
+ graph .graph_attr ['ranksep' ] = '1'
53
54
for i , device_set in enumerate (tmap .device_sets ):
54
55
55
- subgraph = pydot .Subgraph ('sg{}' .format (i ), rank = 'same' )
56
+ subgraph = graphviz .Graph (name = 'sg{}' .format (i ))
57
+ subgraph .graph_attr ['rank' ] = 'same'
56
58
57
59
# Add a pseudonode for each device_set to enforce hierarchical layout
58
- subgraph .add_node ( pydot . Node ( 'set{}' .format (i ), shape = 'none ' , width = '0 ' , label = '' ) )
60
+ subgraph .node ( 'set{}' .format (i ), label = ' ' , shape = 'none ' , width = '0' )
59
61
if i :
60
- graph .add_edge ( pydot . Edge ( 'set{}' .format (i - 1 ), 'set{}' .format (i ), style = 'invis' ) )
62
+ graph .edge ( 'set{}' .format (i - 1 ), 'set{}' .format (i ), style = 'invis' )
61
63
62
64
# Add each device to the graph
63
65
devices = []
64
66
for query in device_set .split (',' ):
65
67
devices += Device .objects .filter (name__regex = query )
66
68
for d in devices :
67
- node = pydot .Node (d .name )
68
- subgraph .add_node (node )
69
+ subgraph .node (d .name )
69
70
70
71
# Add an invisible connection to each successive device in a set to enforce horizontal order
71
72
for j in range (0 , len (devices ) - 1 ):
72
- edge = pydot .Edge (devices [j ].name , devices [j + 1 ].name )
73
- # edge.set('style', 'invis') doesn't seem to work for some reason
74
- edge .set_style ('invis' )
75
- subgraph .add_edge (edge )
73
+ subgraph .edge (devices [j ].name , devices [j + 1 ].name , style = 'invis' )
76
74
77
- graph .add_subgraph (subgraph )
75
+ graph .subgraph (subgraph )
78
76
79
77
# Compile list of all devices
80
78
device_superset = Q ()
@@ -87,17 +85,14 @@ def get(self, request, slug):
87
85
connections = InterfaceConnection .objects .filter (interface_a__device__in = devices ,
88
86
interface_b__device__in = devices )
89
87
for c in connections :
90
- edge = pydot .Edge (c .interface_a .device .name , c .interface_b .device .name )
91
- graph .add_edge (edge )
88
+ graph .edge (c .interface_a .device .name , c .interface_b .device .name )
92
89
93
- # Write the image to disk and return
94
- topo_file = tempfile .NamedTemporaryFile ()
90
+ # Get the image data and return
95
91
try :
96
- graph .write ( topo_file . name , format = 'png' )
92
+ topo_data = graph .pipe ( format = 'png' )
97
93
except :
98
94
return HttpResponse ("There was an error generating the requested graph. Ensure that the GraphViz "
99
95
"executables have been installed correctly." )
100
- response = HttpResponse (FileWrapper (topo_file ), content_type = 'image/png' )
101
- topo_file .close ()
96
+ response = HttpResponse (topo_data , content_type = 'image/png' )
102
97
103
98
return response
0 commit comments