many changes to xoslib test
diff --git a/planetstack/core/xoslib/dashboards/test.html b/planetstack/core/xoslib/dashboards/test.html
index 5326b76..cc539ce 100644
--- a/planetstack/core/xoslib/dashboards/test.html
+++ b/planetstack/core/xoslib/dashboards/test.html
@@ -12,43 +12,33 @@
 
 <p>This shows all of the things you can see using xosLib</p>
 
-<h3>Deployments</h3>
 <div id="deploymentList">
 </div>
 
-<h3>Images</h3>
 <div id="imageList">
 </div>
 
-<h3>Network Templates</h3>
 <div id="networkTemplateList">
 </div>
 
-<h3>Networks</h3>
 <div id="networkList">
 </div>
 
-<h3>Nodes</h3>
 <div id="nodeList">
 </div>
 
-<h3>Services</h3>
 <div id="serviceList">
 </div>
 
-<h3>Sites</h3>
 <div id="siteList">
 </div>
 
-<h3>Slices</h3>
 <div id="sliceList">
 </div>
 
-<h3>Slivers</h3>
 <div id="sliverList">
 </div>
 
-<h3>Users</h3>
 <div id="userList">
 </div>
 
@@ -63,6 +53,8 @@
 <div id="detail"></div>

 <div id="linkedObjs1"></div>
 <div id="linkedObjs2"></div>
+<div id="linkedObjs3"></div>
+<div id="linkedObjs4"></div>
 </div>
 </div>
 
@@ -87,6 +79,7 @@
 <!-- Deployment -->
 
 <script type="text/template" id="test-deployment-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -101,8 +94,8 @@
 
 
 <script type="text/template" id="test-deployment-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= backend_type %></td>
   <td><%= admin_tenant %></td>
   <td><%= sites.length %></td>
@@ -123,6 +116,7 @@
 <!-- Image -->
 
 <script type="text/template" id="test-image-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -136,8 +130,8 @@
 </script>
 
 <script type="text/template" id="test-image-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= disk_format %></td>
   <td><%= container_format %></td>
   <td><%= path %></td>
@@ -158,6 +152,7 @@
 <!-- NetworkTemplate -->
 
 <script type="text/template" id="test-networkTemplate-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -174,8 +169,8 @@
 
 
 <script type="text/template" id="test-networkTemplate-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= description %></td>
   <td><%= visibility %></td>
   <td><%= translation %></td>
@@ -201,6 +196,7 @@
 <!-- Network -->
 
 <script type="text/template" id="test-network-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -214,14 +210,13 @@
   </table>
 </script>
 
-
 <script type="text/template" id="test-network-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= template %></td>
   <td><%= ports %></td>
   <td><%= labels %></td>
-  <td><%= owner %></td>
+  <td><%= idToName(owner,"slivers","name") %></td>
 </script>
 
 <script type="text/template" id="test-network-detail-template">
@@ -238,9 +233,47 @@
   </form>

 </script>
 
+<!-- NetworkSliver -->
+
+<script type="text/template" id="test-networkSliver-list-template">
+  <h3><%= title %></h3>
+  <table class="test-table">
+  <thead><tr>
+     <th>id</th>
+     <th>network</th>
+     <th>sliver</th>
+     <th>ip</th>
+     <th>port_id</th>
+  </tr></thead>
+  <tbody></tbody>
+  </table>
+</script>
+
+<script type="text/template" id="test-networkSliver-listitem-template">
+  <td class="objectLink"><%= id %></td>
+  <td><%= idToName(network,"networks","name") %></td>
+  <td><%= idToName(sliver,"slivers","name") %></td>
+  <td><%= ip %></td>
+  <td><%= port_id %></td>
+</script>
+
+<script type="text/template" id="test-networkSliver-detail-template">
+  <h3>Detail View: Network</h3>
+  <form>

+  <table>

+  <tr><td>Network:</td><td><input type="text" name="network" value="<%= network %>"></td></tr>

