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
15 from myslice.configengine            import ConfigEngine
16 from plugins.querytable              import QueryTable
17 from plugins.googlemap               import GoogleMap
18 from plugins.queryupdater            import QueryUpdater
19 from plugins.testbeds                import TestbedsPlugin
20 from plugins.scheduler2              import Scheduler2
21 from plugins.columns_editor          import ColumnsEditor
22
23 from myslice.theme import ThemeView
24
25 class SliceResourceView (LoginRequiredView, ThemeView):
26     template_name = "slice-resource-view.html"
27     
28     def get(self, request, slicename):
29
30         if request.GET.get('message') : 
31             msg = "Slice successfully updated"
32         else :
33             msg = None
34
35         page = Page(request)
36         metadata = page.get_metadata()
37         page.expose_js_metadata()
38
39         resource_md = metadata.details_by_object('resource')
40         resource_fields = [column['name'] for column in resource_md['column']]
41
42         user_md = metadata.details_by_object('user')
43         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
44
45         # TODO The query to run is embedded in the URL
46         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
47         main_query.select(
48                 'slice_hrn',
49                 'resource.urn', 
50                 'resource.hostname', 'resource.type',
51                 'resource.network_hrn',
52                 'lease.urn',
53                 'user.user_hrn',
54                 #'application.measurement_point.counter'
55         )
56         # for internal use in the querytable plugin;
57         # needs to be a unique column present for each returned record
58         main_query_init_key = 'urn'
59         aq = AnalyzedQuery(main_query, metadata=metadata)
60         page.enqueue_query(main_query, analyzed_query=aq)
61         sq_resource    = aq.subquery('resource')
62         sq_lease       = aq.subquery('lease')
63
64         query_resource_all = Query.get('resource').select(resource_fields)
65         page.enqueue_query(query_resource_all)
66
67         # leases query
68         lease_md = metadata.details_by_object('lease')
69         lease_fields = [column['name'] for column in lease_md['column']]
70
71         query_all_lease = Query.get('lease').select(lease_fields)
72         page.enqueue_query(query_all_lease)
73
74         # --------------------------------------------------------------------------
75         # ALL RESOURCES LIST
76         # resources as a list using datatable plugin
77  
78         list_resources = QueryTable(
79             page       = page,
80             domid      = 'resources-list',
81             title      = 'List view',
82             query      = sq_resource,
83             query_all  = query_resource_all,
84             init_key   = "urn",
85             checkboxes = True,
86             datatables_options = {
87                 'iDisplayLength': 25,
88                 'bLengthChange' : True,
89                 'bAutoWidth'    : True,
90                 },
91         )
92
93
94         # --------------------------------------------------------------------------
95         # RESERVED RESOURCES LIST
96         # resources as a list using datatable plugin
97  
98         list_reserved_resources = QueryTable(
99             page       = page,
100             domid      = 'resources-reserved-list',
101             title      = 'List view',
102             query      = sq_resource,
103             query_all  = sq_resource,
104             init_key   = "urn",
105             checkboxes = True,
106             datatables_options = {
107                 'iDisplayLength': 25,
108                 'bLengthChange' : True,
109                 'bAutoWidth'    : True,
110                 },
111         )
112
113         # --------------------------------------------------------------------------
114         # COLUMNS EDITOR
115         # list of fields to be applied on the query 
116         # this will add/remove columns in QueryTable plugin
117  
118         filter_column_editor = ColumnsEditor(
119             page  = page,
120             query = sq_resource, 
121             query_all = query_resource_all,
122             title = "Select Columns",
123             domid = 'select-columns',
124         )
125
126         # --------------------------------------------------------------------------
127         # RESOURCES MAP
128         # the resources part is made of a Tabs (Geographic, List), 
129
130         map_resources  = GoogleMap(
131             page       = page,
132             title      = 'Geographic view',
133             domid      = 'resources-map',
134             # tab's sons preferably turn this off
135             togglable  = False,
136             query      = sq_resource,
137             query_all  = query_resource_all,
138             # this key is the one issued by google
139             googlemap_api_key = ConfigEngine().googlemap_api_key(),
140             # the key to use at init-time
141             init_key   = main_query_init_key,
142             checkboxes = True,
143             # center on Paris
144             latitude   = 49.,
145             longitude  = 9,
146             zoom       = 8,
147         )
148
149         # --------------------------------------------------------------------------
150         # LEASES Nitos Scheduler
151         # Display the leases reservation timeslots of the resources
152
153         resources_as_scheduler2 = Scheduler2( 
154             page       = page,
155             domid      = 'scheduler',
156             title      = 'Scheduler',
157             # this is the query at the core of the slice list
158             query = sq_resource,
159             query_all_resources = query_resource_all,
160             query_lease = query_all_lease,
161         )
162
163         # --------------------------------------------------------------------------
164         # QueryUpdater (Pending Operations)
165  
166         pending_resources = QueryUpdater(
167             page                = page,
168             title               = 'Pending operations',
169             query               = main_query,
170             togglable           = True,
171             # start turned off, it will open up itself when stuff comes in
172             toggled             = False,
173             domid               = 'pending',
174             outline_complete    = True,
175         )
176
177         # --------------------------------------------------------------------------
178         # NETWORKS
179         # testbeds as a list of filters 
180
181         network_md = metadata.details_by_object('network')
182         network_fields = [column['name'] for column in network_md['column']]
183
184         query_network = Query.get('network').select(network_fields)
185         page.enqueue_query(query_network)
186
187         filter_testbeds = TestbedsPlugin(
188             page          = page,
189             domid         = 'testbeds-filter',
190             title         = 'Filter by testbeds',
191             query         = sq_resource,
192             query_all     = query_resource_all,
193             query_network = query_network,
194             init_key      = "network_hrn",
195             checkboxes    = True,
196             datatables_options = {
197                 'iDisplayLength': 25,
198                 'bLengthChange' : True,
199                 'bAutoWidth'    : True,
200                 },
201         )
202
203         template_env = {}
204         template_env['list_resources'] = list_resources.render(self.request)
205         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
206
207         template_env['columns_editor'] = filter_column_editor.render(self.request)
208
209         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
210         template_env['map_resources'] = map_resources.render(self.request)
211         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
212         template_env['pending_resources'] = pending_resources.render(self.request)
213         template_env["theme"] = self.theme
214         template_env["username"] = request.user
215         template_env["slice"] = slicename
216         template_env["section"] = "resources"
217         template_env["msg"] = msg
218         template_env.update(page.prelude_env())
219
220         return render_to_response(self.template, template_env, context_instance=RequestContext(request))