iotronic-ui/iotronic_ui/iot/plugins/views.py

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)