+  <tr><td>Sliver:</td><td><input type="text" name="sliver" value="<%= sliver %>"></td></tr>

+  <tr><td>Ip:</td><td><input type="text" name="ip" value="<%= ip %>"></td></tr>

+  <tr><td>Port_id:</td><td><input type="text" name="port_id" value="<%= port_id %>"></td></tr>

+  <tr><td colspan=2><button class="btn js-submit">Save</button></td></tr>

+  </table>

+  </form>

+</script>
+
 <!-- Node -->
 
 <script type="text/template" id="test-node-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -254,10 +287,10 @@
 
 
 <script type="text/template" id="test-node-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
-  <td><%= site %></td>
-  <td><%= deployment %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
+  <td><%= idToName(site,"sites","name") %></td>
+  <td><%= idToName(deployment,"deployments","name") %></td>
 </script>
 
 <script type="text/template" id="test-node-detail-template">
@@ -272,9 +305,39 @@
   </form>

 </script>
 
+<!-- SliceRole -->
+
+<script type="text/template" id="test-sliceRole-list-template">
+  <h3><%= title %></h3>
+  <table class="test-table">
+  <thead><tr>
+     <th>id</th>
+     <th>role</th>
+  </tr></thead>
+  <tbody></tbody>
+  </table>
+</script>
+
+
+<script type="text/template" id="test-sliceRole-listitem-template">
+  <td class="objectLink"><%= id %></td>
+  <td><%= role %></td>
+</script>
+
+<script type="text/template" id="test-sliceRole-detail-template">
+  <h3>Detail View: Service</h3>
+  <form>

+  <table>

+  <tr><td>Role:</td><td><input type="text" name="role" value="<%= role %>"></td></tr>

+  <tr><td colspan=2><button class="btn js-submit">Save</button></td></tr>

+  </table>

+  </form>

+</script>
+
 <!-- Service -->
 
 <script type="text/template" id="test-service-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -290,8 +353,8 @@
 
 
 <script type="text/template" id="test-service-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= description %></td>
   <td><%= enabled %></td>
   <td><%= versionNumber %></td>
@@ -313,6 +376,7 @@
 <!-- Site -->
 
 <script type="text/template" id="test-site-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -327,10 +391,9 @@
   </table>
 </script>
 
-
 <script type="text/template" id="test-site-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= site_url %></td>
   <td><%= enabled %></td>
   <td><%= login_base %></td>
@@ -353,6 +416,7 @@
 <!-- Slice -->
 
 <script type="text/template" id="test-slice-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -370,15 +434,15 @@
 </script>
 
 <script type="text/template" id="test-slice-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= enabled %></td>
   <td><%= omf_friendly %></td>
   <td><%= description %></td>
   <td><%= slice_url %></td>
-  <td><%= site %></td>
+  <td><%= idToName(site,"sites","name") %></td>
   <td><%= max_slivers %></td>
-  <td><%= service %></td>
+  <td><%= idToName(service,"services","name") %></td>
 </script>
 
 <script type="text/template" id="test-slice-detail-template">
@@ -395,9 +459,78 @@
   </form>

 </script>
 
+<!-- SlicDeployment -->
+
+<script type="text/template" id="test-sliceDeployment-list-template">
+  <h3><%= title %></h3>
+  <table class="test-table">
+  <thead><tr>
+     <th>id</th>
+     <th>slice</th>
+     <th>deployment</th>
+     <th>tenant_id</th>
+  </tr></thead>
+  <tbody></tbody>
+  </table>
+</script>
+
+<script type="text/template" id="test-sliceDeployment-listitem-template">
+  <td class="objectLink"><%= id %></td>
+  <td><%= idToName(slice,"slices","name") %></td>
+  <td><%= idToName(deployment,"deployments","name") %></td>
+  <td><%= tenant_id %></td>
+</script>
+
+<script type="text/template" id="test-sliceDeployment-detail-template">
+  <h3>Detail View: Slice Deployment</h3>
+  <form>

+  <table>

