From: Sergey Otpuschennikov Date: Fri, 8 Nov 2013 17:13:11 +0000 (+0400) Subject: Added new specfile and requires python-lesscpy X-Git-Tag: 2014.1~16 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=eba19d6a7a83219ebbf73242bc75f5e665b260b6;p=openstack-build%2Fhorizon-build.git Added new specfile and requires python-lesscpy Change-Id: I74e4e91d7e819672c0b1656c282b842a8116187f --- 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 0000000..80cb1ef Binary files /dev/null and b/rpm/SOURCES/rh-logo.png differ diff --git a/rpm/SOURCES/rhfavicon.ico b/rpm/SOURCES/rhfavicon.ico new file mode 100644 index 0000000..0930145 Binary files /dev/null and b/rpm/SOURCES/rhfavicon.ico differ 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