From dbfa71f490487c4fabc5be71dfb8426e5d651055 Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Wed, 7 Aug 2013 15:20:53 +0200 Subject: [PATCH] Reorganise the tuskar files The dashboards/infrastructure were moved to tuskar_ui, so were the Tuskar API helpers. Non-tuskar files were removed. The Infrastructure dashboard will become a Django Application available in the tuskar_ui package. Change-Id: I49c5d46cc16696c4c719ee2c6d65c42b03183ba9 Signed-off-by: Tomas Sedovic --- doc/Makefile | 153 - doc/source/conf.py | 426 -- doc/source/contributing.rst | 203 - doc/source/faq.rst | 37 - doc/source/glossary.rst | 24 - doc/source/index.rst | 127 - doc/source/intro.rst | 124 - doc/source/quickstart.rst | 214 - doc/source/ref/context_processors.rst | 6 - doc/source/ref/decorators.rst | 6 - doc/source/ref/exceptions.rst | 6 - doc/source/ref/forms.rst | 98 - doc/source/ref/horizon.rst | 45 - doc/source/ref/middleware.rst | 6 - doc/source/ref/run_tests.rst | 233 - doc/source/ref/tables.rst | 82 - doc/source/ref/tabs.rst | 45 - doc/source/ref/test.rst | 25 - doc/source/ref/workflows.rst | 33 - doc/source/releases/2012_1.rst | 148 - doc/source/releases/2012_2.rst | 159 - doc/source/releases/2013_1.rst | 274 - doc/source/testing.rst | 41 - doc/source/topics/customizing.rst | 137 - doc/source/topics/deployment.rst | 217 - doc/source/topics/settings.rst | 294 - doc/source/topics/tables.rst | 129 - doc/source/topics/testing.rst | 276 - doc/source/topics/tutorial.rst | 556 -- horizon/__init__.py | 57 - horizon/base.py | 803 --- horizon/browsers/__init__.py | 21 - horizon/browsers/base.py | 150 - horizon/browsers/breadcrumb.py | 48 - horizon/browsers/views.py | 49 - horizon/conf/__init__.py | 35 - horizon/conf/dash_template/dashboard.py.tmpl | 13 - horizon/conf/dash_template/models.py | 3 - .../static/dash_name/css/dash_name.css | 1 - .../static/dash_name/js/dash_name.js | 1 - .../templates/dash_name/base.html | 11 - horizon/conf/default.py | 35 - horizon/conf/panel_template/models.py | 3 - horizon/conf/panel_template/panel.py.tmpl | 13 - .../templates/panel_name/index.html | 12 - horizon/conf/panel_template/tests.py.tmpl | 7 - horizon/conf/panel_template/urls.py | 8 - horizon/conf/panel_template/views.py | 10 - horizon/context_processors.py | 44 - horizon/decorators.py | 94 - horizon/exceptions.py | 321 -- horizon/forms/__init__.py | 40 - horizon/forms/base.py | 57 - horizon/forms/fields.py | 77 - horizon/forms/views.py | 117 - horizon/loaders.py | 48 - horizon/locale/bg_BG/LC_MESSAGES/django.mo | Bin 4526 -> 0 bytes horizon/locale/bg_BG/LC_MESSAGES/django.po | 514 -- horizon/locale/bg_BG/LC_MESSAGES/djangojs.mo | Bin 378 -> 0 bytes horizon/locale/bg_BG/LC_MESSAGES/djangojs.po | 73 - horizon/locale/ca/LC_MESSAGES/django.mo | Bin 5569 -> 0 bytes horizon/locale/ca/LC_MESSAGES/django.po | 513 -- horizon/locale/cs/LC_MESSAGES/django.mo | Bin 7066 -> 0 bytes horizon/locale/cs/LC_MESSAGES/django.po | 520 -- horizon/locale/en/LC_MESSAGES/django.mo | Bin 4775 -> 0 bytes horizon/locale/en/LC_MESSAGES/django.po | 514 -- horizon/locale/en/LC_MESSAGES/djangojs.mo | Bin 378 -> 0 bytes horizon/locale/en/LC_MESSAGES/djangojs.po | 73 - horizon/locale/en_GB/LC_MESSAGES/django.mo | Bin 6110 -> 0 bytes horizon/locale/en_GB/LC_MESSAGES/django.po | 513 -- horizon/locale/es/LC_MESSAGES/django.mo | Bin 6939 -> 0 bytes horizon/locale/es/LC_MESSAGES/django.po | 518 -- horizon/locale/es/LC_MESSAGES/djangojs.mo | Bin 420 -> 0 bytes horizon/locale/es/LC_MESSAGES/djangojs.po | 74 - horizon/locale/fi_FI/LC_MESSAGES/django.mo | Bin 6978 -> 0 bytes horizon/locale/fi_FI/LC_MESSAGES/django.po | 513 -- horizon/locale/fr/LC_MESSAGES/django.mo | Bin 414 -> 0 bytes horizon/locale/fr/LC_MESSAGES/django.po | 510 -- horizon/locale/fr/LC_MESSAGES/djangojs.mo | Bin 419 -> 0 bytes horizon/locale/fr/LC_MESSAGES/djangojs.po | 74 - horizon/locale/hu/LC_MESSAGES/django.mo | Bin 7176 -> 0 bytes horizon/locale/hu/LC_MESSAGES/django.po | 515 -- horizon/locale/it/LC_MESSAGES/django.mo | Bin 2915 -> 0 bytes horizon/locale/it/LC_MESSAGES/django.po | 515 -- horizon/locale/it/LC_MESSAGES/djangojs.mo | Bin 420 -> 0 bytes horizon/locale/it/LC_MESSAGES/djangojs.po | 74 - horizon/locale/ja/LC_MESSAGES/django.mo | Bin 7551 -> 0 bytes horizon/locale/ja/LC_MESSAGES/django.po | 511 -- horizon/locale/ja/LC_MESSAGES/djangojs.mo | Bin 413 -> 0 bytes horizon/locale/ja/LC_MESSAGES/djangojs.po | 73 - horizon/locale/ka_GE/LC_MESSAGES/django.mo | Bin 1960 -> 0 bytes horizon/locale/ka_GE/LC_MESSAGES/django.po | 508 -- horizon/locale/ko_KR/LC_MESSAGES/django.mo | Bin 2871 -> 0 bytes horizon/locale/ko_KR/LC_MESSAGES/django.po | 509 -- horizon/locale/ko_KR/LC_MESSAGES/djangojs.mo | Bin 378 -> 0 bytes horizon/locale/ko_KR/LC_MESSAGES/djangojs.po | 73 - horizon/locale/nl_NL/LC_MESSAGES/django.mo | Bin 2949 -> 0 bytes horizon/locale/nl_NL/LC_MESSAGES/django.po | 514 -- horizon/locale/nl_NL/LC_MESSAGES/djangojs.mo | Bin 378 -> 0 bytes horizon/locale/nl_NL/LC_MESSAGES/djangojs.po | 73 - horizon/locale/pl/LC_MESSAGES/django.mo | Bin 572 -> 0 bytes horizon/locale/pl/LC_MESSAGES/django.po | 530 -- horizon/locale/pl/LC_MESSAGES/djangojs.mo | Bin 478 -> 0 bytes horizon/locale/pl/LC_MESSAGES/djangojs.po | 76 - horizon/locale/pt/LC_MESSAGES/django.mo | Bin 4432 -> 0 bytes horizon/locale/pt/LC_MESSAGES/django.po | 513 -- horizon/locale/pt/LC_MESSAGES/djangojs.mo | Bin 420 -> 0 bytes horizon/locale/pt/LC_MESSAGES/djangojs.po | 74 - horizon/locale/pt_BR/LC_MESSAGES/django.mo | Bin 6948 -> 0 bytes horizon/locale/pt_BR/LC_MESSAGES/django.po | 518 -- horizon/locale/pt_BR/LC_MESSAGES/djangojs.mo | Bin 419 -> 0 bytes horizon/locale/pt_BR/LC_MESSAGES/djangojs.po | 74 - horizon/locale/ru/LC_MESSAGES/django.mo | Bin 7793 -> 0 bytes horizon/locale/ru/LC_MESSAGES/django.po | 520 -- horizon/locale/ru/LC_MESSAGES/djangojs.mo | Bin 494 -> 0 bytes horizon/locale/ru/LC_MESSAGES/djangojs.po | 75 - horizon/locale/zh_CN/LC_MESSAGES/django.mo | Bin 5414 -> 0 bytes horizon/locale/zh_CN/LC_MESSAGES/django.po | 516 -- horizon/locale/zh_CN/LC_MESSAGES/djangojs.mo | Bin 413 -> 0 bytes horizon/locale/zh_CN/LC_MESSAGES/djangojs.po | 73 - horizon/locale/zh_HK/LC_MESSAGES/django.mo | Bin 3782 -> 0 bytes horizon/locale/zh_HK/LC_MESSAGES/django.po | 508 -- horizon/locale/zh_TW/LC_MESSAGES/django.mo | Bin 5052 -> 0 bytes horizon/locale/zh_TW/LC_MESSAGES/django.po | 508 -- horizon/locale/zh_TW/LC_MESSAGES/djangojs.mo | Bin 413 -> 0 bytes horizon/locale/zh_TW/LC_MESSAGES/djangojs.po | 73 - horizon/management/commands/startdash.py | 59 - horizon/management/commands/startpanel.py | 97 - horizon/messages.py | 83 - horizon/middleware.py | 129 - horizon/models.py | 23 - horizon/site_urls.py | 47 - .../bootstrap/js/bootstrap-datepicker.js | 470 -- horizon/static/bootstrap/js/bootstrap.js | 1720 ------ horizon/static/bootstrap/js/bootstrap.min.js | 1 - .../horizon/js/horizon.communication.js | 51 - horizon/static/horizon/js/horizon.conf.js | 31 - horizon/static/horizon/js/horizon.cookies.js | 23 - .../static/horizon/js/horizon.d3piechart.js | 102 - horizon/static/horizon/js/horizon.forms.js | 190 - horizon/static/horizon/js/horizon.heattop.js | 275 - .../static/horizon/js/horizon.instances.js | 226 - horizon/static/horizon/js/horizon.js | 35 - horizon/static/horizon/js/horizon.messages.js | 65 - horizon/static/horizon/js/horizon.modals.js | 223 - .../horizon/js/horizon.networktopology.js | 280 - horizon/static/horizon/js/horizon.projects.js | 474 -- horizon/static/horizon/js/horizon.quota.js | 333 -- horizon/static/horizon/js/horizon.tables.js | 392 -- horizon/static/horizon/js/horizon.tabs.js | 84 - .../static/horizon/js/horizon.templates.js | 17 - horizon/static/horizon/js/horizon.users.js | 31 - horizon/static/horizon/js/horizon.utils.js | 44 - horizon/static/horizon/lib/d3.v3.min.js | 5 - horizon/static/horizon/lib/hogan-2.0.0.js | 576 -- .../lib/jquery/jquery-ui-1.9.2.custom.min.js | 6 - .../horizon/lib/jquery/jquery.cookie.js | 47 - .../static/horizon/lib/jquery/jquery.min.js | 4 - .../horizon/lib/jquery/jquery.quicksearch.js | 150 - .../horizon/lib/jquery/jquery.table-sorter.js | 1031 ---- horizon/static/horizon/lib/json2.js | 487 -- horizon/static/horizon/lib/qunit/qunit.css | 238 - horizon/static/horizon/lib/qunit/qunit.js | 1865 ------ horizon/static/horizon/lib/spin.jquery.js | 17 - horizon/static/horizon/lib/spin.js | 2 - .../horizon/lib/underscore/underscore-min.js | 32 - horizon/static/horizon/tests/messages.js | 38 - horizon/static/horizon/tests/modals.js | 22 - horizon/static/horizon/tests/tables.js | 49 - horizon/static/horizon/tests/templates.js | 7 - horizon/tables/__init__.py | 44 - horizon/tables/actions.py | 625 -- horizon/tables/views.py | 261 - horizon/tabs/__init__.py | 27 - horizon/tabs/base.py | 459 -- horizon/tabs/views.py | 141 - horizon/templates/_header.html | 9 - horizon/templates/_stylesheets.html | 1 - horizon/templates/auth/_login.html | 29 - horizon/templates/auth/login.html | 10 - horizon/templates/base.html | 38 - horizon/templates/horizon/_conf.html | 21 - horizon/templates/horizon/_messages.html | 29 - horizon/templates/horizon/_nav_list.html | 13 - horizon/templates/horizon/_scripts.html | 52 - horizon/templates/horizon/_subnav_list.html | 16 - .../horizon/client_side/_alert_message.html | 21 - .../horizon/client_side/_loading.html | 12 - .../templates/horizon/client_side/_modal.html | 22 - .../horizon/client_side/_modal_chart.html | 19 - .../horizon/client_side/_project_user.html | 26 - .../horizon/client_side/_script_loader.html | 20 - .../horizon/client_side/_table_row.html | 10 - .../horizon/client_side/template.html | 1 - .../horizon/client_side/templates.html | 6 - .../templates/horizon/common/_breadcrumb.html | 20 - .../templates/horizon/common/_data_table.html | 78 - .../horizon/common/_data_table_row.html | 3 - .../common/_data_table_row_action.html | 5 - .../common/_data_table_row_actions.html | 30 - .../common/_data_table_table_actions.html | 28 - .../horizon/common/_detail_table.html | 1 - .../horizon/common/_domain_page_header.html | 11 - .../horizon/common/_form_fields.html | 22 - .../horizon/common/_limit_summary.html | 39 - horizon/templates/horizon/common/_modal.html | 10 - .../templates/horizon/common/_modal_form.html | 24 - .../common/_modal_form_add_members.html | 41 - .../horizon/common/_page_header.html | 6 - .../horizon/common/_region_selector.html | 16 - .../horizon/common/_resource_browser.html | 13 - .../templates/horizon/common/_sidebar.html | 54 - .../horizon/common/_sidebar_module.html | 10 - .../templates/horizon/common/_tab_group.html | 23 - .../horizon/common/_usage_summary.html | 20 - .../templates/horizon/common/_workflow.html | 43 - .../horizon/common/_workflow_base.html | 11 - .../horizon/common/_workflow_step.html | 13 - .../common/_workflow_step_update_members.html | 50 - horizon/templates/horizon/qunit.html | 73 - horizon/templates/splash.html | 17 - horizon/templatetags/branding.py | 63 - horizon/templatetags/horizon.py | 128 - horizon/templatetags/parse_date.py | 54 - horizon/templatetags/sizeformat.py | 77 - horizon/templatetags/truncate_filter.py | 35 - horizon/test/customization/cust_test1.py | 15 - horizon/test/customization/cust_test2.py | 9 - horizon/test/helpers.py | 184 - horizon/test/settings.py | 180 - horizon/test/templates/404.html | 0 .../test/test_dashboards/cats/dashboard.py | 25 - .../test_dashboards/cats/kittens/models.py | 3 - .../test_dashboards/cats/kittens/panel.py | 14 - .../cats/kittens/templates/kittens/index.html | 12 - .../test/test_dashboards/cats/kittens/urls.py | 8 - .../test_dashboards/cats/kittens/views.py | 10 - horizon/test/test_dashboards/cats/models.py | 3 - .../cats/static/cats/css/cats.css | 1 - .../cats/static/cats/js/cats.js | 1 - .../cats/templates/cats/base.html | 11 - .../test_dashboards/cats/tigers/models.py | 3 - .../test/test_dashboards/cats/tigers/panel.py | 14 - .../cats/tigers/templates/tigers/index.html | 12 - .../test/test_dashboards/cats/tigers/urls.py | 8 - .../test/test_dashboards/cats/tigers/views.py | 10 - .../test/test_dashboards/dogs/dashboard.py | 13 - horizon/test/test_dashboards/dogs/models.py | 3 - .../test_dashboards/dogs/puppies/models.py | 3 - .../test_dashboards/dogs/puppies/panel.py | 13 - .../dogs/puppies/templates/puppies/index.html | 12 - .../test/test_dashboards/dogs/puppies/urls.py | 8 - .../test_dashboards/dogs/puppies/views.py | 10 - .../dogs/static/dogs/css/dogs.css | 1 - .../dogs/static/dogs/js/dogs.js | 1 - .../dogs/templates/dogs/base.html | 11 - horizon/test/tests/base.py | 390 -- horizon/test/tests/messages.py | 56 - horizon/test/tests/middleware.py | 34 - horizon/test/tests/selenium.py | 31 - horizon/test/tests/tables.py | 755 --- horizon/test/tests/tabs.py | 307 - horizon/test/tests/templatetags.py | 50 - horizon/test/tests/utils.py | 196 - horizon/test/tests/workflows.py | 266 - horizon/test/urls.py | 45 - horizon/utils/__init__.py | 0 horizon/utils/fields.py | 130 - horizon/utils/filters.py | 38 - horizon/utils/functions.py | 17 - horizon/utils/html.py | 56 - horizon/utils/memoized.py | 50 - horizon/utils/secret_key.py | 67 - horizon/utils/validators.py | 38 - horizon/version.py | 19 - horizon/views.py | 53 - horizon/workflows/__init__.py | 13 - horizon/workflows/base.py | 934 --- horizon/workflows/views.py | 158 - openstack-common.conf | 9 - openstack_dashboard/__init__.py | 0 openstack_dashboard/api/__init__.py | 58 - openstack_dashboard/api/base.py | 263 - openstack_dashboard/api/cinder.py | 159 - openstack_dashboard/api/glance.py | 104 - openstack_dashboard/api/heat.py | 86 - openstack_dashboard/api/keystone.py | 545 -- openstack_dashboard/api/lbaas.py | 321 -- openstack_dashboard/api/network.py | 129 - openstack_dashboard/api/network_base.py | 216 - openstack_dashboard/api/neutron.py | 605 -- openstack_dashboard/api/nova.py | 651 --- openstack_dashboard/api/swift.py | 241 - openstack_dashboard/context_processors.py | 63 - openstack_dashboard/dashboards/__init__.py | 0 .../dashboards/admin/__init__.py | 0 .../dashboards/admin/aggregates/__init__.py | 0 .../dashboards/admin/aggregates/panel.py | 29 - .../dashboards/admin/aggregates/tables.py | 54 - .../aggregates/_aggregate_hosts.html | 5 - .../aggregates/_aggregate_metadata.html | 5 - .../templates/aggregates/index.html | 11 - .../dashboards/admin/aggregates/tests.py | 34 - .../dashboards/admin/aggregates/urls.py | 27 - .../dashboards/admin/aggregates/views.py | 42 - .../dashboards/admin/dashboard.py | 43 - .../dashboards/admin/domains/__init__.py | 0 .../dashboards/admin/domains/constants.py | 23 - .../dashboards/admin/domains/panel.py | 37 - .../dashboards/admin/domains/tables.py | 149 - .../domains/templates/domains/index.html | 11 - .../dashboards/admin/domains/tests.py | 228 - .../dashboards/admin/domains/urls.py | 30 - .../dashboards/admin/domains/views.py | 82 - .../dashboards/admin/domains/workflows.py | 127 - .../dashboards/admin/flavors/__init__.py | 0 .../admin/flavors/extras/__init__.py | 0 .../dashboards/admin/flavors/extras/forms.py | 67 - .../dashboards/admin/flavors/extras/tables.py | 74 - .../dashboards/admin/flavors/extras/tests.py | 62 - .../dashboards/admin/flavors/extras/urls.py | 33 - .../dashboards/admin/flavors/extras/views.py | 98 - .../dashboards/admin/flavors/forms.py | 144 - .../dashboards/admin/flavors/panel.py | 33 - .../dashboards/admin/flavors/tables.py | 68 - .../flavors/templates/flavors/_create.html | 26 - .../flavors/templates/flavors/_edit.html | 27 - .../flavors/templates/flavors/create.html | 11 - .../admin/flavors/templates/flavors/edit.html | 11 - .../templates/flavors/extras/_create.html | 28 - .../templates/flavors/extras/_edit.html | 28 - .../templates/flavors/extras/_index.html | 15 - .../templates/flavors/extras/create.html | 12 - .../templates/flavors/extras/edit.html | 12 - .../templates/flavors/extras/index.html | 12 - .../flavors/templates/flavors/index.html | 11 - .../dashboards/admin/flavors/tests.py | 234 - .../dashboards/admin/flavors/urls.py | 36 - .../dashboards/admin/flavors/views.py | 85 - .../dashboards/admin/groups/__init__.py | 0 .../dashboards/admin/groups/constants.py | 11 - .../dashboards/admin/groups/forms.py | 77 - .../dashboards/admin/groups/panel.py | 31 - .../dashboards/admin/groups/tables.py | 212 - .../templates/groups/_add_non_member.html | 9 - .../groups/templates/groups/_create.html | 25 - .../groups/templates/groups/_update.html | 25 - .../templates/groups/add_non_member.html | 7 - .../admin/groups/templates/groups/create.html | 11 - .../admin/groups/templates/groups/index.html | 11 - .../admin/groups/templates/groups/manage.html | 11 - .../admin/groups/templates/groups/update.html | 11 - .../dashboards/admin/groups/tests.py | 237 - .../dashboards/admin/groups/urls.py | 36 - .../dashboards/admin/groups/views.py | 171 - .../dashboards/admin/hypervisors/__init__.py | 0 .../dashboards/admin/hypervisors/panel.py | 29 - .../dashboards/admin/hypervisors/tables.py | 75 - .../templates/hypervisors/index.html | 11 - .../dashboards/admin/hypervisors/tests.py | 34 - .../dashboards/admin/hypervisors/urls.py | 27 - .../dashboards/admin/hypervisors/views.py | 42 - .../dashboards/admin/images/__init__.py | 0 .../dashboards/admin/images/forms.py | 30 - .../dashboards/admin/images/panel.py | 33 - .../dashboards/admin/images/tables.py | 59 - .../images/templates/images/_create.html | 35 - .../images/templates/images/_update.html | 26 - .../admin/images/templates/images/create.html | 11 - .../admin/images/templates/images/index.html | 11 - .../admin/images/templates/images/update.html | 12 - .../dashboards/admin/images/tests.py | 106 - .../dashboards/admin/images/urls.py | 35 - .../dashboards/admin/images/views.py | 80 - .../dashboards/admin/info/__init__.py | 0 .../dashboards/admin/info/panel.py | 33 - .../dashboards/admin/info/tables.py | 121 - .../dashboards/admin/info/tabs.py | 85 - .../admin/info/templates/info/index.html | 15 - .../dashboards/admin/info/tests.py | 71 - .../dashboards/admin/info/urls.py | 28 - .../dashboards/admin/info/views.py | 33 - .../dashboards/admin/instances/__init__.py | 0 .../dashboards/admin/instances/panel.py | 34 - .../dashboards/admin/instances/tables.py | 170 - .../instances/templates/instances/index.html | 11 - .../dashboards/admin/instances/tests.py | 208 - .../dashboards/admin/instances/urls.py | 41 - .../dashboards/admin/instances/views.py | 121 - .../dashboards/admin/models.py | 23 - .../dashboards/admin/networks/__init__.py | 0 .../dashboards/admin/networks/forms.py | 102 - .../dashboards/admin/networks/panel.py | 29 - .../admin/networks/ports/__init__.py | 0 .../dashboards/admin/networks/ports/forms.py | 104 - .../dashboards/admin/networks/ports/tables.py | 87 - .../dashboards/admin/networks/ports/tabs.py | 49 - .../dashboards/admin/networks/ports/urls.py | 29 - .../dashboards/admin/networks/ports/views.py | 75 - .../admin/networks/subnets/__init__.py | 0 .../admin/networks/subnets/tables.py | 83 - .../dashboards/admin/networks/subnets/urls.py | 30 - .../admin/networks/subnets/views.py | 36 - .../admin/networks/subnets/workflows.py | 60 - .../dashboards/admin/networks/tables.py | 82 - .../networks/templates/networks/_create.html | 26 - .../networks/templates/networks/_update.html | 25 - .../networks/templates/networks/create.html | 11 - .../networks/templates/networks/index.html | 21 - .../templates/networks/ports/_create.html | 26 - .../templates/networks/ports/_update.html | 30 - .../templates/networks/ports/create.html | 11 - .../templates/networks/ports/update.html | 11 - .../templates/networks/subnets/index.html | 11 - .../networks/templates/networks/update.html | 11 - .../dashboards/admin/networks/tests.py | 822 --- .../dashboards/admin/networks/urls.py | 59 - .../dashboards/admin/networks/views.py | 146 - .../dashboards/admin/overview/__init__.py | 0 .../dashboards/admin/overview/panel.py | 34 - .../overview/templates/overview/usage.csv | 6 - .../overview/templates/overview/usage.html | 22 - .../dashboards/admin/overview/tests.py | 106 - .../dashboards/admin/overview/urls.py | 30 - .../dashboards/admin/overview/views.py | 73 - .../dashboards/admin/projects/__init__.py | 0 .../dashboards/admin/projects/forms.py | 33 - .../dashboards/admin/projects/panel.py | 33 - .../dashboards/admin/projects/tables.py | 168 - .../templates/projects/_add_user.html | 26 - .../projects/templates/projects/_create.html | 26 - .../templates/projects/_create_user.html | 26 - .../projects/templates/projects/_quotas.html | 25 - .../projects/templates/projects/_update.html | 26 - .../templates/projects/_update_members.html | 39 - .../projects/templates/projects/add_user.html | 11 - .../templates/projects/create_user.html | 12 - .../projects/templates/projects/index.html | 11 - .../projects/templates/projects/quotas.html | 11 - .../projects/templates/projects/usage.html | 12 - .../projects/templates/projects/users.html | 18 - .../dashboards/admin/projects/tests.py | 1069 ---- .../dashboards/admin/projects/urls.py | 43 - .../dashboards/admin/projects/views.py | 213 - .../dashboards/admin/projects/workflows.py | 428 -- .../dashboards/admin/roles/__init__.py | 0 .../dashboards/admin/roles/forms.py | 48 - .../dashboards/admin/roles/panel.py | 30 - .../dashboards/admin/roles/tables.py | 76 - .../admin/roles/templates/roles/_create.html | 25 - .../admin/roles/templates/roles/_update.html | 25 - .../admin/roles/templates/roles/create.html | 12 - .../admin/roles/templates/roles/index.html | 11 - .../admin/roles/templates/roles/update.html | 12 - .../dashboards/admin/roles/tests.py | 113 - .../dashboards/admin/roles/urls.py | 27 - .../dashboards/admin/roles/views.py | 77 - .../dashboards/admin/routers/__init__.py | 0 .../dashboards/admin/routers/panel.py | 29 - .../admin/routers/ports/__init__.py | 0 .../dashboards/admin/routers/ports/tables.py | 47 - .../dashboards/admin/routers/ports/tabs.py | 31 - .../dashboards/admin/routers/ports/urls.py | 25 - .../dashboards/admin/routers/ports/views.py | 30 - .../dashboards/admin/routers/tables.py | 75 - .../dashboards/admin/routers/tabs.py | 28 - .../templates/routers/_detail_overview.html | 22 - .../routers/templates/routers/detail.html | 15 - .../routers/templates/routers/index.html | 11 - .../dashboards/admin/routers/tests.py | 63 - .../dashboards/admin/routers/urls.py | 29 - .../dashboards/admin/routers/views.py | 72 - .../dashboards/admin/users/__init__.py | 0 .../dashboards/admin/users/forms.py | 168 - .../dashboards/admin/users/panel.py | 33 - .../dashboards/admin/users/tables.py | 122 - .../admin/users/templates/users/_create.html | 35 - .../admin/users/templates/users/_update.html | 35 - .../admin/users/templates/users/create.html | 12 - .../admin/users/templates/users/index.html | 11 - .../admin/users/templates/users/update.html | 12 - .../dashboards/admin/users/tests.py | 462 -- .../dashboards/admin/users/urls.py | 31 - .../dashboards/admin/users/views.py | 117 - .../dashboards/admin/volumes/__init__.py | 0 .../dashboards/admin/volumes/forms.py | 44 - .../dashboards/admin/volumes/panel.py | 14 - .../dashboards/admin/volumes/tables.py | 69 - .../volumes/_create_volume_type.html | 30 - .../templates/volumes/create_volume_type.html | 11 - .../volumes/templates/volumes/detail.html | 15 - .../volumes/templates/volumes/index.html | 17 - .../dashboards/admin/volumes/tests.py | 94 - .../dashboards/admin/volumes/urls.py | 13 - .../dashboards/admin/volumes/views.py | 89 - .../dashboards/infrastructure/__init__.py | 0 .../infrastructure/overview/__init__.py | 0 .../resource_management/__init__.py | 0 .../resource_management/flavors/__init__.py | 0 .../resource_management/nodes/__init__.py | 0 .../resource_management/racks/__init__.py | 0 .../resource_classes/__init__.py | 0 .../service_management/__init__.py | 0 .../infrastructure/templatetags/__init__.py | 0 .../dashboards/project/__init__.py | 0 .../project/access_and_security/__init__.py | 0 .../api_access/__init__.py | 0 .../access_and_security/api_access/tables.py | 59 - .../access_and_security/api_access/tests.py | 51 - .../access_and_security/api_access/urls.py | 33 - .../access_and_security/api_access/views.py | 135 - .../floating_ips/__init__.py | 0 .../access_and_security/floating_ips/forms.py | 48 - .../floating_ips/tables.py | 134 - .../access_and_security/floating_ips/tests.py | 177 - .../access_and_security/floating_ips/urls.py | 33 - .../access_and_security/floating_ips/views.py | 72 - .../floating_ips/workflows.py | 143 - .../access_and_security/keypairs/__init__.py | 0 .../access_and_security/keypairs/forms.py | 66 - .../access_and_security/keypairs/tables.py | 62 - .../access_and_security/keypairs/tests.py | 144 - .../access_and_security/keypairs/urls.py | 41 - .../access_and_security/keypairs/views.py | 88 - .../project/access_and_security/panel.py | 30 - .../security_groups/__init__.py | 0 .../security_groups/forms.py | 354 -- .../security_groups/tables.py | 168 - .../security_groups/tests.py | 664 --- .../security_groups/urls.py | 40 - .../security_groups/views.py | 114 - .../project/access_and_security/tabs.py | 132 - .../api_access/ec2rc.sh.template | 15 - .../api_access/openrc.sh.template | 24 - .../floating_ips/_allocate.html | 44 - .../floating_ips/allocate.html | 7 - .../templates/access_and_security/index.html | 15 - .../access_and_security/keypairs/_create.html | 26 - .../access_and_security/keypairs/_import.html | 26 - .../access_and_security/keypairs/create.html | 12 - .../keypairs/download.html | 22 - .../access_and_security/keypairs/import.html | 12 - .../security_groups/_add_rule.html | 29 - .../security_groups/_create.html | 26 - .../security_groups/add_rule.html | 12 - .../security_groups/create.html | 11 - .../security_groups/detail.html | 11 - .../project/access_and_security/tests.py | 102 - .../project/access_and_security/urls.py | 44 - .../project/access_and_security/views.py | 34 - .../dashboards/project/containers/__init__.py | 0 .../dashboards/project/containers/browsers.py | 36 - .../dashboards/project/containers/forms.py | 153 - .../dashboards/project/containers/panel.py | 33 - .../dashboards/project/containers/tables.py | 241 - .../templates/containers/_copy.html | 25 - .../templates/containers/_create.html | 25 - .../templates/containers/_upload.html | 27 - .../containers/templates/containers/copy.html | 13 - .../templates/containers/create.html | 11 - .../templates/containers/index.html | 13 - .../templates/containers/upload.html | 15 - .../dashboards/project/containers/tests.py | 239 - .../dashboards/project/containers/urls.py | 55 - .../dashboards/project/containers/views.py | 228 - .../dashboards/project/dashboard.py | 62 - .../project/images_and_snapshots/__init__.py | 0 .../images_and_snapshots/images/__init__.py | 0 .../images_and_snapshots/images/forms.py | 223 - .../images_and_snapshots/images/tables.py | 229 - .../images_and_snapshots/images/tabs.py | 45 - .../images_and_snapshots/images/tests.py | 264 - .../images_and_snapshots/images/urls.py | 40 - .../images_and_snapshots/images/views.py | 91 - .../project/images_and_snapshots/panel.py | 30 - .../snapshots/__init__.py | 0 .../images_and_snapshots/snapshots/forms.py | 57 - .../images_and_snapshots/snapshots/tests.py | 98 - .../images_and_snapshots/snapshots/urls.py | 32 - .../images_and_snapshots/snapshots/views.py | 66 - .../images_and_snapshots/images/_create.html | 35 - .../images/_detail_overview.html | 82 - .../images_and_snapshots/images/_update.html | 25 - .../images_and_snapshots/images/create.html | 11 - .../images_and_snapshots/images/detail.html | 16 - .../images_and_snapshots/images/update.html | 11 - .../templates/images_and_snapshots/index.html | 16 - .../snapshots/_create.html | 26 - .../snapshots/_detail_overview.html | 42 - .../snapshots/create.html | 11 - .../snapshots/detail.html | 15 - .../project/images_and_snapshots/tests.py | 174 - .../project/images_and_snapshots/urls.py | 42 - .../project/images_and_snapshots/utils.py | 63 - .../project/images_and_snapshots/views.py | 84 - .../volume_snapshots/__init__.py | 0 .../volume_snapshots/tables.py | 96 - .../volume_snapshots/tabs.py | 49 - .../volume_snapshots/tests.py | 94 - .../dashboards/project/instances/__init__.py | 0 .../dashboards/project/instances/panel.py | 29 - .../dashboards/project/instances/tables.py | 575 -- .../dashboards/project/instances/tabs.py | 110 - .../templates/instances/_detail_console.html | 22 - .../templates/instances/_detail_log.html | 18 - .../templates/instances/_detail_overview.html | 111 - .../instances/_flavors_and_quotas.html | 50 - .../templates/instances/_instance_ips.html | 10 - .../instances/_launch_customize_help.html | 3 - .../instances/_launch_details_help.html | 7 - .../instances/_launch_network_help.html | 3 - .../instances/_launch_volumes_help.html | 3 - .../templates/instances/_update_networks.html | 46 - .../instances/templates/instances/detail.html | 15 - .../instances/templates/instances/index.html | 11 - .../dashboards/project/instances/tests.py | 1740 ------ .../dashboards/project/instances/urls.py | 45 - .../dashboards/project/instances/views.py | 262 - .../project/instances/workflows/__init__.py | 7 - .../instances/workflows/create_instance.py | 546 -- .../instances/workflows/resize_instance.py | 111 - .../instances/workflows/update_instance.py | 148 - .../project/loadbalancers/__init__.py | 0 .../dashboards/project/loadbalancers/forms.py | 246 - .../project/loadbalancers/models.py | 3 - .../dashboards/project/loadbalancers/panel.py | 21 - .../project/loadbalancers/tables.py | 243 - .../dashboards/project/loadbalancers/tabs.py | 173 - .../loadbalancers/_member_details.html | 30 - .../templates/loadbalancers/_members_tab.html | 5 - .../loadbalancers/_monitor_details.html | 41 - .../loadbalancers/_monitors_tab.html | 5 - .../loadbalancers/_pool_details.html | 42 - .../templates/loadbalancers/_pools_tab.html | 5 - .../loadbalancers/_updatemember.html | 25 - .../loadbalancers/_updatemonitor.html | 25 - .../templates/loadbalancers/_updatepool.html | 25 - .../templates/loadbalancers/_updatevip.html | 25 - .../templates/loadbalancers/_vip_details.html | 48 - .../templates/loadbalancers/details_tabs.html | 15 - .../templates/loadbalancers/updatemember.html | 11 - .../loadbalancers/updatemonitor.html | 11 - .../templates/loadbalancers/updatepool.html | 11 - .../templates/loadbalancers/updatevip.html | 11 - .../dashboards/project/loadbalancers/tests.py | 794 --- .../dashboards/project/loadbalancers/urls.py | 77 - .../dashboards/project/loadbalancers/views.py | 338 -- .../project/loadbalancers/workflows.py | 609 -- .../dashboards/project/models.py | 23 - .../project/network_topology/__init__.py | 19 - .../project/network_topology/panel.py | 34 - .../templates/network_topology/index.html | 37 - .../project/network_topology/urls.py | 35 - .../project/network_topology/views.py | 143 - .../dashboards/project/networks/__init__.py | 0 .../dashboards/project/networks/forms.py | 59 - .../dashboards/project/networks/panel.py | 29 - .../project/networks/ports/__init__.py | 0 .../project/networks/ports/forms.py | 56 - .../project/networks/ports/tables.py | 71 - .../dashboards/project/networks/ports/tabs.py | 49 - .../dashboards/project/networks/ports/urls.py | 30 - .../project/networks/ports/views.py | 74 - .../project/networks/subnets/__init__.py | 0 .../project/networks/subnets/tables.py | 107 - .../project/networks/subnets/tabs.py | 49 - .../project/networks/subnets/urls.py | 30 - .../project/networks/subnets/views.py | 106 - .../project/networks/subnets/workflows.py | 196 - .../dashboards/project/networks/tables.py | 108 - .../networks/templates/networks/_create.html | 25 - .../templates/networks/_detail_overview.html | 28 - .../templates/networks/_network_ips.html | 10 - .../networks/templates/networks/_update.html | 25 - .../networks/templates/networks/detail.html | 18 - .../networks/templates/networks/index.html | 11 - .../networks/ports/_detail_overview.html | 44 - .../templates/networks/ports/_port_ips.html | 7 - .../templates/networks/ports/_update.html | 30 - .../templates/networks/ports/detail.html | 15 - .../templates/networks/ports/update.html | 11 - .../networks/subnets/_detail_overview.html | 50 - .../templates/networks/subnets/detail.html | 15 - .../templates/networks/subnets/index.html | 11 - .../networks/templates/networks/update.html | 11 - .../dashboards/project/networks/tests.py | 1335 ----- .../dashboards/project/networks/urls.py | 52 - .../dashboards/project/networks/views.py | 148 - .../dashboards/project/networks/workflows.py | 370 -- .../dashboards/project/overview/__init__.py | 0 .../dashboards/project/overview/panel.py | 33 - .../overview/templates/overview/usage.csv | 7 - .../overview/templates/overview/usage.html | 13 - .../dashboards/project/overview/tests.py | 154 - .../dashboards/project/overview/urls.py | 33 - .../dashboards/project/overview/views.py | 61 - .../dashboards/project/routers/__init__.py | 0 .../dashboards/project/routers/forms.py | 41 - .../dashboards/project/routers/panel.py | 29 - .../project/routers/ports/__init__.py | 0 .../dashboards/project/routers/ports/forms.py | 191 - .../project/routers/ports/tables.py | 98 - .../dashboards/project/routers/ports/tabs.py | 47 - .../dashboards/project/routers/ports/urls.py | 26 - .../dashboards/project/routers/ports/views.py | 105 - .../dashboards/project/routers/tables.py | 142 - .../dashboards/project/routers/tabs.py | 44 - .../routers/templates/routers/_create.html | 22 - .../templates/routers/_detail_overview.html | 20 - .../routers/templates/routers/create.html | 11 - .../routers/templates/routers/detail.html | 15 - .../routers/templates/routers/index.html | 11 - .../templates/routers/ports/_create.html | 31 - .../templates/routers/ports/_setgateway.html | 26 - .../templates/routers/ports/create.html | 11 - .../templates/routers/ports/setgateway.html | 11 - .../dashboards/project/routers/tests.py | 317 -- .../dashboards/project/routers/urls.py | 40 - .../dashboards/project/routers/views.py | 146 - .../dashboards/project/stacks/__init__.py | 0 .../dashboards/project/stacks/api.py | 77 - .../dashboards/project/stacks/forms.py | 260 - .../dashboards/project/stacks/mappings.py | 145 - .../dashboards/project/stacks/panel.py | 27 - .../dashboards/project/stacks/sro.py | 31 - .../dashboards/project/stacks/tables.py | 179 - .../dashboards/project/stacks/tabs.py | 116 - .../stacks/templates/stacks/_create.html | 26 - .../templates/stacks/_detail_events.html | 3 - .../templates/stacks/_detail_overview.html | 66 - .../templates/stacks/_detail_resources.html | 3 - .../templates/stacks/_detail_topology.html | 9 - .../templates/stacks/_resource_info.html | 10 - .../templates/stacks/_resource_overview.html | 42 - .../templates/stacks/_select_template.html | 27 - .../stacks/templates/stacks/_stack_info.html | 16 - .../stacks/templates/stacks/create.html | 11 - .../stacks/templates/stacks/detail.html | 15 - .../stacks/templates/stacks/index.html | 13 - .../stacks/templates/stacks/resource.html | 15 - .../templates/stacks/select_template.html | 11 - .../dashboards/project/stacks/tests.py | 156 - .../dashboards/project/stacks/urls.py | 38 - .../dashboards/project/stacks/views.py | 169 - .../dashboards/project/volumes/__init__.py | 0 .../dashboards/project/volumes/forms.py | 353 -- .../dashboards/project/volumes/panel.py | 30 - .../dashboards/project/volumes/tables.py | 250 - .../dashboards/project/volumes/tabs.py | 49 - .../volumes/templates/volumes/_attach.html | 26 - .../volumes/templates/volumes/_create.html | 26 - .../templates/volumes/_create_snapshot.html | 25 - .../templates/volumes/_detail_overview.html | 61 - .../volumes/templates/volumes/_limits.html | 34 - .../volumes/templates/volumes/attach.html | 11 - .../volumes/templates/volumes/create.html | 11 - .../templates/volumes/create_snapshot.html | 11 - .../volumes/templates/volumes/detail.html | 15 - .../volumes/templates/volumes/index.html | 11 - .../dashboards/project/volumes/tests.py | 782 --- .../dashboards/project/volumes/urls.py | 41 - .../dashboards/project/volumes/views.py | 209 - .../dashboards/settings/__init__.py | 0 .../dashboards/settings/dashboard.py | 31 - .../dashboards/settings/models.py | 23 - .../dashboards/settings/password/__init__.py | 0 .../dashboards/settings/password/forms.py | 68 - .../dashboards/settings/password/panel.py | 29 - .../password/templates/password/_change.html | 27 - .../password/templates/password/change.html | 11 - .../dashboards/settings/password/tests.py | 57 - .../dashboards/settings/password/urls.py | 24 - .../dashboards/settings/password/views.py | 26 - .../dashboards/settings/user/__init__.py | 0 .../dashboards/settings/user/forms.py | 85 - .../dashboards/settings/user/panel.py | 29 - .../user/templates/user/_settings.html | 27 - .../user/templates/user/settings.html | 11 - .../dashboards/settings/user/tests.py | 33 - .../dashboards/settings/user/urls.py | 24 - .../dashboards/settings/user/views.py | 35 - openstack_dashboard/exceptions.py | 71 - openstack_dashboard/local/__init__.py | 0 .../local/local_settings.py.example | 367 -- .../locale/bg_BG/LC_MESSAGES/django.mo | Bin 1545 -> 0 bytes .../locale/bg_BG/LC_MESSAGES/django.po | 4710 --------------- .../locale/ca/LC_MESSAGES/django.mo | Bin 19571 -> 0 bytes .../locale/ca/LC_MESSAGES/django.po | 4710 --------------- .../locale/cs/LC_MESSAGES/django.mo | Bin 76251 -> 0 bytes .../locale/cs/LC_MESSAGES/django.po | 4713 --------------- .../locale/en/LC_MESSAGES/django.mo | Bin 1311 -> 0 bytes .../locale/en/LC_MESSAGES/django.po | 4712 --------------- .../locale/en_GB/LC_MESSAGES/django.mo | Bin 10625 -> 0 bytes .../locale/en_GB/LC_MESSAGES/django.po | 4711 --------------- .../locale/es/LC_MESSAGES/django.mo | Bin 73920 -> 0 bytes .../locale/es/LC_MESSAGES/django.po | 4713 --------------- .../locale/fi_FI/LC_MESSAGES/django.mo | Bin 77018 -> 0 bytes .../locale/fi_FI/LC_MESSAGES/django.po | 4710 --------------- .../locale/fr/LC_MESSAGES/django.mo | Bin 1735 -> 0 bytes .../locale/fr/LC_MESSAGES/django.po | 4710 --------------- .../locale/hu/LC_MESSAGES/django.mo | Bin 48580 -> 0 bytes .../locale/hu/LC_MESSAGES/django.po | 4711 --------------- .../locale/it/LC_MESSAGES/django.mo | Bin 23004 -> 0 bytes .../locale/it/LC_MESSAGES/django.po | 4885 ---------------- .../locale/ja/LC_MESSAGES/django.mo | Bin 90772 -> 0 bytes .../locale/ja/LC_MESSAGES/django.po | 4713 --------------- .../locale/ka_GE/LC_MESSAGES/django.mo | Bin 19656 -> 0 bytes .../locale/ka_GE/LC_MESSAGES/django.po | 4712 --------------- .../locale/ko_KR/LC_MESSAGES/django.mo | Bin 4702 -> 0 bytes .../locale/ko_KR/LC_MESSAGES/django.po | 4711 --------------- .../locale/nl_NL/LC_MESSAGES/django.mo | Bin 1328 -> 0 bytes .../locale/nl_NL/LC_MESSAGES/django.po | 4710 --------------- .../locale/pl/LC_MESSAGES/django.mo | Bin 757 -> 0 bytes .../locale/pl/LC_MESSAGES/django.po | 5042 ----------------- .../locale/pt/LC_MESSAGES/django.mo | Bin 1384 -> 0 bytes .../locale/pt/LC_MESSAGES/django.po | 4710 --------------- .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 24198 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 4713 --------------- .../locale/ru/LC_MESSAGES/django.mo | Bin 6726 -> 0 bytes .../locale/ru/LC_MESSAGES/django.po | 4712 --------------- .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 1565 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/django.po | 4712 --------------- .../locale/zh_TW/LC_MESSAGES/django.mo | Bin 1556 -> 0 bytes .../locale/zh_TW/LC_MESSAGES/django.po | 4711 --------------- openstack_dashboard/openstack/__init__.py | 0 .../openstack/common/__init__.py | 0 .../openstack/common/config/__init__.py | 0 .../openstack/common/config/generator.py | 253 - .../openstack/common/context.py | 82 - .../openstack/common/eventlet_backdoor.py | 89 - .../openstack/common/excutils.py | 51 - .../openstack/common/gettextutils.py | 226 - .../openstack/common/importutils.py | 67 - .../openstack/common/jsonutils.py | 169 - openstack_dashboard/openstack/common/local.py | 48 - openstack_dashboard/openstack/common/log.py | 558 -- .../openstack/common/loopingcall.py | 147 - .../openstack/common/network_utils.py | 69 - .../openstack/common/notifier/__init__.py | 14 - .../openstack/common/notifier/api.py | 182 - .../openstack/common/notifier/log_notifier.py | 37 - .../common/notifier/no_op_notifier.py | 19 - .../openstack/common/notifier/rpc_notifier.py | 46 - .../common/notifier/rpc_notifier2.py | 52 - .../common/notifier/test_notifier.py | 22 - .../openstack/common/rpc/__init__.py | 307 - .../openstack/common/rpc/amqp.py | 678 --- .../openstack/common/rpc/common.py | 516 -- .../openstack/common/rpc/dispatcher.py | 178 - .../openstack/common/rpc/impl_fake.py | 195 - .../openstack/common/rpc/impl_kombu.py | 839 --- .../openstack/common/rpc/impl_qpid.py | 703 --- .../openstack/common/rpc/impl_zmq.py | 848 --- .../openstack/common/rpc/matchmaker.py | 348 -- .../openstack/common/rpc/matchmaker_redis.py | 149 - .../openstack/common/rpc/matchmaker_ring.py | 114 - .../openstack/common/rpc/proxy.py | 221 - .../openstack/common/rpc/serializer.py | 52 - .../openstack/common/rpc/service.py | 76 - .../openstack/common/rpc/zmq_receiver.py | 41 - .../openstack/common/service.py | 333 -- .../openstack/common/threadgroup.py | 121 - .../openstack/common/timeutils.py | 187 - .../openstack/common/uuidutils.py | 39 - openstack_dashboard/settings.py | 207 - .../img/glyphicons-halflings-white.png | Bin 4352 -> 0 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 4352 -> 0 bytes .../static/bootstrap/less/accordion.less | 28 - .../static/bootstrap/less/alerts.less | 70 - .../static/bootstrap/less/bootstrap.less | 62 - .../static/bootstrap/less/breadcrumbs.less | 22 - .../static/bootstrap/less/button-groups.less | 148 - .../static/bootstrap/less/buttons.less | 183 - .../static/bootstrap/less/carousel.less | 121 - .../static/bootstrap/less/close.less | 18 - .../static/bootstrap/less/code.less | 57 - .../bootstrap/less/component-animations.less | 18 - .../static/bootstrap/less/datepicker.less | 183 - .../static/bootstrap/less/dropdowns.less | 130 - .../static/bootstrap/less/forms.less | 522 -- .../static/bootstrap/less/grid.less | 8 - .../static/bootstrap/less/hero-unit.less | 20 - .../static/bootstrap/less/labels.less | 32 - .../static/bootstrap/less/layouts.less | 17 - .../static/bootstrap/less/mixins.less | 590 -- .../static/bootstrap/less/modals.less | 83 - .../static/bootstrap/less/navbar.less | 299 - .../static/bootstrap/less/navs.less | 353 -- .../static/bootstrap/less/pager.less | 30 - .../static/bootstrap/less/pagination.less | 55 - .../static/bootstrap/less/popovers.less | 49 - .../static/bootstrap/less/progress-bars.less | 95 - .../static/bootstrap/less/reset.less | 126 - .../static/bootstrap/less/responsive.less | 327 -- .../static/bootstrap/less/scaffolding.less | 29 - .../static/bootstrap/less/sprites.less | 158 - .../static/bootstrap/less/tables.less | 150 - .../static/bootstrap/less/thumbnails.less | 35 - .../static/bootstrap/less/tooltip.less | 35 - .../static/bootstrap/less/type.less | 222 - .../static/bootstrap/less/utilities.less | 23 - .../static/bootstrap/less/variables.less | 107 - .../static/bootstrap/less/wells.less | 17 - .../fonts/Anivers_Regular-webfont.eot | Bin 25687 -> 0 bytes .../fonts/Anivers_Regular-webfont.svg | 244 - .../fonts/Anivers_Regular-webfont.ttf | Bin 56996 -> 0 bytes .../fonts/Anivers_Regular-webfont.woff | Bin 29432 -> 0 bytes .../static/dashboard/img/action_required.png | Bin 1017 -> 0 bytes .../dashboard/img/communication_flow.png | Bin 1662 -> 0 bytes .../static/dashboard/img/db-gray.gif | Bin 12495 -> 0 bytes .../static/dashboard/img/db-gray.svg | 85 - .../static/dashboard/img/db-green.svg | 85 - .../static/dashboard/img/db-red.svg | 85 - .../static/dashboard/img/drag.png | Bin 1023 -> 0 bytes .../static/dashboard/img/drop_arrow.png | Bin 2857 -> 0 bytes .../static/dashboard/img/favicon.ico | Bin 1150 -> 0 bytes .../dashboard/img/horizontal_loader.gif | Bin 22580 -> 0 bytes .../static/dashboard/img/lb-gray.gif | Bin 8447 -> 0 bytes .../static/dashboard/img/lb-gray.svg | 43 - .../static/dashboard/img/lb-green.svg | 43 - .../static/dashboard/img/lb-red.svg | 43 - .../static/dashboard/img/loading.gif | Bin 2947 -> 0 bytes .../static/dashboard/img/logo-splash.png | Bin 5093 -> 0 bytes .../static/dashboard/img/logo.png | Bin 5093 -> 0 bytes .../static/dashboard/img/right_droparrow.png | Bin 991 -> 0 bytes .../static/dashboard/img/router.png | Bin 2321 -> 0 bytes .../static/dashboard/img/search.png | Bin 431 -> 0 bytes .../static/dashboard/img/server-gray.gif | Bin 7416 -> 0 bytes .../static/dashboard/img/server-gray.svg | 50 - .../static/dashboard/img/server-green.svg | 50 - .../static/dashboard/img/server-red.svg | 50 - .../static/dashboard/img/server.png | Bin 2050 -> 0 bytes .../static/dashboard/img/stack-gray.gif | Bin 14409 -> 0 bytes .../static/dashboard/img/stack-gray.svg | 73 - .../static/dashboard/img/stack-green.svg | 82 - .../static/dashboard/img/stack-red.svg | 92 - .../static/dashboard/img/unknown-gray.gif | Bin 10805 -> 0 bytes .../static/dashboard/img/unknown-green.svg | 33 - .../static/dashboard/img/unknown-red.svg | 33 - .../static/dashboard/img/up_arrow.png | Bin 974 -> 0 bytes .../static/dashboard/less/horizon.less | 2122 ------- openstack_dashboard/templates/403.html | 29 - openstack_dashboard/templates/404.html | 28 - openstack_dashboard/templates/500.html | 82 - openstack_dashboard/templates/_header.html | 11 - .../templates/_stylesheets.html | 7 - openstack_dashboard/test/__init__.py | 0 .../test/api_tests/__init__.py | 0 openstack_dashboard/test/templates/_tab.html | 1 - .../test/templates/base-sidebar.html | 0 .../test/templates/registration/login.html | 0 .../test/templates/tab_group.html | 1 - .../test/templates/workflow.html | 1 - .../test/test_data/__init__.py | 0 openstack_dashboard/test/tests/__init__.py | 0 openstack_dashboard/urls.py | 52 - openstack_dashboard/usage/__init__.py | 31 - openstack_dashboard/usage/base.py | 317 -- openstack_dashboard/usage/quotas.py | 158 - openstack_dashboard/usage/tables.py | 72 - openstack_dashboard/usage/views.py | 56 - openstack_dashboard/utils/__init__.py | 0 openstack_dashboard/utils/filters.py | 31 - openstack_dashboard/views.py | 38 - openstack_dashboard/wsgi/django.wsgi | 15 - .../dash_template => tuskar_ui}/__init__.py | 0 .../api/tuskar.py => tuskar_ui/api.py | 0 tuskar_ui/forms.py | 6 + .../infrastructure}/__init__.py | 0 .../infrastructure/dashboard.py | 0 .../infrastructure/fixtures/initial_data.json | 0 .../infrastructure/models.py | 0 .../infrastructure/overview}/__init__.py | 0 .../infrastructure/overview/models.py | 0 .../infrastructure/overview/panel.py | 0 .../overview/templates/overview/index.html | 0 .../infrastructure/overview/tests.py | 0 .../infrastructure/overview/urls.py | 0 .../infrastructure/overview/views.py | 0 .../resource_management}/__init__.py | 0 .../resource_management/flavors}/__init__.py | 0 .../resource_management/flavors/forms.py | 0 .../resource_management/flavors/tables.py | 0 .../resource_management/flavors/tabs.py | 0 .../resource_management/flavors/tests.py | 0 .../resource_management/flavors/urls.py | 0 .../resource_management/flavors/views.py | 0 .../resource_management/nodes}/__init__.py | 0 .../resource_management/nodes/tables.py | 0 .../resource_management/nodes/tabs.py | 0 .../resource_management/nodes/tests.py | 0 .../resource_management/nodes/urls.py | 0 .../resource_management/nodes/views.py | 0 .../resource_management/panel.py | 0 .../resource_management/racks}/__init__.py | 0 .../resource_management/racks/forms.py | 0 .../resource_management/racks/tables.py | 0 .../resource_management/racks/tabs.py | 0 .../resource_management/racks/tests.py | 0 .../resource_management/racks/urls.py | 0 .../resource_management/racks/views.py | 0 .../resource_management/racks/workflows.py | 0 .../resource_classes}/__init__.py | 0 .../resource_classes/forms.py | 0 .../resource_classes/tables.py | 9 +- .../resource_classes/tabs.py | 0 .../resource_classes/tests.py | 0 .../resource_classes/urls.py | 0 .../resource_classes/views.py | 0 .../resource_classes/workflows.py | 7 +- .../resource_management/tabs.py | 4 +- .../resource_management/flavors/_create.html | 0 .../flavors/_detail_overview.html | 0 .../resource_management/flavors/_edit.html | 0 .../resource_management/flavors/create.html | 0 .../resource_management/flavors/detail.html | 0 .../resource_management/flavors/edit.html | 0 .../templates/resource_management/index.html | 0 .../nodes/_detail_overview.html | 0 .../resource_management/nodes/detail.html | 0 .../resource_management/nodes/unracked.html | 0 .../resource_management/racks/_create.html | 0 .../racks/_detail_overview.html | 0 .../resource_management/racks/_edit.html | 0 .../racks/_edit_status.html | 0 .../racks/_index_table.html | 0 .../resource_management/racks/_upload.html | 0 .../resource_management/racks/create.html | 0 .../resource_management/racks/detail.html | 0 .../resource_management/racks/edit.html | 0 .../racks/edit_status.html | 0 .../resource_management/racks/upload.html | 0 .../resource_classes/_action.html | 0 .../resource_classes/_detail_flavors.html | 0 .../resource_classes/_detail_overview.html | 0 .../resource_classes/_detail_racks.html | 0 .../resource_classes/_racks_step.html | 0 ..._resource_class_info_and_flavors_step.html | 0 .../resource_classes/action.html | 0 .../resource_classes/detail.html | 0 .../resource_management/tests.py | 0 .../resource_management/urls.py | 0 .../resource_management/views.py | 0 .../service_management}/__init__.py | 0 .../service_management/panel.py | 0 .../templates/service_management/index.html | 0 .../service_management/tests.py | 0 .../infrastructure/service_management/urls.py | 0 .../service_management/views.py | 0 .../infrastructure/js/horizon.capacity.js | 0 .../js/horizon.d3circleschart.js | 0 .../infrastructure/js/horizon.d3linechart.js | 0 .../js/horizon.d3singlebarchart.js | 0 .../infrastructure/less/infrastructure.less | 0 .../templates/infrastructure/_scripts.html | 0 .../templates/infrastructure/base.html | 0 .../templates/infrastructure/base_detail.html | 0 .../infrastructure/templatetags}/__init__.py | 0 .../templatetags/chart_helpers.py | 0 horizon/tables/base.py => tuskar_ui/tables.py | 0 .../tigers => tuskar_ui/test}/__init__.py | 0 .../test/api_tests}/__init__.py | 0 .../test/api_tests/base_tests.py | 0 .../test/api_tests/cinder_tests.py | 0 .../test/api_tests/glance_tests.py | 0 .../test/api_tests/heat_tests.py | 0 .../test/api_tests/keystone_tests.py | 0 .../test/api_tests/lbaas_tests.py | 0 .../test/api_tests/network_tests.py | 0 .../test/api_tests/neutron_tests.py | 0 .../test/api_tests/nova_tests.py | 0 .../test/api_tests/swift_tests.py | 0 .../test/api_tests/tuskar_tests.py | 0 .../test/error_pages_urls.py | 0 .../test/helpers.py | 0 .../test/settings.py | 0 .../test/templates/404.html | 0 .../test/templates/500.html | 0 .../test/templates/_tab.html | 0 .../test/templates/base-sidebar.html | 0 .../test/templates/registration/login.html | 0 .../test/templates/tab_group.html | 0 .../test/templates/workflow.html | 0 .../test/test_data}/__init__.py | 0 .../test/test_data/cinder_data.py | 0 .../test/test_data/exceptions.py | 0 .../test/test_data/glance_data.py | 0 .../test/test_data/heat_data.py | 0 .../test/test_data/keystone_data.py | 0 .../test/test_data/neutron_data.py | 0 .../test/test_data/nova_data.py | 0 .../test/test_data/swift_data.py | 0 .../test/test_data/tuskar_data.py | 0 .../test/test_data/utils.py | 0 {horizon => tuskar_ui}/test/tests/__init__.py | 0 .../test/tests/error_pages.py | 0 .../test/tests/quotas.py | 0 .../test/tests/selenium.py | 0 .../test/tests/utils.py | 0 tuskar_ui/workflows.py | 134 + 1100 files changed, 151 insertions(+), 184585 deletions(-) delete mode 100644 doc/Makefile delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/contributing.rst delete mode 100644 doc/source/faq.rst delete mode 100644 doc/source/glossary.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/intro.rst delete mode 100644 doc/source/quickstart.rst delete mode 100644 doc/source/ref/context_processors.rst delete mode 100644 doc/source/ref/decorators.rst delete mode 100644 doc/source/ref/exceptions.rst delete mode 100644 doc/source/ref/forms.rst delete mode 100644 doc/source/ref/horizon.rst delete mode 100644 doc/source/ref/middleware.rst delete mode 100644 doc/source/ref/run_tests.rst delete mode 100644 doc/source/ref/tables.rst delete mode 100644 doc/source/ref/tabs.rst delete mode 100644 doc/source/ref/test.rst delete mode 100644 doc/source/ref/workflows.rst delete mode 100644 doc/source/releases/2012_1.rst delete mode 100644 doc/source/releases/2012_2.rst delete mode 100644 doc/source/releases/2013_1.rst delete mode 100644 doc/source/testing.rst delete mode 100644 doc/source/topics/customizing.rst delete mode 100644 doc/source/topics/deployment.rst delete mode 100644 doc/source/topics/settings.rst delete mode 100644 doc/source/topics/tables.rst delete mode 100644 doc/source/topics/testing.rst delete mode 100644 doc/source/topics/tutorial.rst delete mode 100644 horizon/__init__.py delete mode 100644 horizon/base.py delete mode 100644 horizon/browsers/__init__.py delete mode 100644 horizon/browsers/base.py delete mode 100644 horizon/browsers/breadcrumb.py delete mode 100644 horizon/browsers/views.py delete mode 100644 horizon/conf/__init__.py delete mode 100644 horizon/conf/dash_template/dashboard.py.tmpl delete mode 100644 horizon/conf/dash_template/models.py delete mode 100644 horizon/conf/dash_template/static/dash_name/css/dash_name.css delete mode 100644 horizon/conf/dash_template/static/dash_name/js/dash_name.js delete mode 100644 horizon/conf/dash_template/templates/dash_name/base.html delete mode 100644 horizon/conf/default.py delete mode 100644 horizon/conf/panel_template/models.py delete mode 100644 horizon/conf/panel_template/panel.py.tmpl delete mode 100644 horizon/conf/panel_template/templates/panel_name/index.html delete mode 100644 horizon/conf/panel_template/tests.py.tmpl delete mode 100644 horizon/conf/panel_template/urls.py delete mode 100644 horizon/conf/panel_template/views.py delete mode 100644 horizon/context_processors.py delete mode 100644 horizon/decorators.py delete mode 100644 horizon/exceptions.py delete mode 100644 horizon/forms/__init__.py delete mode 100644 horizon/forms/base.py delete mode 100644 horizon/forms/fields.py delete mode 100644 horizon/forms/views.py delete mode 100644 horizon/loaders.py delete mode 100644 horizon/locale/bg_BG/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/bg_BG/LC_MESSAGES/django.po delete mode 100644 horizon/locale/bg_BG/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/bg_BG/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/ca/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/ca/LC_MESSAGES/django.po delete mode 100644 horizon/locale/cs/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/cs/LC_MESSAGES/django.po delete mode 100644 horizon/locale/en/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/en/LC_MESSAGES/django.po delete mode 100644 horizon/locale/en/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/en/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/en_GB/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/en_GB/LC_MESSAGES/django.po delete mode 100644 horizon/locale/es/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/es/LC_MESSAGES/django.po delete mode 100644 horizon/locale/es/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/es/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/fi_FI/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/fi_FI/LC_MESSAGES/django.po delete mode 100644 horizon/locale/fr/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/fr/LC_MESSAGES/django.po delete mode 100644 horizon/locale/fr/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/fr/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/hu/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/hu/LC_MESSAGES/django.po delete mode 100644 horizon/locale/it/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/it/LC_MESSAGES/django.po delete mode 100644 horizon/locale/it/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/it/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/ja/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/ja/LC_MESSAGES/django.po delete mode 100644 horizon/locale/ja/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/ja/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/ka_GE/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/ka_GE/LC_MESSAGES/django.po delete mode 100644 horizon/locale/ko_KR/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/ko_KR/LC_MESSAGES/django.po delete mode 100644 horizon/locale/ko_KR/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/ko_KR/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/nl_NL/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/nl_NL/LC_MESSAGES/django.po delete mode 100644 horizon/locale/nl_NL/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/nl_NL/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/pl/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/pl/LC_MESSAGES/django.po delete mode 100644 horizon/locale/pl/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/pl/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/pt/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/pt/LC_MESSAGES/django.po delete mode 100644 horizon/locale/pt/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/pt/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 horizon/locale/pt_BR/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/pt_BR/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/ru/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/ru/LC_MESSAGES/django.po delete mode 100644 horizon/locale/ru/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/ru/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/zh_CN/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/zh_CN/LC_MESSAGES/django.po delete mode 100644 horizon/locale/zh_CN/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/zh_CN/LC_MESSAGES/djangojs.po delete mode 100644 horizon/locale/zh_HK/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/zh_HK/LC_MESSAGES/django.po delete mode 100644 horizon/locale/zh_TW/LC_MESSAGES/django.mo delete mode 100644 horizon/locale/zh_TW/LC_MESSAGES/django.po delete mode 100644 horizon/locale/zh_TW/LC_MESSAGES/djangojs.mo delete mode 100644 horizon/locale/zh_TW/LC_MESSAGES/djangojs.po delete mode 100644 horizon/management/commands/startdash.py delete mode 100644 horizon/management/commands/startpanel.py delete mode 100644 horizon/messages.py delete mode 100644 horizon/middleware.py delete mode 100644 horizon/models.py delete mode 100644 horizon/site_urls.py delete mode 100644 horizon/static/bootstrap/js/bootstrap-datepicker.js delete mode 100644 horizon/static/bootstrap/js/bootstrap.js delete mode 100644 horizon/static/bootstrap/js/bootstrap.min.js delete mode 100644 horizon/static/horizon/js/horizon.communication.js delete mode 100644 horizon/static/horizon/js/horizon.conf.js delete mode 100644 horizon/static/horizon/js/horizon.cookies.js delete mode 100644 horizon/static/horizon/js/horizon.d3piechart.js delete mode 100644 horizon/static/horizon/js/horizon.forms.js delete mode 100644 horizon/static/horizon/js/horizon.heattop.js delete mode 100644 horizon/static/horizon/js/horizon.instances.js delete mode 100644 horizon/static/horizon/js/horizon.js delete mode 100644 horizon/static/horizon/js/horizon.messages.js delete mode 100644 horizon/static/horizon/js/horizon.modals.js delete mode 100644 horizon/static/horizon/js/horizon.networktopology.js delete mode 100644 horizon/static/horizon/js/horizon.projects.js delete mode 100644 horizon/static/horizon/js/horizon.quota.js delete mode 100644 horizon/static/horizon/js/horizon.tables.js delete mode 100644 horizon/static/horizon/js/horizon.tabs.js delete mode 100644 horizon/static/horizon/js/horizon.templates.js delete mode 100644 horizon/static/horizon/js/horizon.users.js delete mode 100644 horizon/static/horizon/js/horizon.utils.js delete mode 100644 horizon/static/horizon/lib/d3.v3.min.js delete mode 100644 horizon/static/horizon/lib/hogan-2.0.0.js delete mode 100755 horizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.min.js delete mode 100644 horizon/static/horizon/lib/jquery/jquery.cookie.js delete mode 100644 horizon/static/horizon/lib/jquery/jquery.min.js delete mode 100644 horizon/static/horizon/lib/jquery/jquery.quicksearch.js delete mode 100644 horizon/static/horizon/lib/jquery/jquery.table-sorter.js delete mode 100644 horizon/static/horizon/lib/json2.js delete mode 100644 horizon/static/horizon/lib/qunit/qunit.css delete mode 100644 horizon/static/horizon/lib/qunit/qunit.js delete mode 100644 horizon/static/horizon/lib/spin.jquery.js delete mode 100644 horizon/static/horizon/lib/spin.js delete mode 100644 horizon/static/horizon/lib/underscore/underscore-min.js delete mode 100644 horizon/static/horizon/tests/messages.js delete mode 100644 horizon/static/horizon/tests/modals.js delete mode 100644 horizon/static/horizon/tests/tables.js delete mode 100644 horizon/static/horizon/tests/templates.js delete mode 100644 horizon/tables/__init__.py delete mode 100644 horizon/tables/actions.py delete mode 100644 horizon/tables/views.py delete mode 100644 horizon/tabs/__init__.py delete mode 100644 horizon/tabs/base.py delete mode 100644 horizon/tabs/views.py delete mode 100644 horizon/templates/_header.html delete mode 100644 horizon/templates/_stylesheets.html delete mode 100644 horizon/templates/auth/_login.html delete mode 100644 horizon/templates/auth/login.html delete mode 100644 horizon/templates/base.html delete mode 100644 horizon/templates/horizon/_conf.html delete mode 100644 horizon/templates/horizon/_messages.html delete mode 100644 horizon/templates/horizon/_nav_list.html delete mode 100644 horizon/templates/horizon/_scripts.html delete mode 100644 horizon/templates/horizon/_subnav_list.html delete mode 100644 horizon/templates/horizon/client_side/_alert_message.html delete mode 100644 horizon/templates/horizon/client_side/_loading.html delete mode 100644 horizon/templates/horizon/client_side/_modal.html delete mode 100644 horizon/templates/horizon/client_side/_modal_chart.html delete mode 100644 horizon/templates/horizon/client_side/_project_user.html delete mode 100644 horizon/templates/horizon/client_side/_script_loader.html delete mode 100644 horizon/templates/horizon/client_side/_table_row.html delete mode 100644 horizon/templates/horizon/client_side/template.html delete mode 100644 horizon/templates/horizon/client_side/templates.html delete mode 100644 horizon/templates/horizon/common/_breadcrumb.html delete mode 100644 horizon/templates/horizon/common/_data_table.html delete mode 100644 horizon/templates/horizon/common/_data_table_row.html delete mode 100644 horizon/templates/horizon/common/_data_table_row_action.html delete mode 100644 horizon/templates/horizon/common/_data_table_row_actions.html delete mode 100644 horizon/templates/horizon/common/_data_table_table_actions.html delete mode 100644 horizon/templates/horizon/common/_detail_table.html delete mode 100644 horizon/templates/horizon/common/_domain_page_header.html delete mode 100644 horizon/templates/horizon/common/_form_fields.html delete mode 100644 horizon/templates/horizon/common/_limit_summary.html delete mode 100644 horizon/templates/horizon/common/_modal.html delete mode 100644 horizon/templates/horizon/common/_modal_form.html delete mode 100644 horizon/templates/horizon/common/_modal_form_add_members.html delete mode 100644 horizon/templates/horizon/common/_page_header.html delete mode 100644 horizon/templates/horizon/common/_region_selector.html delete mode 100644 horizon/templates/horizon/common/_resource_browser.html delete mode 100644 horizon/templates/horizon/common/_sidebar.html delete mode 100644 horizon/templates/horizon/common/_sidebar_module.html delete mode 100644 horizon/templates/horizon/common/_tab_group.html delete mode 100644 horizon/templates/horizon/common/_usage_summary.html delete mode 100644 horizon/templates/horizon/common/_workflow.html delete mode 100644 horizon/templates/horizon/common/_workflow_base.html delete mode 100644 horizon/templates/horizon/common/_workflow_step.html delete mode 100644 horizon/templates/horizon/common/_workflow_step_update_members.html delete mode 100644 horizon/templates/horizon/qunit.html delete mode 100644 horizon/templates/splash.html delete mode 100644 horizon/templatetags/branding.py delete mode 100644 horizon/templatetags/horizon.py delete mode 100644 horizon/templatetags/parse_date.py delete mode 100644 horizon/templatetags/sizeformat.py delete mode 100644 horizon/templatetags/truncate_filter.py delete mode 100644 horizon/test/customization/cust_test1.py delete mode 100644 horizon/test/customization/cust_test2.py delete mode 100644 horizon/test/helpers.py delete mode 100644 horizon/test/settings.py delete mode 100644 horizon/test/templates/404.html delete mode 100644 horizon/test/test_dashboards/cats/dashboard.py delete mode 100644 horizon/test/test_dashboards/cats/kittens/models.py delete mode 100644 horizon/test/test_dashboards/cats/kittens/panel.py delete mode 100644 horizon/test/test_dashboards/cats/kittens/templates/kittens/index.html delete mode 100644 horizon/test/test_dashboards/cats/kittens/urls.py delete mode 100644 horizon/test/test_dashboards/cats/kittens/views.py delete mode 100644 horizon/test/test_dashboards/cats/models.py delete mode 100644 horizon/test/test_dashboards/cats/static/cats/css/cats.css delete mode 100644 horizon/test/test_dashboards/cats/static/cats/js/cats.js delete mode 100644 horizon/test/test_dashboards/cats/templates/cats/base.html delete mode 100644 horizon/test/test_dashboards/cats/tigers/models.py delete mode 100644 horizon/test/test_dashboards/cats/tigers/panel.py delete mode 100644 horizon/test/test_dashboards/cats/tigers/templates/tigers/index.html delete mode 100644 horizon/test/test_dashboards/cats/tigers/urls.py delete mode 100644 horizon/test/test_dashboards/cats/tigers/views.py delete mode 100644 horizon/test/test_dashboards/dogs/dashboard.py delete mode 100644 horizon/test/test_dashboards/dogs/models.py delete mode 100644 horizon/test/test_dashboards/dogs/puppies/models.py delete mode 100644 horizon/test/test_dashboards/dogs/puppies/panel.py delete mode 100644 horizon/test/test_dashboards/dogs/puppies/templates/puppies/index.html delete mode 100644 horizon/test/test_dashboards/dogs/puppies/urls.py delete mode 100644 horizon/test/test_dashboards/dogs/puppies/views.py delete mode 100644 horizon/test/test_dashboards/dogs/static/dogs/css/dogs.css delete mode 100644 horizon/test/test_dashboards/dogs/static/dogs/js/dogs.js delete mode 100644 horizon/test/test_dashboards/dogs/templates/dogs/base.html delete mode 100644 horizon/test/tests/base.py delete mode 100644 horizon/test/tests/messages.py delete mode 100644 horizon/test/tests/middleware.py delete mode 100644 horizon/test/tests/selenium.py delete mode 100644 horizon/test/tests/tables.py delete mode 100644 horizon/test/tests/tabs.py delete mode 100644 horizon/test/tests/templatetags.py delete mode 100644 horizon/test/tests/utils.py delete mode 100644 horizon/test/tests/workflows.py delete mode 100644 horizon/test/urls.py delete mode 100644 horizon/utils/__init__.py delete mode 100644 horizon/utils/fields.py delete mode 100644 horizon/utils/filters.py delete mode 100644 horizon/utils/functions.py delete mode 100644 horizon/utils/html.py delete mode 100644 horizon/utils/memoized.py delete mode 100644 horizon/utils/secret_key.py delete mode 100644 horizon/utils/validators.py delete mode 100644 horizon/version.py delete mode 100644 horizon/views.py delete mode 100644 horizon/workflows/__init__.py delete mode 100644 horizon/workflows/base.py delete mode 100644 horizon/workflows/views.py delete mode 100644 openstack-common.conf delete mode 100644 openstack_dashboard/__init__.py delete mode 100644 openstack_dashboard/api/__init__.py delete mode 100644 openstack_dashboard/api/base.py delete mode 100644 openstack_dashboard/api/cinder.py delete mode 100644 openstack_dashboard/api/glance.py delete mode 100644 openstack_dashboard/api/heat.py delete mode 100644 openstack_dashboard/api/keystone.py delete mode 100644 openstack_dashboard/api/lbaas.py delete mode 100644 openstack_dashboard/api/network.py delete mode 100644 openstack_dashboard/api/network_base.py delete mode 100644 openstack_dashboard/api/neutron.py delete mode 100644 openstack_dashboard/api/nova.py delete mode 100644 openstack_dashboard/api/swift.py delete mode 100644 openstack_dashboard/context_processors.py delete mode 100644 openstack_dashboard/dashboards/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_aggregate_hosts.html delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_aggregate_metadata.html delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/index.html delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/aggregates/views.py delete mode 100644 openstack_dashboard/dashboards/admin/dashboard.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/constants.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/templates/domains/index.html delete mode 100644 openstack_dashboard/dashboards/admin/domains/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/views.py delete mode 100644 openstack_dashboard/dashboards/admin/domains/workflows.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/extras/views.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/_edit.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/create.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/edit.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/create.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/edit.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/index.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/templates/flavors/index.html delete mode 100644 openstack_dashboard/dashboards/admin/flavors/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/flavors/views.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/constants.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/add_non_member.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/create.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/index.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/manage.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/templates/groups/update.html delete mode 100644 openstack_dashboard/dashboards/admin/groups/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/groups/views.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/index.html delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/hypervisors/views.py delete mode 100644 openstack_dashboard/dashboards/admin/images/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/images/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/images/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/images/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/images/templates/images/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/images/templates/images/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/images/templates/images/create.html delete mode 100644 openstack_dashboard/dashboards/admin/images/templates/images/index.html delete mode 100644 openstack_dashboard/dashboards/admin/images/templates/images/update.html delete mode 100644 openstack_dashboard/dashboards/admin/images/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/images/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/images/views.py delete mode 100644 openstack_dashboard/dashboards/admin/info/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/info/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/info/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/info/tabs.py delete mode 100644 openstack_dashboard/dashboards/admin/info/templates/info/index.html delete mode 100644 openstack_dashboard/dashboards/admin/info/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/info/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/info/views.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/templates/instances/index.html delete mode 100644 openstack_dashboard/dashboards/admin/instances/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/instances/views.py delete mode 100644 openstack_dashboard/dashboards/admin/models.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/tabs.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/ports/views.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/subnets/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/subnets/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/subnets/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/subnets/views.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/subnets/workflows.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/create.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/index.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/ports/create.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/ports/update.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/subnets/index.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/templates/networks/update.html delete mode 100644 openstack_dashboard/dashboards/admin/networks/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/networks/views.py delete mode 100644 openstack_dashboard/dashboards/admin/overview/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/overview/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/overview/templates/overview/usage.csv delete mode 100644 openstack_dashboard/dashboards/admin/overview/templates/overview/usage.html delete mode 100644 openstack_dashboard/dashboards/admin/overview/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/overview/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/overview/views.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_add_user.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_create_user.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_quotas.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/_update_members.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/add_user.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/create_user.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/index.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/quotas.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/usage.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/templates/projects/users.html delete mode 100644 openstack_dashboard/dashboards/admin/projects/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/views.py delete mode 100644 openstack_dashboard/dashboards/admin/projects/workflows.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/roles/templates/roles/create.html delete mode 100644 openstack_dashboard/dashboards/admin/roles/templates/roles/index.html delete mode 100644 openstack_dashboard/dashboards/admin/roles/templates/roles/update.html delete mode 100644 openstack_dashboard/dashboards/admin/roles/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/roles/views.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/ports/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/ports/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/ports/tabs.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/ports/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/ports/views.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/tabs.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/templates/routers/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html delete mode 100644 openstack_dashboard/dashboards/admin/routers/templates/routers/index.html delete mode 100644 openstack_dashboard/dashboards/admin/routers/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/routers/views.py delete mode 100644 openstack_dashboard/dashboards/admin/users/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/users/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/users/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/users/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/users/templates/users/_create.html delete mode 100644 openstack_dashboard/dashboards/admin/users/templates/users/_update.html delete mode 100644 openstack_dashboard/dashboards/admin/users/templates/users/create.html delete mode 100644 openstack_dashboard/dashboards/admin/users/templates/users/index.html delete mode 100644 openstack_dashboard/dashboards/admin/users/templates/users/update.html delete mode 100644 openstack_dashboard/dashboards/admin/users/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/users/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/users/views.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/__init__.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/forms.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/panel.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/tables.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html delete mode 100644 openstack_dashboard/dashboards/admin/volumes/templates/volumes/create_volume_type.html delete mode 100644 openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html delete mode 100644 openstack_dashboard/dashboards/admin/volumes/templates/volumes/index.html delete mode 100644 openstack_dashboard/dashboards/admin/volumes/tests.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/urls.py delete mode 100644 openstack_dashboard/dashboards/admin/volumes/views.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/overview/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/resource_management/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/resource_management/flavors/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/resource_management/nodes/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/resource_management/racks/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/service_management/__init__.py delete mode 100644 openstack_dashboard/dashboards/infrastructure/templatetags/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/api_access/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/api_access/tests.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/api_access/urls.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/api_access/views.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/forms.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/urls.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/views.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/floating_ips/workflows.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/forms.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/tests.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/urls.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/keypairs/views.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/panel.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/forms.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/tests.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/urls.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/security_groups/views.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/api_access/ec2rc.sh.template delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/api_access/openrc.sh.template delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/allocate.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/create.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/download.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/import.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/add_rule.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/create.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/tests.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/urls.py delete mode 100644 openstack_dashboard/dashboards/project/access_and_security/views.py delete mode 100644 openstack_dashboard/dashboards/project/containers/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/containers/browsers.py delete mode 100644 openstack_dashboard/dashboards/project/containers/forms.py delete mode 100644 openstack_dashboard/dashboards/project/containers/panel.py delete mode 100644 openstack_dashboard/dashboards/project/containers/tables.py delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/_create.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/copy.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/create.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/index.html delete mode 100644 openstack_dashboard/dashboards/project/containers/templates/containers/upload.html delete mode 100644 openstack_dashboard/dashboards/project/containers/tests.py delete mode 100644 openstack_dashboard/dashboards/project/containers/urls.py delete mode 100644 openstack_dashboard/dashboards/project/containers/views.py delete mode 100644 openstack_dashboard/dashboards/project/dashboard.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/forms.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/tables.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/tests.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/urls.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/images/views.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/panel.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/forms.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/tests.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/urls.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/views.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_create.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_update.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/create.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/detail.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/update.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/index.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/_create.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/create.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/detail.html delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/tests.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/urls.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/utils.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/views.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tables.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tests.py delete mode 100644 openstack_dashboard/dashboards/project/instances/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/instances/panel.py delete mode 100644 openstack_dashboard/dashboards/project/instances/tables.py delete mode 100644 openstack_dashboard/dashboards/project/instances/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_flavors_and_quotas.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_instance_ips.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_launch_customize_help.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_launch_details_help.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_launch_network_help.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_launch_volumes_help.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/_update_networks.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/detail.html delete mode 100644 openstack_dashboard/dashboards/project/instances/templates/instances/index.html delete mode 100644 openstack_dashboard/dashboards/project/instances/tests.py delete mode 100644 openstack_dashboard/dashboards/project/instances/urls.py delete mode 100644 openstack_dashboard/dashboards/project/instances/views.py delete mode 100644 openstack_dashboard/dashboards/project/instances/workflows/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/instances/workflows/create_instance.py delete mode 100644 openstack_dashboard/dashboards/project/instances/workflows/resize_instance.py delete mode 100644 openstack_dashboard/dashboards/project/instances/workflows/update_instance.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/forms.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/models.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/panel.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/tables.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_members_tab.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitors_tab.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pools_tab.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/updatemember.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/updatemonitor.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/updatepool.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/updatevip.html delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/tests.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/urls.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/views.py delete mode 100644 openstack_dashboard/dashboards/project/loadbalancers/workflows.py delete mode 100644 openstack_dashboard/dashboards/project/models.py delete mode 100644 openstack_dashboard/dashboards/project/network_topology/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/network_topology/panel.py delete mode 100644 openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html delete mode 100644 openstack_dashboard/dashboards/project/network_topology/urls.py delete mode 100644 openstack_dashboard/dashboards/project/network_topology/views.py delete mode 100644 openstack_dashboard/dashboards/project/networks/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/networks/forms.py delete mode 100644 openstack_dashboard/dashboards/project/networks/panel.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/forms.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/tables.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/urls.py delete mode 100644 openstack_dashboard/dashboards/project/networks/ports/views.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/tables.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/urls.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/views.py delete mode 100644 openstack_dashboard/dashboards/project/networks/subnets/workflows.py delete mode 100644 openstack_dashboard/dashboards/project/networks/tables.py delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/_create.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/_network_ips.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/_update.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/detail.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/index.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/ports/_port_ips.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/ports/update.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/subnets/index.html delete mode 100644 openstack_dashboard/dashboards/project/networks/templates/networks/update.html delete mode 100644 openstack_dashboard/dashboards/project/networks/tests.py delete mode 100644 openstack_dashboard/dashboards/project/networks/urls.py delete mode 100644 openstack_dashboard/dashboards/project/networks/views.py delete mode 100644 openstack_dashboard/dashboards/project/networks/workflows.py delete mode 100644 openstack_dashboard/dashboards/project/overview/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/overview/panel.py delete mode 100644 openstack_dashboard/dashboards/project/overview/templates/overview/usage.csv delete mode 100644 openstack_dashboard/dashboards/project/overview/templates/overview/usage.html delete mode 100644 openstack_dashboard/dashboards/project/overview/tests.py delete mode 100644 openstack_dashboard/dashboards/project/overview/urls.py delete mode 100644 openstack_dashboard/dashboards/project/overview/views.py delete mode 100644 openstack_dashboard/dashboards/project/routers/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/routers/forms.py delete mode 100644 openstack_dashboard/dashboards/project/routers/panel.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/forms.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/tables.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/urls.py delete mode 100644 openstack_dashboard/dashboards/project/routers/ports/views.py delete mode 100644 openstack_dashboard/dashboards/project/routers/tables.py delete mode 100644 openstack_dashboard/dashboards/project/routers/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/_create.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/create.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/detail.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/index.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/ports/create.html delete mode 100644 openstack_dashboard/dashboards/project/routers/templates/routers/ports/setgateway.html delete mode 100644 openstack_dashboard/dashboards/project/routers/tests.py delete mode 100644 openstack_dashboard/dashboards/project/routers/urls.py delete mode 100644 openstack_dashboard/dashboards/project/routers/views.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/api.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/forms.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/mappings.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/panel.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/sro.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/tables.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_events.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_resources.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_topology.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_info.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/_stack_info.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/create.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/index.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/templates/stacks/select_template.html delete mode 100644 openstack_dashboard/dashboards/project/stacks/tests.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/urls.py delete mode 100644 openstack_dashboard/dashboards/project/stacks/views.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/__init__.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/forms.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/panel.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/tables.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/tabs.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/_attach.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/_create.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/_create_snapshot.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/_detail_overview.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/_limits.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/attach.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/create.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/create_snapshot.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/detail.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html delete mode 100644 openstack_dashboard/dashboards/project/volumes/tests.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/urls.py delete mode 100644 openstack_dashboard/dashboards/project/volumes/views.py delete mode 100644 openstack_dashboard/dashboards/settings/__init__.py delete mode 100644 openstack_dashboard/dashboards/settings/dashboard.py delete mode 100644 openstack_dashboard/dashboards/settings/models.py delete mode 100644 openstack_dashboard/dashboards/settings/password/__init__.py delete mode 100644 openstack_dashboard/dashboards/settings/password/forms.py delete mode 100644 openstack_dashboard/dashboards/settings/password/panel.py delete mode 100644 openstack_dashboard/dashboards/settings/password/templates/password/_change.html delete mode 100644 openstack_dashboard/dashboards/settings/password/templates/password/change.html delete mode 100644 openstack_dashboard/dashboards/settings/password/tests.py delete mode 100644 openstack_dashboard/dashboards/settings/password/urls.py delete mode 100644 openstack_dashboard/dashboards/settings/password/views.py delete mode 100644 openstack_dashboard/dashboards/settings/user/__init__.py delete mode 100644 openstack_dashboard/dashboards/settings/user/forms.py delete mode 100644 openstack_dashboard/dashboards/settings/user/panel.py delete mode 100644 openstack_dashboard/dashboards/settings/user/templates/user/_settings.html delete mode 100644 openstack_dashboard/dashboards/settings/user/templates/user/settings.html delete mode 100644 openstack_dashboard/dashboards/settings/user/tests.py delete mode 100644 openstack_dashboard/dashboards/settings/user/urls.py delete mode 100644 openstack_dashboard/dashboards/settings/user/views.py delete mode 100644 openstack_dashboard/exceptions.py delete mode 100644 openstack_dashboard/local/__init__.py delete mode 100644 openstack_dashboard/local/local_settings.py.example delete mode 100644 openstack_dashboard/locale/bg_BG/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/bg_BG/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/ca/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/ca/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/cs/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/cs/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/en/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/en/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/en_GB/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/es/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/es/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/fi_FI/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/fi_FI/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/fr/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/fr/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/hu/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/hu/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/it/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/it/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/ja/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/ja/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/ka_GE/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/ka_GE/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/pl/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/pl/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/pt/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/pt/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/ru/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/ru/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.mo delete mode 100644 openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.po delete mode 100644 openstack_dashboard/openstack/__init__.py delete mode 100644 openstack_dashboard/openstack/common/__init__.py delete mode 100644 openstack_dashboard/openstack/common/config/__init__.py delete mode 100755 openstack_dashboard/openstack/common/config/generator.py delete mode 100644 openstack_dashboard/openstack/common/context.py delete mode 100644 openstack_dashboard/openstack/common/eventlet_backdoor.py delete mode 100644 openstack_dashboard/openstack/common/excutils.py delete mode 100644 openstack_dashboard/openstack/common/gettextutils.py delete mode 100644 openstack_dashboard/openstack/common/importutils.py delete mode 100644 openstack_dashboard/openstack/common/jsonutils.py delete mode 100644 openstack_dashboard/openstack/common/local.py delete mode 100644 openstack_dashboard/openstack/common/log.py delete mode 100644 openstack_dashboard/openstack/common/loopingcall.py delete mode 100644 openstack_dashboard/openstack/common/network_utils.py delete mode 100644 openstack_dashboard/openstack/common/notifier/__init__.py delete mode 100644 openstack_dashboard/openstack/common/notifier/api.py delete mode 100644 openstack_dashboard/openstack/common/notifier/log_notifier.py delete mode 100644 openstack_dashboard/openstack/common/notifier/no_op_notifier.py delete mode 100644 openstack_dashboard/openstack/common/notifier/rpc_notifier.py delete mode 100644 openstack_dashboard/openstack/common/notifier/rpc_notifier2.py delete mode 100644 openstack_dashboard/openstack/common/notifier/test_notifier.py delete mode 100644 openstack_dashboard/openstack/common/rpc/__init__.py delete mode 100644 openstack_dashboard/openstack/common/rpc/amqp.py delete mode 100644 openstack_dashboard/openstack/common/rpc/common.py delete mode 100644 openstack_dashboard/openstack/common/rpc/dispatcher.py delete mode 100644 openstack_dashboard/openstack/common/rpc/impl_fake.py delete mode 100644 openstack_dashboard/openstack/common/rpc/impl_kombu.py delete mode 100644 openstack_dashboard/openstack/common/rpc/impl_qpid.py delete mode 100644 openstack_dashboard/openstack/common/rpc/impl_zmq.py delete mode 100644 openstack_dashboard/openstack/common/rpc/matchmaker.py delete mode 100644 openstack_dashboard/openstack/common/rpc/matchmaker_redis.py delete mode 100644 openstack_dashboard/openstack/common/rpc/matchmaker_ring.py delete mode 100644 openstack_dashboard/openstack/common/rpc/proxy.py delete mode 100644 openstack_dashboard/openstack/common/rpc/serializer.py delete mode 100644 openstack_dashboard/openstack/common/rpc/service.py delete mode 100755 openstack_dashboard/openstack/common/rpc/zmq_receiver.py delete mode 100644 openstack_dashboard/openstack/common/service.py delete mode 100644 openstack_dashboard/openstack/common/threadgroup.py delete mode 100644 openstack_dashboard/openstack/common/timeutils.py delete mode 100644 openstack_dashboard/openstack/common/uuidutils.py delete mode 100644 openstack_dashboard/settings.py delete mode 100644 openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.png delete mode 100644 openstack_dashboard/static/bootstrap/img/glyphicons-halflings.png delete mode 100644 openstack_dashboard/static/bootstrap/less/accordion.less delete mode 100644 openstack_dashboard/static/bootstrap/less/alerts.less delete mode 100644 openstack_dashboard/static/bootstrap/less/bootstrap.less delete mode 100644 openstack_dashboard/static/bootstrap/less/breadcrumbs.less delete mode 100644 openstack_dashboard/static/bootstrap/less/button-groups.less delete mode 100644 openstack_dashboard/static/bootstrap/less/buttons.less delete mode 100644 openstack_dashboard/static/bootstrap/less/carousel.less delete mode 100644 openstack_dashboard/static/bootstrap/less/close.less delete mode 100644 openstack_dashboard/static/bootstrap/less/code.less delete mode 100644 openstack_dashboard/static/bootstrap/less/component-animations.less delete mode 100644 openstack_dashboard/static/bootstrap/less/datepicker.less delete mode 100644 openstack_dashboard/static/bootstrap/less/dropdowns.less delete mode 100644 openstack_dashboard/static/bootstrap/less/forms.less delete mode 100644 openstack_dashboard/static/bootstrap/less/grid.less delete mode 100644 openstack_dashboard/static/bootstrap/less/hero-unit.less delete mode 100644 openstack_dashboard/static/bootstrap/less/labels.less delete mode 100644 openstack_dashboard/static/bootstrap/less/layouts.less delete mode 100644 openstack_dashboard/static/bootstrap/less/mixins.less delete mode 100644 openstack_dashboard/static/bootstrap/less/modals.less delete mode 100644 openstack_dashboard/static/bootstrap/less/navbar.less delete mode 100644 openstack_dashboard/static/bootstrap/less/navs.less delete mode 100644 openstack_dashboard/static/bootstrap/less/pager.less delete mode 100644 openstack_dashboard/static/bootstrap/less/pagination.less delete mode 100644 openstack_dashboard/static/bootstrap/less/popovers.less delete mode 100644 openstack_dashboard/static/bootstrap/less/progress-bars.less delete mode 100644 openstack_dashboard/static/bootstrap/less/reset.less delete mode 100644 openstack_dashboard/static/bootstrap/less/responsive.less delete mode 100644 openstack_dashboard/static/bootstrap/less/scaffolding.less delete mode 100644 openstack_dashboard/static/bootstrap/less/sprites.less delete mode 100644 openstack_dashboard/static/bootstrap/less/tables.less delete mode 100644 openstack_dashboard/static/bootstrap/less/thumbnails.less delete mode 100644 openstack_dashboard/static/bootstrap/less/tooltip.less delete mode 100644 openstack_dashboard/static/bootstrap/less/type.less delete mode 100644 openstack_dashboard/static/bootstrap/less/utilities.less delete mode 100644 openstack_dashboard/static/bootstrap/less/variables.less delete mode 100644 openstack_dashboard/static/bootstrap/less/wells.less delete mode 100644 openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.eot delete mode 100644 openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.svg delete mode 100644 openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.ttf delete mode 100644 openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.woff delete mode 100644 openstack_dashboard/static/dashboard/img/action_required.png delete mode 100644 openstack_dashboard/static/dashboard/img/communication_flow.png delete mode 100644 openstack_dashboard/static/dashboard/img/db-gray.gif delete mode 100644 openstack_dashboard/static/dashboard/img/db-gray.svg delete mode 100644 openstack_dashboard/static/dashboard/img/db-green.svg delete mode 100644 openstack_dashboard/static/dashboard/img/db-red.svg delete mode 100644 openstack_dashboard/static/dashboard/img/drag.png delete mode 100644 openstack_dashboard/static/dashboard/img/drop_arrow.png delete mode 100644 openstack_dashboard/static/dashboard/img/favicon.ico delete mode 100644 openstack_dashboard/static/dashboard/img/horizontal_loader.gif delete mode 100644 openstack_dashboard/static/dashboard/img/lb-gray.gif delete mode 100644 openstack_dashboard/static/dashboard/img/lb-gray.svg delete mode 100644 openstack_dashboard/static/dashboard/img/lb-green.svg delete mode 100644 openstack_dashboard/static/dashboard/img/lb-red.svg delete mode 100644 openstack_dashboard/static/dashboard/img/loading.gif delete mode 100644 openstack_dashboard/static/dashboard/img/logo-splash.png delete mode 100644 openstack_dashboard/static/dashboard/img/logo.png delete mode 100644 openstack_dashboard/static/dashboard/img/right_droparrow.png delete mode 100644 openstack_dashboard/static/dashboard/img/router.png delete mode 100644 openstack_dashboard/static/dashboard/img/search.png delete mode 100644 openstack_dashboard/static/dashboard/img/server-gray.gif delete mode 100644 openstack_dashboard/static/dashboard/img/server-gray.svg delete mode 100644 openstack_dashboard/static/dashboard/img/server-green.svg delete mode 100644 openstack_dashboard/static/dashboard/img/server-red.svg delete mode 100644 openstack_dashboard/static/dashboard/img/server.png delete mode 100644 openstack_dashboard/static/dashboard/img/stack-gray.gif delete mode 100644 openstack_dashboard/static/dashboard/img/stack-gray.svg delete mode 100644 openstack_dashboard/static/dashboard/img/stack-green.svg delete mode 100644 openstack_dashboard/static/dashboard/img/stack-red.svg delete mode 100644 openstack_dashboard/static/dashboard/img/unknown-gray.gif delete mode 100644 openstack_dashboard/static/dashboard/img/unknown-green.svg delete mode 100644 openstack_dashboard/static/dashboard/img/unknown-red.svg delete mode 100644 openstack_dashboard/static/dashboard/img/up_arrow.png delete mode 100644 openstack_dashboard/static/dashboard/less/horizon.less delete mode 100644 openstack_dashboard/templates/403.html delete mode 100644 openstack_dashboard/templates/404.html delete mode 100644 openstack_dashboard/templates/500.html delete mode 100644 openstack_dashboard/templates/_header.html delete mode 100644 openstack_dashboard/templates/_stylesheets.html delete mode 100644 openstack_dashboard/test/__init__.py delete mode 100644 openstack_dashboard/test/api_tests/__init__.py delete mode 100644 openstack_dashboard/test/templates/_tab.html delete mode 100644 openstack_dashboard/test/templates/base-sidebar.html delete mode 100644 openstack_dashboard/test/templates/registration/login.html delete mode 100644 openstack_dashboard/test/templates/tab_group.html delete mode 100644 openstack_dashboard/test/templates/workflow.html delete mode 100644 openstack_dashboard/test/test_data/__init__.py delete mode 100644 openstack_dashboard/test/tests/__init__.py delete mode 100644 openstack_dashboard/urls.py delete mode 100644 openstack_dashboard/usage/__init__.py delete mode 100644 openstack_dashboard/usage/base.py delete mode 100644 openstack_dashboard/usage/quotas.py delete mode 100644 openstack_dashboard/usage/tables.py delete mode 100644 openstack_dashboard/usage/views.py delete mode 100644 openstack_dashboard/utils/__init__.py delete mode 100644 openstack_dashboard/utils/filters.py delete mode 100644 openstack_dashboard/views.py delete mode 100644 openstack_dashboard/wsgi/django.wsgi rename {horizon/conf/dash_template => tuskar_ui}/__init__.py (100%) rename openstack_dashboard/api/tuskar.py => tuskar_ui/api.py (100%) create mode 100644 tuskar_ui/forms.py rename {horizon/conf/panel_template => tuskar_ui/infrastructure}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/dashboard.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/fixtures/initial_data.json (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/models.py (100%) rename {horizon/management => tuskar_ui/infrastructure/overview}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/models.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/panel.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/templates/overview/index.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/overview/views.py (100%) rename {horizon/management/commands => tuskar_ui/infrastructure/resource_management}/__init__.py (100%) rename {horizon/templatetags => tuskar_ui/infrastructure/resource_management/flavors}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/forms.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/tables.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/tabs.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/flavors/views.py (100%) rename {horizon/test => tuskar_ui/infrastructure/resource_management/nodes}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/nodes/tables.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/nodes/tabs.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/nodes/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/nodes/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/nodes/views.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/panel.py (100%) rename {horizon/test/customization => tuskar_ui/infrastructure/resource_management/racks}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/forms.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/tables.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/tabs.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/views.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/racks/workflows.py (100%) rename {horizon/test/test_dashboards => tuskar_ui/infrastructure/resource_management/resource_classes}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/forms.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/tables.py (96%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/tabs.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/views.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/resource_classes/workflows.py (98%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/tabs.py (96%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/_create.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/_detail_overview.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/_edit.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/create.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/detail.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/flavors/edit.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/index.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/nodes/_detail_overview.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/nodes/detail.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/nodes/unracked.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_create.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_detail_overview.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_edit.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_edit_status.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_index_table.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/_upload.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/create.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/detail.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/edit.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/edit_status.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/racks/upload.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_action.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_flavors.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_racks.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_racks_step.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/_resource_class_info_and_flavors_step.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/action.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/templates/resource_management/resource_classes/detail.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/resource_management/views.py (100%) rename {horizon/test/test_dashboards/cats => tuskar_ui/infrastructure/service_management}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/service_management/panel.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/service_management/templates/service_management/index.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/service_management/tests.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/service_management/urls.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/service_management/views.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/static/infrastructure/js/horizon.capacity.js (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/static/infrastructure/js/horizon.d3circleschart.js (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/static/infrastructure/js/horizon.d3linechart.js (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/static/infrastructure/js/horizon.d3singlebarchart.js (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/static/infrastructure/less/infrastructure.less (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/templates/infrastructure/_scripts.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/templates/infrastructure/base.html (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/templates/infrastructure/base_detail.html (100%) rename {horizon/test/test_dashboards/cats/kittens => tuskar_ui/infrastructure/templatetags}/__init__.py (100%) rename {openstack_dashboard/dashboards => tuskar_ui}/infrastructure/templatetags/chart_helpers.py (100%) rename horizon/tables/base.py => tuskar_ui/tables.py (100%) rename {horizon/test/test_dashboards/cats/tigers => tuskar_ui/test}/__init__.py (100%) rename {horizon/test/test_dashboards/dogs => tuskar_ui/test/api_tests}/__init__.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/base_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/cinder_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/glance_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/heat_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/keystone_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/lbaas_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/network_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/neutron_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/nova_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/swift_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/api_tests/tuskar_tests.py (100%) rename {openstack_dashboard => tuskar_ui}/test/error_pages_urls.py (100%) rename {openstack_dashboard => tuskar_ui}/test/helpers.py (100%) rename {openstack_dashboard => tuskar_ui}/test/settings.py (100%) rename {openstack_dashboard => tuskar_ui}/test/templates/404.html (100%) rename {openstack_dashboard => tuskar_ui}/test/templates/500.html (100%) rename {horizon => tuskar_ui}/test/templates/_tab.html (100%) rename {horizon => tuskar_ui}/test/templates/base-sidebar.html (100%) rename {horizon => tuskar_ui}/test/templates/registration/login.html (100%) rename {horizon => tuskar_ui}/test/templates/tab_group.html (100%) rename {horizon => tuskar_ui}/test/templates/workflow.html (100%) rename {horizon/test/test_dashboards/dogs/puppies => tuskar_ui/test/test_data}/__init__.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/cinder_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/exceptions.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/glance_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/heat_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/keystone_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/neutron_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/nova_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/swift_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/tuskar_data.py (100%) rename {openstack_dashboard => tuskar_ui}/test/test_data/utils.py (100%) rename {horizon => tuskar_ui}/test/tests/__init__.py (100%) rename {openstack_dashboard => tuskar_ui}/test/tests/error_pages.py (100%) rename {openstack_dashboard => tuskar_ui}/test/tests/quotas.py (100%) rename {openstack_dashboard => tuskar_ui}/test/tests/selenium.py (100%) rename {openstack_dashboard => tuskar_ui}/test/tests/utils.py (100%) create mode 100644 tuskar_ui/workflows.py diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index 986ad3dfe..000000000 --- a/doc/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Horizon.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Horizon.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Horizon" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Horizon" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index b70897200..000000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,426 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Horizon documentation build configuration file, created by -# sphinx-quickstart on Thu Oct 27 11:38:59 2011. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) - -sys.path.insert(0, ROOT) - -# This is required for ReadTheDocs.org, but isn't a bad idea anyway. -os.environ['DJANGO_SETTINGS_MODULE'] = 'openstack_dashboard.settings' - -import horizon.version - - -def write_autodoc_index(): - - def find_autodoc_modules(module_name, sourcedir): - """returns a list of modules in the SOURCE directory""" - modlist = [] - os.chdir(os.path.join(sourcedir, module_name)) - print "SEARCHING %s" % sourcedir - for root, dirs, files in os.walk("."): - for filename in files: - if filename.endswith(".py"): - # remove the pieces of the root - elements = root.split(os.path.sep) - # replace the leading "." with the module name - elements[0] = module_name - # and get the base module name - base, extension = os.path.splitext(filename) - if not (base == "__init__"): - elements.append(base) - result = ".".join(elements) - #print result - modlist.append(result) - return modlist - - RSTDIR = os.path.abspath(os.path.join(BASE_DIR, "sourcecode")) - SRCS = {'horizon': ROOT, - 'openstack_dashboard': ROOT} - - EXCLUDED_MODULES = ('horizon.tests', 'openstack_dashboard.tests',) - CURRENT_SOURCES = {} - - if not(os.path.exists(RSTDIR)): - os.mkdir(RSTDIR) - CURRENT_SOURCES[RSTDIR] = ['autoindex.rst'] - - INDEXOUT = open(os.path.join(RSTDIR, "autoindex.rst"), "w") - INDEXOUT.write("=================\n") - INDEXOUT.write("Source Code Index\n") - INDEXOUT.write("=================\n") - - for modulename, path in SRCS.items(): - sys.stdout.write("Generating source documentation for %s\n" % - modulename) - INDEXOUT.write("\n%s\n" % modulename.capitalize()) - INDEXOUT.write("%s\n" % ("=" * len(modulename),)) - INDEXOUT.write(".. toctree::\n") - INDEXOUT.write(" :maxdepth: 1\n") - INDEXOUT.write("\n") - - MOD_DIR = os.path.join(RSTDIR, modulename) - CURRENT_SOURCES[MOD_DIR] = [] - if not(os.path.exists(MOD_DIR)): - os.mkdir(MOD_DIR) - for module in find_autodoc_modules(modulename, path): - if any([module.startswith(exclude) for exclude - in EXCLUDED_MODULES]): - print "Excluded module %s." % module - continue - mod_path = os.path.join(path, *module.split(".")) - generated_file = os.path.join(MOD_DIR, "%s.rst" % module) - - INDEXOUT.write(" %s/%s\n" % (modulename, module)) - - # Find the __init__.py module if this is a directory - if os.path.isdir(mod_path): - source_file = ".".join((os.path.join(mod_path, "__init__"), - "py",)) - else: - source_file = ".".join((os.path.join(mod_path), "py")) - - CURRENT_SOURCES[MOD_DIR].append("%s.rst" % module) - # Only generate a new file if the source has changed or we don't - # have a doc file to begin with. - if not os.access(generated_file, os.F_OK) or \ - os.stat(generated_file).st_mtime < \ - os.stat(source_file).st_mtime: - print "Module %s updated, generating new documentation." \ - % module - FILEOUT = open(generated_file, "w") - header = "The :mod:`%s` Module" % module - FILEOUT.write("%s\n" % ("=" * len(header),)) - FILEOUT.write("%s\n" % header) - FILEOUT.write("%s\n" % ("=" * len(header),)) - FILEOUT.write(".. automodule:: %s\n" % module) - FILEOUT.write(" :members:\n") - FILEOUT.write(" :undoc-members:\n") - FILEOUT.write(" :show-inheritance:\n") - FILEOUT.write(" :noindex:\n") - FILEOUT.close() - - INDEXOUT.close() - - # Delete auto-generated .rst files for sources which no longer exist - for directory, subdirs, files in list(os.walk(RSTDIR)): - for old_file in files: - if old_file not in CURRENT_SOURCES.get(directory, []): - print "Removing outdated file for %s" % old_file - os.remove(os.path.join(directory, old_file)) - - -write_autodoc_index() - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ---------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. -# They can be extensions coming with Sphinx (named 'sphinx.ext.*') -# or your custom ones. -extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.pngmath', - 'sphinx.ext.viewcode', - 'oslo.sphinx', - ] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Horizon' -copyright = u'2012, OpenStack, LLC' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = horizon.version.version_info.version_string() -# The full version, including alpha/beta/rc tags. -release = horizon.version.version_info.release_string() - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['**/#*', '**~', '**/#*#'] - -# The reST default role (used for this markup: `text`) -# to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -primary_domain = 'py' -nitpicky = False - - -# -- Options for HTML output -------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# html_theme_path = ['.'] -# html_theme = '_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -html_theme_options = { - "nosidebar": "false" -} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' -git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1" -html_last_updated_fmt = os.popen(git_cmd).read() - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'Horizondoc' - - -# -- Options for LaTeX output ------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ('index', 'Horizon.tex', u'Horizon Documentation', - u'OpenStack, LLC', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output ------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'horizon', u'Horizon Documentation', - [u'OpenStack'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ----------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'Horizon', u'Horizon Documentation', u'OpenStack', - 'Horizon', 'One line description of project.', 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - - -# -- Options for Epub output -------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = u'Horizon' -epub_author = u'OpenStack' -epub_publisher = u'OpenStack' -epub_copyright = u'2012, OpenStack' - -# The language of the text. It defaults to the language option -# or en if the language is not set. -#epub_language = '' - -# The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' - -# The unique identifier of the text. This can be an ISBN number -# or the project homepage. -#epub_identifier = '' - -# A unique identification for the text. -#epub_uid = '' - -# A tuple containing the cover image and cover page html template filenames. -#epub_cover = () - -# HTML files that should be inserted before the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_pre_files = [] - -# HTML files shat should be inserted after the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_post_files = [] - -# A list of files that should not be packed into the epub file. -#epub_exclude_files = [] - -# The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 - -# Allow duplicate toc entries. -#epub_tocdup = True - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'python': ('http://docs.python.org/', None), - 'django': - ('http://docs.djangoproject.com/en/dev/_objects/'), - 'nova': ('http://nova.openstack.org', None), - 'swift': ('http://swift.openstack.org', None), - 'keystone': ('http://keystone.openstack.org', None), - 'glance': ('http://glance.openstack.org', None)} diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst deleted file mode 100644 index fada39dab..000000000 --- a/doc/source/contributing.rst +++ /dev/null @@ -1,203 +0,0 @@ -================== -Contributing Guide -================== - -First and foremost, thank you for wanting to contribute! It's the only way -open source works! - -Before you dive into writing patches, here are some of the basics: - -* Project page: http://launchpad.net/horizon -* Bug tracker: https://bugs.launchpad.net/horizon -* Source code: https://github.com/openstack/horizon -* Code review: https://review.openstack.org/#q,status:open+project:openstack/horizon,n,z -* Jenkins build status: https://jenkins.openstack.org/view/Horizon/ -* IRC Channel: #openstack-horizon on Freenode. - -Making Contributions -==================== - -Getting Started ---------------- - -We'll start by assuming you've got a working checkout of the repository (if -not then please see the :doc:`quickstart`). - -Second, you'll need to take care of a couple administrative tasks: - -#. Create an account on Launchpad. -#. Sign the `OpenStack Contributor License Agreement`_ and follow the associated - instructions to verify your signature. -#. Join the `Horizon Developers`_ team on Launchpad. -#. Follow the `instructions for setting up git-review`_ in your - development environment. - -Whew! Got that all that? Okay! You're good to go. - -Ways To Contribute ------------------- - -The easiest way to get started with Horizon's code is to pick a bug on -Launchpad that interests you, and start working on that. Alternatively, if -there's an OpenStack API feature you would like to see implemented in Horizon -feel free to try building it. - -If those are too big, there are lots of great ways to get involved without -plunging in head-first: - -* Report bugs, triage new tickets, and review old tickets on - the `bug tracker`_. -* Propose ideas for improvements via Launchpad Blueprints, via the - mailing list on the project page, or on IRC. -* Write documentation! -* Write unit tests for untested code! - -.. _`bug tracker`: https://bugs.launchpad.net/horizon - -Choosing Issues To Work On --------------------------- - -In general, if you want to write code, there are three cases for issues -you might want to work on: - -#. Confirmed bugs -#. Approved blueprints (features) -#. New bugs you've discovered - -If you have an idea for a new feature that isn't in a blueprint yet, it's -a good idea to write the blueprint first so you don't end up writing a bunch -of code that may not go in the direction the community wants. - -For bugs, open the bug first, but if you can reproduce the bug reliably and -identify its cause then it's usually safe to start working on it. However, -getting independent confirmation (and verifying that it's not a duplicate) -is always a good idea if you can be patient. - -After You Write Your Patch --------------------------- - -Once you've made your changes, there are a few things to do: - -* Make sure the unit tests pass: ``./run_tests.sh`` -* Make sure PEP8 is clean: ``./run_tests.sh --pep8`` -* Make sure your code is up-to-date with the latest master: ``git pull --rebase`` -* Finally, run ``git review`` to upload your changes to Gerrit for review. - -The Horizon core developers will be notified of the new review and will examine -it in a timely fashion, either offering feedback or approving it to be merged. -If the review is approved, it is sent to Jenkins to verify the unit tests pass -and it can be merged cleanly. Once Jenkins approves it, the change will be -merged to the master repository and it's time to celebrate! - -.. _`OpenStack Contributor License Agreement`: http://wiki.openstack.org/CLA -.. _`OpenStack Contributors`: https://launchpad.net/~openstack-cla -.. _`Horizon Developers`: https://launchpad.net/~horizon -.. _`instructions for setting up git-review`: http://wiki.openstack.org/GerritWorkflow - -Etiquette -========= - -The community's guidelines for etiquette are fairly simple: - -* Treat everyone respectfully and professionally. -* If a bug is "in progress" in the bug tracker, don't start working on it - without contacting the author. Try on IRC, or via the launchpad email - contact link. If you don't get a response after a reasonable time, then go - ahead. Checking first avoids duplicate work and makes sure nobody's toes - get stepped on. -* If a blueprint is assigned, even if it hasn't been started, be sure you - contact the assignee before taking it on. These larger issues often have a - history of discussion or specific implementation details that the assignee - may be aware of that you are not. -* Please don't re-open tickets closed by a core developer. If you disagree with - the decision on the ticket, the appropriate solution is to take it up on - IRC or the mailing list. -* Give credit where credit is due; if someone helps you substantially with - a piece of code, it's polite (though not required) to thank them in your - commit message. - -Code Style -========== - -Python ------- - -We follow PEP8_ for all our Python code, and use ``pep8.py`` (available -via the shortcut ``./run_tests.sh --pep8``) to validate that our code -meets proper Python style guidelines. - -.. _PEP8: http://www.python.org/dev/peps/pep-0008/ - -Django ------- - -Additionally, we follow `Django's style guide`_ for templates, views, and -other miscellany. - -.. _Django's style guide: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/ - -JavaScript ----------- - -As a project, Horizon adheres to code quality standards for our JavaScript -just as we do for our Python. To that end we recommend (but do not strictly -enforce) the use of JSLint_ to validate some general best practices. - -The default options are mostly good, but the following accommodate some -allowances we make: - -* Set ``Indentation`` to ``2``. -* Enable the ``Assume console, alert, ...`` option. -* Enable the ``Assume a browser`` option. -* Enable the ``Tolerate missing 'use strict' pragma`` option. -* Clear the ``Maximum number of errors`` field. -* Add ``horizon,$`` to the ``Predefined`` list. - -.. _JSLint: http://jslint.com/ - -CSS ---- - -Style guidelines for CSS are currently quite minimal. Do your best to make the -code readable and well-organized. Two spaces are preferred for indentation -so as to match both the JavaScript and HTML files. - -HTML ----- - -Again, readability is paramount; however be conscientous of how the browser -will handle whitespace when rendering the output. Two spaces is the preferred -indentation style to match all front-end code. - -Documentation -------------- - -Horizon's documentation is written in reStructuredText and uses Sphinx for -additional parsing and functionality, and should follow -standard practices for writing reST. This includes: - -* Flow paragraphs such that lines wrap at 80 characters or less. -* Use proper grammar, spelling, capitalization and punctuation at all times. -* Make use of Sphinx's autodoc feature to document modules, classes - and functions. This keeps the docs close to the source. -* Where possible, use Sphinx's cross-reference syntax (e.g. - ``:class:`~horizon.foo.Bar```) when referring to other Horizon components. - The better-linked our docs are, the easier they are to use. - -Be sure to generate the documentation before submitting a patch for review. -Unexpected warnings often appear when building the documentation, and slight -reST syntax errors frequently cause links or cross-references not to work -correctly. - -Conventions ------------ - -Simply by convention, we have a few rules about naming: - - * The term "project" is used in place of Keystone's "tenant" terminology - in all user-facing text. The term "tenant" is still used in API code to - make things more obvious for developers. - - * The term "dashboard" refers to a top-level dashboard class, and "panel" to - the sub-items within a dashboard. Referring to a panel as a dashboard is - both confusing and incorrect. diff --git a/doc/source/faq.rst b/doc/source/faq.rst deleted file mode 100644 index 26836ef66..000000000 --- a/doc/source/faq.rst +++ /dev/null @@ -1,37 +0,0 @@ -========================== -Frequently Asked Questions -========================== - -What is the relationship between ``Dashboards``, ``Panels``, and navigation? - - The navigational structure is strongly encouraged to flow from - ``Dashboard`` objects as top-level navigation items to ``Panel`` objects as - sub-navigation items as in the current implementation. Template tags - are provided to automatically generate this structure. - - That said, you are not required to use the provided tools and can write - templates and URLconfs by hand to create any desired structure. - -Does a panel have to be an app in ``INSTALLED_APPS``? - - A panel can live in any Python module. It can be a standalone which ties - into an existing dashboard, or it can be contained alongside others within - a larger dashboard "app". There is no strict enforcement here. Python - is "a language for consenting adults." A module containing a Panel does - not need to be added to ``INSTALLED_APPS``, but this is a common and - convenient way to load a standalone panel. - -Could I hook an external service into a panel using, for example, an iFrame? - - Panels are just entry-points to hook views into the larger dashboard - navigational structure and enforce common attributes like RBAC. The - view and corresponding templates can contain anything you would like, - including iFrames. - -What does this mean for visual design? - - The ability to add an arbitrary number of top-level navigational items - (``Dashboard`` objects) poses a new design challenge. Horizon's lead - designer has taken on the challenge of providing a reference design - for Horizon which supports this possibility. - diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst deleted file mode 100644 index 7cabc2f43..000000000 --- a/doc/source/glossary.rst +++ /dev/null @@ -1,24 +0,0 @@ -======== -Glossary -======== - -Horizon - - The OpenStack dashboard project. Also the name of the top-level - Python object which handles registration for the app. - -Dashboard - - A Python class representing a top-level navigation item (e.g. "project") - which provides a consistent API for Horizon-compatible applications. - -Panel - - A Python class representing a sub-navigation item (e.g. "instances") - which contains all the necessary logic (views, forms, tests, etc.) for - that interface. - -Project - - Used in user-facing text in place of the term "Tenant" which is Keystone's - word. diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 592027a27..000000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,127 +0,0 @@ -.. - Copyright 2012 OpenStack, LLC - 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. - -======================================== -Horizon: The OpenStack Dashboard Project -======================================== - -Introduction -============ - -Horizon is the canonical implementation of `Openstack's Dashboard -`_, which provides a web based user -interface to OpenStack services including Nova, Swift, Keystone, etc. - -For a more in-depth look at Horizon and its architecture, see the -:doc:`Introduction to Horizon `. - -To learn what you need to know to get going, see the :doc:`quickstart`. - -Getting Started With Horizon -============================ - -How to use Horizon in your own projects. - -.. toctree:: - :maxdepth: 1 - - intro - quickstart - topics/tutorial - topics/deployment - topics/settings - topics/customizing - -Developer Docs -============== - -For those wishing to develop Horizon itself, or go in-depth with building -your own :class:`~horizon.Dashboard` or :class:`~horizon.Panel` classes, -the following documentation is provided. - -General information -------------------- - -Brief guides to areas of interest and importance when developing Horizon. - -.. toctree:: - :maxdepth: 1 - - contributing - testing - -Topic Guides ------------- - -Information on how to work with specific areas of Horizon can be found in -the following topic guides. - -.. toctree:: - :maxdepth: 1 - - topics/tables - topics/testing - -API Reference -------------- - -In-depth documentation for Horizon and its APIs. - -.. toctree:: - :maxdepth: 1 - - ref/run_tests - ref/horizon - ref/workflows - ref/tables - ref/tabs - ref/forms - ref/middleware - ref/context_processors - ref/decorators - ref/exceptions - ref/test - -Source Code Reference ---------------------- - -Auto-generated reference for the complete source code. - -.. toctree:: - :maxdepth: 1 - - sourcecode/autoindex - -Release Notes -============= - -.. toctree:: - :glob: - :maxdepth: 1 - - releases/* - -Information -=========== - -.. toctree:: - :maxdepth: 1 - - faq - glossary - -* :ref:`genindex` -* :ref:`modindex` diff --git a/doc/source/intro.rst b/doc/source/intro.rst deleted file mode 100644 index a546ce991..000000000 --- a/doc/source/intro.rst +++ /dev/null @@ -1,124 +0,0 @@ -=================== -Introducing Horizon -=================== - -.. contents:: Contents: - :local: - -Values -====== - - "Think simple" as my old master used to say - meaning reduce - the whole of its parts into the simplest terms, getting back - to first principles. - - -- Frank Lloyd Wright - -Horizon holds several key values at the core of its design and architecture: - - * Core Support: Out-of-the-box support for all core OpenStack projects. - * Extensible: Anyone can add a new component as a "first-class citizen". - * Manageable: The core codebase should be simple and easy-to-navigate. - * Consistent: Visual and interaction paradigms are maintained throughout. - * Stable: A reliable API with an emphasis on backwards-compatibility. - * Usable: Providing an *awesome* interface that people *want* to use. - -The only way to attain and uphold those ideals is to make it *easy* for -developers to implement those values. - -History -======= - -Horizon started life as a single app to manage OpenStack's compute project. -As such, all it needed was a set of views, templates, and API calls. - -From there it grew to support multiple OpenStack projects and APIs gradually, -arranged rigidly into "dash" and "syspanel" groupings. - -During the "Diablo" release cycle an initial plugin system was added using -signals to hook in additional URL patterns and add links into the "dash" -and "syspanel" navigation. - -This incremental growth served the goal of "Core Support" phenomenally, but -left "Extensible" and "Manageable" behind. And while the other key values took -shape of their own accord, it was time to re-architect for an extensible, -modular future. - - -The Current Architecture & How It Meets Our Values -================================================== - -At its core, **Horizon should be a registration pattern for -applications to hook into**. Here's what that means and how it is -implemented in terms of our values: - -Core Support ------------- - -Horizon ships with three central dashboards, a "User Dashboard", a -"System Dashboard", and a "Settings" dashboard. Between these three they -cover the core OpenStack applications and deliver on Core Support. - -The Horizon application also ships with a set of API abstractions -for the core OpenStack projects in order to provide a consistent, stable set -of reusable methods for developers. Using these abstractions, developers -working on Horizon don't need to be intimately familiar with the APIs of -each OpenStack project. - -Extensible ----------- - -A Horizon dashboard application is based around the :class:`~horizon.Dashboard` -class that provides a consistent API and set of capabilities for both -core OpenStack dashboard apps shipped with Horizon and equally for third-party -apps. The :class:`~horizon.Dashboard` class is treated as a top-level -navigation item. - -Should a developer wish to provide functionality within an existing dashboard -(e.g. adding a monitoring panel to the user dashboard) the simple registration -pattern makes it possible to write an app which hooks into other dashboards -just as easily as creating a new dashboard. All you have to do is import the -dashboard you wish to modify. - -Manageable ----------- - -Within the application, there is a simple method for registering a -:class:`~horizon.Panel` (sub-navigation items). Each panel contains the -necessary logic (views, forms, tests, etc.) for that interface. This granular -breakdown prevents files (such as ``api.py``) from becoming thousands of -lines long and makes code easy to find by correlating it directly to the -navigation. - -Consistent ----------- - -By providing the necessary core classes to build from, as well as a -solid set of reusable templates and additional tools (base form classes, -base widget classes, template tags, and perhaps even class-based views) -we can maintain consistency across applications. - -Stable ------- - -By architecting around these core classes and reusable components we -create an implicit contract that changes to these components will be -made in the most backwards-compatible ways whenever possible. - -Usable ------- - -Ultimately that's up to each and every developer that touches the code, -but if we get all the other goals out of the way then we are free to focus -on the best possible experience. - -.. seealso:: - - :doc:`Quickstart ` - A short guide to getting started with using Horizon. - - :doc:`Frequently Asked Questions ` - Common questions and answers. - - :doc:`Glossary ` - Common terms and their definitions. diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst deleted file mode 100644 index 3c7156c6b..000000000 --- a/doc/source/quickstart.rst +++ /dev/null @@ -1,214 +0,0 @@ -================== -Horizon Quickstart -================== - -Setup -===== - -To setup an Horizon development environment simply clone the Horizon git -repository from http://github.com/openstack/horizon and execute the -``run_tests.sh`` script from the root folder (see :doc:`ref/run_tests`):: - - > git clone https://github.com/openstack/horizon.git - > cd horizon - > ./run_tests.sh - -Next you will need to setup your Django application config by copying ``openstack_dashboard/local/local_settings.py.example`` to ``openstack_dashboard/local_settings.py``. To do this quickly you can use the following command:: - - > cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py - -Horizon assumes a single end-point for OpenStack services which defaults to -the local host (127.0.0.1). If this is not the case change the -``OPENSTACK_HOST`` setting in the ``openstack_dashboard/local/local_settings.py`` file, to the actual IP address of the OpenStack end-point Horizon should use. - -To start the Horizon development server use the Django ``manage.py`` utility -with the context of the virtual environment:: - - > tools/with_venv.sh ./manage.py runserver - -Alternately specify the listen IP and port:: - - > tools/with_venv.sh ./manage.py runserver 0.0.0.0:8080 - -.. note:: - - If you would like to run commands without the prefix of ``tools/with_venv.sh`` you may source your environment directly. This will remain active as long as your shell session stays open:: - - > source .venv/bin/activate - - -Once the Horizon server is running point a web browser to http://localhost:8000 -or to the IP and port the server is listening for. - -.. note:: - - The ``DevStack`` project (http://devstack.org/) can be used to install - an OpenStack development environment from scratch. - -.. note:: - - The minimum required set of OpenStack services running includes the - following: - - * Nova (compute, api, scheduler, and network) - * Glance - * Keystone - - Optional support is provided for Swift. - -Horizon's Structure -=================== - -This project is a bit different from other OpenStack projects in that it has -two very distinct components underneath it: ``horizon``, and -``openstack_dashboard``. - -The ``horizon`` directory holds the generic libraries and components that can -be used in any Django project. - -The ``openstack_dashboard`` directory contains a reference Django project that -uses ``horizon``. - -For development, both pieces share an environment which (by default) is -built with the ``tools/install_venv.py`` script. That script creates a -virtualenv and installs all the necessary packages. - -If dependencies are added to either ``horizon`` or ``openstack_dashboard``, -they should be added to ``requirements.txt``. - - .. important:: - - If you do anything which changes the environment (adding new dependencies - or renaming directories are both great examples) be sure to increment the - ``environment_version`` counter in :doc:`run_tests.sh `. - -Project -======= - -INSTALLED_APPS --------------- - -At the project level you add Horizon and any desired dashboards to your -``settings.INSTALLED_APPS``:: - - INSTALLED_APPS = ( - 'openstack_dashboard', - ... - 'horizon', - 'openstack_dashboard.dashboards.project', - 'openstack_dashboard.dashboards.admin', - 'openstack_dashboard.dashboards.settings', - ... - ) - -URLs ----- - -Then you add a single line to your project's ``urls.py``:: - - url(r'', include(horizon.urls)), - -Those urls are automatically constructed based on the registered Horizon apps. -If a different URL structure is desired it can be constructed by hand. - -Templates ---------- - -Pre-built template tags generate navigation. In your ``nav.html`` -template you might have the following:: - - {% load horizon %} - - - -And in your ``sidebar.html`` you might have:: - - {% load horizon %} - - - -These template tags are aware of the current "active" dashboard and panel -via template context variables and will render accordingly. - -Application -=========== - -Structure ---------- - -An application would have the following structure (we'll use syspanel as -an example):: - - project/ - |---__init__.py - |---dashboard.py <-----Registers the app with Horizon and sets dashboard properties - |---overview/ - |---images_and_snapshots/ - |-- images - |-- __init__.py - |---panel.py <-----Registers the panel in the app and defines panel properties - |-- snapshots/ - |-- templates/ - |-- tests.py - |-- urls.py - |-- views.py - ... - ... - -Dashboard Classes ------------------ - -Inside of ``dashboard.py`` you would have a class definition and the registration -process:: - - import horizon - - .... - # ObjectStorePanels is an example for a PanelGroup - # for panel classes in general, see below - class ObjectStorePanels(horizon.PanelGroup): - slug = "object_store" - name = _("Object Store") - panels = ('containers',) - - - class Project(horizon.Dashboard): - name = _("Project") # Appears in navigation - slug = "project" # Appears in URL - # panels may be strings or refer to classes, such as - # ObjectStorePanels - panels = (BasePanels, NetworkPanels, ObjectStorePanels) - default_panel = 'overview' - supports_tenants = True - ... - - horizon.register(Project) - -Panel Classes -------------- - -To connect a :class:`~horizon.Panel` with a :class:`~horizon.Dashboard` class -you register it in a ``panels.py`` file like so:: - - import horizon - - from openstack_dashboard.dashboards.project import dashboard - - - class Images(horizon.Panel): - name = "Images" - slug = 'images' - permissions = ('openstack.roles.admin', 'my.other.permission',) - - - # You could also register your panel with another application's dashboard - dashboard.Project.register(Images) - -By default a :class:`~horizon.Panel` class looks for a ``urls.py`` file in the -same directory as ``panel.py`` to include in the rollup of url patterns from -panels to dashboards to Horizon, resulting in a wholly extensible, configurable -URL structure. diff --git a/doc/source/ref/context_processors.rst b/doc/source/ref/context_processors.rst deleted file mode 100644 index b34c01090..000000000 --- a/doc/source/ref/context_processors.rst +++ /dev/null @@ -1,6 +0,0 @@ -========================== -Horizon Context Processors -========================== - -.. automodule:: horizon.context_processors - :members: diff --git a/doc/source/ref/decorators.rst b/doc/source/ref/decorators.rst deleted file mode 100644 index 777afbe5d..000000000 --- a/doc/source/ref/decorators.rst +++ /dev/null @@ -1,6 +0,0 @@ -================== -Horizon Decorators -================== - -.. automodule:: horizon.decorators - :members: diff --git a/doc/source/ref/exceptions.rst b/doc/source/ref/exceptions.rst deleted file mode 100644 index 4151f18f7..000000000 --- a/doc/source/ref/exceptions.rst +++ /dev/null @@ -1,6 +0,0 @@ -================== -Horizon Exceptions -================== - -.. automodule:: horizon.exceptions - :members: diff --git a/doc/source/ref/forms.rst b/doc/source/ref/forms.rst deleted file mode 100644 index f0a0507c3..000000000 --- a/doc/source/ref/forms.rst +++ /dev/null @@ -1,98 +0,0 @@ -============= -Horizon Forms -============= - -Horizon ships with some very useful base form classes, form fields, -class-based views, and javascript helpers which streamline most of the common -tasks related to form handling. - -Form Classes -============ - -.. automodule:: horizon.forms.base - :members: - -Form Fields -=========== - -.. automodule:: horizon.forms.fields - :members: - -Form Views -========== - -.. automodule:: horizon.forms.views - :members: - -Forms Javascript -================ - -Switchable Fields ------------------ - -By marking fields with the ``"switchable"`` and ``"switched"`` classes along -with defining a few data attributes you can programmatically hide, show, -and rename fields in a form. - -The triggers are fields using a ``select`` input widget, marked with the -"switchable" class, and defining a "data-slug" attribute. When they are changed, -any input with the ``"switched"`` class and defining a ``"data-switch-on"`` -attribute which matches the ``select`` input's ``"data-slug"`` attribute will be -evaluated for necessary changes. In simpler terms, if the ``"switched"`` target -input's ``"switch-on"`` matches the ``"slug"`` of the ``"switchable"`` trigger -input, it gets switched. Simple, right? - -The ``"switched"`` inputs also need to define states. For each state in which -the input should be shown, it should define a data attribute like the -following: ``data--=""``. When the switch event -happens the value of the ``"switchable"`` field will be compared to the -data attributes and the correct label will be applied to the field. If -a corresponding label for that value is *not* found, the field will -be hidden instead. - -A simplified example is as follows:: - - source = forms.ChoiceField( - label=_('Source'), - choices=[ - ('cidr', _('CIDR')), - ('sg', _('Security Group')) - ], - widget=forms.Select(attrs={ - 'class': 'switchable', - 'data-slug': 'source' - }) - ) - - cidr = fields.IPField( - label=_("CIDR"), - required=False, - widget=forms.TextInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'source', - 'data-source-cidr': _('CIDR') - }) - ) - - security_group = forms.ChoiceField( - label=_('Security Group'), - required=False, - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'source', - 'data-source-sg': _('Security Group') - }) - ) - -That code would create the ``"switchable"`` control field ``source``, and the -two ``"switched"`` fields ``cidr`` and ``security group`` which are hidden or -shown depending on the value of ``source``. - - -NOTE: A field can only safely define one slug in its ``"switch-on"`` attribute. -While switching on multiple fields is possible, the behavior is very hard to -predict due to the events being fired from the various switchable fields in -order. You generally end up just having it hidden most of the time by accident, -so it's not recommended. Instead just add a second field to the form and control -the two independently, then merge their results in the form's clean or handle -methods at the end. diff --git a/doc/source/ref/horizon.rst b/doc/source/ref/horizon.rst deleted file mode 100644 index cc4b2d709..000000000 --- a/doc/source/ref/horizon.rst +++ /dev/null @@ -1,45 +0,0 @@ -====================== -The ``horizon`` Module -====================== - -.. module:: horizon - -Horizon ships with a single point of contact for hooking into your project if -you aren't developing your own :class:`~horizon.Dashboard` or -:class:`~horizon.Panel`:: - - import horizon - -From there you can access all the key methods you need. - -Horizon -======= - -.. attribute:: urls - - The auto-generated URLconf for Horizon. Usage:: - - url(r'', include(horizon.urls)), - -.. autofunction:: register -.. autofunction:: unregister -.. autofunction:: get_absolute_url -.. autofunction:: get_user_home -.. autofunction:: get_dashboard -.. autofunction:: get_default_dashboard -.. autofunction:: get_dashboards - -Dashboard -========= - -.. autoclass:: Dashboard - :members: - -Panel -===== - -.. autoclass:: Panel - :members: - -.. autoclass:: PanelGroup - :members: diff --git a/doc/source/ref/middleware.rst b/doc/source/ref/middleware.rst deleted file mode 100644 index fcca5ff07..000000000 --- a/doc/source/ref/middleware.rst +++ /dev/null @@ -1,6 +0,0 @@ -================== -Horizon Middleware -================== - -.. automodule:: horizon.middleware - :members: diff --git a/doc/source/ref/run_tests.rst b/doc/source/ref/run_tests.rst deleted file mode 100644 index ca7c7ce18..000000000 --- a/doc/source/ref/run_tests.rst +++ /dev/null @@ -1,233 +0,0 @@ -=========================== -The ``run_tests.sh`` Script -=========================== - -.. contents:: Contents: - :local: - -Horizon ships with a script called ``run_tests.sh`` at the root of the -repository. This script provides many crucial functions for the project, -and also makes several otherwise complex tasks trivial for you as a -developer. - -First Run -========= - -If you start with a clean copy of the Horizon repository, the first thing -you should do is to run ``./run_tests.sh`` from the root of the repository. -This will do two things for you: - - #. Set up a virtual environment for both the ``horizon`` module and - the ``openstack-dashboard`` project using - ``openstack-dashboard/tools/install_venv.py``. - #. Run the tests for both ``horizon`` and ``openstack-dashboard`` using - their respective environments and verify that evreything is working. - -Setting up the environment the first time can take several minutes, but only -needs to be done once. If dependencies are added in the future, updating the -environments will be necessary but not as time consuming. - -I just want to run the tests! -============================= - -Running the full set of unit tests quickly and easily is the main goal of this -script. All you need to do is:: - - ./run_tests.sh - -Yep, that's it. However, for a more thorough test run you can include the -Selenium tests by using the ``--with-selenium`` flag:: - - ./run_tests.sh --with-selenium - -If you run horizon in a minimal installation VM, you will probably need -the following (steps for Fedora 18 minimal installation): - - #. Install these packages in the VM: - ``yum install xorg-x11-xauth xorg-x11-fonts-Type1.noarch``. - #. Install firefox in the VM: - ``yum install firefox``. - #. Connect to the VM by ``ssh -X`` - (if you run ``set|grep DISP``, you should see that the DISPLAY is set). - #. Run - ``./run_tests.sh --with-selenium``. - -Running a subset of tests -------------------------- - -Instead of running all tests, you can specify an individual directory, file, -class, or method that contains test code. - -To run the tests in the ``horizon/test/tests/tables.py`` file:: - - ./run_tests.sh horizon.test.tests.tables - -To run the tests in the `WorkflowsTests` class in -``horizon/test/tests/workflows``:: - - ./run_tests.sh horizon.test.tests.workflows:WorkflowsTests - -To run just the `WorkflowsTests.test_workflow_view` test method:: - - ./run_tests.sh horizon.test.tests.workflows:WorkflowsTests.test_workflow_view - -Using Dashboard and Panel Templates -=================================== - -Horizon has a set of convenient management commands for creating new -dashboards and panels based on basic templates. - -Dashboards ----------- - -To create a new dashboard, run the following: - - ./run_tests.sh -m startdash - -This will create a directory with the given dashboard name, a ``dashboard.py`` -module with the basic dashboard code filled in, and various other common -"boilerplate" code. - -Available options: - -* --target: the directory in which the dashboard files should be created. - Default: A new directory within the current directory. - -Panels ------- - -To create a new panel, run the following: - - ./run_tests -m startpanel --dashboard= - -This will create a directory with the given panel name, and ``panel.py`` -module with the basic panel code filled in, and various other common -"boilerplate" code. - -Available options: - -* -d, --dashboard: The dotted python path to your dashboard app (the module - which containers the ``dashboard.py`` file.). -* --target: the directory in which the panel files should be created. - If the value is ``auto`` the panel will be created as a new directory inside - the dashboard module's directory structure. Default: A new directory within - the current directory. - -Give me metrics! -================ - -You can generate various reports and metrics using command line arguments -to ``run_tests.sh``. - -Coverage --------- - -To run coverage reports:: - - ./run_tests.sh --coverage - -The reports are saved to ``./reports/`` and ``./coverage.xml``. - -PEP8 ----- - -You can check for PEP8 violations as well:: - - ./run_tests.sh --pep8 - -The results are saved to ``./pep8.txt``. - -PyLint ------- - -For more detailed code analysis you can run:: - - ./run_tests.sh --pylint - -The output will be saved in ``./pylint.txt``. - -Tab Characters --------------- - -For those who dislike having a mix of tab characters and spaces for indentation -there's a command to check for that in Python, CSS, JavaScript and HTML files:: - - ./run_tests.sh --tabs - -This will output a total "tab count" and a list of the offending files. - -Running the development server -============================== - -As an added bonus, you can run Django's development server directly from -the root of the repository with ``run_tests.sh`` like so:: - - ./run_tests.sh --runserver - -This is effectively just an alias for:: - - ./openstack-dashboard/tools/with_venv.sh ./openstack-dashboard/dashboard/manage.py runserver - -Generating the documentation -============================ - -You can build Horizon's documentation automatically by running:: - - ./run_tests.sh --docs - -The output is stored in ``./doc/build/html/``. - -Updating the translation files -============================== - -You can update all of the translation files for both the ``horizon`` app and -``openstack_dashboard`` project with a single command: - - ./run_tests.sh --makemessages - -or, more compactly: - - ./run_tests.sh --m - -Starting clean -============== - -If you ever want to start clean with a new environment for Horizon, you can -run:: - - ./run_tests.sh --force - -That will blow away the existing environments and create new ones for you. - -Non-interactive Mode -==================== - -There is an optional flag which will run the script in a non-interactive -(and eventually less verbose) mode:: - - ./run_tests.sh --quiet - -This will automatically take the default action for actions which would -normally prompt for user input such as installing/updating the environment. - -Environment Backups -=================== - -To speed up the process of doing clean checkouts, running continuous -integration tests, etc. there are options for backing up the current -environment and restoring from a backup. - - ./run_tests.sh --restore-environment - ./run_tests.sh --backup-environment - -The environment backup is stored in ``/tmp/.horizon_environment/``. - -Environment Versioning -====================== - -Horizon keeps track of changes to the environment by incrementing an -``environment_version`` integer at the top of ``run_tests.sh``. - -If you do anything which changes the environment (adding new dependencies -or renaming directories are both great examples) be sure to increment the -``environment_version`` counter as well. diff --git a/doc/source/ref/tables.rst b/doc/source/ref/tables.rst deleted file mode 100644 index 4b74d5e35..000000000 --- a/doc/source/ref/tables.rst +++ /dev/null @@ -1,82 +0,0 @@ -================== -Horizon DataTables -================== - -.. module:: horizon.tables - -Horizon includes a componentized API for programmatically creating tables -in the UI. Why would you want this? It means that every table renders -correctly and consistently, table- and row-level actions all have a consistent -API and appearance, and generally you don't have to reinvent the wheel or -copy-and-paste every time you need a new table! - -DataTable -========= - -The core class which defines the high-level structure of the table being -represented. Example:: - - class MyTable(DataTable): - name = Column('name') - email = Column('email') - - class Meta: - name = "my_table" - table_actions = (MyAction, MyOtherAction) - row_actions - (MyAction) - -A full reference is included below: - -.. autoclass:: DataTable - :members: - -DataTable Options -================= - -The following options can be defined in a ``Meta`` class inside a -:class:`.DataTable` class. Example:: - - class MyTable(DataTable): - class Meta: - name = "my_table" - verbose_name = "My Table" - -.. autoclass:: horizon.tables.base.DataTableOptions - :members: - -Table Components -================ - -.. autoclass:: Column - :members: - -.. autoclass:: Row - :members: - -Actions -======= - -.. autoclass:: Action - :members: - -.. autoclass:: LinkAction - :members: - -.. autoclass:: FilterAction - :members: - -.. autoclass:: BatchAction - :members: - -.. autoclass:: DeleteAction - :members: - -Class-Based Views -================= - -Several class-based views are provided to make working with DataTables -easier in your UI. - -.. autoclass:: DataTableView - -.. autoclass:: MultiTableView diff --git a/doc/source/ref/tabs.rst b/doc/source/ref/tabs.rst deleted file mode 100644 index 807385caf..000000000 --- a/doc/source/ref/tabs.rst +++ /dev/null @@ -1,45 +0,0 @@ -========================== -Horizon Tabs and TabGroups -========================== - -.. module:: horizon.tabs - -Horizon includes a set of reusable components for programmatically -building tabbed interfaces with fancy features like dynamic AJAX loading -and nearly effortless templating and styling. - -Tab Groups -========== - -For any tabbed interface, your fundamental element is the tab group which -contains all your tabs. This class provides a dead-simple API for building -tab groups and encapsulates all the necessary logic behind the scenes. - -.. autoclass:: TabGroup - :members: - -Tabs -==== - -The tab itself is the discrete unit for a tab group, representing one -view of data. - -.. autoclass:: Tab - :members: - -.. autoclass:: TableTab - :members: - - - -TabView -======= - -There is also a useful and simple generic class-based view for handling -the display of a :class:`~horizon.tabs.TabGroup` class. - -.. autoclass:: TabView - :members: - -.. autoclass:: TabbedTableView - :members: diff --git a/doc/source/ref/test.rst b/doc/source/ref/test.rst deleted file mode 100644 index 79a4bc1c9..000000000 --- a/doc/source/ref/test.rst +++ /dev/null @@ -1,25 +0,0 @@ -======================== -Horizon TestCase Classes -======================== - -.. module:: horizon.test.helpers - -Horizon provides a base test case class which provides several useful -pre-prepared attributes for testing Horizon components. - -.. autoclass:: TestCase - :members: - -.. module :: openstack_dashboard.test.helpers - -The OpenStack Dashboard also provides test case classes for greater -ease-of-use when testing APIs and OpenStack-specific auth scenarios. - -.. autoclass:: TestCase - :members: - -.. autoclass:: APITestCase - :members: - -.. autoclass:: BaseAdminViewTests - :members: diff --git a/doc/source/ref/workflows.rst b/doc/source/ref/workflows.rst deleted file mode 100644 index c4077667b..000000000 --- a/doc/source/ref/workflows.rst +++ /dev/null @@ -1,33 +0,0 @@ -================= -Horizon Workflows -================= - -.. module:: horizon.workflows - -One of the most challenging aspects of building a compelling user experience -is crafting complex multi-part workflows. Horizon's ``workflows`` module -aims to bring that capability within everyday reach. - -Workflows -========= - -.. autoclass:: Workflow - :members: - -Steps -===== - -.. autoclass:: Step - :members: - -Actions -======= - -.. autoclass:: Action - :members: - -WorkflowView -============ - -.. autoclass:: WorkflowView - :members: diff --git a/doc/source/releases/2012_1.rst b/doc/source/releases/2012_1.rst deleted file mode 100644 index e024bf415..000000000 --- a/doc/source/releases/2012_1.rst +++ /dev/null @@ -1,148 +0,0 @@ -====================== -Horizon 2012.1 "Essex" -====================== - -Release Overview -================ - -During the Essex release cycle, Horizon underwent a significant set of internal -changes to allow extensibility and customization while also adding a significant -number of new features and bringing much greater stability to every interaction -with the underlying components. - -Highlights -========== - -Extensibility -------------- - -Making Horizon extensible for third-party developers was one of the core -goals for the Essex release cycle. Massive strides have been made to allow -for the addition of new "plug-in" components and customization of OpenStack -Dashboard deployments. - -To support this extensability, all the components used to build on Horizon's -interface are now modular and reusable. Horizon's own dashboards use these -components, and they have all been built with third-party developers in mind. -Some of the main components are listed below. - -Dashboards and Panels -~~~~~~~~~~~~~~~~~~~~~ - -Horizon's structure has been divided into logical groupings called dashboards -and panels. Horizon's classes representing these concepts handle all the -structural concerns associated with building a complete user interface -(navigation, access control, url structure, etc.). - -Data Tables -~~~~~~~~~~~ - -One of the most common activities in a dashboard user interface is simply -displaying a list of resources or data and allowing the user to take actions on -that data. To this end, Horizon abstracted the commonalities of this task into a -reusable set of classes which allow developers to programmatically create -displays and interactions for their data with minimal effort and zero -boilerplate. - -Tabs and TabGroups -~~~~~~~~~~~~~~~~~~ - -Another extremely common user-interface element is the use of "tabs" to break -down discrete groups of data into manageable chunks. Since these tabs often -encompasse vastly different data, may have completely different access -restrictions, and may sometimes be better-off being loaded dynamically rather -than with the initial page load, Horizon includes tab and tab group classes for -constructing these interfaces elegently and with no knowledge of the HTML, CSS -or JavaScript involved. - -Nova Features -------------- - -Support for Nova's features has been greatly improved in Essex: - -* Support for Nova volumes, including: - * Volumes creation and management. - * Volume snapshots. - * Realtime AJAX updating for volumes in transition states. -* Improved Nova instance display and interactions, including: - * Launching instances from volumes. - * Pausing/suspending instances. - * Displaying instance power states. - * Realtime AJAX updating for instances in transition states. -* Support for managing Floating IP address pools. -* New instance and volume detail views. - -Settings --------- - -A new "Settings" area was added that offers several userful functions: - -* EC2 credentials download. -* OpenStack RC file download. -* User language preference customization. - -User Experience Improvements ----------------------------- - -* Support for batch actions on multiple resources (e.g. terminating multiple - instances at once). -* Modal interactions throughout the entire UI. -* AJAX form submission for in-place validation. -* Improved in-context help for forms (tooltips and validation messages). - - -Community ---------- - -* Creation and publication of a set of Human Interface Guidelines (HIG). -* Copious amounts of documentation for developers. - -Under The Hood --------------- - -* Internationalization fully enabled, with all strings marked for translation. -* Client library changes: - * Full migration to python-novaclient from the deprecated openstackx library. - * Migration to python-keystoneclient from the deprecated keystone portion - of the python-novaclient library. -* Client-side templating capabilities for more easily creating dynamic - interactions. -* Frontend overhaul to use the Bootstrap CSS/JS framework. -* Centralized error handling for vastly improved stability/reliability - across APIs/clients. -* Completely revamped test suite with comprehensive test data. -* Forward-compatibility with Django 1.4 and the option of cookie-based sessions. - -Known Issues and Limitations -============================ - -Quantum -------- - -Quantum support has been removed from Horizon for the Essex release. It will be -restored in Folsom in conjunction with Quantum's first release as a core -OpenStack project. - -Keystone --------- - -Due to the mechanisms by which Keystone determines "admin"-ness for a user, an -admin user interacting with the "Project" dashboard may see some inconsistent -behavior such as all resources being listed instead of only those belonging to -that project, or only being able to return to the "Admin" dashboard while -accessing certain projects. - -Exceptions during customization -------------------------------- - -Exceptions raised while overriding built-in Horizon behavior via the -"customization_module" setting may trigger a bug in the error handling -which will mask the original exception. - -Backwards Compatibility -======================= - -The Essex Horizon release is only partially backwards-compatible with Diablo -OpenStack components. While it is largely possible to log in and interact, many -functions in Nova, Glance and Keystone changed too substantially in Essex to -maintain full compatibliity. diff --git a/doc/source/releases/2012_2.rst b/doc/source/releases/2012_2.rst deleted file mode 100644 index 0ff3e5c88..000000000 --- a/doc/source/releases/2012_2.rst +++ /dev/null @@ -1,159 +0,0 @@ -======================= -Horizon 2012.2 "Folsom" -======================= - -Release Overview -================ - -The Folsom release cycle brought several major advances to Horizon's user -experience while also reintroducing Quantum networking as a core piece -of the OpenStack Dashboard. - -Highlights -========== - -Networking (Quantum) --------------------- - -With Quantum being a core project for the Folsom release, we worked closely -with the Quantum team to bring networking support back into Horizon. This -appears in two primary places: the Networks panel in both the Project and -Admin dashboards, and the Network tab in the Launch Instance workflow. Expect -further improvements in these areas as Quantum continues to mature and more -users adopt this model of virtual network management. - -User Experience ---------------- - -Workflows -~~~~~~~~~ - -By far the biggest UI/UX change in the Folsom release is the introduction of -programmatic workflows. These components allow developers to create concise -interactions that combine discrete tasks spanning multiple services and -resources in a user-friendly way and with minimal boilerplate code. Within -a workflow, related objects can also be dynamically created so users don't lose -their place when they realize the item they wanted isn't currently available. -Look for examples of these workflows in Launch Instance, Associate Floating IP, -and Create/Edit Project. - -Resource Browser -~~~~~~~~~~~~~~~~ - -Another cool new component is an interface designed for "browsing" resources -which are nested under a parent resource. The object store (Swift) is a prime -example of this. Now there is a consistent top-level navigation for containers -on the left-hand pane of the "browser" while the right-hand pane lets you -explore within those containers and sub-folders. - -User Experience Improvements ----------------------------- - -* Timezone support is now enabled. You can select your preferred timezone - in the User Settings panel. - -Community ---------- - -* Third-party developers who wish to build on Horizon can get started much - faster using the new dashboard and panel templates. See the docs on - `creating a dashboard`_ and `creating a panel`_ for more information. - -* A `thorough set of documentation`_ for developers on how to go about - internationalizing, localizing and translating OpenStack projects - is now available. - -.. _creating a dashboard: http://docs.openstack.org/developer/horizon/topics/tutorial.html#creating-a-dashboard -.. _creating a panel: http://docs.openstack.org/developer/horizon/topics/tutorial.html#creating-a-panel -.. _thorough set of documentation: http://wiki.openstack.org/Translations - -Under The Hood --------------- - -* The python-swiftclient library and python-cinderclient libraries are now - used under the hood instead of cloudfiles and python-novaclient respectively. - -* Internationalization of client-side JavaScript is now possible in addition - to server-side Python code. - -* Keystone authentication is now handled by a proper pluggable Django - authentication backend, offering significantly better and more reliable - security for Horizon. - -Other Improvements and Fixes ----------------------------- - -Some of the general areas of improvement include: - -* Images can now be added to Glance by providing a URL for Glance to download - the image data from. - -* Quotas are now displayed dynamically throughout the Project dashboard. - -* API endpoints are now displayed on the OpenStack RC File panel so they - can be organically discovered by an end-user. - -* DataTables now support a summation row at the bottom of the table. - -* Better cross-browser support (Safari and IE particularly). - -* Fewer API calls to OpenStack endpoints (improves performance). - -* Better validation of what actions are permitted when. - -* Improved error handling and error messages. - -Known Issues and Limitations -============================ - -Floating IPs and Quantum ------------------------- - -Due to the very late addition of floating IP support in Quantum, Nova's -integration there is lacking, so floating IP-related API calls to Nova will -fail when your OpenStack deployment uses Quantum for networking. This means -that Horizon actions such as "allocate" and "associate" floating IPs will -not work either since they rely on the underlying APIs. - -Pagination ----------- - -A number of the "index" pages don't fully work with API pagination yet, -causing them to only display the first chunk of results returned by the API. -This number is often 1000 (as in the case of novaclient results), but does vary -somewhat. - -Deleting large numbers of resources simultaneously --------------------------------------------------- - -Using the "select all" checkbox to delete large numbers of resources via the -API can cause network timeouts (depending on configuration). This is -due to the APIs not supporting bulk-deletion natively, and consequently Horizon -has to send requests to delete each resource individually behind the scenes. - -Backwards Compatibility -======================= - -The Folsom Horizon release should be fully-compatible with both Folsom and -Essex versions of the rest of the OpenStack core projects (Nova, Swift, etc.). -While some features work significantly better with an all-Folsom stack due -to bugfixes, etc. in underlying services, there should not be any limitations -on what will or will not function. (Note: Quantum was not a core OpenStack -project in Essex, and thus this statement does not apply to network management.) - -In terms of APIs provided for extending Horizon, there are a handful of -backwards-incompatible changes that were made: - -* The ``can_haz`` and ``can_haz_list`` template filters have been renamed - to ``has_permissions`` and ``has_permissions_on_list`` respectively. - -* The dashboard-specific ``base.html`` templates (e.g. ``nova/base.html``, - ``syspanel/base.html``, etc.) have been removed in favor of a single - ``base.html`` template. - -* In conjunction with the previous item, the dashboard-specific template blocks - (e.g. ``nova_main``, ``syspanel_main``, etc.) have been removed in favor of - a single ``main`` template block. - -Overall, though, great effort has been made to maintain compatibility for -third-party developers who may have built on Horizon so far. \ No newline at end of file diff --git a/doc/source/releases/2013_1.rst b/doc/source/releases/2013_1.rst deleted file mode 100644 index 330a6ae26..000000000 --- a/doc/source/releases/2013_1.rst +++ /dev/null @@ -1,274 +0,0 @@ -======================== -Horizon 2013.1 "Grizzly" -======================== - -Release Overview -================ - -The Grizzly release cycle saw sweeping improvements to overall user experience, -huge stability improvements, lots of new networking, instance management and -image management features, a long-needed architectural clarification, and big -increases in community engagement! Read on to get the specifics. - -Highlights -========== - -New Features ------------- - -Networking -~~~~~~~~~~ - -Quantum added a huge number of new features in Grizzly, including L3 support -(routers), load balancers, network topology infographics, better compatibility -with Nova networking APIs (VNIC ordering when launching an instance; security -groups and floating IP integration) and vastly improved informational displays. - -Direct Image Upload To Glance -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is now possible (though there are numerous deployment/security implications) -to upload an image file directly from a user's hard disk to Glance through -Horizon. For multi-GB images it is still strongly recommended that the upload -be done using the Glance CLI. Further improvements to this feature will come in -future releases. - -Flavor Extra Specs Support -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In Folsom, Nova added support for "extra specs" on flavors--additional metadata -which custom schedulers could use for appropriately scheduling instances. As of -the Grizzly release, Horizon now supports reading and writing that data on any -flavor. - -Migrate Instance -~~~~~~~~~~~~~~~~ - -Administrators now have the ability to migrate an instance off of its current -host via the Admin dashboard's Instances panel. - - -User Experience Improvements ----------------------------- - -"Not Authorized" & Being Logged Out -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A shocking number of the problems first-time deployers of OpenStack have can be -summarized as "I thought I set everything up, then I tried to log into the -dashboard and I was immediately logged back out." The root cause of this was -that in an effort to be as secure as possible any 401 or 403 response from -any service API was being treated the same as if it was an attempt to access -an unauthorized portion of Horizon, and the user was summarily logged out with -little to no information as to why. - -In Grizzly we have instead chosen to improve this by treating service API -401 and 403 errors as slightly less severe than unauthorized access attempts -to resitricted areas of Horizon. The reason for this is threefold: - -#. For a non-malicious user these errors are almost 100% the result of - misconfiguration and this makes debugging possible. -#. A malicious user can make the exact same "unauthorized" requests via the - CLI as they can via the dashboard; no special privileges are granted. -#. API errors are generated by external systems not under the purview of our - project and while we should attempt to respect and take appropriate action - on those errors, we should not do anything drastic or even potentially - destructive because of them. - -Going forward the user will not be logged out, but no information will be -populated on the page and they will be presented with error messages informing -them that they are unauthorized for the data they attempted to access. - -Reorganizations -~~~~~~~~~~~~~~~ - -A couple of long-standing user confusions were fixed in Grizzly. - -First off, the API Access panel (containing a user's API endpoints, rc files, -and EC2 credentials) was moved from Settings to the Access & Security section -of the Project dashboard. - -Second, the Default Quotas and Services panels (which were both strictly -informational) were combined into tabs in a single System Info panel to make -it clear that these panels are thematically related, and to create a home for -informational-only displays like these. - -One-click Floating IP Management -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A common complaint from users was that associating a floating IP to an -instance involved numerous clicks and form selections for something that -the majority of users had no knowledge of and didn't care about. As such, a -one-click "simple" floating IP association option has been created. For -deployments which only have a single floating IP pool, this allows users to -ignore explicit floating IP management and just click a button to associate -or disassociate a floating IP with an instance. - -Organized Images -~~~~~~~~~~~~~~~~ - -The Images table now has a new feature: predefined filters for seeing your own -images, images that have been shared with you, or public images. This makes -finding the image you're looking for a great deal easier and more pleasant. - -Security Group Rule Editing Improvements -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The security group rule editing experience has always been inherently very -complicated simply given the number of options and the very technical terms -involved. Moreover, the combined table-plus-form approach the OpenStack -Dashboard had taken only made the UX more frustrating for an already difficult -area. - -In Grizzly this has all been reworked to be signficantly simpler, and to -provide as much contextual help and streamlining as possible. - -Icons! -~~~~~~ - -In an effort to make the dashboard more at-a-glance usable, we've added icons -to most of the common action buttons throughout the dashboard. - -"More Actions", More Better -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Lots of feedback came in that the "more actions" dropdown menu (for tables with -numerous actions available on each row) was confusing to new users and/or -difficult to click. - -We've now improved it so that the button to open the menu is clearly labeled -and the hitbox for clicking it is significantly larger. - - -Community ---------- - -Docs, docs, and more docs! -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Large amounts of new documentation was added during the Grizzly cycle, most -notably are sections documenting: all of the available settings for Horizon and -the OpenStack Dashboard; security and deployment considerations; and deeper -guides on customizing the OpenStack Dashboard. - -IRC Meeting -~~~~~~~~~~~ - -During the Grizzly cycle we started holding a weekly project meeting on IRC. -This has been extremely beneficial for the growth and progress of the project. -Check out the `OpenStack Meetings wiki page`_ for specifics. - -.. _Openstack Meetings wiki page: https://wiki.openstack.org/wiki/Meetings#Horizon_team_meeting - - -Under The Hood --------------- - -Legacy Dashboard Names & Code Separation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Very early in the Grizzly cycle we took the opportunity to do some longstanding -cleanup and refactoring work. The "nova" dashboard was renamed to "project" and -the "syspanel" dashboard was renamed to "admin" to better reflect their -respective purposes. - -Moreover, a better separation was created between code related to the core -Horizon framework code (which is not related to OpenStack specifically) and -the OpenStack Dashboard code. At this point *all* code related to OpenStack -lives in the OpenStack Dashboard directory, while the Horizon framework is -completely agnostic and is a reusable Django app. - -Object Storage Delimiters and Pseudo-folder Objects -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When Horizon's object storage interface was first added, Swift's documentation -recommended adding 0-byte objects with a special content type to denote -pseudo-folders within a container. They have since decided that this is not the -recommended practice, and that pseudo-folders should only be demarcated by -a delimiting character (usually "/") in the object name. - -Horizon has been updated under the hood to use this method, which should bring -it better into line with how most deployments are using their object storage. - - -Other Improvements and Fixes ----------------------------- - -* Support for Keystone's PKI tokens. - -* Flavor editing was made significantly more stable. - -* Security groups can be added to a running instance. - -* Volume quotas are handled by the appopriate service depending on whether - or not Cinder is enabled. - -* Password confirmation boxes are now validated for matching passwords on - the client side for more immediate feedback. - -* Numerous fixes to display more and better information for instances and - volumes in their overview pages. - -* Improved unicode support for the Object Storage panels. - -* Logout now attempts to delete the token(s) associated with the current - session to avoid replay attacks, etc. - -* Various fixes for browser compatibility and rendering. - -* Many, many other bugfixes and improvements. Check out Launchpad for the full - list of what went on in Grizzly. - - -Known Issues and Limitations -============================ - -Editing a Flavor Which Results In An API Error Will Delete The Flavor ---------------------------------------------------------------------- - -Due to the way that Nova handles flavor editing/replacement it is necessary -to delete the old flavor before creating the replacement flavor. As such, -if an API error occurs while creating the replacement it is possible to -lose the old flavor without the new one being created. - -Creating Rich Network Topologies --------------------------------- - -Due to several Quantum features landing very late in the Grizzly cycle, it -is not possible to create particularly complex networking configurations -through the OpenStack Dashboard. These features will continue to grow -throughout future releases. - -Loadbalancer Feature --------------------- - -The Loadbalancer feature landed in the 11th hour for both Quantum and Horizon -and, though we did our best to test it, may still contain undiscovered bugs. It -is best considered a "beta" or "experimental" feature for the Grizzly release. - -Quantum Brocade Plugin Not Compatible -------------------------------------- - -The Brocade plugin for Quantum does not support key features of the floating -IP addresses API which are considered central to Horizon's functionality. As -such, it is not compatible with the Grizzly release's Quantum integration. - -Deleting large numbers of resources simultaneously --------------------------------------------------- - -Using the "select all" checkbox to delete large numbers of resources via the -API can cause network timeouts (depending on configuration). This is -due to the APIs not supporting bulk-deletion natively, and consequently Horizon -has to send requests to delete each resource individually behind the scenes. - -Backwards Compatibility -======================= - -The Grizzly Horizon release should be fully compatible with both Grizzly and -Folsom versions of the rest of the OpenStack core projects (Nova, Swift, etc.). -While some features work significantly better with an all-Grizzly stack due -to bugfixes, etc. in underlying services, there should not be limitations -on what will or will not function. - -Overall, great effort has been made to maintain compatibility for -third-party developers who may have built on Horizon so far. diff --git a/doc/source/testing.rst b/doc/source/testing.rst deleted file mode 100644 index d9362327e..000000000 --- a/doc/source/testing.rst +++ /dev/null @@ -1,41 +0,0 @@ -======================= -Horizon's tests and you -======================= - -How to run the tests -==================== - -Because Horizon is composed of both the ``horizon`` app and the -``openstack-dashboard`` reference project, there are in fact two sets of unit -tests. While they can be run individually without problem, there is an easier -way: - -Included at the root of the repository is the ``run_tests.sh`` script -which invokes both sets of tests, and optionally generates analyses on both -components in the process. This script is what what Jenkins uses to verify the -stability of the project, so you should make sure you run it and it passes -before you submit any pull requests/patches. - -To run the tests:: - - $ ./run_tests.sh - -It's also possible to :doc:`run a subset of unit tests`. - -.. seealso:: - - :doc:`ref/run_tests` - Full reference for the ``run_tests.sh`` script. - -Writing tests -============= - -Horizon uses Django's unit test machinery (which extends Python's ``unittest2`` -library) as the core of its test suite. As such, all tests for the Python code -should be written as unit tests. No doctests please. - -In general new code without unit tests will not be accepted, and every bugfix -*must* include a regression test. - -For a much more in-depth discussion of testing, see the :doc:`testing topic -guide `. diff --git a/doc/source/topics/customizing.rst b/doc/source/topics/customizing.rst deleted file mode 100644 index 474f778ef..000000000 --- a/doc/source/topics/customizing.rst +++ /dev/null @@ -1,137 +0,0 @@ -=================== -Customizing Horizon -=================== - -Changing the Site Title -======================= - -The OpenStack Dashboard Site Title branding (i.e. "**OpenStack** Dashboard") -can be overwritten by adding the attribute ``SITE_BRANDING`` -to ``local_settings.py`` with the value being the desired name. - -The file ``local_settings.py`` can be found at the Horizon directory path of -``horizon/openstack-dashboard/local/local_settings.py``. - -Changing the Logo -================= - -The OpenStack Logo is pulled in through ``style.css``:: - - #splash .modal { - background: #fff url(../images/logo.png) no-repeat center 35px; - - h1.brand a { - background: url(../images/logo.png) top left no-repeat; - -To override the OpenStack Logo image, replace the image at the directory path -``horizon/openstack-dashboard/dashboard/static/dashboard/images/logo.png``. - -The dimensions should be ``width: 108px, height: 121px``. - -Modifying Existing Dashboards and Panels -======================================== - -If you wish to alter dashboards or panels which are not part of your codebase, -you can specify a custom python module which will be loaded after the entire -Horizon site has been initialized, but prior to the URLconf construction. -This allows for common site-customization requirements such as: - -* Registering or unregistering panels from an existing dashboard. -* Changing the names of dashboards and panels. -* Re-ordering panels within a dashboard or panel group. - -To specify the python module containing your modifications, add the key -``customization_module`` to your ``settings.HORIZON_CONFIG`` dictionary. -The value should be a string containing the path to your module in dotted -python path notation. Example:: - - HORIZON_CONFIG = { - "customization_module": "my_project.overrides" - } - -You can do essentially anything you like in the customization module. For -example, you could change the name of a panel:: - - from django.utils.translation import ugettext_lazy as _ - - import horizon - - # Rename "User Settings" to "User Options" - settings = horizon.get_dashboard("settings") - user_panel = settings.get_panel("user") - user_panel.name = _("User Options") - -Or get the instances panel:: - - projects_dashboard = horizon.get_dashboard("project") - instances_panel = projects_dashboard.get_panel("instances") - -And limit access to users with the Keystone Admin role:: - - permissions = list(getattr(instances_panel, 'permissions', [])) - permissions.append('openstack.roles.admin') - instances_panel.permissions = tuple(permissions) - -Or just remove it entirely:: - - projects_dashboard.unregister(instances_panel.__class__) - -.. NOTE:: - - ``my_project.overrides`` needs to be importable by the python process running - Horizon. - If your module is not installed as a system-wide python package, - you can either make it installable (e.g., with a setup.py) - or you can adjust the python path used by your WSGI server to include its location. - - Probably the easiest way is to add a ``python-path`` argument to - the ``WSGIDaemonProcess`` line in Apache's Horizon config. - - Assuming your ``my_project`` module lives in ``/opt/python/my_project``, - you'd make it look like the following:: - - WSGIDaemonProcess [... existing options ...] python-path=/opt/python - - -Button Icons -============ - -Horizon provides hooks for customizing the look and feel of each class of -button on the site. The following classes are used to identify each type of -button: - -* Generic Classes - * btn-search - * btn-delete - * btn-upload - * btn-download - * btn-create - * btn-edit - * btn-list - * btn-copy - * btn-camera - * btn-stats - * btn-enable - * btn-disable - -* Floating IP-specific Classes - * btn-allocate - * btn-release - * btn-associate - * btn-disassociate - -* Instance-specific Classes - * btn-launch - * btn-terminate - * btn-reboot - * btn-pause - * btn-suspend - * btn-console - * btn-log - -* Volume-specific classes - * btn-detach - -Additionally, the site-wide default button classes can be configured by -setting ``ACTION_CSS_CLASSES`` to a tuple of the classes you wish to appear -on all action buttons in your ``local_settings.py`` file. diff --git a/doc/source/topics/deployment.rst b/doc/source/topics/deployment.rst deleted file mode 100644 index f40913d6b..000000000 --- a/doc/source/topics/deployment.rst +++ /dev/null @@ -1,217 +0,0 @@ -================= -Deploying Horizon -================= - -This guide aims to cover some common questions, concerns and pitfalls you -may encounter when deploying Horizon in a production environment. - -.. seealso:: :doc:`settings` - -.. note:: - - The Service Catalog returned by the Identity Service after a user - has successfully authenticated determines the dashboards and panels - that will be available within the OpenStack Dashboard. If you are not - seeing a particular service you expected (e.g. Object Storage/Swift or - Networking/Neutron) make sure your Service Catalog is configured correctly. - - Prior to the Essex release of Horizon these features were controlled by - individual settings in the ``local_settings.py`` file. This code has been - long-since removed and those pre-Essex settings have no impact now. - -Configure Your Identity Service Host -==================================== - -The one thing you *must* do in order to run Horizon is to specify the -host for your OpenStack Identity Service endpoint. To do this, set the value -of the ``OPENSTACK_HOST`` settings in your ``local_settings.py`` file. - -Logging -======= - -Logging is an important concern for production deployments, and the intricacies -of good logging configuration go far beyond what can be covered here. However -there are a few points worth noting about the logging included with Horizon, -how to customize it, and where other components may take over: - -* Horizon's logging uses Django's logging configuration mechanism, which - can be customized in your ``local_settings.py`` file through the - ``LOGGING`` dictionary. -* Horizon's default logging example sets the log level to ``"INFO"``, which is - a reasonable choice for production deployments. For development, however, - you may want to change the log level to ``"DEBUG"``. -* Horizon also uses a number of 3rd-party clients which log separately. The - log level for these can still be controlled through Horizon's ``LOGGING`` - config, however behaviors may vary beyond Horizon's control. -* For more information regarding configuring logging in Horizon, please - read the `Django logging directive`_ and the `Python logging directive`_ - documentation. Horizon is built on Python and Django. - -.. _Django logging directive: https://docs.djangoproject.com/en/1.5/topics/logging -.. _Python logging directive: http://docs.python.org/2/library/logging.html - -.. warning:: - - At this time there is `a known bug in python-keystoneclient`_ where it will - log the complete request body of any request sent to Keystone through it - (including logging passwords in plain text) when the log level is set to - ``"DEBUG"``. If this behavior is not desired, make sure your log level is - ``"INFO"`` or higher. - -.. _a known bug in python-keystoneclient: https://bugs.launchpad.net/keystone/+bug/1004114 - -File Uploads -============ - -Horizon allows users to upload files via their web browser to other OpenStack -services such as Glance and Swift. Files uploaded through this mechanism are -first stored on the Horizon server before being forwarded on - files are not -uploaded directly or streamed as Horizon receives them. As Horizon itself does -not impose any restrictions on the size of file uploads, production deployments -will want to consider configuring their server hosting the Horizon application -to enforce such a limit to prevent large uploads exhausting system resources -and disrupting services. Deployments using Apache2 can use the -`LimitRequestBody directive`_ to achieve this. - -Uploads to the Glance image store service tend to be particularly large - in -the order of hundreds of megabytes to multiple gigabytes. Deployments are able -to disable the ability to upload images through Horizon by setting -``HORIZON_IMAGES_ALLOW_UPLOAD`` to ``False`` in your ``local_settings.py`` -file. - - .. _LimitRequestBody directive: http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody - -Session Storage -=============== - -Horizon uses `Django's sessions framework`_ for handling user session data; -however that's not the end of the story. There are numerous session backends -available, which are controlled through the ``SESSION_ENGINE`` setting in -your ``local_settings.py`` file. What follows is a quick discussion of the -pros and cons of each of the common options as they pertain to deploying -Horizon specifically. - -.. _Django's sessions framework: https://docs.djangoproject.com/en/dev/topics/http/sessions/ - -Local Memory Cache ------------------- - -Enabled by:: - - SESSION_ENGINE = 'django.contrib.sessions.backends.cache' - CACHES = { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache' - } - -Local memory storage is the quickest and easiest session backend to set up, -as it has no external dependencies whatsoever. However, it has two significant -drawbacks: - - * No shared storage across processes or workers. - * No persistence after a process terminates. - -The local memory backend is enabled as the default for Horizon solely because -it has no dependencies. It is not recommended for production use, or even for -serious development work. For better options, read on. - -Memcached ---------- - -Enabled by:: - - SESSION_ENGINE = 'django.contrib.sessions.backends.cache' - CACHES = { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache' - 'LOCATION': 'my_memcached_host:11211', - } - -External caching using an application such as memcached offers persistence -and shared storage, and can be very useful for small-scale deployment and/or -development. However, for distributed and high-availability scenarios -memcached has inherent problems which are beyond the scope of this -documentation. - -Memcached is an extremely fast and efficient cache backend for cases where it -fits the deployment need. But it's not appropriate for all scenarios. - -Requirements: - - * Memcached service running and accessible. - * Python memcached module installed. - -Database --------- - -Enabled by:: - - SESSION_ENGINE = 'django.core.cache.backends.db.DatabaseCache' - DATABASES = { - 'default': { - # Databe configuration here - } - } - -Database-backed sessions are scalable (using an appropriate database strategy), -persistent, and can be made high-concurrency and highly-available. - -The downside to this approach is that database-backed sessions are one of the -slower session storages, and incur a high overhead under heavy usage. Proper -configuration of your database deployment can also be a substantial -undertaking and is far beyond the scope of this documentation. - -Cached Database ---------------- - -To mitigate the performance issues of database queries, you can also consider -using Django's ``cached_db`` session backend which utilizes both your database -and caching infrastructure to perform write-through caching and efficient -retrieval. You can enable this hybrid setting by configuring both your database -and cache as discussed above and then using:: - - SESSION_ENGINE = "django.contrib.sessions.backends.cached_db" - -Cookies -------- - -If you're using Django 1.4 or later, a new session backend is available to you -which avoids server load and scaling problems: the ``signed_cookies`` backend! - -This backend stores session data in a cookie which is stored by the -user's browser. The backend uses a cryptographic signing technique to ensure -session data is not tampered with during transport (**this is not the same -as encryption, session data is still readable by an attacker**). - -The pros of this session engine are that it doesn't require any additional -dependencies or infrastructure overhead, and it scales indefinitely as long -as the quantity of session data being stored fits into a normal cookie. - -The biggest downside is that it places session data into storage on the user's -machine and transports it over the wire. It also limits the quantity of -session data which can be stored. - -For a thorough discussion of the security implications of this session backend, -please read the `Django documentation on cookie-based sessions`_. - -.. _Django documentation on cookie-based sessions: https://docs.djangoproject.com/en/dev/topics/http/sessions/#using-cookie-based-sessions - -Secure Site Recommendations ---------------------------- - -When implementing Horizon for public usage, with the website served through -HTTPS, it is recommended that the following settings are applied. - -To help protect the session cookies from `cross-site scripting`_, add the -following to ``local_settings.py`` : - - CSRF_COOKIE_SECURE = True - SESSION_COOKIE_SECURE = True - SESSION_COOKIE_HTTPONLY = True - -Note that the CSRF_COOKIE_SECURE option is only available from Django 1.4. It -does no harm to have the setting in earlier versions, but it does not take effect. - -You can also disable `browser autocompletion`_ for the authentication form by -changing the ``password_autocomplete`` attribute to ``off`` in ``horizon/conf/default.py`` - -.. _cross-site scripting: https://www.owasp.org/index.php/HttpOnly -.. _browser autocompletion: https://wiki.mozilla.org/The_autocomplete_attribute_and_web_documents_using_XHTML diff --git a/doc/source/topics/settings.rst b/doc/source/topics/settings.rst deleted file mode 100644 index a1777c119..000000000 --- a/doc/source/topics/settings.rst +++ /dev/null @@ -1,294 +0,0 @@ -================================== -Horizon Settings and Configuration -================================== - -Introduction -============ - -Horizon's settings tend to fall into three categories: - -* Horizon configuration options (contained in the ``HORIZON_CONFIG`` dict) - which are not OpenStack-specific and pertain only to the core framework. -* OpenStack-related settings which pertain to other projects/services and - are generally prefixed with ``OPENSTACK_`` in the settings file. -* Django settings (including common plugins like ``django-compressor``) which - can be (and should be) read about in their respective documentation. - -What follows is an overview of the Horizon and OpenStack-specific settings -and a few notes on the Django-related settings. - -.. note:: - - Prior to the Essex release of Horizon there were settings which controlled - whether features such as Object Storage/Swift or Networking/Neutron would be - enabled in the OpenStack Dashboard. This code has beenlong-since removed and - those pre-Essex settings have no impact now. - - In Essex and later, the Service Catalog returned by the Identity Service - after a user has successfully authenticated determines the dashboards and - panels that will be available within the OpenStack Dashboard. If you are not - seeing a particular service you expected make sure your Service Catalog is - configured correctly. - -Horizon Settings -================ - -The following options are available in order to configure/customize the -behavior of your Horizon installation. All of them are contained in the -``HORIZON_CONFIG`` dictionary. - -``dashboards`` --------------- - -Default: ``None`` - -A list containing the slugs of any dashboards which should be active in this -Horizon installation. The dashboards listed must be in a Python module which -is included in the ``INSTALLED_APPS`` list and on the Python path. - -``default_dashboard`` ---------------------- - -Default: ``None`` - -The slug of the dashboard which should act as the first-run/fallback dashboard -whenever a user logs in or is otherwise redirected to an ambiguous location. - -``user_home`` -------------- - -Default: ``settings.LOGIN_REDIRECT_URL`` - -This can be either a literal URL path (such as the default), or Python's -dotted string notation representing a function which will evaluate what URL -a user should be redirected to based on the attributes of that user. - -``ajax_queue_limit`` --------------------- - -Default: ``10`` - -The maximum number of simultaneous AJAX connections the dashboard may try -to make. This is particularly relevant when monitoring a large number of -instances, volumes, etc. which are all actively trying to update/change state. - -``ajax_poll_interval`` ----------------------- - -Default: ``2500`` - -How frequently resources in transition states should be polled for updates, -expressed in milliseconds. - -``help_url`` ------------- - -Default: None - -If provided, a "Help" link will be displayed in the site header which links -to the value of this settings (ideally a URL containing help information). - -``exceptions`` --------------- - -Default: ``{'unauthorized': [], 'not_found': [], 'recoverable': []}`` - -A dictionary containing classes of exceptions which Horizon's centralized -exception handling should be aware of. - -``password_validator`` ----------------------- - -Default: {'regex': '.*', 'help_text': _("Password is not accepted")} - -A dictionary containing a regular expression which will be used for password -validation and help text which will be displayed if the password does not -pass validation. The help text should describe the password requirements if -there are any. - -This setting allows you to set rules for passwords if your organization -requires them. - -``password_autocomplete`` -------------------------- - -Default: ``"on"`` - -Controls whether browser autocompletion should be enabled on the login form. -Valid values are ``"on"`` and ``"off"``. - -``simple_ip_management`` ------------------------- - -Default: ``True`` - -Enable or disable simplified floating IP address management. - -"Simple" floating IP address management means that the user does not ever have -to select the specific IP addresses they wish to use, and the process of -allocating an IP and assigning it to an instance is one-click. - -The "advanced" floating IP management allows users to select the floating IP -pool from which the IP should be allocated and to select a specific IP address -when associating one with an instance. - - -OpenStack Settings -================== - -The following settings inform the OpenStack Dashboard of information about the -other OpenStack projects which are part of this cloud and control the behavior -of specific dashboards, panels, API calls, etc. - -``OPENSTACK_HOST`` ------------------- - -Default: ``"127.0.0.1"`` - -The hostname of the Keystone server used for authentication if you only have -one region. This is often the *only* settings that needs to be set for a -basic deployment. - - -``OPENSTACK_KEYSTONE_URL`` --------------------------- - -Default: ``"http://%s:5000/v2.0" % OPENSTACK_HOST`` - -The full URL for the Keystone endpoint used for authentication. Unless you -are using HTTPS, running your Keystone server on a nonstandard port, or using -a nonstandard URL scheme you shouldn't need to touch this setting. - -``AVAILABLE_REGIONS`` ---------------------- - -Default: ``None`` - -A tuple of tuples which define multiple regions. The tuple format is -``('http://{{keystone_host}}:5000/v2.0', '{{region_name}}')``. If any regions -are specified the login form will have a dropdown selector for authenticating -to the appropriate region, and there will be a region switcher dropdown in -the site header when logged in. - -If you do not have multiple regions you should use the ``OPENSTACK_HOST`` and -``OPENSTACK_KEYSTONE_URL`` settings above instead. - -``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` ------------------------------------ - -Default: "Member" - -The name of the role which will be assigned to a user when added to a project. -This name must correspond to a role name in Keystone. - -``OPENSTACK_SSL_NO_VERIFY`` ---------------------------- - -Default: ``False`` - -Disable SSL certificate checks in the OpenStack clients (useful for self-signed -certificates). - -``OPENSTACK_KEYSTONE_BACKEND`` ------------------------------- - -Default: ``{'name': 'native', 'can_edit_user': True, 'can_edit_project': True}`` - -A dictionary containing settings which can be used to identify the -capabilities of the auth backend for Keystone. - -If Keystone has been configured to use LDAP as the auth backend then set -``can_edit_user`` and ``can_edit_project`` to ``False`` and name to ``"ldap"``. - - -``OPENSTACK_HYPERVISOR_FEATURES`` ---------------------------------- - -Default: ``{'can_set_mount_point': True, 'can_encrypt_volumes': False}`` - -A dictionary containing settings which can be used to identify the -capabilities of the hypervisor for Nova. - -Some hypervisors have the ability to set the mount point for volumes attached -to instances (KVM does not). Setting ``can_set_mount_point`` to ``False`` will -remove the option to set the mount point from the UI. - -In the Havana release, there will be a feature for encrypted volumes -which will be controlled by the ``can_encrypt_volumes``. Setting it to ``True`` -in the Grizzly release will have no effect. - -``OPENSTACK_NEUTRON_NETWORK`` ------------------------------ - -Default: ``{'enable_lb': False}`` - -A dictionary of settings which can be used to enable optional services provided -by neutron. Currently only the load balancer service is available. - -``OPENSTACK_ENDPOINT_TYPE`` ---------------------------- - -Default: ``"internalURL"`` - -A string which specifies the endpoint type to use for the endpoints in the -Keystone service catalog. If Horizon is running external to the OpenStack -environment you may wish to use ``"publicURL"`` instead. - -``API_RESULT_LIMIT`` --------------------- - -Default: ``1000`` - -The maximum number of objects (e.g. Swift objects or Glance images) to display -on a single page before providing a paging element (a "more" link) to paginate -results. - -``API_RESULT_PAGE_SIZE`` ------------------------- - -Default: ``20`` - -Similar to ``API_RESULT_LIMIT``. This setting currently only controls the -Glance image list page size. It will be removed in a future version. - -Django Settings (Partial) -========================= - -.. warning:: - - This is not meant to be anywhere near a complete list of settings for - Django. You should always consult the upstream documentation, especially - with regards to deployment considerations and security best-practices. - -There are a few key settings you should be aware of for development and the -most basic of deployments. Further recommendations can be found in the -Deploying Horizon section of this documentation. - -``DEBUG`` and ``TEMPLATE_DEBUG`` --------------------------------- - -Default: ``True`` - -Controls whether unhandled exceptions should generate a generic 500 response -or present the user with a pretty-formatted debug information page. - -This setting should **always** be set to ``False`` for production deployments -as the debug page can display sensitive information to users and attackers -alike. - -``SECRET_KEY`` --------------- - -This should absolutely be set to a unique (and secret) value for your -deployment. Unless you are running a load-balancer with multiple Horizon -installations behind it, each Horizon instance should have a unique secret key. - -The ``local_settings.py.example`` file includes a quick-and-easy way to -generate a secret key for a single installation. - -``SECURE_PROXY_SSL_HEADER``, ``CSRF_COOKIE_SECURE`` and ``SESSION_COOKIE_SECURE`` ---------------------------------------------------------------------------------- - -These three settings should be configured if you are deploying Horizon with -SSL. The values indicated in the default ``local_settings.py.example`` file -are generally safe to use. diff --git a/doc/source/topics/tables.rst b/doc/source/topics/tables.rst deleted file mode 100644 index b59dffb25..000000000 --- a/doc/source/topics/tables.rst +++ /dev/null @@ -1,129 +0,0 @@ -====================== -DataTables Topic Guide -====================== - -Horizon provides the :mod:`horizon.tables` module to provide -a convenient, reusable API for building data-driven displays and interfaces. -The core components of this API fall into three categories: ``DataTables``, -``Actions``, and ``Class-based Views``. - - .. seealso:: - - For a detailed API information check out the :doc:`DataTables Reference - Guide `. - -Tables -====== - -The majority of interface in a dashboard-style interface ends up being -tabular displays of the various resources the dashboard interacts with. -The :class:`~horizon.tables.DataTable` class exists so you don't have to -reinvent the wheel each time. - -Creating your own tables ------------------------- - -Creating a table is fairly simple: - - #. Create a subclass of :class:`~horizon.tables.DataTable`. - #. Define columns on it using :class:`~horizon.tables.Column`. - #. Create an inner ``Meta`` class to contain the special options for - this table. - #. Define any actions for the table, and add them to - :attr:`~horizon.tables.DataTableOptions.table_actions` or - :attr:`~horizon.tables.DataTableOptions.row_actions`. - -Examples of this can be found in any of the ``tables.py`` modules included -in the reference modules under ``horizon.dashboards``. - -Connecting a table to a view ----------------------------- - -Once you've got your table set up the way you like it, the next step is to -wire it up to a view. To make this as easy as possible Horizon provides the -:class:`~horizon.tables.DataTableView` class-based view which can be subclassed -to display your table with just a couple lines of code. At it's simplest it -looks like this:: - - from horizon import tables - from .tables import MyTable - - - class MyTableView(tables.DataTableView): - table_class = MyTable - template_name = "my_app/my_table_view.html" - - def get_data(self): - return my_api.objects.list() - -In the template you would just need to include the following to render the -table:: - - {{ table.render }} - -That's it! Easy, right? - -Actions -======= - -Actions comprise any manipulations that might happen on the data in the table -or the table itself. For example, this may be the standard object CRUD, linking -to related views based on the object's id, filtering the data in the table, -or fetching updated data when appropriate. - -When actions get run --------------------- - -There are two points in the request-response cycle in which actions can -take place; prior to data being loaded into the table, and after the data -is loaded. When you're using one of the pre-built class-based views for -working with your tables the pseudo-workflow looks like this: - - #. The request enters view. - #. The table class is instantiated without data. - #. Any "preemptive" actions are checked to see if they should run. - #. Data is fetched and loaded into the table. - #. All other actions are checked to see if they should run. - #. If none of the actions have caused an early exit from the view, - the standard response from the view is returned (usually the - rendered table). - -The benefit of the multi-step table instantiation is that you can use -preemptive actions which don't need access to the entire collection of data -to save yourself on processing overhead, API calls, etc. - -Basic actions -------------- - -At their simplest, there are three types of actions: actions which act on the -data in the table, actions which link to related resources, and actions that -alter which data is displayed. These correspond to -:class:`~horizon.tables.Action`, :class:`~horizon.tables.LinkAction`, and -:class:`~horizon.tables.FilterAction`. - -Writing your own actions generally starts with subclassing one of those -action classes and customizing the designated attributes and methods. - -Shortcut actions ----------------- - -There are several common tasks for which Horizon provides pre-built shortcut -classes. These include :class:`~horizon.tables.BatchAction`, and -:class:`~horizon.tables.DeleteAction`. Each of these abstracts away nearly -all of the boilerplate associated with writing these types of actions and -provides consistent error handling, logging, and user-facing interaction. - -It is worth noting that ``BatchAction`` and ``DeleteAction`` are extensions -of the standard ``Action`` class. - -Preemptive actions ------------------- - -Action classes which have their :attr:`~horizon.tables.Action.preempt` -attribute set to ``True`` will be evaluated before any data is loaded into -the table. As such, you must be careful not to rely on any table methods that -require data, such as :meth:`~horizon.tables.DataTable.get_object_display` or -:meth:`~horizon.tables.DataTable.get_object_by_id`. The advantage of preemptive -actions is that you can avoid having to do all the processing, API calls, etc. -associated with loading data into the table for actions which don't require -access to that information. diff --git a/doc/source/topics/testing.rst b/doc/source/topics/testing.rst deleted file mode 100644 index e8afb4d3b..000000000 --- a/doc/source/topics/testing.rst +++ /dev/null @@ -1,276 +0,0 @@ -=================== -Testing Topic Guide -=================== - -Having good tests in place is absolutely critical for ensuring a stable, -maintainable codebase. Hopefully that doesn't need any more explanation. - -However, what defines a "good" test is not always obvious, and there are -a lot of common pitfalls that can easily shoot your test suite in the -foot. - -If you already know everything about testing but are fed up with trying to -debug why a specific test failed, you can skip the intro and jump -stright to :ref:`debugging_unit_tests`. - -An overview of testing -====================== - -There are three main types of tests, each with their associated pros and cons: - -Unit tests ----------- - -These are isolated, stand-alone tests with no external dependencies. They are -written from the a perspective of "knowing the code", and test the assumptions -of the codebase and the developer. - -Pros: - -* Generally lightweight and fast. -* Can be run anywhere, anytime since they have no external dependencies. - -Cons: - -* Easy to be lax in writing them, or lazy in constructing them. -* Can't test interactions with live external services. - -Functional tests ----------------- - -These are generally also isolated tests, though sometimes they may interact -with other services running locally. The key difference between functional -tests and unit tests, however, is that functional tests are written from the -perspective of the user (who knows nothing about the code) and only knows -what they put in and what they get back. Essentially this is a higher-level -testing of "does the result match the spec?". - -Pros: - -* Ensures that your code *always* meets the stated functional requirements. -* Verifies things from an "end user" perspective, which helps to ensure - a high-quality experience. -* Designing your code with a functional testing perspective in mind helps - keep a higher-level viewpoint in mind. - -Cons: - -* Requires an additional layer of thinking to define functional requirements - in terms of inputs and outputs. -* Often requires writing a separate set of tests and/or using a different - testing framework from your unit tests. -* Don't offer any insight into the quality or status of the underlying code, - only verifies that it works or it doesn't. - -Integration Tests ------------------ - -This layer of testing involves testing all of the components that your -codebase interacts with or relies on in conjunction. This is equivalent to -"live" testing, but in a repeatable manner. - -Pros: - -* Catches *many* bugs that unit and functional tests will not. -* Doesn't rely on assumptions about the inputs and outputs. -* Will warn you when changes in external components break your code. - -Cons: - -* Difficult and time-consuming to create a repeatable test environment. -* Did I mention that setting it up is a pain? - -So what should I write? ------------------------ - -A few simple guidelines: - -#. Every bug fix should have a regression test. Period. - -#. When writing a new feature, think about writing unit tests to verify - the behavior step-by-step as you write the feature. Every time you'd - go to run your code by hand and verify it manually, think "could I - write a test to do this instead?". That way when the feature is done - and you're ready to commit it you've already got a whole set of tests - that are more thorough than anything you'd write after the fact. - -#. Write tests that hit every view in your application. Even if they - don't assert a single thing about the code, it tells you that your - users aren't getting fatal errors just by interacting with your code. - -What makes a good unit test? -============================ - -Limiting our focus just to unit tests, there are a number of things you can -do to make your unit tests as useful, maintainable, and unburdensome as -possible. - -Test data ---------- - -Use a single, consistent set of test data. Grow it over time, but do everything -you can not to fragment it. It quickly becomes unmaintainable and perniciously -out-of-sync with reality. - -Make your test data as accurate to reality as possible. Supply *all* the -attributes of an object, provide objects in all the various states you may want -to test. - -If you do the first suggestion above *first* it makes the second one far less -painful. Write once, use everywhere. - -To make your life even easier, if your codebase doesn't have a built-in -ORM-like function to manage your test data you can consider buidling (or -borrowing) one yourself. Being able to do simple retrieval queries on your -test data is incredibly valuable. - -Mocking -------- - -Mocking is the practice of providing stand-ins for objects or pieces of code -you don't need to test. While convenient, they should be used with *extreme* -caution. - -Why? Because overuse of mocks can rapidly land you in a situation where you're -not testing any real code. All you've done is verified that your mocking -framework returns what you tell it to. This problem can be very tricky to -recognize, since you may be mocking things in ``setUp`` methods, other modules, -etc. - -A good rule of thumb is to mock as close to the source as possible. If you have -a function call that calls an external API in a view , mock out the external -API, not the whole function. If you mock the whole function you've suddenly -lost test coverage for an entire chunk of code *inside* your codebase. Cut the -ties cleanly right where your system ends and the external world begins. - -Similarly, don't mock return values when you could construct a real return -value of the correct type with the correct attributes. You're just adding -another point of potential failure by exercising your mocking framework instead -of real code. Following the suggestions for testing above will make this a lot -less burdensome. - -Assertions and verification ---------------------------- - -Think long and hard about what you really want to verify in your unit test. In -particular, think about what custom logic your code executes. - -A common pitfall is to take a known test object, pass it through your code, -and then verify the properties of that object on the output. This is all well -and good, except if you're verifying properties that were untouched by your -code. What you want to check are the pieces that were *changed*, *added*, or -*removed*. Don't check the object's id attribute unless you have reason to -suspect it's not the object you started with. But if you added a new attribute -to it, be damn sure you verify that came out right. - -It's also very common to avoid testing things you really care about because -it's more difficult. Verifying that the proper messages were displayed to the -user after an action, testing for form errors, making sure exception handling -is tested... these types of things aren't always easy, but they're extremely -necessary. - -To that end, Horizon includes several custom assertions to make these tasks -easier. :meth:`~horizon.test.helpers.TestCase.assertNoFormErrors`, -:meth:`~horizon.test.helpers.TestCase.assertMessageCount`, and -:meth:`~horizon.test.helpers.TestCase.asertNoMessages` all exist for exactly -these purposes. Moreover, they provide useful output when things go wrong so -you're not left scratching your head wondering why your view test didn't -redirect as expected when you posted a form. - -.. _debugging_unit_tests: - -Debugging Unit Tests -==================== - -Tips and tricks ---------------- - -#. Use :meth:`~horizon.test.helpers.TestCase.assertNoFormErrors` immediately - after your ``client.post`` call for tests that handle form views. This will - immediately fail if your form POST failed due to a validation error and - tell you what the error was. - -#. Use :meth:`~horizon.test.helpers.TestCase.assertMessageCount` and - :meth:`~horizon.test.helpers.TestCase.asertNoMessages` when a piece of code - is failing inexplicably. Since the core error handlers attach user-facing - error messages (and since the core logging is silenced during test runs) - these methods give you the dual benefit of verifying the output you expect - while clearly showing you the problematic error message if they fail. - -#. Use Python's ``pdb`` module liberally. Many people don't realize it works - just as well in a test case as it does in a live view. Simply inserting - ``import pdb; pdb.set_trace()`` anywhere in your codebase will drop the - interpreter into an interactive shell so you can explore your test - environment and see which of your assumptions about the code isn't, - in fact, flawlessly correct. - -Common pitfalls ---------------- - -There are a number of typical (and non-obvious) ways to break the unit tests. -Some common things to look for: - -#. Make sure you stub out the method exactly as it's called in the code - being tested. For example, if your real code calls - ``api.keystone.tenant_get``, stubbing out ``api.tenant_get`` (available - for legacy reasons) will fail. - -#. When defining the expected input to a stubbed call, make sure the - arguments are *identical*, this includes ``str`` vs. ``int`` differences. - -#. Make sure your test data are completely in line with the expected inputs. - Again, ``str`` vs. ``int`` or missing properties on test objects will - kill your tests. - -#. Make sure there's nothing amiss in your templates (particularly the - ``{% url %}`` tag and its arguments). This often comes up when refactoring - views or renaming context variables. It can easily result in errors that - you might not stumble across while clicking around the development server. - -#. Make sure you're not redirecting to views that no longer exist, e.g. - the ``index`` view for a panel that got combined (such as instances & - volumes). - -#. Make sure your mock calls are in order before calling ``mox.ReplayAll``. - The order matters. - -#. Make sure you repeat any stubbed out method calls that happen more than - once. They don't automatically repeat, you have to explicitly define them. - While this is a nuisance, it makes you acutely aware of how many API - calls are involved in a particular function. - -Understanding the output from ``mox`` -------------------------------------- - -Horizon uses ``mox`` as its mocking framework of choice, and while it -offers many nice features, its output when a test fails can be quite -mysterious. - -Unexpected Method Call -~~~~~~~~~~~~~~~~~~~~~~ - -This occurs when you stubbed out a piece of code, and it was subsequently -called in a way that you didn't specify it would be. There are two reasons -this tends to come up: - -#. You defined the expected call, but a subtle difference crept in. This - may be a string versus integer difference, a string versus unicode - difference, a slightly off date/time, or passing a name instead of an id. - -#. The method is actually being called *multiple times*. Since mox uses - a call stack internally, it simply pops off the expected method calls to - verify them. That means once a call is used once, it's gone. An easy way - to see if this is the case is simply to copy and paste your method call a - second time to see if the error changes. If it does, that means your method - is being called more times than you think it is. - -Expected Method Never Called -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This one is the opposite of the unexpected method call. This one means you -tol mox to expect a call and it didn't happen. This is almost always the -result of an error in the conditions of the test. Using the -:meth:`~horizon.test.helpers.TestCase.assertNoFormErrors` and -:meth:`~horizon.test.helpers.TestCase.assertMessageCount` will make it readily -apparent what the problem is in the majority of cases. If not, then use ``pdb`` -and start interrupting the code flow to see where things are getting off track. diff --git a/doc/source/topics/tutorial.rst b/doc/source/topics/tutorial.rst deleted file mode 100644 index 49083fcac..000000000 --- a/doc/source/topics/tutorial.rst +++ /dev/null @@ -1,556 +0,0 @@ -=================== -Building on Horizon -=================== - -This tutorial covers how to use the various components in Horizon to build -an example dashboard and panel with a data table and tabs. - -As an example, we'll build on the Nova instances API to create a new and novel -"visualizations" dashboard with a "flocking" panel that presents the instance -data in a different manner. - -You can find a reference implementation of the code being described here -on github at https://github.com/gabrielhurley/horizon_demo. - -.. note:: - - There are a variety of other resources which may be helpful to read first, - since this is a more advanced tutorial. For example, you may want to start - with the :doc:`Horizon quickstart guide ` or the - `Django tutorial`_. - - .. _Django tutorial: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ - - -Creating a dashboard -==================== - -.. note:: - - It is perfectly valid to create a panel without a dashboard, and - incorporate it into an existing dashboard. See the section - :ref:`overrides ` later in this document. - -The quick version ------------------ - -Horizon provides a custom management command to create a typical base -dashboard structure for you. The following command generates most of the -boilerplate code explained below:: - - ./run_tests.sh -m startdash visualizations - -It's still recommended that you read the rest of this section to understand -what that command creates and why. - -Structure ---------- - -The recommended structure for a dashboard (or panel) follows suit with the -typical Django application layout. We'll name our dashboard "visualizations":: - - visualizations - |--__init__.py - |--dashboard.py - |--templates/ - |--static/ - -The ``dashboard.py`` module will contain our dashboard class for use by -Horizon; the ``templates`` and ``static`` directories give us homes for our -Django template files and static media respectively. - -Within the ``static`` and ``templates`` directories it's generally good to -namespace your files like so:: - - templates/ - |--visualizations/ - static/ - |--visualizations/ - |--css/ - |--js/ - |--img/ - -With those files and directories in place, we can move on to writing our -dashboard class. - - -Defining a dashboard --------------------- - -A dashboard class can be incredibly simple (about 3 lines at minimum), -defining nothing more than a name and a slug:: - - import horizon - - class VizDash(horizon.Dashboard): - name = _("Visualizations") - slug = "visualizations" - -In practice, a dashboard class will usually contain more information, such as a -list of panels, which panel is the default, and any permissions required to -access this dashboard:: - - class VizDash(horizon.Dashboard): - name = _("Visualizations") - slug = "visualizations" - panels = ('flocking',) - default_panel = 'flocking' - permissions = ('openstack.roles.admin',) - -Building from that previous example we may also want to define a grouping of -panels which share a common theme and have a sub-heading in the navigation:: - - class InstanceVisualizations(horizon.PanelGroup): - slug = "instance_visualizations" - name = _("Instance Visualizations") - panels = ('flocking',) - - - class VizDash(horizon.Dashboard): - name = _("Visualizations") - slug = "visualizations" - panels = (InstanceVisualizations,) - default_panel = 'flocking' - permissions = ('openstack.roles.admin',) - -The ``PanelGroup`` can be added to the dashboard class' ``panels`` list -just like the slug of the panel can. - -Once our dashboard class is complete, all we need to do is register it:: - - horizon.register(VizDash) - -The typical place for that would be the bottom of the ``dashboard.py`` file, -but it could also go elsewhere, such as in an override file (see below). - - -Creating a panel -================ - -Now that we have our dashboard written, we can also create our panel. We'll -call it "flocking". - -.. note:: - - You don't need to write a custom dashboard to add a panel. The structure - here is for the sake of completeness in the tutorial. - -The quick version ------------------ - -Horizon provides a custom management command to create a typical base -panel structure for you. The following command generates most of the -boilerplate code explained below:: - - ./run_tests.sh -m startpanel flocking --dashboard=visualizations --target=auto - -The ``dashboard`` argument is required, and tells the command which dashboard -this panel will be registered with. The ``target`` argument is optional, and -respects ``auto`` as a special value which means that the files for the panel -should be created inside the dashboard module as opposed to the current -directory (the default). - -It's still recommended that you read the rest of this section to understand -what that command creates and why. - -Structure ---------- - -A panel is a relatively flat structure with the exception that templates -for a panel in a dashboard live in the dashboard's ``templates`` directory -rather than in the panel's ``templates`` directory. Continuing our -vizulaization/flocking example, let's see what the looks like:: - - # stand-alone panel structure - flocking/ - |--__init__.py - |--panel.py - |--urls.py - |--views.py - |--templates/ - |--flocking/ - |--index.html - - # panel-in-a-dashboard structure - visualizations/ - |--__init__.py - |--dashboard.py - |--flocking/ - |--__init__.py - |--panel.py - |--urls.py - |--views.py - |--templates/ - |--visualizations/ - |--flocking/ - |--index.html - -That follows standard Django namespacing conventions for apps and submodules -within apps. It also works cleanly with Django's automatic template discovery -in both cases. - -Defining a panel ----------------- - -The ``panel.py`` file referenced above has a special meaning. Within a -dashboard, any module name listed in the ``panels`` attribute on the -dashboard class will be auto-discovered by looking for ``panel.py`` file -in a corresponding directory (the details are a bit magical, but have been -thoroughly vetted in Django's admin codebase). - -Inside the ``panel.py`` module we define our ``Panel`` class:: - - class Flocking(horizon.Panel): - name = _("Flocking") - slug = 'flocking' - -Simple, right? Once we've defined it, we register it with the dashboard:: - - from visualizations import dashboard - - dashboard.VizDash.register(Flocking) - -Easy! There are more options you can set to customize the ``Panel`` class, but -it makes some intelligent guesses about what the defaults should be. - -URLs ----- - -One of the intelligent assumptions the ``Panel`` class makes is that it can -find a ``urls.py`` file in your panel directory which will define a view named -``index`` that handles the default view for that panel. This is what your -``urls.py`` file might look like:: - - from django.conf.urls.defaults import patterns, url - from .views import IndexView - - urlpatterns = patterns('', - url(r'^$', IndexView.as_view(), name='index') - ) - -There's nothing there that isn't 100% standard Django code. This example -(and Horizon in general) uses the class-based views introduced in Django 1.3 -to make code more reusable. Hence the view class is imported in the example -above, and the ``as_view()`` method is called in the URL pattern. - -This, of course, presumes you have a view class, and takes us into the meat -of writing a ``Panel``. - - -Tables, Tabs, and Views ------------------------ - -Now we get to the really exciting parts; everything before this was structural. - -Starting with the high-level view, our end goal is to create a view (our -``IndexView`` class referenced above) which uses Horizon's ``DataTable`` -class to display data and Horizon's ``TabGroup`` class to give us a -user-friendly tabbed interface in the browser. - -We'll start with the table, combine that with the tabs, and then build our -view from the pieces. - -Defining a table -~~~~~~~~~~~~~~~~ - -Horizon provides a :class:`~horizon.tables.DataTable` class which simplifies -the vast majority of displaying data to an end-user. We're just going to skim -the surface here, but it has a tremendous number of capabilities. - -In this case, we're going to be presenting data about tables, so let's start -defining our table (and a ``tables.py`` module:: - - from horizon import tables - - class FlockingInstancesTable(tables.DataTable): - host = tables.Column("OS-EXT-SRV-ATTR:host", verbose_name=_("Host")) - tenant = tables.Column('tenant_name', verbose_name=_("Tenant")) - user = tables.Column('user_name', verbose_name=_("user")) - vcpus = tables.Column('flavor_vcpus', verbose_name=_("VCPUs")) - memory = tables.Column('flavor_memory', verbose_name=_("Memory")) - age = tables.Column('age', verbose_name=_("Age")) - - class Meta: - name = "instances" - verbose_name = _("Instances") - -There are several things going on here... we created a table subclass, -and defined six columns on it. Each of those columns defines what attribute -it accesses on the instance object as the first argument, and since we like to -make everything translatable, we give each column a ``verbose_name`` that's -marked for translation. - -Lastly, we added a ``Meta`` class which defines some properties about our -table, notably it's (translatable) verbose name, and a semi-unique "slug"-like -name to identify it. - -.. note:: - - This is a slight simplification from the reality of how the instance - object is actually structured. In reality, accessing the flavor, tenant, - and user attributes on it requires an additional step. This code can be - seen in the example code available on github. - -Defining tabs -~~~~~~~~~~~~~ - -So we have a table, ready to receive our data. We could go straight to a view -from here, but we can think bigger. In this case we're also going to use -Horizon's :class:`~horizon.tabs.TabGroup` class. This gives us a clean, -no-fuss tabbed interface to display both our visualization and, optionally, -our data table. - -First off, let's make a tab for our visualization:: - - class VizTab(tabs.Tab): - name = _("Visualization") - slug = "viz" - template_name = "visualizations/flocking/_flocking.html" - - def get_context_data(self, request): - return None - -This is about as simple as you can get. Since our visualization will -ultiimately use AJAX to load it's data we don't need to pass any context -to the template, and all we need to define is the name and which template -it should use. - -Now, we also need a tab for our data table:: - - from .tables import FlockingInstancesTable - - class DataTab(tabs.TableTab): - name = _("Data") - slug = "data" - table_classes = (FlockingInstancesTable,) - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_instances_data(self): - try: - instances = utils.get_instances_data(self.tab_group.request) - except: - instances = [] - exceptions.handle(self.tab_group.request, - _('Unable to retrieve instance list.')) - return instances - -This tab gets a little more complicated. Foremost, it's a special type of -tab--one that handles data tables (and all their associated features)--and -it also uses the ``preload`` attribute to specify that this tab shouldn't -be loaded by default. It will instead be loaded via AJAX when someone clicks -on it, saving us on API calls in the vast majority of cases. - -Lastly, this code introduces the concept of error handling in Horizon. -The :func:`horizon.exceptions.handle` function is a centralized error -handling mechanism that takes all the guess-work and inconsistency out of -dealing with exceptions from the API. Use it everywhere. - -Tying it together in a view -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There are lots of pre-built class-based views in Horizon. We try to provide -starting points for all the common combinations of components. - -In this case we want a starting view type that works with both tabs and -tables... that'd be the :class:`~horizon.tabs.TabbedTableView` class. It takes -the best of the dynamic delayed-loading capabilities tab groups provide and -mixes in the actions and AJAX-updating that tables are capable of with almost -no work on the user's end. Let's see what the code would look like:: - - from .tables import FlockingInstancesTable - from .tabs import FlockingTabs - - class IndexView(tabs.TabbedTableView): - tab_group_class = FlockingTabs - table_class = FlockingInstancesTable - template_name = 'visualizations/flocking/index.html' - -That would get us 100% of the way to what we need if this particular -demo didn't involve an extra AJAX call to fetch back our visualization -data via AJAX. Because of that we need to override the class' ``get()`` -method to return the right data for an AJAX call:: - - from .tables import FlockingInstancesTable - from .tabs import FlockingTabs - - class IndexView(tabs.TabbedTableView): - tab_group_class = FlockingTabs - table_class = FlockingInstancesTable - template_name = 'visualizations/flocking/index.html' - - def get(self, request, *args, **kwargs): - if self.request.is_ajax() and self.request.GET.get("json", False): - try: - instances = utils.get_instances_data(self.request) - except: - instances = [] - exceptions.handle(request, - _('Unable to retrieve instance list.')) - data = json.dumps([i._apiresource._info for i in instances]) - return http.HttpResponse(data) - else: - return super(IndexView, self).get(request, *args, **kwargs) - -In this instance, we override the ``get()`` method such that if it's an -AJAX request and has the GET parameter we're looking for, it returns our -instance data in JSON format; otherwise it simply returns the view function -as per the usual. - -The template -~~~~~~~~~~~~ - -We need three templates here: one for the view, and one for each of our two -tabs. The view template (in this case) can inherit from one of the other -dashboards:: - - {% extends 'base.html' %} - {% load i18n %} - {% block title %}{% trans "Flocking" %}{% endblock %} - - {% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Flocking") %} - {% endblock page_header %} - - {% block main %} -
-
- {{ tab_group.render }} -
-
- {% endblock %} - -This gives us a custom page title, a header, and render our tab group provided -by the view. - -For the tabs, the one using the table is handled by a reusable template, -``"horizon/common/_detail_table.html"``. This is appropriate for any tab that -only displays a single table. - -The second tab is a bit of secret sauce for the visualization, but it's still -quite simple and can be investigated in the github example. - -The takeaway here is that each tab needs a template associated with it. - -With all our code in place, the only thing left to do is to integrated it into -our OpenStack Dashboard site. - -Setting up a project -==================== - -The vast majority of people will just customize the OpenStack Dashboard -example project that ships with Horizon. As such, this tutorial will -start from that and just illustrate the bits that can be customized. - -Structure ---------- - -A site built on Horizon takes the form of a very typical Django project:: - - site/ - |--__init__.py - |--manage.py - |--demo_dashboard/ - |--__init__.py - |--models.py # required for Django even if unused - |--settings.py - |--templates/ - |--static/ - -The key bits here are that ``demo_dashboard`` is on our python path, and that -the `settings.py`` file here will contain our customized Horizon config. - -The settings file ------------------ - -There are several key things you will generally want to customiz in your -site's settings file: specifying custom dashboards and panels, catching your -client's exception classes, and (possibly) specifying a file for advanced -overrides. - -Specifying dashboards -~~~~~~~~~~~~~~~~~~~~~ - -The most basic thing to do is to add your own custom dashboard using the -``HORIZON_CONFIG`` dictionary in the settings file:: - - HORIZON_CONFIG = { - 'dashboards': ('project', 'admin', 'settings',), - } - -Please note, the dashboards also must be added to settings.py:: - INSTALLED_APPS = ( - 'openstack_dashboard', - ... - 'horizon', - 'openstack_dashboard.dashboards.project', - 'openstack_dashboard.dashboards.admin', - 'openstack_dashboard.dashboards.settings', - ... - ) - -In this case, we've taken the default Horizon ``'dashboards'`` config and -added our ``visualizations`` dashboard to it. Note that the name here is the -name of the dashboard's module on the python path. It will find our -``dashboard.py`` file inside of it and load both the dashboard and its panels -automatically from there. - -Error handling -~~~~~~~~~~~~~~ - -Adding custom error handler for your API client is quite easy. While it's not -necessary for this example, it would be done by customizing the -``'exceptions'`` value in the ``HORIZON_CONFIG`` dictionary:: - - import my_api.exceptions as my_api - - 'exceptions': {'recoverable': [my_api.Error, - my_api.ClientConnectionError], - 'not_found': [my_api.NotFound], - 'unauthorized': [my_api.NotAuthorized]}, - -.. _overrides: - -Override file -~~~~~~~~~~~~~ - -The override file is the "god-mode" dashboard editor. The hook for this file -sits right between the automatic discovery mechanisms and the final setup -routines for the entire site. By specifying an override file you can alter -any behavior you like in existing code. This tutorial won't go in-depth, -but let's just say that with great power comes great responsibility. - -To specify am override file, you set the ``'customization_module'`` value in -the ``HORIZON_CONFIG`` dictionary to the dotted python path of your -override module:: - - HORIZON_CONFIG = { - 'customization_module': 'demo_dashboard.overrides' - } - -This file is capable of adding dashboards, adding panels to existing -dashboards, renaming existing dashboards and panels (or altering other -attributes on them), removing panels from existing dashboards, and so on. - -We could say more, but it only gets more dangerous... - -Conclusion -========== - -Sadly, the cake was a lie. The information in this "tutorial" was never -meant to leave you with a working dashboard. It's close. But there's -waaaaaay too much javascript involved in the visualization to cover it all -here, and it'd be irrelevant to Horizon anyway. - -If you want to see the finished product, check out the github example -referenced at the beginning of this tutorial. - -Clone the repository and simply run ``./run_tests.sh --runserver``. That'll -give you a 100% working dashboard that uses every technique in this tutorial. - -What you've learned here, however, is the fundamentals of almost everything -you need to know to start writing interfaces for your own project based on the -components Horizon provides. - -If you have questions, or feedback on how this tutorial could be improved, -please feel free to pass them along! diff --git a/horizon/__init__.py b/horizon/__init__.py deleted file mode 100644 index 7325d29d8..000000000 --- a/horizon/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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. - -""" The Horizon interface. - -Contains the core Horizon classes--:class:`~horizon.Dashboard` and -:class:`horizon.Panel`--the dynamic URLconf for Horizon, and common interface -methods like :func:`~horizon.register` and :func:`~horizon.unregister`. - -""" -# Because this module is compiled by setup.py before Django may be installed -# in the environment we try importing Django and issue a warning but move on -# should that fail. -Horizon = None -try: - from horizon.base import Dashboard - from horizon.base import Horizon - from horizon.base import Panel - from horizon.base import PanelGroup -except ImportError: - import warnings - - def simple_warn(message, category, filename, lineno, file=None, line=None): - return '%s: %s' % (category.__name__, message) - - msg = ("Could not import Horizon dependencies. " - "This is normal during installation.\n") - warnings.formatwarning = simple_warn - warnings.warn(msg, Warning) - -if Horizon: - register = Horizon.register - unregister = Horizon.unregister - get_absolute_url = Horizon.get_absolute_url - get_user_home = Horizon.get_user_home - get_dashboard = Horizon.get_dashboard - get_default_dashboard = Horizon.get_default_dashboard - get_dashboards = Horizon.get_dashboards - urls = Horizon._lazy_urls - -# silence flake8 about unused imports here: -assert Dashboard -assert Panel -assert PanelGroup diff --git a/horizon/base.py b/horizon/base.py deleted file mode 100644 index 326433941..000000000 --- a/horizon/base.py +++ /dev/null @@ -1,803 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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. - -""" -Contains the core classes and functionality that makes Horizon what it is. -This module is considered internal, and should not be relied on directly. - -Public APIs are made available through the :mod:`horizon` module and -the classes contained therein. -""" - -import collections -import copy -import inspect -import logging -import os - -from django.conf import settings -from django.conf.urls.defaults import include -from django.conf.urls.defaults import patterns -from django.conf.urls.defaults import url -from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse -from django.utils.datastructures import SortedDict -from django.utils.functional import SimpleLazyObject -from django.utils.importlib import import_module -from django.utils.module_loading import module_has_submodule -from django.utils.translation import ugettext_lazy as _ - -from horizon import conf -from horizon.decorators import _current_component -from horizon.decorators import require_auth -from horizon.decorators import require_perms -from horizon import loaders - - -LOG = logging.getLogger(__name__) - - -def _decorate_urlconf(urlpatterns, decorator, *args, **kwargs): - for pattern in urlpatterns: - if getattr(pattern, 'callback', None): - pattern._callback = decorator(pattern.callback, *args, **kwargs) - if getattr(pattern, 'url_patterns', []): - _decorate_urlconf(pattern.url_patterns, decorator, *args, **kwargs) - - -class NotRegistered(Exception): - pass - - -class HorizonComponent(object): - def __init__(self): - super(HorizonComponent, self).__init__() - if not self.slug: - raise ImproperlyConfigured('Every %s must have a slug.' - % self.__class__) - - def __unicode__(self): - name = getattr(self, 'name', u"Unnamed %s" % self.__class__.__name__) - return unicode(name) - - def _get_default_urlpatterns(self): - package_string = '.'.join(self.__module__.split('.')[:-1]) - if getattr(self, 'urls', None): - try: - mod = import_module('.%s' % self.urls, package_string) - except ImportError: - mod = import_module(self.urls) - urlpatterns = mod.urlpatterns - else: - # Try importing a urls.py from the dashboard package - if module_has_submodule(import_module(package_string), 'urls'): - urls_mod = import_module('.urls', package_string) - urlpatterns = urls_mod.urlpatterns - else: - urlpatterns = patterns('') - return urlpatterns - - -class Registry(object): - def __init__(self): - self._registry = {} - if not getattr(self, '_registerable_class', None): - raise ImproperlyConfigured('Subclasses of Registry must set a ' - '"_registerable_class" property.') - - def _register(self, cls): - """Registers the given class. - - If the specified class is already registered then it is ignored. - """ - if not inspect.isclass(cls): - raise ValueError('Only classes may be registered.') - elif not issubclass(cls, self._registerable_class): - raise ValueError('Only %s classes or subclasses may be registered.' - % self._registerable_class.__name__) - - if cls not in self._registry: - cls._registered_with = self - self._registry[cls] = cls() - - return self._registry[cls] - - def _unregister(self, cls): - """Unregisters the given class. - - If the specified class isn't registered, ``NotRegistered`` will - be raised. - """ - if not issubclass(cls, self._registerable_class): - raise ValueError('Only %s classes or subclasses may be ' - 'unregistered.' % self._registerable_class) - - if cls not in self._registry.keys(): - raise NotRegistered('%s is not registered' % cls) - - del self._registry[cls] - - return True - - def _registered(self, cls): - if inspect.isclass(cls) and issubclass(cls, self._registerable_class): - found = self._registry.get(cls, None) - if found: - return found - else: - # Allow for fetching by slugs as well. - for registered in self._registry.values(): - if registered.slug == cls: - return registered - class_name = self._registerable_class.__name__ - if hasattr(self, "_registered_with"): - parent = self._registered_with._registerable_class.__name__ - raise NotRegistered('%(type)s with slug "%(slug)s" is not ' - 'registered with %(parent)s "%(name)s".' - % {"type": class_name, - "slug": cls, - "parent": parent, - "name": self.slug}) - else: - slug = getattr(cls, "slug", cls) - raise NotRegistered('%(type)s with slug "%(slug)s" is not ' - 'registered.' % {"type": class_name, - "slug": slug}) - - -class Panel(HorizonComponent): - """ A base class for defining Horizon dashboard panels. - - All Horizon dashboard panels should extend from this class. It provides - the appropriate hooks for automatically constructing URLconfs, and - providing permission-based access control. - - .. attribute:: name - - The name of the panel. This will be displayed in the - auto-generated navigation and various other places. - Default: ``''``. - - .. attribute:: slug - - A unique "short name" for the panel. The slug is used as - a component of the URL path for the panel. Default: ``''``. - - .. attribute:: permissions - - A list of permission names, all of which a user must possess in order - to access any view associated with this panel. This attribute - is combined cumulatively with any permissions required on the - ``Dashboard`` class with which it is registered. - - .. attribute:: urls - - Path to a URLconf of views for this panel using dotted Python - notation. If no value is specified, a file called ``urls.py`` - living in the same package as the ``panel.py`` file is used. - Default: ``None``. - - .. attribute:: nav - .. method:: nav(context) - - The ``nav`` attribute can be either boolean value or a callable - which accepts a ``RequestContext`` object as a single argument - to control whether or not this panel should appear in - automatically-generated navigation. Default: ``True``. - - .. attribute:: index_url_name - - The ``name`` argument for the URL pattern which corresponds to - the index view for this ``Panel``. This is the view that - :meth:`.Panel.get_absolute_url` will attempt to reverse. - """ - name = '' - slug = '' - urls = None - nav = True - index_url_name = "index" - - def __repr__(self): - return "" % self.slug - - def get_absolute_url(self): - """ Returns the default URL for this panel. - - The default URL is defined as the URL pattern with ``name="index"`` in - the URLconf for this panel. - """ - try: - return reverse('horizon:%s:%s:%s' % (self._registered_with.slug, - self.slug, - self.index_url_name)) - except Exception as exc: - # Logging here since this will often be called in a template - # where the exception would be hidden. - LOG.info("Error reversing absolute URL for %s: %s" % (self, exc)) - raise - - @property - def _decorated_urls(self): - urlpatterns = self._get_default_urlpatterns() - - # Apply access controls to all views in the patterns - permissions = getattr(self, 'permissions', []) - _decorate_urlconf(urlpatterns, require_perms, permissions) - _decorate_urlconf(urlpatterns, _current_component, panel=self) - - # Return the three arguments to django.conf.urls.defaults.include - return urlpatterns, self.slug, self.slug - - -class PanelGroup(object): - """ A container for a set of :class:`~horizon.Panel` classes. - - When iterated, it will yield each of the ``Panel`` instances it - contains. - - .. attribute:: slug - - A unique string to identify this panel group. Required. - - .. attribute:: name - - A user-friendly name which will be used as the group heading in - places such as the navigation. Default: ``None``. - - .. attribute:: panels - - A list of panel module names which should be contained within this - grouping. - """ - def __init__(self, dashboard, slug=None, name=None, panels=None): - self.dashboard = dashboard - self.slug = slug or getattr(self, "slug", "default") - self.name = name or getattr(self, "name", None) - # Our panels must be mutable so it can be extended by others. - self.panels = list(panels or getattr(self, "panels", [])) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self.slug) - - def __unicode__(self): - return self.name - - def __iter__(self): - panel_instances = [] - for name in self.panels: - try: - panel_instances.append(self.dashboard.get_panel(name)) - except NotRegistered as e: - LOG.debug(e) - return iter(panel_instances) - - -class Dashboard(Registry, HorizonComponent): - """ A base class for defining Horizon dashboards. - - All Horizon dashboards should extend from this base class. It provides the - appropriate hooks for automatic discovery of :class:`~horizon.Panel` - modules, automatically constructing URLconfs, and providing - permission-based access control. - - .. attribute:: name - - The name of the dashboard. This will be displayed in the - auto-generated navigation and various other places. - Default: ``''``. - - .. attribute:: slug - - A unique "short name" for the dashboard. The slug is used as - a component of the URL path for the dashboard. Default: ``''``. - - .. attribute:: panels - - The ``panels`` attribute can be either a flat list containing the name - of each panel **module** which should be loaded as part of this - dashboard, or a list of :class:`~horizon.PanelGroup` classes which - define groups of panels as in the following example:: - - class SystemPanels(horizon.PanelGroup): - slug = "syspanel" - name = _("System Panel") - panels = ('overview', 'instances', ...) - - class Syspanel(horizon.Dashboard): - panels = (SystemPanels,) - - Automatically generated navigation will use the order of the - modules in this attribute. - - Default: ``[]``. - - .. warning:: - - The values for this attribute should not correspond to the - :attr:`~.Panel.name` attributes of the ``Panel`` classes. - They should be the names of the Python modules in which the - ``panel.py`` files live. This is used for the automatic - loading and registration of ``Panel`` classes much like - Django's ``ModelAdmin`` machinery. - - Panel modules must be listed in ``panels`` in order to be - discovered by the automatic registration mechanism. - - .. attribute:: default_panel - - The name of the panel which should be treated as the default - panel for the dashboard, i.e. when you visit the root URL - for this dashboard, that's the panel that is displayed. - Default: ``None``. - - .. attribute:: permissions - - A list of permission names, all of which a user must possess in order - to access any panel registered with this dashboard. This attribute - is combined cumulatively with any permissions required on individual - :class:`~horizon.Panel` classes. - - .. attribute:: urls - - Optional path to a URLconf of additional views for this dashboard - which are not connected to specific panels. Default: ``None``. - - .. attribute:: nav - - Optional boolean to control whether or not this dashboard should - appear in automatically-generated navigation. Default: ``True``. - - .. attribute:: supports_tenants - - Optional boolean that indicates whether or not this dashboard includes - support for projects/tenants. If set to ``True`` this dashboard's - navigation will include a UI element that allows the user to select - project/tenant. Default: ``False``. - - .. attribute:: public - - Boolean value to determine whether this dashboard can be viewed - without being logged in. Defaults to ``False``. - """ - _registerable_class = Panel - name = '' - slug = '' - urls = None - panels = [] - default_panel = None - nav = True - supports_tenants = False - public = False - - def __repr__(self): - return "" % self.slug - - def __init__(self, *args, **kwargs): - super(Dashboard, self).__init__(*args, **kwargs) - self._panel_groups = None - - def get_panel(self, panel): - """ - Returns the specified :class:`~horizon.Panel` instance registered - with this dashboard. - """ - return self._registered(panel) - - def get_panels(self): - """ - Returns the :class:`~horizon.Panel` instances registered with this - dashboard in order, without any panel groupings. - """ - all_panels = [] - panel_groups = self.get_panel_groups() - for panel_group in panel_groups.values(): - all_panels.extend(panel_group) - return all_panels - - def get_panel_group(self, slug): - return self._panel_groups[slug] - - def get_panel_groups(self): - registered = copy.copy(self._registry) - panel_groups = [] - - # Gather our known panels - if self._panel_groups is not None: - for panel_group in self._panel_groups.values(): - for panel in panel_group: - registered.pop(panel.__class__) - panel_groups.append((panel_group.slug, panel_group)) - - # Deal with leftovers (such as add-on registrations) - if len(registered): - slugs = [panel.slug for panel in registered.values()] - new_group = PanelGroup(self, - slug="other", - name=_("Other"), - panels=slugs) - panel_groups.append((new_group.slug, new_group)) - return SortedDict(panel_groups) - - def get_absolute_url(self): - """ Returns the default URL for this dashboard. - - The default URL is defined as the URL pattern with ``name="index"`` - in the URLconf for the :class:`~horizon.Panel` specified by - :attr:`~horizon.Dashboard.default_panel`. - """ - try: - return self._registered(self.default_panel).get_absolute_url() - except: - # Logging here since this will often be called in a template - # where the exception would be hidden. - LOG.exception("Error reversing absolute URL for %s." % self) - raise - - @property - def _decorated_urls(self): - urlpatterns = self._get_default_urlpatterns() - - default_panel = None - - # Add in each panel's views except for the default view. - for panel in self._registry.values(): - if panel.slug == self.default_panel: - default_panel = panel - continue - urlpatterns += patterns('', - url(r'^%s/' % panel.slug, include(panel._decorated_urls))) - # Now the default view, which should come last - if not default_panel: - raise NotRegistered('The default panel "%s" is not registered.' - % self.default_panel) - urlpatterns += patterns('', - url(r'', include(default_panel._decorated_urls))) - - # Require login if not public. - if not self.public: - _decorate_urlconf(urlpatterns, require_auth) - # Apply access controls to all views in the patterns - permissions = getattr(self, 'permissions', []) - _decorate_urlconf(urlpatterns, require_perms, permissions) - _decorate_urlconf(urlpatterns, _current_component, dashboard=self) - - # Return the three arguments to django.conf.urls.defaults.include - return urlpatterns, self.slug, self.slug - - def _autodiscover(self): - """ Discovers panels to register from the current dashboard module. """ - if getattr(self, "_autodiscover_complete", False): - return - - panels_to_discover = [] - panel_groups = [] - # If we have a flat iterable of panel names, wrap it again so - # we have a consistent structure for the next step. - if all([isinstance(i, basestring) for i in self.panels]): - self.panels = [self.panels] - - # Now iterate our panel sets. - for panel_set in self.panels: - # Instantiate PanelGroup classes. - if not isinstance(panel_set, collections.Iterable) and \ - issubclass(panel_set, PanelGroup): - panel_group = panel_set(self) - # Check for nested tuples, and convert them to PanelGroups - elif not isinstance(panel_set, PanelGroup): - panel_group = PanelGroup(self, panels=panel_set) - - # Put our results into their appropriate places - panels_to_discover.extend(panel_group.panels) - panel_groups.append((panel_group.slug, panel_group)) - - self._panel_groups = SortedDict(panel_groups) - - # Do the actual discovery - package = '.'.join(self.__module__.split('.')[:-1]) - mod = import_module(package) - for panel in panels_to_discover: - try: - before_import_registry = copy.copy(self._registry) - import_module('.%s.panel' % panel, package) - except: - self._registry = before_import_registry - if module_has_submodule(mod, panel): - raise - self._autodiscover_complete = True - - @classmethod - def register(cls, panel): - """ Registers a :class:`~horizon.Panel` with this dashboard. """ - panel_class = Horizon.register_panel(cls, panel) - # Support template loading from panel template directories. - panel_mod = import_module(panel.__module__) - panel_dir = os.path.dirname(panel_mod.__file__) - template_dir = os.path.join(panel_dir, "templates") - if os.path.exists(template_dir): - key = os.path.join(cls.slug, panel.slug) - loaders.panel_template_dirs[key] = template_dir - return panel_class - - @classmethod - def unregister(cls, panel): - """ Unregisters a :class:`~horizon.Panel` from this dashboard. """ - success = Horizon.unregister_panel(cls, panel) - if success: - # Remove the panel's template directory. - key = os.path.join(cls.slug, panel.slug) - if key in loaders.panel_template_dirs: - del loaders.panel_template_dirs[key] - return success - - -class Workflow(object): - def __init__(*args, **kwargs): - raise NotImplementedError() - - -try: - from django.utils.functional import empty -except ImportError: - #Django 1.3 fallback - empty = None - - -class LazyURLPattern(SimpleLazyObject): - def __iter__(self): - if self._wrapped is empty: - self._setup() - return iter(self._wrapped) - - def __reversed__(self): - if self._wrapped is empty: - self._setup() - return reversed(self._wrapped) - - def __len__(self): - if self._wrapped is empty: - self._setup() - return len(self._wrapped) - - def __getitem__(self, idx): - if self._wrapped is empty: - self._setup() - return self._wrapped[idx] - - -class Site(Registry, HorizonComponent): - """ The overarching class which encompasses all dashboards and panels. """ - - # Required for registry - _registerable_class = Dashboard - - name = "Horizon" - namespace = 'horizon' - slug = 'horizon' - urls = 'horizon.site_urls' - - def __repr__(self): - return u"" % self.slug - - @property - def _conf(self): - return conf.HORIZON_CONFIG - - @property - def dashboards(self): - return self._conf['dashboards'] - - @property - def default_dashboard(self): - return self._conf['default_dashboard'] - - def register(self, dashboard): - """ Registers a :class:`~horizon.Dashboard` with Horizon.""" - return self._register(dashboard) - - def unregister(self, dashboard): - """ Unregisters a :class:`~horizon.Dashboard` from Horizon. """ - return self._unregister(dashboard) - - def registered(self, dashboard): - return self._registered(dashboard) - - def register_panel(self, dashboard, panel): - dash_instance = self.registered(dashboard) - return dash_instance._register(panel) - - def unregister_panel(self, dashboard, panel): - dash_instance = self.registered(dashboard) - if not dash_instance: - raise NotRegistered("The dashboard %s is not registered." - % dashboard) - return dash_instance._unregister(panel) - - def get_dashboard(self, dashboard): - """ Returns the specified :class:`~horizon.Dashboard` instance. """ - return self._registered(dashboard) - - def get_dashboards(self): - """ Returns an ordered tuple of :class:`~horizon.Dashboard` modules. - - Orders dashboards according to the ``"dashboards"`` key in - ``HORIZON_CONFIG`` or else returns all registered dashboards - in alphabetical order. - - Any remaining :class:`~horizon.Dashboard` classes registered with - Horizon but not listed in ``HORIZON_CONFIG['dashboards']`` - will be appended to the end of the list alphabetically. - """ - if self.dashboards: - registered = copy.copy(self._registry) - dashboards = [] - for item in self.dashboards: - dashboard = self._registered(item) - dashboards.append(dashboard) - registered.pop(dashboard.__class__) - if len(registered): - extra = registered.values() - extra.sort() - dashboards.extend(extra) - return dashboards - else: - dashboards = self._registry.values() - dashboards.sort() - return dashboards - - def get_default_dashboard(self): - """ Returns the default :class:`~horizon.Dashboard` instance. - - If ``"default_dashboard"`` is specified in ``HORIZON_CONFIG`` - then that dashboard will be returned. If not, the first dashboard - returned by :func:`~horizon.get_dashboards` will be returned. - """ - if self.default_dashboard: - return self._registered(self.default_dashboard) - elif len(self._registry): - return self.get_dashboards()[0] - else: - raise NotRegistered("No dashboard modules have been registered.") - - def get_user_home(self, user): - """ Returns the default URL for a particular user. - - This method can be used to customize where a user is sent when - they log in, etc. By default it returns the value of - :meth:`get_absolute_url`. - - An alternative function can be supplied to customize this behavior - by specifying a either a URL or a function which returns a URL via - the ``"user_home"`` key in ``HORIZON_CONFIG``. Each of these - would be valid:: - - {"user_home": "/home",} # A URL - {"user_home": "my_module.get_user_home",} # Path to a function - {"user_home": lambda user: "/" + user.name,} # A function - {"user_home": None,} # Will always return the default dashboard - - This can be useful if the default dashboard may not be accessible - to all users. When user_home is missing from HORIZON_CONFIG, - it will default to the settings.LOGIN_REDIRECT_URL value. - """ - user_home = self._conf['user_home'] - if user_home: - if callable(user_home): - return user_home(user) - elif isinstance(user_home, basestring): - # Assume we've got a URL if there's a slash in it - if user_home.find("/") != -1: - return user_home - else: - mod, func = user_home.rsplit(".", 1) - return getattr(import_module(mod), func)(user) - # If it's not callable and not a string, it's wrong. - raise ValueError('The user_home setting must be either a string ' - 'or a callable object (e.g. a function).') - else: - return self.get_absolute_url() - - def get_absolute_url(self): - """ Returns the default URL for Horizon's URLconf. - - The default URL is determined by calling - :meth:`~horizon.Dashboard.get_absolute_url` - on the :class:`~horizon.Dashboard` instance returned by - :meth:`~horizon.get_default_dashboard`. - """ - return self.get_default_dashboard().get_absolute_url() - - @property - def _lazy_urls(self): - """ Lazy loading for URL patterns. - - This method avoids problems associated with attempting to evaluate - the the URLconf before the settings module has been loaded. - """ - def url_patterns(): - return self._urls()[0] - - return LazyURLPattern(url_patterns), self.namespace, self.slug - - def _urls(self): - """ Constructs the URLconf for Horizon from registered Dashboards. """ - urlpatterns = self._get_default_urlpatterns() - self._autodiscover() - - # Discover each dashboard's panels. - for dash in self._registry.values(): - dash._autodiscover() - - # Allow for override modules - if self._conf.get("customization_module", None): - customization_module = self._conf["customization_module"] - bits = customization_module.split('.') - mod_name = bits.pop() - package = '.'.join(bits) - mod = import_module(package) - try: - before_import_registry = copy.copy(self._registry) - import_module('%s.%s' % (package, mod_name)) - except: - self._registry = before_import_registry - if module_has_submodule(mod, mod_name): - raise - - # Compile the dynamic urlconf. - for dash in self._registry.values(): - urlpatterns += patterns('', - url(r'^%s/' % dash.slug, include(dash._decorated_urls))) - - # Return the three arguments to django.conf.urls.defaults.include - return urlpatterns, self.namespace, self.slug - - def _autodiscover(self): - """ Discovers modules to register from ``settings.INSTALLED_APPS``. - - This makes sure that the appropriate modules get imported to register - themselves with Horizon. - """ - if not getattr(self, '_registerable_class', None): - raise ImproperlyConfigured('You must set a ' - '"_registerable_class" property ' - 'in order to use autodiscovery.') - # Discover both dashboards and panels, in that order - for mod_name in ('dashboard', 'panel'): - for app in settings.INSTALLED_APPS: - mod = import_module(app) - try: - before_import_registry = copy.copy(self._registry) - import_module('%s.%s' % (app, mod_name)) - except: - self._registry = before_import_registry - if module_has_submodule(mod, mod_name): - raise - - -class HorizonSite(Site): - """ - A singleton implementation of Site such that all dealings with horizon - get the same instance no matter what. There can be only one. - """ - _instance = None - - def __new__(cls, *args, **kwargs): - if not cls._instance: - cls._instance = super(Site, cls).__new__(cls, *args, **kwargs) - return cls._instance - - -# The one true Horizon -Horizon = HorizonSite() diff --git a/horizon/browsers/__init__.py b/horizon/browsers/__init__.py deleted file mode 100644 index e6a2570d3..000000000 --- a/horizon/browsers/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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.browsers.base import ResourceBrowser -from horizon.browsers.views import ResourceBrowserView - -assert ResourceBrowser -assert ResourceBrowserView diff --git a/horizon/browsers/base.py b/horizon/browsers/base.py deleted file mode 100644 index 11bcd4462..000000000 --- a/horizon/browsers/base.py +++ /dev/null @@ -1,150 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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 import template -from django.utils.translation import ugettext_lazy as _ - -from horizon.browsers.breadcrumb import Breadcrumb -from horizon.tables import DataTable -from horizon.utils import html - - -class ResourceBrowser(html.HTMLElement): - """A class which defines a browser for displaying data. - - .. attribute:: name - - A short name or slug for the browser. - - .. attribute:: verbose_name - - A more verbose name for the browser meant for display purposes. - - .. attribute:: navigation_table_class - - This table displays data on the left side of the browser. - Set the ``navigation_table_class`` attribute with - the desired :class:`~horizon.tables.DataTable` class. - This table class must set browser_table attribute in Meta to - ``"navigation"``. - - .. attribute:: content_table_class - - This table displays data on the right side of the browser. - Set the ``content_table_class`` attribute with - the desired :class:`~horizon.tables.DataTable` class. - This table class must set browser_table attribute in Meta to - ``"content"``. - - .. attribute:: navigation_kwarg_name - - This attribute represents the key of the navigatable items in the - kwargs property of this browser's view. - Defaults to ``"navigation_kwarg"``. - - .. attribute:: content_kwarg_name - - This attribute represents the key of the content items in the - kwargs property of this browser's view. - Defaults to ``"content_kwarg"``. - - .. attribute:: template - - String containing the template which should be used to render - the browser. Defaults to ``"horizon/common/_resource_browser.html"``. - - .. attribute:: context_var_name - - The name of the context variable which will contain the browser when - it is rendered. Defaults to ``"browser"``. - - .. attribute:: has_breadcrumb - - Indicates if the content table of the browser would have breadcrumb. - Defaults to false. - - .. attribute:: breadcrumb_template - - This is a template used to render the breadcrumb. - Defaults to ``"horizon/common/_breadcrumb.html"``. - """ - name = None - verbose_name = None - navigation_table_class = None - content_table_class = None - navigation_kwarg_name = "navigation_kwarg" - content_kwarg_name = "content_kwarg" - navigable_item_name = _("Navigation Item") - template = "horizon/common/_resource_browser.html" - context_var_name = "browser" - has_breadcrumb = False - breadcrumb_template = "horizon/common/_breadcrumb.html" - breadcrumb_url = None - - def __init__(self, request, tables_dict=None, attrs=None, **kwargs): - super(ResourceBrowser, self).__init__() - self.name = self.name or self.__class__.__name__ - self.verbose_name = self.verbose_name or self.name.title() - self.request = request - self.kwargs = kwargs - self.has_breadcrumb = getattr(self, "has_breadcrumb") - if self.has_breadcrumb: - self.breadcrumb_template = getattr(self, "breadcrumb_template") - self.breadcrumb_url = getattr(self, "breadcrumb_url") - if not self.breadcrumb_url: - raise ValueError("You must specify a breadcrumb_url " - "if the has_breadcrumb is set to True.") - self.attrs.update(attrs or {}) - self.check_table_class(self.content_table_class, "content_table_class") - self.check_table_class(self.navigation_table_class, - "navigation_table_class") - if tables_dict: - self.set_tables(tables_dict) - - def check_table_class(self, cls, attr_name): - if not cls or not issubclass(cls, DataTable): - raise ValueError("You must specify a DataTable subclass for " - "the %s attribute on %s." - % (attr_name, self.__class__.__name__)) - - def set_tables(self, tables): - """ - Sets the table instances on the browser from a dictionary mapping table - names to table instances (as constructed by MultiTableView). - """ - self.navigation_table = tables[self.navigation_table_class._meta.name] - self.content_table = tables[self.content_table_class._meta.name] - navigation_item = self.kwargs.get(self.navigation_kwarg_name) - content_path = self.kwargs.get(self.content_kwarg_name) - # Tells the navigation table what is selected. - self.navigation_table.current_item_id = navigation_item - if self.has_breadcrumb: - self.prepare_breadcrumb(tables, navigation_item, content_path) - - def prepare_breadcrumb(self, tables, navigation_item, content_path): - if self.has_breadcrumb and navigation_item and content_path: - for table in tables.values(): - table.breadcrumb = Breadcrumb(self.request, - self.breadcrumb_template, - navigation_item, - content_path, - self.breadcrumb_url) - - def render(self): - browser_template = template.loader.get_template(self.template) - extra_context = {self.context_var_name: self} - context = template.RequestContext(self.request, extra_context) - return browser_template.render(context) diff --git a/horizon/browsers/breadcrumb.py b/horizon/browsers/breadcrumb.py deleted file mode 100644 index ba1ca748f..000000000 --- a/horizon/browsers/breadcrumb.py +++ /dev/null @@ -1,48 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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 import template - -from horizon.utils import html - - -class Breadcrumb(html.HTMLElement): - def __init__(self, request, template, root, - subfolder_path, url, attr=None): - super(Breadcrumb, self).__init__() - self.template = template - self.request = request - self.root = root - self.subfolder_path = subfolder_path - self.url = url - self._subfolders = [] - - def get_subfolders(self): - if self.subfolder_path and not self._subfolders: - (parent, slash, folder) = self.subfolder_path.strip('/') \ - .rpartition('/') - while folder: - path = "%s%s%s/" % (parent, slash, folder) - self._subfolders.insert(0, (folder, path)) - (parent, slash, folder) = parent.rpartition('/') - return self._subfolders - - def render(self): - """ Renders the table using the template from the table options. """ - breadcrumb_template = template.loader.get_template(self.template) - extra_context = {"breadcrumb": self} - context = template.RequestContext(self.request, extra_context) - return breadcrumb_template.render(context) diff --git a/horizon/browsers/views.py b/horizon/browsers/views.py deleted file mode 100644 index c2e8b437d..000000000 --- a/horizon/browsers/views.py +++ /dev/null @@ -1,49 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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.tables import MultiTableView - - -class ResourceBrowserView(MultiTableView): - browser_class = None - - def __init__(self, *args, **kwargs): - if not self.browser_class: - raise ValueError("You must specify a ResourceBrowser subclass " - "for the browser_class attribute on %s." - % self.__class__.__name__) - self.table_classes = (self.browser_class.navigation_table_class, - self.browser_class.content_table_class) - self.navigation_selection = False - super(ResourceBrowserView, self).__init__(*args, **kwargs) - - def get_browser(self): - if not hasattr(self, "browser"): - self.browser = self.browser_class(self.request, **self.kwargs) - self.browser.set_tables(self.get_tables()) - if not self.navigation_selection: - ct = self.browser.content_table - item = self.browser.navigable_item_name.lower() - ct._no_data_message = _("Select a %s to browse.") % item - return self.browser - - def get_context_data(self, **kwargs): - context = super(ResourceBrowserView, self).get_context_data(**kwargs) - browser = self.get_browser() - context["%s_browser" % browser.name] = browser - return context diff --git a/horizon/conf/__init__.py b/horizon/conf/__init__.py deleted file mode 100644 index 4370028d9..000000000 --- a/horizon/conf/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -import copy - -from django.utils.functional import empty -from django.utils.functional import LazyObject - - -class LazySettings(LazyObject): - def _setup(self, name=None): - from django.conf import settings - from horizon.conf.default import HORIZON_CONFIG as DEFAULT_CONFIG - HORIZON_CONFIG = copy.copy(DEFAULT_CONFIG) - HORIZON_CONFIG.update(settings.HORIZON_CONFIG) - - # Ensure we always have our exception configuration... - for exc_category in ['unauthorized', 'not_found', 'recoverable']: - if exc_category not in HORIZON_CONFIG['exceptions']: - default_exc_config = DEFAULT_CONFIG['exceptions'][exc_category] - HORIZON_CONFIG['exceptions'][exc_category] = default_exc_config - - # Ensure our password validator always exists... - if 'regex' not in HORIZON_CONFIG['password_validator']: - default_pw_regex = DEFAULT_CONFIG['password_validator']['regex'] - HORIZON_CONFIG['password_validator']['regex'] = default_pw_regex - if 'help_text' not in HORIZON_CONFIG['password_validator']: - default_pw_help = DEFAULT_CONFIG['password_validator']['help_text'] - HORIZON_CONFIG['password_validator']['help_text'] = default_pw_help - - self._wrapped = HORIZON_CONFIG - - def __getitem__(self, name, fallback=None): - if self._wrapped is empty: - self._setup(name) - return self._wrapped.get(name, fallback) - -HORIZON_CONFIG = LazySettings() diff --git a/horizon/conf/dash_template/dashboard.py.tmpl b/horizon/conf/dash_template/dashboard.py.tmpl deleted file mode 100644 index 9e435bef3..000000000 --- a/horizon/conf/dash_template/dashboard.py.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -from django.utils.translation import ugettext_lazy as _ - -import horizon - - -class {{ dash_name|title }}(horizon.Dashboard): - name = _("{{ dash_name|title }}") - slug = "{{ dash_name|slugify }}" - panels = () # Add your panels here. - default_panel = '' # Specify the slug of the dashboard's default panel. - - -horizon.register({{ dash_name|title }}) diff --git a/horizon/conf/dash_template/models.py b/horizon/conf/dash_template/models.py deleted file mode 100644 index 1b3d5f9ef..000000000 --- a/horizon/conf/dash_template/models.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Stub file to work around django bug: https://code.djangoproject.com/ticket/7198 -""" diff --git a/horizon/conf/dash_template/static/dash_name/css/dash_name.css b/horizon/conf/dash_template/static/dash_name/css/dash_name.css deleted file mode 100644 index ed03b4f6d..000000000 --- a/horizon/conf/dash_template/static/dash_name/css/dash_name.css +++ /dev/null @@ -1 +0,0 @@ -/* Additional CSS for {{ dash_name }}. */ diff --git a/horizon/conf/dash_template/static/dash_name/js/dash_name.js b/horizon/conf/dash_template/static/dash_name/js/dash_name.js deleted file mode 100644 index a8088523d..000000000 --- a/horizon/conf/dash_template/static/dash_name/js/dash_name.js +++ /dev/null @@ -1 +0,0 @@ -/* Additional JavaScript for {{ dash_name }}. */ diff --git a/horizon/conf/dash_template/templates/dash_name/base.html b/horizon/conf/dash_template/templates/dash_name/base.html deleted file mode 100644 index f07a01ba5..000000000 --- a/horizon/conf/dash_template/templates/dash_name/base.html +++ /dev/null @@ -1,11 +0,0 @@ -{% load horizon %}{% jstemplate %}[% extends 'base.html' %] - -[% block sidebar %] - [% include 'horizon/common/_sidebar.html' %] -[% endblock %] - -[% block main %] - [% include "horizon/_messages.html" %] - [% block {{ dash_name }}_main %][% endblock %] -[% endblock %] -{% endjstemplate %} diff --git a/horizon/conf/default.py b/horizon/conf/default.py deleted file mode 100644 index 445b2571a..000000000 --- a/horizon/conf/default.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.conf import settings -from django.utils.translation import ugettext_lazy as _ - -# Default configuration dictionary. Do not mutate. -HORIZON_CONFIG = { - # Allow for ordering dashboards; list or tuple if provided. - 'dashboards': None, - - # Name of a default dashboard; defaults to first alphabetically if None - 'default_dashboard': None, - - # Default redirect url for users' home - 'user_home': settings.LOGIN_REDIRECT_URL, - - # AJAX settings for JavaScript - 'ajax_queue_limit': 10, - 'ajax_poll_interval': 2500, - - # URL for additional help with this site. - 'help_url': None, - - # Exception configuration. - 'exceptions': {'unauthorized': [], - 'not_found': [], - 'recoverable': []}, - - # Password configuration. - 'password_validator': {'regex': '.*', - 'help_text': _("Password is not accepted")}, - - 'password_autocomplete': 'on', - - # Enable or disable simplified floating IP address management. - 'simple_ip_management': True -} diff --git a/horizon/conf/panel_template/models.py b/horizon/conf/panel_template/models.py deleted file mode 100644 index 1b3d5f9ef..000000000 --- a/horizon/conf/panel_template/models.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Stub file to work around django bug: https://code.djangoproject.com/ticket/7198 -""" diff --git a/horizon/conf/panel_template/panel.py.tmpl b/horizon/conf/panel_template/panel.py.tmpl deleted file mode 100644 index 4364438e2..000000000 --- a/horizon/conf/panel_template/panel.py.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -from django.utils.translation import ugettext_lazy as _ - -import horizon - -from {{ dash_path }} import dashboard - - -class {{ panel_name|title }}(horizon.Panel): - name = _("{{ panel_name|title }}") - slug = "{{ panel_name|slugify }}" - - -dashboard.{{ dash_name|title }}.register({{ panel_name|title }}) diff --git a/horizon/conf/panel_template/templates/panel_name/index.html b/horizon/conf/panel_template/templates/panel_name/index.html deleted file mode 100644 index 5185396b3..000000000 --- a/horizon/conf/panel_template/templates/panel_name/index.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load horizon %}{% jstemplate %}[% extends '{{ dash_name }}/base.html' %] -[% load i18n %] -[% block title %][% trans "{{ panel_name|title }}" %][% endblock %] - -[% block page_header %] - [% include "horizon/common/_page_header.html" with title=_("{{ panel_name|title }}") %] -[% endblock page_header %] - -[% block {{ dash_name }}_main %] -[% endblock %] - -{% endjstemplate %} diff --git a/horizon/conf/panel_template/tests.py.tmpl b/horizon/conf/panel_template/tests.py.tmpl deleted file mode 100644 index e8bba98c6..000000000 --- a/horizon/conf/panel_template/tests.py.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -from horizon.test import helpers as test - - -class {{ panel_name|title}}Tests(test.TestCase): - # Unit tests for {{ panel_name }}. - def test_me(self): - self.assertTrue(1 + 1 == 2) diff --git a/horizon/conf/panel_template/urls.py b/horizon/conf/panel_template/urls.py deleted file mode 100644 index b549cca5a..000000000 --- a/horizon/conf/panel_template/urls.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf.urls.defaults import patterns, url - -from .views import IndexView - - -urlpatterns = patterns('', - url(r'^$', IndexView.as_view(), name='index'), -) diff --git a/horizon/conf/panel_template/views.py b/horizon/conf/panel_template/views.py deleted file mode 100644 index a5116ca48..000000000 --- a/horizon/conf/panel_template/views.py +++ /dev/null @@ -1,10 +0,0 @@ -from horizon import views - - -class IndexView(views.APIView): - # A very simple class-based view... - template_name = '{{ dash_name }}/{{ panel_name }}/index.html' - - def get_data(self, request, context, *args, **kwargs): - # Add data to the context here... - return context diff --git a/horizon/context_processors.py b/horizon/context_processors.py deleted file mode 100644 index f5d2ecfdc..000000000 --- a/horizon/context_processors.py +++ /dev/null @@ -1,44 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 Nebula, Inc. -# -# 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. -""" -Context processors used by Horizon. -""" - -from horizon import conf - - -def horizon(request): - """ The main Horizon context processor. Required for Horizon to function. - - It adds the Horizon config to the context as well as setting the names - ``True`` and ``False`` in the context to their boolean equivalents - for convenience. - - .. warning:: - - Don't put API calls in context processors; they will be called once - for each template/template fragment which takes context that is used - to render the complete output. - """ - context = {"HORIZON_CONFIG": conf.HORIZON_CONFIG, - "True": True, - "False": False} - - return context diff --git a/horizon/decorators.py b/horizon/decorators.py deleted file mode 100644 index f4d41092b..000000000 --- a/horizon/decorators.py +++ /dev/null @@ -1,94 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 CRS4 -# -# 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. - -""" -General-purpose decorators for use with Horizon. -""" -import functools - -from django.utils.decorators import available_attrs -from django.utils.translation import ugettext_lazy as _ - - -def _current_component(view_func, dashboard=None, panel=None): - """ Sets the currently-active dashboard and/or panel on the request. """ - @functools.wraps(view_func, assigned=available_attrs(view_func)) - def dec(request, *args, **kwargs): - if dashboard: - request.horizon['dashboard'] = dashboard - if panel: - request.horizon['panel'] = panel - return view_func(request, *args, **kwargs) - return dec - - -def require_auth(view_func): - """ Performs user authentication check. - - Similar to Django's `login_required` decorator, except that this throws - :exc:`~horizon.exceptions.NotAuthenticated` exception if the user is not - signed-in. - """ - from horizon.exceptions import NotAuthenticated - - @functools.wraps(view_func, assigned=available_attrs(view_func)) - def dec(request, *args, **kwargs): - if request.user.is_authenticated(): - return view_func(request, *args, **kwargs) - raise NotAuthenticated(_("Please log in to continue.")) - return dec - - -def require_perms(view_func, required): - """ Enforces permission-based access controls. - - :param list required: A tuple of permission names, all of which the request - user must possess in order access the decorated view. - - Example usage:: - - from horizon.decorators import require_perms - - - @require_perms(['foo.admin', 'foo.member']) - def my_view(request): - ... - - Raises a :exc:`~horizon.exceptions.NotAuthorized` exception if the - requirements are not met. - """ - from horizon.exceptions import NotAuthorized - # We only need to check each permission once for a view, so we'll use a set - current_perms = getattr(view_func, '_required_perms', set([])) - view_func._required_perms = current_perms | set(required) - - @functools.wraps(view_func, assigned=available_attrs(view_func)) - def dec(request, *args, **kwargs): - if request.user.is_authenticated(): - if request.user.has_perms(view_func._required_perms): - return view_func(request, *args, **kwargs) - raise NotAuthorized(_("You are not authorized to access %s") - % request.path) - - # If we don't have any permissions, just return the original view. - if required: - return dec - else: - return view_func diff --git a/horizon/exceptions.py b/horizon/exceptions.py deleted file mode 100644 index a5d484970..000000000 --- a/horizon/exceptions.py +++ /dev/null @@ -1,321 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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. - -""" -Exceptions raised by the Horizon code and the machinery for handling them. -""" - -import logging -import os -import sys - -from django.contrib.auth import logout -from django.core.management import color_style -from django.http import HttpRequest -from django.utils.translation import ugettext_lazy as _ -from django.views.debug import CLEANSED_SUBSTITUTE -from django.views.debug import SafeExceptionReporterFilter - -from horizon.conf import HORIZON_CONFIG -from horizon import messages - -LOG = logging.getLogger(__name__) - - -class HorizonReporterFilter(SafeExceptionReporterFilter): - """ Error report filter that's always active, even in DEBUG mode. """ - def is_active(self, request): - return True - - # TODO(gabriel): This bugfix is cribbed from Django's code. When 1.4.1 - # is available we can remove this code. - def get_traceback_frame_variables(self, request, tb_frame): - """ - Replaces the values of variables marked as sensitive with - stars (*********). - """ - # Loop through the frame's callers to see if the sensitive_variables - # decorator was used. - current_frame = tb_frame.f_back - sensitive_variables = None - while current_frame is not None: - if (current_frame.f_code.co_name == 'sensitive_variables_wrapper' - and 'sensitive_variables_wrapper' - in current_frame.f_locals): - # The sensitive_variables decorator was used, so we take note - # of the sensitive variables' names. - wrapper = current_frame.f_locals['sensitive_variables_wrapper'] - sensitive_variables = getattr(wrapper, - 'sensitive_variables', - None) - break - current_frame = current_frame.f_back - - cleansed = [] - if self.is_active(request) and sensitive_variables: - if sensitive_variables == '__ALL__': - # Cleanse all variables - for name, value in tb_frame.f_locals.items(): - cleansed.append((name, CLEANSED_SUBSTITUTE)) - return cleansed - else: - # Cleanse specified variables - for name, value in tb_frame.f_locals.items(): - if name in sensitive_variables: - value = CLEANSED_SUBSTITUTE - elif isinstance(value, HttpRequest): - # Cleanse the request's POST parameters. - value = self.get_request_repr(value) - cleansed.append((name, value)) - return cleansed - else: - # Potentially cleanse only the request if it's one of the - # frame variables. - for name, value in tb_frame.f_locals.items(): - if isinstance(value, HttpRequest): - # Cleanse the request's POST parameters. - value = self.get_request_repr(value) - cleansed.append((name, value)) - return cleansed - - -class HorizonException(Exception): - """ Base exception class for distinguishing our own exception classes. """ - pass - - -class Http302(HorizonException): - """ - Error class which can be raised from within a handler to cause an - early bailout and redirect at the middleware level. - """ - status_code = 302 - - def __init__(self, location, message=None): - self.location = location - self.message = message - - -class NotAuthorized(HorizonException): - """ - Raised whenever a user attempts to access a resource which they do not - have permission-based access to (such as when failing the - :func:`~horizon.decorators.require_perms` decorator). - - The included :class:`~horizon.middleware.HorizonMiddleware` catches - ``NotAuthorized`` and handles it gracefully by displaying an error - message and redirecting the user to a login page. - """ - status_code = 401 - - -class NotAuthenticated(HorizonException): - """ - Raised when a user is trying to make requests and they are not logged in. - - The included :class:`~horizon.middleware.HorizonMiddleware` catches - ``NotAuthenticated`` and handles it gracefully by displaying an error - message and redirecting the user to a login page. - """ - status_code = 403 - - -class NotFound(HorizonException): - """ Generic error to replace all "Not Found"-type API errors. """ - status_code = 404 - - -class RecoverableError(HorizonException): - """ Generic error to replace any "Recoverable"-type API errors. """ - status_code = 100 # HTTP status code "Continue" - - -class ServiceCatalogException(HorizonException): - """ - Raised when a requested service is not available in the ``ServiceCatalog`` - returned by Keystone. - """ - def __init__(self, service_name): - message = 'Invalid service catalog service: %s' % service_name - super(ServiceCatalogException, self).__init__(message) - - -class AlreadyExists(HorizonException): - """ - Exception to be raised when trying to create an API resource which - already exists. - """ - def __init__(self, name, resource_type): - self.attrs = {"name": name, "resource": resource_type} - self.msg = 'A %(resource)s with the name "%(name)s" already exists.' - - def __repr__(self): - return self.msg % self.attrs - - def __str__(self): - return self.msg % self.attrs - - def __unicode__(self): - return _(self.msg) % self.attrs - - -class WorkflowError(HorizonException): - """ Exception to be raised when something goes wrong in a workflow. """ - pass - - -class WorkflowValidationError(HorizonException): - """ - Exception raised during workflow validation if required data is missing, - or existing data is not valid. - """ - pass - - -class HandledException(HorizonException): - """ - Used internally to track exceptions that have gone through - :func:`horizon.exceptions.handle` more than once. - """ - def __init__(self, wrapped): - self.wrapped = wrapped - - -UNAUTHORIZED = tuple(HORIZON_CONFIG['exceptions']['unauthorized']) -NOT_FOUND = tuple(HORIZON_CONFIG['exceptions']['not_found']) -RECOVERABLE = (AlreadyExists,) -RECOVERABLE += tuple(HORIZON_CONFIG['exceptions']['recoverable']) - - -def error_color(msg): - return color_style().ERROR_OUTPUT(msg) - - -def check_message(keywords, message): - """ - Checks an exception for given keywords and raises a new ``ActionError`` - with the desired message if the keywords are found. This allows selective - control over API error messages. - """ - exc_type, exc_value, exc_traceback = sys.exc_info() - if set(str(exc_value).split(" ")).issuperset(set(keywords)): - exc_value._safe_message = message - raise - - -def handle(request, message=None, redirect=None, ignore=False, - escalate=False, log_level=None, force_log=None): - """ Centralized error handling for Horizon. - - Because Horizon consumes so many different APIs with completely - different ``Exception`` types, it's necessary to have a centralized - place for handling exceptions which may be raised. - - Exceptions are roughly divided into 3 types: - - #. ``UNAUTHORIZED``: Errors resulting from authentication or authorization - problems. These result in being logged out and sent to the login screen. - #. ``NOT_FOUND``: Errors resulting from objects which could not be - located via the API. These generally result in a user-facing error - message, but are otherwise returned to the normal code flow. Optionally - a redirect value may be passed to the error handler so users are - returned to a different view than the one requested in addition to the - error message. - #. RECOVERABLE: Generic API errors which generate a user-facing message - but drop directly back to the regular code flow. - - All other exceptions bubble the stack as normal unless the ``ignore`` - argument is passed in as ``True``, in which case only unrecognized - errors are bubbled. - - If the exception is not re-raised, an appropriate wrapper exception - class indicating the type of exception that was encountered will be - returned. - """ - exc_type, exc_value, exc_traceback = sys.exc_info() - log_method = getattr(LOG, log_level or "exception") - force_log = force_log or os.environ.get("HORIZON_TEST_RUN", False) - force_silence = getattr(exc_value, "silence_logging", False) - - # Because the same exception may travel through this method more than - # once (if it's re-raised) we may want to treat it differently - # the second time (e.g. no user messages/logging). - handled = issubclass(exc_type, HandledException) - wrap = False - - # Restore our original exception information, but re-wrap it at the end - if handled: - exc_type, exc_value, exc_traceback = exc_value.wrapped - wrap = True - - # We trust messages from our own exceptions - if issubclass(exc_type, HorizonException): - message = exc_value - # Check for an override message - elif getattr(exc_value, "_safe_message", None): - message = exc_value._safe_message - # If the message has a placeholder for the exception, fill it in - elif message and "%(exc)s" in message: - message = message % {"exc": exc_value} - - if issubclass(exc_type, UNAUTHORIZED): - if ignore: - return NotAuthorized - if not force_silence and not handled: - log_method(error_color("Unauthorized: %s" % exc_value)) - if not handled: - if message: - message = _("Unauthorized: %s") % message - # We get some pretty useless error messages back from - # some clients, so let's define our own fallback. - fallback = _("Unauthorized. Please try logging in again.") - messages.error(request, message or fallback) - # Escalation means logging the user out and raising NotAuthorized - # so the middleware will redirect them appropriately. - if escalate: - logout(request) - raise NotAuthorized - # Otherwise continue and present our "unauthorized" error message. - return NotAuthorized - - if issubclass(exc_type, NOT_FOUND): - wrap = True - if not force_silence and not handled and (not ignore or force_log): - log_method(error_color("Not Found: %s" % exc_value)) - if not ignore and not handled: - messages.error(request, message or exc_value) - if redirect: - raise Http302(redirect) - if not escalate: - return NotFound # return to normal code flow - - if issubclass(exc_type, RECOVERABLE): - wrap = True - if not force_silence and not handled and (not ignore or force_log): - # Default recoverable error to WARN log level - log_method = getattr(LOG, log_level or "warning") - log_method(error_color("Recoverable error: %s" % exc_value)) - if not ignore and not handled: - messages.error(request, message or exc_value) - if redirect: - raise Http302(redirect) - if not escalate: - return RecoverableError # return to normal code flow - - # If we've gotten here, time to wrap and/or raise our exception. - if wrap: - raise HandledException([exc_type, exc_value, exc_traceback]) - raise exc_type, exc_value, exc_traceback diff --git a/horizon/forms/__init__.py b/horizon/forms/__init__.py deleted file mode 100644 index 551358468..000000000 --- a/horizon/forms/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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. - -# FIXME(gabriel): Legacy imports for API compatibility. -from django.forms import * # noqa -from django.forms import widgets - -# Convenience imports for public API components. -from horizon.forms.base import DateForm -from horizon.forms.base import SelfHandlingForm -from horizon.forms.base import SelfHandlingMixin -from horizon.forms.fields import DynamicChoiceField -from horizon.forms.fields import DynamicTypedChoiceField -# FIXME: TableStep hack adding NumberInput -from horizon.forms.fields import NumberInput -from horizon.forms.views import ModalFormMixin -from horizon.forms.views import ModalFormView - -assert widgets -assert SelfHandlingMixin -assert SelfHandlingForm -assert DateForm -assert ModalFormView -assert ModalFormMixin -assert DynamicTypedChoiceField -assert DynamicChoiceField -assert NumberInput diff --git a/horizon/forms/base.py b/horizon/forms/base.py deleted file mode 100644 index aa6b0232e..000000000 --- a/horizon/forms/base.py +++ /dev/null @@ -1,57 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 Nebula, Inc. -# -# 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 import forms -from django.forms.forms import NON_FIELD_ERRORS - - -class SelfHandlingMixin(object): - def __init__(self, request, *args, **kwargs): - self.request = request - if not hasattr(self, "handle"): - raise NotImplementedError("%s does not define a handle method." - % self.__class__.__name__) - super(SelfHandlingMixin, self).__init__(*args, **kwargs) - - -class SelfHandlingForm(SelfHandlingMixin, forms.Form): - """ - A base :class:`Form ` class which includes - processing logic in its subclasses. - """ - def api_error(self, message): - """ - Adds an error to the form's error dictionary after validation - based on problems reported via the API. This is useful when you - wish for API errors to appear as errors on the form rather than - using the messages framework. - """ - self._errors[NON_FIELD_ERRORS] = self.error_class([message]) - - -class DateForm(forms.Form): - """ A simple form for selecting a range of time. """ - start = forms.DateField(input_formats=("%Y-%m-%d",)) - end = forms.DateField(input_formats=("%Y-%m-%d",)) - - def __init__(self, *args, **kwargs): - super(DateForm, self).__init__(*args, **kwargs) - self.fields['start'].widget.attrs['data-date-format'] = "yyyy-mm-dd" - self.fields['end'].widget.attrs['data-date-format'] = "yyyy-mm-dd" diff --git a/horizon/forms/fields.py b/horizon/forms/fields.py deleted file mode 100644 index 9bfcc4651..000000000 --- a/horizon/forms/fields.py +++ /dev/null @@ -1,77 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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.core import urlresolvers -from django.forms import fields -from django.forms import widgets - - -class DynamicSelectWidget(widgets.Select): - """ - A subclass of the ``Select`` widget which renders extra attributes for use - in callbacks to handle dynamic changes to the available choices. - """ - _data_add_url_attr = "data-add-item-url" - - def render(self, *args, **kwargs): - add_item_url = self.get_add_item_url() - if add_item_url is not None: - self.attrs.update({self._data_add_url_attr: add_item_url}) - return super(DynamicSelectWidget, self).render(*args, **kwargs) - - def get_add_item_url(self): - if callable(self.add_item_link): - return self.add_item_link() - try: - if self.add_item_link_args: - return urlresolvers.reverse(self.add_item_link, - args=[self.add_item_link_args]) - else: - return urlresolvers.reverse(self.add_item_link) - except urlresolvers.NoReverseMatch: - return self.add_item_link - - -class DynamicChoiceField(fields.ChoiceField): - """ - A subclass of ``ChoiceField`` with additional properties that make - dynamically updating its elements easier. - - Notably, the field declaration takes an extra argument, ``add_item_link`` - which may be a string or callable defining the URL that should be used - for the "add" link associated with the field. - """ - widget = DynamicSelectWidget - - def __init__(self, - add_item_link=None, - add_item_link_args=None, - *args, - **kwargs): - super(DynamicChoiceField, self).__init__(*args, **kwargs) - self.widget.add_item_link = add_item_link - self.widget.add_item_link_args = add_item_link_args - - -class DynamicTypedChoiceField(DynamicChoiceField, fields.TypedChoiceField): - """ Simple mix of ``DynamicChoiceField`` and ``TypedChoiceField``. """ - pass - - -# FIXME: TableStep -# Should be in django 1.5.1 forms.widgets -class NumberInput(widgets.TextInput): - input_type = 'number' diff --git a/horizon/forms/views.py b/horizon/forms/views.py deleted file mode 100644 index b37c4d254..000000000 --- a/horizon/forms/views.py +++ /dev/null @@ -1,117 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nebula, Inc. -# -# 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 json -import os - -from django import http -from django.views import generic - -from horizon import exceptions - - -ADD_TO_FIELD_HEADER = "HTTP_X_HORIZON_ADD_TO_FIELD" - - -class ModalFormMixin(object): - def get_template_names(self): - if self.request.is_ajax(): - if not hasattr(self, "ajax_template_name"): - # Transform standard template name to ajax name (leading "_") - bits = list(os.path.split(self.template_name)) - bits[1] = "".join(("_", bits[1])) - self.ajax_template_name = os.path.join(*bits) - template = self.ajax_template_name - else: - template = self.template_name - return template - - def get_context_data(self, **kwargs): - context = super(ModalFormMixin, self).get_context_data(**kwargs) - if self.request.is_ajax(): - context['hide'] = True - if ADD_TO_FIELD_HEADER in self.request.META: - context['add_to_field'] = self.request.META[ADD_TO_FIELD_HEADER] - return context - - -class ModalFormView(ModalFormMixin, generic.FormView): - """ - The main view class from which all views which handle forms in Horizon - should inherit. It takes care of all details with processing - :class:`~horizon.forms.base.SelfHandlingForm` classes, and modal concerns - when the associated template inherits from - `horizon/common/_modal_form.html`. - - Subclasses must define a ``form_class`` and ``template_name`` attribute - at minimum. - - See Django's documentation on the `FormView `_ class for - more details. - """ - - def get_object_id(self, obj): - """ - For dynamic insertion of resources created in modals, this method - returns the id of the created object. Defaults to returning the ``id`` - attribute. - """ - return obj.id - - def get_object_display(self, obj): - """ - For dynamic insertion of resources created in modals, this method - returns the display name of the created object. Defaults to returning - the ``name`` attribute. - """ - return obj.name - - def get_form(self, form_class): - """ - Returns an instance of the form to be used in this view. - """ - return form_class(self.request, **self.get_form_kwargs()) - - def form_valid(self, form): - try: - handled = form.handle(self.request, form.cleaned_data) - except: - handled = None - exceptions.handle(self.request) - - if handled: - if ADD_TO_FIELD_HEADER in self.request.META: - field_id = self.request.META[ADD_TO_FIELD_HEADER] - data = [self.get_object_id(handled), - self.get_object_display(handled)] - response = http.HttpResponse(json.dumps(data)) - response["X-Horizon-Add-To-Field"] = field_id - elif isinstance(handled, http.HttpResponse): - return handled - else: - success_url = self.get_success_url() - response = http.HttpResponseRedirect(success_url) - # TODO(gabriel): This is not a long-term solution to how - # AJAX should be handled, but it's an expedient solution - # until the blueprint for AJAX handling is architected - # and implemented. - response['X-Horizon-Location'] = success_url - return response - else: - # If handled didn't return, we can assume something went - # wrong, and we should send back the form as-is. - return self.form_invalid(form) diff --git a/horizon/loaders.py b/horizon/loaders.py deleted file mode 100644 index 6ab86b8fe..000000000 --- a/horizon/loaders.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -Wrapper for loading templates from "templates" directories in panel modules. -""" - -import os - -from django.conf import settings -from django.template.base import TemplateDoesNotExist -from django.template.loader import BaseLoader -from django.utils._os import safe_join - -# Set up a cache of the panel directories to search. -panel_template_dirs = {} - - -class TemplateLoader(BaseLoader): - is_usable = True - - def get_template_sources(self, template_name): - bits = template_name.split(os.path.sep, 2) - if len(bits) == 3: - dash_name, panel_name, remainder = bits - key = os.path.join(dash_name, panel_name) - if key in panel_template_dirs: - template_dir = panel_template_dirs[key] - try: - yield safe_join(template_dir, panel_name, remainder) - except UnicodeDecodeError: - # The template dir name wasn't valid UTF-8. - raise - except ValueError: - # The joined path was located outside of template_dir. - pass - - def load_template_source(self, template_name, template_dirs=None): - for path in self.get_template_sources(template_name): - try: - file = open(path) - try: - return (file.read().decode(settings.FILE_CHARSET), path) - finally: - file.close() - except IOError: - pass - raise TemplateDoesNotExist(template_name) - - -_loader = TemplateLoader() diff --git a/horizon/locale/bg_BG/LC_MESSAGES/django.mo b/horizon/locale/bg_BG/LC_MESSAGES/django.mo deleted file mode 100644 index 59683721eb3ca0fbbf2b6dedf8692cdf223342e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4526 zcmbW3Uu+yl9ml7CD8Uq(ls|>iKa&PGaofGKolu-hQsVq`ti+9pozMzUwZ5C&ZF9GK z?C#lhK@cZx)8v7q0a}EbhL$1)fsm8NjqAjYRCwTxJ@o}4!2{|Gf(KN1qey&yvwO+K zHGN=pv!9urncw{8`}@t;F3Z9N%5&z^9?;au(*`Z=me&J;=`*5iY}+d|wV_pZCC( za21sP?U0`u;wApf@OxSN1t{ZRg%7~9Q0%`0W&R)FD)<-J3vc1$ z+czk+9!ebF?@0H(f?&!1@5p#}##I@+pxDX7&%+TYaj!wy$9Ey7)K6g#{3ZMh{1f~n z{3n#S+=#f+zAs}BlzE#o?t*vF-VbkwK9uoOke@o4wNGd5U%>&szXiq44T!uB-U>ep z`=Qu*46cU8c5`MLoB5{+amm)dD6=7o}dbB^XKY6mN!`4NUFW6dYH=otT zXYr@?+)t&O(n*nXvymdtmnjmD#m`NA=%SD=_W25LiKA#L`6(L6)0aX$m=XEZ!xYi_ zistZJ^++9$Vq_1^xWwh`l7hxbKltE^B3G4)0m8b8*vR$M~HDRDh4anPE)O`LBANVLNV3{ zg0SXV=)qy_mP#Sg(0?GnbZg&K#@#9^MU64v#Jc822d{n`H(^9H#8SJ7U0xg;KT^Ac zvL5sW2sbpTx4BVeEO5h;G*Z->ICjuN39XX zdd%>PCyeoRANwxpo<3cyxFN}bM>#cIHEv{dmGwPe#{uE>W6y7xt6dSQB7v*JU;En7N#7*_aGB>UEEl_-Z4FT|LsM)!cAWjkx1RjkFBcSh6B( zf2(1_N$nAwM&y$loS_#dfFB5?p z^~wmK_W5ojt^}d?v?=9urbdhxC_*f(DsI{J{G8esA^X?d(C0HtKOQt}4#}CgW<$0i zp@<^g8QC$Vz{aP-mUZ2PH4lwQ1ja3SM6+ae220NVG-nEWr}!869eYhZ2xDg`Dtjeo zOQRe)qardRqud# zN@nEi>9LOT^?Xq0kjPPGlc|-w@$+3BLxV%xugTPt>+aY}E^#L~qmy-Z8k?u$e7#Ee zHrT9>OuT8|=nkjv+BjMAfC-)L9QKlpY~Pp{U-h=2$I4G^8R!_UHbS@R?BF8cLiOvm z8Exv_pwsH6HNIZCN%wSZ==eXc-sDR2P%@j$C6}7tZyrr%b@NDbD!G!(G@noAlLdPR zQ<>3=2j*1r!(=9Tt2xy?oSaW)nOLHDeROW5(G<=TMtc4QV5{%M+NhPPLUc$yv@mD3Mm@bXE|KY)+;ftED;KCdR zFRJ7x_#zFwevOsp5aw8_!h&rcR>_Z(i`H@3vGu3zlk5c}%sPsghm&cQ{D3`*t}MVw zPF_ccOUyssJe2lLBh571w&GnDL9lE0F;7*td_gqQ$*WZ7b@I9$Vzo^*Td9&W$pTgu zn#V+#85=aQ!b-H}b@LffSk@6cnB~ucBZjSOQ{w-8+ZdwOJR!cyX9;u`N(uI2^J2^z zmhe%v?JKxL#Kn5@rVTJUEIIQ$(n#o8a7o9~aIgnb2^*)H&x+}`%FDDx=ml;4Jjad+ z0AHIYWUp-*^8(IX)C_+k70~7jmQiVjtj3Ka$s02H3?3h1+@;iW@r#4NPd2rXoU_|v zpPYroLnSYoCz5lL8IsDpn0MLAaG`mGKa1oie-&lNd_JG9f}vA3Qsh-K^N>z1UY#xH zlx3U8>31Q+<$QmeTw?3n-M;DkV!)I8RV`vv|wbSE1Bc6x}(Q2XP<8{XkBTo+8ks3OwyOg8`1w_%g6^Ew+>C=)N|ME8gXq8 zca(J(Gx%cnCIQY?kWHv0U4_f!x>Z_vB1*~Tr<=zlizU)OW2oG8&q{_b;WoQO?sE+O z;B6!db8uNo@`MWMu=K#x-PFYo9hjV#L1Id7oLQTlTt25sBYR#Yf$R=se>siESF9@2 zT*4B{G|=bM{K>*=BZvRur^KyIJu9eOpr>q@G&_&#geB0 diff --git a/horizon/locale/bg_BG/LC_MESSAGES/django.po b/horizon/locale/bg_BG/LC_MESSAGES/django.po deleted file mode 100644 index 1dab121c4..000000000 --- a/horizon/locale/bg_BG/LC_MESSAGES/django.po +++ /dev/null @@ -1,514 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Dimitar Dimitrov , 2012 -# Yasen Pramatarov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg_BG\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Друго" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Влезте, за да продължите." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Нямате права да достъпвате %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Нямате права. Опитайте да влезете отново." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Паролата не е одобрена." - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Филтър" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Нямате права да %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Изтриване" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Изтрито" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "" - -#: tables/base.py:852 -msgid "Actions" -msgstr "Действия" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Изберете ред, преди да предприемете това действие." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Помощ" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Изход" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Вход" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Вход" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Записване" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Информация: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Внимание: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Успех: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Грешка: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Обобщение" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Обобщение" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Всички инстанции" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Налично" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Налично" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Текущ проект" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Изберете месец, за да намерите потреблението" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Изпращане" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Активни инстанции" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Отказ" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Без ограничение" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Налично" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Паролата трябва да е между 8 и 18 символа." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Котки" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Котенца" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Тигри" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Кучета" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Кученца" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Моето табло" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Моят панел" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Админ панел" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Грамадни мравки нападат Сан Франциско!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Проект" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Потребител" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Пръбно действие първо" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Инстанция" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Пробно действие второ" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Пробно действие трето" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Админ" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Администраторско действие" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Неправилен формат на IP-адрес" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Неправилна версия на IP-адрес" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Неправилна маска на подмрежата" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Обработване..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Запазване" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s приключи успешно." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s не приключи." diff --git a/horizon/locale/bg_BG/LC_MESSAGES/djangojs.mo b/horizon/locale/bg_BG/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8b5ad21b869762bac6bc9603ea2d9762c6109d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmYL^!A=4(6h$$*nx$(OUAV)C1Gs>ShRPJ2*v^n)AkkfgI@VxII>qRR_*j|jq{(mcW-(fAl<-9``S25$(&6d*o>1E zFBWN@MTOouA3)ZX*}&bts-bk0MDx6aiPtLN5F{#SN_ug(4{;y5JrZBhc-W3HC_ zO!N4k_sCfRGKYkb`<%+O{gh`s5~>bRdS&aa3eHn9T?#=mCOH{#$x<<9NmB5|;ucj~ z?Nz0r)asoQ!Lr%1sXP*5yfq!?tAm48Wh(h$ziuavCe8+J@w=}b_73_pT<*5Y*lV(W fRle5YW?4>QaPXR1FWLjQYqv4BqGa%FLe%;NPP}G3 diff --git a/horizon/locale/bg_BG/LC_MESSAGES/djangojs.po b/horizon/locale/bg_BG/LC_MESSAGES/djangojs.po deleted file mode 100644 index 65b0ef3e7..000000000 --- a/horizon/locale/bg_BG/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/ca/LC_MESSAGES/django.mo b/horizon/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 1541180905f4d2dbac0e97bc09c12415255c83a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5569 zcmcJSYm8(?6@Uvxl<@@!C_b=QU1rC%dtM6;vn=lH%q}}H!!|oTyGV>s-M6Ou?%uw) zsj52<5;X=AOu%SV5+Q0<69f1}@rS*2ldeE1V6 z^ZpFV_+OOe-<0jomGysw@1_04vi(9f$JFW~DDqzcuY?sS^Ugt$|5hmTABQ5>$IAMX zW%({B^L(P@eNgoIIk*FU1Ij#4!*{@6!V3H|6#ZX@5~^?nivI3^vX4$#&f#U0?|~xM zL+~p2RVe+Qg0lY8P~`j-WQ*!|W&7!pFG2B>m!a6_d^RKHOQDpnh9mG=DC@Q0+u_Hd z=;cB90r*3RE2dUv&++pZ1j>N1*6< zhAev%d1Nk0`^mEIJXw&kPon335*ziC*hze`pLX*hKHE>YT#-coa<>eUr^uL8-AER{T_9J;l5QhU zkTF$pr_`Y&IbY%f{Um-kLYBC&i+r3c=`eYbd^35P{2{U=xzE(jU8Wi0EFJQbdgrdJ zal#LIDt&yn9g5EW(2ccVH>!&g-Mzl?fc)NE{LUA@wc@v4{5G>rH?hG++UL!t^?oT& zlC`P~iQ-77S)aj!w<1si+gDy}BP$jY5)SE1ShG1LL%XuA5mJnDdS}*bYk9LK*$)J^c1AIkUJ|7{0Y_+rZQ; zzskznTN#|Kq{RgC# zhNpcgV`$&1d@P#;AMkl2wLy1`Ke zZ(KdftWO7nwyQBS;vmJvHH1d%Z7eb`n;4Wksd6~Woj_XvrOm7{h!7WvNTx2H08ogSH(93SuXn=?LC>dvG-F+uK(8%@K-HqnQ3m)JFZ zeXCdA?=kX8YgTNPKybsroJm_bepjhm)0xx<(^eAuw%#S;BmK(CN;Sx=@seGY5yRb{ zCj4-BIO|#o8O@VyvNy}HO^1gD=4a;*ZmMatIx;ZbyMZh9wJtjib~Oxh`Nrwq;*@$D z_AS;ARVFt3$&yRfRSt5=MTK!E8gbZ=c2YOZKrP9gNh*i9{RpXPwRbui)PPmSw;gw0No z^=;FLlQ>Anjj=X$CbBN3Za$OU@B%nHZu4f6Lumh(J}7bPME&^8^(!_h8(p!;wze}y zZVk`pTK-(^gm6QsO?cYGt5|w#5O+M3PULK}AH~IcahSLt%!>=DFs!rdj~Jq{l0Z%; zvHc{4(oN9R`YGQe#)&7a8n)+Om#yv;c5(6s=(X`$ z$&+A+fYO`{#v9T^JPLZRfvF^*x;Z&ODemE|cpQg{sm1>!KFh;EoN8MqdY~WPf3ef- zlISp@+uio-#u)Gs|-q}0^(V&&*9tWwJBY{LrT*-RVdo{?)2$H8* zp{J^>(c6|BW^b4Il~tql@Awdl1l$9;XO&iQK{$4%7Kl`_Q+2stJ2t5GPp`&dvM-5? zJFLt0dq;XxG}CElHjDY$BKGG>Dz+vYCm<{vJ$hEn_*pe$YHqOq$dHFX?~Q>Ki|2)n zS5aX3z);1L0?&}Utk9W|7)8nG{+yxk9C5`6 ZZ(}oFI*F0;qJ@V>)-#>a=N2-u>c11eZHfQ@ diff --git a/horizon/locale/ca/LC_MESSAGES/django.po b/horizon/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 4e7bd990a..000000000 --- a/horizon/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,513 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Sergi Almacellas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Altre" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Identifique-se per continuar." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "No esteu autoritzat per accedir a %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Sense autorització. Torneu a intentar-ho." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "La contrasenya no ha estat acceptada" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtre" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "No teniu per misos per a %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "No es pot %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Eliminar" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Eliminat" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "L'attribut %(attr)s no existeix a %(obj)s" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "No hi ha itemas per mostrar" - -#: tables/base.py:852 -msgid "Actions" -msgstr "Accions" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "No hi ha resultats per l'identificador \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Heu de seleccionar una fila abans de dur a terme aquesta acció." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Identificat com" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Ajuda" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Sortir" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Usuari" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Identificació" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Registrar-se" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Informació:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Advertència:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Èxit:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Error: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Resum" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Mostrant %(counter)s element" -msgstr[1] "Mostrar %(counter)s elements" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Resum" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Usat" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "de" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Totes les instàncies" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Disponible" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Disponible" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Mostrant %(nav_items)s objjecte" -msgstr[1] "Mostrant %(nav_items)s objjectes" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Mostrant %(content_items)s objjecte" -msgstr[1] "Mostrant %(content_items)s objjectes" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Projecte actual" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Seleccioneu un mes per obtenir les seves estadístiques d'us" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Transmet" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Activar instàncies" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Memòria activa" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "Hores de VCPU d'aquest més" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "GB-Hores d'aquest més" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancela" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Sense limit" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Disponible" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "La contrasenya ha de tenir entre 8 i 18 caràcters." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "El meu tauler de control" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "El meu tauler" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Tauler d'administració" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Lot" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "En lots" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Items" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Davall" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Amunt" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Baixat" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Pujat" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Primera pestanya" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Pestanya retardada" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Pestanya deshabilitada" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Pestanya enraderida" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Pestanya amb la meua taula" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Pestanya d'error recuperables" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projecte" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Usuari" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Acció de prova 1" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instància" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Acció de prova 2" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Acció de prova 3" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Adminstració" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Acció de l'administració" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Format incorrecte per l'adreça IP" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Versió incorrecta de l'adreça IP" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Màscara de xarxa invàlida" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Processant..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Desa" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s completat correctament." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s no s'ha completat" diff --git a/horizon/locale/cs/LC_MESSAGES/django.mo b/horizon/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 2e0935c7db2578081353cb7001142f687df1b4e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7066 zcmbuDdu(J^dBD#$DG6?&Av{8xP|k*IvYX9}y^jPlyWYg>eX?t>vAy1~5Rx-9$1~S+ z=bp)Zj5Dsp9~1~kT@d2AY*6CTsND){3kV`WSsvpNAfbpq0P$#}R)SVV393R>Rh2;f zefQq6$D2n{x$?Qcd*0vqzVDp#ji0{$>W?d)2T3=P{^lyBJ_+x*h8NEVUar*Z;RoSs z;9tX6!6%@!|1SJP_^&yi$@yH)|IYba_-C}cdMF#`jZmi83$KIwA%AL;myCBW{A2ho z_(!k-UjdgOL#g+{SHlnI<)4LrLjLnml zZzF#IO8W&U?HcfnFoM$mqwrezX(;RdEc|o$1eAV1g0jw^LFxZ5Q2PBlWP*w7Uz+JQEOCP$!}2XBvu~9?0t-gyIj&@Mid7DC_zHl=hdQ%=Z)& zd;9ssq;|A`+LY%QU3tN zzF&i=R(%_aoIiqyp#B+(9e?e+$L# z*C4F;-Bu{;Jq+)F4vO6$fg<-Rl=;5|#jf9gGVfD){m-GC|Iff8d^v;5e4{Y6FO+^$ zQ09MUUT&f2-$C)eHk5U}ABx-;pv-eA&-dVMB*^MZfZhUeAzZyns|AiEN^Gc}7WMyL(CRBFVbuNcWRO#=A)Jh+gE8dq!+7=fi!Z zw~*wylQfckWj1+$Z?VDdyi9N;|9(4^eg8Jn0!j9U*jpaiN83naq`OJ-Y|o(H3QVRGU@NJ6Nc%{)lV(U|QvVS@6QAopO+Ma{XJpUq%)iB7rbx&0{5(8K zVhe404v}l+C3~RwuROa*Y>U*-vF#K3!*QRYe-;{l;#-IN+IBLIErvtC&+7r{KnR6rW{G@4h6uZ#W1_ssbv?5Xm zO^uHEdRKLCom)d$Da|JS~*oFWn-#vPr@y;fr)1th=IPVA?M+^Od!9b~Sk| z1?dY#9S%bmmb5zJ*|3tU<%s7aj5_KWv_^`w39UA9Y$^>|^sEW=kq`}gQN?Xl$E@E{ z$6V+wyFeWeDh_p5V!hzPrb(fXPis@HhIk(J3y$gfZpBC2_&8ydlmi>5u}K{uu4CBjM5B4=r;VM!ZRL2W9h8RoJD`xv6i(M$j{Y7OP|4# zC8y>vA=@ML%5t=D*z?U^t~wh9x5e5%rKjvZj-~iaLgrm-=@-e z4#0l7R}<$v9i)0g1sm7Nz^y@b64zxL+GC4(pSPk;E$_ zF1sjgQ+27U*0Hm0*|6#1E~w+hRwBbzooMcg9;s(!Lzh(DaUZnA1Kff*p}1Y)c(pK} zof;*bA4x+qw&lXOFd5anYT;l~iwbibLG?IpMWx|k-y}h$-ZIr9=g)AeKNk#5pPDO7 zgf`vlg+nH`CB1uO*Pg=2p2Du(dSq{DWOU~U4-E@5w(ZG!HnrPZ*!>ngGFsZRCu?`o zL~&t`Lo@OXcUVauHRaH=zCMn z3{7O0SYeK+q@-i}P&~~2IUcE%DTP&nM+hYPfdyNsYTmOtoG`%RHbu)Lm&ej7s6!YZuhnFzKyumY#5H z=NcU~>you|CJM4a7HuO|Gj2I{P0#OM)QzmsV1zZ_X_{rjSq!=>DC?zSth25hn&o8C z!{}FrSS{zf-sMK3euqY#|4*ZS!1W>%ZLYSBE2h|7jiv_091O``aQGK!@PCfbQPYu! z3H{zBF3c$Io#!&eFlwUSDVq|CZo9^YQ6#<#)v0ptJU-bBIh6_JbP{7S3IeX{%>mw2 zccmpBP&Mme-jr<+4>V%&Y9fPXcO}k3G=jX2N`pM!xwrQoYZ+Ru3Kua=!uwnNiQk7-ru|yVK9JI^Yml!eWH@MjE($NjQoccY+TO|PWDw-b@S!^h>c6=^U za}yZ%ybzL>J;i10}-G{(lP5Vr%Nklg|Y*)8UjXfgzhRqN|kVt>zZhB zIWUdhrJ_24c#Y7kolE=BaFO63iGx&etqqH$v7ekLZCe%jwak>BFWuFqZg&W<(J(%@ zQf=_#^K6S)REFfQxgI%ki1Z$dIaog+_U4GGhk&XIbq3 zoLkc_wS`ls`&(7b8<~FviAqwc7bC*IHa|?3TQ)tn7?)pE{LIMCv#t6dZgg1!*2p%q zc=ZKDWXsX9yDB?5k$82=%3)@;YlZkG*SqLIJZfXv13`DcHRq#~BR6ZhKB8`vRMj, 2013 -# pavlija7 , 2013 -# Jaroslav Henner , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" - -#: base.py:424 -msgid "Other" -msgstr "Ostatní" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "K pokračování je nutno se přihlásit." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Nejste autorizován k přístupu %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Nejste autorizován. Prosím pokuste se přihlásit znovu." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Navigační položka" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "Vyberte %s pro prohlížení" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Heslo nebylo akceptováno" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtr" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "nedostupné" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Nemáte oprávnění pro %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Není možné provést %(action)s na %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Vymazat" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Smazáno" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "Atribut %(attr)s neexistuje na %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Žádné položky k zobrazení." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Akce" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Nic s id \"%s\" nebylo nalezeno." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Pro provedení akce prosím vyberte řádky." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Přihlášen jako" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Nápověda" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Odhlásit" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Přihlášení" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Přihlásit" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "Nemáte povolení pro přístup k:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Přihlašte se jako jiný uživatel nebo se vraťte k" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "domovská stránka" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Registrovat" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Info:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Varování:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Úspěch:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Chyba:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Souhrn" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Zobrazuji %(counter)s položku" -msgstr[1] "Zobrazuji %(counter)s položek" -msgstr[2] "Zobrazuji %(counter)s položky" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "Více" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Souhrn kvóty" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Použito" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "z" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Dostupné instance" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Dostupné vCPU" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Dostupná RAM" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Dostupné volumes" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Dostupný diskový prostor" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Zobrazuji %(nav_items)s položku" -msgstr[1] "Zobrazuji %(nav_items)s položky" -msgstr[2] "Zobrazuji %(nav_items)s položky" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Zobrazuji %(content_items)s položku" -msgstr[1] "Zobrazuji %(content_items)s položky" -msgstr[2] "Zobrazuji %(content_items)s položky" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Současný projekt" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Vyberte měsíc pro zobrazení jeho využití." - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Potvrdit" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Aktivní instance" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Využívaná RAM" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "VCPU-hodin za tento měsíc" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "GB-hodiny za tento měsíc" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Zrušit" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Bez limitu" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Dostupné" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" -msgstr[2] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Heslo musí mít od 8 do 18 znaků." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Roztomilé kočky" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Divoké kočky" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Kočky" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Koťata" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tygři" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Psi" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Štěňata" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Můj Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Můj panel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Admin panel" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Obří mravenci utočí na San Francisco!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "Už jsme v bezpečí před maravenci! Běž sem!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Dávka" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Dávkově" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Položka" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Položek" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Dolů" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Nahoru" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Sestřelený" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Nahozený" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "Žádná Action Table" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Jedna tabulka" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Záložka jedna" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Delayed Tab" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Disabled Tab" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Disallowed Tab" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Záložka s My Table" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Recoverable Error Tab" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projekt" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Uživatel" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Testovat Action One" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instance" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Testovat Action Two" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Testovat Action Three" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Admin" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Admin akce" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Nekorektní formát IP adresy" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Špatná verze IP adresy" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Špatná subnet maska" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Zpracovávám..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "Vše dostupné" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Členové" - -#: workflows/base.py:469 -msgid "None available." -msgstr "Nedostupné" - -#: workflows/base.py:470 -msgid "No members." -msgstr "Žádní členové." - -#: workflows/base.py:569 -msgid "Save" -msgstr "Uložit" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s úspěšně dokončeno" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s nedokončeno" diff --git a/horizon/locale/en/LC_MESSAGES/django.mo b/horizon/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 5c6400d5c9984c0e04ce2c3ef4f9cec196995bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4775 zcmeH|-ESR76~L#o(BhJ|w1lSRBjXffJ7MqjM@rr6IIZK4#3XL6;_Fn_inRy z_p&qV8|MKj5~4^vLivzDLaHi(03m@8szB-!YCuQ`9{3XE0U?SIs`|hKK_KxvyKB1< z?O#Afd*-(@J9FmDIcH|C-+#yRiqb^hk9_rQN?nrow^LEBy+f(@z@Nf*!|PDSy$)r_ zfjdh+Q1PLPhbxZ3hZ%Paik?--qn@F<4|bsF@$g;n3cMRW2j2-lUw!`?i+@cQ9q`70R9Ai5dIE|o&SWg&;LNtdppL8J$FO8)S-%_Q2cZh9)V9l znb(GgU=IfHDiptd7uMj<-~o68ivBxCO5O_((tZ$%9RVDLGf?)~f=p4*K$&MN_MyZ( zhvMJos`i(v_BY`a{Vze$|2Oy`6laOvLs0gA7#@WuA*rPzDEo<_*poq7e+VCeSK$nN z5x#tzQon`bk1w-1vFAHb^6zCRdj3%HPZj@K@wJNofa0frLD6%N;LARbLdm}wD0-Hl z#A6Mzq`C;ju6Ff3hB7aMvcD@(?7s@dKc9gz{)4L`0Xf^dB-cBfIMoM3RBd@s=ZaUFT*MNKMO_wOHlIf7f|%R3T6MV zLCL=Z_m}xM2W3C=Q0!TRvi>TR{ARW{8ku^jkvY!P+_9r&UxjBQ3Ad`p`iJAEOF=Q2yB6%W3 z&WFTC@=J1L7CDK$u}JKXBab61$Pyy)6<@RUy>dHm;!i2Kvd9U^FT%K28oZ4oAKvRJ zb3~eFtG*L(9r*}SN2U=ek~_=D7;+AI0+I4Q%`?wzp-)A3Q7 zOuB|1n@HQwx=E+TCR}vIPKN*cqT4&(?sXR}hC6-wl+Y~)KZ>hHu1WdrO(=qr|qpSzAW3=>|kKav=#3dTOm}-krTDm zHyUxA4)>b_CPqmY?{(5V@iv=uI`XzJ^WN&4Q_E>rs$o)8n7NW=Y1YtcHL_W!GHNx7 z(Wg#F2AdJ5O=h+6-gGX>k{c$`s~P)?Tqhk>Ye^?%e;u#4(yVU^=(VOcVVL1`zHg=_Auy zmd%%Ep&apscB_}!n@6;UscPY45-5w>lKPx}-bvUnwJsU=+Fp*(NZgCNU=r80dboaF zY#x_m9-K+@%-!63ajChv+aGmtxY|q#7qH1UyjVtE1@`ivNwCLNc|#vKo49@kTI zjoI09+&SZX(BjOy*m$`xPMdZX*;t>+v)JzF6Wy}?q$9?ctQp!GSL?}w|9)rx E1*Sr8qW}N^ diff --git a/horizon/locale/en/LC_MESSAGES/django.po b/horizon/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 09a23ae62..000000000 --- a/horizon/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,514 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Gabriel Hurley , 2012 -# johnpostlethwait , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Other" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Please log in to continue." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "You are not authorized to access %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Unauthorized. Please try logging in again." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Password is not accepted" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filter" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "You do not have permission to %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Unable to %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Delete" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Deleted" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "The attribute %(attr)s doesn't exist on %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "No items to display." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Actions" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "No match returned for the id \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Please select a row before taking that action." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Info: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Warning: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Success: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Error: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Summary" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Displaying %(counter)s item" -msgstr[1] "Displaying %(counter)s items" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Current Project" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Select a month to query its usage" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Submit" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Active Instances" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "This Month's VCPU-Hours" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "This Month's GB-Hours" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancel" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "No Limit" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Available" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Password must be between 8 and 18 characters." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Cute Cats" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Fierce Cats" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Cats" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Kittens" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigers" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Dogs" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Puppies" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "My Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "My Panel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Admin Panel" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Giant ants are attacking San Francisco!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Batch" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Batched" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Items" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Down" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Up" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Downed" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Upped" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Tab One" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Delayed Tab" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Disabled Tab" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Disallowed Tab" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Tab With My Table" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Recoverable Error Tab" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Project" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "User" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Test Action One" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instance" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Test Action Two" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Test Action Three" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Admin" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Admin Action" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Incorrect format for IP address" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Invalid version for IP address" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Invalid subnet mask" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Processing..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Save" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s completed successfully." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s did not complete." diff --git a/horizon/locale/en/LC_MESSAGES/djangojs.mo b/horizon/locale/en/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8b5ad21b869762bac6bc9603ea2d9762c6109d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmYL^!A=4(6h$$*nx$(OUAV)C1Gs>ShRPJ2*v^n)AkkfgI@VxII>qRR_*j|jq{(mcW-(fAl<-9``S25$(&6d*o>1E zFBWN@MTOouA3)ZX*}&bts-bk0MDx6aiPtLN5F{#SN_ug(4{;y5JrZBhc-W3HC_ zO!N4k_sCfRGKYkb`<%+O{gh`s5~>bRdS&aa3eHn9T?#=mCOH{#$x<<9NmB5|;ucj~ z?Nz0r)asoQ!Lr%1sXP*5yfq!?tAm48Wh(h$ziuavCe8+J@w=}b_73_pT<*5Y*lV(W fRle5YW?4>QaPXR1FWLjQYqv4BqGa%FLe%;NPP}G3 diff --git a/horizon/locale/en/LC_MESSAGES/djangojs.po b/horizon/locale/en/LC_MESSAGES/djangojs.po deleted file mode 100644 index 65b0ef3e7..000000000 --- a/horizon/locale/en/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/en_GB/LC_MESSAGES/django.mo b/horizon/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index 816f1c445480f2f6e2bf870d6d137bb73ec206a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6110 zcmeH}U5sQ!6~_x%6b4xp0YPA`-DTMsu)AkwL5JQCnVJ0>*x4O+dRahWt?sVrzPq>Y zZSKbmOHf0M@nsVemBfvSBr5S^m1u+)^}&q^;XxA7C;^OoghYA5ME1oHv zHSm4#1}OXL@B?rjYCaFO-Z7}Hq;L&<5Nh1#pyvG&)OshO^d5s6_X8+AeZH&UrKlu^EE$!&<0#tb=-AgNoM#+yG}G zLrot_{~;)QPC)tn%di4ZLB;!dScPvw#c3mj>=`S03snCk#pUn-l${=40guA<@L{NN z--5F16l6;C1l0adL&fiDD81j5d;uyCUWKyv&9c3QAgX-@9EI0It$!GP2=<`n{Q{K# zPrw`CDflk(gzru}h9gB^_DX6&QPa(t-ajhKlEv5Z9RN zpzIol%D-)8{~W|Lb03s_5o9X!MX32sLap~GEb<}TBtm@0?OXuvOQ6@Z-Zm>-vb$H zPC%WnZ$i!cQz-wRhB_}VL!F0G3VC|7PnWSjhY4ADcF&F-RR%*Wt#Sr-%+*-}I1ko|}r zhul)s2F0FLbyejr#rji-VyQ>5-B;8&i}2G3E-@Y<x47-KG;S({qPd^K3f~^Pab97ALN=YErvcyhzQI%Uaz*>Dy*nHisZf z&2*k5KFaJ|5+C)gjCSU2@n)wF-ErK~a7{xU7nNw6ok1$=%Xc)wFkV`2#+}scjF+OK zV6|OI5+`+Qb_YIbm2>Y7!ptXTPvBS@Nv%t~by?%+d; z8z;eoab#wqR*cQ9%r3-9&lRvUbJn%n3E|`YLdfj$*Csy8lL$+-v#jea4%o0M-7ruY*rIxb*O$|%Y7U^8m^qiG zOL4+3(<1#H$D+>xIs2lQrBrs6R_xIM_cWm9-<4@BOGhXbZ2(t{xlkN*aD!$4zIyU|TN zV^;Sp#il_BIUY&S)cNEJq|OD{j(r+!&a8hRU`CRrxc5fzexpnDX0@Zux&bSDjQBU21w+l(!D{g`Hc28`#xgBJo-&S)w)|aK}6CMANoodG4P^6qzxYx^B8Lmug=b5HBbRm3Ebx zcID2&tx>n-l{9qF_v0k1%%+{7U75-|X{Esx)XlPfTCdeYmq)E`-?gjUKefVtaWph{ zpi!Ald~wz*J6-1Mc6@YfOJ#IRWo+Dz-c%o*xN(#R#mYgy7-&Cl)4Qp%Wz>$3*SBmL z=f( zgS2ahWjJ;(EiF|u%@-{A2Q;GAANU}x^=omTTT$0F+Z)VM^HFVNXm)0H*I5URRY!-W zNkaZ%Dh>Xn>o)TbWHm0UAlh2o7OBs+A8PEbOq|uzl3b*fU0n3-B4Z|+LAGLT-TLUr zo~fa^Fi%`q+0CCoTDMWZXr|l8x7tB<`*38}Z?|J3TZhcqbSAUUeKY8C9DEv_`(`-z n&2a9U;s5TNq4=}>FMl-fA@INZXkhXG&_~0+`_6dhuZDjBu@jft diff --git a/horizon/locale/en_GB/LC_MESSAGES/django.po b/horizon/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index f5ea31e8a..000000000 --- a/horizon/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,513 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Andi Chandler , 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-30 22:33+0000\n" -"Last-Translator: Andi Chandler \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Other" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Please log in to continue." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "You are not authorised to access %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Unauthorised. Please try logging in again." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Navigation Item" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "Select a %s to browse." - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Password is not accepted" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filter" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/A" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "You do not have permission to %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Unable to %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Delete" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Deleted" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "The attribute %(attr)s does not exist on %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "No items to display." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Actions" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "No match returned for the id \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Please select a row before taking that action." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Logged in as" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Help" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Sign Out" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Login" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Log In" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "You do not have permissions to access:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Login as different user or go back to" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "home page" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Sign In" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Info: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Warning: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Success: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Error: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Summary" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "More" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Quota Summary" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Used" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "of" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Available Instances" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Available vCPUs" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Available RAM" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Available volumes" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Available volume storage" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Current Project" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Select a month to query its usage" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Submit" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Active Instances" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Active RAM" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "This Month's VCPU-Hours" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "This Month's GB-Hours" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancel" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "No Limit" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Available" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Password must be between 8 and 18 characters." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Cute Cats" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Fierce Cats" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Cats" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Kittens" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigers" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Dogs" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Puppies" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "My Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "My Panel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Admin Panel" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Giant ants are attacking San Francisco!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "We are now safe from ants! Go here!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Batch" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Batched" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Items" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Down" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Up" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Downed" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Upped" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "No Actions Table" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Single Table" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Tab One" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Delayed Tab" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Disabled Tab" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Disallowed Tab" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Tab With My Table" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Recoverable Error Tab" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Project" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "User" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Test Action One" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instance" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Test Action Two" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Test Action Three" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Admin" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Admin Action" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Incorrect format for IP address" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Invalid version for IP address" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Invalid subnet mask" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Processing..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "All available" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Members" - -#: workflows/base.py:469 -msgid "None available." -msgstr "None available." - -#: workflows/base.py:470 -msgid "No members." -msgstr "No members." - -#: workflows/base.py:569 -msgid "Save" -msgstr "Save" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s completed successfully." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s did not complete." diff --git a/horizon/locale/es/LC_MESSAGES/django.mo b/horizon/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index e37bf22c3224a14728f57800471f2fd5da4d6d1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6939 zcmc(idyHIHeaBClKkkwu4#LkFwtNW3ks>ylXotkL1kE*_mtK zxp#ceon3DbQY%`ikw6roQbAi(^OUMa6;LS>LR8JFrTqu>i7HSlRTV`GZh#{4#X_-rphH$$4319ka3 z;9l}4pxUoNwYv@Xi=fIkJ_ zh>*1JJy7c%ulZJ}bsT_d|91Fh_yjxze+}wfo`Gujk5J=%AO6W5#ykfl$3M8IlKU3a z`u_pS4xfXX_imI!e09y&*Sx>xgHY`!p!%PLlG`d|2=ji3X_!9LI3I+X_g8Cv8miw{ zq1yc!)Oq|BMC9iCb^TA^Uh=O(NmM@#C66;u`#TRc?-i(d9*2m~cqn}sK&|J)Q1bpH z)cO4$)OcTjI+w4*dH6T*2)vKNqi_kT-&0WI|0Y!bPuBbl)I49T^M4Ey~Qi{^(==kW@ZQTFyGct3m_oPY~Z`?>}>0&^2;+>byDKMoJUufToq zdr*GsH4LhL=b+a6Sj{HXy01eEKLoX}&(!%Z!UN>L3Dy7Kq2zD}i_$*shLXpSNO}^|FOyCx!?RSutkm3J6Vo+U zNz&(x)FDY0(l9p@Ngp6--c{1$B(3oXNsr{DN9UzA%0IlH^iGnVx09yhSLIuu z;9F;+^Bz8@>yO8v^x{3FHImLs_N?c9B+2AB>6b`)q$_&fO+pk=_oesONL`Y2d5Uz7 z^j4B3&5}~mWs-DgoU}|jMUqZGL>fLiL-{2=I=8c=mNGmiNG^U=ampOu9Jgtc9;wR( z>CL-HvVWcBB~p_#e560}F~g_F$9wCHe3$fCkM#cnX;B%TE2Q%zOl8-zK(1ex9EP$t zJqJmcLA1|bQ~{54uo1uTaW&`RMbdTUC-%8kndI62U?=vqUFjY#H~W5n7^#@0CU0H~ zu`nc0`u%NcZ~L&#&C+id#~fn>d*-Cx=i+-QzL(>BHNIPUub=wTw`~}-T0VreL7Hw( zs!Ka*+bl2bu*syEiwg~r>)tMAp>!FYh6R`Amdsqcmt@u3R_*J|vdesG=F-%@(KrSEZgR#fkoZxL>9GGLVACAyE+-PSR4>n}6&?X`5yJ9=$o@r9sH6-8dmT5~$_ zMXMIe=_F+_=1k&{8Yx&;c;t*$HZLu_=?ET`TDZ&L(^d|0LQILQWnyDDH19HX;EzQI^5 z)!WiV1t_~5Y~|5tUgYvAD8}Su%ta$x9`ySOUgJH3ymWSD(CfKk(_HecoKuyoY}CAH zdMj?-o0Z{ocqNw8WY)l9wu^hLudA9H17B<+-Czenu3#nUa2#31i-VGnti$-#iL4Bo zI**mg@u7LcrBH1zX5NTb6Ncubt1hb^`BiSMYB7>u?G~Osqa_=;S>*^Zk0NQxwczae z#+KW;582+*`kM(OqBPON???KpT~2RFJK8Jf-8h>M(7s)zS8#yC@}wi>yqrb3A%dOj zWaQSMdQf&{hQ2*%>+>xU6=#eM#B+8Xmt>RXa-Uxxow*#US7ENYBBK!ky2@TS>Wotl zZq3`ZBJV{nFmBJ}_Lw_?7W!jT?!>rxEFaWuQHSlxbx6|6z-1R=n|2;mwaYo%zAt(S z>Vi04Y9|`DolA1J^@y5L4LxhRIrl+d8j!C^38i+8#dhOLuMjit~@ z+KrQgPH3#+g1Tkd53^HKsT*XiZr`;h@jp{het9;wd~vlgU-)S2jRjZwS$k;u;Niyf z;l{y3cKVUo>6ru5JTz=v^6QEAv#Z@BjYIFW(=)S&4_EEZyHGY(ahf4@++nl!jB6H& zPwm-3k@`)0tW)LR6;Pw=-fj3v?&K3==Uvtru*t@%cfDDA3e`?R*Y4BuS^dVw#$>5c zlQn-+J*N7VB*IjGD(~YP<+RykHOiFFruL65EiRqf5!1oR>9P6h5^JmymCV}G-z=xN zzmn`|^clgI$1ks*Zp`eo)0DW=#wpx=JL=6$Gby)MJ8OLyTTTasOB<)T2g0n)`Y{`h zA3AEQ&*S?tJAT|A+<$b;>}WK~{r?ppIrOx?yTXvoIq)JacpT;^ELzO%E+?>H(A~H)%WO> zqb)S8B96LM44rljF_-pS%V(~auq!Skuc&G3YwXdF&SkE=SgCGO0;6TFs+14nsTf;1 z0t7TU$n-Wby?7N4Tw0adCX0!+xJtM6WoIvWwjNyDnUe$v^p0rfW_j3R!H2GECTUWt z)pjxRUzX1(6H1qINigG}ULx{(xdvNL$Dm<%lhNSnw&6#s6dUYJeS2W_l9lz8Y@k3? zb4_n7kbAWJahi7DQ91RzHt7N^(R2-JMXRTgz2=Nj20bZMq>cibP90TU4BLyxU6>1aw?XDu9^y>cM=Nn$J4gxx-j3Te7SB$pR<&8_oJ zvZR&pAIXR4bmAiGu+9}D4Iicnv0W5{)!x?ltEMYn-ayAsME<11+_kVM#2DA1ozl8G z%8NFSl@>)j>PtTG|15gCmO?)K!qBc6QtFQ;Fm!7`0H8PqE#Z{gC`SzOv>2w;Y9>M@ zUyO`HWZ~NlJoUE6I79jCphBLq?NXgXZWdgDNSV^5r86t+q)>>*R<^!|c$_(vttU)6 zU;RtL2I`gXtoL#@;*^jd2U}@R^!>Fv?-v8#bXIM3BkV3+Wv?$%ydb0JuW=P9#xSl5 z6w!kiBO<7gAQ5xM_|KfwZjdD^$*5JKg2P?KtBK4>|1i*|kl-KtdC>jw;;|y_h}RS= zqI3j{BPyhEq5%0Xu&(=#18yS8L6cDlLUG|a?`Wa?KTiT8eD>BUygU}ezXkp&uSb8A zviNT8!p7~hx30KNr|{9;7;HUV#g8l_y0nqSR7Z>2`L-_@ZX#}~Ffcs7h|y-uy3}uE&c2 diff --git a/horizon/locale/es/LC_MESSAGES/django.po b/horizon/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 61431e98d..000000000 --- a/horizon/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,518 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Alberto Molina Coballes , 2012-2013 -# Alberto Molina Coballes , 2012 -# emujicad , 2013 -# Gabriel Hurley , 2012 -# zeus , 2012 -# Pedro Navarro Pérez , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Otro" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Por favor inicie sesión para continuar." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "No está autorizado para acceder a %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "No autorizado. Por favor ingrese de nuevo." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Ítem de Navegación" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "Seleccionar una %s para navegar." - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "La contraseña no se ha aceptado" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtrar" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/A" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "No tiene permiso para %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "No ha sido posible %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Borrar" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Borrado" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "El atributo %(attr)s no existe en %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "No hay ítems que mostrar" - -#: tables/base.py:852 -msgid "Actions" -msgstr "Acciones" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Ninguna coincidencia para el id \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Por favor, seleccione una fila antes de realizar la acción." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Identificado como" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Ayuda" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Salir" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Ingresar" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Ingresar" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "No tiene permisos para acceder:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Ingresar como otro usuario o volver" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "Inicio" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Darse de alta" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Info:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Aviso:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Correcto:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Error: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Resumen" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Mostrando %(counter)s item" -msgstr[1] "Mostrando %(counter)s items" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "Más" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Resumen de cuotas" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Usado" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "de" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Instancias disponibles" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "vCPUs disponibles" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "RAM Disponible" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Volúmenes disponibles" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Almacenamiento de volúmenes disponible" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Mostrando %(nav_items)s item" -msgstr[1] "Mostrando %(nav_items)s ítems" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Mostrando %(content_items)s item" -msgstr[1] "Mostrando %(content_items)s ítems" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Proyecto Actual" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Seleccione un mes para el que solicitar uso" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Enviar" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Instancias Activas" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "RAM Activa" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "Horas VCPU de este mes" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "Horas GB de este mes" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancelar" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Sin límite" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Disponible" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "La contraseña debe tener entre 8 y 18 caracteres." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Gatos bonitos" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Gatos feroces" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Gatos" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Gatitos" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigres" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Perros" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Perritos" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Mi Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Mi Panel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Panel de Administración" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "¡Hormigas gigantes están atacando Sevilla!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "¡Estamos a salvo de las hormigas! ¡Vaya aquí!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Lote" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Por lotes" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Ítem" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Ítems" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Abajo" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Arriba" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Bajados" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Subidos" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "No hay tabla de acciones" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Tabla única" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Pestaña Uno" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Pestaña Retrasada" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Pestaña Deshabilitada" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Pestaña no Permitida" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Pestaña con mi tabla" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Pestaña de errores recuperables" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Proyecto" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Usuario" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Acción de prueba Uno" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instancia" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Acción de prueba Dos" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Acción de prueba Tres" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Admin" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Acción de Administrador" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Formato incorrecto de dirección IP" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Versión no válida de dirección IP" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Máscara de red no válida" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Procesando..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "Todas disponibles" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Miembros" - -#: workflows/base.py:469 -msgid "None available." -msgstr "Ninguna disponible." - -#: workflows/base.py:470 -msgid "No members." -msgstr "Sin miembros." - -#: workflows/base.py:569 -msgid "Save" -msgstr "Guardar" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s completado correctamente." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s no completado." diff --git a/horizon/locale/es/LC_MESSAGES/djangojs.mo b/horizon/locale/es/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2805f37707731b74a8f43bada396b5b8efd769b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmYL^Pfx-y9ELS|+R?Lznt0IQ4>#}t1q_uHT-?8mL87+`b&ia7X^YVh;@9)D*r|~> zdD1q0+P?idIsQDbIkcQw&MillD@&7}Wn(w{c5Iygq)Kl1%0RG&C0DwX0;7~n9>|QM zCC%nR5<3~Mr7{rdqFlq>uF#N6jGQ#dVWK!Q_7M2YaEv;x*9Er=UI)21*zLDm8!JM_ z-^%9lKkt!}459>lg61+AwfrcTJTfm|`6D`up^Xu1eP6qAUeA&p27j*0JQbUwee zswj4>;E;2+#V924Y|&I6hT*s>+fo&K$5xGki0=RAwOwZ-h2g?J_fgy4hQFKZx?-gm zpw%l=nw!xgpF(f%HML&20xDK=U5Wyu-g9Z3wAv|F!BncP#z@pZOFilg(C>6~A<)?f Id6&+?H>UD*1ONa4 diff --git a/horizon/locale/es/LC_MESSAGES/djangojs.po b/horizon/locale/es/LC_MESSAGES/djangojs.po deleted file mode 100644 index bceb26586..000000000 --- a/horizon/locale/es/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/fi_FI/LC_MESSAGES/django.mo b/horizon/locale/fi_FI/LC_MESSAGES/django.mo deleted file mode 100644 index a1dd11f1c63d6ebe250da857cf698fe71a32b722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6978 zcmbuDe~et$RmX2g($IwhO@Ak$xlZHSZalMVJ4u~!Y_jpL?PYiEt#@t5EopLh=I+kh zdGp@*{g};!Rzmy`L_#VEK}FRch^$m0RUis-08uKme?V0!5~$Fs6-Y?X3Y3Vde;|Y) z@cG{NW_N8T1&OD<@AKaMdEPnao_l8h{_Z<|-Edu_+(+5E-I!0p!*_Ax`lUA;^KSS8 zd^`MY_*VE5RR6EQJK?u$zEbmhHUGWlYw#ZW-7!(kb3fD)55pgWk3;^>L&^K+P;!0~YQ9&X*83iO6Z{W&2fU5RHSSGN z^S%>mJt5AM$FG_5}M=ioc2|5YeCKM&stzX12aZK!eo1SR*YP~Y)y zP~U$$!pN=@Q2pLs^FAp5co6bu9;EQv7yLb_dH(`R|1ZN2z*pf9 zz;~l0efPak^6snoekeH}g6jVWd>?!k9)&*-WtW$r`u!c$eBXh8e48=<0;R{TyDPna z2}=IIhT4b!2(|8QIEQ#w&9~HiTg~^t_t1VnWQchTYQ2T}{W6q2BB*&bq3rtcy8Z>I zbw3H&Lgsg%*8f8&fA}jXIlm1L!2gCn4iC_%`DUT!n}=HW3Y0z_)V$rA&qF@h{Bqs? z8L0kSQ1bmQ)I5I*7vNvQY4{F|H3P3e&HHI6zjzU9{1@u_>rnH2sc!!&oZ|g!P7FGQ1U+lHQx!S@0@}1gQx5Ek3p^bvrvBc0#yIsfb#p#)$e}-AL4x*s^7mt zt@oc05zHMpo8-F(Y9AhisL~v+`2^IwEA{)+P;y*@xT5(L$e;NwZj$GZpyd5B)OUUZ zqB8SlDi6Z5vsQ1+dK>h}cHe9KUB^lE+_hWG;SrT&Xh{`7L){!0D+8f;R3A4(4X1@#?Q zpw@l1uHUHNhwv!%KLfQ7{{S}N*Wn>}CyQzPB-HrhkZovE%2|r8i1J~|lX~G=tYDUF zY93ws&MOpsXF^%0XwJhFUB@Z1-BXm0Qe>|c$}^M?QXZw~k{xvEoYC2!`0zC4F^aB7 zD6*|C>Ec<6Y@zQQUuWuvt5AOaA<7y>J}A5B`YFnO%1O#kP;|*hbp0enc0f($LCOZD zOOXyIDf5)~Q!J%Li7A&Tvgtm`5@nVmpO#(6mwZTZMAu!EbCkATxK2@Ac&hT0X`V5+ z=};c7>jnAe6OrRw?64{;s_-zWO|Tq<)dFYd`9e-Op3z^ul$SvOtl4?!9Js z8PpZWp!TP(BNW^|_@R7Nmtu$fOP8-;PQwe7p5FH#bnPNalS8@Pf3V{U_e?Pw_(S=g zh88X9>P8+a^XPehs6*>b4|a7__?_zT#vHjl`=svk;l3E|OX0o}?(MWch<)KZHZR+4 zpXY039FLkB(uq1YNeesf(lpaS&^&PH?Oc)GPN_&&z7qDFuJ9{J5(N@mI4VEEp)n+7Is_e{3 z6El~zQ`Frq>{^=jU4WfivaZv~@I2brQkEOL6%RufwW$rV}l-L;u7$}B-reOb}<76m-8KYyU=Qpuv{1g(#EK+{~HXJ(dMo^PfZUzvxU z>)6o)_V#W=zsw7}>iH`+y-)0MY}m0!j@x$EWyB#qv}u-N?{aTr6o-D0QhppIrQd1F z*$|k~*(}{;E=2XVaKQnJE{3fl8r`#0F$KqHHp5%kWJ~2>5D_&#RHlWq%VodsvXQyy z+bLF+u59qUu=SSR(3|D)azrJ>S!LB6VRowf$k$cNwbExJw42*9S14GH)-gv?@j_Yf zkgPL*Ws&7_RrXk}0w10?7KLVeA@N4M5-~NFu7<35^jC$os>h!9m2T!4v$tk5H7l5q z?U6;R3M~YCp4rQt)aS{8!usbTX2fYigg=D#SGrhlQD1aG!MkxTE%Ck^YA+K2$Mw;= zobyr=^o9y{kCQ#82F+#B)i(5n=)~=F)(_0X}mnuWp&S;*O==xE>}^bW$TbM zanTRbtY|Fe>rtoiWVxOTGUzW&CYCO&G)`we?DfWs zD}2iyojP)?F?FnQWLs*H(9H7wo#o*EUtTSNrF zG)dT_*npiKh0MrDmXirrrM4{CvMGT*Ay+cfy&@W>5ph$g5w2XA`Ry$dv!WPPSdC!lE?JdsVyrl8`s7E%$ zQ4_on^_adVe1uz%&F;|OfwrjC*OXz#c4Eqo6&9Yuslv_GzlKC{sB1f*= zb>x=lq3ooUdM`&=*SE~MGTVrpMSoJUaxzZt$XuPi+O!L#O3EA7_oQecJ+mP<^I5`? zzpV6(gnqzA7^i2KrNeA{tIEzery??|Mw(+ppP3m zasUudT`%`J`)aqTFbh#G0nH*wO~OGE$5B$?_0<-vYL(e(L+<8w3ix)^%aM2cx|xj# zie03_a|>6-G6Z#*+i>9lNyD}e9k#d7-Au^iEWty9mDq&fVbi?qN3N-{JK{&k#yiPL z<<|MmW(~21-Nc@Y9aeBo^L0lE(aTZNXs3ZAR1%Cv?C;o-=xsRVd40@8Orw8{*GR6h zrs+`hT&=FlShOGq%%WjreWLvvq7^}oC*Si5eql8G7L&(ukaQ=@(>`C~rw>|bTE~f` zbx?A&ecg^?ALTuMeYr9xGnFdX*(9?zcz4+0E7*i(ozX7<2}0&a(m6IK9#+@)%Cg5i zD31x#O8T)PufMLdT#8dN56mc+3Xv(8&n#?jbv;$)LKW|$mKk+%{AB3)6)?+r+V9r` z6oV)jNd6Os6UYol>z+P3Evg7lSmn11YTK!yKB#oJW;z?Dj$l)#hZr^9zCP-VsN$DD zd7(8c+gk{b*y@uzn1t+*6DZ-3xwS3ih~w5M>XDeqoygc-7QBsPsuNbM|NF2fUBvfN zMg+T*EqgT!BYR;>7Pu>W*p_8SF~O5EUX8o5zI=cmCRJ=U!I`n^Xz$j;Y#HIC%v4OTBkYQuzS#N=K6J%%#G(|`ePi#v6SIDckX0ZWS%hMjG684)2aS9T82|tP diff --git a/horizon/locale/fi_FI/LC_MESSAGES/django.po b/horizon/locale/fi_FI/LC_MESSAGES/django.po deleted file mode 100644 index e8d2c178d..000000000 --- a/horizon/locale/fi_FI/LC_MESSAGES/django.po +++ /dev/null @@ -1,513 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# copard , 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-05-02 12:39+0000\n" -"Last-Translator: copard \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi_FI\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Toinen" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Kirjaudu jatkaaksesi" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Et ole oikeutettu päästäksesi %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Ei oikeutettu: Yritä kirjautumista uudelleen." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Navigaatio yksikkö" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "valitse %s selataksesi." - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Salasanaa ei hyväksytty" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtteri" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/A" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Sinulla ei ole oikeuksia %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Ei voida %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Poista" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Poistettu" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "Arvoa %(attr)s ei löydy %(obj)s. " - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Ei näytettävää." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Toiminnot" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "ID \"%s\" ei palauttanut osumia." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Valitse rivi ennen toiminnon tekemistä." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Kirjauduttu käyttäjänä" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Apua" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Kirjaudu Ulos" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Kirjaudu" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Kirjaudu" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "Teillä ei ole oikeuksia päästäksenne:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Kirjaudu toisena käyttäjänä palataksesi" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "kotisivu" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Kirjaudu" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Info:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Varoitus:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Onnistui:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Virhe:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "yhteenveto" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Näytetään kohde %(counter)s " -msgstr[1] "Näytetään %(counter)s kohdetta" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "Lisää" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Kiintiö yleiskatsaus" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "käytetty" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "kohteesta" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Saatavilla olevat Instanssit" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Saatavilla olevat vCPU:t" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Saatavilla oleva RAM" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Saatavilla olevat verkkolevyt" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Saatavilla oleva verkkolevykapasiteetti" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Näytetään %(nav_items)s kohde" -msgstr[1] "Näytetään %(nav_items)s kohdetta" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Näytetään %(content_items)s kohde" -msgstr[1] "Näytetään %(content_items)s kohdetta" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Nykyinen projekti" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Valitse kuukausi katsoaksesi käyttöä" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Lähetä" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Aktivoi instanssit" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Käytetty RAM" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "Tämän kuukauden VCPU-tunnit" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "Tämän kuukauden GB-tunnit" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Keskeytä" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Ei rajaa" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Saatavilla" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d tavu" -msgstr[1] "%(size)d tavua" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Salasanan täytyy olla 8 ja 18 merkin väliltä." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "meow meow kissat." - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Hurjia kisuja" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Kisuja" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Pikku kisuja" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tiikereitä roar." - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Koiria" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Pentuja. aww.." - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Minun hallintapaneeli" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Minun Paneeli" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Admin paneeli" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "YAY. Let the giant ants attack San FernandSisco." - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "Olemme turvassa muurahaisilta, MENE tänne|" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Sarja" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Sarjoitettu" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "kohta" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "kohdat" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Alhaalla" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Ylhäällä" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Pudotettu" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Nostettu" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "Ei tehtävätauluja" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Yksittäinen taulu" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Ensimmäinen Tab" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Viivästetty Tab" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Poistettu Tab" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Estettu Tab" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Tab minun taulussa" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Palautettava Virhe Tab" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projekti" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Käyttäjä" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "ensimmäinen Testitoimi" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Insanssi" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "toinen testitoimi" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "kolmas testitoimi" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Admin" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Admin toimi" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Väärä formaatti IP-osoitteelle." - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Väärä versio IP-osoitteesta" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Väärä aliverkonpeite." - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Käsitellään..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "Kaikki saatavilla" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Käyttäjät" - -#: workflows/base.py:469 -msgid "None available." -msgstr "Ei mitään saatavilla." - -#: workflows/base.py:470 -msgid "No members." -msgstr "Ei käyttäjiä" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Tallenna" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s tehtiin onnistuneesti." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s ei valmistunut." diff --git a/horizon/locale/fr/LC_MESSAGES/django.mo b/horizon/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 3afade6f2e2c2e5fb19afc635ed3b144a5064d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmYL^K~KUk6vr`o+R?Lz9z1CDX*V>PMF-kxHlSKZ> zFMUma?R)(>KKgE94v-V%6gfmLktQ)x;Ncyvjq{(GHE(j|VN$@ev`!h#$fL39%jjS( zYhyiRu2cm)Y)c2ZVI-J60!idltM&k>LK@sNiT{VyHy$I+n z&={|@r&}otlC;p!N}N+V?@_~Ti1;`WLI|2H0hD>yc4v30S;qw1ONa4 diff --git a/horizon/locale/fr/LC_MESSAGES/django.po b/horizon/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index d180f4e20..000000000 --- a/horizon/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,510 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2012-05-08 20:22+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "" - -#: tables/base.py:852 -msgid "Actions" -msgstr "" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "" diff --git a/horizon/locale/fr/LC_MESSAGES/djangojs.mo b/horizon/locale/fr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d0afa72c055018cf057fb854e9e055f6a8f0cc16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmYL^O;5uh9EWH0)T3t)96V^|U)#+?WiJ`7Y&P~SUAIJUxM8j7paEv|gZTCQEK)V@ zmplQ&1N`_pKKks~99T{)rx0_|uZP@g?D}2T#)^>h zx2nDT&wHRGhd70Rpt}^uVfQgjs1q@5pioTcni;7unk}OUB_yV3NMjO46A}bDT`a~{ z73GeV917017)2zRFWbt)D4NvOrBvnKu~p+Rru+YSm##CF!f;`q`)F)$!{5zSQ?p78 z(E5cb&CO_8%)sA!ZLMdnfQq%;RHDSlf2xd=)jP#%m`SzO7>VX*sYks5`kju>1R5jn H-06G+Fk^G# diff --git a/horizon/locale/fr/LC_MESSAGES/djangojs.po b/horizon/locale/fr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 559b85f27..000000000 --- a/horizon/locale/fr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/hu/LC_MESSAGES/django.mo b/horizon/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 92a2fec01d968c87f59bc4fd31d418c971cc1b46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7176 zcmbuDdu(J^dB6`Oq~P)lX`m!6#|xWXlg!xrV6%81jo16Iv-Yl8dw0Vt$(fnsnd`Z8 z@8q5{<9PTdQcFet0j&_Nf&kS#wSfo)!$yi)5L{V2s-jk+2oVvfQCk#Bq>4&aOVz5s z@7_D(vGV}LmCya%^Zw5Fedjx8{Pd02e_ZiAK)RLmx$BhrOL)ic@#6XLtCV^(d>GyY zKLg(YpMcW-d+-(TUkm=C;4cgQSHb^-Z=v1wBl$RQg)+rK_FKKrNlzs=G$a4g~7S6zv@G?9MKM9Y*e}ppbjWia%3CcLPLK)|6kS6N(qWn&{ zhx~CU?U$jnYr?le2c`eV;49%Lpsf3|@Q>jWQ2PA{$~vEd(*K{J^m`War~aLn)c-Hs z4X;C)(rye&|9w!}9fC5?G{hCu92EU5K(W*PMg0R%{GkVT!H+^&*H@vm{|1!#egMTD zKZGUt927se1tpf@AxM$3P~>q1KUkFiDf|PT6KsN#VQUQ}7flVXRr`pxFCwpy+WEihq6=%Dg{>BJWdB+Wi~61O7)*uUV9o z?}4|#aVYbig(Am$p@uam`}9Ll#{E2$^?Vu1d|!vs?^{sT_4h^oX?Pd;=b+fD%wmKG zp|qPU@-tBO;W;S!xd26;8qD+r#hxF5BL9~luA+VnrTw!|QbB=PE2DC1l# z@()1K$D>fz{Uj8*zYS4|`UfcU{H&9E6Da!H&7^yNoPp%1f=(pPDqAlK8IQ? zI95>XahW9k9FgiIkxA?&&ta0pl6y$^lEhw1r29yBk`9sN5j)6plq5bUe*FQGtV15r z(?s@_$JYD#mNm<|`p@a&<2_K~lkA;klEh50mptz$?Is-~iEZWCn?v0VQArlV-wszu z4U)t%(c@XtZ6r;aB!#4lB+>aOX@MmBRBW`1)PMHyA$pfb{A7kyl?=~ulF7dEd&(5w zxQD8d4i@DCwoEykN2MzAMYzN;=8vO-{LptNV7%$5}YH6Uk*Pf z$+U}t15o0fJo`v&lgxj_SLKntUCO?Qbp@y4c~VpIyZ4%^58`Od>D_y4#+&>6THB7f zp^8ar;>wE43SH2%V>N1beCW!Ww}av=#~4nZIU(<}*?T^FFJ$kf>|Kpp?a+E#)2>sk zTIZHKVYpV7F14VhquA?yld_u11a%p^R?kMxn}|;Rf(ujgYO2->qWrD%_C;pFL^f1Y zVW>^l1fi*fR!u$sYk1UttsSgdRyIF-(CycK)^0%$2 zX^}Yu-l^$MlGw=Wg(P0FRZreqozSW+V`l60Z7{;qx*)|=6 zsE*C5apW2OzQEfS#?wOS{n9Pm&L$m3NnWJ;aNUlMk?Fp~%sXr89M|Qw8f7mObt*~X zWKyfsflaD~T22Qc!l*NWL2D$ZO=7k2-c*~i=tUFh(+L_5Ts0n5Gd66inK%i0ainIW zYK*$8UN6T<%Vf~A3)<9b37$v&a?Esnx8kE~LY&ZbDv|ZNWn6Pm*0qUa)5u8Mh7b+U zin`U=z@vPp=Hj}ZjRbXU6hzu&WjHBCSr$)UUbdMZbev5zL)K$mVMW@uSR!#32@1Rtupu&gu}wp&z6aKMtaf9aK3s1ZFfk ziB}m5QLXkSa{%AKuz5tIc@j%Z!7<9^ESGJvg-*L25H;T2iM`Q_omR^vYwCin##mK! zr8CdVw%(%YTD91pj;Mq<6=rn^GbnB$Uqfmh=-6Zp?K<6Y5(*ZBI_8LSp6_@*qB`T} z7Fq06#2$-z;KTF!qEM~RM^*_h2Mmp+^Davk{pDdTZ!wf#Y9y9E!zHV+TEc{Ek0hu_ zXd&41&0em>)dehlp|HL%{itZ0t}@6t@%!TYwAULpYY%Y(W&=fx<~ z8!Fg3PKHhmsyn_R+tAj^y0EWDRoIw4klESPO%RpU#WsI!eCDFdUx~VGl88nq=rU`; z)Dc#9X4&fHByMF?WEp6 zvF|`>;y`KNem!w;a^mpq6Ff95U9jCi*0ZhM!P5SB>50RW2M*-z=8W^DC4#044QJS- zK4U6LU_(9ANkY4(kJj`2T@E*DTC-})oXN*W=1f%Yu*lMqHLXc~3fB%?L+=&wk$!b` zwd`foVA(z>J;vL)Cfs;?JZ=*kC1|tAe3Wq;jgO7Y&(5FPQq#Wj#K?4hh?SPOl}u`H zAN1p#UqN&viy6-PV;7fBmkw{WlPL+OrBj6aTIM&0D}f(Ki+VdF3t=ZQVd*sIfSc4& zJIlIb`;X}S^Vr@(e#*U1rEsw^zf2Rvly1wEWF26YGN}m07HzbG3Ii3iX1UkE7 zdz)8k={4`OJ5pp@dbp4_Wi`L~csIK-G}Tnor;l}YJG~m#()DO99u&1~E8R!}li!X4 z*Yiobj`eru1Klcy+g4Kz(hY};%bhCy3+H;)X&a_jlZN%1SJbH&`rIbQV$W1eO%KG_ z>Y?R+Rca26p?$i}z~S0(Sra92D{88<@=>>;ANrb4uht#MrK!4Ry53ZGqmL-G^+0Dn z*p!=Alcn|R&!$&h$Pf(Zxfi5=9jc}DTEZ#_eSD$!f!{TAm?zKuB5(e9e< z4SGKR;^ot;p8eFa^%W5$eT)Lc`>h)GZ(1)g)~{_ceCc}8aejkFXFGmP)H-L?v`eow zo7^(d&rDD;L}_j+)!1z*cd@tmc!E=;A4`IC-4QvXx^x$_woGkBKDXW5N`6!=rcc(> zjltcGiyS{M&>gp}QZ;=Hw`cF-u^sMP+}q?^e3I!G`p&M>hm&r4H7Yuqu#v8Z=|+#p zDVMokb4P>z$X%NGm}Zz>>{dWrEpP*uIl*2;9^bS*@sbnb{cR2retvjz+bT2nla{?~ z8*7ARTeEY+269B1SWP7Lcj&IEb1X8{3QY;#u4lC2CQxVV;)#`tx+D`O;pUZg2cOSx zfTdC?zX9f2ki95(z#yt(he0?Hg;&CKU6z*DHDi2yy`LNM&uklKqj1^FhVh1$91z;< z?TzVY9{Tid_sm0|(uSLL?8Kut8gZ{^Y$J#tqZpAh?WS z$u1M@l1Ps_Io#R#7A-rDUfT8bqw$q`VjE^f`WWQdydq)tv<+)UMxl5+19gIceKRv{IQbR#ltek3#EkTc<3{HozFZ=xC;D`D95Dg*Cy%(KBZ zKgBY+j~E&@iGqYS$EB4Mh>exU`FiH=r$V=RC11s&VF&vm-{MXt5!4c`rIEKBE(0yA z8N+X{8s5L7d>-|3UO%sVO5AO5Z_Tf=>67exEr%aF#oHdeh`&*B@^T@Gj1fTP=4EnIZpiF~+@N@L!R;<9h5mYz{6n8gIi@mUFFh z+fC99j{0x~$76$WLd))s0-Zj&l9b;A{=<}x~, 2012 -# kelemeng , 2013 -# marton.kiss , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Egyéb" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Lépjen be a folytatáshoz." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Nincsen engedélyezve a hozzáférés ehhez: %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Jogosulatlan hozzáférés. Próbáljon meg belépni újra." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Navigációs elem" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "A böngészéshez válasszon egy %s elemet" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "A jelszó nincs elfogadva" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Szűrő" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "---" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Nincsen hozzáférése ehhez: %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Nem hajtható végre: %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Törlés" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Törölve" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "A(z) %(attr)s attribútum nem létezik ezen: %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Nincs megjeleníthető elem." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Műveletek" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Nincs találat a(z) „%s” azonosítóhoz." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Válasszon ki egy sort a művelet végrehajtása előtt." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Belépve mint" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Súgó" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Kijelentkezés" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Bejelentkezés" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Bejelentkezés" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "Nincs jogosultsága elérni:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Jelentkezzen be másik felhasználóként, vagy lépjen vissza a" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "kezdőlapra" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Bejelentkezés" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Információ: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Figyelmeztetés: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Siker: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Hiba: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Összegzés" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "%(counter)s tétel megjelenítése" -msgstr[1] "%(counter)s tétel megjelenítése" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "Több" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Kvóta összefoglaló" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Használt" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "/" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Elérhető példányok" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Elérhető vCPU-k" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Szabad memória" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Elérhető kötetek" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Elérhető tárhely" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "%(nav_items)s tétel megjelenítése" -msgstr[1] "%(nav_items)s tétel megjelenítése" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "%(content_items)s tétel megjelenítése" -msgstr[1] "%(content_items)s tétel megjelenítése" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Jelenlegi projekt" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Válasszon egy hónapot a felhasználási adatok lekéréséhez" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Beküldés" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Aktív példányok" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Aktív memória" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "Havi vCPU-óra felhasználás" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "Havi GB-óra felhasználás" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Mégse" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Nincs korlát" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Elérhető" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bájt" -msgstr[1] "%(size)d bájt" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "A jelszónak 8 és 18 karakter közöttinek kell lennie." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Cuki macskák" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Morcos macskák" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Macskák" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Kismacskák" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigrisek" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Kutyák" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Kutyakölykök" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Vezérlőpult" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Panel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Adminisztrációs panel" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Óriás hangyák támadják San Francisco-t!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "Biztonságban vagyunk a hangyáktól! Lépjen ide!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Kötegelt" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Kötegelt" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Tétel" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Tételek" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Le" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Fel" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Csökkentve" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Növelve" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "Nincs műveletek táblázat" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Egy tábla" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Első fül" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Késleltetett fül" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Letiltott fül" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Nem engedélyezett fül" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Saját táblázatom füle" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Helyreállítható hiba fül" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projekt" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Felhasználó" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Első teszt művelet" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Példány" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Második teszt művelet" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Harmadik teszt művelet" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Adminisztrátor" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Adminisztrátori művelet" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Helytelen IP-cím formátum" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Érvénytelen IP-cím változat" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Érvénytelen alhálózati maszk" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Feldolgozás…" - -#: workflows/base.py:467 -msgid "All available" -msgstr "Összes elérhető" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Tagok" - -#: workflows/base.py:469 -msgid "None available." -msgstr "Nincs elérhető." - -#: workflows/base.py:470 -msgid "No members." -msgstr "Nincsenek tagok." - -#: workflows/base.py:569 -msgid "Save" -msgstr "Mentés" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s sikeresen befejeződött." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s nem fejeződött be." diff --git a/horizon/locale/it/LC_MESSAGES/django.mo b/horizon/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 950337726284e077349f71bceffadc910a64f374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2915 zcmZvdO>A99700I~C19W-h4NjP1dQ#__nzaVC_H0?N$k`jPOaGCLqbC1d&loha^Kvm znYniSBqRi?1VVHL0v3SORV#JbH3)T8v7ust5KALFg%)3q+iIM01?wvay z=lsu^<2Ro;^=n02qJNHFKBCkreC1JoXuo}*QlEjpgCB>l!qf0|_)+)QzSrS-_$Cy)9^vOx@H7-ZH0;Aw_z`#q%KCd9e+*fweg?(vUv}fafy=!A5sH0( zgBRdGpv-@iL79IVei5F9EASckXEYr{(RUFio`4&WA@x1@IQ(Hp55=AzLAF-U!?W-g z-S^*j-(P`p-m6f~|5G>q8Wi3C3T6L)!KdL{a2}pvk?j8r6#dqqjQ;@2{GUM4`{z*d z;AJRw{2Pj2|AkM&GjmF09oG0xZ zeJMXF^@)xPQ0x+)FiCxq{uEteB~5ZrnrNlzq7A8@o8+OiMY_b|v-A(sMR$pn=p}7_ zh8*ASF~=l7&qrOhN_DLsMYRz^9fn$MIva{^-lnUP z4eGixY(tOQ1glL-rnu|;Nbef2Hv>nySk&j#mM?0KERsH`!^C9htsQO3GT;{9XU6hy zXewNb?Y_53PfWaff9%kPh=;Ppd)I#3rDXB@X02Valc-aTIp6{#YcnfOB#CTMPQoERSHR#=-yxOU(iB?zjNINfk7qw5$x3+)sDWVyk z86D~)y>B_d>SVGEX^gKX2ZrgPmKY*Wzn|Z-_B(CUIHI&`4z1dqg&DDT+sVX)W3`8= z$Qs%ku4xo8rjo{xD>S!bcf*sU8ICJxsygn3w* zU0#aAnO$)yiudAgZ>#KmXBNnzepc+O{oF0v)FJh@`l-M4ngWtrQl+F+{QCU=rh`6j={wUt#pdt6)e`rMknxU@PaHK!{_sKX=I zncF_WCT;>BJ+XfoG%^OI<2WaomWO}n^;gijE*%kQN(5)at$+m z)g`*srL7*`;XTvTwkyQBo7}C|Yl?}8N)0obtZgZW(<#NZ`);!Il(*WK)=w!qHYS%^ zm&}Qwj3;;C3a-Xsor|1W&qCZ_%1N1%aJ}}D2*E<0U=K| zI`g!af+x|HlHYnvKvmrYH!&1mZKEBvF4w?{xXVN`WL=7MX&G*U9o1b0%;DzW4?#nH zMA$Xep*bmo^-$e%wsDlKTHRQX(kEpw7noTY6fdwTqC54htASDi1A6j}`Xwc1N<{nm z7XKc65~E!uWiZ!186pqGx@_q%D-fd;w};kK-zj{uX>|Gj3vLnDEY(EHde-d!mcDlZ DLXqwv diff --git a/horizon/locale/it/LC_MESSAGES/django.po b/horizon/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index f33dcf3b1..000000000 --- a/horizon/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,515 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Loris Strozzini , 2012 -# Salvatore Orlando , 2012 -# Stefano Maffulli , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Altro" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Accedi per continuare" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Accesso non autorizzato a %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Non autorizzato. Ritentare il login." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "La password non è stata accettata." - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtro" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Non si dispone dei permessi per %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Elimina" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Eliminato" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "L'attributo %(attr)s non esiste in %(obj)s" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Nessun elemento da visualizzare" - -#: tables/base.py:852 -msgid "Actions" -msgstr "Azioni" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Nessuna corrispondenza restituita per l'identificativo \"%s\"" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Per cortesia, selezionare una riga prima di eseguire tale azione." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Attenzione:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Successo:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Errore:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Riepilogo" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Progetto corrente" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Istanze attive" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Annulla" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Gattini carini" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Gattacci feroci" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Gatti" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Micini" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigri" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Cani" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Cucciolini" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Scarrafoni giganti stanno attaccando Napoli!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Progetto" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Utente" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Istanza" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Amministratore" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Formato incorretto per l'indirizzo IP" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Versione dell'indirizzo IP non valida" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Maschera sottorete non valida." - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Attendere prego..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Salva" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s completato correttamente." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s non completato." diff --git a/horizon/locale/it/LC_MESSAGES/djangojs.mo b/horizon/locale/it/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2805f37707731b74a8f43bada396b5b8efd769b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmYL^Pfx-y9ELS|+R?Lznt0IQ4>#}t1q_uHT-?8mL87+`b&ia7X^YVh;@9)D*r|~> zdD1q0+P?idIsQDbIkcQw&MillD@&7}Wn(w{c5Iygq)Kl1%0RG&C0DwX0;7~n9>|QM zCC%nR5<3~Mr7{rdqFlq>uF#N6jGQ#dVWK!Q_7M2YaEv;x*9Er=UI)21*zLDm8!JM_ z-^%9lKkt!}459>lg61+AwfrcTJTfm|`6D`up^Xu1eP6qAUeA&p27j*0JQbUwee zswj4>;E;2+#V924Y|&I6hT*s>+fo&K$5xGki0=RAwOwZ-h2g?J_fgy4hQFKZx?-gm zpw%l=nw!xgpF(f%HML&20xDK=U5Wyu-g9Z3wAv|F!BncP#z@pZOFilg(C>6~A<)?f Id6&+?H>UD*1ONa4 diff --git a/horizon/locale/it/LC_MESSAGES/djangojs.po b/horizon/locale/it/LC_MESSAGES/djangojs.po deleted file mode 100644 index bceb26586..000000000 --- a/horizon/locale/it/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/ja/LC_MESSAGES/django.mo b/horizon/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index a919bcde127e358777c2082f3c1dc8d96536d35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7551 zcmai&dvG1qea8=hJgPQnLkUR>Y1SmfIOOVK8*t@EB5Z6cNLW}hCQTc&x_2e5eed1N z?p_Jg$yE1VY~#^(PT1H zrk~&0y?R-OoqP7P=Y7ua_dUN|>A!BhGugJ=WKE49^sr%#n>Nx*6tfjmQ%KV4m=iv~PaeoBG{y%|VgYUtQ!7pGW z+4mh#);lleSD~!qUMTJFgI|VEz=iM`D1NyJrQLr*8E*{!;3lQsfnv9#w?=j!fwJF! zg8bCKag%x9jro4e-^TnP<}HZlE3~VMSp!+RYJ;+$6cm4zpzQN7l>MK8((Y1R|27mm z{}PHHeg*G8^3NbHS?8lr^zt1j z`c6Wz_jV}j=!dfJ4)RmClM&X%Y=Vo)cS0nl4#(xMLmBtSQ1k6hqbibIe@T*9w4C$}l3e#hP~U=>TKhm%BmI6jGv!`4J72LQY6tv<>IKR zZ<3ahM3d`D?WD>@NYR?8}6V*-u*wQq<0RFxt2J)?~5HF@|TXc~I^T>wB}lx9EGDz9*ebE^YZ%%JA~Zq~&=X z`E+_~wRB0@DI@FnMx{x$YS0VyG`lUMG3)temQIy|^$pFcA(gSS(cOsJ$C(y0Yo%2~ zI&GNUrkyt1)0S$u{%QKCm0Cj&JeliW*|LE-r}9oZpRo+jcU-e`+Mq_auJF`@rl0JJ z?p8{zlr^V;@2Qn}*R`^~(c(Irt)x%hw+vmg%1WDCF-x1-u6V{oF;Z%k?aAunIx^|B z(=(OL(b3L!;t=P#n%y5V^XytWJDqat z$?6-1ddPJhx86{zZOcu@W?5~gS&Uj^n^=wH8K!F)rth1{EwbrWGi$7Nv9RqWoq1}l zmCmWPj%z>dWL0A}>0s`pZ*(|r#?&wxTMRRma#0@j9S+k~WW__bnMQ~xHFc4YXDYPK@%Os1M0*HX<}ja8=C)$W*XN-~kCAE{|jkC@$drzr>7konakPAq>< zB!t!}XtFc5FArJ}49?724AoMIMUq{HYx#LM%SvTuewSrnfV=MY?uwd3Ymw(HR$%)Q!wx=pGdCxc6Eq;EFWo3;e_%LPEEisZ^rb`@Rqt&V< zZJC~Bq%j=!VU?m|JDayAt2_<_ZZr+o>0vCEY8k$%1>kq#*eIgW+;t?TAdKp2ozsV` zC7;XLM2$!Dj&B;R`Ao)ix2pA4(!r}@D?=+!AH7zy+fuES>4-`!r=3|n7Bg9#VSQav z^JLy~w_;t-$a@kBTJ28Uk&U=6@AHuDWc?S=`aUMJJu8dT@~E;)u)s@jPC>tiZ> z%o)&rHakr_Tdg+a_~p>d1~0m~YNP39X@r3`vKL&P#p|BgVHq8+lhILNp0UO;mYFM1 zp|z~WTrp35+sVgmk;CNV;v`X}$IH&sZBmYwY8QSsa+aI1kqhRy(N1L8lp~g#)k7;I z8oFL}IlK>Yq5!8uL@2ULG^P@dMNy;Ph(l7b7M+GuqvksC~ewtF2$SIBM5qdVZpfpy{Pe-eL7d!xp>Cb{(U6UE8{c8?kG~ z@trO9H#;-DIIDRduc&G=vz>W1m}s-iOug|fGso+dLwk>`ou&8m^i=yYq}^dXC0%NA zkr}+2T#b_>FiON`htV)Ko6VX9Rn3jf4^7#quDZ5rW%LG1wDCz&Z}`?zehn`#JG)c| z4A1hHZ)jVcSTfa4rX-do9wOGKv}l&J+y3No>y6E3RZBYWn(4%9UIJddkx4dqt z5j`%iU0S7Pdsqdq|f`Y>C^0^b?@NiIgH5}YM z`quWK@M2K7s_#dF-l7aaqnULt2gT=t!s)3-LGgG{914mTgVO1s^rjjcxEz-Dj1He; z{dy^H2E|K3@fvkJsL?Ce#-1ODt4qg%((#~lHYirYYE@7i2uf$LJb`;`&+B8mUlzwlyAMk2`vmgQ`@XEg ziv!_Flzevl$Ot+Qia!vI(ntnCtQWO#dDvfmex$s=q)l^58a^{g25VUq`i?=uSyV$6Ly1`!3sKoU**@zB1}k%QdDqH_AIzj467JyvPpF;``ybgENG|x1I43i;CWT6VLX`)?Sd% z9PaJYF&cmGDjz1Y4@R3}$y29kGJ|E$a}a$6rS00m1c_JGL~mjA+A&q`+Z*mY zLTHJ15=D5Ujv=NR%QmzdnF|5Dk{oFRkcfqayXuk)4qR`2IJ_hl&#io+I4EWm7NTN|la@XPBz;StQ1, 2013 -# bi.yamagata , 2012 -# bi.yamagata , 2012 -# Tomoyuki KATO , 2012-2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-05-07 10:24+0000\n" -"Last-Translator: Akihiro MOTOKI \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/openstack/language/ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "その他" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "続行するには、ログインしてください。" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "%s へのアクセスが許可されていません。" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "認証されていません。もう一度ログインしてください。" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "ナビゲーション項目" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "表示する %s を選択してください。" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "パスワードを受け付けられません" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "フィルター" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(data_type)sの%(action)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/A" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "%(action)s を実行する権限がありません: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "%(action)s を実行できません: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "削除" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "削除しました" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "%(obj)s に 属性 %(attr)s が存在しません。" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "表示する項目がありません。" - -#: tables/base.py:852 -msgid "Actions" -msgstr "アクション" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "ID \"%s\" に一致するものがありません。" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "このアクションを実行する前に、対象を選択してください。" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "次の役割でログイン中" - -#: templates/_header.html:5 -msgid "Help" -msgstr "ヘルプ" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "ログアウト" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "ログイン" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "ログイン" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "アクセスする権限がありません: " - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "他のユーザーとしてログインしてください。または、戻ってください。" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "ホームページ" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "ログイン" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "情報: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "警告: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "成功: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "エラー: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "概要" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "%(counter)s 項目の表示中" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "さらに" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "クォータ概要" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "使用済み" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "/" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "利用可能なインスタンス" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "利用可能な仮想 CPU" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "利用可能なメモリー" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "利用可能なボリューム" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "利用可能なボリュームストレージ" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "%(nav_items)s 項目の表示中" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "%(content_items)s 項目の表示中" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "現在のプロジェクト" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "使用量を問い合わせる月の選択" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "送信" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "稼働中のインスタンス" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "使用中のメモリー" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "今月の仮想 CPU 時間" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "今月の GB 時間" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "取り消し" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "制限なし" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "利用可能" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d バイト" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "パスワードは 8 文字から 18 文字である必要があります。" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "かわいいネコ" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "獰猛なネコ" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "ネコ" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "子ネコ" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "トラ" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "イヌ" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "子イヌ" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "マイダッシュボード" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "マイパネル" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "管理パネル" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "巨大な蟻がサンフランシスコを攻撃しています!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "私たちは蟻から守られています ! こちらへ !" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "バッチ" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "バッチを実行しました" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "項目" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "項目" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "下へ" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "上へ" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "下げました" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "上げました" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "アクション表がありません" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "単一テーブル" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "タブ 1" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "遅延されたタブ" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "無効化されたタブ" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "禁止されたタブ" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "テーブルのあるタブ" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "修復可能なエラーのタブ" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "プロジェクト" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "ユーザー" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "テストアクション 1" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "インスタンス" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "テストアクション 2" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "テストアクション 3" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "管理" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "管理アクション" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "不正な形式の IP アドレス" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "無効な IP アドレスのバージョン" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "無効なサブネットマスク" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "処理中..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "利用可能な全項目" - -#: workflows/base.py:468 -msgid "Members" -msgstr "メンバー" - -#: workflows/base.py:469 -msgid "None available." -msgstr "利用可能な項目がありません。" - -#: workflows/base.py:470 -msgid "No members." -msgstr "メンバーがいません。" - -#: workflows/base.py:569 -msgid "Save" -msgstr "保存" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s が正常に完了しました。" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s が完了しませんでした。" diff --git a/horizon/locale/ja/LC_MESSAGES/djangojs.mo b/horizon/locale/ja/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 18261fd6509930287ac88800a52455ef293474b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmYL^Pfx-y7>6->+R?Lz9=zd;8+d>Mh6)82_b+3R=&g=AXJ)%}#pnm|>-kxHr$&Cs zleX#8_Sdh|lg|$32suN}kz?cnX){D}+#KQ9I{!(Gev!Eae+OG>no=uD5;nhMD^9jN zUHft5q_Wn=Lf91L4sP~E1DU48N#YFVMhc6EU?Hrer0;qIa0lS^iF-xeQP;(w2&sH4 z+spsFd(Kh_V^}b98`IG5KEx4s0?}B=j8IJ_tTvP^H$gxm7IHG-A@hS7TP#w(USFfC zioGZ#WKz6R60m5sX)8~HU{;kqZHj|~RYO1IhyQs!*O_Z&rNZYvYV2+0yS=O{QK~V? zpM`0poo=!v3=dvg>q#2mD%ZPG6_gAgOY0=n-iQj8+PpTDsQPEwOuaGrolae+^9^xh Ba-IMH diff --git a/horizon/locale/ja/LC_MESSAGES/djangojs.po b/horizon/locale/ja/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8cf0876c2..000000000 --- a/horizon/locale/ja/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/ka_GE/LC_MESSAGES/django.mo b/horizon/locale/ka_GE/LC_MESSAGES/django.mo deleted file mode 100644 index 7acad3715fafe1b2b64a896c2526be0510bd6b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1960 zcmZvaO>7%Q6vu~BzFeR*P$&hdLj_W+Xl*C1MA#5SXp*K<+?d3H3ldE1iM?b!yV@Pc zO)ntr2@WWHga&9)+JYbwDhIfMgt%}(oDm0vw1_(rqT<&yi%G(djQcc?Y}= z`l}$>eeLw$f_Fmx9wfg%f@JqINOr%16z30+{Qd=!{XgJcAiLGt6+o!i5J+|h9S?(K zcf|2H_zh~SfR91{CyXBk4hX@cKiyYp8eqD-$Amw2Hp+s zLsO1`hd>V;14+LEl3nWV-*EB{cnJFMK$^oZAlY97DUUs9#^d0S@3S9Wz{H=th(+zor!qIUKH89ZsSQUiC&cr&7SW@TJXhgrz4Ve zwkXylTMSx?&v!Lj>^2%QO?{4&yU=&MCBeB!6&7S1CEBZ|t)S^W*KMU5>p1mGrBHNLqaBN8QAu5DyEnD@x_2^> zg8Jl52`zm-S{|u*<%%~l%F8GG^4M@0U!gYdEy%TiBHmzk!W(^xm&g1{#oEn@RD1PA zs5BHhN_>7wEGK~s`D`}{Zv87VCl z5?qf_sg`GTDGo)T#(ASHl2q!6rTUCFwrfWrS7hQ%t47o`!x&o*^dMWGuZovXO&4lm zHxZ#X6D1vtQ^iJ1Cq~A(Jx-Lz3oOq*%Cn1k_Nh6%muK(h8TPmP`xY!V%=P6w+sd;m zdA5y%`EAV&?BM}77kHk1Y*ZJ_;}4<5XsPpyCz~tr sr+IVF5yu%>PZ$@, 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka_GE\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "სხვა" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "ფილტრი" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "წაშლა" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "წაშლილი" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "" - -#: tables/base.py:852 -msgid "Actions" -msgstr "მოქმედებები" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "დახმარება" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "გამისვლა" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "შესვლა" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "მთავარი გვერდი" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "გაფრთხილება:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "წარმატება:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "ჯამი" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "მეტი" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "კვოტის ჯამი" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "გამოყენებული" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "ხელმისაწვდომი RAM" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "აქტიური RAM" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "ჩემი პანელი" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "ადმინ პანელი" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "ქვევით" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "ზევით" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "პროექტი" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "მომხმარებელი" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "წევრები" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "არ არაის წევრები." - -#: workflows/base.py:569 -msgid "Save" -msgstr "შენახვა" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "" diff --git a/horizon/locale/ko_KR/LC_MESSAGES/django.mo b/horizon/locale/ko_KR/LC_MESSAGES/django.mo deleted file mode 100644 index 99425589475801e89fd7d659f0e11450b8b8f798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 zcma)-Uu+ab9LEPm#40L?h=MwTl@{E){t>NLG17lf;pC((h7e=6chkFtyWPvqUQ2zU zl7lpDjcw@3fp@ip7J-zcVu6x0@s$@}eDs0%;!AhWsE>w3zrWpuwm}S&oB8a_{AT9+ z`^|6nZm(IMV<-XCji^J*7~28fc?1p0ACEG&7W@-j4X#-3*{ug3Lw~!^dY?Oe?(!K1 zABSBV_$+wHA5Vf$p>Kjug2%uoz(IdL2hzH4z!l(mpO^jd@4-5Z-}L)``SXAKTn2F~ zF~1VT5L*qB-gRi`+>Id3SNg00$e2Hyp1z)!(zi2X1~I$9u(^c_O;G#CT11(QB|eIE09 z!sj4}E!YV7BA5s1ysIF^f6nJm;4|po23LW<`{Q>&TE7a5h-*QL*9MUGs{knu4gUOx ze*a^T><;?lT_Aoeg@(@U0n5OCfBY2q8u~?$;`Ad(=iLS=-oJsgA1!kA_*@Ip`5VCJ zz|A1V{T;9t41+D;7a+D^w?MN087v2X0pA8G=@4%BZ0ahg6z6rQl=>7Cr2LXniQX1e z_Z~sY+m}(P(A`iWEu{BN>Y&hjMSfDj(e67$I;c=Q*P~J%tU;whv3kROV(e8A*WtdG zUc6gGWcFCrCAIQ zbeiOr!DF7901c){JvW7wF?A8+U53f6gy33?Zz`9Y0&E|8CW|D6Dg{p(ajxmKMbywO zP0xq`ird&FDpfS?nk9X)4 zQQH4MFCNnwD`A+p{aAqenk=)Ibj2yQ(5A*!O%JdR3DuvdrjB9AIA~(xh4<#A~XmYn7^6rMiY! zy%nme+g61FLuJ3{*673~cH3dft7}3vwVvHxRa#2Bsp>MRT9im_89ja&VcMl4T<@g~ z%SfBX2k{h=IS@5c@0abxL`IDZrCq405O3DwNlhkr1qp}lo}Qk7Mf+)8;wY^MVm;lz z45oudTF~ngJp%Wm1aF^#N0cr>(s1!YD4^p@!6jJWszjYRFg`JVWyCMdfM&E9o6;R zd)!e~Uxx3)!+ca8>g(Z*jo4qEVIG``5vMrIQJsN_Qg#L{o1f{kFHAXO!wXN`$(?gf zFa){I0O$DzA>fT75nlfUK%MlgD^WiY=1iyVx?TRl$~bIc+UP|CWOrwY4%pYgcjPT zCYXJEhTB7ZSPx_SRKXp%E4nZatt8hwp_Civ-b$x9!=2M7oq=oiV81;$5g-?woB2{M zZx4*#{leIjbKIWJm(JuFZ0yNdW}hp}-<*;(i8Xn>VQvzT?pi=}~C zXzz2zCV_%;9gdyJ+UJMJv4TA~H9wuDuMHIAY0;Sbt?@?}(ttF0!6)@je}1X%MSne{ z>O#>T&O6`r;T{K^Tz@++awa32nQ, 2012 -# Sungjin Gang , 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-05-03 12:23+0000\n" -"Last-Translator: Sungjin Gang \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko_KR\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "다른" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "로그인을 해주세요." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "%s에 접근 권한이 없습니다. " - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "인증되지 않았습니다. 다시 로깅해주시기 바랍니다. " - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "필터" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "%(action)s에 관한 권한이 없습니다.: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "%(action)s를 사용할 수 없습니다.: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "삭제" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "삭제했음" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "표시할 항목이 없습니다." - -#: tables/base.py:852 -msgid "Actions" -msgstr "작동" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "일치하는 id \"%s\"를 반환" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "정보:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "주의:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "완료:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "에러:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "%(counter)s 항목 표시" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "제출" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "작동중인 인스턴스" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "한달간 VCPU-시간" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "한달간 GB-시간" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "취소" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "유한한" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "사용가능한" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "내 대시보드" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "내 판넬" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "관리자 판넬" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "일괄 처리" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "일괄 처리된" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "항목" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "항목들" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "프로젝트" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "사용자" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "인스턴스" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "관리자" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "관리자 액션" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "저장" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "" diff --git a/horizon/locale/ko_KR/LC_MESSAGES/djangojs.mo b/horizon/locale/ko_KR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7ba1b294f9b50545594f24cc4344d2a1bb1c8597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmYL^u};G<6h%QWWn^aXz*b&KTZUi?s%hL3VJB6ZR)Wp6CKwgFa$E!-!te1dyhw;% z>Bxi6v+w&kIsQJt93rR48FGZ2BW)67gqK%%w$6WM-o5EnfNTv*?Hl7PB{MdDU{g+( zyqsr69+i6Qd;r>c!HxY%x#vDakv fs(hov&7zt>viI6rFWLjQE4MbbrX+bbAv*X4P1t5T diff --git a/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po b/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po deleted file mode 100644 index c92986c14..000000000 --- a/horizon/locale/ko_KR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/nl_NL/LC_MESSAGES/django.mo b/horizon/locale/nl_NL/LC_MESSAGES/django.mo deleted file mode 100644 index da6ee644c0dce86e44378f3852dd305bc4d73e8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2949 zcmbW1ON2IBdTzp{8^PTm z?ceJ;0@C>vkn}qQ-VeSAl3iPVd;-MB-azv#_$EmEJ_Bjrm*5WYYw$dL^gBrV&p|ly z%SDjn`qA@e&&!@yJpTr_VBNpq!{8Pij-%KfknR~kL-GxSo4{F+?0O8u#}?7hdI!?~ zlYagb*oE=i{{IIc+2JFQ?0DACe-4t}F8cZJL5RYB1u0Ih`2QPl80o(qB)xWmblx8D zK5)=;3?%sugCy56ko+#et>Eh*-Ty8~`_Fiu^ZXQ~{pUf_`x}tXzvOutq<#N@d%^Ws z3=!D@kk(Cu0eBRITQZvhnGYYQjxX4r$wfobhkQwTUoHK_nxIBWs^Q+lRUxm2v^a@=jEWu|23% zC?)h{y}W_SY!~WgKS%Z^-_pCf4fRn}DrA4w-DA}W*&E*6;q_G~JJZ?7vTn<#MyWlR zwX<1U&DvVlHsa+Zl1_%)rj3TQb|H$JXzS=YbXG(J*=<_a((z?smpXGR(pacKC#^Zc z$z@hSW7$FFoP>_Et9)G8Ry`Ibq(QFQp_tF8W#!nMYeBTCu(lnWkSm*+O2C8(jLE8z z6jt&mZgQo$i(y3Vlul)VRZUEGR=QazWTQo>#;R$OC~4Udu_D=#+!au&Cav=(=5t!E z8P{4y-Z0aSSxq&eBb(PEb*nU#(B!Bv8q>J)r8won z$XuV!8KeVgXD#oxqytGERKnne+@fVZO_#;G>#$5>OYds@yVwp=Vm zBGrvnBEkZEQ_KX!p6XmJ7&B5(cm?Ca$ujRR^$i52fuOISmj=tFq1`1EEDR3I6-7Q= zvu-fx-^)uw<$-~G-HfmPgmQ6{id4yae z9dw2^5^uE8a_#tPz9FkNrB6AqB%8^zO}xxQEJ9rIrVx1GWCm%Lq`ooXtnRXGF2NHK zFk_Z;;3c1RGFR{mr!Sn=S=PzNAs*3nL)WGZq!zQ3^StDBM0M_N2$tgEDN8;^0y1$O zJsu|rhP0g}#VkEGAr*A3n-tHG(h%am(MsESF1q, 2012 -# Erik-Martijn Kasimier , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl_NL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Andere" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Log in om door te gaan." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Je bent niet geauthoriseerd om %s te bekijken" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Je bent niet geautoriseerd. Probeer opnieuw in te loggen." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Wachtwoord is niet geaccepteerd" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filter" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Verwijder" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Verwijderd" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "" - -#: tables/base.py:852 -msgid "Actions" -msgstr "Acties" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Informatie: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Waarschuwing: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Succesvol: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Error: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Annuleren" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Geen limiet" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Beschikbaar" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Schattige katten" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Felle katten" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Katten" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Kittens" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tijgers" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Honden" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Puppy's" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Mijn dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Alle instances" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Beheerderspaneel" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Items" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Project" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Gebruiker" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Testactie één" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instance" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Testactie twee" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Testactie drie" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Beheerder" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Beheerdersactie" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Onjuist formaat IP adres" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Invalide versie IP adres" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Invalide subnet mask" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Verwerken..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Opslaan" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s succesvol afgerond." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s was niet voltooid." diff --git a/horizon/locale/nl_NL/LC_MESSAGES/djangojs.mo b/horizon/locale/nl_NL/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7ba1b294f9b50545594f24cc4344d2a1bb1c8597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmYL^u};G<6h%QWWn^aXz*b&KTZUi?s%hL3VJB6ZR)Wp6CKwgFa$E!-!te1dyhw;% z>Bxi6v+w&kIsQJt93rR48FGZ2BW)67gqK%%w$6WM-o5EnfNTv*?Hl7PB{MdDU{g+( zyqsr69+i6Qd;r>c!HxY%x#vDakv fs(hov&7zt>viI6rFWLjQE4MbbrX+bbAv*X4P1t5T diff --git a/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po b/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po deleted file mode 100644 index c92986c14..000000000 --- a/horizon/locale/nl_NL/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/pl/LC_MESSAGES/django.mo b/horizon/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index d8192fe018c39f26922d4a51a4b25531fc6ac06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmZ`#O)msN5FLWU9-STf=CF#HwUO06g58x!tQ`yyw>DE|o6$Y#t`VI51wYBp;J2v3 znv<8jbh_)ks(SsoIQJGXW|>RO73Ms1n^_}fE-+7-A2UI4#b;gLU;|&jQG5R|zyb+_ z*x5Tw363(jMCY|NQrHrWCzakqru^i_Dwnm+u(Xa~*E5lwpWUvs<@KM(T8eIh8CUm+Y>dJ1^4kOkbD^HL(WqhH?Iw=zS zp!|zizDBbwPE@JUsX~cu`hMRt)0b82@?Ex@yiz$rg6ctv*cRGP#Fzt}*MS86cIGv_ zAl6J9wVTj7>Y4xga^%s`XxRK!v>LYh)({$A`?=)&gio|q7D}5fkxrEJNIMtFA@mwu zy~Hg#7@E{(+T>F7ZZx&7Ahwukf@z9rfTq&7l_B@ch4JzJ$)G8m+sdWb|CuL6MYlXK KxbW5cYw!iMPpHcP diff --git a/horizon/locale/pl/LC_MESSAGES/django.po b/horizon/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 99b2e8c46..000000000 --- a/horizon/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,530 +0,0 @@ -# Translations of the Horizon Dashboard project. -# Copyright 2011 Midokura KK -# This file is distributed under the same license as the Horizon package. -# FIRST AUTHOR Jeffrey Wilcox, 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openstack-dashboard\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2011-09-24 14:41+0100\n" -"Last-Translator: Tomasz 'Zen' Napierala \n" -"Language-Team: Polish OpenStack translations team \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Polish\n" -"X-Poedit-Country: POLAND\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: base.py:424 -msgid "Other" -msgstr "" - -#: decorators.py:55 -#, fuzzy -msgid "Please log in to continue." -msgstr "Nie można usunąć klucza: %s" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, fuzzy, python-format -msgid "Select a %s to browse." -msgstr "Usuń projekt" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:595 -#, fuzzy, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Nie można usunąć klucza: %s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Usuń" - -#: tables/actions.py:612 -#, fuzzy -msgid "Deleted" -msgstr "Usuń" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "" - -#: tables/base.py:852 -#, fuzzy -msgid "Actions" -msgstr "Położenie" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#, fuzzy -msgid "Available Instances" -msgstr "Instancje" - -#: templates/horizon/common/_quota_summary.html:8 -#, fuzzy -msgid "Available vCPUs" -msgstr "brak dostępnych" - -#: templates/horizon/common/_quota_summary.html:11 -#, fuzzy -msgid "Available RAM" -msgstr "brak dostępnych" - -#: templates/horizon/common/_quota_summary.html:15 -#, fuzzy -msgid "Available volumes" -msgstr "brak dostępnych" - -#: templates/horizon/common/_quota_summary.html:18 -#, fuzzy -msgid "Available volume storage" -msgstr "Instancje" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -#, fuzzy -msgid "Current Project" -msgstr "Usuń projekt" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:14 -#, fuzzy -msgid "Active Instances" -msgstr "Zobacz instancje" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -#, fuzzy -msgid "Available" -msgstr "brak dostępnych" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -#, fuzzy -msgid "No Actions Table" -msgstr "Położenie" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -#, fuzzy -msgid "Project" -msgstr "Usuń projekt" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -#, fuzzy -msgid "Instance" -msgstr "Instancje" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "" - -#: test/tests/workflows.py:80 -#, fuzzy -msgid "Admin Action" -msgstr "Położenie" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "" - -#: workflows/base.py:467 -#, fuzzy -msgid "All available" -msgstr "brak dostępnych" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -#, fuzzy -msgid "None available." -msgstr "brak dostępnych" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "" - -#: workflows/base.py:570 -#, fuzzy, python-format -msgid "%s completed successfully." -msgstr "Wolumen %(id)s %(name)s został pomyślnie utworzony." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "" diff --git a/horizon/locale/pl/LC_MESSAGES/djangojs.mo b/horizon/locale/pl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 97de9ec87491b07b382fb57cada7e3def51b8a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmYL^!A|2a5QbT?ryMzRm;;MIFyOR36w?5qbxX8KQ>7`=ax<+7LBXyZ7lFiU@CH2B zJ`0nw+WyinkH_EGzyI$1{MaJ>An%g*$lK&&a-%N!lMc^lZJ7U>So5Uj4xcA`mn6QZ|?WGBKTA5UPunEEMKSK68k}@o3gW?#1y{Rh}4IY#54~M2Xn^&p%;a-)N^aJ@>Yx z+)ll^(`6+~eGchHGLyD2qbR&7#x=hwgppyh*jPvcjRU&ou|VTyN{3 zeGcDcaG-<0hf82U$G?1b5wu``e_i&1PE#H, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/pt/LC_MESSAGES/django.mo b/horizon/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index 253a35960828240a899bf7f42d0ce46fe3dd179a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4432 zcma);U2I%O6@UjQEg0IA($bcuFbTMc+wA%$33ctd)PG4#m*1ZDd zJl})-)DJ0S|JR_*`&Gr?LD9#b;C}cPlzI0s=sx%WtidBt^w)%S_<49cd<8N^{iNd0 z;62pefFj3LxDUPw<$SlHB+=6y6f*BV_yMTl9yn3e=c;-Gj?o@LS@#0G7hZv~-T=zE z-+&Lpzd>9?-91#E<6bCoJP7Gh`{BpnAvgh7;p^{E>IEq0o<~W-rHU&R*D5{(@2B5D zk>hzN=lCkT3w|BSIlc>J+-nv80L7kfK^gyVDDvEj5>bu16Uuq+hvFX^%J@+zfeGKMZExJy_X$f9@gVN|3>$)eX9S^Pm{mo!J7Bp)J+UL}cqBD46n=;{gb3|SK5?xZ7p z$r%@`mU;Mbvgl!&EP52($+^VV2gq_(TsGWA(W9heCDdaTABUPOb{Abr`XpK2jkik= z(joV7JBe?I|GbO*P}R5ukCQQFNVAl~Wbr?Fv&6q7Jt@Vo*T?6id@7X7p}<*`eBVBhMc)aNE;lA4XWaaxwT98^_S zO==T0+c$Aynu%3&CU14h(ne}tW+x!`YQD&=4qpp4FTQ19NE7$8T>zV+)w5m-MW$1wZ zb;r!@1M<-~3F`1gGqt(y8h?JLt#31rR%E3cmdI^aEm3&&RGjA)wJmSy1>-wSXR=5t zrE*R=eKPLGx#A<1@j7?t-uKW#T^fCP#`_JI zMLPDuY6ffeuU5$5k*rJcBb@L427%cmDC149Wx2-(uTt| zEQc;#vK(<;z0t|+jUyTxPBqZ2$@463iboC~lj}-*TX)HiCh@c zLG`+4vu=#dINsYyhFQgswWX+bw)FfdeL@6v>CkE0b6H+n_U$;T%@u85YjBM^dEWC= zqoau_(pINuqB?hIG#rjOt1FG#d}fU}O>M#Cc1ll-jUTR!9j=W}=&>VHW0Q}Jkr-Gz zZTqnZcf+_NwTZ{{*yPmV!{xY>#^<$0W>TM+TpobqrkTYy(I<*5v0M7_c3FSYW8?GI zY}h(4+!I45P1-K-u3E#I?v!3k+ez#@`k;u9^cx!+^;}ks*X^dv810ps@T0v^*W-TY zrgfe}maB}~baZ5Bd1-lZS54#fv7veV#HI+i)#IeO-ONY1=y5t7ZlSmN%v$4EZE|;< zY`Jc;+9FR@6f8U0jPo67r*tnLT1|?~B(-C_WjImV3spZeF|EtbnS-g`H>1Z#ricEY zh>*6DV(@BY6o+cs-lPeN#mR zZcAnubIFCFtPoip;>C46t7rfV-K2*Xzvt4yt9=P0?X2jTtYX9tWdNaR-r+#h1N59r zk=d)`MQjizGv2AiO+=2flAO*FR6LXVh6^AA%hBPC;Tq&IW0p;eKjKO?Hrx54Q{F8u z+OkQCmeZ985@9l@#1^<8_cTNrzL4B#r)?V9%nn|51PheL^Vt>kpu#HPluA^~gNwc; zQ&0+FrH1X=BKQRH(hgc#w#D^vh+3(Bb;_olqFY8I zt4_(Hoxw#3N~tfG?>ez&7Q)gw*Jg8<fk#(JT}ga zn$=m9Zd)T`zyEDsa9o0w-JoU4Fvbfn(?jU8+IDwiR|r?!540rP$thG7tp2NY-t@Mb zm_}}T%k<21qS%|puHZOC90>|sF2dKg6%S!;Y@+Qt|IDDE(x|EH2Q%<5#$sao=qZ2; vw&sh$#VqFK;N2IsopmVUa(SAbLjXJqt7a0*&broi7hb;|%64wXO-20=9&Jos diff --git a/horizon/locale/pt/LC_MESSAGES/django.po b/horizon/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index b1d64fd2f..000000000 --- a/horizon/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,513 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# FIRST AUTHOR Jeffrey Wilcox, 2011 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Outro" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Por favor login para continuar" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Voçê não pode acessar %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Não autorizado. Por favor, tente efetuar login novamente." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Senha não é aceita" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtro" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Você não tem permissão para %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Incapaz de %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Excluir" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Excluído" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "O %(attr)s atributo não existe em %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Não há itens para mostrar." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Ações" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "No jogo voltou para a ID de \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Por favor, selecione uma linha antes de tomar essa ação." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "" - -#: templates/_header.html:5 -msgid "Help" -msgstr "" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Informações: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Aviso: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Sucesso: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Erro: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" -msgstr[1] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Selecione um mês para consultar o seu uso" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Enviar" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Instâncias Ativas" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "VCPU-Horas deste mês" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "GB-Horas deste mês" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancelar" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Nenhum Limite" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Disponível" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" -msgstr[1] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "A senha deve ter entre 8 e 18 caracteres." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Coatis Bonitos" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Maluco Coatis" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Coatis" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Coatinhos" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Capybaras" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Macacas" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Macacas" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Meu Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Meu Painel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Painel de Administração" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Agrupar" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Agrupadas" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Itens" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Desativar" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Elevar" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Desativado" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Elevado" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Guia Um" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Guia Atraso" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Desativado Guia" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Guia não permitido" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Guia à minha mesa" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Guia de Erro Recuperável" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projeto" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Usuário" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Ação Teste dos Um" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instância" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Ação Teste dos Dois" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Ação Teste dos Três" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Administração" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Ação de Administração" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Formato incorreto para o endereço IP" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Inválido versão para o endereço IP" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Máscara de sub-rede inválida" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Processamento..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Guardar" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s concluída com êxito." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s não foi concluída." diff --git a/horizon/locale/pt/LC_MESSAGES/djangojs.mo b/horizon/locale/pt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 20d4a6dc0a9415e5de5dab9d7df6e22dc3a49975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmYL^Pfx-y9ELG^+R?Lznt0IQ4>#~I3o}esaB=@K28rG()HyQRr7cE3h+ogoVy8yl zZ|GY=y=Mbk5_~<^xaoBxI6JkYFX(%M+s-{{3CV}vkSXaEn$bGJ~mDM{*YnTeTRT%N+XQ{mY5dBWQbB<0u I8jP0{{R3 diff --git a/horizon/locale/pt/LC_MESSAGES/djangojs.po b/horizon/locale/pt/LC_MESSAGES/djangojs.po deleted file mode 100644 index 03ebd97c8..000000000 --- a/horizon/locale/pt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/pt_BR/LC_MESSAGES/django.mo b/horizon/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index f54133cca14227f883b1fe1eac50475a4333031f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6948 zcmchbZH!#kS;tRF=!>C*rs)ef(BrhOy-j9!{nEr8JErShzcpTa>s{LkA$88ooSnJx zoqNak+&gQ#5+9&Qp-7}vg%D67TmuoIr2+)$Cqy->Dn8IJ0VF^a6$z@M1ffb)ycO~L zpL=I_?U3{v*L&{op7(Q}=Q+=L#$Uhp?q4!IS4sDie)BG4ei=UWCSE+xzQve#!=H!u z!Oy|B!55+0{~7##_)iUAZusqn|K9L_;E&So?j7|w?}3`)ApBu?1oCH=d1<`I;Sa)( z!5@HE;9KDaWGM4<@a^!qru-JXhy3qDt@q1N>--z2@m_|S@7wT=@IT?*@C^*Ees6>t z_nlDlSzc=Q5LCYdQ0qAie+Zs}OYjmr1V0Opz`ukV_g)%{?}8fVeyDNY3u$5=Y|0;j zd&nP!YQGNE?h1Sl3{d?)1K$jP6>8tN;E%%>q5Az5)IR?fs{c2j`h5%XXa1F!>c0zj z!@Cfs+RZ@q-v`z1VW@c)A*Nu?K*?tXN>5KW^;e z0bB4DC_C7R5NF}TkRs!u))N|jyea=#_zucH4Ykha;XC2y;Vw9V>i3UO>wX1lAK!u6 z|6MFbdffrl?!JciL)pjsAb;lJCV!&IKMv<9A3)9jEAU^!}Zu{>>=Il7Blq2oFNdlR&i}!?<6_7R;yML-4nu*8LKE z6#fU4TpvN1TF(h6J)ecr>t(3@=1}|jB>XY>X*dVJ2xT{a54DePL5=q>Q0>19rN6s> zq|U#!;e8O5nVnE}GY_@S#islTsP$$|{jW9UzXvtn1nz-<4yE^hYs%+Ytm@lP`(J{Z z|07WQTZISUlTdd0T$BGpsPVoDCFgr~*5_~+pDrCw+`0d99HylO7>GOwuE{=+Ql+yFvcpDbj~XdOk>+k6*QK zeVT9C(*CAQIMIAR0i~yplGaJG8QGhjpCZXNWEVd{(zCaQ`3OW5(H7nZpCJuMlA-M2 zG1B`DeqV?X=0PS%?b_kz;R9XQ6Z%ou&on7naRJZHWp_}&ea|dv%_%5@ zS*(h}XQf>!@@IUvBwuli6mt)=49fK8Yx&;c=V@o3nXi{y`>$ty6F&878GZqCqe?Ge={XRUs1T z4s7Aes>oQWc2*9&MF0=%4iD5#>b2-QL+aBLFl)}yvM?(ygpIslmm!{9$B7p`uxIxjvfY6z@I!2L)~ux71#eRXhkRJ2>^R9PzgZPH5UA1FBHv&v zmg;Tkq5+fx6kB^Vnisiz3WhN|8*}lHtyH5?g4g(Hm6y)0R>PqyuAB3|o1<09%0|nJ zM{m`Qy;+@3hgV`b9cB$IX0v$6`Ua}GTKVES(har>as{hNA9Z9k&s8NKS)cK1jjUE3 z>0`Bad|2LeDOB5YnK$C4grU)N-DS-qzuK+UEw<&?28E~3_L7agi&mjG^0oq&Ej`qlTw@&31)^}U!MI7L?Jn73gFJw_}h+ykF z*>-DCU6lhJL*JXVjebi+g^oD`QO~aLl5Eyo81Xm4W-f&KRhUbz$Y_LsF0mI>ouT#M z*1cUX@?rD>yX?u_9&typLVsk=9o=P~$g8F;=CC=rlq9PRTy`P0>E+Q>2k6<3d@)Qg z7sT;eJJGPcT#~z^N3@K3=(ZW;+y^6BK)x;`l-adT_gWWguhF)ROWJYXkMg2yEr)*6 zYaOflp|yq!8kFTIwCCnhS7qJ7$n|FNKXXxjdA4Ka+*)g~@bRp-mR#xEcK`go1FiW3 zt$q9L{K5A8p$F%AXxKXM$BFiHTf2j;{U5UPhuQ}Y)a}l=P`1`^njv-EVQqWTb&ABN z_Ec4*{<=NVuk#-cn9&vQHvBAi^3feY;CYpoHLv~B6Hm2=!* zNp?8;jNr>hFRYzt9olNADRHN*+m6c1$IkCqNvp!8trJ`Yp>4BK z%!WtzAGY=9qkA)Z)b5)(yu)nSH0J&P5+c>X(KJNLx@k4}0+xyp6(?c7c?^-V$*owZ z5Gt<-kS5Ph{s_;eD{S&PELJ#S;=v{}A_h%te! zLWaScRIEamMxIT+FeZvoG%@|&KI>MSq@H`LAT=?7+BOVLF4i#=%Wz!HH+<%XL@u|_ zRku-KIGvM@XL2H=_^RV7SD336dk!XAo6dV#xwI+dvPk_6XBIlnE+B#6dJfM&l;^LR z^zvA{5W{Q4SKq6FZu036ag6OD)a%u4@3?#Ko$=GQp0BQ? ztLySFa1$4f&?32(6OSg>Fo76mwWsnKy0q%%gj{J^01gLHMX-I|M1jF_yU6AoM>h&# zRk;;cr370G&r}F#8f_iVdN||B^SR=qEN@~iVvjlsBeGGvg|e~PTX}n%&6?%O&Cu0C zF^9tQO0x0fCZU)!@}Qb>vjjIw!`%99)5Qo(FT$^m?@V6cVn&(fc!uf<#a--Mhly#G ziA9xRnmq0PGWnXQN$H>*k#+;p7ii^+=h|GMy z-lcAI;(EL4hgN6xR!$Hxw5j4UA~bC*UdWWyAzIwrFxpE&)TIXNdBSED5^;bXYbK=C zdFV}E(1EYz;kLpyO)#t%%?Lglu)(bploGpDQgxul+2~L-gX{XF#PoxW6&yN0W*`DI zCNH^z4_P1MwkB-zira`7*WEb2C(k=w?!<3#3rz&)*u++=7{zfpd1TH;Ccl$b$fmZl zsClCA8;%LNC~PA@&Y|3&Y;QB9Q;;n4&I30%Ay|fb&ihaeqg#tnUOdB$slYB+LcNN+ zesXi{QR1pg$CyBj=9<+I9MtRPl%YFTeVm^YDFQ-x!^sOxExQU;TC&7YQB@{dZ>`qz zz8_sFOCa-wHq+RaiS?}SKe+`8y9(D7_o?_UrwZw+GJu}7f)PmHjxqt!w9443QX{~kmGCK^*D$PpwIoSMu-m=+Gk`gMMPAkf-&vV0ux0Y&~g=G|oI z%o#t%M&!9J;J)>)PbS~nIK2h_ LF&S}T^}P9CH5%Z> diff --git a/horizon/locale/pt_BR/LC_MESSAGES/django.po b/horizon/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 402da8b08..000000000 --- a/horizon/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,518 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Josemar Müller Lohn , 2013 -# Leonardo Rodrigues de Mello , 2012 -# Leonardo Rodrigues de Mello , 2012 -# Marcelo Dieder , 2012 -# openfly , 2012 -# Welkson Renny de Medeiros , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: base.py:424 -msgid "Other" -msgstr "Outro" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Por favor faça login para continuar." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Você está autorizado a acessar %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Não autorizado. Por favor, tente efetuar login novamente." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Item de Navegação" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "Selecione um %s para navegar." - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "senha não foi aceita" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Filtro" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/D" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "Você não tem permissão para %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Não foi possível %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Remover" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Removido" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "O Atributo %(attr)s não existem em %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Não existem items para mostrar." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Ações" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Não foi encontrada correspondência para a id \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Por favor selecione uma célula antes de realizar esta ação" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Logado como:" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Ajuda" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Sair" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Logar" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Entrar" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "Você não tem permissão para acessar:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "Logue como um usuário diferente ou volte" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "página principal" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Registrar" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Informação:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Alerta:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Sucesso:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Erro:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Resumo" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Mostrando %(counter)s item" -msgstr[1] "Mostrando %(counter)s items" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "Mais" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Resumo de Quota" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Usado" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "de" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Instâncias disponíveis" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "vCPUs disponíveis" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "RAM disponível" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "Volumes disponíveis" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "Volume de armazenamento disponível" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Mostrando %(nav_items)s item" -msgstr[1] "Mostrando %(nav_items)s items" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Mostrando %(content_items)s item" -msgstr[1] "Mostrando %(content_items)s items" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "projeto atual" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Escolha um mês para consultar sua utilização" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Enviar" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Instâncias ativas" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "RAM ativa" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "VCPU-Horas este mês" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "GB-Horas este mês" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Cancelar" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Sem limite" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Disponível" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s TB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "As senhas devem ter entre 8 e 18 caracteres." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "quatis beleza" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "quatis maluco" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "quatis" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "bebê quati" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Capybaras" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Macacas" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Macacos pequenos" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Meu Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Meu Painel" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Painel Administrativo" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Formigas gigantes estão atacando São Paulo!" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "Agora estamos salvos das formigas! Vá aqui!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Lote" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Lote" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Item" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Itens" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Para baixo" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Para cima" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Baixado" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Levantado" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "Tabela Sem Ação" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "Tabela simples" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Aba Um" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Aba Atrasada" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Aba Desativada" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Aba Proibida" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Aba Com Minha Tabela" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Aba de Erros Recuperáveis" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Projeto" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Usuário" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Testando Ação Um" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Instância" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Testando Ação Dois" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Testando Ação Três" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Administrador" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Ação de Administrador" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Endereço IP no formato incorreto" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Versão inválida para o endereço IP" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Máscara de rede inválida" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Processando..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "Tudo disponível" - -#: workflows/base.py:468 -msgid "Members" -msgstr "Membros" - -#: workflows/base.py:469 -msgid "None available." -msgstr "Nenhum disponível." - -#: workflows/base.py:470 -msgid "No members." -msgstr "Sem membros." - -#: workflows/base.py:569 -msgid "Save" -msgstr "Salvar" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s concluído com sucesso." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s não completou." diff --git a/horizon/locale/pt_BR/LC_MESSAGES/djangojs.mo b/horizon/locale/pt_BR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d0afa72c055018cf057fb854e9e055f6a8f0cc16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmYL^O;5uh9EWH0)T3t)96V^|U)#+?WiJ`7Y&P~SUAIJUxM8j7paEv|gZTCQEK)V@ zmplQ&1N`_pKKks~99T{)rx0_|uZP@g?D}2T#)^>h zx2nDT&wHRGhd70Rpt}^uVfQgjs1q@5pioTcni;7unk}OUB_yV3NMjO46A}bDT`a~{ z73GeV917017)2zRFWbt)D4NvOrBvnKu~p+Rru+YSm##CF!f;`q`)F)$!{5zSQ?p78 z(E5cb&CO_8%)sA!ZLMdnfQq%;RHDSlf2xd=)jP#%m`SzO7>VX*sYks5`kju>1R5jn H-06G+Fk^G# diff --git a/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po b/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 559b85f27..000000000 --- a/horizon/locale/pt_BR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/ru/LC_MESSAGES/django.mo b/horizon/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index aa57765c8c6426cbd6b2d84355bd68a17133339b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7793 zcmb`Ldu$z7oyQLaO7W%(lt-6+z-b__w)fgjS};yr$UC8Vn8a?OJlgTS6MN|O%w=Y- zogh}52ege^8k(k1N*mPD@>GSB#;x?2dBoXU>`5Ip=qNuNmiGuX@cxhRdh@J#EvgjX4Tym-EB*g)5Bt8~6Zx3;Z^G z6MP;@z6oCo|GVJt3%*#;ygq+^Is9AXmO!nu0=^EegKvbJU1rx|W z^H2P|86JgK!pGnn;CGXr=ZUHZK(MZQ1hms^nSj0{^O$mQ>gX+4dPn!YbZPX7nI%qSUkUy z$@0tF;8J)U)IPhQ{67Foa1_dqUx8)#ER-L938l~P3cgf~znX_{W&BN0`mca*gV)1r z;6|uU4j#@hD)K=?S-=E zdU!3o16~I2g*xy3PJFr|AC)s-T?0 z2v5PSETZ*)17(*Nq1Jf=L4b?QJD~Qv9!hQ-+yMuR{u5Ak`!2i@J_qHG-$0IH{s86g z4xFsKTnn}SekeQK4YlsWQ0IFJGQ~_l<=yw;O8D;()y*4mqT=A)Q1N*!)cJQn+5J373D@G$%k{2AovW(7`@d>@oPA1pWs-$(xrsB=96OYmv< z5%>a>9yekv&ASas&WFl_{l)k_kfWFfq2l5@@LKrKQ0KgiqAgwr*TaFL|HXpOL#_X7 zxDNgfda#Sb%dW=@J`Op$nJD-}NQjzWz%u+j+y>u8vMHZx@KsP_y|gQ6yJ)TJc5b%N zZl&p*x^AGopY~oFWy+lsm<=@PCOfyT<=iMgWvh?21`A4m)Nz+$MgEnIwz?5xZh`XA z%{0YWg|>;NdZ9~k{&AY(MX{+%F{tYU?l+HZ#gBa4Nt4ZoXzkbbwvOdqc3MGOLzC@f zr*2x6rd)1aikF*;&TX)dwwdPBC_U!Gw57BU(iHQpOMc!4Ft#+WSDb=8A!zi^ak+NCu z6ipn*e7ikNQZHmuYhcg%oo0P?Gzjxwo68rSelPTEX8o8K)V!gZKX=!@PV1?4OU?Gi zHueuDW`mbjM)F_3YBp-?8b}kfu@T39nA-k0`lMe;>8HMRPd52A?*OM8@P-WcoU}mI zYzh)7Qaqzmt3~5;-8vJ4a2V59qA+Fk+k?~}#Rpc@>`O}|3q=~N62Hv!_Gb$whThmE zc3$|D$}Ft^J>IW z(ijT;)Q)<|owH+Oew+~dT4~-Avha49+uR(a7(X#PqG7u|6o&Cp5L(ZT5oN0c6F{dyS%Yr*i&*@EoOE_MMx%!2V#(c9l>aj>c)B3rV(-PJX_Wv$E%Fk z*iRdA$hJ~59q}!vS-LD)S~k1s#irj&lJO`;t;A)FM<&(DsksNEjU=^0KL65j-w$mM zMz7lL9$OjlV)7p|ludul_Y&XMI4S2t69rxnHvHK~2@#ClJsU^ktc5zhO+DwabOcZ2 zl?3rPQZD1ka@qAsP$Nn`ySFhq>ct1l9={Ud2HC^9P;t4k*BkTA-qvK<%PUAO(bgXriGAj@kBmoV0M8J@aWJIxr+jixzEvYX30I`n-yg6d zvEYj7Dhxg_g2Q&|5GzzCOWUGGoXj7+h04;qUh*HI`mTlqE z6zkyDVWpNrci0QUvKg%NuTGc@CizcnZuR02Aq@19sNr%_6?kq%8C%hn@UlppOf_;L zH-f)x-H%5D+|C(aPQ7TKfurgBjs$~+n(;YGjJNkDIls3k`%d^rZFZFxv>aOlJrLHxl?$x&IhTg88 z>$3X zdH(|mzP{7<#{DwysGB-=c;Rq^@GA}Y-e|Ag91holWW=tN`e;8sK3-0>YOv4WuNj^7 z+!9G=y)&v)WK{h)WWGwLA9k+l*tvb@<~cKUm%BPP=5K@20B`ADoBI3HPF@5-xYp%z z;-`Is16xWxb8^~ppC6YtQ#Y&5xjjQcI;(B3jT;^PwMOjKN?RzXNv{p-uAB6&S!?s# zzLnv!?ykPRZo7QB)os@`ecj#m{kF>@PXDI9)vZVC`fkvzo6)tdyUTv&Gx-!`x>hl# zn>njjt?e*#0Zc6aA3i-;DE}C-*{N(IJKH?GcqE%xJf^RV?7{2-$43f2TJWm{pUBxf z(ma$spG`LJ$)>Xzn?1)yr|BMKU{XWwn}wUni$2RvAa%BRsCk%KQ_W*0`$Be(&J^A0 z=Do~nem*)53lgcKV$1Kk#vI{&t+`Lau&mcagnW|JMqDlez|BH={?+V~tsJe=#` zZnK%}g2_&DjtkDP?D`11-h<$j$(~^B9KJZpsn22!jy&UrSmIH}&O2KoJ3Hezo%8PW z=duagJe0fVj9iyJE5Yon$-ahhCJ>v-?b_-($L7kgNb~;Y-A<+H+!d$WS2o#~SV8(s zHjg$Rz&aO~(!pl3Q*ssCYlA5axcDQFa5&FnX9K2Sg}-p-Om_PJbMAzca{9Ku8Ru)d zaIaUAUwpDxoN>t$wSSP#*KF}lbJoAatiN7xBUWxb(@O=Zup&otdb+D*b2SXg0px_MtV zMPe(AT=LxCJZxDT@ly7r6Pa$_r4pj`m5QVw8y%&@v_87C$D9&wxqM?+w$9q-XOTRJ zJj?47npMxxpJXv&_F<$D;3!YC_Ppw5<}FF-X(f!7k|q->b~CI-g+XRwEcgLY;o7N}@t9)*MaEN>MC!Rk_(kWuxz zOUG|}(WtgzHTiocdnR`^VtE;J+viUgWD4=wvZJiR+<677d93V~&2>8Kw$w`z56n1u zy%-5ZW=dh|bncVcKU=aBxa$Zfp?15{k7hI2jn@yx%F8-$HF;yf<1>=W3#Vmi$|D;w zjSc8dH;-^oPTQlA8U2Bys6Y${BEh-P{2RrI@N545Xf5ih|MgA>L{Bw8$L|?8ofrOT zGEnh&9u=LShMWXT5+ry)uM{3}g5qsFqjXb{=*eVuX8tNg`JtS$OPkZ2c~2H5KjjQc z(EZ}z*Rh2&lwN@t=37jfCLRgWhux8|r$TrB+fJc-XkO)!JqT}Es#R>MIK33oO8QU_OJ8IYRKy{^jYC z$r+OOi`()vS?8)j?!?)@MD-P1%D#a$mBJ+dX}(8YOc9()GUr8-)%`vCzY#=vN>%<5 zOO0_>dCmpiv#52^e46`npzS{#TjfiyG52Z9vV=}v0n66Ctnw`8@Xr01`sH)gh1~2? zC_?h)A8y4Yma^stK?SDji_UI)nK7MFg$%8x65II7E|Y?4@O`|#xj!k^AX potu9sg${H08s!9Xg_Bb4E<#y-lBWH1MGcY9i~q%Kw;iT3e+Ew_9>f3u diff --git a/horizon/locale/ru/LC_MESSAGES/django.po b/horizon/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index d8c9792c9..000000000 --- a/horizon/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,520 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# adiantum , 2012 -# Stanislav Hanzhin , 2012 -# lykoz , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: base.py:424 -msgid "Other" -msgstr "Другое" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "Чтобы продолжить, необходимо выполнить вход." - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "Доступ к %s не авторизован" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "Нет авторизации. Попробуйте выполнить вход повторно." - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "Элемент навигации" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "Выберите %s для просмотра" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "Пароль не принят" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "Фильтр" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "Н/Д" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "У вас нет прав на выполнение %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Невозможно выполнить %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "Удалить" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "Удалено" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "Атрибут %(attr)s не существует для %(obj)s." - -#: tables/base.py:748 -msgid "No items to display." -msgstr "Нет элементов для отображения." - -#: tables/base.py:852 -msgid "Actions" -msgstr "Действия" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "Не найдено соответствий для id \"%s\"." - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "Выберите строку перед выполнением действия." - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "Вы вошли как" - -#: templates/_header.html:5 -msgid "Help" -msgstr "Помощь" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "Выйти" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "Имя пользователя" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "Войти" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "Зарегистрироваться" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "Инфо:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "Внимание:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "Успешно:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "Ошибка:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "Итого" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "Отображаем %(counter)s элемент" -msgstr[1] "Отображаем %(counter)s элемента" -msgstr[2] "Отображаем %(counter)s элементов" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "Итого" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "Использовано" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "из" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "Все экземпляры" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "Доступно" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "Доступно" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "Отображение %(nav_items)s элемента" -msgstr[1] "Отображение %(nav_items)s элементов" -msgstr[2] "Отображение %(nav_items)s элементов" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "Отображение %(content_items)s элемента" -msgstr[1] "Отображение %(content_items)s элементов" -msgstr[2] "Отображение %(content_items)s элементов" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "Текущий проект" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "Выберите месяц для анализа потребления ресурсов" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "Отправить" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "Активные экземпляры" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "Активная память" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "VCPU-Часов в этом месяце" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "ГБ-Часов в этом месяце" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "Отмена" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "Нет ограничения" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "Доступно" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байта" -msgstr[2] "%(size)d байт" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" -msgstr[1] "%(size)d" -msgstr[2] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "Пароль должен иметь длину от 8 до 18 символов." - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Милые кошки" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Свирепые кошки" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Кошки" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Котята" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Тигры" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Собаки" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Щенки" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "Моя панель управления" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "Моя панель" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "Панель администратора" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "Гигантские муравьи атакуют Сан-Франциско" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "Пакет" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "Пакетом" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "Элемент" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "Элементы" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "Остановлен" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "Запущен" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "Опущено" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "Поднято" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "Нет таблиц действий" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Вкладка один" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "Вкладка с задержкой" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "Отключенная вкладка" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "Запрещённая вкладка" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "Вкладка с моей таблицей" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "Владка с восстановимой ошибкой" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "Проект" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "Пользователь" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Тестовое действие один" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "Экземпляр" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Тестовое действие два" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Тестовое действие три" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "Администратор" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Действие адмиистратора" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "Неправильный формат IP адреса" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "Неправильная версия для IP адреса" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "Неправльная маска подсети" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "Обработка…" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "Сохранить" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s успешно завершено." - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s не завершено." diff --git a/horizon/locale/ru/LC_MESSAGES/djangojs.mo b/horizon/locale/ru/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 82571bb998edd689d30f6ae8c61a522360664734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmYL^-%i^w6vjd0Dwn(7#X%Zq2oBgS7sWJ;(7F&UX{t0uVs~EaWtoCqIW7W;*WgWf zo;}M>_}3$S@;N%c&;I=H^VZV_)h6i+=_~0I>44N$kMvB-6FOVwqbAP&)pL*W0mu&} zI~J_B&!`B*T;Emg(EErhhwV~%8 zmXzD;dw;a7Rb@_L{zth+`*2o_u(#&gSiiMHY36oOnNmRSSLK6Ay>hC?k#)C?0JD4< zo3MKduWk6v>~I!_9Cml1ZP|9nIeZ5OgwuQ$cHUS0@VISX9IVe7JU+f!h+%u=;pFM; H1sneX16_kk diff --git a/horizon/locale/ru/LC_MESSAGES/djangojs.po b/horizon/locale/ru/LC_MESSAGES/djangojs.po deleted file mode 100644 index 9a5f3639c..000000000 --- a/horizon/locale/ru/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,75 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" -msgstr[1] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/zh_CN/LC_MESSAGES/django.mo b/horizon/locale/zh_CN/LC_MESSAGES/django.mo deleted file mode 100644 index 6452264a8758b5322f66345a6ab2bcd49f0d05f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5414 zcmb7{dvH|M9mh`BGffO_jm8f zYo_*bW`Fl{-sg9Izu!40d1wB-!wl&e$UP*tGPa9&J3dHDKgZZzU?KQ*a5YH%wt%;R zmgEk}7RlX``@nCZ--{rP9|AuMz6yQ?{0&I+ybay~-UPn@z6*XH{0RISI1hy{f_H&m z1{Z@g?jexodjuqvE5Ui-I*|GWK>XM<_|UxDKpuaPpnQ9QH_i`Izf$l!;0ln&KLuh-ECkZNwuASAKL=^OlOXNu zG)Uvmfi&(SNP3RS_Fv2L>mbed2N14fH)Yud$=>gR3&C5VEX}(ZB!4ageP9(x{xLy6 z*a4EACqP>Nb;&nn{oCL-P@e}$-%r4Ag7cujRk^GzF`;s4m__2RV-hrSe zz3&0%gZG1^&qE-##2yE!f2}M(Ez8?vc?SrWvOOUA`$dq(9|39JUXb=X0MdNtW&3qm zehs94Z^-($Wc^K$)_oVG^ZhYM^DKaKs6Pj3oh6bbAY9K@$o4fL*?)s9H-of(3rO*` zAEfbvl9xd8=MBlr{X=e=W$t zFi7K`2k~Ps;PYMZBuM*y4Wu}FQ`Ua~QvW+~NJ)=-L0W$?h$dDFQhPP%t^?Bk!?M0Z z@~~t#NP3-?#pf05-6K$`a!1mE4D4_pAQ0crg(Nat=FNc-6* z>o0<|-l*iOvi`TS{3b~I_!CI;zc1StKpC>*LJ;B4)c51PNoF)*i(=nLy90zLny6 zT+^L2J1vq0vf;y!Qb-Nt+mI3n-O+SUQX+d$EIbHV4x#h^5QI{>2ltNHiu@Ch0HhFt zBg4KAseq7g$sffK^6yllv#=EM1IR|mGmvTsCAu%km$-7=H>e(b975><$V$kQ5W1&- z0wF)Ghfq9FS_TP1mO#k2lqi-8Aaztg;*cLw28qr&rAiO%F>s#D)7gGR<`)weEmgvn zs%wQNU$iu$SjtwbIVlRwSquzx6)L1h{6aDHCqB*W|c6)d{ycs5jYa#R|u~uZXY;S}zV*CaXvp zhR`e?F!XIAY@uuk?zU8lxYCR*1(gs(9@~?Muu9b=MPwTa@wnbJQ%qu@szqVlu%6N^ zVZaBfB@#65)7nf{sYmJ4q`4ocS!EcyQO;SlDvYpHs#=X>KDI_xpfkkeiXpgSSxR_2 zEm@~%yxPG2R5PsK$JUB?lC9MZb%(C88ZE42vtf%j=te?u!D|9si9`(e4DAg%mYZ@2 zGL1?c?lV&%O;|jknA@l88iipZxM-$1Q_wDJ@G;ps)v|uwsHk z*@cVDg?_dXC4&VN(`?cWtZKS3s310zh|-ycM9Q>yNZ@BR38C>a*fhdR%6K@Y7&t%J zrJn`jLNNu8VnuK-DQni$rZZZ)bFss51y$N$c9l6XIlQi+6OG_y@2ti#F_XWWehHxTQTM#1W)mc#jiIw7oTLYe96 z1oVqh%d;tAG{b@>Pnk*-1J$TT&TzRgWwE+ch|FB)omx15YIOuX->3;j+@fMO_y>6$ zzMz1~yyNNhm{ktO3^BJyut{e@cm@$_s3AIAxR;Q}iHPXJ)RtIWJf~tt#FBd%6~f@b z7#vnhn^;0Ok8iD>GR(QPn{lkC>eVRR#OgKIRM_>*%{S|ULvzZC(Mb>yKbJ1GU>&$M zN+*XRGpeYXpVcSvOCn6_P48o{EsCL`6AbjEo^p>I-Dxv3lCdeeOkB36+b5#CAs2(c zcv2V%6>i5KKTW-uopl|uZytu5qwAAajUNJ3S5Z8+{cWyD1@ zeqDlDk2sjZqZQ;EO0paPMDE8Q2wdsoga@tjqJTUXUq zxTo3_*2?-|wXbZZA1&D+3||#4$cXFavXE*`Yg^8D#I{y!C;k#y^cS!G}2f-=AH3s4KU3=YM}`?eqzIe9TE7wD-P5y`4*aPItRKybo2( z-aD9?=w{C4@!Yjt+2hY=#yT^j<4*S&%MSNt5AL=*kIsEwr>pZlr<|TiW*->I9vaNI z?a!a;k%gH#yheL>n>}lk+dl@&&OEG{(U+Z` zK3c(jK<$Ir^9#%aDU?5SEH^Up-i_mP-qGyPiF`{tv#$->{R8NhJH9h_yfrg^-WfV= zcMm#;#_c`hPS-$wPp5tH;$K^KGJAB`-g}NY9RqgysL;q~wFlML;*xeWGo))L~ zhJE7z%S`q;t?sfj7IeCLox^GLwTBL7Cpw*ubJ^Zjh8NfynQc!y-RHedOzufy>M_k8 z8@DG8GtaOvlas#2WSx`l#LRQl`*&4cy$mblj~&D=m=`_X8lGusr}7n@imiRu5fEge z$wT&ulli`@%x=4y89&18k=@W=&e3tkKF}qr?8&x#-?(#hq|8oVC@ITK&~QX}_WW6z zKR0sC)7frI%QBg~eIVDjkK(1J-Fe|$X0!!GYW6&0_dkya&WsMdcViz-Fu31tIfiEM z$7GOAJ*8d!XIq)mddlu66}(WOsLM?DP!vxug&?BCbmc&9AU&tn=}u?HC!Ckg zoTK2^IGT(&ut5O4=M%XD~CO|&}#C(iCJ%|)BUp3k#>4^VJ-N?zR;5!Ih^0K z-#K!@b1>=Pp2WQpPz7i1QpU9*lL4F?I%{|Cb?votkXG&4l^dSScMa29>Y&QK<4}vJ R{ZH!PuFLmbVZ4a5e*uBJJ-7e> diff --git a/horizon/locale/zh_CN/LC_MESSAGES/django.po b/horizon/locale/zh_CN/LC_MESSAGES/django.po deleted file mode 100644 index f73be594a..000000000 --- a/horizon/locale/zh_CN/LC_MESSAGES/django.po +++ /dev/null @@ -1,516 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# linlg , 2013 -# cateester , 2012 -# daisy.ycguo , 2012 -# FIRST AUTHOR Jeffrey Wilcox, 2011 -# laurence.miao , 2012 -# dangdang <11315889@qq.com>, 2012 -# QunShi Zhang , 2012 -# dangdang <11315889@qq.com>, 2013 -# yuanke wei , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "其他" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "请登录先。" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "您无权访问 %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "未授权。请尝试重新登录。" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "选择一个%s 浏览" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "密码没有接受" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "筛选" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "无" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "您没有权限执行 %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "无法执行 %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "删除" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "被删除" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "属性 %(attr)s 并不存在于 %(obj)s。" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "没有条目显示。" - -#: tables/base.py:852 -msgid "Actions" -msgstr "动作" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "id \"%s\" 没有匹配的返回顶" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "请在执行前选择一行。" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "当前用户" - -#: templates/_header.html:5 -msgid "Help" -msgstr "帮助" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "退出" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "登录" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "登录" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "主页" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "登入" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "信息:" - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "警告:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "成功:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "错误:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "概要" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "显示 %(counter)s 个条目" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "配额摘要" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "已使用" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr " / " - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "可用云主机" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "可用VCPU" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "可用内存" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "当前项目" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "选择一个月份查询它的使用情况" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "提交" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "活跃的云主机" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "本月的 VCPU 小时时间" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "本月的 GB 小时时间" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "取消" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "控制面板" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "无限制" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "可用配额" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 字节" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "密码必须是8到18位的字符。" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "Cute Cats" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "Fierce Cats" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "Cats" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "Kittens" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "Tigers" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "Dogs" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "Puppies" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "我的控制面板" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "我的控制面板" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "管理员面板" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "巨大的蚂蚁们正在攻击旧金山。" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "批" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "分批的" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "条目" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "条目" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "向下" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "向上" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "向下的" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "向上的" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "Tab 1" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "推迟的Tab" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "禁用的Tab" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "不允许的Tab" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "我的表格中的Tab" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "恢复的错误Tab" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "项目" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "用户" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "Test Action One" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "云主机" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "Test Action Two" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "Test Action Three" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "管理员" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "Admin Action" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "不正确的IP地址格式" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "IP 地址版本无效" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "无效的子网掩码" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "正在处理中,请稍候。。。" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "保存" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s 创建成功" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s 没有完成" diff --git a/horizon/locale/zh_CN/LC_MESSAGES/djangojs.mo b/horizon/locale/zh_CN/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 86131e66c9a86d4544db7c0b9f1f038ddf67328a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmYL^Pfx=j9ENA~)T3t)9K6lnY&Q>;ZDzQ#+1P*Sx+QwU4r@&Z4KSl0#INUPk*aZT z@&pJE@bYzf^4YUFvYc7YEytD%OBdf#+RbY_cFun?C0}`IAl$-+D_u*0QAXzXWJ%G6 z=BqGGoSe5(8HjaNZ{c=dX(%K{PL>uhSDYDp2m)p}Mnl&dfja_kh}zON{qLkZOR2cbBwQ;g$uUG>MsdgG8(f%y;)ElGU>C|<4-*8-V Aod5s; diff --git a/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po b/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po deleted file mode 100644 index 64d5a0208..000000000 --- a/horizon/locale/zh_CN/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/locale/zh_HK/LC_MESSAGES/django.mo b/horizon/locale/zh_HK/LC_MESSAGES/django.mo deleted file mode 100644 index 15d701f756dabc413c66ad862a8a713fe5241073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3782 zcma)+U2qgx6~`}vt{Y`tLHyWt^};Tah%=K9R@9A^zJ?Grh_k&d{`WRXj6A-NKK26n4KS|%9x&Ved))QR?3ZDU`oTy({$}%JE0?`$MT;hQ-ijPl7b>X^{3=BlXXM zpT~He)Q7C&- zUyeTjX+0OD{r?V}v6vUB=i!km6d6pkTrZ!Bt=hNc(J;d_}TO@_^(akmfgnbe=6B z#nTDWIz4jy21xOafwcc!`TaK_)x)2_HQLVb%M_evg+d`&V6lHCzGJ_=GiKLs~{XTWE{DLH-*q<#JYlHdQ5T=A5z ze+s1eYrvi0b0E!+f-it=;Mc&LAgwbGqAa|c0a!VN;-Z{U{e2%o|NAz`X2?1S`9+Q9 zFSIYCL-j_j1VS}Q4alA5qZlv}AtL|9f+O4C|{G$pD=xo+5e!6e8k zJ%22Z&4TZ%tYwwagsQVjP2)pd+j)Ut zY>l}QL$_5uC4#KZH0X#_Jr)dlqr)O%v;9i5VEfgWPBD1gn}QZrn&9=`iR@1`l1Kaf zBS!G`aqMi{rrMaY1*(hsML2RpSo#K=i=(P#b3?}$)LoGkWDPnkMD9GcEb%#I$0@-g z8sstr+iayUkU=jLC8nr4R!ZVY;*1(B|7Eg+imAg0ejS8cra;-Xa7$?tyvZ~YT+wZ7 zE#GDE3S}!YBq~D6*0tn+bFYIs!~N0xX}m?7Dw$6eiT*T%p-Bd zw1mB-p?+teJa0!^;!h0h&?83FE1L2~)n4>A%#X!?w0loMot82cEwIxt6SzM0q&Kv- zlx*gHcT4f+0$i5=&kf7dbLXA*lbK(g`d`yT;OU^O?(|nX9L=qgUM1)4B1>EHgQr={e1u_R-wQQKx$f-tH z5z@#Wnq{`3ilF-h~FsFYqeXlJ$Jn9ZTU~YF$dS=9nqU%POId4z6 zZ9mUnx#@f7aWu}gQMdoW!gVX1bAQqI_}dm0m6`5!FLbyQU9g42&Xu2K-+D85=Dgc~ z+xNwDcx*m5j$`+ZP4@h3x6kB&c-NpHD6J0pC U$4B;v(c%JOmcBQe8#>PZ1EG~uUH||9 diff --git a/horizon/locale/zh_HK/LC_MESSAGES/django.po b/horizon/locale/zh_HK/LC_MESSAGES/django.po deleted file mode 100644 index a9675296d..000000000 --- a/horizon/locale/zh_HK/LC_MESSAGES/django.po +++ /dev/null @@ -1,508 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# MXKiN , 2013 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: English (http://www.transifex.com/projects/p/openstack/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_HK\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "其他" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "請登入才可繼續。" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "你沒有授權去存取 %s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "未經授權。請嘗試重新登入。" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "過濾" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "你沒有權限 %(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "無法 %(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s: %(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "刪除" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "已刪除" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "屬性 %(attr)s 不存在於 %(obj)s。" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "沒有任何項目可以顯示。" - -#: tables/base.py:852 -msgid "Actions" -msgstr "動作" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "登入為" - -#: templates/_header.html:5 -msgid "Help" -msgstr "幫助" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "登出" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "登入" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "登入" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "你沒有權限去存取:" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "登入為其他用戶或返回" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "主頁" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "登入" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "信息: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "警告:" - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "成功:" - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "錯誤:" - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "更多" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "已使用" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "可用的虛擬處理器" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "可用的記憶體" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "可用的卷冊" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "可用的卷冊儲存" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "提交" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "使用的記憶體" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "取消" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "沒有任何限制" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "可用的" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 位元組" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "現在我們已經安全及遠離螞蟻的攻擊! 請去這裡!" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "批次" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "已批次" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "項目" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "項目" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "調低" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "調高" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "已調低" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "已調高" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "單一表格" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "專案" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "用戶" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "管理" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "處理中..." - -#: workflows/base.py:467 -msgid "All available" -msgstr "全部可用" - -#: workflows/base.py:468 -msgid "Members" -msgstr "成員" - -#: workflows/base.py:469 -msgid "None available." -msgstr "無可用的。" - -#: workflows/base.py:470 -msgid "No members." -msgstr "沒有任何成員。" - -#: workflows/base.py:569 -msgid "Save" -msgstr "儲存" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s已成功完成。" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s未能完成。" diff --git a/horizon/locale/zh_TW/LC_MESSAGES/django.mo b/horizon/locale/zh_TW/LC_MESSAGES/django.mo deleted file mode 100644 index 540b0001b0f4e5e961a5ea0960a30da7ac8f0a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5052 zcmai#YitzP6~}LZw5gjmucis4$!a)K>kUnY-9V zkY3H1-`v-^=bm%!+)tmG)yq)oAm4%fYzAXHz^cdaLV4;djJ*Ip4So|`2tEz20BQUi zAPvPuw*W)M@^Ti~?-THO@Sh<0>2Ww? zAvhmI>akjo?5PK7y*I(RU>Ga~li;tu#Ml@}``v?}lHL?Z_TB)W0mne{%Wow=lKe#S z&yo&Edj1a5yvMK!+V2Y>>3s<#J6;8`BwHa_1=6^!l5c}FE+XqYKs;I753eq~Y zAdTA!`oS1TcANy~gV#aQ{|Au9JF@>DvOW`&NpAs2tT@WX$0}G z1YYFdq~vkQL6FYL2#AL{c#++ogLH0Y<1kY^7K60!Egj)sT4*Dz89FAwJgz_O@isZ*@ApM^>qz*zkQ4XPk zqwB_uzA4A(|FI52=YmQN@OZ+J~$)+Eyg3JPwjhPqNX%|!O9Qz zVzS<%u{DOF8v)MNsxd6e){9u2t=A28m#(o&Eu_OqA&YOGcqpnEIBVFxpVh>KVhSF^PO(2&LJ6a4330#6MCQTY3ODo?=z=+dTS_CP zmlZ_>yi<$ehEC@O?S8*ob91;>gmgHXcFx_vy4hT(Gz(UjSBx`;g&UyX#IpCBn_x+l zdUhm)(F$LgJYgykOjIKp-;}UeU7~>;S?8Tt#Jw)j)T9`#44&qjG~sfK3M~kc=l!67 zQ@o?;jhIpoMh$^EQ(Ibe7KHB=%QDo4ge7pI=o=>?tP4|{Z*j3xg+@f%{WTTBrNJmd zQccFsr@xMGy`C`4>8+c~YwBftz2^D`+noFXPWjKFJ7GmB`$gE#Wwb1~0}+c*3@9rj zimLfpeVo;s$c!zDp`i!v*s3SEf^gB_Yf=rll(NOdkJfa@gmrgF6j9-EVKk`-BX;yC zo8mG7ew@Z4 zcU!tvP_rrMD>sCDXnYllB?7#(xMY#9c#*H9lou}!6qmhHjDmr_TG6bManr^v_LaWI zi^~Fw7J1{U6w~qr4Mj6!ibemDbxMPwiWpy?Fk+&WzaH`GD@}y8Q7A3KkDvSUf+|Ie zB#>dgpir6uygaIE0*7NkP*GbHt&lIEePA0cEiHbF)T`UYPMTU2_kP)CQM^cx3%UZ8uG`ubpsG zmnNI+uHN)Sisjn7fb__)efoB`zuRu>%3Xe+Wv=vR4(-pj?UP?}u-BYBb=Em`kJ&v} zGw%;Fr}K_8)X!*L`PFmOxs_y@lUMA{gJi|Eq|={d_Smgl`wcs}KX;~`*~v?}zH>Aw z|J9y?GTECR!FJoTgV$v}*MBv0ZWO+I@RB8K&+NlWY|4=QHTjUvsTbj7cY36Y<+`tC zFP%daICBoA>}y@jxxU*zaB=cNtZ}1os?9kwZjblCL}&P?nX{uTd$S`uc)*=G-GzJm zo!%tvfA~=5){X4#tGV_onTd-Gw7<4-?l_j;hqs+f-K}LkGMf=*j*?|eE&AIWOlj`(>m+c>f=?sSF`VQI2Tg>ZBkBy}#dNU_S za>r8nS)F$&0?BLgCd7)<`t5zU>??bieRY54>^Med&t7)kJ#Y6MlTG%$eYrEq^jMd3 zbR3r<6wze}f7`>ykjCjdUAd!2C@ZsWoxc|#5vND9%;iQXJ{|E z>u$Hxc~Cmo%iL^VFLD%_`Y}-q+o~!oB5A3@ay?ExcZSM_x_&8FXv}Om|Gi^Qa z5jk?6`LGpJFn$6yIj7HOFP=?L+(T;SI(pn7bc`~m=TLg|9AZJo%uAWW$DtNkP00hOCy|-q3p#0FBa~QY4uJvt$(zeIm74d>qAc4h5SvJ9vPspqz2^$m>xNRU7=1} zKq5IQ$~N4CPTy{)cVx0D+jr7AGUU0-?i8&Jn0w z$3f@lH7{JWAXaCdXR`Q9WQPar!`>lqb`QdgsT#Pq61Sw&2ru{KAlJVSwc~%* C9}Cm~ diff --git a/horizon/locale/zh_TW/LC_MESSAGES/django.po b/horizon/locale/zh_TW/LC_MESSAGES/django.po deleted file mode 100644 index a2fbec427..000000000 --- a/horizon/locale/zh_TW/LC_MESSAGES/django.po +++ /dev/null @@ -1,508 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Translators: -# Translators: -# Translators: -# Chao-Hsiung Liao , 2012 -msgid "" -msgstr "" -"Project-Id-Version: Horizon\n" -"Report-Msgid-Bugs-To: https://launchpad.net/horizon\n" -"POT-Creation-Date: 2013-03-12 04:08+0000\n" -"PO-Revision-Date: 2013-04-29 08:33+0000\n" -"Last-Translator: Gabriel Hurley \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/openstack/language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: base.py:424 -msgid "Other" -msgstr "其它" - -#: decorators.py:55 -msgid "Please log in to continue." -msgstr "請登入以繼續。" - -#: decorators.py:87 -#, python-format -msgid "You are not authorized to access %s" -msgstr "您的權限不足 無法查看%s" - -#: exceptions.py:283 -msgid "Unauthorized. Please try logging in again." -msgstr "權限不足。 請重新登入。" - -#: browsers/base.py:90 -msgid "Navigation Item" -msgstr "導覽項目" - -#: browsers/views.py:42 -#, python-format -msgid "Select a %s to browse." -msgstr "選擇要瀏覽的 %s。" - -#: conf/default.py:29 -msgid "Password is not accepted" -msgstr "密碼不被接受" - -#: tables/actions.py:349 -msgid "Filter" -msgstr "搜尋" - -#: tables/actions.py:527 -#, python-format -msgid "%(action)s %(data_type)s" -msgstr "%(action)s %(data_type)s" - -#: tables/actions.py:561 -msgid "N/A" -msgstr "N/A" - -#: tables/actions.py:589 -#, python-format -msgid "You do not have permission to %(action)s: %(objs)s" -msgstr "您沒有權限使用%(action)s: %(objs)s" - -#: tables/actions.py:595 -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "無法%(action)s: %(objs)s" - -#: tables/actions.py:601 -#, python-format -msgid "%(action)s: %(objs)s" -msgstr "%(action)s:%(objs)s" - -#: tables/actions.py:611 -msgid "Delete" -msgstr "刪除" - -#: tables/actions.py:612 -msgid "Deleted" -msgstr "已刪除" - -#: tables/base.py:275 -#, python-format -msgid "The attribute %(attr)s doesn't exist on %(obj)s." -msgstr "此屬性%(attr)s並不在%(obj)s上存在。" - -#: tables/base.py:748 -msgid "No items to display." -msgstr "沒有任何相關項目" - -#: tables/base.py:852 -msgid "Actions" -msgstr "動作" - -#: tables/base.py:1035 -#, python-format -msgid "No match returned for the id \"%s\"." -msgstr "找不到id \"%s\"的相關項目" - -#: tables/base.py:1165 -msgid "Please select a row before taking that action." -msgstr "請選擇一個欄位後才執行動作" - -#: templates/_header.html:3 -msgid "Logged in as" -msgstr "登入為" - -#: templates/_header.html:5 -msgid "Help" -msgstr "求助" - -#: templates/_header.html:7 -msgid "Sign Out" -msgstr "登出" - -#: templates/splash.html:7 templates/auth/login.html:4 -msgid "Login" -msgstr "登入" - -#: templates/auth/_login.html:4 -msgid "Log In" -msgstr "登入" - -#: templates/auth/_login.html:14 -msgid "You don't have permissions to access:" -msgstr "" - -#: templates/auth/_login.html:16 -msgid "Login as different user or go back to" -msgstr "" - -#: templates/auth/_login.html:17 -msgid "home page" -msgstr "" - -#: templates/auth/_login.html:27 -msgid "Sign In" -msgstr "" - -#: templates/horizon/_messages.html:7 -msgid "Info: " -msgstr "資訊: " - -#: templates/horizon/_messages.html:13 -msgid "Warning: " -msgstr "警告: " - -#: templates/horizon/_messages.html:19 -msgid "Success: " -msgstr "成功: " - -#: templates/horizon/_messages.html:25 -msgid "Error: " -msgstr "錯誤: " - -#: templates/horizon/common/_data_table.html:54 -msgid "Summary" -msgstr "摘要" - -#: templates/horizon/common/_data_table.html:63 -#, python-format -msgid "Displaying %(counter)s item" -msgid_plural "Displaying %(counter)s items" -msgstr[0] "顯示 %(counter)s 個項目" - -#: templates/horizon/common/_data_table_row_actions.html:10 -msgid "More" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:4 -msgid "Quota Summary" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "Used" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -#: templates/horizon/common/_quota_summary.html:8 -#: templates/horizon/common/_quota_summary.html:11 -#: templates/horizon/common/_quota_summary.html:15 -#: templates/horizon/common/_quota_summary.html:18 -msgid "of" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:5 -msgid "Available Instances" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:8 -msgid "Available vCPUs" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:11 -msgid "Available RAM" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:15 -msgid "Available volumes" -msgstr "" - -#: templates/horizon/common/_quota_summary.html:18 -msgid "Available volume storage" -msgstr "" - -#: templates/horizon/common/_resource_browser.html:10 -#, python-format -msgid "Displaying %(nav_items)s item" -msgid_plural "Displaying %(nav_items)s items" -msgstr[0] "顯示 %(nav_items)s 個項目" - -#: templates/horizon/common/_resource_browser.html:11 -#, python-format -msgid "Displaying %(content_items)s item" -msgid_plural "Displaying %(content_items)s items" -msgstr[0] "顯示 %(content_items)s 個項目" - -#: templates/horizon/common/_sidebar.html:14 -msgid "Current Project" -msgstr "目前的專案" - -#: templates/horizon/common/_usage_summary.html:5 -msgid "Select a month to query its usage" -msgstr "請選擇一個月份以查詢使用量" - -#: templates/horizon/common/_usage_summary.html:9 -msgid "Submit" -msgstr "提交" - -#: templates/horizon/common/_usage_summary.html:14 -msgid "Active Instances" -msgstr "運作中執行個體" - -#: templates/horizon/common/_usage_summary.html:15 -msgid "Active RAM" -msgstr "" - -#: templates/horizon/common/_usage_summary.html:16 -msgid "This Month's VCPU-Hours" -msgstr "本月的虛擬處理器-時數" - -#: templates/horizon/common/_usage_summary.html:17 -msgid "This Month's GB-Hours" -msgstr "本月的GB-時數" - -#: templates/horizon/common/_workflow.html:33 -msgid "Cancel" -msgstr "取消" - -#: templatetags/branding.py:35 -msgid "Horizon" -msgstr "Horizon" - -#: templatetags/horizon.py:109 -msgid "No Limit" -msgstr "不限制" - -#: templatetags/horizon.py:111 templatetags/horizon.py:113 -msgid "Available" -msgstr "可用" - -#: templatetags/sizeformat.py:45 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 位元組" - -#: templatetags/sizeformat.py:49 -#, python-format -msgid "%(size)d" -msgid_plural "%(size)d" -msgstr[0] "%(size)d" - -#: templatetags/sizeformat.py:52 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: templatetags/sizeformat.py:55 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: templatetags/sizeformat.py:58 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: templatetags/sizeformat.py:61 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: templatetags/sizeformat.py:63 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: test/settings.py:114 -msgid "Password must be between 8 and 18 characters." -msgstr "密碼必須介於 8 到 18 個字元之間。" - -#: test/test_dashboards/cats/dashboard.py:8 -msgid "Cute Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:14 -msgid "Fierce Cats" -msgstr "" - -#: test/test_dashboards/cats/dashboard.py:19 -msgid "Cats" -msgstr "" - -#: test/test_dashboards/cats/kittens/panel.py:9 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:3 -#: test/test_dashboards/cats/kittens/templates/kittens/index.html:6 -msgid "Kittens" -msgstr "" - -#: test/test_dashboards/cats/tigers/panel.py:9 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:3 -#: test/test_dashboards/cats/tigers/templates/tigers/index.html:6 -msgid "Tigers" -msgstr "" - -#: test/test_dashboards/dogs/dashboard.py:7 -msgid "Dogs" -msgstr "" - -#: test/test_dashboards/dogs/puppies/panel.py:9 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:3 -#: test/test_dashboards/dogs/puppies/templates/puppies/index.html:6 -msgid "Puppies" -msgstr "" - -#: test/tests/base.py:39 -msgid "My Dashboard" -msgstr "我的 Dashboard" - -#: test/tests/base.py:45 -msgid "My Panel" -msgstr "我的面板" - -#: test/tests/base.py:51 -msgid "Admin Panel" -msgstr "管理面板" - -#: test/tests/messages.py:32 -msgid "Giant ants are attacking San Francisco!" -msgstr "" - -#: test/tests/messages.py:46 -msgid "We are now safe from ants! Go here!" -msgstr "" - -#: test/tests/tables.py:107 -msgid "Batch" -msgstr "批次" - -#: test/tests/tables.py:108 -msgid "Batched" -msgstr "已批次" - -#: test/tests/tables.py:109 test/tests/tables.py:120 -msgid "Item" -msgstr "項目" - -#: test/tests/tables.py:110 test/tests/tables.py:121 -msgid "Items" -msgstr "項目" - -#: test/tests/tables.py:118 -msgid "Down" -msgstr "下" - -#: test/tests/tables.py:118 -msgid "Up" -msgstr "上" - -#: test/tests/tables.py:119 -msgid "Downed" -msgstr "" - -#: test/tests/tables.py:119 -msgid "Upped" -msgstr "" - -#: test/tests/tables.py:187 -msgid "No Actions Table" -msgstr "沒有動作表格" - -#: test/tests/tables.py:684 -msgid "Single Table" -msgstr "" - -#: test/tests/tabs.py:36 -msgid "Tab One" -msgstr "分頁一" - -#: test/tests/tabs.py:42 -msgid "Delayed Tab" -msgstr "延遲分頁" - -#: test/tests/tabs.py:49 -msgid "Disabled Tab" -msgstr "停用分頁" - -#: test/tests/tabs.py:58 -msgid "Disallowed Tab" -msgstr "不允許分頁" - -#: test/tests/tabs.py:76 -msgid "Tab With My Table" -msgstr "我的表格分頁" - -#: test/tests/tabs.py:85 -msgid "Recoverable Error Tab" -msgstr "可回復錯誤分頁" - -#: test/tests/workflows.py:43 -msgid "Project" -msgstr "專案" - -#: test/tests/workflows.py:44 -msgid "User" -msgstr "使用者" - -#: test/tests/workflows.py:47 -msgid "Test Action One" -msgstr "測試動作一" - -#: test/tests/workflows.py:61 -msgid "Instance" -msgstr "執行個體" - -#: test/tests/workflows.py:64 -msgid "Test Action Two" -msgstr "測試動作二" - -#: test/tests/workflows.py:72 -msgid "Test Action Three" -msgstr "測試動作三" - -#: test/tests/workflows.py:77 -msgid "Admin" -msgstr "管理者" - -#: test/tests/workflows.py:80 -msgid "Admin Action" -msgstr "管理動作" - -#: utils/fields.py:46 -msgid "Incorrect format for IP address" -msgstr "IP 位址格式不正確" - -#: utils/fields.py:47 -msgid "Invalid version for IP address" -msgstr "IP 位址版本無效" - -#: utils/fields.py:48 -msgid "Invalid subnet mask" -msgstr "無效的子網路遮罩" - -#: workflows/base.py:71 -msgid "Processing..." -msgstr "處理中…" - -#: workflows/base.py:467 -msgid "All available" -msgstr "" - -#: workflows/base.py:468 -msgid "Members" -msgstr "" - -#: workflows/base.py:469 -msgid "None available." -msgstr "" - -#: workflows/base.py:470 -msgid "No members." -msgstr "" - -#: workflows/base.py:569 -msgid "Save" -msgstr "儲存" - -#: workflows/base.py:570 -#, python-format -msgid "%s completed successfully." -msgstr "%s 已成功的完成。" - -#: workflows/base.py:571 -#, python-format -msgid "%s did not complete." -msgstr "%s 尚未完成。" diff --git a/horizon/locale/zh_TW/LC_MESSAGES/djangojs.mo b/horizon/locale/zh_TW/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 18261fd6509930287ac88800a52455ef293474b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmYL^Pfx-y7>6->+R?Lz9=zd;8+d>Mh6)82_b+3R=&g=AXJ)%}#pnm|>-kxHr$&Cs zleX#8_Sdh|lg|$32suN}kz?cnX){D}+#KQ9I{!(Gev!Eae+OG>no=uD5;nhMD^9jN zUHft5q_Wn=Lf91L4sP~E1DU48N#YFVMhc6EU?Hrer0;qIa0lS^iF-xeQP;(w2&sH4 z+spsFd(Kh_V^}b98`IG5KEx4s0?}B=j8IJ_tTvP^H$gxm7IHG-A@hS7TP#w(USFfC zioGZ#WKz6R60m5sX)8~HU{;kqZHj|~RYO1IhyQs!*O_Z&rNZYvYV2+0yS=O{QK~V? zpM`0poo=!v3=dvg>q#2mD%ZPG6_gAgOY0=n-iQj8+PpTDsQPEwOuaGrolae+^9^xh Ba-IMH diff --git a/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po b/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8cf0876c2..000000000 --- a/horizon/locale/zh_TW/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,73 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-12 04:09+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0\n" - -#: static/horizon/js/horizon.forms.js:47 -msgid "Additional information here..." -msgstr "" - -#: static/horizon/js/horizon.forms.js:53 -msgid "Filter" -msgstr "" - -#: static/horizon/js/horizon.instances.js:28 -msgid "There was a problem communicating with the server, please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:125 -msgid "There was an error submitting the form. Please try again." -msgstr "" - -#: static/horizon/js/horizon.modals.js:159 static/horizon/js/horizon.tabs.js:9 -msgid "Loading" -msgstr "" - -#: static/horizon/js/horizon.modals.js:178 -msgid "An error occurred. Please try again." -msgstr "" - -#: static/horizon/js/horizon.tables.js:47 -msgid "An error occurred while updating." -msgstr "" - -#: static/horizon/js/horizon.tables.js:145 -msgid "You have selected " -msgstr "" - -#: static/horizon/js/horizon.tables.js:158 -msgid "Confirm " -msgstr "" - -#: static/horizon/js/horizon.tables.js:159 -msgid "Please confirm your selection. This action cannot be undone." -msgstr "" - -#: static/horizon/js/horizon.tables.js:173 -msgid "Working" -msgstr "" - -#: static/horizon/js/horizon.tables.js:216 -#, c-format -msgid "Displaying %s item" -msgid_plural "Displaying %s items" -msgstr[0] "" - -#: static/horizon/js/horizon.users.js:18 -msgid "Passwords do not match." -msgstr "" diff --git a/horizon/management/commands/startdash.py b/horizon/management/commands/startdash.py deleted file mode 100644 index 9ffdd20e4..000000000 --- a/horizon/management/commands/startdash.py +++ /dev/null @@ -1,59 +0,0 @@ -import glob -from optparse import make_option -import os - -from django.core.management.base import CommandError -from django.core.management.templates import TemplateCommand -from django.utils.importlib import import_module - -import horizon - - -class Command(TemplateCommand): - template = os.path.join(horizon.__path__[0], "conf", "dash_template") - option_list = TemplateCommand.option_list + ( - make_option('--target', - dest='target', - action='store', - default=None, - help='The directory in which the panel ' - 'should be created. Defaults to the ' - 'current directory. The value "auto" ' - 'may also be used to automatically ' - 'create the panel inside the specified ' - 'dashboard module.'),) - help = ("Creates a Django app directory structure for a new dashboard " - "with the given name in the current directory or optionally in " - "the given directory.") - - def handle(self, dash_name=None, **options): - if dash_name is None: - raise CommandError("You must provide a dashboard name.") - - # Use our default template if one isn't specified. - if not options.get("template", None): - options["template"] = self.template - - # We have html templates as well, so make sure those are included. - options["extensions"].extend(["tmpl", "html", "js", "css"]) - - # Check that the app_name cannot be imported. - try: - import_module(dash_name) - except ImportError: - pass - else: - raise CommandError("%r conflicts with the name of an existing " - "Python module and cannot be used as an app " - "name. Please try another name." % dash_name) - - super(Command, self).handle('dash', dash_name, **options) - - target = options.pop("target", None) - if not target: - target = os.path.join(os.curdir, dash_name) - - # Rename our python template files. - file_names = glob.glob(os.path.join(target, "*.py.tmpl")) - for filename in file_names: - os.rename(filename, filename[:-5]) diff --git a/horizon/management/commands/startpanel.py b/horizon/management/commands/startpanel.py deleted file mode 100644 index 61369fa69..000000000 --- a/horizon/management/commands/startpanel.py +++ /dev/null @@ -1,97 +0,0 @@ -import glob -from optparse import make_option -import os - -from django.core.management.base import CommandError -from django.core.management.templates import TemplateCommand -from django.utils.importlib import import_module - -import horizon - - -class Command(TemplateCommand): - args = "[name] [dashboard name] [optional destination directory]" - option_list = TemplateCommand.option_list + ( - make_option('--dashboard', '-d', - dest='dashboard', - action='store', - default=None, - help='The dotted python path to the ' - 'dashboard which this panel will be ' - 'registered with.'), - make_option('--target', - dest='target', - action='store', - default=None, - help='The directory in which the panel ' - 'should be created. Defaults to the ' - 'current directory. The value "auto" ' - 'may also be used to automatically ' - 'create the panel inside the specified ' - 'dashboard module.'),) - template = os.path.join(horizon.__path__[0], "conf", "panel_template") - help = ("Creates a Django app directory structure for a new panel " - "with the given name in the current directory or optionally in " - "the given directory.") - - def handle(self, panel_name=None, **options): - if panel_name is None: - raise CommandError("You must provide a panel name.") - - if options.get('dashboard') is None: - raise CommandError("You must specify the name of the dashboard " - "this panel will be registered with using the " - "-d or --dashboard option.") - - dashboard_path = options.get('dashboard') - dashboard_mod_path = ".".join([dashboard_path, "dashboard"]) - - # Check the the dashboard.py file in the dashboard app can be imported. - # Add the dashboard information to our options to pass along if all - # goes well. - try: - dashboard_mod = import_module(dashboard_mod_path) - options["dash_path"] = dashboard_path - options["dash_name"] = dashboard_path.split(".")[-1] - except ImportError: - raise CommandError("A dashboard.py module could not be imported " - " from the dashboard at %r." - % options.get("dashboard")) - - target = options.pop("target", None) - if target == "auto": - target = os.path.join(os.path.dirname(dashboard_mod.__file__), - panel_name) - if not os.path.exists(target): - try: - os.mkdir(target) - except OSError as exc: - raise CommandError("Unable to create panel directory: %s" - % exc) - - # Use our default template if one isn't specified. - if not options.get("template", None): - options["template"] = self.template - - # We have html templates as well, so make sure those are included. - options["extensions"].extend(["tmpl", "html"]) - - # Check that the app_name cannot be imported. - try: - import_module(panel_name) - except ImportError: - pass - else: - raise CommandError("%r conflicts with the name of an existing " - "Python module and cannot be used as an app " - "name. Please try another name." % panel_name) - - super(Command, self).handle('panel', panel_name, target, **options) - - if not target: - target = os.path.join(os.curdir, panel_name) - - # Rename our python template files. - file_names = glob.glob(os.path.join(target, "*.py.tmpl")) - for filename in file_names: - os.rename(filename, filename[:-5]) diff --git a/horizon/messages.py b/horizon/messages.py deleted file mode 100644 index 05b2ee109..000000000 --- a/horizon/messages.py +++ /dev/null @@ -1,83 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 -# -# Copyright 2012 Nebula, Inc. -# -# 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. - -""" -Drop-in replacement for django.contrib.messages which handles Horizon's -messaging needs (e.g. AJAX communication, etc.). -""" - -from django.contrib import messages as _messages -from django.contrib.messages import constants -from django.utils.encoding import force_unicode -from django.utils.safestring import SafeData - - -def add_message(request, level, message, extra_tags='', fail_silently=False): - """ - Attempts to add a message to the request using the 'messages' app. - """ - if request.is_ajax(): - tag = constants.DEFAULT_TAGS[level] - # if message is marked as safe, pass "safe" tag as extra_tags so that - # client can skip HTML escape for the message when rendering - if isinstance(message, SafeData): - extra_tags = extra_tags + ' safe' - request.horizon['async_messages'].append([tag, - force_unicode(message), - extra_tags]) - else: - return _messages.add_message(request, level, message, - extra_tags, fail_silently) - - -def debug(request, message, extra_tags='', fail_silently=False): - """ - Adds a message with the ``DEBUG`` level. - """ - add_message(request, constants.DEBUG, message, extra_tags=extra_tags, - fail_silently=fail_silently) - - -def info(request, message, extra_tags='', fail_silently=False): - """ - Adds a message with the ``INFO`` level. - """ - add_message(request, constants.INFO, message, extra_tags=extra_tags, - fail_silently=fail_silently) - - -def success(request, message, extra_tags='', fail_silently=False): - """ - Adds a message with the ``SUCCESS`` level. - """ - add_message(request, constants.SUCCESS, message, extra_tags=extra_tags, - fail_silently=fail_silently) - - -def warning(request, message, extra_tags='', fail_silently=False): - """ - Adds a message with the ``WARNING`` level. - """ - add_message(request, constants.WARNING, message, extra_tags=extra_tags, - fail_silently=fail_silently) - - -def error(request, message, extra_tags='', fail_silently=False): - """ - Adds a message with the ``ERROR`` level. - """ - add_message(request, constants.ERROR, message, extra_tags=extra_tags, - fail_silently=fail_silently) diff --git a/horizon/middleware.py b/horizon/middleware.py deleted file mode 100644 index 2dde4e4d7..000000000 --- a/horizon/middleware.py +++ /dev/null @@ -1,129 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 Nebula, Inc. -# -# 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. -""" -Middleware provided and used by Horizon. -""" - -import datetime -import json -import logging - -from django.conf import settings -from django.contrib.auth import REDIRECT_FIELD_NAME -from django.contrib.auth.views import redirect_to_login -from django.contrib import messages as django_messages -from django import http -from django.http import HttpResponseRedirect -from django import shortcuts -from django.utils.encoding import iri_to_uri -from django.utils import timezone - -from horizon import exceptions - - -LOG = logging.getLogger(__name__) - - -class HorizonMiddleware(object): - """ The main Horizon middleware class. Required for use of Horizon. """ - - def process_request(self, request): - """ Adds data necessary for Horizon to function to the request. """ - # Activate timezone handling - tz = request.session.get('django_timezone') - if tz: - timezone.activate(tz) - - # Check for session timeout - timeout = 1800 - try: - timeout = settings.SESSION_TIMEOUT - except AttributeError: - pass - - last_activity = request.session.get('last_activity', None) - timestamp = datetime.datetime.now() - if last_activity and (timestamp - last_activity).seconds > timeout: - request.session.pop('last_activity') - return HttpResponseRedirect(settings.LOGOUT_URL) - request.session['last_activity'] = timestamp - - request.horizon = {'dashboard': None, - 'panel': None, - 'async_messages': []} - - def process_exception(self, request, exception): - """ - Catches internal Horizon exception classes such as NotAuthorized, - NotFound and Http302 and handles them gracefully. - """ - if isinstance(exception, (exceptions.NotAuthorized, - exceptions.NotAuthenticated)): - auth_url = settings.LOGIN_URL - next_url = iri_to_uri(request.get_full_path()) - if next_url != auth_url: - field_name = REDIRECT_FIELD_NAME - else: - field_name = None - login_url = request.build_absolute_uri(auth_url) - response = redirect_to_login(next_url, login_url=login_url, - redirect_field_name=field_name) - - # TODO(gabriel): Find a way to display an appropriate message to - # the user *on* the login form... - if request.is_ajax(): - response_401 = http.HttpResponse(status=401) - response_401['X-Horizon-Location'] = response['location'] - return response_401 - return response - - # If an internal "NotFound" error gets this far, return a real 404. - if isinstance(exception, exceptions.NotFound): - raise http.Http404(exception) - - if isinstance(exception, exceptions.Http302): - # TODO(gabriel): Find a way to display an appropriate message to - # the user *on* the login form... - return shortcuts.redirect(exception.location) - - def process_response(self, request, response): - """ - Convert HttpResponseRedirect to HttpResponse if request is via ajax - to allow ajax request to redirect url - """ - if request.is_ajax(): - queued_msgs = request.horizon['async_messages'] - if type(response) == http.HttpResponseRedirect: - # Drop our messages back into the session as per usual so they - # don't disappear during the redirect. Not that we explicitly - # use django's messages methods here. - for tag, message, extra_tags in queued_msgs: - getattr(django_messages, tag)(request, message, extra_tags) - redirect_response = http.HttpResponse() - redirect_response['X-Horizon-Location'] = response['location'] - return redirect_response - if queued_msgs: - # TODO(gabriel): When we have an async connection to the - # client (e.g. websockets) this should be pushed to the - # socket queue rather than being sent via a header. - # The header method has notable drawbacks (length limits, - # etc.) and is not meant as a long-term solution. - response['X-Horizon-Messages'] = json.dumps(queued_msgs) - return response diff --git a/horizon/models.py b/horizon/models.py deleted file mode 100644 index 6313a32fa..000000000 --- a/horizon/models.py +++ /dev/null @@ -1,23 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 Nebula, Inc. -# -# 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. - -""" -Stub file to work around django bug: https://code.djangoproject.com/ticket/7198 -""" diff --git a/horizon/site_urls.py b/horizon/site_urls.py deleted file mode 100644 index 1cde0f034..000000000 --- a/horizon/site_urls.py +++ /dev/null @@ -1,47 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 Nebula, Inc. -# -# 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 import settings -from django.conf.urls.defaults import include -from django.conf.urls.defaults import patterns -from django.conf.urls.defaults import url -from django.views.generic import TemplateView - - -urlpatterns = patterns('horizon.views', - url(r'^home/$', 'user_home', name='user_home') -) - -# Client-side i18n URLconf. -urlpatterns += patterns('', - url(r'^i18n/js/(?P\S+?)/$', - 'django.views.i18n.javascript_catalog', - name='jsi18n'), - url(r'^i18n/setlang/$', - 'django.views.i18n.set_language', - name="set_language"), - url(r'^i18n/', include('django.conf.urls.i18n')) -) - -if settings.DEBUG: - urlpatterns += patterns('', - url(r'^qunit/$', - TemplateView.as_view(template_name="horizon/qunit.html"), - name='qunit_tests')) diff --git a/horizon/static/bootstrap/js/bootstrap-datepicker.js b/horizon/static/bootstrap/js/bootstrap-datepicker.js deleted file mode 100644 index 9ee95f310..000000000 --- a/horizon/static/bootstrap/js/bootstrap-datepicker.js +++ /dev/null @@ -1,470 +0,0 @@ -/* ========================================================= - * bootstrap-datepicker.js - * http://www.eyecon.ro/bootstrap-datepicker - * ========================================================= - * Copyright 2012 Stefan Petre - * - * 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. - * ========================================================= */ - -!function( $ ) { - - // Picker object - - var Datepicker = function(element, options){ - this.element = $(element); - this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); - this.picker = $(DPGlobal.template) - .appendTo('body') - .on({ - click: $.proxy(this.click, this)//, - //mousedown: $.proxy(this.mousedown, this) - }); - this.isInput = this.element.is('input'); - this.component = this.element.is('.date') ? this.element.find('.add-on') : false; - - if (this.isInput) { - this.element.on({ - focus: $.proxy(this.show, this), - //blur: $.proxy(this.hide, this), - keyup: $.proxy(this.update, this) - }); - } else { - if (this.component){ - this.component.on('click', $.proxy(this.show, this)); - } else { - this.element.on('click', $.proxy(this.show, this)); - } - } - - this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0; - if (typeof this.minViewMode === 'string') { - switch (this.minViewMode) { - case 'months': - this.minViewMode = 1; - break; - case 'years': - this.minViewMode = 2; - break; - default: - this.minViewMode = 0; - break; - } - } - this.viewMode = options.viewMode||this.element.data('date-viewmode')||0; - if (typeof this.viewMode === 'string') { - switch (this.viewMode) { - case 'months': - this.viewMode = 1; - break; - case 'years': - this.viewMode = 2; - break; - default: - this.viewMode = 0; - break; - } - } - this.startViewMode = this.viewMode; - this.weekStart = options.weekStart||this.element.data('date-weekstart')||0; - this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1; - this.onRender = options.onRender; - this.fillDow(); - this.fillMonths(); - this.update(); - this.showMode(); - }; - - Datepicker.prototype = { - constructor: Datepicker, - - show: function(e) { - this.picker.show(); - this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); - this.place(); - $(window).on('resize', $.proxy(this.place, this)); - if (e ) { - e.stopPropagation(); - e.preventDefault(); - } - if (!this.isInput) { - } - var that = this; - $(document).on('mousedown', function(ev){ - if ($(ev.target).closest('.datepicker').length == 0) { - that.hide(); - } - }); - this.element.trigger({ - type: 'show', - date: this.date - }); - }, - - hide: function(){ - this.picker.hide(); - $(window).off('resize', this.place); - this.viewMode = this.startViewMode; - this.showMode(); - if (!this.isInput) { - $(document).off('mousedown', this.hide); - } - //this.set(); - this.element.trigger({ - type: 'hide', - date: this.date - }); - }, - - set: function() { - var formated = DPGlobal.formatDate(this.date, this.format); - if (!this.isInput) { - if (this.component){ - this.element.find('input').prop('value', formated); - } - this.element.data('date', formated); - } else { - this.element.prop('value', formated); - } - }, - - setValue: function(newDate) { - if (typeof newDate === 'string') { - this.date = DPGlobal.parseDate(newDate, this.format); - } else { - this.date = new Date(newDate); - } - this.set(); - this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); - this.fill(); - }, - - place: function(){ - var offset = this.component ? this.component.offset() : this.element.offset(); - this.picker.css({ - top: offset.top + this.height, - left: offset.left - }); - }, - - update: function(newDate){ - this.date = DPGlobal.parseDate( - typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')), - this.format - ); - this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); - this.fill(); - }, - - fillDow: function(){ - var dowCnt = this.weekStart; - var html = ''; - while (dowCnt < this.weekStart + 7) { - html += ''+DPGlobal.dates.daysMin[(dowCnt++)%7]+''; - } - html += ''; - this.picker.find('.datepicker-days thead').append(html); - }, - - fillMonths: function(){ - var html = ''; - var i = 0 - while (i < 12) { - html += ''+DPGlobal.dates.monthsShort[i++]+''; - } - this.picker.find('.datepicker-months td').append(html); - }, - - fill: function() { - var d = new Date(this.viewDate), - year = d.getFullYear(), - month = d.getMonth(), - currentDate = this.date.valueOf(); - this.picker.find('.datepicker-days th:eq(1)') - .text(DPGlobal.dates.months[month]+' '+year); - var prevMonth = new Date(year, month-1, 28,0,0,0,0), - day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth()); - prevMonth.setDate(day); - prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7); - var nextMonth = new Date(prevMonth); - nextMonth.setDate(nextMonth.getDate() + 42); - nextMonth = nextMonth.valueOf(); - html = []; - var clsName; - while(prevMonth.valueOf() < nextMonth) { - if (prevMonth.getDay() === this.weekStart) { - html.push(''); - } - clsName = this.onRender(prevMonth); - if (prevMonth.getMonth() < month) { - clsName += ' old'; - } else if (prevMonth.getMonth() > month) { - clsName += ' new'; - } - if (prevMonth.valueOf() === currentDate) { - clsName += ' active'; - } - html.push(''+prevMonth.getDate() + ''); - if (prevMonth.getDay() === this.weekEnd) { - html.push(''); - } - prevMonth.setDate(prevMonth.getDate()+1); - } - this.picker.find('.datepicker-days tbody').empty().append(html.join('')); - var currentYear = this.date.getFullYear(); - - var months = this.picker.find('.datepicker-months') - .find('th:eq(1)') - .text(year) - .end() - .find('span').removeClass('active'); - if (currentYear === year) { - months.eq(this.date.getMonth()).addClass('active'); - } - - html = ''; - year = parseInt(year/10, 10) * 10; - var yearCont = this.picker.find('.datepicker-years') - .find('th:eq(1)') - .text(year + '-' + (year + 9)) - .end() - .find('td'); - year -= 1; - for (var i = -1; i < 11; i++) { - html += ''+year+''; - year += 1; - } - yearCont.html(html); - }, - - click: function(e) { - e.stopPropagation(); - e.preventDefault(); - var target = $(e.target).closest('span, td, th'); - if (target.length === 1) { - switch(target[0].nodeName.toLowerCase()) { - case 'th': - switch(target[0].className) { - case 'switch': - this.showMode(1); - break; - case 'prev': - case 'next': - this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call( - this.viewDate, - this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + - DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1) - ); - this.fill(); - this.set(); - break; - } - break; - case 'span': - if (target.is('.month')) { - var month = target.parent().find('span').index(target); - this.viewDate.setMonth(month); - } else { - var year = parseInt(target.text(), 10)||0; - this.viewDate.setFullYear(year); - } - if (this.viewMode !== 0) { - this.date = new Date(this.viewDate); - this.element.trigger({ - type: 'changeDate', - date: this.date, - viewMode: DPGlobal.modes[this.viewMode].clsName - }); - } - this.showMode(-1); - this.fill(); - this.set(); - break; - case 'td': - if (target.is('.day') && !target.is('.disabled')){ - var day = parseInt(target.text(), 10)||1; - var month = this.viewDate.getMonth(); - if (target.is('.old')) { - month -= 1; - } else if (target.is('.new')) { - month += 1; - } - var year = this.viewDate.getFullYear(); - this.date = new Date(year, month, day,0,0,0,0); - this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0); - this.fill(); - this.set(); - this.element.trigger({ - type: 'changeDate', - date: this.date, - viewMode: DPGlobal.modes[this.viewMode].clsName - }); - } - break; - } - } - }, - - mousedown: function(e){ - e.stopPropagation(); - e.preventDefault(); - }, - - showMode: function(dir) { - if (dir) { - this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); - } - this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); - } - }; - - $.fn.datepicker = function ( option, val ) { - return this.each(function () { - var $this = $(this), - data = $this.data('datepicker'), - options = typeof option === 'object' && option; - if (!data) { - $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); - } - if (typeof option === 'string') data[option](val); - }); - }; - - $.fn.datepicker.defaults = { - onRender: function(date) { - return ''; - } - }; - $.fn.datepicker.Constructor = Datepicker; - - var DPGlobal = { - modes: [ - { - clsName: 'days', - navFnc: 'Month', - navStep: 1 - }, - { - clsName: 'months', - navFnc: 'FullYear', - navStep: 1 - }, - { - clsName: 'years', - navFnc: 'FullYear', - navStep: 10 - }], - dates:{ - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], - daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], - daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - }, - isLeapYear: function (year) { - return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) - }, - getDaysInMonth: function (year, month) { - return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] - }, - parseFormat: function(format){ - var separator = format.match(/[.\/\-\s].*?/), - parts = format.split(/\W+/); - if (!separator || !parts || parts.length === 0){ - throw new Error("Invalid date format."); - } - return {separator: separator, parts: parts}; - }, - parseDate: function(date, format) { - var parts = date.split(format.separator), - date = new Date(), - val; - date.setHours(0); - date.setMinutes(0); - date.setSeconds(0); - date.setMilliseconds(0); - if (parts.length === format.parts.length) { - var year = date.getFullYear(), day = date.getDate(), month = date.getMonth(); - for (var i=0, cnt = format.parts.length; i < cnt; i++) { - val = parseInt(parts[i], 10)||1; - switch(format.parts[i]) { - case 'dd': - case 'd': - day = val; - date.setDate(val); - break; - case 'mm': - case 'm': - month = val - 1; - date.setMonth(val - 1); - break; - case 'yy': - year = 2000 + val; - date.setFullYear(2000 + val); - break; - case 'yyyy': - year = val; - date.setFullYear(val); - break; - } - } - date = new Date(year, month, day, 0 ,0 ,0); - } - return date; - }, - formatDate: function(date, format){ - var val = { - d: date.getDate(), - m: date.getMonth() + 1, - yy: date.getFullYear().toString().substring(2), - yyyy: date.getFullYear() - }; - val.dd = (val.d < 10 ? '0' : '') + val.d; - val.mm = (val.m < 10 ? '0' : '') + val.m; - var date = []; - for (var i=0, cnt = format.parts.length; i < cnt; i++) { - date.push(val[format.parts[i]]); - } - return date.join(format.separator); - }, - headTemplate: ''+ - ''+ - '‹'+ - ''+ - '›'+ - ''+ - '', - contTemplate: '' - }; - DPGlobal.template = ''; - -}( window.jQuery ); \ No newline at end of file diff --git a/horizon/static/bootstrap/js/bootstrap.js b/horizon/static/bootstrap/js/bootstrap.js deleted file mode 100644 index 4412304eb..000000000 --- a/horizon/static/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,1720 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - -!function( $ ) { - - $(function () { - - "use strict" - - /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) - * ======================================================= */ - - $.support.transition = (function () { - var thisBody = document.body || document.documentElement - , thisStyle = thisBody.style - , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined - - return support && { - end: (function () { - var transitionEnd = "TransitionEnd" - if ( $.browser.webkit ) { - transitionEnd = "webkitTransitionEnd" - } else if ( $.browser.mozilla ) { - transitionEnd = "transitionend" - } else if ( $.browser.opera ) { - transitionEnd = "oTransitionEnd" - } - return transitionEnd - }()) - } - })() - - }) - -}( window.jQuery );/* ========================================================== - * bootstrap-alert.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function ( el ) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype = { - - constructor: Alert - - , close: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.trigger('close') - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent - .trigger('close') - .removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}( window.jQuery );/* ============================================================ - * bootstrap-button.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype = { - - constructor: Button - - , setState: function ( state ) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - , toggle: function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}( window.jQuery );/* ========================================================== - * bootstrap-carousel.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function( $ ){ - - "use strict" - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.carousel.defaults, options) - this.options.slide && this.slide(this.options.slide) - } - - Carousel.prototype = { - - cycle: function () { - this.interval = setInterval($.proxy(this.next, this), this.options.interval) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function () { - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - - if (!$next.length) return - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if (!$.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger('slide') - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } else { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.trigger('slide') - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = typeof option == 'object' && option - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}( window.jQuery );/* ============================================================= - * bootstrap-collapse.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - -!function( $ ){ - - "use strict" - - var Collapse = function ( element, options ) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options["parent"]) { - this.$parent = $(this.options["parent"]) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension = this.dimension() - , scroll = $.camelCase(['scroll', dimension].join('-')) - , actives = this.$parent && this.$parent.find('.in') - , hasData - - if (actives && actives.length) { - hasData = actives.data('collapse') - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', 'show', 'shown') - this.$element[dimension](this.$element[0][scroll]) - - } - - , hide: function () { - var dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', 'hide', 'hidden') - this.$element[dimension](0) - } - - , reset: function ( size ) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element.addClass('collapse') - } - - , transition: function ( method, startEvent, completeEvent ) { - var that = this - , complete = function () { - if (startEvent == 'show') that.reset() - that.$element.trigger(completeEvent) - } - - this.$element - .trigger(startEvent) - [method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}( window.jQuery );/* ============================================================ - * bootstrap-dropdown.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * 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. - * ============================================================ */ - - -!function( $ ){ - - "use strict" - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function ( element ) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function ( e ) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - , isActive - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - !isActive && $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}( window.jQuery );/* ========================================================= - * bootstrap-modal.js v2.0.1 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * 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. - * ========================================================= */ - - -!function( $ ){ - - "use strict" - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function ( content, options ) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - - if (this.isShown) return - - $('body').addClass('modal-open') - - this.isShown = true - this.$element.trigger('show') - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function ( e ) { - e && e.preventDefault() - - if (!this.isShown) return - - var that = this - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element - .trigger('hide') - .removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal( that ) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop( callback ) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('