+  <tr><td>Slice:</td><td><input type="text" name="slice" value="<%= slice %>"></td></tr>

+  <tr><td>Deployment:</td><td><input type="text" name="deployment" value="<%= deployment %>"></td></tr>

+  <tr><td>Tenant Id:</td><td><input type="text" name="tenant_id" value="<%= tenant_id %>"></td></tr>

+  <tr><td colspan=2><button class="btn js-submit">Save</button></td></tr>

+  </table>

+  </form>

+</script>
+
+<!-- SlicePrivilege -->
+
+<script type="text/template" id="test-slicePrivilege-list-template">
+  <h3><%= title %></h3>
+  <table class="test-table">
+  <thead><tr>
+     <th>id</th>
+     <th>user</th>
+     <th>slice</th>
+     <th>role</th>
+  </tr></thead>
+  <tbody></tbody>
+  </table>
+</script>
+
+<script type="text/template" id="test-slicePrivilege-listitem-template">
+  <td class="objectLink"><%= id %></td>
+  <td><%= idToName(user,"users","username") %></td>
+  <td><%= idToName(slice,"slices","name") %></td>
+  <td><%= idToName(role,"sliceRoles","role") %></td>
+</script>
+
+<script type="text/template" id="test-slicePrivilege-detail-template">
+  <h3>Detail View: Slice Privilege</h3>
+  <form>

+  <table>

+  <tr><td>User:</td><td><input type="text" name="user" value="<%= user %>"></td></tr>

+  <tr><td>Slice:</td><td><input type="text" name="slice" value="<%= slice %>"></td></tr>

+  <tr><td>Role:</td><td><input type="text" name="role" value="<%= role %>"></td></tr>

+  <tr><td colspan=2><button class="btn js-submit">Save</button></td></tr>

+  </table>

+  </form>

+</script>
+
 <!-- Sliver -->
 
 <script type="text/template" id="test-sliver-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -418,15 +551,15 @@
 
 
 <script type="text/template" id="test-sliver-listitem-template">
-  <td><%= id %></td>
-  <td><%= name %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= name %></td>
   <td><%= instance_id %></td>
   <td><%= instance_name %></td>
-  <td><%= image %></td>
-  <td><%= creator %></td>
-  <td><%= slice %></td>
-  <td><%= node %></td>
-  <td><%= deploymentNetwork %></td>
+  <td><%= idToName(image,"images","name") %></td>
+  <td><%= idToName(creator,"users","name") %></td>
+  <td><%= idToName(slice,"slices","name") %></td>
+  <td><%= idToName(node,"nodes","name") %></td>
+  <td><%= idToName(deploymentNetwork,"deployments","name") %></td>
   <td><%= flavor %></td>
   <td><%= userData %></td>
 </script>
@@ -449,6 +582,7 @@
 <!-- User -->
 
 <script type="text/template" id="test-user-list-template">
+  <h3><%= title %></h3>
   <table class="test-table">
   <thead><tr>
      <th>id</th>
@@ -465,8 +599,8 @@
 
 
 <script type="text/template" id="test-user-listitem-template">
-  <td><%= id %></td>
-  <td><%= username %></td>
+  <td class="objectLink"><%= id %></td>
+  <td class="objectLink"><%= username %></td>
   <td><%= firstname %></td>
   <td><%= lastname %></td>
   <td><%= phone %></td>
diff --git a/planetstack/core/xoslib/static/css/test.css b/planetstack/core/xoslib/static/css/test.css
index e5b1b80..dee32d8 100644
--- a/planetstack/core/xoslib/static/css/test.css
+++ b/planetstack/core/xoslib/static/css/test.css
@@ -6,6 +6,7 @@
     position: fixed;
     top: 1em;
     right: 1em;
+    width: 450px;
 }
 
 #detailBox {
@@ -14,6 +15,8 @@
     background-color: #f0f0f0;
     margin-bottom:30px;
     display:none;
+    overflow:auto;
+    max-height:80vh;
 }
 
 #errorBox {
@@ -32,3 +35,9 @@
     display:none;
 }
 
