renamed validatebutton into topmenuvalidation
[myslice.git] / portal / sliceview.py
index 753c92a..91d60ef 100644 (file)
@@ -1,3 +1,4 @@
+import json
 from django.template                 import RequestContext
 from django.shortcuts                import render_to_response
 
 from django.template                 import RequestContext
 from django.shortcuts                import render_to_response
 
@@ -5,18 +6,25 @@ from unfold.loginrequired            import LoginRequiredAutoLogoutView
 
 from unfold.page                     import Page
 from manifold.core.query             import Query, AnalyzedQuery
 
 from unfold.page                     import Page
 from manifold.core.query             import Query, AnalyzedQuery
+from manifold.manifoldapi            import execute_query
 
 from ui.topmenu                      import topmenu_items, the_user
 
 
 from ui.topmenu                      import topmenu_items, the_user
 
+from plugins.topmenuvalidation          import TopmenuValidation
 from plugins.raw                     import Raw
 from plugins.stack                   import Stack
 from plugins.tabs                    import Tabs
 from plugins.querytable              import QueryTable 
 from plugins.raw                     import Raw
 from plugins.stack                   import Stack
 from plugins.tabs                    import Tabs
 from plugins.querytable              import QueryTable 
+from plugins.querygrid               import QueryGrid
 from plugins.queryupdater            import QueryUpdater
 from plugins.googlemap               import GoogleMap
 from plugins.senslabmap              import SensLabMap
 from plugins.queryupdater            import QueryUpdater
 from plugins.googlemap               import GoogleMap
 from plugins.senslabmap              import SensLabMap
+from plugins.scheduler               import Scheduler
 from plugins.querycode               import QueryCode
 from plugins.querycode               import QueryCode
-from plugins.query_editor            import QueryEditor
+# Thierry
+# stay away from query editor for now as it seems to make things go very slow
+# see https://lists.myslice.info/pipermail/devel-myslice/2013-December/000221.html 
+#from plugins.query_editor            import QueryEditor
 from plugins.active_filters          import ActiveFilters
 from plugins.quickfilter             import QuickFilter
 from plugins.messages                import Messages
 from plugins.active_filters          import ActiveFilters
 from plugins.quickfilter             import QuickFilter
 from plugins.messages                import Messages
@@ -30,6 +38,12 @@ tmp_default_slice='ple.upmc.myslicedemo'
 #do_query_users=True
 do_query_users=False
 
 #do_query_users=True
 do_query_users=False
 
+#do_query_leases=True
+do_query_leases=False
+
+insert_grid=False
+#insert_grid=True
+
 insert_messages=False
 #insert_messages=True
 
 insert_messages=False
 #insert_messages=True
 
@@ -42,10 +56,12 @@ class SliceView (LoginRequiredAutoLogoutView):
         page.add_js_files  ( [ "js/common.functions.js" ] )
         page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
         page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
         page.add_js_files  ( [ "js/common.functions.js" ] )
         page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
         page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
+        page.add_js_chunks ('$(function() { messages.debug("sliceview: leases turned %s"); });'%("on" if do_query_leases else "off"))
         config=Config()
         page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(config.manifold_url()))
         config=Config()
         page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(config.manifold_url()))
+
         page.expose_js_metadata()
         page.expose_js_metadata()
-    
+
         metadata = page.get_metadata()
         resource_md = metadata.details_by_object('resource')
         resource_fields = [column['name'] for column in resource_md['column']]
         metadata = page.get_metadata()
         resource_md = metadata.details_by_object('resource')
         resource_fields = [column['name'] for column in resource_md['column']]
