implement protection plan detail page
Change-Id: I83d68e4822934dd178102eca92dfd5709d44d1d3 Closes-Bug: #1583408
This commit is contained in:
@@ -101,6 +101,7 @@ class ProtectionPlanFilterAction(tables.FilterAction):
|
|||||||
|
|
||||||
class ProtectionPlansTable(tables.DataTable):
|
class ProtectionPlansTable(tables.DataTable):
|
||||||
name = tables.Column('name',
|
name = tables.Column('name',
|
||||||
|
link="horizon:smaug:protectionplans:detail",
|
||||||
verbose_name=_('Name'))
|
verbose_name=_('Name'))
|
||||||
|
|
||||||
status = tables.Column('status',
|
status = tables.Column('status',
|
||||||
@@ -113,3 +114,13 @@ class ProtectionPlansTable(tables.DataTable):
|
|||||||
DeleteProtectionPlansAction)
|
DeleteProtectionPlansAction)
|
||||||
table_actions = (ProtectionPlanFilterAction, CreateProtectionPlanLink,
|
table_actions = (ProtectionPlanFilterAction, CreateProtectionPlanLink,
|
||||||
DeleteProtectionPlansAction)
|
DeleteProtectionPlansAction)
|
||||||
|
|
||||||
|
|
||||||
|
class DetailTable(tables.DataTable):
|
||||||
|
id = tables.Column("id", verbose_name=_("ID"))
|
||||||
|
type = tables.Column("type", verbose_name=_("TYPE"))
|
||||||
|
|
||||||
|
class Meta(object):
|
||||||
|
name = "protectionresources"
|
||||||
|
verbose_name = _("Protection Resources")
|
||||||
|
hidden_title = False
|
||||||
|
|||||||
@@ -21,4 +21,6 @@ urlpatterns = [
|
|||||||
url(r'^create/$', views.CreateView.as_view(), name='create'),
|
url(r'^create/$', views.CreateView.as_view(), name='create'),
|
||||||
url(r'^(?P<plan_id>[^/]+)/scheduleprotect/$',
|
url(r'^(?P<plan_id>[^/]+)/scheduleprotect/$',
|
||||||
views.ScheduleProtectView.as_view(), name='scheduleprotect'),
|
views.ScheduleProtectView.as_view(), name='scheduleprotect'),
|
||||||
|
url(r'^(?P<plan_id>[^/]+)/detail/$',
|
||||||
|
views.DetailView.as_view(), name='detail'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ from horizon import exceptions
|
|||||||
from horizon import forms as horizon_forms
|
from horizon import forms as horizon_forms
|
||||||
from horizon import tables as horizon_tables
|
from horizon import tables as horizon_tables
|
||||||
from horizon.utils import memoized
|
from horizon.utils import memoized
|
||||||
|
from horizon import views as horizon_views
|
||||||
|
|
||||||
from smaug_dashboard.api import smaug as smaugclient
|
from smaug_dashboard.api import smaug as smaugclient
|
||||||
from smaug_dashboard.protectionplans import forms
|
from smaug_dashboard.protectionplans import forms
|
||||||
@@ -154,3 +155,67 @@ class ScheduleProtectView(horizon_forms.ModalFormView):
|
|||||||
return {'id': plan.id,
|
return {'id': plan.id,
|
||||||
'name': plan.name,
|
'name': plan.name,
|
||||||
'provider_id': plan.provider_id}
|
'provider_id': plan.provider_id}
|
||||||
|
|
||||||
|
|
||||||
|
class DetailView(horizon_views.HorizonTemplateView):
|
||||||
|
template_name = 'protectionplans/detail.html'
|
||||||
|
page_title = "{{ plan.name }}"
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(DetailView, self).get_context_data(**kwargs)
|
||||||
|
plan = self.get_data()
|
||||||
|
table = tables.ProtectionPlansTable(self.request)
|
||||||
|
context["plan"] = plan
|
||||||
|
context["provider"] = self.get_provider(plan.provider_id)
|
||||||
|
context["instances"] = self.get_instances(plan.resources)
|
||||||
|
context["url"] = reverse("horizon:smaug:protectionplans:index")
|
||||||
|
context["actions"] = table.render_row_actions(plan)
|
||||||
|
return context
|
||||||
|
|
||||||
|
@memoized.memoized_method
|
||||||
|
def get_data(self):
|
||||||
|
try:
|
||||||
|
return smaugclient.plan_get(self.request, self.kwargs['plan_id'])
|
||||||
|
except Exception:
|
||||||
|
exceptions.handle(
|
||||||
|
self.request,
|
||||||
|
_('Unable to retrieve protection plan details.'),
|
||||||
|
redirect=reverse("horizon:smaug:protectionplans:index"))
|
||||||
|
|
||||||
|
@memoized.memoized_method
|
||||||
|
def get_provider(self, provider_id):
|
||||||
|
provider = None
|
||||||
|
if provider_id:
|
||||||
|
try:
|
||||||
|
provider = smaugclient.provider_get(self.request, provider_id)
|
||||||
|
except Exception:
|
||||||
|
exceptions.handle(
|
||||||
|
self.request,
|
||||||
|
_('Unable to retrieve protection provider details.'),
|
||||||
|
redirect=reverse("horizon:smaug:protectionplans:index"))
|
||||||
|
return provider
|
||||||
|
|
||||||
|
@memoized.memoized_method
|
||||||
|
def get_instances(self, instances):
|
||||||
|
try:
|
||||||
|
result = []
|
||||||
|
for instance in instances:
|
||||||
|
instance["showid"] = str(uuid.uuid4())
|
||||||
|
result.append(protectables.Instances(self, instance))
|
||||||
|
detail_instance = smaugclient.protectable_get_instance(
|
||||||
|
self.request,
|
||||||
|
instance["type"].strip(),
|
||||||
|
instance["id"].strip())
|
||||||
|
if detail_instance.dependent_resources:
|
||||||
|
for dependent in detail_instance.dependent_resources:
|
||||||
|
dependent["showid"] = str(uuid.uuid4())
|
||||||
|
dependent["showparentid"] = instance["showid"]
|
||||||
|
result.append(
|
||||||
|
protectables.Instances(self, dependent))
|
||||||
|
return result
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
exceptions.handle(
|
||||||
|
self.request,
|
||||||
|
_('Unable to get instances.'),
|
||||||
|
redirect=reverse("horizon:smaug:protectionplans:index"))
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/* Copyright (c) 2016 Huawei, Inc.
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
horizon.protectionplans_detail = {
|
||||||
|
init: function() {
|
||||||
|
/* init resource tree */
|
||||||
|
$("#protectionplanDetailResource").treetable({ expandable: true });
|
||||||
|
}
|
||||||
|
};
|
||||||
59
smaug_dashboard/templates/protectionplans/_detail.html
Normal file
59
smaug_dashboard/templates/protectionplans/_detail.html
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
{% load compress %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{% compress css %}
|
||||||
|
<link rel="stylesheet" href="{% static 'smaugdashboard/css/jquery.treetable.css' %}">
|
||||||
|
{% endcompress %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<div class="detail">
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt>{% trans "Plan Name" %}</dt>
|
||||||
|
<dd>{{ plan.name }}</dd>
|
||||||
|
<dt>{% trans "Plan Status" %}</dt>
|
||||||
|
<dd>{{ plan.status }}</dd>
|
||||||
|
<dt>{% trans "Protection Provider" %}</dt>
|
||||||
|
<dd>{{ provider.name }}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="table_wrapper">
|
||||||
|
<table id="protectionplanDetailResource" class="{% block table_css_classes %}table table-striped datatable {{ table.css_classes }}{% endblock %}">
|
||||||
|
<thead>
|
||||||
|
<tr class="table_column_header">
|
||||||
|
<th {{ column.attr_string|safe }}>
|
||||||
|
Resource Name
|
||||||
|
</th>
|
||||||
|
<th {{ column.attr_string|safe }}>
|
||||||
|
Resource Type
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for instance in instances %}
|
||||||
|
<tr data-tt-id="{{ instance.showid }}"
|
||||||
|
resource-id="{{ instance.id }}"
|
||||||
|
{% if instance.showparentid != None %}
|
||||||
|
data-tt-parent-id="{{ instance.showparentid }}"
|
||||||
|
{% endif %}>
|
||||||
|
<td>
|
||||||
|
<span class="logoresource"></span>
|
||||||
|
<span class="spanresource">{{instance.name}}</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span class="spanresource">{{instance.type}}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function() {
|
||||||
|
"use strict";
|
||||||
|
horizon.protectionplans_detail.init();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
16
smaug_dashboard/templates/protectionplans/detail.html
Normal file
16
smaug_dashboard/templates/protectionplans/detail.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Protection Plan Details" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block page_header %}
|
||||||
|
{% include 'horizon/common/_detail_header.html' %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
{% include "protectionplans/_detail.html" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user