diff --git a/horizon/base.py b/horizon/base.py index 93630e735c..271c287f57 100644 --- a/horizon/base.py +++ b/horizon/base.py @@ -865,6 +865,13 @@ class Site(Registry, HorizonComponent): urlpatterns.append(url(r'^%s/' % dash.slug, include(dash._decorated_urls))) + # add URL for ngdetails + views = import_module('horizon.browsers.views') + urlpatterns.append(url(r'^ngdetails/', + views.AngularDetailsView.as_view(), + name='ngdetails')) + _decorate_urlconf(urlpatterns, require_auth) + # Return the three arguments to django.conf.urls.include return urlpatterns, self.namespace, self.slug diff --git a/horizon/browsers/views.py b/horizon/browsers/views.py index 10ef3238dd..8701e694d7 100644 --- a/horizon/browsers/views.py +++ b/horizon/browsers/views.py @@ -15,6 +15,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views import generic +import horizon from horizon.tables import MultiTableView # noqa from horizon.utils import memoized @@ -83,3 +84,23 @@ class AngularIndexView(generic.TemplateView): else: context["page_title"] = self.page_title return context + + +class AngularDetailsView(generic.TemplateView): + '''View for Angularized details view + + This is used to load ngdetails view via Django. + i.e. refresh or link directly for '^ngdetails/' + ''' + template_name = 'angular.html' + + def get_context_data(self, **kwargs): + context = super(AngularDetailsView, self).get_context_data(**kwargs) + # some parameters are needed for navigation side bar and breadcrumb. + title = _("Horizon") + context["title"] = title + context["page_title"] = title + dashboard = horizon.get_default_dashboard() + self.request.horizon['dashboard'] = dashboard + self.request.horizon['panel'] = dashboard.get_panels()[0] + return context diff --git a/horizon/test/tests/base.py b/horizon/test/tests/base.py index 53869c165e..c330d97440 100644 --- a/horizon/test/tests/base.py +++ b/horizon/test/tests/base.py @@ -326,6 +326,12 @@ class HorizonTests(BaseHorizonTests): # Restore settings settings.SECURE_PROXY_SSL_HEADER = None + def test_urls_ngdetails(self): + resp = self.client.get("/ngdetails/") + self.assertEqual(200, resp.status_code) + resp = self.client.get("/ngdetails/OS::Glance::Image/xxxxx-xxx") + self.assertEqual(200, resp.status_code) + class GetUserHomeTests(BaseHorizonTests): """Test get_user_home parameters.""" diff --git a/horizon/test/tests/templates/angular.html b/horizon/test/tests/templates/angular.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/releasenotes/notes/ngdetail-reload-e711a77b2d07191a.yaml b/releasenotes/notes/ngdetail-reload-e711a77b2d07191a.yaml new file mode 100644 index 0000000000..c62ad32a7b --- /dev/null +++ b/releasenotes/notes/ngdetail-reload-e711a77b2d07191a.yaml @@ -0,0 +1,14 @@ +--- +issues: + - | + [:bug:`1746706`] When reloading or opening Angular-based detail page + directly, the navigation menu and breadcrumb list are not recovered + properly and the first panel is focused. + [:bug:`1746709`] when we try to open non-existing Angular-based detail + page, "Not Found" (404) page is not shown. A blank page only with + the navigation menu will be shown. +fixes: + - | + [:bug:`1681627`] A problem that Angular-based detail page (ngdetail page) + cannot be reloaded or opened via direct URL has been fixed. Note that + there are some known issues described in the `Known Issues`_ section.