- 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 = Config().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,
- # use 'hrn' as the internal unique key for this plugin
- 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,
- # 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_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 = False,
- title="Measurements",
- outline_complete=True,
- sons=[ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ],
- active_domid = 'measurements_stats_cpu',
- )
- 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,
- ))
-
-# 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 = {}
-
- # 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('Slice', request)
- # 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
-
- # 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,
- context_instance=RequestContext(request))
- return result