From eba19d6a7a83219ebbf73242bc75f5e665b260b6 Mon Sep 17 00:00:00 2001 From: Sergey Otpuschennikov Date: Fri, 8 Nov 2013 21:13:11 +0400 Subject: [PATCH] Added new specfile and requires python-lesscpy Change-Id: I74e4e91d7e819672c0b1656c282b842a8116187f --- ...t-access-the-net-while-building-docs.patch | 4 +- .../0002-disable-debug-move-web-root.patch | 31 +- ...location-to-tmp-and-also-add-localho.patch | 4 +- ...a-customization-module-based-on-RHOS.patch | 260 ++++ ...sphinx-and-remove-local-copy-of-doc-.patch | 1348 +++++++++++++++++ ...-files-and-checks-to-etc-openstack-d.patch | 32 + ...e-SECRET_KEY-secret_key_store-to-tmp.patch | 29 + ...008-fix-up-issues-with-customization.patch | 81 + ...runcate-the-logo-related-rhbz-877138.patch | 26 + ...STORE-to-var-lib-openstack-dashboard.patch | 22 + rpm/SOURCES/rh-logo.png | Bin 0 -> 60337 bytes rpm/SOURCES/rhfavicon.ico | Bin 0 -> 446 bytes rpm/SPECS/python-django-horizon.spec | 219 ++- 13 files changed, 1971 insertions(+), 85 deletions(-) create mode 100644 rpm/SOURCES/0004-Add-a-customization-module-based-on-RHOS.patch create mode 100644 rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch create mode 100644 rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch create mode 100644 rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch create mode 100644 rpm/SOURCES/0008-fix-up-issues-with-customization.patch create mode 100644 rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch create mode 100644 rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch create mode 100644 rpm/SOURCES/rh-logo.png create mode 100644 rpm/SOURCES/rhfavicon.ico diff --git a/rpm/SOURCES/0001-Don-t-access-the-net-while-building-docs.patch b/rpm/SOURCES/0001-Don-t-access-the-net-while-building-docs.patch index c94b521..2a53c0f 100644 --- a/rpm/SOURCES/0001-Don-t-access-the-net-while-building-docs.patch +++ b/rpm/SOURCES/0001-Don-t-access-the-net-while-building-docs.patch @@ -1,4 +1,4 @@ -From ba1ba0020a81ca144e705a51c9f6b5dace0f30bf Mon Sep 17 00:00:00 2001 +From 7e42671c5b9c190191ba5044b63e750824742ffa Mon Sep 17 00:00:00 2001 From: Matthias Runge Date: Fri, 5 Apr 2013 10:16:19 +0200 Subject: [PATCH] Don't access the net while building docs (Note this hasn't @@ -9,7 +9,7 @@ Subject: [PATCH] Don't access the net while building docs (Note this hasn't 1 file changed, 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py -index 297a688..adb3d14 100644 +index 2c84fb3..30e4b6d 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -141,7 +141,6 @@ write_autodoc_index() diff --git a/rpm/SOURCES/0002-disable-debug-move-web-root.patch b/rpm/SOURCES/0002-disable-debug-move-web-root.patch index 9d7a8b1..9e3b8c6 100644 --- a/rpm/SOURCES/0002-disable-debug-move-web-root.patch +++ b/rpm/SOURCES/0002-disable-debug-move-web-root.patch @@ -1,15 +1,15 @@ -From 49d587ea6b374f10e7150b2d1043cf525664ca49 Mon Sep 17 00:00:00 2001 +From 9627a3e4df39cf243e889599298e70bfa48bd4fe Mon Sep 17 00:00:00 2001 From: Matthias Runge Date: Fri, 5 Apr 2013 10:07:53 +0200 Subject: [PATCH] disable debug, move web root --- - openstack_dashboard/local/local_settings.py.example | 4 ++-- - openstack_dashboard/settings.py | 12 +++++++----- - 2 files changed, 9 insertions(+), 7 deletions(-) + openstack_dashboard/local/local_settings.py.example | 8 ++++++-- + openstack_dashboard/settings.py | 10 ++++++---- + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example -index 8ee9495..b743d0e 100644 +index 6e426c9..d2db3cd 100644 --- a/openstack_dashboard/local/local_settings.py.example +++ b/openstack_dashboard/local/local_settings.py.example @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ @@ -21,17 +21,21 @@ index 8ee9495..b743d0e 100644 TEMPLATE_DEBUG = DEBUG # Required for Django 1.5. -@@ -150,7 +150,7 @@ OPENSTACK_KEYSTONE_BACKEND = { +@@ -150,7 +150,11 @@ OPENSTACK_KEYSTONE_BACKEND = { } OPENSTACK_HYPERVISOR_FEATURES = { - 'can_set_mount_point': True, + 'can_set_mount_point': False, ++ ++ # NOTE: as of Grizzly this is not yet supported in Nova so enabling this ++ # setting will not do anything useful ++ 'can_encrypt_volumes': False } # The OPENSTACK_NEUTRON_NETWORK settings can be used to enable optional diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py -index 254f0ce..cae6247 100644 +index 852a895..84da859 100644 --- a/openstack_dashboard/settings.py +++ b/openstack_dashboard/settings.py @@ -31,7 +31,7 @@ warnings.formatwarning = lambda message, category, *args, **kwargs: \ @@ -43,7 +47,7 @@ index 254f0ce..cae6247 100644 if ROOT_PATH not in sys.path: sys.path.append(ROOT_PATH) -@@ -39,12 +39,13 @@ TEMPLATE_DEBUG = DEBUG +@@ -41,12 +41,13 @@ TEMPLATE_DEBUG = DEBUG SITE_BRANDING = 'OpenStack Dashboard' @@ -60,16 +64,7 @@ index 254f0ce..cae6247 100644 MEDIA_ROOT = os.path.abspath(os.path.join(ROOT_PATH, '..', 'media')) MEDIA_URL = '/media/' -@@ -132,6 +132,8 @@ STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - ) - -+less_binary = os.path.join(BIN_DIR, 'lessc') -+ - COMPRESS_PRECOMPILERS = ( - ('text/less', ('lesscpy {infile}')), - ) -@@ -125,6 +126,7 @@ COMPRESS_ENABLED = True +@@ -144,6 +145,7 @@ COMPRESS_ENABLED = True COMPRESS_OUTPUT_DIR = 'dashboard' COMPRESS_CSS_HASHING_METHOD = 'hash' COMPRESS_PARSER = 'compressor.parser.HtmlParser' diff --git a/rpm/SOURCES/0003-change-lockfile-location-to-tmp-and-also-add-localho.patch b/rpm/SOURCES/0003-change-lockfile-location-to-tmp-and-also-add-localho.patch index eaf0186..a1ba7ad 100644 --- a/rpm/SOURCES/0003-change-lockfile-location-to-tmp-and-also-add-localho.patch +++ b/rpm/SOURCES/0003-change-lockfile-location-to-tmp-and-also-add-localho.patch @@ -1,4 +1,4 @@ -From fcf8b00597925b908f565bd27b29b440f41b3e78 Mon Sep 17 00:00:00 2001 +From ff59c0877d17ae0f64e83cd4af930df56182299e Mon Sep 17 00:00:00 2001 From: Matthias Runge Date: Thu, 25 Jul 2013 11:32:38 +0200 Subject: [PATCH] change lockfile location to '/tmp' and also add localhost to @@ -9,7 +9,7 @@ Subject: [PATCH] change lockfile location to '/tmp' and also add localhost to 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example -index 3f5da3d..52f1656 100644 +index d2db3cd..d386d46 100644 --- a/openstack_dashboard/local/local_settings.py.example +++ b/openstack_dashboard/local/local_settings.py.example @@ -12,7 +12,7 @@ TEMPLATE_DEBUG = DEBUG diff --git a/rpm/SOURCES/0004-Add-a-customization-module-based-on-RHOS.patch b/rpm/SOURCES/0004-Add-a-customization-module-based-on-RHOS.patch new file mode 100644 index 0000000..2a6daee --- /dev/null +++ b/rpm/SOURCES/0004-Add-a-customization-module-based-on-RHOS.patch @@ -0,0 +1,260 @@ +From 2b983d9b083c2ae9f09a535f64617ec3a3b02cfb Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Thu, 14 Feb 2013 12:55:54 +0100 +Subject: [PATCH] Add a customization module based on RHOS + +Change-Id: I8622ffc8e31cf553315077070b2a696de1bd5081 + +Conflicts: + openstack_dashboard/settings.py +--- + openstack_dashboard/settings.py | 12 ++++- + openstack_dashboard_theme/__init__.py | 0 + openstack_dashboard_theme/models.py | 0 + .../static/dashboard/less/rhtheme.less | 55 ++++++++++++++++++++++ + .../templates/_stylesheets.html | 7 +++ + .../templates/auth/_login.html | 29 ++++++++++++ + .../templates/auth/login.html | 10 ++++ + .../templates/horizon/common/_sidebar.html | 35 ++++++++++++++ + openstack_dashboard_theme/templates/splash.html | 17 +++++++ + 9 files changed, 163 insertions(+), 2 deletions(-) + create mode 100644 openstack_dashboard_theme/__init__.py + create mode 100644 openstack_dashboard_theme/models.py + create mode 100644 openstack_dashboard_theme/static/dashboard/less/rhtheme.less + create mode 100644 openstack_dashboard_theme/templates/_stylesheets.html + create mode 100644 openstack_dashboard_theme/templates/auth/_login.html + create mode 100644 openstack_dashboard_theme/templates/auth/login.html + create mode 100644 openstack_dashboard_theme/templates/horizon/common/_sidebar.html + create mode 100644 openstack_dashboard_theme/templates/splash.html + +diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py +index 84da859..cc40815 100644 +--- a/openstack_dashboard/settings.py ++++ b/openstack_dashboard/settings.py +@@ -119,14 +119,13 @@ TEMPLATE_CONTEXT_PROCESSORS = ( + ) + + TEMPLATE_LOADERS = ( +- 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + 'horizon.loaders.TemplateLoader' + ) + + TEMPLATE_DIRS = ( + os.path.join(ROOT_PATH, 'templates'), +-) ++) + + STATICFILES_FINDERS = ( + 'compressor.finders.CompressorFinder', +@@ -164,6 +163,15 @@ INSTALLED_APPS = ( + 'openstack_dashboard.dashboards.router', + ) + ++THEME_APP = 'openstack_dashboard_theme' ++ ++try: ++ __import__(THEME_APP) ++ INSTALLED_APPS = (THEME_APP,) + INSTALLED_APPS ++except: ++ pass ++ ++ + TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' + AUTHENTICATION_BACKENDS = ('openstack_auth.backend.KeystoneBackend',) + MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage' +diff --git a/openstack_dashboard_theme/__init__.py b/openstack_dashboard_theme/__init__.py +new file mode 100644 +index 0000000..e69de29 +diff --git a/openstack_dashboard_theme/models.py b/openstack_dashboard_theme/models.py +new file mode 100644 +index 0000000..e69de29 +diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +new file mode 100644 +index 0000000..5350db3 +--- /dev/null ++++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +@@ -0,0 +1,55 @@ ++@import "/static/dashboard/less/horizon.less"; ++ ++/* Login Splash Page */ ++ ++#splash .rhlogin { ++ background: #fff url(/static/dashboard/img/rh-logo.png) no-repeat center 35px; ++ position: absolute; ++ top: 80px; ++ left: 50%; ++ margin: 0 0 0 -195px; ++ padding-top: 170px; ++ width: 390px; ++ border: 1px solid #e1e1e1; ++ max-height: none; ++ -webkit-border-radius: 6px; ++ -moz-border-radius: 6px; ++ border-radius: 6px; ++ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); ++ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); ++ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); ++ -webkit-background-clip: padding-box; ++ -moz-background-clip: padding-box; ++ background-clip: padding-box; ++ ++ form { ++ .error { ++ width: 100%; ++ } ++ input { ++ width: 350px; ++ } ++ select { ++ width: 360px; ++ } ++ } ++} ++ ++h1.rhos { ++ width: 100%; ++ margin: 0; ++ background-color: #f5f5f5; ++ padding-bottom: 40px; ++} ++ ++h1.rhos a { ++ background: url(/static/dashboard/img/rh-logo.png) top left no-repeat; ++ display: block; ++ float: left; ++ width: 116px; ++ height: 123px; ++ text-indent: -9999px; ++ margin-left: 56px; ++ margin-top: 15px; ++ margin-bottom: 25px; ++} +diff --git a/openstack_dashboard_theme/templates/_stylesheets.html b/openstack_dashboard_theme/templates/_stylesheets.html +new file mode 100644 +index 0000000..88463e1 +--- /dev/null ++++ b/openstack_dashboard_theme/templates/_stylesheets.html +@@ -0,0 +1,7 @@ ++{% load compress %} ++ ++{% compress css %} ++ ++{% endcompress %} ++ ++ +diff --git a/openstack_dashboard_theme/templates/auth/_login.html b/openstack_dashboard_theme/templates/auth/_login.html +new file mode 100644 +index 0000000..1cb6036 +--- /dev/null ++++ b/openstack_dashboard_theme/templates/auth/_login.html +@@ -0,0 +1,29 @@ ++{% extends "horizon/common/_modal_form.html" %} ++{% load i18n %} ++{% load url from future %} ++ ++{% block modal-header %}{% trans "Log In" %}{% endblock %} ++{% block modal_class %}rhlogin{% if hide %}modal hide{% endif %}{% endblock %} ++ ++{% block form_action %}{% url 'login' %}{% endblock %} ++{% block autocomplete %}{{ HORIZON_CONFIG.password_autocomplete }}{% endblock %} ++ ++{% block modal-body %} ++
++ {% if request.user.is_authenticated and 'next' in request.GET %} ++
++

