Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
authorCiro Scognamiglio <ciro.scognamiglio@cslash.net>
Mon, 10 Mar 2014 17:39:20 +0000 (18:39 +0100)
committerCiro Scognamiglio <ciro.scognamiglio@cslash.net>
Mon, 10 Mar 2014 17:39:20 +0000 (18:39 +0100)
Conflicts:
portal/static/js/myslice.js

17 files changed:
devel/server-loop.sh
plugins/query_editor/static/js/query_editor.js
plugins/querytable/__init__.py
portal/accountview.py
portal/actions.py
portal/institution.py
portal/sliceresourceview.py
portal/static/css/onelab.css
portal/static/js/myslice.js
portal/static/js/onelab_slice-resource-view.js
portal/templates/about.html
portal/templates/onelab/onelab__widget-topmenu.html
portal/templates/onelab/onelab_slice-resource-view.html
portal/templates/onelab/onelab_slice-view.html
portal/templates/onelab/onelab_widget-slice-sections.html
ui/templates/base.html
ui/templates/messages-transient-header.html

index c77258f..51159ad 100755 (executable)
@@ -4,7 +4,7 @@ cd $DIRNAME/..
 
 # default port : if hostname starts with z -> use 8080 ; otherwise take 80
 #hostname | grep -q '^z' && port=8080 || port=8080
-hostname | grep -q '^z' && port=8080 || port=80
+hostname | grep -q '^z' && port=8080 || port=8080
 [[ -n "$@" ]] && port=$1
 
 while true; do 
index 17b9bf7..68d0265 100644 (file)
@@ -35,7 +35,7 @@
                     // XXX This should be handled by manifold
                     manifold.raise_event(self.options.query_uuid, FILTER_REMOVED, [key, op]);
                 }
-            }
+            };
         },
 
         init: function(options, element) {
index 0b1d29d..6a2bb29 100644 (file)
@@ -92,11 +92,11 @@ Current implementation makes the following assumptions
                           # dataTableExt.afnSortData
                            "js/querytable.js", 
                            ] ,
-            'css_files': [ "css/dataTables.bootstrap.css",
+            'css_files': [ #"css/dataTables.bootstrap.css",
                            # hopefully temporary, when/if datatables supports sPaginationType=bootstrap3
                            # for now we use full_numbers, with our own ad hoc css 
                            "css/dataTables.full_numbers.css",
-                           "css/querytable.css" , 
+                           #"css/querytable.css" , 
                            ],
             }
         return reqs
index 94adaf4..9b0c466 100644 (file)
@@ -346,14 +346,17 @@ def account_process(request):
                         #sfa_update_user(request, user_hrn, user_pub_key)
                         sfa_update_user(request, user_hrn, user_pub_key)
                         result_sfa_user = sfa_get_user(request, user_hrn, public_key)
-                        result_sfa_user = result_sfa_user[0]
-                        if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
-                            # updating manifold
-                            updated_config = json.dumps(account_config) 
-                            user_params = { 'config': keypair, 'auth_type':'managed'}
-                            manifold_update_account(request, user_id, user_params)
-                            messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
-                        else:
+                        try:
+                            result_sfa_user = result_sfa_user[0]
+                            if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
+                                # updating manifold
+                                updated_config = json.dumps(account_config) 
+                                user_params = { 'config': keypair, 'auth_type':'managed'}
+                                manifold_update_account(request, user_id, user_params)
+                                messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
+                            else:
+                                raise Exception,"Keys are not matching"
+                        except Exception,e:
                             messages.error(request, 'Error: An error occured during the update of your public key at the Registry, or your public key is not matching the one stored.')
                         return HttpResponseRedirect("/portal/account/")
         else:
index 7d7a337..399cae6 100644 (file)
@@ -563,7 +563,7 @@ def create_pending_user(wsgi_request, request, user_detail):
             .select('platform_id')
         reg_platform = execute_admin_query(wsgi_request, reg_platform_query)
 
