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)