+.objectLink {
+    cursor:pointer;
+    color:blue;
+    text-decoration:underline;
+}
+
diff --git a/planetstack/core/xoslib/static/js/test.js b/planetstack/core/xoslib/static/js/test.js
index ff681e8..86de742 100644
--- a/planetstack/core/xoslib/static/js/test.js
+++ b/planetstack/core/xoslib/static/js/test.js
@@ -11,25 +11,11 @@
     sliceList: "#sliceList",
     sliverList: "#sliverList",
     userList: "#userList",
-    detail: "#detail"
-});
-
-// ---- Deployment ----
-
-TestApp.DeploymentListItemView = Marionette.ItemView.extend({
-    template: '#test-deployment-listitem-template',
-    tagName: 'tr',
-    className: 'test-tablerow',
-});
-
-TestApp.DeploymentListView = Marionette.CompositeView.extend({
-    childView: TestApp.DeploymentListItemView,
-    childViewContainer: 'tbody',
-    template: '#test-deployment-list-template',
-
-    initialize: function() {
-        this.listenTo(this.collection, 'change', this._renderChildren)
-    },
+    detail: "#detail",
+    linkedObjs1: "#linkedObjs1",
+    linkedObjs2: "#linkedObjs2",
+    linkedObjs3: "#linkedObjs3",
+    linkedObjs4: "#linkedObjs4"
 });
 
 TestApp.hideError = function(result) {
@@ -53,8 +39,17 @@
      });
 };
 
+idToName = function(id, collectionName, fieldName) {
+    linkedObject = xos[collectionName].get(id);
+    if (linkedObject == undefined) {
+        return "#" + id;
+    } else {
+        return linkedObject.attributes[fieldName];
+    }
+};
+
 TestApp.on("start", function() {
-     var objs = ['deployment', 'image', 'networkTemplate', 'network', 'node', 'service', 'site', 'slice', 'sliver', 'user'];
+     var objs = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'node', 'service', 'site', 'slice', 'sliceDeployment', 'slicePrivilege', 'sliver', 'user', 'sliceRole'];
 
      for (var index in objs) {
          name = objs[index];
@@ -112,6 +107,20 @@
                     e.preventDefault();

                     e.stopPropagation();

 

+                    index=0;

+                    for (relatedName in this.model.collection.relatedCollections) {

+                        relatedField = this.model.collection.relatedCollections[relatedName];

+

+                        relatedListViewClass = TestApp[relatedName + "ListView"].extend({collection: xos[relatedName].filterBy(relatedField,this.model.id)});

+                        TestApp["linkedObjs" + (index+1)].show(new relatedListViewClass());

+                        index = index + 1;

+                    }

+

+                    while (index<4) {

+                        TestApp["linkedObjs" + (index+1)].empty();

+                        index = index + 1;

+                    }

+

                     var detailView = new this.detailClass({

                         model: this.model,

                     });

@@ -125,15 +134,32 @@
              childViewContainer: 'tbody',
              template: table_template,
              collection: xos[collection_name],
+             title: name + "s",
 
              initialize: function() {
                  this.listenTo(this.collection, 'change', this._renderChildren)
+
+                 // Because many of the templates use idToName(), we need to
+                 // listen to the collections that hold the names for the ids
+                 // that we want to display.
+                 for (i in this.collection.foreignCollections) {
+                     foreignName = this.collection.foreignCollections[i];
+                     this.listenTo(xos[foreignName], 'change', this._renderChildren);
+                     this.listenTo(xos[foreignName], 'sort', this._renderChildren);
+                 }
+             },
+
+             templateHelpers: function() {
+                return { title: this.title };
              },
          });
+         TestApp[collection_name + "ListView"] = listViewClass;
 
          var listView = new listViewClass();
 
-         TestApp[region_name].show(listView);
+         if (region_name in TestApp.getRegions()) {
+             TestApp[region_name].show(listView);
+         }
          xos[collection_name].fetch(); //startPolling();
      }