{% trans "You don't have permissions to access:" %}

++

{{ request.GET.next }}

++

{% trans "Login as different user or go back to" %} ++ {% trans "home page" %}

++
++
++ {% endif %} ++ {% if next %}{% endif %} ++ {% include "horizon/common/_form_fields.html" %} ++
++{% endblock %} ++ ++{% block modal-footer %} ++ ++{% endblock %} +diff --git a/openstack_dashboard_theme/templates/auth/login.html b/openstack_dashboard_theme/templates/auth/login.html +new file mode 100644 +index 0000000..6fa7746 +--- /dev/null ++++ b/openstack_dashboard_theme/templates/auth/login.html +@@ -0,0 +1,10 @@ ++{% extends "base.html" %} ++{% load i18n %} ++ ++{% block title %}{% trans "Login" %}{% endblock %} ++ ++{% block body_id %}splash{% endblock %} ++ ++{% block content %} ++ {% include 'auth/_login.html' %} ++{% endblock %} +diff --git a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html +new file mode 100644 +index 0000000..5672846 +--- /dev/null ++++ b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html +@@ -0,0 +1,35 @@ ++{% load branding horizon i18n %} ++ ++ +diff --git a/openstack_dashboard_theme/templates/splash.html b/openstack_dashboard_theme/templates/splash.html +new file mode 100644 +index 0000000..4a5cfe1 +--- /dev/null ++++ b/openstack_dashboard_theme/templates/splash.html +@@ -0,0 +1,17 @@ ++{% load i18n branding %} ++ ++ ++ ++ ++ ++ {% trans "Login" %} - {% site_branding %} ++ {% include "_stylesheets.html" %} ++ ++ ++
++
++ {% include 'auth/_login.html' %} ++
++
++ ++ diff --git a/rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch b/rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch new file mode 100644 index 0000000..d25054e --- /dev/null +++ b/rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch @@ -0,0 +1,1348 @@ +From 9058dd457bf4ce116848c48cc9fdcd0319e77e84 Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Mon, 9 Sep 2013 13:51:19 +0200 +Subject: [PATCH] Revert "Use oslo.sphinx and remove local copy of doc theme" + +This reverts commit b6f7d8318bf909cc9989809127fc108e405fa400. +--- + doc/source/_static/.gitignore | 0 + doc/source/_static/basic.css | 416 +++++++++++++++++++++++++++++++++++++ + doc/source/_static/default.css | 230 ++++++++++++++++++++ + doc/source/_static/jquery.tweet.js | 154 ++++++++++++++ + doc/source/_static/nature.css | 245 ++++++++++++++++++++++ + doc/source/_static/tweaks.css | 95 +++++++++ + doc/source/_templates/.placeholder | 0 + doc/source/_theme/layout.html | 83 ++++++++ + doc/source/_theme/theme.conf | 4 + + doc/source/conf.py | 13 +- + test-requirements.txt | 1 - + 11 files changed, 1234 insertions(+), 7 deletions(-) + create mode 100644 doc/source/_static/.gitignore + create mode 100644 doc/source/_static/basic.css + create mode 100644 doc/source/_static/default.css + create mode 100644 doc/source/_static/jquery.tweet.js + create mode 100644 doc/source/_static/nature.css + create mode 100644 doc/source/_static/tweaks.css + create mode 100644 doc/source/_templates/.placeholder + create mode 100644 doc/source/_theme/layout.html + create mode 100644 doc/source/_theme/theme.conf + +diff --git a/doc/source/_static/.gitignore b/doc/source/_static/.gitignore +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_static/basic.css b/doc/source/_static/basic.css +new file mode 100644 +index 0000000..d909ce3 +--- /dev/null ++++ b/doc/source/_static/basic.css +@@ -0,0 +1,416 @@ ++/** ++ * Sphinx stylesheet -- basic theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++/* -- main layout ----------------------------------------------------------- */ ++ ++div.clearer { ++ clear: both; ++} ++ ++/* -- relbar ---------------------------------------------------------------- */ ++ ++div.related { ++ width: 100%; ++ font-size: 90%; ++} ++ ++div.related h3 { ++ display: none; ++} ++ ++div.related ul { ++ margin: 0; ++ padding: 0 0 0 10px; ++ list-style: none; ++} ++ ++div.related li { ++ display: inline; ++} ++ ++div.related li.right { ++ float: right; ++ margin-right: 5px; ++} ++ ++/* -- sidebar --------------------------------------------------------------- */ ++ ++div.sphinxsidebarwrapper { ++ padding: 10px 5px 0 10px; ++} ++ ++div.sphinxsidebar { ++ float: left; ++ width: 230px; ++ margin-left: -100%; ++ font-size: 90%; ++} ++ ++div.sphinxsidebar ul { ++ list-style: none; ++} ++ ++div.sphinxsidebar ul ul, ++div.sphinxsidebar ul.want-points { ++ margin-left: 20px; ++ list-style: square; ++} ++ ++div.sphinxsidebar ul ul { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++div.sphinxsidebar form { ++ margin-top: 10px; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++img { ++ border: 0; ++} ++ ++/* -- search page ----------------------------------------------------------- */ ++ ++ul.search { ++ margin: 10px 0 0 20px; ++ padding: 0; ++} ++ ++ul.search li { ++ padding: 5px 0 5px 20px; ++ background-image: url(file.png); ++ background-repeat: no-repeat; ++ background-position: 0 7px; ++} ++ ++ul.search li a { ++ font-weight: bold; ++} ++ ++ul.search li div.context { ++ color: #888; ++ margin: 2px 0 0 30px; ++ text-align: left; ++} ++ ++ul.keywordmatches li.goodmatch a { ++ font-weight: bold; ++} ++ ++/* -- index page ------------------------------------------------------------ */ ++ ++table.contentstable { ++ width: 90%; ++} ++ ++table.contentstable p.biglink { ++ line-height: 150%; ++} ++ ++a.biglink { ++ font-size: 1.3em; ++} ++ ++span.linkdescr { ++ font-style: italic; ++ padding-top: 5px; ++ font-size: 90%; ++} ++ ++/* -- general index --------------------------------------------------------- */ ++ ++table.indextable td { ++ text-align: left; ++ vertical-align: top; ++} ++ ++table.indextable dl, table.indextable dd { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++table.indextable tr.pcap { ++ height: 10px; ++} ++ ++table.indextable tr.cap { ++ margin-top: 10px; ++ background-color: #f2f2f2; ++} ++ ++img.toggler { ++ margin-right: 3px; ++ margin-top: 3px; ++ cursor: pointer; ++} ++ ++/* -- general body styles --------------------------------------------------- */ ++ ++a.headerlink { ++ visibility: hidden; ++} ++ ++h1:hover > a.headerlink, ++h2:hover > a.headerlink, ++h3:hover > a.headerlink, ++h4:hover > a.headerlink, ++h5:hover > a.headerlink, ++h6:hover > a.headerlink, ++dt:hover > a.headerlink { ++ visibility: visible; ++} ++ ++div.body p.caption { ++ text-align: inherit; ++} ++ ++div.body td { ++ text-align: left; ++} ++ ++.field-list ul { ++ padding-left: 1em; ++} ++ ++.first { ++} ++ ++p.rubric { ++ margin-top: 30px; ++ font-weight: bold; ++} ++ ++/* -- sidebars -------------------------------------------------------------- */ ++ ++div.sidebar { ++ margin: 0 0 0.5em 1em; ++ border: 1px solid #ddb; ++ padding: 7px 7px 0 7px; ++ background-color: #ffe; ++ width: 40%; ++ float: right; ++} ++ ++p.sidebar-title { ++ font-weight: bold; ++} ++ ++/* -- topics ---------------------------------------------------------------- */ ++ ++div.topic { ++ border: 1px solid #ccc; ++ padding: 7px 7px 0 7px; ++ margin: 10px 0 10px 0; ++} ++ ++p.topic-title { ++ font-size: 1.1em; ++ font-weight: bold; ++ margin-top: 10px; ++} ++ ++/* -- admonitions ----------------------------------------------------------- */ ++ ++div.admonition { ++ margin-top: 10px; ++ margin-bottom: 10px; ++ padding: 7px; ++} ++ ++div.admonition dt { ++ font-weight: bold; ++} ++ ++div.admonition dl { ++ margin-bottom: 0; ++} ++ ++p.admonition-title { ++ margin: 0px 10px 5px 0px; ++ font-weight: bold; ++} ++ ++div.body p.centered { ++ text-align: center; ++ margin-top: 25px; ++} ++ ++/* -- tables ---------------------------------------------------------------- */ ++ ++table.docutils { ++ border: 0; ++ border-collapse: collapse; ++} ++ ++table.docutils td, table.docutils th { ++ padding: 1px 8px 1px 0; ++ border-top: 0; ++ border-left: 0; ++ border-right: 0; ++ border-bottom: 1px solid #aaa; ++} ++ ++table.field-list td, table.field-list th { ++ border: 0 !important; ++} ++ ++table.footnote td, table.footnote th { ++ border: 0 !important; ++} ++ ++th { ++ text-align: left; ++ padding-right: 5px; ++} ++ ++/* -- other body styles ----------------------------------------------------- */ ++ ++dl { ++ margin-bottom: 15px; ++} ++ ++dd p { ++ margin-top: 0px; ++} ++ ++dd ul, dd table { ++ margin-bottom: 10px; ++} ++ ++dd { ++ margin-top: 3px; ++ margin-bottom: 10px; ++ margin-left: 30px; ++} ++ ++dt:target, .highlight { ++ background-color: #fbe54e; ++} ++ ++dl.glossary dt { ++ font-weight: bold; ++ font-size: 1.1em; ++} ++ ++.field-list ul { ++ margin: 0; ++ padding-left: 1em; ++} ++ ++.field-list p { ++ margin: 0; ++} ++ ++.refcount { ++ color: #060; ++} ++ ++.optional { ++ font-size: 1.3em; ++} ++ ++.versionmodified { ++ font-style: italic; ++} ++ ++.system-message { ++ background-color: #fda; ++ padding: 5px; ++ border: 3px solid red; ++} ++ ++.footnote:target { ++ background-color: #ffa ++} ++ ++.line-block { ++ display: block; ++ margin-top: 1em; ++ margin-bottom: 1em; ++} ++ ++.line-block .line-block { ++ margin-top: 0; ++ margin-bottom: 0; ++ margin-left: 1.5em; ++} ++ ++/* -- code displays --------------------------------------------------------- */ ++ ++pre { ++ overflow: auto; ++} ++ ++td.linenos pre { ++ padding: 5px 0px; ++ border: 0; ++ background-color: transparent; ++ color: #aaa; ++} ++ ++table.highlighttable { ++ margin-left: 0.5em; ++} ++ ++table.highlighttable td { ++ padding: 0 0.5em 0 0.5em; ++} ++ ++tt.descname { ++ background-color: transparent; ++ font-weight: bold; ++ font-size: 1.2em; ++} ++ ++tt.descclassname { ++ background-color: transparent; ++} ++ ++tt.xref, a tt { ++ background-color: transparent; ++ font-weight: bold; ++} ++ ++h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { ++ background-color: transparent; ++} ++ ++/* -- math display ---------------------------------------------------------- */ ++ ++img.math { ++ vertical-align: middle; ++} ++ ++div.body div.math p { ++ text-align: center; ++} ++ ++span.eqno { ++ float: right; ++} ++ ++/* -- printout stylesheet --------------------------------------------------- */ ++ ++@media print { ++ div.document, ++ div.documentwrapper, ++ div.bodywrapper { ++ margin: 0 !important; ++ width: 100%; ++ } ++ ++ div.sphinxsidebar, ++ div.related, ++ div.footer, ++ #top-link { ++ display: none; ++ } ++} +diff --git a/doc/source/_static/default.css b/doc/source/_static/default.css +new file mode 100644 +index 0000000..c8091ec +--- /dev/null ++++ b/doc/source/_static/default.css +@@ -0,0 +1,230 @@ ++/** ++ * Sphinx stylesheet -- default theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++@import url("basic.css"); ++ ++/* -- page layout ----------------------------------------------------------- */ ++ ++body { ++ font-family: sans-serif; ++ font-size: 100%; ++ background-color: #11303d; ++ color: #000; ++ margin: 0; ++ padding: 0; ++} ++ ++div.document { ++ background-color: #1c4e63; ++} ++ ++div.documentwrapper { ++ float: left; ++ width: 100%; ++} ++ ++div.bodywrapper { ++ margin: 0 0 0 230px; ++} ++ ++div.body { ++ background-color: #ffffff; ++ color: #000000; ++ padding: 0 20px 30px 20px; ++} ++ ++div.footer { ++ color: #ffffff; ++ width: 100%; ++ padding: 9px 0 9px 0; ++ text-align: center; ++ font-size: 75%; ++} ++ ++div.footer a { ++ color: #ffffff; ++ text-decoration: underline; ++} ++ ++div.related { ++ background-color: #133f52; ++ line-height: 30px; ++ color: #ffffff; ++} ++ ++div.related a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar { ++} ++ ++div.sphinxsidebar h3 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.4em; ++ font-weight: normal; ++ margin: 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar h3 a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar h4 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.3em; ++ font-weight: normal; ++ margin: 5px 0 0 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar p { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar p.topless { ++ margin: 5px 10px 10px 10px; ++} ++ ++div.sphinxsidebar ul { ++ margin: 10px; ++ padding: 0; ++ color: #ffffff; ++} ++ ++div.sphinxsidebar a { ++ color: #98dbcc; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++/* -- body styles ----------------------------------------------------------- */ ++ ++a { ++ color: #355f7c; ++ text-decoration: none; ++} ++ ++a:hover { ++ text-decoration: underline; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.body h1, ++div.body h2, ++div.body h3, ++div.body h4, ++div.body h5, ++div.body h6 { ++ font-family: 'Trebuchet MS', sans-serif; ++ background-color: #f2f2f2; ++ font-weight: normal; ++ color: #20435c; ++ border-bottom: 1px solid #ccc; ++ margin: 20px -20px 10px -20px; ++ padding: 3px 0 3px 10px; ++} ++ ++div.body h1 { margin-top: 0; font-size: 200%; } ++div.body h2 { font-size: 160%; } ++div.body h3 { font-size: 140%; } ++div.body h4 { font-size: 120%; } ++div.body h5 { font-size: 110%; } ++div.body h6 { font-size: 100%; } ++ ++a.headerlink { ++ color: #c60f0f; ++ font-size: 0.8em; ++ padding: 0 4px 0 4px; ++ text-decoration: none; ++} ++ ++a.headerlink:hover { ++ background-color: #c60f0f; ++ color: white; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.admonition p.admonition-title + p { ++ display: inline; ++} ++ ++div.admonition p { ++ margin-bottom: 5px; ++} ++ ++div.admonition pre { ++ margin-bottom: 5px; ++} ++ ++div.admonition ul, div.admonition ol { ++ margin-bottom: 5px; ++} ++ ++div.note { ++ background-color: #eee; ++ border: 1px solid #ccc; ++} ++ ++div.seealso { ++ background-color: #ffc; ++ border: 1px solid #ff6; ++} ++ ++div.topic { ++ background-color: #eee; ++} ++ ++div.warning { ++ background-color: #ffe4e4; ++ border: 1px solid #f66; ++} ++ ++p.admonition-title { ++ display: inline; ++} ++ ++p.admonition-title:after { ++ content: ":"; ++} ++ ++pre { ++ padding: 5px; ++ background-color: #eeffcc; ++ color: #333333; ++ line-height: 120%; ++ border: 1px solid #ac9; ++ border-left: none; ++ border-right: none; ++} ++ ++tt { ++ background-color: #ecf0f3; ++ padding: 0 1px 0 1px; ++ font-size: 0.95em; ++} ++ ++.warning tt { ++ background: #efc2c2; ++} ++ ++.note tt { ++ background: #d6d6d6; ++} +diff --git a/doc/source/_static/jquery.tweet.js b/doc/source/_static/jquery.tweet.js +new file mode 100644 +index 0000000..79bf0bd +--- /dev/null ++++ b/doc/source/_static/jquery.tweet.js +@@ -0,0 +1,154 @@ ++(function($) { ++ ++ $.fn.tweet = function(o){ ++ var s = { ++ username: ["seaofclouds"], // [string] required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"] ++ list: null, //[string] optional name of list belonging to username ++ avatar_size: null, // [integer] height and width of avatar if displayed (48px max) ++ count: 3, // [integer] how many tweets to display? ++ intro_text: null, // [string] do you want text BEFORE your your tweets? ++ outro_text: null, // [string] do you want text AFTER your tweets? ++ join_text: null, // [string] optional text in between date and tweet, try setting to "auto" ++ auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks ++ auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed ++ auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing ++ auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" ++ auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... ++ loading_text: null, // [string] optional loading text, displayed while tweets load ++ query: null // [string] optional search query ++ }; ++ ++ if(o) $.extend(s, o); ++ ++ $.fn.extend({ ++ linkUrl: function() { ++ var returning = []; ++ var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"$1")); ++ }); ++ return $(returning); ++ }, ++ linkUser: function() { ++ var returning = []; ++ var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"@$1")); ++ }); ++ return $(returning); ++ }, ++ linkHash: function() { ++ var returning = []; ++ var regexp = / [\#]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp, ' #$1')); ++ }); ++ return $(returning); ++ }, ++ capAwesome: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(awesome)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ capEpic: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(epic)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ makeHeart: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/(<)+[3]/gi, "")); ++ }); ++ return $(returning); ++ } ++ }); ++ ++ function relative_time(time_value) { ++ var parsed_date = Date.parse(time_value); ++ var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); ++ var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); ++ var pluralize = function (singular, n) { ++ return '' + n + ' ' + singular + (n == 1 ? '' : 's'); ++ }; ++ if(delta < 60) { ++ return 'less than a minute ago'; ++ } else if(delta < (45*60)) { ++ return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; ++ } else if(delta < (24*60*60)) { ++ return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; ++ } else { ++ return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; ++ } ++ } ++ ++ function build_url() { ++ var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); ++ if (s.list) { ++ return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; ++ } else if (s.query == null && s.username.length == 1) { ++ return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?'; ++ } else { ++ var query = (s.query || 'from:'+s.username.join('%20OR%20from:')); ++ return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?'; ++ } ++ } ++ ++ return this.each(function(){ ++ var list = $('
    ').appendTo(this); ++ var intro = '

    '+s.intro_text+'

    '; ++ var outro = '

    '+s.outro_text+'

    '; ++ var loading = $('

    '+s.loading_text+'

    '); ++ ++ if(typeof(s.username) == "string"){ ++ s.username = [s.username]; ++ } ++ ++ if (s.loading_text) $(this).append(loading); ++ $.getJSON(build_url(), function(data){ ++ if (s.loading_text) loading.remove(); ++ if (s.intro_text) list.before(intro); ++ $.each((data.results || data), function(i,item){ ++ // auto join text based on verb tense and content ++ if (s.join_text == "auto") { ++ if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { ++ var join_text = s.auto_join_text_reply; ++ } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) { ++ var join_text = s.auto_join_text_url; ++ } else if (item.text.match(/^((\w+ed)|just) .*/im)) { ++ var join_text = s.auto_join_text_ed; ++ } else if (item.text.match(/^(\w*ing) .*/i)) { ++ var join_text = s.auto_join_text_ing; ++ } else { ++ var join_text = s.auto_join_text_default; ++ } ++ } else { ++ var join_text = s.join_text; ++ }; ++ ++ var from_user = item.from_user || item.user.screen_name; ++ var profile_image_url = item.profile_image_url || item.user.profile_image_url; ++ var join_template = ' '+join_text+' '; ++ var join = ((s.join_text) ? join_template : ' '); ++ var avatar_template = ''+from_user+'\'s avatar'; ++ var avatar = (s.avatar_size ? avatar_template : ''); ++ var date = ''+relative_time(item.created_at)+''; ++ var text = '' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ ''; ++ ++ // until we create a template option, arrange the items below to alter a tweet's display. ++ list.append('
  • ' + avatar + date + join + text + '
  • '); ++ ++ list.children('li:first').addClass('tweet_first'); ++ list.children('li:odd').addClass('tweet_even'); ++ list.children('li:even').addClass('tweet_odd'); ++ }); ++ if (s.outro_text) list.after(outro); ++ }); ++ ++ }); ++ }; ++})(jQuery); +\ No newline at end of file +diff --git a/doc/source/_static/nature.css b/doc/source/_static/nature.css +new file mode 100644 +index 0000000..a98bd42 +--- /dev/null ++++ b/doc/source/_static/nature.css +@@ -0,0 +1,245 @@ ++/* ++ * nature.css_t ++ * ~~~~~~~~~~~~ ++ * ++ * Sphinx stylesheet -- nature theme. ++ * ++ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. ++ * :license: BSD, see LICENSE for details. ++ * ++ */ ++ ++@import url("basic.css"); ++ ++/* -- page layout ----------------------------------------------------------- */ ++ ++body { ++ font-family: Arial, sans-serif; ++ font-size: 100%; ++ background-color: #111; ++ color: #555; ++ margin: 0; ++ padding: 0; ++} ++ ++div.documentwrapper { ++ float: left; ++ width: 100%; ++} ++ ++div.bodywrapper { ++ margin: 0 0 0 {{ theme_sidebarwidth|toint }}px; ++} ++ ++hr { ++ border: 1px solid #B1B4B6; ++} ++ ++div.document { ++ background-color: #eee; ++} ++ ++div.body { ++ background-color: #ffffff; ++ color: #3E4349; ++ padding: 0 30px 30px 30px; ++ font-size: 0.9em; ++} ++ ++div.footer { ++ color: #555; ++ width: 100%; ++ padding: 13px 0; ++ text-align: center; ++ font-size: 75%; ++} ++ ++div.footer a { ++ color: #444; ++ text-decoration: underline; ++} ++ ++div.related { ++ background-color: #6BA81E; ++ line-height: 32px; ++ color: #fff; ++ text-shadow: 0px 1px 0 #444; ++ font-size: 0.9em; ++} ++ ++div.related a { ++ color: #E2F3CC; ++} ++ ++div.sphinxsidebar { ++ font-size: 0.75em; ++ line-height: 1.5em; ++} ++ ++div.sphinxsidebarwrapper{ ++ padding: 20px 0; ++} ++ ++div.sphinxsidebar h3, ++div.sphinxsidebar h4 { ++ font-family: Arial, sans-serif; ++ color: #222; ++ font-size: 1.2em; ++ font-weight: normal; ++ margin: 0; ++ padding: 5px 10px; ++ background-color: #ddd; ++ text-shadow: 1px 1px 0 white ++} ++ ++div.sphinxsidebar h4{ ++ font-size: 1.1em; ++} ++ ++div.sphinxsidebar h3 a { ++ color: #444; ++} ++ ++ ++div.sphinxsidebar p { ++ color: #888; ++ padding: 5px 20px; ++} ++ ++div.sphinxsidebar p.topless { ++} ++ ++div.sphinxsidebar ul { ++ margin: 10px 20px; ++ padding: 0; ++ color: #000; ++} ++ ++div.sphinxsidebar a { ++ color: #444; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #ccc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++div.sphinxsidebar input[type=text]{ ++ margin-left: 20px; ++} ++ ++/* -- body styles ----------------------------------------------------------- */ ++ ++a { ++ color: #005B81; ++ text-decoration: none; ++} ++ ++a:hover { ++ color: #E32E00; ++ text-decoration: underline; ++} ++ ++div.body h1, ++div.body h2, ++div.body h3, ++div.body h4, ++div.body h5, ++div.body h6 { ++ font-family: Arial, sans-serif; ++ background-color: #BED4EB; ++ font-weight: normal; ++ color: #212224; ++ margin: 30px 0px 10px 0px; ++ padding: 5px 0 5px 10px; ++ text-shadow: 0px 1px 0 white ++} ++ ++div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } ++div.body h2 { font-size: 150%; background-color: #C8D5E3; } ++div.body h3 { font-size: 120%; background-color: #D8DEE3; } ++div.body h4 { font-size: 110%; background-color: #D8DEE3; } ++div.body h5 { font-size: 100%; background-color: #D8DEE3; } ++div.body h6 { font-size: 100%; background-color: #D8DEE3; } ++ ++a.headerlink { ++ color: #c60f0f; ++ font-size: 0.8em; ++ padding: 0 4px 0 4px; ++ text-decoration: none; ++} ++ ++a.headerlink:hover { ++ background-color: #c60f0f; ++ color: white; ++} ++ ++div.body p, div.body dd, div.body li { ++ line-height: 1.5em; ++} ++ ++div.admonition p.admonition-title + p { ++ display: inline; ++} ++ ++div.highlight{ ++ background-color: white; ++} ++ ++div.note { ++ background-color: #eee; ++ border: 1px solid #ccc; ++} ++ ++div.seealso { ++ background-color: #ffc; ++ border: 1px solid #ff6; ++} ++ ++div.topic { ++ background-color: #eee; ++} ++ ++div.warning { ++ background-color: #ffe4e4; ++ border: 1px solid #f66; ++} ++ ++p.admonition-title { ++ display: inline; ++} ++ ++p.admonition-title:after { ++ content: ":"; ++} ++ ++pre { ++ padding: 10px; ++ background-color: White; ++ color: #222; ++ line-height: 1.2em; ++ border: 1px solid #C6C9CB; ++ font-size: 1.1em; ++ margin: 1.5em 0 1.5em 0; ++ -webkit-box-shadow: 1px 1px 1px #d8d8d8; ++ -moz-box-shadow: 1px 1px 1px #d8d8d8; ++} ++ ++tt { ++ background-color: #ecf0f3; ++ color: #222; ++ /* padding: 1px 2px; */ ++ font-size: 1.1em; ++ font-family: monospace; ++} ++ ++.viewcode-back { ++ font-family: Arial, sans-serif; ++} ++ ++div.viewcode-block:target { ++ background-color: #f4debf; ++ border-top: 1px solid #ac9; ++ border-bottom: 1px solid #ac9; ++} +diff --git a/doc/source/_static/tweaks.css b/doc/source/_static/tweaks.css +new file mode 100644 +index 0000000..9977c65 +--- /dev/null ++++ b/doc/source/_static/tweaks.css +@@ -0,0 +1,95 @@ ++body { ++ background: #fff url(../_static/header_bg.jpg) top left no-repeat; ++} ++ ++#header { ++ width: 950px; ++ margin: 0 auto; ++ height: 102px; ++} ++ ++#header h1#logo { ++ background: url(../_static/openstack_logo.png) top left no-repeat; ++ display: block; ++ float: left; ++ text-indent: -9999px; ++ width: 175px; ++ height: 55px; ++} ++ ++#navigation { ++ background: url(../_static/header-line.gif) repeat-x 0 bottom; ++ display: block; ++ float: left; ++ margin: 27px 0 0 25px; ++ padding: 0; ++} ++ ++#navigation li{ ++ float: left; ++ display: block; ++ margin-right: 25px; ++} ++ ++#navigation li a { ++ display: block; ++ font-weight: normal; ++ text-decoration: none; ++ background-position: 50% 0; ++ padding: 20px 0 5px; ++ color: #353535; ++ font-size: 14px; ++} ++ ++#navigation li a.current, #navigation li a.section { ++ border-bottom: 3px solid #cf2f19; ++ color: #cf2f19; ++} ++ ++div.related { ++ background-color: #cde2f8; ++ border: 1px solid #b0d3f8; ++} ++ ++div.related a { ++ color: #4078ba; ++ text-shadow: none; ++} ++ ++div.sphinxsidebarwrapper { ++ padding-top: 0; ++ overflow: hidden; ++} ++ ++pre { ++ color: #555; ++} ++ ++div.documentwrapper h1, div.documentwrapper h2, div.documentwrapper h3, div.documentwrapper h4, div.documentwrapper h5, div.documentwrapper h6 { ++ font-family: 'PT Sans', sans-serif !important; ++ color: #264D69; ++ border-bottom: 1px dotted #C5E2EA; ++ padding: 0; ++ background: none; ++ padding-bottom: 5px; ++} ++ ++div.documentwrapper h3 { ++ color: #CF2F19; ++} ++ ++a.headerlink { ++ color: #fff !important; ++ margin-left: 5px; ++ background: #CF2F19 !important; ++} ++ ++div.body { ++ margin-top: -25px; ++ margin-left: 230px; ++} ++ ++div.document { ++ width: 960px; ++ margin: 0 auto; ++} +diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html +new file mode 100644 +index 0000000..750b782 +--- /dev/null ++++ b/doc/source/_theme/layout.html +@@ -0,0 +1,83 @@ ++{% extends "basic/layout.html" %} ++{% set css_files = css_files + ['_static/tweaks.css'] %} ++{% set script_files = script_files + ['_static/jquery.tweet.js'] %} ++ ++{%- macro sidebar() %} ++ {%- if not embedded %}{% if not theme_nosidebar|tobool %} ++
    ++
    ++ {%- block sidebarlogo %} ++ {%- if logo %} ++ ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebartoc %} ++ {%- if display_toc %} ++

    {{ _('Table Of Contents') }}

    ++ {{ toc }} ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarrel %} ++ {%- if prev %} ++

    {{ _('Previous topic') }}

    ++

    {{ prev.title }}

    ++ {%- endif %} ++ {%- if next %} ++

    {{ _('Next topic') }}

    ++

    {{ next.title }}

    ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarsourcelink %} ++ {%- if show_source and has_source and sourcename %} ++

    {{ _('This Page') }}

    ++ ++ {%- endif %} ++ {%- endblock %} ++ {%- if customsidebar %} ++ {% include customsidebar %} ++ {%- endif %} ++ {%- block sidebarsearch %} ++ {%- if pagename != "search" %} ++ ++ ++ {%- endif %} ++ {%- endblock %} ++
    ++
    ++ {%- endif %}{% endif %} ++{%- endmacro %} ++ ++{% block relbar1 %}{% endblock relbar1 %} ++ ++{% block header %} ++ ++{% endblock %} +\ No newline at end of file +diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf +new file mode 100644 +index 0000000..1cc4004 +--- /dev/null ++++ b/doc/source/_theme/theme.conf +@@ -0,0 +1,4 @@ ++[theme] ++inherit = basic ++stylesheet = nature.css ++pygments_style = tango +diff --git a/doc/source/conf.py b/doc/source/conf.py +index 30e4b6d..ec9e63f 100644 +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -144,12 +144,13 @@ extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.todo', + 'sphinx.ext.coverage', + 'sphinx.ext.pngmath', +- 'sphinx.ext.viewcode', +- 'oslo.sphinx', +- ] ++ 'sphinx.ext.viewcode'] + + # Add any paths that contain templates here, relative to this directory. +-templates_path = ['_templates'] ++if os.getenv('HUDSON_PUBLISH_DOCS'): ++ templates_path = ['_ga', '_templates'] ++else: ++ templates_path = ['_templates'] + + # The suffix of source filenames. + source_suffix = '.rst' +@@ -216,8 +217,8 @@ nitpicky = False + + # 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' ++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 +diff --git a/test-requirements.txt b/test-requirements.txt +index 6f771b2..3ddb8a0 100644 +--- a/test-requirements.txt ++++ b/test-requirements.txt +@@ -14,4 +14,3 @@ selenium + sphinx>=1.1.2 + # for bug 1091333, remove after sphinx >1.1.3 is released. + docutils==0.9.1 +-oslo.sphinx diff --git a/rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch b/rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch new file mode 100644 index 0000000..1dbf37b --- /dev/null +++ b/rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch @@ -0,0 +1,32 @@ +From 78e5ed6e2be464922850f68ec4c371428c9c56d7 Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Mon, 9 Sep 2013 14:13:07 +0200 +Subject: [PATCH] move RBAC policy files and checks to /etc/openstack-dashboard + +--- + openstack_dashboard/local/local_settings.py.example | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example +index d386d46..afa95f1 100644 +--- a/openstack_dashboard/local/local_settings.py.example ++++ b/openstack_dashboard/local/local_settings.py.example +@@ -228,12 +228,13 @@ TIME_ZONE = "UTC" + # target installation. + + # Path to directory containing policy.json files +-#POLICY_FILES_PATH = os.path.join(ROOT_PATH, "conf") ++# POLICY_FILES_PATH = os.path.join(ROOT_PATH, "conf") ++POLICY_FILES_PATH = '/etc/openstack-dashboard' + # Map of local copy of service policy files +-#POLICY_FILES = { +-# 'identity': 'keystone_policy.json', +-# 'compute': 'nova_policy.json' +-#} ++POLICY_FILES = { ++ 'identity': 'keystone_policy.json', ++ 'compute': 'nova_policy.json' ++} + + # Trove user and database extension support. By default support for + # creating users and databases on database instances is turned on. diff --git a/rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch b/rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch new file mode 100644 index 0000000..2419386 --- /dev/null +++ b/rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch @@ -0,0 +1,29 @@ +From 09539805488bcb346dbd43770f4d0d9edf39c800 Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Mon, 9 Sep 2013 20:52:51 +0200 +Subject: [PATCH] move SECRET_KEY secret_key_store to /tmp + +--- + openstack_dashboard/local/local_settings.py.example | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example +index afa95f1..d120dfc 100644 +--- a/openstack_dashboard/local/local_settings.py.example ++++ b/openstack_dashboard/local/local_settings.py.example +@@ -77,7 +77,6 @@ HORIZON_CONFIG = { + # Turn off browser autocompletion for the login form if so desired. + # HORIZON_CONFIG["password_autocomplete"] = "off" + +-LOCAL_PATH = '/tmp' + + # Set custom secret key: + # You can either set it to a specific value or you can let horizion generate a +@@ -89,6 +88,7 @@ LOCAL_PATH = '/tmp' + # requests routed to the same dashboard instance or you set the same SECRET_KEY + # for all of them. + from horizon.utils import secret_key ++LOCAL_PATH = '/tmp' + SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store')) + + # We recommend you use memcached for development; otherwise after every reload diff --git a/rpm/SOURCES/0008-fix-up-issues-with-customization.patch b/rpm/SOURCES/0008-fix-up-issues-with-customization.patch new file mode 100644 index 0000000..6bcd77b --- /dev/null +++ b/rpm/SOURCES/0008-fix-up-issues-with-customization.patch @@ -0,0 +1,81 @@ +From 9bf1112382a3ce8ea197f207c417c7351dc05c8f Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Thu, 19 Sep 2013 12:58:00 +0200 +Subject: [PATCH] fix up issues with customization + +--- + openstack_dashboard_theme/__init__.py | 1 + + openstack_dashboard_theme/models.py | 1 + + .../static/dashboard/less/rhtheme.less | 2 +- + .../templates/horizon/common/_sidebar.html | 23 ++++++++++++++++++++-- + 4 files changed, 24 insertions(+), 3 deletions(-) + +diff --git a/openstack_dashboard_theme/__init__.py b/openstack_dashboard_theme/__init__.py +index e69de29..94456ab 100644 +--- a/openstack_dashboard_theme/__init__.py ++++ b/openstack_dashboard_theme/__init__.py +@@ -0,0 +1 @@ ++# intentionally left blank +diff --git a/openstack_dashboard_theme/models.py b/openstack_dashboard_theme/models.py +index e69de29..94456ab 100644 +--- a/openstack_dashboard_theme/models.py ++++ b/openstack_dashboard_theme/models.py +@@ -0,0 +1 @@ ++# intentionally left blank +diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +index 5350db3..2d8b2d0 100644 +--- a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less ++++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +@@ -1,4 +1,4 @@ +-@import "/static/dashboard/less/horizon.less"; ++@import "horizon.less"; + + /* Login Splash Page */ + +diff --git a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html +index 5672846..df66c62 100644 +--- a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html ++++ b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html +@@ -1,7 +1,8 @@ + {% load branding horizon i18n %} ++{% load url from future %} + +
