Activated Filters plugin QueryEditor
[myslice.git] / portal / sliceview.py
index 6777d1d..5a47c74 100644 (file)
@@ -1,3 +1,4 @@
+import json
 from django.template                 import RequestContext
 from django.shortcuts                import render_to_response
 
@@ -5,8 +6,9 @@ from unfold.loginrequired            import LoginRequiredAutoLogoutView
 
 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_live, the_user
 
 from plugins.raw                     import Raw
 from plugins.stack                   import Stack
@@ -21,7 +23,7 @@ from plugins.querycode               import QueryCode
 # 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.query_editor            import QueryEditor
 from plugins.active_filters          import ActiveFilters
 from plugins.quickfilter             import QuickFilter
 from plugins.messages                import Messages
@@ -56,8 +58,7 @@ class SliceView (LoginRequiredAutoLogoutView):
         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()))
-        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']]
@@ -69,7 +70,8 @@ class SliceView (LoginRequiredAutoLogoutView):
         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',
                 'lease.urn',
                 'user.user_hrn',
@@ -77,17 +79,40 @@ class SliceView (LoginRequiredAutoLogoutView):
         )
         # for internal use in the querytable plugin;
         # needs to be a unique column present for each returned record
-        main_query_key = 'hrn'
+        main_query_init_key = 'hostname'
     
         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:
-            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
@@ -137,13 +162,13 @@ class SliceView (LoginRequiredAutoLogoutView):
         # Filter Resources
        
 # 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_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,
@@ -153,7 +178,7 @@ class SliceView (LoginRequiredAutoLogoutView):
             page                = page,
             title               = 'Filter Resources',
             domid               = 'filters',
-            sons                = [filter_query_editor, 
+            sons                = [filter_query_editor, 
                                    filter_active_filters],
             togglable           = True,
             toggled             = 'persistent',
@@ -173,7 +198,10 @@ class SliceView (LoginRequiredAutoLogoutView):
             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(),
+            # the key to use at init-time
+            init_key   = main_query_init_key,
             checkboxes = True,
             # center on Paris
             latitude   = 49.,
@@ -196,8 +224,7 @@ class SliceView (LoginRequiredAutoLogoutView):
             # this is the query at the core of the slice list
             query      = sq_resource,
             query_all  = query_resource_all,
-            # safer to use 'hrn' as the internal unique key for this plugin
-            id_key     = main_query_key,
+            init_key     = main_query_init_key,
             checkboxes = True,
             datatables_options = { 
                 'iDisplayLength': 25,
@@ -214,8 +241,7 @@ class SliceView (LoginRequiredAutoLogoutView):
                 # this is the query at the core of the slice list
                 query      = sq_resource,
                 query_all  = query_resource_all,
-                # safer to use 'hrn' as the internal unique key for this plugin
-                id_key     = main_query_key,
+                init_key     = main_query_init_key,
                 checkboxes = True,
                 )
 
@@ -245,8 +271,6 @@ class SliceView (LoginRequiredAutoLogoutView):
         if insert_grid:
             resources_sons.append(resources_as_grid)
 
-        print 40*'+-',"resources_sons has",len(resources_sons),"son"
-
         resources_area = Tabs ( page=page, 
                                 domid="resources",
                                 togglable=True,
@@ -261,7 +285,7 @@ class SliceView (LoginRequiredAutoLogoutView):
         # --------------------------------------------------------------------------
         # USERS
     
-        if do_query_users:
+        if do_query_users and query_user_all is not None:
             tab_users = Tabs(
                 page                = page,
                 domid               = 'users',
@@ -391,7 +415,6 @@ class SliceView (LoginRequiredAutoLogoutView):
                     outline_complete = True,
                     ))
     
-    
         # variables that will get passed to the view-unfold1.html template
         template_env = {}
         
@@ -401,20 +424,15 @@ class SliceView (LoginRequiredAutoLogoutView):
         # more general variables expected in the template
         template_env [ 'title' ] = '%(slicename)s'%locals()
         # the menu items on the top
-        template_env [ 'topmenu_items' ] = topmenu_items('Slice', request
+        template_env [ 'topmenu_items' ] = topmenu_items_live('Slice', page
         # so we can sho who is logged
         template_env [ 'username' ] = the_user (request) 
     
         # don't forget to run the requests
-        page.expose_queries ()
-    
-        # xxx create another plugin with the same query and a different layout (with_datatables)
-        # show that it worls as expected, one single api call to backend and 2 refreshed views
-    
+        page.expose_js_metadata()
         # the prelude object in page contains a summary of the requirements() for all plugins
         # define {js,css}_{files,chunks}
-        prelude_env = page.prelude_env()
-        template_env.update(prelude_env)
-        result=render_to_response ('view-unfold1.html',template_env,
+        template_env.update(page.prelude_env())
+
+        return render_to_response ('view-unfold1.html',template_env,
                                    context_instance=RequestContext(request))
-        return result