def dashboard_view(request): page = Page(request) slices_query = Query.get('slice').select('slice_hrn') #old# # xxx filter : should filter on the slices the logged user can see #old# # we don't have the user's hrn yet #old# # in addition this currently returns all slices anyways #old# # filter = ... #old# sort='slice_hrn',) page.enqueue_query(slices_query) main_plugin = Stack( page=page, title="Putting stuff together", sons=[ QueryCode( page=page, title="Vizualize your query", query=slices_query, toggled=False, ), QuickFilter( # we play with this one for demo purposes in dashboard.css domid='myquickfilter', page=page, title='play with filters', criterias=quickfilter_criterias, toggled=False, ), SliceList( # setting visible attributes first page=page, title='Asynchroneous SliceList', header='slices list', with_datatables=False, # this is the query at the core of the slice list query=slices_query, ), ]) # variables that will get passed to the view-unfold2.html template template_env = {} # define 'unfold_main' to the template engine template_env['unfold_main'] = main_plugin.render(request) # more general variables expected in the template template_env['title'] = 'Test view for a full request cycle' # the menu items on the top template_env['topmenu_items'] = topmenu_items_live('dashboard', page) # so we can sho who is logged template_env['username'] = the_user(request) # ########## add another plugin with the same request, on the RHS pane # will show up in the right-hand side area named 'related' related_plugin = SliceList( page=page, title='Same request, other layout', domid='sidelist', with_datatables=True, header='paginated slices', # share the query query=slices_query, ) # likewise but on the side view template_env['unfold_margin'] = related_plugin.render(request) # add our own css in the mix #page.add_css_files ( 'css/dashboard.css') # 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) return render_to_response('view-unfold2.html', template_env, context_instance=RequestContext(request))
def test_plugin_view(request): page = Page(request) page.expose_js_metadata() # variables that will get passed to this template template_env = {} slicename = 'ple.inria.heartbeat' main_query = Query.get('resource').filter_by( 'slice_hrn', '=', slicename).select(['network', 'type', 'hrn', 'hostname', 'sliver']) # without an querytable, this would use use : run_it=False as nothing would listen to the results page.enqueue_query( main_query, # run_it=False ) main_plugin = \ Stack ( page=page, title='thestack', togglable=True, domid='stack', sons=[ \ # make sure the 2 things work together Messages ( page=page, title="Transient Runtime messages", domid="messages-transient", levels='ALL', ), QueryTable ( page=page, title="Slice %s - checkboxes"%slicename, query=main_query, domid="querytable", checkboxes=True, togglable=True, ), Messages ( page=page, title="Inline Runtime messages", domid="messages", levels='ALL', togglable=True, transient=False, ), Raw ( page=page, title="issue messages", togglable=True, html=""" <input type="button" id="bouton" value="Click me" /> """, ), ]) page.add_js_chunks(""" function issue_debug() {console.log("issue_debug");messages.debug("issue_debug");}; $(function(){$("#bouton").click(issue_debug);}); """) # define 'unfold_main' to the template engine template_env['unfold_main'] = main_plugin.render(request) # more general variables expected in the template template_env['title'] = 'Single Plugin View' template_env['topmenu_items'] = topmenu_items_live('plugin', page) template_env['username'] = the_user(request) # 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) return render_to_response('view-unfold1.html', template_env, context_instance=RequestContext(request))
def get(self, request, slicename=tmp_default_slice): page = Page(request) page.add_css_files('css/slice-view.css') 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")) page.add_js_chunks( '$(function() { messages.debug("manifold URL %s"); });' % (ConfigEngine().manifold_url())) metadata = page.get_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.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 = 'hostname' query_resource_all = Query.get('resource').select(resource_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: # 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 sq_resource = aq.subquery('resource') sq_user = aq.subquery('user') sq_lease = aq.subquery('lease') sq_measurement = aq.subquery('measurement') # Prepare the display according to all metadata # (some parts will be pending, others can be triggered by users). # # For example slice measurements will not be requested by default... # Create the base layout (Stack)... main_stack = Stack( page=page, title="Slice %s" % slicename, sons=[], ) # ... responsible for the slice properties... # a nice header main_stack.insert( Raw(page=page, togglable=False, toggled=True, html="<h2 class='well well-lg'> Slice %s</h2>" % slicename)) # -------------------------------------------------------------------------- #DEPRECATED| # QueryUpdater (Pending Operations) #DEPRECATED| #DEPRECATED| main_stack.insert(QueryUpdater( #DEPRECATED| page = page, #DEPRECATED| title = 'Pending operations', #DEPRECATED| query = main_query, #DEPRECATED| togglable = True, #DEPRECATED| # start turned off, it will open up itself when stuff comes in #DEPRECATED| toggled = False, #DEPRECATED| domid = 'pending', #DEPRECATED| outline_complete = True, #DEPRECATED| )) # -------------------------------------------------------------------------- # 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_active_filters = ActiveFilters( page=page, query=sq_resource, title="Active Filters", ) filters_area = Stack( page=page, title='Filter Resources', domid='filters', sons=[filter_query_editor, filter_active_filters], togglable=True, toggled='persistent', outline_complete=True, ) main_stack.insert(filters_area) # -------------------------------------------------------------------------- # RESOURCES # the resources part is made of a Tabs (Geographic, List), resources_as_gmap = 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, ) 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, domid='resources-list', title='List view', # this is the query at the core of the slice list query=sq_resource, query_all=query_resource_all, init_key=main_query_init_key, checkboxes=True, datatables_options={ 'iDisplayLength': 25, 'bLengthChange': True, 'bAutoWidth': True, }, ) 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, 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_sons, active_domid='resources-map', persistent_active=True, ) main_stack.insert(resources_area) # -------------------------------------------------------------------------- # USERS if do_query_users and query_user_all is not None: tab_users = Tabs( page=page, domid='users', outline_complete=True, togglable=True, title='Users', active_domid='users-list', ) main_stack.insert(tab_users) tab_users.insert( QueryTable( page=page, title='Users List', domid='users-list', # tab's sons preferably turn this off togglable=False, # this is the query at the core of the slice list query=sq_user, query_all=query_user_all, checkboxes=True, datatables_options={ 'iDisplayLength': 25, 'bLengthChange': True, 'bAutoWidth': True, }, )) # DEMO # -------------------------------------------------------------------------- # MEASUREMENTS measurements_stats_cpu = SliceStat(title="CPU Usage", domid='resources-stats-cpu', page=page, stats='slice', key='hrn', query='none', slicename=slicename, o='cpu') measurements_stats_mem = SliceStat(title="Memory Usage", domid='resources-stats-mem', page=page, stats='slice', key='hrn', query='none', slicename=slicename, o='mem') measurements_stats_asb = SliceStat(title="Traffic Sent", domid='resources-stats-asb', page=page, stats='slice', key='hrn', query='none', slicename=slicename, o='asb') measurements_stats_arb = SliceStat(title="Traffic Received", domid='resources-stats-arb', page=page, stats='slice', key='hrn', query='none', slicename=slicename, o='arb') tab_measurements = Tabs( page=page, domid="measurements", togglable=True, toggled='persistent', title="Measurements", outline_complete=True, sons=[ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ], active_domid='resources-stats-cpu', persistent_active=True, ) main_stack.insert(tab_measurements) # tab_measurements = Tabs ( # page = page, # active_domid = 'measurements-list', # outline_complete = True, # togglable = True, # title = 'Measurements', # domid = 'measurements', # ) # main_stack.insert(tab_measurements) # # tab_measurements.insert(QueryTable( # page = page, # title = 'Measurements', # domid = 'measurements-list', # # tab's sons preferably turn this off # togglable = False, # # this is the query at the core of the slice list # query = sq_measurement, # # do NOT set checkboxes to False # # this table being otherwise empty, it just does not fly with dataTables # checkboxes = True, # datatables_options = { # 'iDisplayLength' : 25, # 'bLengthChange' : True, # 'bAutoWidth' : True, # }, # )) # # # -------------------------------------------------------------------------- # # MESSAGES (we use transient=False for now) if insert_messages: main_stack.insert( Messages( page=page, title="Runtime messages for slice %s" % slicename, domid="msgs-pre", levels="ALL", # plain messages are probably less nice for production but more reliable for development for now transient=False, # these make sense only in non-transient mode.. togglable=True, toggled='persistent', outline_complete=True, )) # variables that will get passed to the view-unfold1.html template template_env = {} # define 'unfold_main' to the template engine - the main contents template_env['unfold_main'] = main_stack.render(request) # 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_live('Slice', page) # so we can sho who is logged template_env['username'] = the_user(request) template_env['theme'] = self.theme # don't forget to run the requests page.expose_js_metadata() # the prelude object in page contains a summary of the requirements() for all plugins # define {js,css}_{files,chunks} template_env.update(page.prelude_env()) return render_to_response('view-unfold1.html', template_env, context_instance=RequestContext(request))
def get (self,request, slicename=tmp_default_slice): page = Page(request) page.add_css_files ('css/slice-view.css') 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")) page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url())) metadata = page.get_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.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 = 'hostname' query_resource_all = Query.get('resource').select(resource_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: # 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 sq_resource = aq.subquery('resource') sq_user = aq.subquery('user') sq_lease = aq.subquery('lease') sq_measurement = aq.subquery('measurement') # Prepare the display according to all metadata # (some parts will be pending, others can be triggered by users). # # For example slice measurements will not be requested by default... # Create the base layout (Stack)... main_stack = Stack ( page=page, title="Slice %s"%slicename, sons=[], ) # ... responsible for the slice properties... # a nice header main_stack.insert ( Raw (page=page, togglable=False, toggled=True, html="<h2 class='well well-lg'> Slice %s</h2>"%slicename) ) # -------------------------------------------------------------------------- # QueryUpdater (Pending Operations) main_stack.insert(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, )) # -------------------------------------------------------------------------- # 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_active_filters = ActiveFilters( page = page, query = sq_resource, title = "Active Filters", ) filters_area = Stack( page = page, title = 'Filter Resources', domid = 'filters', sons = [filter_query_editor, filter_active_filters], togglable = True, toggled = 'persistent', outline_complete = True, ) main_stack.insert (filters_area) # -------------------------------------------------------------------------- # RESOURCES # the resources part is made of a Tabs (Geographic, List), resources_as_gmap = 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, ) 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, domid = 'resources-list', title = 'List view', # this is the query at the core of the slice list query = sq_resource, query_all = query_resource_all, init_key = main_query_init_key, checkboxes = True, datatables_options = { 'iDisplayLength': 25, 'bLengthChange' : True, 'bAutoWidth' : True, }, ) 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, 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, # ) resources_as_scheduler2 = Scheduler2( page = page, domid = 'scheduler', title = 'Scheduler', # this is the query at the core of the slice list 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_scheduler2, resources_as_list_area, ] if do_query_leases else [ resources_as_gmap, resources_as_3dmap, resources_as_list_area, resources_as_scheduler2, ] 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_sons, active_domid = 'scheduler', persistent_active=True, ) main_stack.insert (resources_area) # -------------------------------------------------------------------------- # USERS if do_query_users and query_user_all is not None: tab_users = Tabs( page = page, domid = 'users', outline_complete = True, togglable = True, title = 'Users', active_domid = 'users-list', ) main_stack.insert(tab_users) tab_users.insert(QueryTable( page = page, title = 'Users List', domid = 'users-list', # tab's sons preferably turn this off togglable = False, # this is the query at the core of the slice list query = sq_user, query_all = query_user_all, checkboxes = True, datatables_options = { 'iDisplayLength' : 25, 'bLengthChange' : True, 'bAutoWidth' : True, }, )) # DEMO # -------------------------------------------------------------------------- # MEASUREMENTS measurements_stats_cpu = SliceStat( title = "CPU Usage", domid = 'resources-stats-cpu', page = page, stats = 'slice', key = 'hrn', query = 'none', slicename = slicename, o = 'cpu' ) measurements_stats_mem = SliceStat( title = "Memory Usage", domid = 'resources-stats-mem', page = page, stats = 'slice', key = 'hrn', query = 'none', slicename = slicename, o = 'mem' ) measurements_stats_asb = SliceStat( title = "Traffic Sent", domid = 'resources-stats-asb', page = page, stats = 'slice', key = 'hrn', query = 'none', slicename = slicename, o = 'asb' ) measurements_stats_arb = SliceStat( title = "Traffic Received", domid = 'resources-stats-arb', page = page, stats = 'slice', key = 'hrn', query = 'none', slicename = slicename, o = 'arb' ) tab_measurements = Tabs ( page=page, domid = "measurements", togglable = True, toggled = 'persistent', title = "Measurements", outline_complete=True, sons = [ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ], active_domid = 'resources-stats-cpu', persistent_active = True, ) main_stack.insert (tab_measurements) # tab_measurements = Tabs ( # page = page, # active_domid = 'measurements-list', # outline_complete = True, # togglable = True, # title = 'Measurements', # domid = 'measurements', # ) # main_stack.insert(tab_measurements) # # tab_measurements.insert(QueryTable( # page = page, # title = 'Measurements', # domid = 'measurements-list', # # tab's sons preferably turn this off # togglable = False, # # this is the query at the core of the slice list # query = sq_measurement, # # do NOT set checkboxes to False # # this table being otherwise empty, it just does not fly with dataTables # checkboxes = True, # datatables_options = { # 'iDisplayLength' : 25, # 'bLengthChange' : True, # 'bAutoWidth' : True, # }, # )) # # # -------------------------------------------------------------------------- # # MESSAGES (we use transient=False for now) if insert_messages: main_stack.insert(Messages( page = page, title = "Runtime messages for slice %s"%slicename, domid = "msgs-pre", levels = "ALL", # plain messages are probably less nice for production but more reliable for development for now transient = False, # these make sense only in non-transient mode.. togglable = True, toggled = 'persistent', outline_complete = True, )) # variables that will get passed to the view-unfold1.html template template_env = {} # define 'unfold_main' to the template engine - the main contents template_env [ 'unfold_main' ] = main_stack.render(request) # 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_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_js_metadata() # the prelude object in page contains a summary of the requirements() for all plugins # define {js,css}_{files,chunks} template_env.update(page.prelude_env()) return render_to_response ('view-unfold1.html',template_env, context_instance=RequestContext(request))
def get (self,request, slicename=tmp_default_slice): page = Page(request) page.add_css_files ('css/slice-view.css') 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")) page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url())) metadata = page.get_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.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 = 'hostname' query_resource_all = Query.get('resource').select(resource_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: # 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 sq_resource = aq.subquery('resource') sq_user = aq.subquery('user') sq_lease = aq.subquery('lease') sq_measurement = aq.subquery('measurement') # Prepare the display according to all metadata # (some parts will be pending, others can be triggered by users). # # For example slice measurements will not be requested by default... # Create the base layout (Stack)... main_stack = Stack ( page=page, title="Slice %s"%slicename, sons=[], ) # ... responsible for the slice properties... # a nice header main_stack.insert ( Raw (page=page, togglable=False, toggled=True, html="<h2 class='well well-lg'> Slice %s</h2>"%slicename) ) # -------------------------------------------------------------------------- # QueryUpdater (Pending Operations) main_stack.insert(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, )) # -------------------------------------------------------------------------- # 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_active_filters = ActiveFilters( page = page, query = sq_resource, title = "Active Filters", ) filters_area = Stack( page = page, title = 'Filter Resources', domid = 'filters', sons = [filter_query_editor, filter_active_filters], togglable = True, toggled = 'persistent', outline_complete = True, ) main_stack.insert (filters_area) # -------------------------------------------------------------------------- # RESOURCES # the resources part is made of a Tabs (Geographic, List), resources_as_gmap = 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, ) 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, domid = 'resources-list', title = 'List view', # this is the query at the core of the slice list query = sq_resource, query_all = query_resource_all, init_key = main_query_init_key, checkboxes = True, datatables_options = { 'iDisplayLength': 25, 'bLengthChange' : True, 'bAutoWidth' : True, }, ) 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, 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, # ) resources_as_scheduler2 = Scheduler2( page = page, domid = 'scheduler', title = 'Scheduler', # this is the query at the core of the slice list query = sq_resource, query_all_resources = query_resource_all, query_lease = sq_lease, )
def dashboard_view(request): page = Page(request) slices_query = Query.get("slice").select("slice_hrn") # old# # xxx filter : should filter on the slices the logged user can see # old# # we don't have the user's hrn yet # old# # in addition this currently returns all slices anyways # old# # filter = ... # old# sort='slice_hrn',) page.enqueue_query(slices_query) main_plugin = Stack( page=page, title="Putting stuff together", sons=[ QueryCode(page=page, title="Vizualize your query", query=slices_query, toggled=False), QuickFilter( # we play with this one for demo purposes in dashboard.css domid="myquickfilter", page=page, title="play with filters", criterias=quickfilter_criterias, toggled=False, ), SliceList( # setting visible attributes first page=page, title="Asynchroneous SliceList", header="slices list", with_datatables=False, # this is the query at the core of the slice list query=slices_query, ), ], ) # variables that will get passed to the view-unfold2.html template template_env = {} # define 'unfold_main' to the template engine template_env["unfold_main"] = main_plugin.render(request) # more general variables expected in the template template_env["title"] = "Test view for a full request cycle" # the menu items on the top template_env["topmenu_items"] = topmenu_items_live("dashboard", page) # so we can sho who is logged template_env["username"] = the_user(request) # ########## add another plugin with the same request, on the RHS pane # will show up in the right-hand side area named 'related' related_plugin = SliceList( page=page, title="Same request, other layout", domid="sidelist", with_datatables=True, header="paginated slices", # share the query query=slices_query, ) # likewise but on the side view template_env["unfold_margin"] = related_plugin.render(request) # add our own css in the mix # page.add_css_files ( 'css/dashboard.css') # 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) return render_to_response("view-unfold2.html", template_env, context_instance=RequestContext(request))
def test_plugin_view (request): page = Page(request) page.expose_js_metadata() # variables that will get passed to this template template_env = {} slicename='ple.inria.heartbeat' main_query = Query.get('resource').filter_by('slice_hrn', '=', slicename).select(['network','type','hrn','hostname','sliver']) # without an querytable, this would use use : run_it=False as nothing would listen to the results page.enqueue_query (main_query, # run_it=False ) main_plugin = \ Stack ( page=page, title='thestack', togglable=True, domid='stack', sons=[ \ # make sure the 2 things work together Messages ( page=page, title="Transient Runtime messages", domid="messages-transient", levels='ALL', ), QueryTable ( page=page, title="Slice %s - checkboxes"%slicename, query=main_query, domid="querytable", checkboxes=True, togglable=True, ), Messages ( page=page, title="Inline Runtime messages", domid="messages", levels='ALL', togglable=True, transient=False, ), Raw ( page=page, title="issue messages", togglable=True, html=""" <input type="button" id="bouton" value="Click me" /> """, ), ]) page.add_js_chunks ( """ function issue_debug() {console.log("issue_debug");messages.debug("issue_debug");}; $(function(){$("#bouton").click(issue_debug);}); """) # define 'unfold_main' to the template engine template_env [ 'unfold_main' ] = main_plugin.render(request) # more general variables expected in the template template_env [ 'title' ] = 'Single Plugin View' template_env [ 'topmenu_items' ] = topmenu_items_live('plugin', page) template_env [ 'username' ] = the_user (request) # 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) return render_to_response ('view-unfold1.html',template_env, context_instance=RequestContext(request))