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:
nirajsingh 2018-01-30 14:26:07 +05:30
parent 3e90629f3e
commit 4b95496702
7 changed files with 170 additions and 2 deletions

View File

@ -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(

View File

@ -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,)

View File

@ -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>

View File

@ -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 }}&nbsp;&nbsp;&nbsp;<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 }}&nbsp;&nbsp;&nbsp;<button type="button" onclick="alert('You want to delete this host!')">Remove</button></dd>-->
<!--</dl>-->
</div>
<!--{% endblock %}-->
<!--</span>-->

View File

@ -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'),
]

View File

@ -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)

View File

@ -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')