Implement segment detail tab
Implemented segment detail functionality. Added test cases that actually not covering the line of code but tested the detail segment functionally. Change-Id: I214c9df87af3c4ff29abc2e2b30b287b81cd603c
This commit is contained in:
parent
3e90629f3e
commit
4b95496702
|
@ -27,8 +27,13 @@ class CreateSegment(tables.LinkAction):
|
|||
|
||||
class FailoverSegmentTable(tables.DataTable):
|
||||
|
||||
name = tables.Column('name', verbose_name=_("Name"))
|
||||
uuid = tables.Column('uuid', verbose_name=_("UUID"))
|
||||
name = tables.Column('name', verbose_name=_("Name"),
|
||||
link="horizon:masakaridashboard:segment:detail")
|
||||
uuid = tables.Column(
|
||||
'uuid',
|
||||
verbose_name=_("UUID"),
|
||||
link="horizon:masakaridashboard:segment:detail"
|
||||
)
|
||||
recovery_method = tables.Column(
|
||||
'recovery_method', verbose_name=_("Recovery Method"))
|
||||
service_type = tables.Column(
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# Copyright (c) 2018 NTT DATA
|
||||
#
|
||||
# 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.
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from horizon import tabs
|
||||
|
||||
|
||||
class OverviewTab(tabs.Tab):
|
||||
name = _("Segment")
|
||||
slug = "segment"
|
||||
template_name = ("masakaridashboard/segment/_detail_overview.html")
|
||||
|
||||
def get_context_data(self, request):
|
||||
return {"segment": self.tab_group.kwargs['segment']}
|
||||
|
||||
|
||||
class segmentDetailTabs(tabs.DetailTabsGroup):
|
||||
slug = "segment_details"
|
||||
tabs = (OverviewTab,)
|
|
@ -0,0 +1,21 @@
|
|||
{% load i18n sizeformat parse_date %}
|
||||
<div class="detail">
|
||||
<h4>{% trans "Segment Detail" %}</h4>
|
||||
<hr class="header_rule">
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "ID" %}</dt>
|
||||
<dd>{{ segment.id }}</dd>
|
||||
<dt>{% trans "Name" %}</dt>
|
||||
<dd>{{ segment.name }}</dd>
|
||||
<dt>{% trans "Service Type" %}</dt>
|
||||
<dd>{{ segment.service_type }}</dd>
|
||||
<dt>{% trans "Created at" %}</dt>
|
||||
<dd>{{ segment.created_at }}</dd>
|
||||
<dt>{% trans "Updated at" %}</dt>
|
||||
<dd>{{ segment.updated_at }}</dd>
|
||||
<dt>{% trans "Recovery Method" %}</dt>
|
||||
<dd>{{ segment.recovery_method }}</dd>
|
||||
<dt>{% trans "Description" %}</dt>
|
||||
<dd>{{ segment.description }}</dd>
|
||||
</dl>
|
||||
</div>
|
|
@ -0,0 +1,63 @@
|
|||
<!--<span class="masakari-wrapper detail-screen">-->
|
||||
<!--{% extends 'masakari/default/base.html' %}-->
|
||||
<!--{% load i18n %}-->
|
||||
<!--{% block title %}{% trans "Segment Detail" %}{% endblock %}-->
|
||||
|
||||
<!--{% block page_header %}-->
|
||||
<!--{% include "horizon/common/_page_header.html" with title=_("Segment Detail") %}-->
|
||||
<!--{% endblock page_header %}-->
|
||||
<!--{% block main %}-->
|
||||
{% load i18n sizeformat parse_date %}
|
||||
<div class="detail">
|
||||
<h4>{% trans "Segment Detail" %}</h4>
|
||||
<hr class="header_rule">
|
||||
<dl class="dl-horizontal">
|
||||
<dt>{% trans "ID" %}</dt>
|
||||
<dd>{{ segment.id }}</dd>
|
||||
<dt>{% trans "Name" %}</dt>
|
||||
<dd>{{ segment.name }}</dd>
|
||||
<dt>{% trans "Service Type" %}</dt>
|
||||
<dd>{{ segment.service_type }}</dd>
|
||||
<dt>{% trans "Created at" %}</dt>
|
||||
<dd>{{ segment.created_at }}</dd>
|
||||
<dt>{% trans "Updated at" %}</dt>
|
||||
<dd>{{ segment.updated_at }}</dd>
|
||||
<dt>{% trans "Recovery Method" %}</dt>
|
||||
<dd>{{ segment.recovery_method }}</dd>
|
||||
<dt>{% trans "Description" %}</dt>
|
||||
<dd>{{ segment.description }}</dd>
|
||||
</dl>
|
||||
<!--<h4>{% trans "Host Attached" %}</h4>-->
|
||||
<!--<hr class="header_rule">-->
|
||||
<!--<dl class="dl-horizontal">-->
|
||||
<!--<dt>{% trans "ID" %}</dt>-->
|
||||
<!--<dd>{{ host.id }}</dd>-->
|
||||
<!--<dt>{% trans "Name" %}</dt>-->
|
||||
<!--<dd>{{ host.name }}</dd>-->
|
||||
<!--<dt>{% trans "Reserved" %}</dt>-->
|
||||
<!--<dd>{{ host.reserved }}</dd>-->
|
||||
<!--<dt>{% trans "On Maintenance" %}</dt>-->
|
||||
<!--<dd>{{ host.on_maintenance }}</dd>-->
|
||||
<!--<dt>{% trans "Control Attribute" %}</dt>-->
|
||||
<!--<dd>{{ host.control_attributes }}</dd>-->
|
||||
<!--<dt>{% trans "Type" %}</dt>-->
|
||||
<!--<dd>{{ host.type }} <button type="button" onclick="alert('You want to delete this host!')">Remove</button></dd>-->
|
||||
<!--</dl>-->
|
||||
<!--<dl class="dl-horizontal">-->
|
||||
<!--<dt>{% trans "ID" %}</dt>-->
|
||||
<!--<dd>{{ host.id }}</dd>-->
|
||||
<!--<dt>{% trans "Name" %}</dt>-->
|
||||
<!--<dd>{{ host.name }}</dd>-->
|
||||
<!--<dt>{% trans "Reserved" %}</dt>-->
|
||||
<!--<dd>{{ host.reserved }}</dd>-->
|
||||
<!--<dt>{% trans "On Maintenance" %}</dt>-->
|
||||
<!--<dd>{{ host.on_maintenance }}</dd>-->
|
||||
<!--<dt>{% trans "Control Attribute" %}</dt>-->
|
||||
<!--<dd>{{ host.control_attributes }}</dd>-->
|
||||
<!--<dt>{% trans "Type" %}</dt>-->
|
||||
<!--<dd>{{ host.type }} <button type="button" onclick="alert('You want to delete this host!')">Remove</button></dd>-->
|
||||
<!--</dl>-->
|
||||
|
||||
</div>
|
||||
<!--{% endblock %}-->
|
||||
<!--</span>-->
|
|
@ -17,10 +17,12 @@ from django.conf.urls import url
|
|||
from masakaridashboard.segment import views
|
||||
|
||||
|
||||
SEGMENT = r'^(?P<segment_id>[^/]+)/%s$'
|
||||
urlpatterns = [
|
||||
url(r'^$', views.IndexView.as_view(), name='index'),
|
||||
url(r'^validate_segment$',
|
||||
views.ValidateSegmentView.as_view(),
|
||||
name='validate_segment'),
|
||||
url(r'^create$', views.CreateView.as_view(), name='create'),
|
||||
url(SEGMENT % 'detail', views.DetailView.as_view(), name='detail'),
|
||||
]
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
@ -21,8 +22,12 @@ from masakaridashboard.segment import tables as masakari_tab
|
|||
|
||||
from horizon import exceptions
|
||||
from horizon import forms
|
||||
from horizon.utils import memoized
|
||||
from masakaridashboard.segment import forms as segment_forms
|
||||
|
||||
from horizon import tabs
|
||||
from masakaridashboard.segment import tabs as seg_tab
|
||||
|
||||
|
||||
class IndexView(tables.DataTableView):
|
||||
table_class = masakari_tab.FailoverSegmentTable
|
||||
|
@ -97,3 +102,36 @@ class CreateView(forms.ModalFormView):
|
|||
initial['service_type'] = self.kwargs.get('service_type')
|
||||
|
||||
return initial
|
||||
|
||||
|
||||
class DetailView(tabs.TabbedTableView):
|
||||
tab_group_class = seg_tab.segmentDetailTabs
|
||||
template_name = 'horizon/common/_detail.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(DetailView, self).get_context_data(**kwargs)
|
||||
segment = self.get_data()
|
||||
table = masakari_tab.FailoverSegmentTable(self.request)
|
||||
context["segment"] = segment
|
||||
context["url"] = self.get_redirect_url()
|
||||
context["actions"] = table.render_row_actions(segment)
|
||||
return context
|
||||
|
||||
@memoized.memoized_method
|
||||
def get_data(self):
|
||||
try:
|
||||
segment_id = self.kwargs['segment_id']
|
||||
segment = api.get_segment(self.request, segment_id)
|
||||
except Exception:
|
||||
msg = _('Unable to get action "%s".') % segment_id
|
||||
redirect = reverse('horizon:masakaridashboard:segment:index')
|
||||
exceptions.handle(self.request, msg, redirect=redirect)
|
||||
|
||||
return segment
|
||||
|
||||
def get_redirect_url(self):
|
||||
return reverse('horizon:masakaridashboard:segment:index')
|
||||
|
||||
def get_tabs(self, request, *args, **kwargs):
|
||||
segment = self.get_data()
|
||||
return self.tab_group_class(request, segment=segment, **kwargs)
|
||||
|
|
|
@ -28,6 +28,8 @@ SEGMENT_LIST = [
|
|||
]
|
||||
INDEX_URL = reverse('horizon:masakaridashboard:segment:index')
|
||||
CREATE_URL = reverse('horizon:masakaridashboard:segment:create')
|
||||
DETAIL_URL = reverse('horizon:masakaridashboard:segment:detail',
|
||||
args=SEGMENT_LIST[0].uuid)
|
||||
|
||||
|
||||
class SegmentTest(test.TestCase):
|
||||
|
@ -109,3 +111,9 @@ class SegmentTest(test.TestCase):
|
|||
result = api.pagination_list(self.request, marker='', paginate=True)
|
||||
self.assertIn(SEGMENT_LIST, result)
|
||||
mock_segments.assert_called_once_with(limit=21, marker='')
|
||||
|
||||
def test_detail(self):
|
||||
with mock.patch('masakaridashboard.api.api.get_segment',
|
||||
return_value=SEGMENT_LIST[0]):
|
||||
res = self.client.get(DETAIL_URL)
|
||||
self.assertTemplateUsed(res, 'horizon/common/_detail.html')
|
||||
|
|
Loading…
Reference in New Issue