diff options
15 files changed, 133 insertions, 17 deletions
diff --git a/.tx/config b/.tx/config index 8df714e97..740f50897 100644 --- a/.tx/config +++ b/.tx/config @@ -1,19 +1,19 @@ [main] host = https://www.transifex.com -[horizon.horizon-translations] +[horizon.horizon-translations-kilo] file_filter = horizon/locale/<lang>/LC_MESSAGES/django.po source_file = horizon/locale/en/LC_MESSAGES/django.po source_lang = en type = PO -[horizon.openstack-dashboard-translations] +[horizon.openstack-dashboard-translations-kilo] file_filter = openstack_dashboard/locale/<lang>/LC_MESSAGES/django.po source_file = openstack_dashboard/locale/en/LC_MESSAGES/django.po source_lang = en type = PO -[horizon.horizon-js-translations] +[horizon.horizon-js-translations-kilo] file_filter = horizon/locale/<lang>/LC_MESSAGES/djangojs.po source_file = horizon/locale/en/LC_MESSAGES/djangojs.po source_lang = en diff --git a/horizon/base.py b/horizon/base.py index ee0bf2d09..61f944f0f 100644 --- a/horizon/base.py +++ b/horizon/base.py @@ -871,14 +871,21 @@ class Site(Registry, HorizonComponent): """ panel_customization = self._conf.get("panel_customization", []) + # Process all the panel groups first so that they exist before panels + # are added to them and Dashboard._autodiscover() doesn't wipe out any + # panels previously added when its panel groups are instantiated. + panel_configs = [] for config in panel_customization: if config.get('PANEL'): - self._process_panel_configuration(config) + panel_configs.append(config) elif config.get('PANEL_GROUP'): self._process_panel_group_configuration(config) else: LOG.warning("Skipping %s because it doesn't have PANEL or " "PANEL_GROUP defined.", config.__name__) + # Now process the panels. + for config in panel_configs: + self._process_panel_configuration(config) def _process_panel_configuration(self, config): """Add, remove and set default panels on the dashboard.""" @@ -914,8 +921,6 @@ class Site(Registry, HorizonComponent): panel = getattr(mod, panel_cls) dashboard_cls.register(panel) if panel_group: - dashboard_cls.get_panel_group(panel_group).__class__.\ - panels.append(panel.slug) dashboard_cls.get_panel_group(panel_group).\ panels.append(panel.slug) else: diff --git a/openstack_dashboard/dashboards/project/instances/utils.py b/openstack_dashboard/dashboards/project/instances/utils.py index 730701247..5c2880126 100644 --- a/openstack_dashboard/dashboards/project/instances/utils.py +++ b/openstack_dashboard/dashboards/project/instances/utils.py @@ -86,6 +86,7 @@ def network_field_data(request, include_empty_option=False): :return: list of (id, name) tuples """ tenant_id = request.user.tenant_id + networks = [] try: networks = api.neutron.network_list_for_tenant(request, tenant_id) networks = [(n.id, n.name_or_id) for n in networks] @@ -121,7 +122,6 @@ def keypair_field_data(request, include_empty_option=False): keypair_list = [(kp.name, kp.name) for kp in keypairs] except Exception: exceptions.handle(request, _('Unable to retrieve key pairs.')) - keypair_list = [] if not keypair_list: if include_empty_option: diff --git a/openstack_dashboard/test/helpers.py b/openstack_dashboard/test/helpers.py index 324810ced..c73888542 100644 --- a/openstack_dashboard/test/helpers.py +++ b/openstack_dashboard/test/helpers.py @@ -534,9 +534,6 @@ class PluginTestCase(TestCase): self.old_horizon_config = conf.HORIZON_CONFIG conf.HORIZON_CONFIG = conf.LazySettings() base.Horizon._urls() - # Trigger discovery, registration, and URLconf generation if it - # hasn't happened yet. - self.client.get("/") # Store our original dashboards self._discovered_dashboards = base.Horizon._registry.keys() # Gather up and store our original panels for each dashboard diff --git a/openstack_dashboard/test/test_panels/plugin_panel/views.py b/openstack_dashboard/test/test_panels/plugin_panel/views.py index db3f98b88..49c4f7ad2 100644 --- a/openstack_dashboard/test/test_panels/plugin_panel/views.py +++ b/openstack_dashboard/test/test_panels/plugin_panel/views.py @@ -10,11 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. -from django.utils.translation import ugettext_lazy as _ - from horizon import views class IndexView(views.HorizonTemplateView): template_name = 'admin/plugin_panel/index.html' - page_title = _("Plugin-based Panel") + page_title = 'Plugin-based Panel' diff --git a/openstack_dashboard/test/test_panels/second_panel/__init__.py b/openstack_dashboard/test/test_panels/second_panel/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/openstack_dashboard/test/test_panels/second_panel/__init__.py diff --git a/openstack_dashboard/test/test_panels/second_panel/panel.py b/openstack_dashboard/test/test_panels/second_panel/panel.py new file mode 100644 index 000000000..52f61b981 --- /dev/null +++ b/openstack_dashboard/test/test_panels/second_panel/panel.py @@ -0,0 +1,18 @@ +# 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. + +import horizon + + +class SecondPanel(horizon.Panel): + name = "Second Plugin Panel" + slug = 'second_panel' diff --git a/openstack_dashboard/test/test_panels/second_panel/templates/second_panel/index.html b/openstack_dashboard/test/test_panels/second_panel/templates/second_panel/index.html new file mode 100644 index 000000000..62a1d6b49 --- /dev/null +++ b/openstack_dashboard/test/test_panels/second_panel/templates/second_panel/index.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% load i18n %} +{% block title %}Second Plugin-based Panel{% endblock %} + +{% block main %} +<div class="row"> + <div class="col-sm-12"> + Second Plugin-based Panel + </div> +</div> +{% endblock %} diff --git a/openstack_dashboard/test/test_panels/second_panel/urls.py b/openstack_dashboard/test/test_panels/second_panel/urls.py new file mode 100644 index 000000000..277a98229 --- /dev/null +++ b/openstack_dashboard/test/test_panels/second_panel/urls.py @@ -0,0 +1,21 @@ +# 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.conf.urls import patterns +from django.conf.urls import url + +from openstack_dashboard.test.test_panels.second_panel import views + +urlpatterns = patterns( + '', + url(r'^$', views.IndexView.as_view(), name='index'), +) diff --git a/openstack_dashboard/test/test_panels/second_panel/views.py b/openstack_dashboard/test/test_panels/second_panel/views.py new file mode 100644 index 000000000..b656b6cb2 --- /dev/null +++ b/openstack_dashboard/test/test_panels/second_panel/views.py @@ -0,0 +1,18 @@ +# 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 horizon import views + + +class IndexView(views.HorizonTemplateView): + template_name = 'admin/second_panel/index.html' + page_title = 'Second Plugin-based Panel' diff --git a/openstack_dashboard/test/test_plugins/panel_group_config/_30_admin_add_second_panel_group.py b/openstack_dashboard/test/test_plugins/panel_group_config/_30_admin_add_second_panel_group.py new file mode 100644 index 000000000..407d19984 --- /dev/null +++ b/openstack_dashboard/test/test_plugins/panel_group_config/_30_admin_add_second_panel_group.py @@ -0,0 +1,6 @@ +# The name of the panel group to be added to HORIZON_CONFIG. Required. +PANEL_GROUP = 'second_panel_group' +# The display name of the PANEL_GROUP. Required. +PANEL_GROUP_NAME = 'Second Plugin Panel Group' +# The name of the dashboard the PANEL_GROUP associated with. Required. +PANEL_GROUP_DASHBOARD = 'admin' diff --git a/openstack_dashboard/test/test_plugins/panel_group_config/_40_admin_add_panel_to_second_group.py b/openstack_dashboard/test/test_plugins/panel_group_config/_40_admin_add_panel_to_second_group.py new file mode 100644 index 000000000..7ce597584 --- /dev/null +++ b/openstack_dashboard/test/test_plugins/panel_group_config/_40_admin_add_panel_to_second_group.py @@ -0,0 +1,10 @@ +# The name of the panel to be added to HORIZON_CONFIG. Required. +PANEL = 'second_panel' +# The name of the dashboard the PANEL associated with. Required. +PANEL_DASHBOARD = 'admin' +# The name of the panel group the PANEL is associated with. +PANEL_GROUP = 'second_panel_group' + +# Python panel class of the PANEL to be added. +ADD_PANEL = \ + 'openstack_dashboard.test.test_panels.second_panel.panel.SecondPanel' diff --git a/openstack_dashboard/test/test_plugins/panel_group_tests.py b/openstack_dashboard/test/test_plugins/panel_group_tests.py index 4ae184f26..7e85802de 100644 --- a/openstack_dashboard/test/test_plugins/panel_group_tests.py +++ b/openstack_dashboard/test/test_plugins/panel_group_tests.py @@ -20,11 +20,14 @@ import horizon from openstack_dashboard.test import helpers as test from openstack_dashboard.test.test_panels.plugin_panel \ import panel as plugin_panel +from openstack_dashboard.test.test_panels.second_panel \ + import panel as second_panel import openstack_dashboard.test.test_plugins.panel_group_config from openstack_dashboard.utils import settings as util_settings PANEL_GROUP_SLUG = 'plugin_panel_group' +SECOND_PANEL_GROUP_SLUG = 'second_panel_group' HORIZON_CONFIG = copy.deepcopy(settings.HORIZON_CONFIG) INSTALLED_APPS = list(settings.INSTALLED_APPS) @@ -45,12 +48,31 @@ class PanelGroupPluginTests(test.PluginTestCase): dashboard = horizon.get_dashboard("admin") self.assertIsNotNone(dashboard.get_panel_group(PANEL_GROUP_SLUG)) + def test_add_second_panel_group(self): + # Check that the second panel group was added to the dashboard. + dashboard = horizon.get_dashboard("admin") + self.assertIsNotNone( + dashboard.get_panel_group(SECOND_PANEL_GROUP_SLUG)) + def test_add_panel(self): + # Check that the panel is in its configured dashboard and panel group. dashboard = horizon.get_dashboard("admin") + panel_group = dashboard.get_panel_group(PANEL_GROUP_SLUG) self.assertIn(plugin_panel.PluginPanel, [p.__class__ for p in dashboard.get_panels()]) + self.assertIn(plugin_panel.PluginPanel, + [p.__class__ for p in panel_group]) - def test_unregistered_panel_group(self): - dashboard = horizon.get_dashboard("admin") - self.assertIsNone(dashboard.get_panel_group("nonexistent_panel")) + def test_add_second_panel(self): + # Check that the second panel is in its configured dashboard and panel + # group. + dashboard = horizon.get_dashboard("admin") + second_panel_group = dashboard.get_panel_group(SECOND_PANEL_GROUP_SLUG) + self.assertIn(second_panel.SecondPanel, + [p.__class__ for p in dashboard.get_panels()]) + self.assertIn(second_panel.SecondPanel, + [p.__class__ for p in second_panel_group]) + def test_unregistered_panel_group(self): + dashboard = horizon.get_dashboard("admin") + self.assertIsNone(dashboard.get_panel_group("nonexistent_panel")) diff --git a/openstack_dashboard/test/test_plugins/panel_tests.py b/openstack_dashboard/test/test_plugins/panel_tests.py index 059a3f509..83afb2612 100644 --- a/openstack_dashboard/test/test_plugins/panel_tests.py +++ b/openstack_dashboard/test/test_plugins/panel_tests.py @@ -43,13 +43,23 @@ util_settings.update_dashboards([ class PanelPluginTests(test.PluginTestCase): def test_add_panel(self): dashboard = horizon.get_dashboard("admin") + panel_group = dashboard.get_panel_group('admin') + # Check that the panel is in its configured dashboard. self.assertIn(plugin_panel.PluginPanel, [p.__class__ for p in dashboard.get_panels()]) + # Check that the panel is in its configured panel group. + self.assertIn(plugin_panel.PluginPanel, + [p.__class__ for p in panel_group]) def test_remove_panel(self): dashboard = horizon.get_dashboard("admin") + panel_group = dashboard.get_panel_group('admin') + # Check that the panel is no longer in the configured dashboard. self.assertNotIn(info_panel.Info, [p.__class__ for p in dashboard.get_panels()]) + # Check that the panel is no longer in the configured panel group. + self.assertNotIn(info_panel.Info, + [p.__class__ for p in panel_group]) def test_default_panel(self): dashboard = horizon.get_dashboard("admin") diff --git a/requirements.txt b/requirements.txt index 6c2f2f4d1..821b06fa1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,7 @@ Django>=1.4.2,<1.8 Pint>=0.5 # BSD django_compressor>=1.4 django_openstack_auth>=1.1.7,!=1.1.8,<1.3.0 -django-pyscss>=1.0.3,!=2.0.0 # BSD License (2 clause) +django-pyscss>=1.0.3,<2.0.0 # BSD License (2 clause) eventlet>=0.16.1,!=0.17.0 httplib2>=0.7.5 iso8601>=0.1.9 |