var key = manifold.metadata.get_key(method);
if (!key)
continue;
- if (key.length > 1)
- continue;
- key = key[0];
var sq_keys = [];
var subrecords = record[method];
if (!subrecords)
continue
$.each(subrecords, function (i, subrecord) {
- sq_keys.push(subrecord[key]);
+ if (key.length == 1){
+ key = key[0];
+ sq_keys.push(subrecord[key]);
+ }else{
+ // more than what's necessary, but should work
+ sq_keys.push(subrecord);
+ }
});
update_query.params[method] = sq_keys;
update_query_orig.params[method] = sq_keys.slice();
var QueryUpdater = Plugin.extend({
init: function(options, element) {
- this.classname="queryupdater";
+ this.classname="queryupdater";
this._super(options, element);
var self = this;
+
+ this.initial = Array();
+
this.table = this.elmt('table').dataTable({
// the original querytable layout was
// sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>",
do_update: function(e) {
var self = e.data;
+
+ self.spin();
+ console.log("do_update");
+
// XXX check that the query is not disabled
manifold.raise_event(self.options.query_uuid, RUN_UPDATE);
+
+ // how to stop the spinning after the event?
+ // this should be triggered by some on_updatequery_done ?
},
// related buttons are also disabled in the html template
set_state: function(data)
{
+ console.log("function set_state");
var action;
var msg;
var button = '';
on_new_record: function(record)
{
+ console.log("query_updater on_new_record");
+ console.log(record);
+
// if (not and update) {
// initial['resource'], initial['lease'] ?
- this.initial.push(record.urn);
+ this.initial.push(record);
+ //this.set_record_state(record, RECORD_STATE_ATTACHED);
// We simply add to the table
// } else {
// \ this.initial_resources
on_query_in_progress: function()
{
- messages.debug("queryupdater.on_query_in_progress");
+ messages.debug("queryupdater.on_query_in_progress");
this.spin();
},
this.clear();
},
- on_new_record: function(record)
- {
- },
-
on_query_done: function()
{
+ console.log("on_query_done");
this.unspin();
},
// NOTE: record_key could be sufficient
on_added_record: function(record)
{
+ console.log("on_added_record = ",record);
this.set_record_state(record, RECORD_STATE_ADDED);
// update pending number
},
on_removed_record: function(record_key)
{
+ console.log("on_removed_record = ",record_key);
this.set_record_state(RECORD_STATE_REMOVED);
},
on_field_state_changed: function(result)
{
+ console.log("on_field_state_changed");
+ console.log(result);
messages.debug(result)
/* this.set_state(result.request, result.key, result.value, result.status); */
this.set_state(result);
if (!change)
return;
// ioi: Refubrished
- var initial = this.initial_resources;
+ var initial = this.initial;
//var r_removed = []; //
/*-----------------------------------------------------------------------
TODO: remove this dirty hack !!!
from plugins.testbeds import TestbedsPlugin
from plugins.scheduler2 import Scheduler2
from plugins.columns_editor import ColumnsEditor
+from plugins.lists.simplelist import SimpleList
from myslice.theme import ThemeView
user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
# TODO The query to run is embedded in the URL
+ # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
main_query.select(
'slice_hrn',
'resource.urn',
'resource.hostname', 'resource.type',
'resource.network_hrn',
- 'lease.urn',
+ 'lease.resource',
+ 'lease.start_time',
+ 'lease.end_time',
#'user.user_hrn',
#'application.measurement_point.counter'
)
# RESERVED RESOURCES LIST
# resources as a list using datatable plugin
- list_reserved_resources = QueryTable(
- page = page,
- domid = 'resources-reserved-list',
- title = 'List view',
- query = sq_resource,
- query_all = sq_resource,
- init_key = "urn",
- checkboxes = True,
- datatables_options = {
- 'iDisplayLength': 25,
- 'bLengthChange' : True,
- 'bAutoWidth' : True,
- },
+ list_reserved_resources = SimpleList(
+ title = None,
+ page = page,
+ key = 'urn',
+ query = sq_resource,
)
+ list_reserved_leases = SimpleList(
+ title = None,
+ page = page,
+ key = 'resource',
+ query = sq_lease,
+ )
+
+# list_reserved_resources = QueryTable(
+# page = page,
+# domid = 'resources-reserved-list',
+# title = 'List view',
+# query = sq_resource,
+# query_all = sq_resource,
+# init_key = "urn",
+# checkboxes = True,
+# datatables_options = {
+# 'iDisplayLength': 25,
+# 'bLengthChange' : True,
+# 'bAutoWidth' : True,
+# },
+# )
+
# --------------------------------------------------------------------------
# COLUMNS EDITOR
# list of fields to be applied on the query
template_env = {}
template_env['list_resources'] = list_resources.render(self.request)
-# template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
+ template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
+ template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
template_env['columns_editor'] = filter_column_editor.render(self.request)
}
-div#secondary {
-
-}
-
-div#secondary ul {
- position:absolute;
- top:8px;
- right:0;
-}
-
-div#secondary li {
- font-size:9pt;
- float:left;
- list-style:none;
- margin-right:30px;
- color:gray;
-}
-div#secondary li a {
- color:gray;
-}
-div#secondary li a:hover {
- color:#270A5A;
- text-decoration:none;
-}
-div#secondary li:last-child {
- margin-right:0;
-}
-
div#navigation {
background-color:black;
width:100%;
position:relative;
cursor:pointer;
}
-div#navigation .dropdown-menu {
- color:white;
+div.navigation .dropdown-menu {
+ color:black;
padding:0 15px 15px 15px;
margin-top:5px;
margin-left:-16px;
- background-color:black;
}
-div#navigation .dropdown-menu a {
- color:white;
+div.navigation .dropdown-menu a {
+ color:black;
}
-div#menu-slice-list{
+div.menu-slice-list {
display:none;
position:absolute;
- background-color:black;
padding:15px;
left:-15px;
z-index:10;
}
-div#navigation .dropdown-menu li:first-child {
+div.navigation .dropdown-menu li:first-child {
border-bottom:1px solid white;
padding-bottom:5px;
}
/**/
+.header {
+ -moz-box-shadow: 0 0 1px rgba(82,82,82,0.6);
+ -webkit-box-shadow: 0 0 1px rgba(82,82,82,0.6);
+ box-shadow: 0 0 1px rgba(82,82,82,0.6);
+ height:61px;
+ background-color:white;
+}
div.navigation {
}
div.navigation li {
color:#0C0047;
font-family:open_sansbold, sans-serif;
- font-size:10pt;
+ font-size:9pt;
font-weight:normal;
line-height:0.8em;
letter-spacing:0.4pt;
div.navigation li:last-child {
margin-right:0;
}
+div.secondary {
+ text-align:right;
+}
+
+div.secondary ul {
+ margin:6px 0 0 0;
+ padding:0;
+}
+
+div.secondary li {
+ font-size:9pt;
+ display:inline;
+ list-style:none;
+ margin:0px;
+ padding:0;
+ margin-right:15px;
+ color:#747474;
+ letter-spacing:0.4px;
+}
+div.secondary li:last-child {
+ margin-right:0;
+}
+div.secondary li a {
+ color:#747474;
+}
+div.secondary li a:hover {
+ text-decoration:none;
+}
+div.secondary .button {
+ width:300px;
+ margin-top:15px;
+}
+div.secondary .account {
+ margin-top:10px;
+ padding:0;
+ font-size:9pt;
+ color:gray;
+ text-align:right;
+}
+div.secondary .account span {
+ font-size:8pt;
+}
+div.secondary .account a {
+ color:black;
+}
div.home {
font-size:11pt;
line-height:1.2em;
color:white;
line-height:1.4em;
}
+div.dashboard {
+ text-align:center;
+}
+div.dashboard div {
+ margin:25px 0;
+}
+div.dashboard ul {
+ text-align:left;
+ margin-left:24px;
+ list-style:none;
+}
div.registration-form {
padding-top:150px;
text-align:center;
<tr class="even" id="pkey_row">
{%if 'N/A' not in user_private_key%}
<td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform -->
- <td class="value">********<a href="#">
+ <td class="value">********<a href="#"></a>
<button type="submit" name="dl_pkey" class="btn btn-default btn-xs" title="Download your privaye key" id="dl_pkey">
<span class="glyphicon glyphicon-download"></span> Download
</button>
</td>
{%else%}
<td class="key">Private Key </td> <!-- Hide if priv_key doesn't exist in myslice platform -->
- <td class="value">********<a href="#">
+ <td class="value">********<a href="#"></a>
<button type="submit" name="dl_pkey" class="btn btn-default btn-xs disabled" title="Download your privaye key" id="dl_pkey">
<span class="glyphicon glyphicon-download"></span> Download
</button>
<!-- <div class="row">
{% widget '_widget-news.html' %}
</div> -->
+{% if username %}
+<div class="container dashboard">
+ <div class="row">
+ <div class="col-md-3">
+ <h3>
+ EXPERIMENT
+ </h3>
+ <div>
+ <a href="#"><img src="{{ STATIC_URL }}img/icon_slices.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request Slice</button>
+ </div>
+ <div>
+ <div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
+ </div>
+ </div>
+ <div class="col-md-3">
+ <h3>MANAGEMENT</h3>
+ <div>
+ <a href="/portal/institution"><img src="{{ STATIC_URL }}img/icon_authority_color.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="validaterequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-ok"></span> Validate Requests</button>
+ </div>
+ </div>
+ <div class="col-md-3">
+ <h3>
+ SUPPORT
+ </h3>
+ <div>
+ <a href="/portal/support"><img src="{{ STATIC_URL }}img/icon_support.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button>
+ </div>
+ </div>
+
+ <div class="col-md-3">
+ <h3>
+ ACCOUNT
+ </h3>
+ <div>
+ <a href="/portal/account/"><img src="{{ STATIC_URL }}img/icon_user_color.png" alt="" /></a>
+ </div>
+ <div>
+ <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
+ </div>
+ <div>
+ {% if person.last_name %}
+ {{person.first_name}} {{person.last_name}}<br />
+ {% endif %}
+ <span class="label">Email:</span> <a href='/portal/account/'>{{person.email}}</a>
+ </div>
+ </div>
+ </div>
+</div>
+{% else %}
<div class="container-fluid home">
<div class="">
<div class="col-sm-2"></div>
</h3>
</div>
<div class="col-sm-5 col-sm-offset-1">
- {% if person %}
- <div class="logged-in">
- <button id="logoutbtn" type="button" class="btn btn-default" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</button>
- <div>
- {% if person.last_name %}
- {{person.first_name}} {{person.last_name}}<br />
- {% endif %}
- <span class="label">Email:</span> <a href='/portal/account/'>{{person.email}}</a>
- </div>
- </div>
- {% else %}
<div class="row">
{% widget '_widget-login-user.html' %}
</div>
- {% endif %}
-
- {% if person %}
- <button id="slicerequestbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Request Slice</button>
- <div id="home-slice-list"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
- {% else %}
- {% endif %}
-
- <!-- <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-envelope"></span> Contact</button> -->
</div>
<div class="col-sm-1"></div>
</div>
</div>
+{% endif %}
+
<script type="text/javascript">
$(document).ready(function() {
<div class="tab-pane row" id="testbeds">...</div>
<div class="tab-pane row" id="resources">...</div>
<div class="tab-pane row" id="users">...</div>
- <div class="tab-pane row" id="statistics">...</div>
- <div class="tab-pane row" id="measurements">...</div>
+ <!-- <div class="tab-pane row" id="statistics">...</div> -->
+ <!-- <div class="tab-pane row" id="measurements">...</div> -->
<div class="tab-pane row" id="experiment">...</div>
</div>
{% endblock %}
{% if section == "resources" %}
<ul class="nav nav-tabs nav-section">
<li><a href="/slice/{{ slice }}#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li>
+ <!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
<li class="active"><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li><a href="/slice/{{ slice }}#users">Users</a></li>
- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li>
- <li><a href="/slice/{{ slice }}#experiment">Measurements</a></li>
+ <!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li> -->
+ <!-- <li><a href="/slice/{{ slice }}#experiment">Measurements</a></li> -->
<li><a href="/slice/{{ slice }}#experiment" data-toggle="tab">Experiment</a></li>
</ul>
{% else %}
<ul class="nav nav-tabs nav-section">
<li class="active"><a href="#info"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
- <li class="testbeds"><a href="#testbeds">Testbeds</a></li>
+ <!-- <li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
<li><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li class="users"><a href="#users">Users</a></li>
- <li class="statistics"><a href="#experiment">Statistics</a></li>
- <li class="measurements"><a href="#experiment">Measurements</a></li>
+ <!-- <li class="statistics"><a href="#experiment">Statistics</a></li> -->
+ <!-- <li class="measurements"><a href="#experiment">Measurements</a></li> -->
<li class="experiment"><a href="#experiment" data-toggle="tab">Experiment</a></li>
</ul>
<script>
<a href="/"><img src="{{ STATIC_URL }}img/onelab-portal.png" alt="OneLab Portal - Future Internet Testbeds" /></a>
</div>
{% if username %}
- <div id="navigation" class="col-sm-4 col-md-5 navigation">
+ <div class="col-sm-5 col-md-5 navigation">
<ul>
- <li><a href="/portal/account/">{{ username }}</a></li>
<li>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
- SLICES <span class="caret"></span>
+ EXPERIMENT <span class="caret"></span>
</a>
<div class="dropdown-menu" style="z-index:99;">
<li><a href="/portal/slice_request/">Request Slice</a></li>
</ul>
</div>
- </li>
</li>
- <li><a href="/portal/support/">SUPPORT</a></li>
+ <li id="nav-institution" class=""><a href="/portal/institution">MANAGEMENT</a></li>
<li id="nav-request"><a href="/portal/validate">REQUESTS</a></li>
- <li id="nav-institution" class=""><a href="/portal/institution">INSTITUTION</a></li>
- <li id="nav-logout" style="margin-top: 10px;"><a id="logout" style="cursor:pointer;" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> LOGOUT</a></li>
+ <li><a href="/portal/support/">SUPPORT</a></li>
+
+
</ul>
</div>
<div class="col-sm-5 col-md-5 navigation">
</div>
{% endif %}
- <div class="col-sm-4 col-md-4" id="secondary">
+ <div class="col-sm-4 col-md-4 secondary">
<ul>
+
<li><a href="/news">News</a></li>
<li><a href="/portal/about">About</a></li>
<li><a target="_blank" href="http://www.onelab.eu">Public Website</a></li>
<li><a target="_blank" href="http://intranet.onelab.eu">Intranet</a></li>
</ul>
+ {% if username %}
+ <div class="account">You are logged in as <a href="/portal/account/">{{ username }}</a> | <a id="logout" style="cursor:pointer;" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</a></div>
+ {% endif %}
</div>
</div>
</div>
<!-- <table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table> -->
</div>
<div id="reserved" class="panel" style="height:370px;display:none;">
- {{list_reserved_resources}}
+ <table width="80%">
+ <tr><th width="50%" style="text-align:center;">resources</th><th width="50%" style="text-align:center;">leases</th></tr>
+ <tr>
+ <td style="text-align:center">{{list_reserved_resources}}</td>
+ <td style="text-align:center">{{list_reserved_leases}}</td>
+ </tr>
+ </table>
</div>
<div id="pending" class="panel" style="height:370px;display:none;">
{{pending_resources}}
</div>
<script>
$(document).ready(function() {
+ // TODO: Add a filter based on the list of authorities
+ $.post("/rest/authority/",{'fields':['authority_hrn']}, function( data ) {
+ console.log(data);
+ }); // post rest/authority
+
var slice_users = [];
$.post("/rest/user/",{'filters':{'parent_authority': "{{user_details.parent_authority}}"}}, function( data ) {
var list_users = [];
table_users.push(user_row);
});
- console.log("slice users before");
- console.log(slice_users);
$("table#user-tab tr:last").after(table_users.join( "" ));
$("div#user-tab-loaded").css("display","block");
$("div#user-tab-loading").css("display","none");
$("input:checkbox.user").click(function() {
- console.log("user_hrn");
user_hrn = $(this).closest('tr').find('td:eq(2)').html();
- console.log(user_hrn);
- console.log(this.checked);
if(this.checked){
var record_id = this.id;
slice_users.push (user_hrn);
}else{
- console.log("not checked");
- slice_users = $.grep(slice_users, function( user, i ) {
- return user != user_hrn;
- });
+ console.log(slice_users);
}
- console.log(slice_users);
});
}); // post rest/user
$('button#addusers').click(function() {
$.post("/update/slice/",{'filters':{'slice_hrn':'{{slice}}'},'params':{'users':slice_users}}, function(data) {
- console.log(data);
if(data.success){
// TODO: highlight row after success
//$('tr[id="'+record_id+'"]').highlight();
<div class="tab-pane row" id="testbeds">...</div>
<div class="tab-pane row" id="resources">...</div>
<div class="tab-pane row" id="users">...</div>
- <div class="tab-pane row" id="statistics">...</div>
- <div class="tab-pane row" id="measurements">...</div>
+ <!-- <div class="tab-pane row" id="statistics">...</div> -->
+ <!-- <div class="tab-pane row" id="measurements">...</div> -->
<div class="tab-pane row" id="experiment">...</div>
</div>
{% endblock %}
self.filters['disabled'] = '0'
self.filters['gateway_type'] = 'sfa'
self.filters['platform'] = '!myslice'
- elif(self.type.startswith('local:')):
- # XXX TODO: find a generic Query to get the fields like
- # select column.name from local:object where table == local:user
+ #elif(self.type.startswith('local:')):
+ elif ':' in self.type:
table = self.type.split(':')
+ prefix = table[0]
table = table[1]
- if table == "user":
- self.id = table + '_id'
- self.fields = ['user_id', 'email', 'password', 'config','status'];
- elif table == "account":
- # XXX TODO: Multiple key for account = (platform_id, user_id)
- self.id = "platform_id, user_id"
- self.fields = ['platform_id', 'user_id', 'auth_type', 'config'];
- elif table == "platform":
- self.id = 'platform'
- self.fields = ['platform', 'platform_longname', 'platform_url', 'platform_description','gateway_type'];
+
+ if prefix is 'local':
+ # XXX TODO: find a generic Query to get the fields like
+ # select column.name from local:object where table == local:user
+ table = self.type.split(':')
+ table = table[1]
+ if table == "user":
+ self.id = table + '_id'
+ self.fields = ['user_id', 'email', 'password', 'config','status'];
+ elif table == "account":
+ # XXX TODO: Multiple key for account = (platform_id, user_id)
+ self.id = "platform_id, user_id"
+ self.fields = ['platform_id', 'user_id', 'auth_type', 'config'];
+ elif table == "platform":
+ self.id = 'platform'
+ self.fields = ['platform', 'platform_longname', 'platform_url', 'platform_description','gateway_type'];
+ else:
+ # If we use prefix, set the key without the prefix then add it again
+ self.type = table
+ self.setKey()
+ self.setLocalFields()
+ self.type = prefix + ':' + table
else :
self.setKey()
self.setLocalFields()