d8547deb54
Change-Id: I9746ec6bec06f8edf2e1b01a320ca3bfab780980
407 lines
14 KiB
Python
407 lines
14 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import cPickle
|
|
import logging
|
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.core.urlresolvers import reverse_lazy
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from horizon import exceptions
|
|
from horizon import forms
|
|
# from horizon import messages
|
|
from horizon import tables
|
|
from horizon import tabs
|
|
from horizon.utils import memoized
|
|
|
|
from openstack_dashboard.api import iotronic, keystone
|
|
from openstack_dashboard import policy
|
|
|
|
from iotronic_ui.iot.plugins import forms as project_forms
|
|
from iotronic_ui.iot.plugins import tables as project_tables
|
|
from iotronic_ui.iot.plugins import tabs as project_tabs
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class IndexView(tables.DataTableView):
|
|
table_class = project_tables.PluginsTable
|
|
template_name = 'iot/plugins/index.html'
|
|
page_title = _("Plugins")
|
|
|
|
def get_data(self):
|
|
plugins = []
|
|
users = []
|
|
|
|
# Admin
|
|
if policy.check((("iot", "iot:list_all_plugins"),), self.request):
|
|
try:
|
|
plugins = iotronic.plugin_list(self.request, None, None,
|
|
all_plugins=True)
|
|
users = keystone.user_list(self.request)
|
|
|
|
except Exception:
|
|
exceptions.handle(self.request, _('Unable to retrieve plugins \
|
|
list.'))
|
|
|
|
# Admin_iot_project
|
|
elif policy.check((("iot", "iot:list_project_plugins"),),
|
|
self.request):
|
|
try:
|
|
plugins = iotronic.plugin_list(self.request, None, None,
|
|
with_public=True)
|
|
|
|
except Exception:
|
|
exceptions.handle(self.request,
|
|
_('Unable to retrieve user plugins list.'))
|
|
|
|
# Other users
|
|
else:
|
|
try:
|
|
plugins = iotronic.plugin_list(self.request, None, None,
|
|
with_public=True)
|
|
|
|
except Exception:
|
|
exceptions.handle(self.request,
|
|
_('Unable to retrieve user plugins list.'))
|
|
|
|
# Replace owner column values (user.id) with user.name (only Admin
|
|
# can see human-readable names)
|
|
for plugin in plugins:
|
|
for user in users:
|
|
if plugin.owner == user.id:
|
|
plugin.owner = user.name
|
|
break
|
|
|
|
return plugins
|
|
|
|
|
|
class CreateView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/create.html'
|
|
modal_header = _("Create Plugin")
|
|
form_id = "create_plugin_form"
|
|
form_class = project_forms.CreatePluginForm
|
|
submit_label = _("Create Plugin")
|
|
submit_url = reverse_lazy("horizon:iot:plugins:create")
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Create Plugin")
|
|
|
|
|
|
class InjectView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/inject.html'
|
|
modal_header = _("Inject Plugin")
|
|
form_id = "inject_plugin_form"
|
|
form_class = project_forms.InjectPluginForm
|
|
submit_label = _("Inject Plugin")
|
|
# submit_url = reverse_lazy("horizon:iot:plugins:inject")
|
|
submit_url = "horizon:iot:plugins:inject"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Inject Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(InjectView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Populate boards
|
|
boards = iotronic.board_list(self.request, "online", None, None)
|
|
boards.sort(key=lambda b: b.name)
|
|
|
|
board_list = []
|
|
for board in boards:
|
|
board_list.append((board.uuid, _(board.name)))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'name': plugin.name,
|
|
'board_list': board_list}
|
|
|
|
|
|
class StartView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/start.html'
|
|
modal_header = _("Start Plugin")
|
|
form_id = "start_plugin_form"
|
|
form_class = project_forms.StartPluginForm
|
|
submit_label = _("Start Plugin")
|
|
# submit_url = reverse_lazy("horizon:iot:plugins:start")
|
|
submit_url = "horizon:iot:plugins:start"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Start Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(StartView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Populate boards
|
|
boards = iotronic.board_list(self.request, "online", None, None)
|
|
boards.sort(key=lambda b: b.name)
|
|
|
|
board_list = []
|
|
for board in boards:
|
|
board_list.append((board.uuid, _(board.name)))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'name': plugin.name,
|
|
'board_list': board_list}
|
|
|
|
|
|
class StopView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/stop.html'
|
|
modal_header = _("Stop Plugin")
|
|
form_id = "stop_plugin_form"
|
|
form_class = project_forms.StopPluginForm
|
|
submit_label = _("Stop Plugin")
|
|
# submit_url = reverse_lazy("horizon:iot:plugins:stop")
|
|
submit_url = "horizon:iot:plugins:stop"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Stop Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(StopView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Populate boards
|
|
boards = iotronic.board_list(self.request, "online", None, None)
|
|
boards.sort(key=lambda b: b.name)
|
|
|
|
board_list = []
|
|
for board in boards:
|
|
board_list.append((board.uuid, _(board.name)))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'name': plugin.name,
|
|
'board_list': board_list}
|
|
|
|
|
|
class CallView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/call.html'
|
|
modal_header = _("Call Plugin")
|
|
form_id = "call_plugin_form"
|
|
form_class = project_forms.CallPluginForm
|
|
submit_label = _("Call Plugin")
|
|
# submit_url = reverse_lazy("horizon:iot:plugins:call")
|
|
submit_url = "horizon:iot:plugins:call"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Call Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(CallView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Populate boards
|
|
boards = iotronic.board_list(self.request, "online", None, None)
|
|
boards.sort(key=lambda b: b.name)
|
|
|
|
board_list = []
|
|
for board in boards:
|
|
board_list.append((board.uuid, _(board.name)))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'name': plugin.name,
|
|
'board_list': board_list}
|
|
|
|
|
|
class RemoveView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/remove.html'
|
|
modal_header = _("Remove Plugin")
|
|
form_id = "remove_plugin_form"
|
|
form_class = project_forms.RemovePluginForm
|
|
submit_label = _("Remove Plugin")
|
|
# submit_url = reverse_lazy("horizon:iot:plugins:remove")
|
|
submit_url = "horizon:iot:plugins:remove"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Remove Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RemoveView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Populate boards
|
|
boards = iotronic.board_list(self.request, "online", None, None)
|
|
boards.sort(key=lambda b: b.name)
|
|
|
|
board_list = []
|
|
for board in boards:
|
|
board_list.append((board.uuid, _(board.name)))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'name': plugin.name,
|
|
'board_list': board_list}
|
|
|
|
|
|
class UpdateView(forms.ModalFormView):
|
|
template_name = 'iot/plugins/update.html'
|
|
modal_header = _("Update Plugin")
|
|
form_id = "update_plugin_form"
|
|
form_class = project_forms.UpdatePluginForm
|
|
submit_label = _("Update Plugin")
|
|
submit_url = "horizon:iot:plugins:update"
|
|
success_url = reverse_lazy('horizon:iot:plugins:index')
|
|
page_title = _("Update Plugin")
|
|
|
|
@memoized.memoized_method
|
|
def get_object(self):
|
|
try:
|
|
return iotronic.plugin_get(self.request, self.kwargs['plugin_id'],
|
|
None)
|
|
except Exception:
|
|
redirect = reverse("horizon:iot:plugins:index")
|
|
exceptions.handle(self.request,
|
|
_('Unable to get plugin information.'),
|
|
redirect=redirect)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(UpdateView, self).get_context_data(**kwargs)
|
|
args = (self.get_object().uuid,)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
def get_initial(self):
|
|
plugin = self.get_object()
|
|
|
|
# Deserialize the code of the plugin
|
|
plugin.code = cPickle.loads(str(plugin.code))
|
|
|
|
return {'uuid': plugin.uuid,
|
|
'owner': plugin.owner,
|
|
'name': plugin.name,
|
|
'public': plugin.public,
|
|
'callable': plugin.callable,
|
|
'code': plugin.code}
|
|
|
|
|
|
class DetailView(tabs.TabView):
|
|
|
|
tab_group_class = project_tabs.PluginDetailTabs
|
|
template_name = 'horizon/common/_detail.html'
|
|
page_title = "{{ plugin.name|default:plugin.uuid }}"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(DetailView, self).get_context_data(**kwargs)
|
|
|
|
plugin = self.get_data()
|
|
context["plugin"] = plugin
|
|
context["url"] = reverse(self.redirect_url)
|
|
context["actions"] = self._get_actions(plugin)
|
|
|
|
return context
|
|
|
|
def _get_actions(self, plugin):
|
|
table = project_tables.PluginsTable(self.request)
|
|
return table.render_row_actions(plugin)
|
|
|
|
@memoized.memoized_method
|
|
def get_data(self):
|
|
plugin_id = self.kwargs['plugin_id']
|
|
try:
|
|
plugin = iotronic.plugin_get(self.request, plugin_id, None)
|
|
except Exception:
|
|
msg = ('Unable to retrieve plugin %s information') % {'name':
|
|
plugin.name}
|
|
exceptions.handle(self.request, msg, ignore=True)
|
|
return plugin
|
|
|
|
def get_tabs(self, request, *args, **kwargs):
|
|
plugin = self.get_data()
|
|
return self.tab_group_class(request, plugin=plugin, **kwargs)
|
|
|
|
|
|
class PluginDetailView(DetailView):
|
|
redirect_url = 'horizon:iot:plugins:index'
|
|
|
|
def _get_actions(self, plugin):
|
|
|
|
# Deserialize the code of the plugin
|
|
plugin.code = cPickle.loads(str(plugin.code))
|
|
|
|
table = project_tables.PluginsTable(self.request)
|
|
return table.render_row_actions(plugin)
|