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.

Partial-Implements: blueprint masakari-dashboard

Change-Id: I214c9df87af3c4ff29abc2e2b30b287b81cd603c
This commit is contained in:
nirajsingh 2018-01-30 14:26:07 +05:30
parent 30d318803f
commit 4996c377ad
6 changed files with 113 additions and 2 deletions

View File

@ -63,8 +63,11 @@ class DeleteSegment(tables.DeleteAction):
class FailoverSegmentTable(tables.DataTable):
name = tables.WrappingColumn('name', verbose_name=_("Name"), truncate=40)
uuid = tables.Column('uuid', verbose_name=_("UUID"))
name = tables.WrappingColumn(
'name', verbose_name=_("Name"),
link="horizon:masakaridashboard:segments:detail", truncate=40)
uuid = tables.Column('uuid', verbose_name=_("UUID"),
link="horizon:masakaridashboard:segments: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 = _("Segments")
slug = "segments"
template_name = ("masakaridashboard/segments/_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 "Name" %}</dt>
<dd>{{ segment.name }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ segment.id }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ segment.description }}</dd>
<dt>{% trans "Recovery Method" %}</dt>
<dd>{{ segment.recovery_method }}</dd>
<dt>{% trans "Service Type" %}</dt>
<dd>{{ segment.service_type }}</dd>
<dt>{% trans "Created at" %}</dt>
<dd>{{ segment.created_at|parse_isotime }}</dd>
<dt>{% trans "Updated at" %}</dt>
<dd>{{ segment.updated_at|parse_isotime }}</dd>
</dl>
</div>

View File

@ -171,3 +171,17 @@ class SegmentTest(test.TestCase):
segment.uuid,
ignore_missing=True
)
def test_detail(self):
segment = self.masakari_segment.list()[0]
detail_url = reverse('horizon:masakaridashboard:segments:detail',
args=[segment.uuid])
with mock.patch('masakaridashboard.api.api.get_segment',
return_value=segment):
res = self.client.get(detail_url)
self.assertNoFormErrors(res)
self.assertEqual(200, res.status_code)
self.assertEqual(segment.uuid, res.context['segment'].uuid)
self.assertTemplateUsed(res, 'horizon/common/_detail.html')
self.assertTemplateUsed(
res, 'masakaridashboard/segments/_detail_overview.html')

View File

@ -18,9 +18,11 @@ from django.conf.urls import url
from masakaridashboard.segments import views
SEGMENT = r'^(?P<segment_id>[^/]+)/%s$'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^create_segment$',
views.CreateSegmentView.as_view(),
name='create_segment'),
url(SEGMENT % 'detail', views.DetailView.as_view(), name='detail'),
]

View File

@ -14,6 +14,7 @@
# under the License.
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
@ -23,8 +24,13 @@ from masakaridashboard.segments import tables as masakari_tab
from horizon import exceptions
from horizon import forms
from horizon.utils import memoized
from masakaridashboard.segments import forms as segment_forms
from horizon import tabs
from masakaridashboard.segments import tabs as seg_tab
class IndexView(tables.DataTableView):
table_class = masakari_tab.FailoverSegmentTable
@ -92,3 +98,37 @@ class CreateSegmentView(forms.ModalFormView):
def get_form_kwargs(self):
kwargs = super(CreateSegmentView, self).get_form_kwargs()
return kwargs
class DetailView(tabs.TabbedTableView):
tab_group_class = seg_tab.SegmentDetailTabs
template_name = 'horizon/common/_detail.html'
page_title = "{{ segment.name|default:segment.id }}"
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 segment "%s".') % segment_id
redirect = reverse('horizon:masakaridashboard:segments:index')
exceptions.handle(self.request, msg, redirect=redirect)
return segment
def get_redirect_url(self):
return reverse('horizon:masakaridashboard:segments:index')
def get_tabs(self, request, *args, **kwargs):
segment = self.get_data()
return self.tab_group_class(request, segment=segment, **kwargs)