Add details page for packages
Package should add details link for user can see the more information of the package. Implements: blueprint add-fqpn-field Change-Id: Iabcddfeffab67c82fa0f6715a98fc6dc6dfddf94 Closes-bug: #1501108
This commit is contained in:
@@ -213,12 +213,13 @@ class ModifyPackage(tables.LinkAction):
|
|||||||
|
|
||||||
|
|
||||||
class PackageDefinitionsTable(tables.DataTable):
|
class PackageDefinitionsTable(tables.DataTable):
|
||||||
name = tables.Column('name', verbose_name=_('Package Name'))
|
name = tables.Column('name',
|
||||||
|
link="horizon:murano:packages:detail",
|
||||||
|
verbose_name=_('Package Name'))
|
||||||
tenant_name = tables.Column('tenant_name', verbose_name=_('Tenant Name'))
|
tenant_name = tables.Column('tenant_name', verbose_name=_('Tenant Name'))
|
||||||
enabled = tables.Column('enabled', verbose_name=_('Active'))
|
enabled = tables.Column('enabled', verbose_name=_('Active'))
|
||||||
is_public = tables.Column('is_public', verbose_name=_('Public'))
|
is_public = tables.Column('is_public', verbose_name=_('Public'))
|
||||||
type = tables.Column('type', verbose_name=_('Type'))
|
type = tables.Column('type', verbose_name=_('Type'))
|
||||||
author = tables.Column('author', verbose_name=_('Author'))
|
|
||||||
version = tables.Column(lambda obj: getattr(obj, 'version', None),
|
version = tables.Column(lambda obj: getattr(obj, 'version', None),
|
||||||
verbose_name=_('Version'))
|
verbose_name=_('Version'))
|
||||||
created_time = tables.Column('created',
|
created_time = tables.Column('created',
|
||||||
|
@@ -25,4 +25,6 @@ urlpatterns = [
|
|||||||
views.BUNDLE_FORMS), name='import_bundle'),
|
views.BUNDLE_FORMS), name='import_bundle'),
|
||||||
urls.url(r'^modify/(?P<app_id>[^/]+)?$',
|
urls.url(r'^modify/(?P<app_id>[^/]+)?$',
|
||||||
views.ModifyPackageView.as_view(), name='modify'),
|
views.ModifyPackageView.as_view(), name='modify'),
|
||||||
|
urls.url(r'^(?P<app_id>[^/]+)?$',
|
||||||
|
views.DetailView.as_view(), name='detail'),
|
||||||
]
|
]
|
||||||
|
@@ -32,6 +32,7 @@ from horizon.forms import views
|
|||||||
from horizon import messages
|
from horizon import messages
|
||||||
from horizon import tables as horizon_tables
|
from horizon import tables as horizon_tables
|
||||||
from horizon.utils import functions as utils
|
from horizon.utils import functions as utils
|
||||||
|
from horizon import views as horizon_views
|
||||||
from muranoclient.common import exceptions as exc
|
from muranoclient.common import exceptions as exc
|
||||||
from muranoclient.common import utils as muranoclient_utils
|
from muranoclient.common import utils as muranoclient_utils
|
||||||
from openstack_dashboard.api import glance
|
from openstack_dashboard.api import glance
|
||||||
@@ -564,3 +565,25 @@ class ModifyPackageView(views.ModalFormView):
|
|||||||
context = super(ModifyPackageView, self).get_context_data(**kwargs)
|
context = super(ModifyPackageView, self).get_context_data(**kwargs)
|
||||||
context['app_id'] = self.kwargs['app_id']
|
context['app_id'] = self.kwargs['app_id']
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class DetailView(horizon_views.HorizonTemplateView):
|
||||||
|
template_name = 'packages/detail.html'
|
||||||
|
page_title = "{{ app.name }}"
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(DetailView, self).get_context_data(**kwargs)
|
||||||
|
app = self.get_data()
|
||||||
|
context["app"] = app
|
||||||
|
return context
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
try:
|
||||||
|
app_id = self.kwargs['app_id']
|
||||||
|
app = api.muranoclient(self.request).packages.get(app_id)
|
||||||
|
except Exception:
|
||||||
|
INDEX_URL = 'horizon:murano:packages:index'
|
||||||
|
exceptions.handle(self.request,
|
||||||
|
_('Unable to retrieve package details.'),
|
||||||
|
redirect=reverse(INDEX_URL))
|
||||||
|
return app
|
||||||
|
31
muranodashboard/templates/packages/_detail.html
Normal file
31
muranodashboard/templates/packages/_detail.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
<div class="detail">
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt>{% trans "Name" %}</dt>
|
||||||
|
<dd>{{ app.name }}</dd>
|
||||||
|
<dt>{% trans "FQN" %}</dt>
|
||||||
|
<dd>{{ app.fully_qualified_name }}</dd>
|
||||||
|
<dt>{% trans "Type" %}</dt>
|
||||||
|
<dd>{{ app.type }}</dd>
|
||||||
|
<dt>{% trans "ID" %}</dt>
|
||||||
|
<dd>{{ app.id }}</dd>
|
||||||
|
<dt>{% trans "Package Tags" %}</dt>
|
||||||
|
<dd>{{ app.tags|join:", " }}</dd>
|
||||||
|
<dt>{% trans "Enabled" %}</dt>
|
||||||
|
<dd>{{ app.enabled|yesno|capfirst }}</dd>
|
||||||
|
<dt>{% trans "Public" %}</dt>
|
||||||
|
<dd>{{ app.is_public|yesno|capfirst }}</dd>
|
||||||
|
<dt>{% trans "Categories" %}</dt>
|
||||||
|
<dd>{{ app.categories|join:", "|default:_("None") }}</dd>
|
||||||
|
<dt>{% trans "Version" %}</dt>
|
||||||
|
<dd>{{ app.version|default:_("-") }}</dd>
|
||||||
|
<dt>{% trans "Author" %}</dt>
|
||||||
|
<dd>{{ app.author }}</dd>
|
||||||
|
<dt>{% trans "Created" %}</dt>
|
||||||
|
<dd>{{ app.created|parse_isotime }}</dd>
|
||||||
|
<dt>{% trans "Description" %}</dt>
|
||||||
|
<dd>{{ app.description|default:_("None") }}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
20
muranodashboard/templates/packages/detail.html
Normal file
20
muranodashboard/templates/packages/detail.html
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load breadcrumb_nav %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Package Details" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block page_header %}
|
||||||
|
<div class='page-header'>
|
||||||
|
{% breadcrumb_nav %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
{% include "packages/_detail.html" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
@@ -9,6 +9,7 @@ CategorySelector = "//a[contains(text(), '{0}')][contains(@class, 'dropdown-togg
|
|||||||
App = "//div[contains(@class, 'app-list')]//h4[contains(text(), '{0}')]"
|
App = "//div[contains(@class, 'app-list')]//h4[contains(text(), '{0}')]"
|
||||||
MockAppDescr = "//div[h4[contains(text(), 'MockApp')]]/p"
|
MockAppDescr = "//div[h4[contains(text(), 'MockApp')]]/p"
|
||||||
AppPackages = u"//tr[@data-display='{0}']"
|
AppPackages = u"//tr[@data-display='{0}']"
|
||||||
|
AppDetail = "//dl[dt[contains(text(), 'Name')]]/dd"
|
||||||
TagInDetails = "//div[contains(@class, 'app-meta')]//ul//li[strong[contains(text(), 'Tags')]]" # noqa
|
TagInDetails = "//div[contains(@class, 'app-meta')]//ul//li[strong[contains(text(), 'Tags')]]" # noqa
|
||||||
TestImage = "//tr[td[contains(text(), '{0}')]]"
|
TestImage = "//tr[td[contains(text(), '{0}')]]"
|
||||||
DeleteImageMeta = TestImage + "//td//button[contains(text(), 'Delete Metadata')]" # noqa
|
DeleteImageMeta = TestImage + "//td//button[contains(text(), 'Delete Metadata')]" # noqa
|
||||||
|
@@ -1014,6 +1014,30 @@ class TestSuitePackages(base.PackageTestCase):
|
|||||||
self.check_package_parameter_by_name(pkg_name, 'Public', 'True')
|
self.check_package_parameter_by_name(pkg_name, 'Public', 'True')
|
||||||
self.check_package_parameter_by_name(pkg_name, 'Active', 'False')
|
self.check_package_parameter_by_name(pkg_name, 'Active', 'False')
|
||||||
|
|
||||||
|
def test_upload_package_detail(self):
|
||||||
|
"""Test check ability to view package details after uploading it."""
|
||||||
|
|
||||||
|
self.navigate_to('Manage')
|
||||||
|
self.go_to_submenu('Packages')
|
||||||
|
|
||||||
|
self.driver.find_element_by_id(c.UploadPackage).click()
|
||||||
|
el = self.driver.find_element_by_css_selector(
|
||||||
|
"input[name='upload-package']")
|
||||||
|
el.send_keys(self.archive)
|
||||||
|
self.driver.find_element_by_xpath(c.InputSubmit).click()
|
||||||
|
|
||||||
|
# No application data modification is needed
|
||||||
|
self.driver.find_element_by_xpath(c.InputSubmit).click()
|
||||||
|
self.driver.find_element_by_xpath(c.InputSubmit).click()
|
||||||
|
|
||||||
|
self.wait_for_alert_message()
|
||||||
|
|
||||||
|
pkg_name = self.archive_name
|
||||||
|
self.driver.find_element_by_xpath(
|
||||||
|
"//a[contains(text(), '{0}')]".format(pkg_name)).click()
|
||||||
|
self.assertIn(pkg_name,
|
||||||
|
self.driver.find_element(by.By.XPATH, c.AppDetail).text)
|
||||||
|
|
||||||
def test_category_management(self):
|
def test_category_management(self):
|
||||||
"""Test application category adds and deletes successfully
|
"""Test application category adds and deletes successfully
|
||||||
|
|
||||||
|
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Add details page for packages, The details page will show more info
|
||||||
|
to user, such as FQN, Description, etc.
|
Reference in New Issue
Block a user