Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
[myslice.git] / portal / sliceresourceview.py
1 from django.template                 import RequestContext
2 from django.shortcuts                import render_to_response
3
4 from manifold.core.query             import Query, AnalyzedQuery
5 from manifoldapi.manifoldapi         import execute_query
6
7 from django.views.generic.base      import TemplateView
8
9 from unfold.loginrequired           import LoginRequiredView
10 from django.http import HttpResponse
11 from django.shortcuts import render
12
13 from unfold.page                     import Page
14 from manifold.core.query             import Query, AnalyzedQuery
15 from manifoldapi.manifoldapi         import execute_query
16
17 from myslice.configengine            import ConfigEngine
18 from plugins.querytable              import QueryTable
19 from plugins.googlemap               import GoogleMap
20 from plugins.queryupdater            import QueryUpdater
21
22 from theme import ThemeView
23
24 class SliceResourceView (LoginRequiredView, ThemeView):
25     template_name = "slice-resource-view.html"
26     
27     def get(self, request, slicename):
28
29         if request.GET.get('message') : 
30             msg = "Slice successfully updated"
31         else :
32             msg = None
33
34         page = Page(request)
35         metadata = page.get_metadata()
36         page.expose_js_metadata()
37
38         resource_md = metadata.details_by_object('resource')
39         resource_fields = [column['name'] for column in resource_md['column']]
40
41         user_md = metadata.details_by_object('user')
42         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
43
44         # TODO The query to run is embedded in the URL
45         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
46         main_query.select(
47                 'slice_hrn',
48                 'resource.urn', 
49                 'resource.hostname', 'resource.type',
50                 'resource.network_hrn',
51                 'lease.urn',
52                 'user.user_hrn',
53                 #'application.measurement_point.counter'
54         )
55         # for internal use in the querytable plugin;
56         # needs to be a unique column present for each returned record
57         main_query_init_key = 'urn'
58         aq = AnalyzedQuery(main_query, metadata=metadata)
59         page.enqueue_query(main_query, analyzed_query=aq)
60
61         query_resource_all = Query.get('resource').select(resource_fields)
62         page.enqueue_query(query_resource_all)
63
64         sq_resource    = aq.subquery('resource')
65         sq_lease       = aq.subquery('lease')
66
67         list_resources = QueryTable(
68             page       = page,
69             domid      = 'resources-list',
70             title      = 'List view',
71             query      = sq_resource,
72             query_all  = query_resource_all,
73             init_key   = "urn",
74             checkboxes = True,
75             datatables_options = {
76                 'iDisplayLength': 25,
77                 'bLengthChange' : True,
78                 'bAutoWidth'    : True,
79                 },
80         )
81
82         # --------------------------------------------------------------------------
83         # RESOURCES
84         # the resources part is made of a Tabs (Geographic, List), 
85
86         map_resources  = GoogleMap(
87             page       = page,
88             title      = 'Geographic view',
89             domid      = 'resources-map',
90             # tab's sons preferably turn this off
91             togglable  = False,
92             query      = sq_resource,
93             query_all  = query_resource_all,
94             # this key is the one issued by google
95             googlemap_api_key = ConfigEngine().googlemap_api_key(),
96             # the key to use at init-time
97             init_key   = main_query_init_key,
98             checkboxes = True,
99             # center on Paris
100             latitude   = 49.,
101             longitude  = 9,
102             zoom       = 4,
103         )
104
105         # --------------------------------------------------------------------------
106         # QueryUpdater (Pending Operations)
107  
108         pending_resources = QueryUpdater(
109             page                = page,
110             title               = 'Pending operations',
111             query               = main_query,
112             togglable           = True,
113             # start turned off, it will open up itself when stuff comes in
114             toggled             = False,
115             domid               = 'pending',
116             outline_complete    = True,
117         )
118
119         template_env = {}
120         template_env['list_resources'] = list_resources.render(self.request)
121         template_env['map_resources'] = map_resources.render(self.request)
122         template_env['pending_resources'] = pending_resources.render(self.request)
123         template_env["theme"] = self.theme
124         template_env["username"] = request.user
125         template_env["slice"] = slicename
126         template_env["section"] = "resources"
127         template_env["msg"] = msg
128         template_env.update(page.prelude_env())
129
130         return render_to_response(self.template, template_env, context_instance=RequestContext(request))