+@@ -31,5 +32,23 @@ + + {% endif %} + ++ {% with num_of_regions=request.user.available_services_regions|length %} ++ {% if num_of_regions > 1 %} ++ ++ {% endif %} ++ {% endwith %} ++ + {% horizon_dashboard_nav %} + diff --git a/rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch b/rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch new file mode 100644 index 0000000..bdf61fa --- /dev/null +++ b/rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch @@ -0,0 +1,26 @@ +From daed1adb7fa46c0398542f88ebf002088daf96b3 Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Thu, 19 Sep 2013 13:58:16 +0200 +Subject: [PATCH] do not truncate the logo (related rhbz 877138) + +--- + openstack_dashboard_theme/static/dashboard/less/rhtheme.less | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +index 2d8b2d0..d70852e 100644 +--- a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less ++++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less +@@ -46,10 +46,10 @@ h1.rhos a { + background: url(/static/dashboard/img/rh-logo.png) top left no-repeat; + display: block; + float: left; +- width: 116px; ++ width: 123px; + height: 123px; + text-indent: -9999px; +- margin-left: 56px; ++ margin-left: 53px; + margin-top: 15px; + margin-bottom: 25px; + } diff --git a/rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch b/rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch new file mode 100644 index 0000000..d7076f3 --- /dev/null +++ b/rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch @@ -0,0 +1,22 @@ +From 2c3a2c7c2c7e0d396bc80ebfa9fdc2af773050c1 Mon Sep 17 00:00:00 2001 +From: Matthias Runge +Date: Fri, 4 Oct 2013 09:46:36 +0200 +Subject: [PATCH] move SECRET_KEYSTORE to '/var/lib/openstack-dashboard' + +--- + openstack_dashboard/local/local_settings.py.example | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example +index d120dfc..a60ad0c 100644 +--- a/openstack_dashboard/local/local_settings.py.example ++++ b/openstack_dashboard/local/local_settings.py.example +@@ -88,7 +88,7 @@ HORIZON_CONFIG = { + # requests routed to the same dashboard instance or you set the same SECRET_KEY + # for all of them. + from horizon.utils import secret_key +-LOCAL_PATH = '/tmp' ++LOCAL_PATH = '/var/lib/openstack-dashboard' + SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store')) + + # We recommend you use memcached for development; otherwise after every reload diff --git a/rpm/SOURCES/rh-logo.png b/rpm/SOURCES/rh-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..80cb1ef9939d72e94bfb2126e7d4405c88add98d GIT binary patch literal 60337 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 literal 0 HcmV?d00001 diff --git a/rpm/SOURCES/rhfavicon.ico b/rpm/SOURCES/rhfavicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0930145e5b050832691170143f8698e50a15341d GIT binary patch literal 446 zcmV;v0YUzWP)EKoEv!doSc#p%4&y4)g`~0kr5F^yV=M_yBnTC0^|Vc#WVBkOxo_@Rmz*^BAGx zb)DJHCeyX*p#xvCJDq=KGdoqr7&yizzC$UckpeM-o_+d9ygUI0s3WGV95CQ_%VSvTX4)*4PY^-l7NToq)k!3|&MEo07v{lKv;t7DgXcg07*qoM6N<$f_Z+tB>(^b literal 0 HcmV?d00001 diff --git a/rpm/SPECS/python-django-horizon.spec b/rpm/SPECS/python-django-horizon.spec index 129299d..891a179 100644 --- a/rpm/SPECS/python-django-horizon.spec +++ b/rpm/SPECS/python-django-horizon.spec @@ -1,6 +1,6 @@ Name: python-django-horizon Version: 2013.2 -Release: 0.5b2%{?dist} +Release: 1%{?dist} Summary: Django application for talking to Openstack Group: Development/Libraries @@ -8,26 +8,33 @@ Group: Development/Libraries License: ASL 2.0 and BSD URL: http://horizon.openstack.org/ BuildArch: noarch -Source0: https://launchpad.net/horizon/havana/havana-2/+download/horizon-%{version}.b2.tar.gz +Source0: https://launchpad.net/horizon/havana/%{version}/+download/horizon-%{version}.tar.gz Source1: openstack-dashboard.conf Source2: openstack-dashboard-httpd-2.4.conf # demo config for separate logging Source4: openstack-dashboard-httpd-logging.conf +# custom icons +Source10: rhfavicon.ico +Source11: rh-logo.png + # -# patches_base=2013.2.b2 +# patches_base=2013.2 # Patch0001: 0001-Don-t-access-the-net-while-building-docs.patch Patch0002: 0002-disable-debug-move-web-root.patch Patch0003: 0003-change-lockfile-location-to-tmp-and-also-add-localho.patch +Patch0004: 0004-Add-a-customization-module-based-on-RHOS.patch +Patch0005: 0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch +Patch0006: 0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch +Patch0007: 0007-move-SECRET_KEY-secret_key_store-to-tmp.patch +Patch0008: 0008-fix-up-issues-with-customization.patch +Patch0009: 0009-do-not-truncate-the-logo-related-rhbz-877138.patch +Patch0010: 0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch + -%if 0%{?rhel}>6 || 0%{?fedora} > 17 -# grizzly requires python-django14 -BuildRequires: python-django14 -Requires: python-django14 -%else # epel6 has a separate Django14 package %if 0%{?rhel}==6 Requires: Django14 @@ -37,33 +44,31 @@ BuildRequires: Django Requires: Django %endif -%endif Requires: python-dateutil -Requires: python-glanceclient -Requires: python-keystoneclient -Requires: python-novaclient >= 2012.1 -Requires: python-neutronclient -Requires: python-cinderclient -Requires: python-swiftclient -Requires: python-heatclient -Requires: python-ceilometerclient Requires: pytz Requires: python-lockfile BuildRequires: python2-devel BuildRequires: python-setuptools -BuildRequires: python-pbr BuildRequires: python-d2to1 +BuildRequires: python-pbr >= 0.5.21 BuildRequires: python-lockfile -BuildRequires: python-oslo-sphinx +BuildRequires: python-eventlet +BuildRequires: python-netaddr # for checks: #BuildRequires: python-django-nose -#BuildRequires: python-cinderclient -#BuildRequires: python-django-appconf -#BuildRequires: python-django-openstack-auth -#BuildRequires: python-django-compressor +#BuildRequires: python-coverage +#BuildRequires: python-mox +#BuildRequires: python-nose-exclude +#BuildRequires: python-eventlet +#BuildRequires: python-kombu +BuildRequires: python-anyjson +BuildRequires: pytz +BuildRequires: python-iso8601 +#BuildRequires: python-nose + # additional provides to be consistent with other django packages Provides: django-horizon = %{version}-%{release} @@ -83,16 +88,28 @@ Group: Applications/System Requires: httpd Requires: mod_wsgi Requires: python-django-horizon >= %{version} -Requires: python-django-openstack-auth -Requires: python-django-compressor +Requires: python-django-openstack-auth >= 1.0.11 +Requires: python-django-compressor >= 1.3 Requires: python-django-appconf +Requires: python-glanceclient +Requires: python-keystoneclient >= 0.3.2 +Requires: python-novaclient >= 2012.1 +Requires: python-neutronclient +Requires: python-cinderclient +Requires: python-swiftclient +Requires: python-heatclient +Requires: python-ceilometerclient >= 1.0.6 +# Requires: python-troveclient +Requires: python-netaddr +Requires: python-oslo-config +Requires: python-lesscpy BuildRequires: python2-devel -BuildRequires: python-django-openstack-auth -BuildRequires: python-django-compressor +BuildRequires: python-django-openstack-auth >= 1.0.11 +BuildRequires: python-django-compressor >= 1.3 BuildRequires: python-django-appconf -BuildRequires: nodejs -BuildRequires: nodejs-less +BuildRequires: python-lesscpy +BuildRequires: python-oslo-config BuildRequires: pytz %description -n openstack-dashboard @@ -116,17 +133,24 @@ BuildRequires: python-sphinx >= 1.1.3 # Doc building basically means we have to mirror Requires: BuildRequires: python-dateutil BuildRequires: python-glanceclient -BuildRequires: python-keystoneclient +BuildRequires: python-keystoneclient >= 0.3.2 BuildRequires: python-novaclient >= 2012.1 BuildRequires: python-neutronclient BuildRequires: python-cinderclient BuildRequires: python-swiftclient BuildRequires: python-heatclient BuildRequires: python-ceilometerclient +# BuildRequires: python-troveclient %description doc Documentation for the Django Horizon application for talking with Openstack +%package -n openstack-dashboard-theme +Summary: OpenStack web user interface reference implementation theme module +Requires: openstack-dashboard = %{version} + +%description -n openstack-dashboard-theme +Customization module for OpenStack Dashboard to provide a branded logo. %prep %setup -q -n horizon-%{version} @@ -134,27 +158,41 @@ Documentation for the Django Horizon application for talking with Openstack %patch0001 -p1 %patch0002 -p1 %patch0003 -p1 +%patch0004 -p1 +%patch0005 -p1 +%patch0006 -p1 +%patch0007 -p1 +%patch0008 -p1 +%patch0009 -p1 +%patch0010 -p1 + # remove unnecessary .po files find . -name "django*.po" -exec rm -f '{}' \; +# Remove the requirements file so that pbr hooks don't add it +# to distutils requires_dist config +rm -rf {test-,}requirements.txt tools/{pip,test}-requires + +# create images for custom theme +mkdir -p openstack_dashboard_theme/static/dashboard/img +cp %{SOURCE10} openstack_dashboard_theme/static/dashboard/img +cp %{SOURCE11} openstack_dashboard_theme/static/dashboard/img + # drop config snippet cp -p %{SOURCE4} . %build %{__python} setup.py build -%install -%{__python} setup.py install -O1 --skip-build --root %{buildroot} - -# drop httpd-conf snippet -%if 0%{?rhel} || 0%{?fedora} <18 -install -m 0644 -D -p %{SOURCE1} %{buildroot}%{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf -%else -# httpd-2.4 changed the syntax -install -m 0644 -D -p %{SOURCE2} %{buildroot}%{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf -%endif - +# compress css, js etc. cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py +# dirty hack to make SECRET_KEY work: +sed -i 's:^SECRET_KEY =.*:SECRET_KEY = "badcafe":' openstack_dashboard/local/local_settings.py +%{__python} manage.py collectstatic --noinput +%{__python} manage.py compress +cp -a static/dashboard %{_buildir} + +# build docs export PYTHONPATH="$( pwd ):$PYTHONPATH" %if 0%{?rhel}==6 sphinx-1.0-build -b html doc/source html @@ -162,9 +200,22 @@ sphinx-1.0-build -b html doc/source html sphinx-build -b html doc/source html %endif +# undo hack +cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py + # Fix hidden-file-or-dir warnings rm -fr html/.doctrees html/.buildinfo +%install +%{__python} setup.py install -O1 --skip-build --root %{buildroot} + +# drop httpd-conf snippet +%if 0%{?rhel} || 0%{?fedora} <18 +install -m 0644 -D -p %{SOURCE1} %{buildroot}%{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf +%else +# httpd-2.4 changed the syntax +install -m 0644 -D -p %{SOURCE2} %{buildroot}%{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf +%endif install -d -m 755 %{buildroot}%{_datadir}/openstack-dashboard install -d -m 755 %{buildroot}%{_sharedstatedir}/openstack-dashboard install -d -m 755 %{buildroot}%{_sysconfdir}/openstack-dashboard @@ -172,14 +223,17 @@ install -d -m 755 %{buildroot}%{_sysconfdir}/openstack-dashboard # Copy everything to /usr/share mv %{buildroot}%{python_sitelib}/openstack_dashboard \ %{buildroot}%{_datadir}/openstack-dashboard -mv manage.py %{buildroot}%{_datadir}/openstack-dashboard +cp manage.py %{buildroot}%{_datadir}/openstack-dashboard rm -rf %{buildroot}%{python_sitelib}/openstack_dashboard +# move customization stuff to /usr/share +mv openstack_dashboard_theme %{buildroot}%{_datadir}/openstack-dashboard # Move config to /etc, symlink it back to /usr/share -rm openstack_dashboard/local/local_settings.py mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/local/local_settings.py.example %{buildroot}%{_sysconfdir}/openstack-dashboard/local_settings -ln -s %{_sysconfdir}/openstack-dashboard/local_settings %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/local/local_settings.py +ln -s ../../../../../%{_sysconfdir}/openstack-dashboard/local_settings %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/local/local_settings.py + +mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/conf/*.json %{buildroot}%{_sysconfdir}/openstack-dashboard %if 0%{?rhel} > 6 || 0%{?fedora} >= 16 %find_lang django @@ -208,11 +262,13 @@ cat djangojs.lang >> horizon.lang mkdir -p %{buildroot}%{_datadir}/openstack-dashboard/static cp -a openstack_dashboard/static/* %{buildroot}%{_datadir}/openstack-dashboard/static cp -a horizon/static/* %{buildroot}%{_datadir}/openstack-dashboard/static +cp -a static/* %{buildroot}%{_datadir}/openstack-dashboard/static -# compress css, js etc. -cd %{buildroot}%{_datadir}/openstack-dashboard -#%{__python} manage.py collectstatic --noinput --pythonpath=../../lib/python2.6/site-packages/ -#%{__python} manage.py compress --pythonpath=../../lib/python2.6/site-packages/ +# create /var/run/openstack-dashboard/ and own it +mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard +#%check +#sed -i 's:^SECRET_KEY =.*:SECRET_KEY = "badcafe":' openstack_dashboard/local/local_settings.py +#./run_tests.sh -N %files -f horizon.lang %doc LICENSE README.rst openstack-dashboard-httpd-logging.conf @@ -247,23 +303,59 @@ cd %{buildroot}%{_datadir}/openstack-dashboard %{_datadir}/openstack-dashboard/openstack_dashboard/usage %{_datadir}/openstack-dashboard/openstack_dashboard/utils %{_datadir}/openstack-dashboard/openstack_dashboard/wsgi -%{_datadir}/openstack-dashboard/openstack_dashboard/conf +%dir %{_datadir}/openstack-dashboard/openstack_dashboard %dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale %dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/?? %dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??_?? %dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??/LC_MESSAGES -%{_sharedstatedir}/openstack-dashboard %dir %attr(0750, root, apache) %{_sysconfdir}/openstack-dashboard +%dir %attr(0750, apache, apache) %{_sharedstatedir}/openstack-dashboard %config(noreplace) %{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf %config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/local_settings +%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/keystone_policy.json +%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/nova_policy.json %files doc -%doc html +%doc html + +%files -n openstack-dashboard-theme +%{_datadir}/openstack-dashboard/openstack_dashboard_theme %changelog +* Fri Oct 18 2013 Matthias Runge - 2013.2-1 +- Horizon-2013.2 final + +* Thu Oct 17 2013 Matthias Runge - 2013.2.0.15.rc3 +- rebase to Havana-rc3 + +* Tue Oct 15 2013 Matthias Runge - 2013.2.0.14.rc2 +- rebase to Havana-rc2 + +* Fri Oct 04 2013 Matthias Runge - 2013.2-0.12.rc1 +- update to Havana-rc1 +- move secret_keystone to /var/lib/openstack-dashboard + +* Thu Sep 19 2013 Matthias Runge - 2013.2-0.11b3 +- add BuildRequires python-eventlet to fix ./manage.py issue during build +- fix import in rhteme.less + +* Mon Sep 09 2013 Matthias Runge - 2013.2-0.10b3 +- Havana-3 snapshot +- drop node.js and node-less from buildrequirements +- add runtime requirement python-lesscpy +- own openstack_dashboard dir +- fix keystore handling issue + +* Wed Aug 28 2013 Matthias Runge - 2013.2-0.8b2 +- add a -custom subpackage to use a custom logo + +* Mon Aug 26 2013 Matthias Runge - 2013.2-0.7b2 +- enable tests in check section (rhbz#856182) + * Wed Aug 07 2013 Matthias Runge - 2013.2-0.5b2 -- bump spec to rebuild against python-django-compressor >= 1.3 +- move requirements from horizon to openstack-dashboard package +- introduce explicit requirements for dependencies * Thu Jul 25 2013 Matthias Runge - 2013.2-0.4b2 - havana-2 @@ -271,23 +363,24 @@ cd %{buildroot}%{_datadir}/openstack-dashboard - require python-ceilometerclient - add requirement python-lockfile, change lockfile location to /tmp -* Mon Jun 03 2013 Matthias Runge - 2013.2-0.1b1 -- update to 2013.2.b1 +* Thu Jun 06 2013 Matthias Runge - 2013.2-0.2b1 +- havana doesn't require explicitly Django-1.4 + +* Fri May 31 2013 Matthias Runge - 2013.2-0.1b1 +- prepare for havana-1 * Mon May 13 2013 Matthias Runge - 2013.1.1-1 -- update to 2013.1.1 stable release -- move to compression using node.js/less +- change buildrequires from lessjs to nodejs-less +- update to 2013.1.1 -* Mon Apr 08 2013 Matthias Runge - 2013.1-1 -- update to grizzly final +* Fri Apr 05 2013 Matthias Runge - 2013.1-2 +- explicitly require python-django14 -* Thu Mar 14 2013 Matthias Runge - 2013.1-0.7.g3 -- fix compressed css (rhbz#921036) -- enable compression in httpd file -- set expires in httpd config file +* Fri Apr 05 2013 Matthias Runge - 2013.1-1 +- update to 2013.1 * Fri Mar 08 2013 Matthias Runge - 2013.1-0.6.g3 -- fix a syntax error in config file +- fix syntax error in config * Wed Feb 27 2013 Matthias Runge - 2013.1-0.5.g3 - update to grizzly-3 -- 2.45.2