@@ -57,22 +73,49 @@ class SliceView (LoginRequiredAutoLogoutView):
         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
         main_query.select(
                 'slice_hrn',
         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
         main_query.select(
                 'slice_hrn',
-                'resource.hrn', 'resource.hostname', 'resource.type', 
+                #'resource.hrn', 'resource.urn', 
+                'resource.hostname', 'resource.type', 
                 'resource.network_hrn',
                 'resource.network_hrn',
-                #'lease.urn',
+                'lease.urn',
                 'user.user_hrn',
                 #'application.measurement_point.counter'
         )
                 '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 = 'hostname'
     
         query_resource_all = Query.get('resource').select(resource_fields)
     
         query_resource_all = Query.get('resource').select(resource_fields)
-        if do_query_users:
-            query_user_all = Query.get('user').select(user_fields)
-    
+
         aq = AnalyzedQuery(main_query, metadata=metadata)
         page.enqueue_query(main_query, analyzed_query=aq)
         page.enqueue_query(query_resource_all)
         if do_query_users:
         aq = AnalyzedQuery(main_query, metadata=metadata)
         page.enqueue_query(main_query, analyzed_query=aq)
         page.enqueue_query(query_resource_all)
         if do_query_users:
-            page.enqueue_query(query_user_all)
+            # Required: the user must have an authority in its user.config
+            # XXX Temporary solution
+            user_query  = Query().get('local:user').select('config','email')
+            user_details = execute_query(self.request, user_query)
+            
+            # not always found in user_details...
+            config={}
+#            for user_detail in user_details:
+#                #email = user_detail['email']
+#                if user_detail['config']:
+#                    config = json.loads(user_detail['config'])
+#            user_detail['authority'] = config.get('authority',"Unknown Authority")
+#
+#            if user_detail['authority'] is not None:
+#                sub_authority = user_detail['authority'].split('.')
+#                root_authority = sub_authority[0]
+#                query_user_all = Query.get(root_authority+':user').select(user_fields)
+#
+#                # XXX TODO this filter doesn't work - to be improved in Manifold
+#                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
+#
+#                page.enqueue_query(query_user_all)
+#            else:
+#                print "authority of the user is not in local:user db"
+            query_user_all = Query.get('user').select(user_fields)
+            #    query_user_all = None
     
         # ... and for the relations
         # XXX Let's hardcode resources for now
     
         # ... and for the relations
         # XXX Let's hardcode resources for now
@@ -121,13 +164,14 @@ class SliceView (LoginRequiredAutoLogoutView):
         # --------------------------------------------------------------------------
         # Filter Resources
        
         # --------------------------------------------------------------------------
         # Filter Resources
        
-        filter_query_editor = QueryEditor(
-            page  = page,
-            query = sq_resource, 
-            query_all = query_resource_all,
-            title = "Select Columns",
-            domid = 'select-columns',
-            )
+# turn off for now -- see above
+#        filter_query_editor = QueryEditor(
+#            page  = page,
+#            query = sq_resource, 
+#            query_all = query_resource_all,
+#            title = "Select Columns",
+#            domid = 'select-columns',
+#            )
         filter_active_filters = ActiveFilters(
             page  = page,
             query = sq_resource,
         filter_active_filters = ActiveFilters(
             page  = page,
             query = sq_resource,
@@ -137,7 +181,8 @@ class SliceView (LoginRequiredAutoLogoutView):
             page                = page,
             title               = 'Filter Resources',
             domid               = 'filters',
             page                = page,
             title               = 'Filter Resources',
             domid               = 'filters',
-            sons                = [filter_query_editor, filter_active_filters],
+            sons                = [# filter_query_editor, 
+                                   filter_active_filters],
             togglable           = True,
             toggled             = 'persistent',
             outline_complete    = True, 
             togglable           = True,
             toggled             = 'persistent',
             outline_complete    = True, 
@@ -156,7 +201,10 @@ class SliceView (LoginRequiredAutoLogoutView):
             togglable  = False,
             query      = sq_resource,
             query_all  = query_resource_all,
             togglable  = False,
             query      = sq_resource,
             query_all  = query_resource_all,
+            # this key is the one issued by google
             googlemap_api_key = Config().googlemap_api_key(),
             googlemap_api_key = Config().googlemap_api_key(),
+            # the key to use at init-time
+            init_key   = main_query_init_key,
             checkboxes = True,
             # center on Paris
             latitude   = 49.,
             checkboxes = True,
             # center on Paris
             latitude   = 49.,
@@ -164,16 +212,13 @@ class SliceView (LoginRequiredAutoLogoutView):
             zoom       = 4,
         )
 
             zoom       = 4,
         )
 
-# because (senslab)map.css changes stuff for *all* canvas elements
-# it destroys the googlemap behaviour
-# turning this off for now until Anthony can fix that
-#        resources_as_3dmap = SensLabMap(
-#            page       = page,
-#            title      = '3D Map',
-#            domid      = 'senslabmap',
-#            query      = sq_resource,
-#            query_all  = query_resource_all,
-#        )
+        resources_as_3dmap = SensLabMap(
+            page       = page,
+            title      = '3D Map',
+            domid      = 'senslabmap',
+            query      = sq_resource,
+            query_all  = query_resource_all,
+        )
 
         resources_as_list = QueryTable( 
             page       = page,
 
         resources_as_list = QueryTable( 
             page       = page,
@@ -182,6 +227,8 @@ class SliceView (LoginRequiredAutoLogoutView):
             # this is the query at the core of the slice list
             query      = sq_resource,
             query_all  = query_resource_all,
             # this is the query at the core of the slice list
             query      = sq_resource,
             query_all  = query_resource_all,
+            # use 'hrn' as the internal unique key for this plugin
+            init_key     = main_query_init_key,
             checkboxes = True,
             datatables_options = { 
                 'iDisplayLength': 25,
             checkboxes = True,
             datatables_options = { 
                 'iDisplayLength': 25,
@@ -190,26 +237,61 @@ class SliceView (LoginRequiredAutoLogoutView):
                 },
             )
 
                 },
             )
 
+        if insert_grid:
+            resources_as_grid = QueryGrid( 
+                page       = page,
+                domid      = 'resources-grid',
+                title      = 'Grid view',
+                # this is the query at the core of the slice list
+                query      = sq_resource,
+                query_all  = query_resource_all,
+                # use 'hrn' as the internal unique key for this plugin
+                # xxx todo on querygrid as well
+                # init_key     = main_query_init_key,
+                checkboxes = True,
+                )
+
+        if do_query_leases:
+            resources_as_scheduler = Scheduler(
+                page        = page,
+                title       = 'Scheduler',
+                domid       = 'scheduler',
+                query       = sq_resource,
+                query_all_resources = query_resource_all,
+                query_lease = sq_lease,
+                )
+
        # with the new 'Filter' stuff on top, no need for anything but the querytable
         resources_as_list_area = resources_as_list 
 
        # with the new 'Filter' stuff on top, no need for anything but the querytable
         resources_as_list_area = resources_as_list 
 
+        resources_sons = [
+            resources_as_gmap, 
+            resources_as_3dmap,
+            resources_as_scheduler,
+            resources_as_list_area,
+            ] if do_query_leases else [
+            resources_as_gmap, 
+            resources_as_3dmap,
+            resources_as_list_area,
+            ]
+        if insert_grid:
+            resources_sons.append(resources_as_grid)
+
         resources_area = Tabs ( page=page, 
                                 domid="resources",
                                 togglable=True,
                                 title="Resources",
                                 outline_complete=True,
         resources_area = Tabs ( page=page, 
                                 domid="resources",
                                 togglable=True,
                                 title="Resources",
                                 outline_complete=True,
-                                sons=[ resources_as_gmap, 
-# see above
-#                                       resources_as_3dmap,
-                                       resources_as_list_area, ],
+                                sons= resources_sons,
                                 active_domid = 'resources-map',
                                 active_domid = 'resources-map',
+                                persistent_active=True,
                                 )
         main_stack.insert (resources_area)
 
         # --------------------------------------------------------------------------
         # USERS
     
                                 )
         main_stack.insert (resources_area)
 
         # --------------------------------------------------------------------------
         # USERS
     
-        if do_query_users:
+        if do_query_users and query_user_all is not None:
             tab_users = Tabs(
                 page                = page,
                 domid               = 'users',
             tab_users = Tabs(
                 page                = page,
                 domid               = 'users',
@@ -339,7 +421,24 @@ class SliceView (LoginRequiredAutoLogoutView):
                     outline_complete = True,
                     ))
     
                     outline_complete = True,
                     ))
     
-    
+# topmenu animation
+# xxx all this should go into a plugin if its own with the topmenu and all...
+        query_pi_auths = Query.get('ple:user').filter_by('user_hrn', '==', '$user_hrn' ).select('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
+        # so we simply piggy-back the target button here
+        topmenuvalidation = TopmenuValidation (
+            page=page, 
+            # see above
+            domid='topmenu-validation',
+            query=query_pi_auths,
+            # this one is the target for a $.show() when the query comes back
+            button_domid="topmenu-validation")
+        # although the result does not matter, rendering is required for the JS init code to make it in the page
+        topmenuvalidation.render(request)
+# end topmenu addition
+
         # variables that will get passed to the view-unfold1.html template
         template_env = {}
         
         # variables that will get passed to the view-unfold1.html template
         template_env = {}