Fix up visualisation code to match the RealDict database changes

Change-Id: I5ced3a97118d3bc9a083355895ad4703c7ee2b55
diff --git a/visualisation/visualisation.py b/visualisation/visualisation.py
index e1ca9e8..eb1edcd 100644
--- a/visualisation/visualisation.py
+++ b/visualisation/visualisation.py
@@ -133,7 +133,7 @@
         vlan_tags = {}
 
         for vlan in vlans:
-            vlan_tags[vlan.vlan_id] = vlan.tag
+            vlan_tags[vlan['vlan_id']] = vlan['tag']
 
         if cache.last_update < self.server.state.db.get_last_modified_time():
             logging.debug('Cache is out of date')
@@ -143,7 +143,7 @@
             cache.graphics = {}
             if len(switches) > 0:
                 for vlan in vlans:
-                    cache.graphics[vlan.vlan_id] = self.generate_graphic(vlan.vlan_id)
+                    cache.graphics[vlan['vlan_id']] = self.generate_graphic(vlan['vlan_id'])
             cache.last_update = datetime.datetime.utcnow()
 
         page = []
@@ -165,7 +165,7 @@
             page.append('<p>VLANs: %d</p>' % len(vlans))
             page.append('<ul>')
             for vlan in vlans:
-                page.append('<li><a href="./#vlan%d">VLAN ID %d, Tag %d<br>(%s)</a>' % (vlan.vlan_id, vlan.vlan_id, vlan.tag, vlan.name))
+                page.append('<li><a href="./#vlan%d">VLAN ID %d, Tag %d<br>(%s)</a>' % (vlan['vlan_id'], vlan['vlan_id'], vlan['tag'], vlan['name']))
             page.append('</ul>')
         page.append('<div class="date"><p>Current time: %s</p>' % datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC"))
         page.append('<p>version %s</p>' % self.server.state.version)
@@ -202,19 +202,19 @@
 
         # For each VLAN, add a graphic
         for vlan in vlans:
-            this_image = cache.graphics[vlan.vlan_id]
-            page.append('<a name="vlan%d"></a>' % vlan.vlan_id)
-            page.append('<h3>VLAN ID %d, Tag %d, name %s</h3>' % (vlan.vlan_id, vlan.tag, vlan.name))
+            this_image = cache.graphics[vlan['vlan_id']]
+            page.append('<a name="vlan%d"></a>' % vlan['vlan_id'])
+            page.append('<h3>VLAN ID %d, Tag %d, name %s</h3>' % (vlan['vlan_id'], vlan['tag'], vlan['name']))
 
             # Link to an image we generate from our data
-            page.append('<p><img src="images/vlan/%d.png" ' % vlan.vlan_id)
+            page.append('<p><img src="images/vlan/%d.png" ' % vlan['vlan_id'])
             page.append('width="%d" height="%d" ' % ( this_image['image']['width'], this_image['image']['height']))
-            page.append('alt="VLAN %d diagram" usemap="#MAPVLAN%d">' % (vlan.vlan_id,vlan.vlan_id))
+            page.append('alt="VLAN %d diagram" usemap="#MAPVLAN%d">' % (vlan['vlan_id'],vlan['vlan_id']))
 
             # Generate an imagemap describing all the ports, with
             # javascript hooks to pop up/down a tooltip box based on
             # later data.
-            page.append('<map name="MAPVLAN%d">' % vlan.vlan_id)
+            page.append('<map name="MAPVLAN%d">' % vlan['vlan_id'])
             for switch in this_image['ports'].keys():
                 for portnum in this_image['ports'][switch].keys():
                     this_port = this_image['ports'][switch][portnum]
@@ -222,7 +222,7 @@
                     ((ulx,uly),(lrx,lry),upper) = this_port['location']
                     page.append('<area shape="rect" ')
                     page.append('coords="%d,%d,%d,%d" ' % (ulx,uly,lrx,lry))
-                    page.append('onMouseOver="popup(%d,%d)" onMouseOut="popdown(%d,%d)">' % (vlan.vlan_id, port.port_id, vlan.vlan_id, port.port_id))
+                    page.append('onMouseOver="popup(%d,%d)" onMouseOut="popdown(%d,%d)">' % (vlan['vlan_id'], port['port_id'], vlan['vlan_id'], port['port_id']))
             page.append('</map></p>')
             page.append('<hr>')
         page.append('</div>') # End of normal content, all the VLAN graphics shown
@@ -231,31 +231,31 @@
         # fully-formed but invisible, ready for our javascript helper
         # to pop visible on demand.
         for vlan in vlans:
-            this_image = cache.graphics[vlan.vlan_id]
+            this_image = cache.graphics[vlan['vlan_id']]
             for switch in this_image['ports'].keys():
                 for portnum in this_image['ports'][switch].keys():
                     this_port = this_image['ports'][switch][portnum]
                     port = this_port['db']
-                    page.append('<div class="port" id="port%d.%d">' % (vlan.vlan_id, port.port_id))
-                    page.append('Port ID: %d<br>' % port.port_id)
-                    page.append('Port Number: %d<br>' % port.number)
-                    page.append('Port Name: %s<br>' % port.name)
-                    if port.is_locked:
+                    page.append('<div class="port" id="port%d.%d">' % (vlan['vlan_id'], port['port_id']))
+                    page.append('Port ID: %d<br>' % port['port_id'])
+                    page.append('Port Number: %d<br>' % port['number'])
+                    page.append('Port Name: %s<br>' % port['name'])
+                    if port['is_locked']:
                         page.append('Locked - ')
-                        if (port.lock_reason is not None
-                                and len(port.lock_reason) > 1):
-                            page.append(port.lock_reason)
+                        if (port['lock_reason'] is not None
+                                and len(port['lock_reason']) > 1):
+                            page.append(port['lock_reason'])
                         else:
                             page.append('unknown reason')
                         page.append('<br>')
-                    if port.is_trunk:
+                    if port['is_trunk']:
                         page.append('Trunk')
-                        if port.trunk_id != -1:
-                            page.append(' (Trunk ID %d)' % port.trunk_id)
+                        if port['trunk_id'] != -1:
+                            page.append(' (Trunk ID %d)' % port['trunk_id'])
                         page.append('<br>')
                     else:
-                        page.append('Current VLAN ID: %d (Tag %d)<br>' % (port.current_vlan_id, vlan_tags[port.current_vlan_id]))
-                        page.append('Base VLAN ID: %d (Tag %d)<br>' % (port.base_vlan_id, vlan_tags[port.base_vlan_id]))
+                        page.append('Current VLAN ID: %d (Tag %d)<br>' % (port['current_vlan_id'], vlan_tags[port['current_vlan_id']]))
+                        page.append('Base VLAN ID: %d (Tag %d)<br>' % (port['base_vlan_id'], vlan_tags[port['base_vlan_id']]))
                     page.append('</div>')
 
         page.append('</body>')
@@ -406,14 +406,14 @@
 
         # Work out how much space we need for the switches
         for i in range(0, len(switches)):
-            ports = db.get_ports_by_switch(switches[i].switch_id)
-            switch[i] = Switch(gim, len(ports), switches[i].name)
+            ports = db.get_ports_by_switch(switches[i]['switch_id'])
+            switch[i] = Switch(gim, len(ports), switches[i]['name'])
             (size_x[i], size_y[i]) = switch[i].get_dimensions()
             x = max(x, size_x[i])
             y += size_y[i] + y_gap
 
         # Add space for the legend and the label
-        label = "VLAN %d - %s" % (vlan.tag, vlan.name)
+        label = "VLAN %d - %s" % (vlan['tag'], vlan['name'])
         (legend_width, legend_height) = gim.get_legend_dimensions()
         (label_width, label_height) = gim.get_label_size(label, gim.label_font_size)
         x = max(x, legend_width + 2*x_gap + label_width)
@@ -427,37 +427,37 @@
         curr_y = y_gap
         for i in range(0, len(switches)):
             switch[i].draw_switch(gim, x_gap, curr_y)
-            ports = db.get_ports_by_switch(switches[i].switch_id)
+            ports = db.get_ports_by_switch(switches[i]['switch_id'])
             data['ports'][i] = {}
             for port_id in ports:
                 port = db.get_port_by_id(port_id)
-                port_location = switch[i].get_port_location(port.number)
-                data['ports'][i][port.number] = {}
-                data['ports'][i][port.number]['db'] = port
-                data['ports'][i][port.number]['location'] = port_location
-                if port.is_locked:
-                    switch[i].draw_port(gim, port.number, 'locked')
-                elif port.is_trunk:
-                    switch[i].draw_port(gim, port.number, 'trunk')
-                elif port.current_vlan_id == int(vlan_id):
-                    switch[i].draw_port(gim, port.number, 'VLAN')
+                port_location = switch[i].get_port_location(port['number'])
+                data['ports'][i][port['number']] = {}
+                data['ports'][i][port['number']]['db'] = port
+                data['ports'][i][port['number']]['location'] = port_location
+                if port['is_locked']:
+                    switch[i].draw_port(gim, port['number'], 'locked')
+                elif port['is_trunk']:
+                    switch[i].draw_port(gim, port['number'], 'trunk')
+                elif port['current_vlan_id'] == int(vlan_id):
+                    switch[i].draw_port(gim, port['number'], 'VLAN')
                 else:
-                    switch[i].draw_port(gim, port.number, 'normal')
+                    switch[i].draw_port(gim, port['number'], 'normal')
             curr_y += size_y[i] + y_gap
 
         # Now add the trunks
         for i in range(0, len(trunks)):
-            ports = db.get_ports_by_trunk(trunks[i].trunk_id)
+            ports = db.get_ports_by_trunk(trunks[i]['trunk_id'])
             port1 = db.get_port_by_id(ports[0])
             port2 = db.get_port_by_id(ports[1])
             for s in range(0, len(switches)):
-                if switches[s].switch_id == port1.switch_id:
+                if switches[s]['switch_id'] == port1['switch_id']:
                     switch1 = s
-                if switches[s].switch_id == port2.switch_id:
+                if switches[s]['switch_id'] == port2['switch_id']:
                     switch2 = s
             gim.draw_trunk(i,
-                           switch[switch1].get_port_location(port1.number),
-                           switch[switch2].get_port_location(port2.number),
+                           switch[switch1].get_port_location(port1['number']),
+                           switch[switch2].get_port_location(port2['number']),
                            gim.port_pallette['trunk']['trace'])
 
         # And the legend and label