Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
authorCiro Scognamiglio <ciro.scognamiglio@cslash.net>
Thu, 24 Jul 2014 13:06:09 +0000 (15:06 +0200)
committerCiro Scognamiglio <ciro.scognamiglio@cslash.net>
Thu, 24 Jul 2014 13:06:09 +0000 (15:06 +0200)
15 files changed:
manifoldapi/static/js/manifold.js
plugins/columns_editor/templates/columns_editor.html
plugins/filter_status/static/js/filter_status.js
plugins/filter_status/templates/filter_status.html
plugins/scheduler2/static/js/scheduler2.js
plugins/testbeds/templates/testbeds.html
portal/accountview.py
portal/registrationview.py
portal/slicerequestview.py
portal/sliceresourceview.py
portal/static/css/onelab.css
portal/templates/onelab/onelab_management-tab-about.html
portal/templates/slice-resource-view.html
portal/templates/slice-tab-users-view.html
ui/topmenu.py

index 7dfcb4d..d96deed 100644 (file)
@@ -462,7 +462,7 @@ function QueryStore() {
     {
         var query_ext = this.find_analyzed_query_ext(query_uuid);
         query_ext.filters = $.grep(query_ext.filters, function(x) {
-            return x == filter;
+            return x != filter;
         });
 
         this.apply_filters(query_uuid);
@@ -1832,6 +1832,7 @@ case TYPE_LIST_OF_VALUES:
             // FILTERS
 
             case FILTER_ADDED: 
+                console.log("FILTER ADDED", data);
                 /* Update internal record state */
                 manifold.query_store.add_filter(query_uuid, data);
 
@@ -1841,6 +1842,7 @@ case TYPE_LIST_OF_VALUES:
                 break;
 
             case FILTER_REMOVED:
+                console.log("FILTER REMOVED", data);
                 /* Update internal record state */
                 manifold.query_store.remove_filter(query_uuid, data);
 
index 1d66e98..57a7831 100644 (file)
@@ -10,7 +10,7 @@ EOF; -->
   <table id='{{domid}}__table' class='query-editor'>
     <thead>
       <tr>
-        <th class='center'>Info</th>
+        <!--<th class='center'>Info</th> -->
         <th class='center'>Field</th>
         <!--
         <th class='center'>Resource</th>
@@ -26,7 +26,7 @@ EOF; -->
     {% for field in fields %}
 
       <tr>
-        <td class='center'><span class='glyphicon glyphicon-chevron-right' style='cursor:pointer'></span></td>
+        <!--<td class='center'><span class='glyphicon glyphicon-chevron-right' style='cursor:pointer'></span></td> -->
         <td class='center'>{{ field.name }}</td>
         <!--
         <td class='center'>{{ field.resource_type }}</td>
index 3bcd15c..9c1c244 100644 (file)
 
             // ... and communicate the appropriate filters to the manager
             // NOTE: we use the manifold namespace for internal filters 
-            if (self.prev_filter_status)
-                manifold.raise_event(self.options.query_uuid, FILTER_REMOVED, self.prev_filter_status);
-
+            if (self.prev_filter_status) {
+                var filter = ['manifold:status', '==', self.prev_filter_status];
+                manifold.raise_event(self.options.query_uuid, FILTER_REMOVED, filter);
+            }
             // XXX The datatables will be refreshed twice !
             if (filter_status != 'all') {
                 // No filter for 'all'
index 498c149..8350eb1 100644 (file)
@@ -1,9 +1,9 @@
 <div id={{ domid }}>
-  <span class="list-group-item-heading sl-resources">View:</span>
+  <span class="list-group-item-heading sl-resources" style='font-size:inherit;'>View:</span>
   
   <a href="#" 
      class="list-group-item sl-resources active" 
-     style='display: inline-block !important;' 
+     style='display: inline-block !important; font-size: inherit;
      id="{{ domid }}__all" 
      data-status="all"
         title="View resources that are available to be reserved."
@@ -13,7 +13,7 @@
   
   <a href="#"
      class="list-group-item sl-resources" 
-     style='display: inline-block !important;' 
+     style='display: inline-block !important; font-size: inherit;
      id="{{ domid }}__reserved" 
      data-status="reserved"
      title="View resources that you have previously reserved for the slice."
@@ -22,7 +22,7 @@
   </a>
   
   <a href="#" class="list-group-item sl-resources"
-     style='display: inline-block !important;' 
+     style='display: inline-block !important; font-size: inherit; width:130px;
      id="{{ domid }}__unconfigured" 
      data-status="unconfigured"
      title="View resources that you have selected to add to your slice, that require configuration before they can be reserved. Hover you mouse over the symbol next to the checkbox for more details."
@@ -32,7 +32,7 @@
   </a>
   
   <a href="#" class="list-group-item sl-resources" 
-     style='display: inline-block !important;' 
+     style='display: inline-block !important; font-size: inherit;
      id="{{ domid }}__pending" 
      data-status="pending"
      title="View pending changes to your slice: resources that you have selected to add, and resources that you have selected to remove. Click on the Apply button to apply those changes, or on the Cancel button to cancel them."
index 293324e..04665c6 100755 (executable)
@@ -232,13 +232,15 @@ var SCHEDULER_COLWIDTH = 50;
 \r
         $scope.select = function(index, model_lease, model_resource)\r
         {\r
-            var data;\r
+            var data, resource_granularity;\r
+\r
+            //resource_granularity = model_resource.granularity === undefined ? RESOURCE_DEFAULT_GRANULARITY : model_resource.granularity;\r
 \r
             console.log("Selected", index, model_lease, model_resource);\r
 \r
             var day_timestamp = SchedulerDateSelected.getTime() / 1000;\r
-            var start_time = day_timestamp + index       * model_resource.granularity;\r
-            var end_time   = day_timestamp + (index + 1) * model_resource.granularity;\r
+            var start_time = day_timestamp + index       * model_resource.granularity; // XXX resource_granularity\r
+            var end_time   = day_timestamp + (index + 1) * model_resource.granularity; //\r
             var start_date = new Date(start_time * 1000);\r
             var end_date   = new Date(end_time   * 1000);\r
 \r
@@ -576,7 +578,9 @@ var SCHEDULER_COLWIDTH = 50;
                     var resource = jQuery.extend(true, {}, record);\r
 \r
                     // Fix granularity\r
-                    resource.granularity = typeof(resource.granularity) == "number" ? resource.granularity : RESOURCE_DEFAULT_GRANULARITY;\r
+                    //resource_granularity = ((resource.granularity === undefined) || (typeof(resource.granularity) != "number")) ? RESOURCE_DEFAULT_GRANULARITY : resource.granularity;\r
+                    if (typeof(resource.granularity) != "number")\r
+                        resource.granularity = RESOURCE_DEFAULT_GRANULARITY;\r
                     resource.leases = []; // a list of occupied timeslots\r
 \r
                     self.scope_resources_by_key[resource['urn']] = resource;\r
@@ -735,53 +739,53 @@ var SCHEDULER_COLWIDTH = 50;
                     /* Limit the display to the current day */\r
                     id_end = this._all_slots.length / colspan_lease\r
                 }\r
+                lease_status = manifold.query_store.get_record_state(this.options.query_lease_uuid, lease_key, STATE_SET);\r
+                // the same slots might be affected multiple times.\r
+                // PENDING_IN + PENDING_OUT => IN \r
+                //\r
+                // RESERVED vs SELECTED !\r
+                //\r
+                // PENDING !!\r
+                switch(lease_status) {\r
+                    case STATE_SET_IN:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_IN_SUCCESS:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = 'success';\r
+                    case STATE_SET_OUT_FAILURE:\r
+                        lease_class = 'selected'; // my leases\r
+                        lease_success = 'failure';\r
+                        break;\r
+                    case STATE_SET_OUT:\r
+                        lease_class = 'reserved'; // other leases\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_OUT_SUCCESS:\r
+                        lease_class = 'free'; // other leases\r
+                        lease_success = 'success';\r
+                        break;\r
+                    case STATE_SET_IN_FAILURE:\r
+                        lease_class = 'free'; // other leases\r
+                        lease_success = 'failure';\r
+                        break;\r
+                    case STATE_SET_IN_PENDING:\r
+                        lease_class = 'pendingin';\r
+                        lease_success = '';\r
+                        break;\r
+                    case STATE_SET_OUT_PENDING:\r
+                        // pending_in & pending_out == IN == replacement\r
+                        if (resource.leases[i].status == 'pendingin')\r
+                            lease_class = 'pendingin'\r
+                        else\r
+                            lease_class = 'pendingout';\r
+                        lease_success = '';\r
+                        break;\r
+                \r
+                }\r
 \r
                 for (i = id_start; i < id_end; i++) {\r
-                    // the same slots might be affected multiple times.\r
-                    // PENDING_IN + PENDING_OUT => IN \r
-                    //\r
-                    // RESERVED vs SELECTED !\r
-                    //\r
-                    // PENDING !!\r
-                    lease_status = manifold.query_store.get_record_state(this.options.query_lease_uuid, lease_key, STATE_SET);\r
-                    switch(lease_status) {\r
-                        case STATE_SET_IN:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_IN_SUCCESS:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = 'success';\r
-                        case STATE_SET_OUT_FAILURE:\r
-                            lease_class = 'selected'; // my leases\r
-                            lease_success = 'failure';\r
-                            break;\r
-                        case STATE_SET_OUT:\r
-                            lease_class = 'reserved'; // other leases\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_OUT_SUCCESS:\r
-                            lease_class = 'free'; // other leases\r
-                            lease_success = 'success';\r
-                            break;\r
-                        case STATE_SET_IN_FAILURE:\r
-                            lease_class = 'free'; // other leases\r
-                            lease_success = 'failure';\r
-                            break;\r
-                        case STATE_SET_IN_PENDING:\r
-                            lease_class = 'pendingin';\r
-                            lease_success = '';\r
-                            break;\r
-                        case STATE_SET_OUT_PENDING:\r
-                            // pending_in & pending_out == IN == replacement\r
-                            if (resource.leases[i].status == 'pendingin')\r
-                                lease_class = 'pendingin'\r
-                            else\r
-                                lease_class = 'pendingout';\r
-                            lease_success = '';\r
-                            break;\r
-                    \r
-                    }\r
                     resource.leases[i].status = lease_class;\r
                     resource.leases[i].success = lease_success;\r
                 }\r
@@ -831,7 +835,7 @@ var SCHEDULER_COLWIDTH = 50;
                 init_cell = (new Date().getHours() - 1) * 3600 / self._granularity;\r
                 if (init_cell > num_hidden_cells)\r
                     init_cell = num_hidden_cells;\r
-                \r
+\r
                 $('#tblSlider').slider({\r
                     min: 0,\r
                     max: num_hidden_cells,\r
index 289a556..d670c9d 100644 (file)
@@ -10,7 +10,8 @@
           id="testbeds-filter_{[{ testbed.network_hrn }]}"
           data-platform="{[{ testbed.network_hrn }]}">
        <span class="list-group-item-heading">{[{ testbed.platform }]}</span>
-       <p class="list-group-item-heading">{[{ testbed.network_hrn }]}</p></a>
+       <!--<p class="list-group-item-heading">{[{ testbed.network_hrn }]}</p>-->
+       </a>
 </div>
 
 </div>
index 734485b..c179a0e 100644 (file)
@@ -31,10 +31,12 @@ class AccountView(LoginRequiredAutoLogoutView, ThemeView):
     def get_context_data(self, **kwargs):
         self.template_name = self.template
         page = Page(self.request)
+        metadata = page.get_metadata()
+        page.expose_js_metadata()
+
         page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js","js/jquery-ui.js" ] )
         page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] )
 
-
         user_query  = Query().get('local:user').select('config','email','status')
         user_details = execute_query(self.request, user_query)
         
index afaa67c..b996e95 100644 (file)
@@ -37,7 +37,7 @@ class RegistrationView (FreeAccessView, ThemeView):
         """
         """
         errors = []
-
+        authority_hrn = None
         authorities_query = Query.get('authority').select('name', 'authority_hrn')
         authorities = execute_admin_query(wsgi_request, authorities_query)
         if authorities is not None:
@@ -57,13 +57,14 @@ class RegistrationView (FreeAccessView, ThemeView):
             current_site = Site.objects.get_current()
             current_site = current_site.domain
 
-            authorities_query = Query.get('authority').select('name', 'authority_hrn')
-            authorities = execute_admin_query(wsgi_request, authorities_query)
-    
             for authority in authorities:
                 if authority['name'] == wsgi_request.POST.get('org_name', ''):
                     authority_hrn = authority['authority_hrn']     
 
+            # Handle the case when the template uses only hrn and not name
+            if authority_hrn is None:
+                authority_hrn = wsgi_request.POST.get('org_name', '')
+
             post_email = wsgi_request.POST.get('email','').lower()
             salt = randint(1,100000)
             email_hash = md5(str(salt)+post_email).hexdigest()
index 449147c..598aca3 100644 (file)
@@ -34,6 +34,7 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
         slice_name =''
         purpose=''
         exp_url=''
+        authority_hrn = None
         # Retrieve the list of authorities
         authorities_query = Query.get('authority').select('name', 'authority_hrn')
         authorities = execute_admin_query(wsgi_request, authorities_query)
@@ -83,6 +84,7 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
         page = Page(wsgi_request)
         page.add_js_files  ( [ "js/jquery.validate.js", "js/jquery-ui.js" ] )
         page.add_css_files ( [ "https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] )
+        page.expose_js_metadata()
 
         if method == 'POST':
             # The form has been submitted
@@ -92,12 +94,13 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
             current_site = current_site.domain
             
             # getting the authority_hrn from the selected organization
-            authority_hrn = ''           
             for authority in authorities:
                 if authority['name'] == wsgi_request.POST.get('org_name', ''):
                     authority_hrn = authority['authority_hrn']
 
-            
+            # Handle the case when the template uses only hrn and not name
+            if authority_hrn is None:
+                authority_hrn = wsgi_request.POST.get('org_name', '')
 
             slice_request = {
                 'type'              : 'slice',
@@ -168,6 +171,7 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView):
             'exp_url': exp_url,
             'pi': pi,
             'authority_name': authority_name,        
+            'authority_hrn': user_authority,        
             'cc_myself': True,
             'authorities': authorities,
             'theme': self.theme,
index db7413d..2d603b4 100644 (file)
@@ -76,11 +76,11 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         #page.enqueue_query(query_resource_all)
 
         # leases query
-        lease_md = metadata.details_by_object('lease')
-        lease_fields = [column['name'] for column in lease_md['column']]
+        #lease_md = metadata.details_by_object('lease')
+        #lease_fields = [column['name'] for column in lease_md['column']]
 
-        query_lease_all = Query.get('lease').select(lease_fields)
-        page.enqueue_query(query_lease_all)
+        #query_lease_all = Query.get('lease').select(lease_fields)
+        #page.enqueue_query(query_lease_all)
 
         # --------------------------------------------------------------------------
         # ALL RESOURCES LIST
index 8d6e73e..5be1bf3 100644 (file)
@@ -380,6 +380,8 @@ a.sl-resources, a.sl-resources:hover {
     padding:2px 4px;
     -moz-border-radius: 4px;
     border-radius: 4px;
+    width:125px;
+    text-align: center;
 }
 a.sl-resources.active, a.sl-resources.active:hover, a.sl-resources.active:focus {
     border:0;
@@ -703,4 +705,4 @@ div.slogan {
     color:white;
     padding-top:60px;
     text-shadow: 1px 1px #013540;
-}
\ No newline at end of file
+}
index 0c0a94f..687b7de 100644 (file)
        {% endfor %}
        </p>
 </div>
-<script>$(document).ready(function() {$('#authority_name').text('{{authority.name}}')});</script>
\ No newline at end of file
+<script>$(document).ready(function() {
+{% if authority.name %}
+    auth_name = "{{authority.name}}";
+{% else %}
+    auth_name = "{{authority.authority_hrn}}";
+{% endif %}
+    $('#authority_name').text(auth_name);
+});
+</script>
index a8a9ac9..3355e0c 100644 (file)
@@ -47,7 +47,7 @@ $(document).ready(function() {
                </div>
        
                <div class="row">
-                       <div class="col-md-4">
+                       <div class="col-md-6">
                                {{ filter_status }}
                        </div>
                        <div class="col-md-2">
index 103a1ff..1aaea71 100644 (file)
                     console.log(slice_users);
                 }
             });
-       }); // post rest/user
-    }
+       }); // post rest/use
+
+               $('button#addusers').click(function() {
+               $.post("/update/slice/",{'filters':{'slice_hrn':'{{slice}}'},'params':{'users':slice_users}}, function(data) {
+                       if(data.success){
+                       // TODO: highlight row after success
+                       //$('tr[id="'+record_id+'"]').highlight();
+                       mysliceAlert('Success: slice updated','success', true);
+                       }else{
+                       mysliceAlert('Rest Error for: '+data.error,'warning', true);
+                       }
+               }); // post update slice
+               // TODO: refresh table
+               //window.location="/portal/institution#slices";
+               }); // button#addusers click
+
+    } // get_users_in_slice
 
     $(document).ready(function() {
             // TODO: Add a filter based on the list of authorities
 
             get_users_in_slice("{{user_details.parent_authority}}");
 
-               $('button#addusers').click(function() {
-                $.post("/update/slice/",{'filters':{'slice_hrn':'{{slice}}'},'params':{'users':slice_users}}, function(data) {
-                       if(data.success){
-                       // TODO: highlight row after success
-                       //$('tr[id="'+record_id+'"]').highlight();
-                       mysliceAlert('Success: slice updated','success', true);
-                       }else{
-                       mysliceAlert('Rest Error for: '+data.error,'warning', true);
-                       }
-                }); // post update slice
-            
-               // TODO: refresh table
-               //window.location="/portal/institution#slices";
-
-            }); // button#addusers click
        $('[title!=""]').qtip();
     }); // document ready
 </script>
index b0ff707..988af27 100644 (file)
@@ -70,7 +70,9 @@ from plugins.topmenuvalidation import TopmenuValidation
 # for asynchronous management of topmenu
 def topmenu_items_live (current, page):
     request=page.request
-    query_pi_auths = Query.get('user').filter_by('user_hrn', '==', '$user_hrn' ).select('pi_authorities')
+    # XXX TODO This should be triggered only when user is logged in
+    # We might use local storage instead
+    query_pi_auths = Query.get('user').filter_by('user_hrn', '==', '$user_hrn' ).select('user_hrn','pi_authorities')
     page.enqueue_query(query_pi_auths)
 #        # even though this plugin does not have any html materialization, the corresponding domid
 #        # must exist because it is searched at init-time to create the JS plugin