-        registry_platform_id = reg_platform[0]['platform_id']
+        reg_platform_id = reg_platform[0]['platform_id']
         account_params = {
             'platform_id'   : reg_platform_id, # XXX ALERT !!
             'user_id'       : user_id, 
index 70d88dd..9bc0a86 100644 (file)
@@ -36,7 +36,10 @@ class InstitutionView (FreeAccessView, ThemeView):
             env['person'] = self.request.user
             user_query  = Query().get('user').select('user_hrn','parent_authority').filter_by('user_hrn','==','$user_hrn')
             user_details = execute_query(self.request, user_query)
-            env['user_details'] = user_details[0]
+            try:
+                env['user_details'] = user_details[0]
+            except Exception,e:
+                env['error'] = "Please check your Credentials"
         else: 
             env['person'] = None
     
index 4f0775d..520a72e 100644 (file)
@@ -14,14 +14,117 @@ from unfold.page                     import Page
 from manifold.core.query             import Query, AnalyzedQuery
 from manifoldapi.manifoldapi         import execute_query
 
+from myslice.configengine            import ConfigEngine
+from plugins.querytable              import QueryTable
+from plugins.googlemap               import GoogleMap
+from plugins.queryupdater            import QueryUpdater
+
 from theme import ThemeView
 
 class SliceResourceView (LoginRequiredView, ThemeView):
     template_name = "slice-resource-view.html"
     
     def get(self, request, slicename):
+
         if request.GET.get('message') : 
             msg = "Slice successfully updated"
         else :
             msg = None
-        return render_to_response(self.template, {"msg" : msg, "slice": slicename, "theme": self.theme, "username": request.user, "section":"resources"}, context_instance=RequestContext(request))
+
+        page = Page(request)
+        metadata = page.get_metadata()
+        page.expose_js_metadata()
+
+        resource_md = metadata.details_by_object('resource')
+        resource_fields = [column['name'] for column in resource_md['column']]
+
+        user_md = metadata.details_by_object('user')
+        user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
+
+        # TODO The query to run is embedded in the URL
+        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',
+                'user.user_hrn',
+                #'application.measurement_point.counter'
+        )
+        # for internal use in the querytable plugin;
+        # needs to be a unique column present for each returned record
+        main_query_init_key = 'urn'
+        aq = AnalyzedQuery(main_query, metadata=metadata)
+        page.enqueue_query(main_query, analyzed_query=aq)
+
+        query_resource_all = Query.get('resource').select(resource_fields)
+        page.enqueue_query(query_resource_all)
+
+        sq_resource    = aq.subquery('resource')
+        sq_lease       = aq.subquery('lease')
+
+        list_resources = QueryTable(
+            page       = page,
+            domid      = 'resources-list',
+            title      = 'List view',
+            query      = sq_resource,
+            query_all  = query_resource_all,
+            init_key   = "urn",
+            checkboxes = True,
+            datatables_options = {
+                'iDisplayLength': 25,
+                'bLengthChange' : True,
+                'bAutoWidth'    : True,
+                },
+        )
+
+        # --------------------------------------------------------------------------
+        # RESOURCES
+        # the resources part is made of a Tabs (Geographic, List), 
+
+        map_resources  = GoogleMap(
+            page       = page,
+            title      = 'Geographic view',
+            domid      = 'resources-map',
+            # tab's sons preferably turn this off
+            togglable  = False,
+            query      = sq_resource,
+            query_all  = query_resource_all,
+            # this key is the one issued by google
+            googlemap_api_key = ConfigEngine().googlemap_api_key(),
+            # the key to use at init-time
+            init_key   = main_query_init_key,
+            checkboxes = True,
+            # center on Paris
+            latitude   = 49.,
+            longitude  = 9,
+            zoom       = 4,
+        )
+
+        # --------------------------------------------------------------------------
+        # QueryUpdater (Pending Operations)
+        pending_resources = QueryUpdater(
+            page                = page,
+            title               = 'Pending operations',
+            query               = main_query,
+            togglable           = True,
+            # start turned off, it will open up itself when stuff comes in
+            toggled             = False,
+            domid               = 'pending',
+            outline_complete    = True,
+        )
+
+        template_env = {}
+        template_env['list_resources'] = list_resources.render(self.request)
+        template_env['map_resources'] = map_resources.render(self.request)
+        template_env['pending_resources'] = pending_resources.render(self.request)
+        template_env["theme"] = self.theme
+        template_env["username"] = request.user
+        template_env["slice"] = slicename
+        template_env["section"] = "resources"
+        template_env["msg"] = msg
+        template_env.update(page.prelude_env())
+
+        return render_to_response(self.template, template_env, context_instance=RequestContext(request))
index 6d203a5..a236d10 100644 (file)
@@ -13,13 +13,13 @@ a, a:active, a:focus {
 
 h1 {
     border-bottom:1px solid #DDDDDD;
-    padding:0 0 5px 0;
-    margin:0 0 15px 0;
+    padding:0 0 0 0;
+    margin:0 0 0 0;
     font-size:18pt;
 }
 h1 img {
     vertical-align:middle;
-    margin-bottom:4px;
+    margin-bottom:6px;
 }
 h2 {
     font-size:14pt;
@@ -29,6 +29,7 @@ h3 {
     font-size:13pt;
     color:#201E62;
 }
+
 div.wrapper {
     width:980px;
     margin:0 auto;
@@ -258,7 +259,6 @@ div#home-dashboard div#home-slice-list li {
 /* NAV TABS */
 
 .nav.nav-tabs {
-    margin-bottom:25px;
 }
 
 .nav.nav-tabs li.active a {
@@ -334,6 +334,27 @@ div#ticket-request p {
 }
 
 /* SLICE VIEW */
+ul.nav-sliceview {}
+ul.nav-sliceview li {
+    
+}
+ul.nav-sliceview li:first-child {
+    padding:0;
+}
+ul.nav-sliceview li:first-child a {
+    font-weight:bold;
+    padding:6px 15px 4px 15px;
+}
+ul.nav-sliceview li:first-child img {
+    margin:0 4px 1px 0;
+    padding:0;
+}
+
+
+
+
+
+
 div#slice-view {
     margin:0;
 }
index 2caa4b8..fa115be 100644 (file)
@@ -138,38 +138,39 @@ var myslice = {
     },
     
     apply: function() {
-       $('div#loading').show();
-       this.pending = [];
-       this.save();
-       // setTimeout(function(){
-               // $('div#loading').hide();
-               // window.location.href = '/resources/' + this.slice + '?message=true';
-               // },6000);
+
+       //$('div#loading').show();
+       //this.pending = [];
+       //this.save();
+       //setTimeout(function(){
+               //$('div#loading').hide();
+               //window.location.href = '/resources/' + this.slice + '?message=true';
+               //},6000);
        
         
 
-       $.post("/rest/slice/", { 'fields': ['resource','slice_hrn'], 'filters': { 'slice_hrn' : this.slice  } }, function(data) {
-               console.log(data);
-               resources = [];
-               reserved = [];
-               update = [];
-               if ('resource' in data[0]) {
-                       $.each(data[0].resource, function(idx, r) {
-                               resources.push(r.urn);
-                       });
-               }
-               //myslice.pending
-               console.log(myslice.pending);
-               console.log(resources);
-               $.each(resources.concat(myslice.pending), function(idx, v) {
-                       update.push({ 'resource': v });
-               });
-               console.log(update);
-               $.post("/update/slice/", { 'filters': { 'slice_hrn' : 'ple.upmc.myslicedemo'  }, 'params' : update }, function(data) {
-                       console.log(data);
-               });
-       });
-       //console.log(this.slice);
+        $.post("/rest/slice/", { 'fields': ['resource','slice_hrn'], 'filters': { 'slice_hrn' : this.slice  } }, function(data) {
+                console.log(data);
+                resources = [];
+                reserved = [];
+                update = [];
+                if ('resource' in data[0]) {
+                        $.each(data[0].resource, function(idx, r) {
+                                resources.push(r.urn);
+                        });
+                }
+                //myslice.pending
+                console.log(myslice.pending);
+                console.log(resources);
+                $.each(resources.concat(myslice.pending), function(idx, v) {
+                        update.push( v );
+                });
+                console.log(update);
+                $.post("/update/slice/", { 'filters': { 'slice_hrn' : myslice.slice  }, 'params' : update }, function(data) {
+                        console.log(data);
+                });
+        });
+       console.log(this.slice);
     }
     
 };
index 28b1a4e..45b8395 100644 (file)
@@ -4,10 +4,11 @@ $(document).ready(function() {
         $(this).parent().addClass('active');
         $('div.panel').hide();
         $('div#'+$(this).data('panel')).show();
-        
+        /*
         if ($(this).data('panel') == 'map') {
                mapInit();
         }
+        */
     });
     
     $.get("/rest/network", function(data) {
index bddeb7e..9b124f2 100644 (file)
@@ -2,7 +2,7 @@
 
 {% block content %}
 <div class="row">
-       <h1><img src="{{ STATIC_URL }}img/icon_slices_small.png" alt="About MySlice" /> About</h1>
+       <h1><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> About</h1>
 </div>
 
 <div class="row">
index 26cb09b..ec07303 100644 (file)
@@ -1,7 +1,4 @@
-{% insert_str prelude "js/bootstrap.js" %}
-{% insert_str prelude "css/bootstrap.css" %}
-{% insert_str prelude "css/topmenu.css" %}
-{% insert_str prelude "js/logout.js" %}
+
 <div id="header">
        <div class="wrapper">
                <div class="logo">
index d6682d2..e9bee5c 100644 (file)
                        <ul class="nav nav-tabs nav-resources">
                          <li class="active"><a data-panel="resources" href="#">Resources</a></li>
                          <li><a data-panel="map" href="#">Map</a></li>
+                         <li><a data-panel="pending" href="#">Pending</a></li>
                          <li><a href="#"></a></li>
                        </ul>
                </div>
                <div class="row" style="height:100%;">
                        <div id="resources" class="panel">
+                {{list_resources}}
                                <table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table>
                        </div>
                        <div id="map" class="panel" style="height:370px;display:none;">
-                               <div id="map-canvas" style="height:100%;"></div>
+                {{map_resources}}
+                       </div>
+                       <div id="pending" class="panel" style="height:370px;display:none;">
+                {{pending_resources}}
                        </div>
                </div>
        </div>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
index a67d34b..b734564 100644 (file)
@@ -1,24 +1,29 @@
 {% extends "layout_wide.html" %}
 
 {% block content %}
-       <div class="col-md-2"></div>
-       <div class="col-md-10">
-               <div class="row">
-                       {% include theme|add:"_widget-slice-sections.html" %}
+<div class="wrapper">
+       <div class="row">
+               <div class="col-md-12">
+               {% include theme|add:"_widget-slice-sections.html" %}
+           </div>
+       </div>
+</div>
+<div class="container-fluid">
+       <div class="row">
+               <div class="col-md-2">
+                       ll
                </div>
-    </div>
-    
-       <div class="col-md-2"></div>
-       <div class="col-md-10">
-        <br>
-        <br>
-        <div id="slice-tab-loading"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
-        <div id="slice-tab-loaded" style="display:none;">
-            <table id="slice-tab">
-            </table>
-        </div>
-       </div>
+               <div class="col-md-10">
+               <br>
+               <br>
+               <div id="slice-tab-loading"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading Slices" /></div>
+               <div id="slice-tab-loaded" style="display:none;">
+                   <table id="slice-tab">
+                   </table>
+               </div>
+               </div>
+       </div>
+</div>
 <script>
     $(document).ready(function() {
         $.post("/rest/slice/",{'filters':{'slice_hrn':'{{slice}}'}}, function( data ) {
index e637b15..46d8656 100644 (file)
@@ -1,13 +1,14 @@
-<div class="col-md-8 slice-sections">
-       <ul class="nav nav-pills nav-justified">
-               <li {% if section == 'slice' %}class="active"{% endif %}><a href="/slice/{{ slice }}/">{{ slice }}</a></li>
-               <li {% if section == 'testbeds' %}class="active"{% endif %}><a href="/testbeds/{{ slice }}/">Testbeds</a></li>
-               <li {% if section == 'resources' %}class="active"{% endif %}><a href="/resources/{{ slice }}/">Resources</a></li>
-               <li {% if section == 'users' %}class="active"{% endif %}><a href="/users/{{ slice }}/">Users</a></li>
-               <li><a href="">Statistics</a></li>
-               <li><a href="">Measurements</a></li>
-       </ul>
-</div>
-<div class="col-md-4 slice-experiment">
-       <a href="/portal/experiment"><button type="button" class="btn btn-default">Experiment</button></a>
-</div>
+<ul class="nav nav-tabs nav-sliceview">
+       <li class="active"><a href="/slice/{{ slice }}/"><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="About MySlice" /> {{ slice }}</a></li>
+       <li><a href="/testbeds/{{ slice }}/">Testbeds</a></li>
+       <li><a href="/resources/{{ slice }}/">Resources</a></li>
+       <li><a href="/users/{{ slice }}/">Users</a></li>
+       <li><a href="">Statistics</a></li>
+       <li><a href="">Measurements</a></li>
+       <li><a href="/portal/experiment">Experiment</a></li>
+</ul>
+<script>
+       $(document).ready(function() {
+               
+       });
+</script>
index 9732653..8513951 100644 (file)
 {% insert_str prelude "js/manifold.js" %}
 {% insert_str prelude "css/manifold.css" %}
 {% insert_str prelude "css/plugin.css" %}
+{% insert_str prelude "js/bootstrap.js" %}
+{% insert_str prelude "css/bootstrap.css" %}
+{% insert_str prelude "css/topmenu.css" %}
+{% insert_str prelude "js/logout.js" %}
 <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/{{ theme }}.css">
 </head>
 <body>
index 0c292e7..b0c6691 100644 (file)
@@ -23,10 +23,10 @@ $(function(){
        $(document).ready(function(){
                {% for message in messages %}
             $("#notifications").notify("create", {
-              title: 'Test Notification',
+              title: 'Notification',
               text: '{{ message }}'
             },{
-              expires: false,
+              expires: true,
               speed: 1000
             });
                {% endfor %}