From 70af5a07aa2174104c0d5fc0ab93d13f6d134557 Mon Sep 17 00:00:00 2001 From: Zhenguo Niu Date: Sat, 6 May 2017 22:32:27 +0800 Subject: [PATCH] Add server details link Change-Id: I39b1f2f9a38670ba58eb1a6dabb878083d4f689e --- mogan_ui/content/servers/tables.py | 1 + mogan_ui/content/servers/tabs.py | 35 +++++++++++ .../templates/servers/_detail_overview.html | 58 +++++++++++++++++++ mogan_ui/content/servers/urls.py | 2 + mogan_ui/content/servers/views.py | 53 ++++++++++++++++- 5 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 mogan_ui/content/servers/tabs.py create mode 100644 mogan_ui/content/servers/templates/servers/_detail_overview.html diff --git a/mogan_ui/content/servers/tables.py b/mogan_ui/content/servers/tables.py index 37d63f5..ff92144 100644 --- a/mogan_ui/content/servers/tables.py +++ b/mogan_ui/content/servers/tables.py @@ -76,6 +76,7 @@ class ServersTable(tables.DataTable): ) name = tables.WrappingColumn( "name", + link="horizon:project:servers:detail", verbose_name=_("Server Name")) image = tables.Column("image_uuid", verbose_name=_("Image")) diff --git a/mogan_ui/content/servers/tabs.py b/mogan_ui/content/servers/tabs.py new file mode 100644 index 0000000..b376556 --- /dev/null +++ b/mogan_ui/content/servers/tabs.py @@ -0,0 +1,35 @@ +# Copyright 2017 Huawei Technologies Co.,LTD. +# All Rights Reserved. +# +# 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 = _("Overview") + slug = "server_overview" + template_name = ("project/servers/" + "_detail_overview.html") + + def get_context_data(self, request): + return {"server": self.tab_group.kwargs['server'], + "is_superuser": request.user.is_superuser} + + +class ServerDetailTabs(tabs.DetailTabsGroup): + slug = "server_details" + tabs = (OverviewTab,) + sticky = True diff --git a/mogan_ui/content/servers/templates/servers/_detail_overview.html b/mogan_ui/content/servers/templates/servers/_detail_overview.html new file mode 100644 index 0000000..e9cc16e --- /dev/null +++ b/mogan_ui/content/servers/templates/servers/_detail_overview.html @@ -0,0 +1,58 @@ +{% load i18n sizeformat %} + +
+
+
{% trans "Name" %}
+
{{ server.name }}
+
{% trans "ID" %}
+
{{ server.uuid }}
+
{% trans "Status" %}
+
{{ server.status|title }}
+
{% trans "Availability Zone" %}
+
{{ server.availability_zone|default:_("-") }}
+
{% trans "Created" %}
+
{{ server.created_at|parse_isotime }}
+
{% trans "Time Since Created" %}
+
{{ server.created_at|parse_isotime|timesince }}
+ {% if is_superuser %} +
{% trans "Node" %}
+ {% endif %} +
+ + {% if server.fault_info %} +

{% trans "Fault" %}

+
+
+
{% trans "Message" %}
+
{{ server.fault_info.message }}
+
{% trans "Code" %}
+
{{ server.fault_info.code }}
+
{% trans "Details" %}
+
{{ server.fault_info.details }}
+
+ {% endif %} + +

{% trans "Metadata" %}

+
+
+ {% if server.image_uuid %} +
{% trans "Image" %}
+
+ {% if server.image_uuid %} + {{ server.image_uuid }} + {% else %} + {% trans "-" %} + {% endif %} +
+ {% else %} +
{% trans "Image" %}
+
{% trans "None" %}
+ {% endif %} + {% with default_item_value=""|add:_("N/A")|add:"" %} + {% for key, value in server.extra.items %} +
{{ key|force_escape }}
+
{{ value|force_escape|default:default_item_value }}
+ {% endfor %} + {% endwith %} +
+
diff --git a/mogan_ui/content/servers/urls.py b/mogan_ui/content/servers/urls.py index 2cd0c21..eec5fee 100644 --- a/mogan_ui/content/servers/urls.py +++ b/mogan_ui/content/servers/urls.py @@ -18,4 +18,6 @@ from mogan_ui.content.servers import views urlpatterns = [ url(r'^$', views.IndexView.as_view(), name='index'), + url(r'^(?P[^/]+)/$', + views.DetailView.as_view(), name='detail'), ] diff --git a/mogan_ui/content/servers/views.py b/mogan_ui/content/servers/views.py index 6a6c784..f3af2e6 100644 --- a/mogan_ui/content/servers/views.py +++ b/mogan_ui/content/servers/views.py @@ -13,17 +13,21 @@ # See the License for the specific language governing permissions and # limitations under the License. +from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from mogan_ui.api import mogan -from mogan_ui.content.servers.tables import ServersTable +from mogan_ui.content.servers import tables as project_tables +from mogan_ui.content.servers import tabs as project_tabs from horizon import exceptions from horizon import tables +from horizon import tabs +from horizon.utils import memoized class IndexView(tables.DataTableView): - table_class = ServersTable + table_class = project_tables.ServersTable template_name = 'project/servers/index.html' page_title = _("Servers") @@ -35,3 +39,48 @@ class IndexView(tables.DataTableView): msg = _('Unable to retrieve servers.') exceptions.handle(self.request, msg) return servers + + +class DetailView(tabs.TabView): + tab_group_class = project_tabs.ServerDetailTabs + template_name = 'horizon/common/_detail.html' + redirect_url = 'horizon:project:servers:index' + page_title = "{{ server.name|default:server.uuid }}" + image_url = 'horizon:project:images:images:detail' + + def get_context_data(self, **kwargs): + context = super(DetailView, self).get_context_data(**kwargs) + server = self.get_data() + if server.image_uuid: + server.image_url = reverse(self.image_url, + args=[server.image_uuid]) + context["server"] = server + context["url"] = reverse(self.redirect_url) + context["actions"] = self._get_actions(server) + return context + + def _get_actions(self, server): + table = project_tables.ServersTable(self.request) + return table.render_row_actions(server) + + @memoized.memoized_method + def get_data(self): + server_id = self.kwargs['server_id'] + + try: + server = mogan.server_get(self.request, server_id) + except Exception: + redirect = reverse(self.redirect_url) + exceptions.handle(self.request, + _('Unable to retrieve details for ' + 'server "%s".') % server_id, + redirect=redirect) + # Not all exception types handled above will result in a redirect. + # Need to raise here just in case. + raise exceptions.Http302(redirect) + + return server + + def get_tabs(self, request, *args, **kwargs): + server = self.get_data() + return self.tab_group_class(request, server=server, **kwargs)