X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=portal%2Fsliceview.py;h=8e103a1ff85d44d57e9500c1bc668e4c4a4da167;hb=f9d7861ae487f2fa696ea37d16779e5e042e2281;hp=3822321007c5ee3d9f662d5fc340d71e5275b546;hpb=78f61768d16b75e86ad003f011a16c25f777db76;p=myslice.git diff --git a/portal/sliceview.py b/portal/sliceview.py index 38223210..8e103a1f 100644 --- a/portal/sliceview.py +++ b/portal/sliceview.py @@ -1,3 +1,4 @@ +import json 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 manifold.manifoldapi import execute_query from ui.topmenu import topmenu_items, the_user +from plugins.validatebutton import ValidateButton 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.scheduler import Scheduler 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 @@ -27,8 +35,14 @@ from myslice.config import Config tmp_default_slice='ple.upmc.myslicedemo' # temporary : turn off the users part to speed things up -#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 @@ -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_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']] @@ -57,22 +73,49 @@ 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', + '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 = '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 @@ -121,13 +164,14 @@ class SliceView (LoginRequiredAutoLogoutView): # -------------------------------------------------------------------------- # 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, @@ -137,7 +181,8 @@ class SliceView (LoginRequiredAutoLogoutView): 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, @@ -156,6 +201,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., @@ -163,16 +212,13 @@ class SliceView (LoginRequiredAutoLogoutView): 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, @@ -181,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, + # use 'hrn' as the internal unique key for this plugin + init_key = main_query_init_key, checkboxes = True, datatables_options = { 'iDisplayLength': 25, @@ -189,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 + 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, - sons=[ resources_as_gmap, -# see above -# resources_as_3dmap, - resources_as_list_area, ], + sons= resources_sons, active_domid = 'resources-map', + persistent_active=True, ) 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', @@ -338,7 +421,23 @@ class SliceView (LoginRequiredAutoLogoutView): 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 + validatebutton = ValidateButton (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 + validatebutton.render(request) +# end topmenu addition + # variables that will get passed to the view-unfold1.html template template_env = {}