From 4996c377add4a93cac4b6945ba3a97e3f6d3cc7e Mon Sep 17 00:00:00 2001 From: nirajsingh Date: Tue, 30 Jan 2018 14:26:07 +0530 Subject: [PATCH] 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 --- masakaridashboard/segments/tables.py | 7 +++- masakaridashboard/segments/tabs.py | 31 ++++++++++++++ .../templates/segments/_detail_overview.html | 21 ++++++++++ masakaridashboard/segments/tests.py | 14 +++++++ masakaridashboard/segments/urls.py | 2 + masakaridashboard/segments/views.py | 40 +++++++++++++++++++ 6 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 masakaridashboard/segments/tabs.py create mode 100644 masakaridashboard/segments/templates/segments/_detail_overview.html diff --git a/masakaridashboard/segments/tables.py b/masakaridashboard/segments/tables.py index e295907..d5b2980 100644 --- a/masakaridashboard/segments/tables.py +++ b/masakaridashboard/segments/tables.py @@ -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( diff --git a/masakaridashboard/segments/tabs.py b/masakaridashboard/segments/tabs.py new file mode 100644 index 0000000..5074fba --- /dev/null +++ b/masakaridashboard/segments/tabs.py @@ -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,) diff --git a/masakaridashboard/segments/templates/segments/_detail_overview.html b/masakaridashboard/segments/templates/segments/_detail_overview.html new file mode 100644 index 0000000..31ed05a --- /dev/null +++ b/masakaridashboard/segments/templates/segments/_detail_overview.html @@ -0,0 +1,21 @@ +{% load i18n sizeformat parse_date %} +
+

{% trans "Segment Detail" %}

+
+
+
{% trans "Name" %}
+
{{ segment.name }}
+
{% trans "ID" %}
+
{{ segment.id }}
+
{% trans "Description" %}
+
{{ segment.description }}
+
{% trans "Recovery Method" %}
+
{{ segment.recovery_method }}
+
{% trans "Service Type" %}
+
{{ segment.service_type }}
+
{% trans "Created at" %}
+
{{ segment.created_at|parse_isotime }}
+
{% trans "Updated at" %}
+
{{ segment.updated_at|parse_isotime }}
+
+
diff --git a/masakaridashboard/segments/tests.py b/masakaridashboard/segments/tests.py index 37035d6..6e99d73 100644 --- a/masakaridashboard/segments/tests.py +++ b/masakaridashboard/segments/tests.py @@ -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') diff --git a/masakaridashboard/segments/urls.py b/masakaridashboard/segments/urls.py index f303957..e1012e7 100644 --- a/masakaridashboard/segments/urls.py +++ b/masakaridashboard/segments/urls.py @@ -18,9 +18,11 @@ from django.conf.urls import url from masakaridashboard.segments import views +SEGMENT = r'^(?P[^/]+)/%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'), ] diff --git a/masakaridashboard/segments/views.py b/masakaridashboard/segments/views.py index 9587944..a57ce2d 100644 --- a/masakaridashboard/segments/views.py +++ b/masakaridashboard/segments/views.py @@ -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)