-horizon (1:2013.2-0ubuntu1~cloud0) precise-havana; urgency=low
+horizon (1:2013.2.3-0ubuntu1~cloud0) precise-havana; urgency=medium
- * New upstream release for the Ubuntu Cloud Archive.
+ * New upstream release for the Ubuntu Cloud Archive.
- -- Chuck Short <zulcss@ubuntu.com> Wed, 16 Oct 2013 20:28:28 -0400
+ -- Openstack Ubuntu Testing Bot <openstack-testing-bot@ubuntu.com> Mon, 14 Apr 2014 07:58:45 -0400
+
+horizon (1:2013.2.3-0ubuntu1) saucy-proposed; urgency=medium
+
+ * Resynchronize with stable/havana (82cb9f6) (LP: #1302575):
+ - [b2259b3] Don't copy the flavorid when updating flavors
+ - [8db4687] Allow snapshots of paused and suspended instances
+ - [cf181c1] Reduce number of novaclient calls
+ - [82cb9f6] Fixing tests to work with keystoneclient 0.6.0
+
+ -- Corey Bryant <corey.bryant@canonical.com> Fri, 04 Apr 2014 10:52:55 -0400
+
+horizon (1:2013.2.2-0ubuntu1) saucy-proposed; urgency=low
+
+ [ Chuck Short ]
+ * Resynchronize with stable/havana (36e0ab5) (LP: #1284643):
+ - [e73ff07] run_tests.sh fails with a fresh venv due to django 1.6
+ installed LP: 1250581
+ - [3e93b54] Email shouldn't be a mandatory attribute LP: 1260423
+ - [2c1f1f3] Wrap call to extension_supported on Launch Instance with
+ try/except LP: 1262223
+ - [2e11482] Unit tests failing with raise
+ UnknownMethodCallError('management_url') LP: 1268631
+ - [c6d38a1] Metering dashboard. Marker could not be found (havana)
+ LP: 1260528
+ - [2b6dfa7] keypairs can not have an '@' sign in the name LP: 1265563
+ - [8ba7780] Cannot see confirmation message when working on longer pages
+ LP: 1251361
+ - [edd8ee4] fix help text in "Create An image" window
+ - [aa55b24] Inconsistance between horizon and django_openstack_auth default
+ keystone version LP: 1231357
+ - [7a8eadc] LBaaS. HealthMonitor representation should be improved
+ LP: 1237377
+ - [02e7b6e] "neutron lb-pool-list" running by admin returns also non-admin
+ load balancer pools which appear later in horizon's admin project
+ LP: 1244126
+ - [5520d65] create volume option is shown, even without cinder enabled
+ LP: 1267438
+ - [5b970a5] .tx/config in havana needs to catch up with Transifex resource
+ renaming LP: 1274005
+ - [6508afd] when creating instance,access security and networking tabs
+ missing asterisk LP: 1252005
+ - [96bd650] timeout logic causes logout when load balanced LP: 1243277
+ - [36e0ab5] Import translations for Havana 2013.2.2 update
+
+ [ James Page ]
+ * d/static/*: Refreshed for new upstream release.
+
+ -- Chuck Short <zulcss@ubuntu.com> Tue, 25 Feb 2014 09:19:08 -0500
+
+horizon (1:2013.2.1-0ubuntu1) saucy-proposed; urgency=low
+
+ * Resynchronize with stable/havana (9668e80) (LP: #1262788):
+ - [d97bba1] precision of floating point metering stats is discarded
+ unnecessarily LP: 1241467
+ - [53047be] "Tenant" should be "Project" (Resource Usage panel) LP: 1250942
+ - [728b5d1] Subnet / Subnet details not marked as translatable LP: 1254026
+ - [9465e54] missing hover hint for instance:<type> meter in Metric dropdown
+ list LP: 1243241
+ - [842ba5f] Default port for The MS SQL Security Group is 1433 instead of
+ 1443 LP: 1250029
+ - [631ee65] iso8601 debug message is annoying in dashboard unit test
+ LP: 1250554
+ - [1361a02] only meters associated with the first instance reported appear
+ in Metric dropdown list LP: 1243298
+ - [599d4a5] Persistent XSS in OpenStack Web UI for Instances LP: 1247675
+ - [7f804c9] Password Change needs to logout current user LP: 1226829
+ - [3b621e7] The "Weight" parameter in Horizon's LBaaS member creation
+ dialog is mandatory while it's only optional in the cli command
+ LP: 1241004
+ - [b5b102e] i18n: "Filter" in "Flavor Access" tab of "Create Flavor"
+ workflow is not translatable LP: 1239927
+ - [0aba596] I18n: Localization of the role "Member" LP: 1255004
+ - [d66a483] detach volume dialog contains escaped html LP: 1252881
+ - [37f0128] English string for "Injected File Path Bytes" is wrong
+ LP: 1254049
+ - [ac2815c] ./templates/base.html.c:6: warning: unterminated string literal
+ LP: 1243526
+ - [6d02f2e] Cannot assign different translations for present and past
+ message of BatchAction LP: 1252082
+ - [655dc79] Resource Usage Page table views shows statistics in a wrong way
+ LP: 1249279
+ - [5d9684d] lbaas pool tcp LP: 1241713
+ - [040bebb] Some "Working" dialogs are not translatable LP: 1252074
+ - [852e5c8] Translation update for 2013.2.1 release LP: 1258462
+ - [9668e80] Updated from global requirements
+ * debian/patches/CVE-2013-6406: Dropped, applied upstream [599d4a5]
+ * debian/patches/revert-stable-havana-requirements.patch: Revert
+ version bumps to dependencies in stable/havana back to what was
+ shipped with Saucy.
+
+ -- Adam Gandelman <adamg@ubuntu.com> Wed, 18 Dec 2013 10:47:22 -0800
+
+horizon (1:2013.2-0ubuntu1.1) saucy-security; urgency=low
+
+ * SECURITY UPDATE: XSS in Volumes and Network Topology pages
+ - debian/patches/CVE-2013-6406: html.escape() various items in
+ volumes/tables.py and volume_snapshots/tables.py
+ - CVE-2013-6406 (also referred to as CVE-2013-6858)
+ - LP: #1247675
+
+ -- Jamie Strandboge <jamie@ubuntu.com> Tue, 03 Dec 2013 15:54:34 -0600
+
+horizon (1:2013.2-0ubuntu1) saucy; urgency=low
+
+ * New upstream release (LP: #1236462).
+
+ -- Chuck Short <zulcss@ubuntu.com> Thu, 17 Oct 2013 09:43:46 -0400
horizon (1:2013.2~rc3-0ubuntu1) saucy; urgency=low
fi
chown -R horizon:horizon /var/lib/openstack-dashboard
fi
-
if [ -d /usr/share/openstack-dashboard ] ; then
chown -R horizon:horizon /usr/share/openstack-dashboard
fi
--- /dev/null
+Index: horizon/requirements.txt
+===================================================================
+--- horizon.orig/requirements.txt 2013-12-18 10:45:38.715248799 -0800
++++ horizon/requirements.txt 2013-12-18 10:46:46.763248182 -0800
+@@ -6,7 +6,7 @@
+ eventlet>=0.13.0
+ kombu>=2.4.8
+ lesscpy>=0.9j
+-iso8601>=0.1.8
++iso8601>=0.1.4
+ netaddr
+ python-cinderclient>=1.0.6
+ python-glanceclient>=0.9.0
fix-ubuntu-tests.patch
ubuntu_settings.patch
-
+revert-stable-havana-requirements.patch
mos-disable-metering.patch
mos-fix-murano-savana-dashboard.patch
---- 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 uge
+Index: horizon/openstack_dashboard/local/local_settings.py.example
+===================================================================
+--- horizon.orig/openstack_dashboard/local/local_settings.py.example 2013-12-18 10:46:15.499248466 -0800
++++ horizon/openstack_dashboard/local/local_settings.py.example 2013-12-18 10:46:15.491248466 -0800
+@@ -4,7 +4,7 @@
from openstack_dashboard import exceptions
TEMPLATE_DEBUG = DEBUG
# Required for Django 1.5.
-@@ -89,22 +89,16 @@ LOCAL_PATH = os.path.dirname(os.path.abs
+@@ -89,22 +89,16 @@
# requests routed to the same dashboard instance or you set the same SECRET_KEY
# for all of them.
from horizon.utils import secret_key
}
# Send email to the console by default
-@@ -406,3 +400,24 @@ SECURITY_GROUP_RULES = {
+@@ -448,3 +442,24 @@
'to_port': '3389',
},
}
+# installations should have this set accordingly. For more information
+# see https://docs.djangoproject.com/en/dev/ref/settings/.
+ALLOWED_HOSTS = '*'
---- a/openstack_dashboard/settings.py
-+++ b/openstack_dashboard/settings.py
-@@ -217,8 +217,7 @@ if not SECRET_KEY:
+Index: horizon/openstack_dashboard/settings.py
+===================================================================
+--- horizon.orig/openstack_dashboard/settings.py 2013-12-18 10:46:15.499248466 -0800
++++ horizon/openstack_dashboard/settings.py 2013-12-18 10:46:15.491248466 -0800
+@@ -219,8 +219,7 @@
from horizon.utils import secret_key
LOCAL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'local')
horizon.addInitFunction(function(){$("body").ajaxComplete(function(event,request,settings){var message_array=$.parseJSON(horizon.ajax.get_messages(request));$(message_array).each(function(index,item){horizon.alert(item[0],item[1],item[2]);});});$('a.ajax-modal').click(function(){horizon.clearAllMessages();});$(".alert").alert();horizon.autoDismissAlerts();});horizon.modals={_request:null,spinner:null,_init_functions:[]};horizon.modals.addModalInitFunction=function(f){horizon.modals._init_functions.push(f);};horizon.modals.initModal=function(modal){$(horizon.modals._init_functions).each(function(index,f){f(modal);});};horizon.modals.create=function(title,body,confirm,cancel){if(!cancel){cancel=gettext("Cancel");}
var template=horizon.templates.compiled_templates["#modal_template"],params={title:title,body:body,confirm:confirm,cancel:cancel},modal=$(template.render(params)).appendTo("#modal_wrapper");return modal;};horizon.modals.success=function(data,textStatus,jqXHR){var modal;$('#modal_wrapper').append(data);$('.modal span.help-block').hide();modal=$('.modal:last');modal.modal();$(modal).trigger("new_modal",modal);return modal;};horizon.modals.modal_spinner=function(text){var template=horizon.templates.compiled_templates["#spinner-modal"];horizon.modals.spinner=$(template.render({text:text}));horizon.modals.spinner.appendTo("#modal_wrapper");horizon.modals.spinner.modal({backdrop:'static'});horizon.modals.spinner.spin(horizon.conf.spinner_options.modal);};horizon.addInitFunction(function(){$('#modal_wrapper').on('new_modal',function(evt,modal){horizon.modals.initModal(modal);});$(document).on('click','.modal .cancel',function(evt){$(this).closest('.modal').modal('hide');evt.preventDefault();});$(document).on('submit','.modal form',function(evt){var $form=$(this),$button=$form.find(".modal-footer .btn-primary"),update_field_id=$form.attr("data-add-to-field"),headers={};if($form.attr("enctype")==="multipart/form-data"){return;}
evt.preventDefault();$button.prop("disabled",true);if(update_field_id){headers["X-Horizon-Add-To-Field"]=update_field_id;}
-$.ajax({type:"POST",url:$form.attr('action'),headers:headers,data:$form.serialize(),beforeSend:function(){$("#modal_wrapper .modal").last().modal("hide");horizon.modals.modal_spinner("Working");},complete:function(){horizon.modals.spinner.modal('hide');$("#modal_wrapper .modal").last().modal("show");$button.prop("disabled",false);},success:function(data,textStatus,jqXHR){var redirect_header=jqXHR.getResponseHeader("X-Horizon-Location"),add_to_field_header=jqXHR.getResponseHeader("X-Horizon-Add-To-Field"),json_data,field_to_update;$form.closest(".modal").modal("hide");if(redirect_header){location.href=redirect_header;}
-else if(add_to_field_header){json_data=$.parseJSON(data);field_to_update=$("#"+add_to_field_header);field_to_update.append("<option value='"+json_data[0]+"'>"+json_data[1]+"</option>");field_to_update.change();field_to_update.val(json_data[0]);}else{horizon.modals.success(data,textStatus,jqXHR);}},error:function(jqXHR,status,errorThrown){$form.closest(".modal").modal("hide");horizon.alert("error",gettext("There was an error submitting the form. Please try again."));}});});$(document).on('show','.modal',function(evt){if($(evt.target).hasClass("modal")){var scrollShift=$('body').scrollTop(),$this=$(this),topVal=$this.css('top');$this.css('top',scrollShift+parseInt(topVal,10));}});horizon.modals.addModalInitFunction(function(modal){$(modal).find(":text, select, textarea").filter(":visible:first").focus();});horizon.modals.addModalInitFunction(horizon.datatables.validate_button);$(document).on('click','.ajax-modal',function(evt){var $this=$(this);if(horizon.modals._request&&typeof(horizon.modals._request.abort)!==undefined){horizon.modals._request.abort();}
+$.ajax({type:"POST",url:$form.attr('action'),headers:headers,data:$form.serialize(),beforeSend:function(){$("#modal_wrapper .modal").last().modal("hide");horizon.modals.modal_spinner(gettext("Working"));},complete:function(){horizon.modals.spinner.modal('hide');$("#modal_wrapper .modal").last().modal("show");$button.prop("disabled",false);},success:function(data,textStatus,jqXHR){var redirect_header=jqXHR.getResponseHeader("X-Horizon-Location"),add_to_field_header=jqXHR.getResponseHeader("X-Horizon-Add-To-Field"),json_data,field_to_update;$form.closest(".modal").modal("hide");if(redirect_header){location.href=redirect_header;}
+else if(add_to_field_header){json_data=$.parseJSON(data);field_to_update=$("#"+add_to_field_header);field_to_update.append("<option value='"+json_data[0]+"'>"+json_data[1]+"</option>");field_to_update.change();field_to_update.val(json_data[0]);}else{horizon.modals.success(data,textStatus,jqXHR);}},error:function(jqXHR,status,errorThrown){if(jqXHR.getResponseHeader('logout')){location.href=jqXHR.getResponseHeader("X-Horizon-Location");}else{$form.closest(".modal").modal("hide");horizon.alert("error",gettext("There was an error submitting the form. Please try again."));}}});});$(document).on('show','.modal',function(evt){if($(evt.target).hasClass("modal")){var scrollShift=$('body').scrollTop()||$('html').scrollTop(),$this=$(this),topVal=$this.css('top');$this.css('top',scrollShift+parseInt(topVal,10));}});horizon.modals.addModalInitFunction(function(modal){$(modal).find(":text, select, textarea").filter(":visible:first").focus();});horizon.modals.addModalInitFunction(horizon.datatables.validate_button);$(document).on('click','.ajax-modal',function(evt){var $this=$(this);if(horizon.modals._request&&typeof(horizon.modals._request.abort)!==undefined){horizon.modals._request.abort();}
horizon.modals._request=$.ajax($this.attr('href'),{beforeSend:function(){horizon.modals.modal_spinner(gettext("Loading"));},complete:function(){horizon.modals._request=null;horizon.modals.spinner.modal('hide');},error:function(jqXHR,status,errorThrown){if(jqXHR.status===401){var redir_url=jqXHR.getResponseHeader("X-Horizon-Location");if(redir_url){location.href=redir_url;}else{location.reload(true);}}
else{if(!horizon.ajax.get_messages(jqXHR)){horizon.alert("error",gettext("An error occurred. Please try again later."));}}},success:function(data,textStatus,jqXHR){var update_field_id=$this.attr('data-add-to-field'),modal,form;modal=horizon.modals.success(data,textStatus,jqXHR);if(update_field_id){form=modal.find("form");if(form.length){form.attr("data-add-to-field",update_field_id);}}}});evt.preventDefault();});$(document).on("show",".modal",function(){var container=$("#modal_wrapper"),modal_stack=container.find(".modal"),$this=$(this);modal_stack.splice(modal_stack.length-1,1);modal_stack.modal("hide");});$(document).on('hidden','.modal',function(){var $this=$(this),modal_stack=$("#modal_wrapper .modal");if($this[0]==modal_stack.last()[0]||$this.hasClass("loading")){$this.remove();if(!$this.hasClass("loading")){$("#modal_wrapper .modal").last().modal("show");}}});});horizon.Quota={is_flavor_quota:false,user_value_progress_bars:[],auto_value_progress_bars:[],flavor_progress_bars:[],user_value_form_inputs:[],selected_flavor:null,flavors:[],init:function(){this.user_value_progress_bars=$('div[data-progress-indicator-for]');this.auto_value_progress_bars=$('div[data-progress-indicator-step-by]');this.user_value_form_inputs=$($.map(this.user_value_progress_bars,function(elm){return('#'+$(elm).attr('data-progress-indicator-for'));}));this._initialCreation(this.user_value_progress_bars)
this._initialCreation(this.auto_value_progress_bars)
self.get_size=function(){$(self.html_element).css("height","");$(self.html_element).css("width","");var svg=$(self.html_element).find("svg");svg.hide();self.width=jquery_element.width();self.height=jquery_element.height();if(self.settings.auto_size){var auto_height=$(window).height()-jquery_element.offset().top-30;if(auto_height>self.height){self.height=auto_height;}}
$(self.html_element).css("height",self.height);$(self.html_element).css("width",self.width);svg.show();svg.css("height",self.height);svg.css("width",self.width);}
self.load_settings({});self.get_size();self.refresh=function(){var self=this;self.start_loading();horizon.ajax.queue({url:self.final_url,success:function(data,textStatus,jqXHR){$(self.html_element).html("");$(self.legend_element).html("");self.series=data.series;self.load_settings(data.settings);if(self.series.length<=0){$(self.html_element).html("No data available.");$(self.legend_element).html("");$(self.legend_element).css("height","");}else{self.render();}},error:function(jqXHR,textStatus,errorThrown){$(self.html_element).html("No data available.");$(self.legend_element).html("");$(self.legend_element).css("height","");horizon.alert("error",gettext("An error occurred. Please try again later."));},complete:function(jqXHR,textStatus){self.finish_loading();}});};self.render=function(){var self=this;$.map(self.series,function(serie){serie.color=self.color(serie.name)
-$.map(serie.data,function(statistic){statistic.x=d3.time.format("%Y-%m-%dT%H:%M:%S").parse(statistic.x);statistic.x=statistic.x.getTime()/1000;});});var graph=new Rickshaw.Graph({element:self.html_element,width:self.width,height:self.height,renderer:self.settings.renderer,series:self.series});graph.render();var hoverDetail=new Rickshaw.Graph.HoverDetail({graph:graph,formatter:function(series,x,y){var date='<span class="date">'+new Date(x*1000).toUTCString()+'</span>';var swatch='<span class="detail_swatch" style="background-color: '+series.color+'"></span>';var content=swatch+series.name+": "+parseInt(y)+" "+series.unit+'<br>'+date;return content;}});if(self.legend_element){var legend=new Rickshaw.Graph.Legend({graph:graph,element:self.legend_element});var shelving=new Rickshaw.Graph.Behavior.Series.Toggle({graph:graph,legend:legend});var order=new Rickshaw.Graph.Behavior.Series.Order({graph:graph,legend:legend});var highlighter=new Rickshaw.Graph.Behavior.Series.Highlight({graph:graph,legend:legend});}
+$.map(serie.data,function(statistic){statistic.x=d3.time.format("%Y-%m-%dT%H:%M:%S").parse(statistic.x);statistic.x=statistic.x.getTime()/1000;});});var graph=new Rickshaw.Graph({element:self.html_element,width:self.width,height:self.height,renderer:self.settings.renderer,series:self.series});graph.render();var hoverDetail=new Rickshaw.Graph.HoverDetail({graph:graph,formatter:function(series,x,y){var date='<span class="date">'+new Date(x*1000).toUTCString()+'</span>';var swatch='<span class="detail_swatch" style="background-color: '+series.color+'"></span>';var content=swatch+series.name+": "+parseFloat(y).toFixed(2)+" "+series.unit+'<br>'+date;return content;}});if(self.legend_element){var legend=new Rickshaw.Graph.Legend({graph:graph,element:self.legend_element});var shelving=new Rickshaw.Graph.Behavior.Series.Toggle({graph:graph,legend:legend});var order=new Rickshaw.Graph.Behavior.Series.Order({graph:graph,legend:legend});var highlighter=new Rickshaw.Graph.Behavior.Series.Highlight({graph:graph,legend:legend});}
var axes_x=new Rickshaw.Graph.Axis.Time({graph:graph});axes_x.render();var axes_y=new Rickshaw.Graph.Axis.Y({graph:graph});axes_y.render();$(self.legend_element).css("height","");};self.start_loading=function(){var self=this;$(self.html_element).find(".modal-backdrop").remove();$(self.html_element).find(".spinner_wrapper").remove();self.backdrop=$("<div class='modal-backdrop'></div>");self.backdrop.css("width",self.width).css("height",self.height);$(self.html_element).append(self.backdrop);$(self.legend_element).html("").addClass("disabled");self.spinner=$("<div class='spinner_wrapper'></div>");$(self.html_element).append(self.spinner);self.spinner.spin(horizon.conf.spinner_options.line_chart);var radius=horizon.conf.spinner_options.line_chart.radius;var length=horizon.conf.spinner_options.line_chart.length;var spinner_size=radius+length;var top=(self.height/2)-spinner_size/2;var left=(self.width/2)-spinner_size/2;self.spinner.css("top",top).css("left",left);};self.finish_loading=function(){var self=this;$(self.legend_element).removeClass("disabled");};},init:function(selector,settings){var self=this;$(selector).each(function(){self.refresh(this);});var rtime=new Date(1,1,2000,12,00,00);var timeout=false;var delta=400;$(window).resize(function(){rtime=new Date();if(timeout===false){timeout=true;setTimeout(resizeend,delta);}});function resizeend(){if(new Date()-rtime<delta){setTimeout(resizeend,delta);}else{timeout=false;$(selector).each(function(){self.refresh(this);});}}
self.bind_commands(selector);},refresh:function(html_element){var chart=new this.LineChart(this,html_element)
chart.refresh();},bind_commands:function(selector){var select_box_selector='select[data-line-chart-command="select_box_change"]';var datepicker_selector='input[data-line-chart-command="date_picker_change"]';var self=this;connect_forms_to_charts=function(){$(selector).each(function(){var chart=$(this);$(chart.data('form-selector')).each(function(){var form=$(this);var chart_identifier='div[data-form-selector="'+chart.data('form-selector')+'"]';if(!form.data("charts_selector")){form.data("charts_selector",chart_identifier);}else{form.data("charts_selector",form.data("charts_selector")+", "+chart_identifier);}});});};delegate_event_and_refresh_charts=function(selector,event_name){$("form").delegate(selector,event_name,function(){var invoker=$(this);var form=invoker.parents("form").first();$(form.data("charts_selector")).each(function(){self.refresh(this);});});};bind_select_box_change=function(){delegate_event_and_refresh_charts(select_box_selector,"change");};bind_datepicker_change=function(){var now=new Date();$(datepicker_selector).each(function(){var el=$(this);el.datepicker({format:"yyyy-mm-dd",setDate:new Date(),showButtonPanel:true})});delegate_event_and_refresh_charts(datepicker_selector,"changeDate");};connect_forms_to_charts();bind_select_box_change();bind_datepicker_change();}}
{
- "31e68b3a0f4dc1c7b2874c30d74a6c5f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/588884c5a22a.js\"></script>",
- "fa1e37f67ab85248c0eeab1040fd5b0f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/271a130e6a31.js\"></script>",
- "cd3f60d28370bf68dc0658c05abae046": "<link rel=\"stylesheet\" href=\"/static/dashboard/css/d46048c6478b.css\" type=\"text/css\" media=\"screen\" />"
+ "cd3f60d28370bf68dc0658c05abae046": "<link rel=\"stylesheet\" href=\"/static/dashboard/css/d46048c6478b.css\" type=\"text/css\" media=\"screen\" />",
+ "fa1e37f67ab85248c0eeab1040fd5b0f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/59722976ae97.js\"></script>",
+ "31e68b3a0f4dc1c7b2874c30d74a6c5f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/588884c5a22a.js\"></script>"
}
\ No newline at end of file
-From 7e42671c5b9c190191ba5044b63e750824742ffa Mon Sep 17 00:00:00 2001
+From f945b999b097f74783b910175d004579ca8e4919 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Fri, 5 Apr 2013 10:16:19 +0200
Subject: [PATCH] Don't access the net while building docs (Note this hasn't
-From 9627a3e4df39cf243e889599298e70bfa48bd4fe Mon Sep 17 00:00:00 2001
+From 4259ab6b64ae1fc6f5f14664fad981781e4280e3 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Fri, 5 Apr 2013 10:07:53 +0200
Subject: [PATCH] disable debug, move web root
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 6e426c9..d2db3cd 100644
+index a1a8474..8f15a64 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 _
-From ff59c0877d17ae0f64e83cd4af930df56182299e Mon Sep 17 00:00:00 2001
+From f4bde71afb9b9ece56eed607061937f3d261c383 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Thu, 25 Jul 2013 11:32:38 +0200
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 d2db3cd..d386d46 100644
+index 8f15a64..832358e 100644
--- a/openstack_dashboard/local/local_settings.py.example
+++ b/openstack_dashboard/local/local_settings.py.example
@@ -12,7 +12,7 @@ TEMPLATE_DEBUG = DEBUG
-From 2b983d9b083c2ae9f09a535f64617ec3a3b02cfb Mon Sep 17 00:00:00 2001
+From 33218f8ba3ba47209b92ffd5c5bdf7fdce9ae926 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Thu, 14 Feb 2013 12:55:54 +0100
Subject: [PATCH] Add a customization module based on RHOS
Conflicts:
openstack_dashboard/settings.py
+
+fix up issues with customization
+
+do not truncate the logo (related rhbz 877138)
---
openstack_dashboard/settings.py | 12 ++++-
- openstack_dashboard_theme/__init__.py | 0
- openstack_dashboard_theme/models.py | 0
+ openstack_dashboard_theme/__init__.py | 1 +
+ openstack_dashboard_theme/models.py | 1 +
.../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 ++++++++++++++
+ .../templates/horizon/common/_sidebar.html | 54 +++++++++++++++++++++
openstack_dashboard_theme/templates/splash.html | 17 +++++++
- 9 files changed, 163 insertions(+), 2 deletions(-)
+ 9 files changed, 184 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
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
+index 0000000..94456ab
+--- /dev/null
++++ 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
new file mode 100644
-index 0000000..e69de29
+index 0000000..94456ab
+--- /dev/null
++++ 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
new file mode 100644
-index 0000000..5350db3
+index 0000000..d70852e
--- /dev/null
+++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
@@ -0,0 +1,55 @@
-+@import "/static/dashboard/less/horizon.less";
++@import "horizon.less";
+
+/* Login Splash Page */
+
+ 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;
+}
+{% 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
+index 0000000..df66c62
--- /dev/null
+++ b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
-@@ -0,0 +1,35 @@
+@@ -0,0 +1,54 @@
+{% load branding horizon i18n %}
++{% load url from future %}
+
+<div class='sidebar'>
-+ <h1 class="rhos clearfix"><a href="{% url horizon:user_home %}">{% site_branding %}</a></h1>
++ <h1 class="rhos clearfix"><a href="{% url 'horizon:user_home' %}">{% site_branding %}</a></h1>
+
+ {% horizon_main_nav %}
+
+ <li class='divider'></li>
+ {% for tenant in authorized_tenants %}
+ {% if tenant.enabled and tenant.id != request.user.tenant_id %}
-+ <li><a href="{% url switch_tenants tenant.id %}">{{ tenant.name }}</a></li>
++ <li><a href="{% url 'switch_tenants' tenant.id %}?next={{ request.horizon.dashboard.get_absolute_url }}">{{ tenant.name }}</a></li>
+ {% endif %}
+ {% endfor %}
+ </ul>
+ </div>
+ {% endif %}
+
++ {% with num_of_regions=request.user.available_services_regions|length %}
++ {% if num_of_regions > 1 %}
++ <div id="services_region_switcher" class="dropdown switcher_bar" tabindex="1">
++ <a class="dropdown-toggle" data-toggle="dropdown" href="#services_region_switcher">
++ <h4>{% trans "Managing Region" %}</h4>
++ <h3>{{ request.user.services_region }}</h3>
++ </a>
++
++ <ul id="services_regions_list" class="dropdown-menu">
++ <li class='divider'></li>
++ {% for region in request.user.available_services_regions %}
++ <li><a href="{% url 'switch_services_region' region %}?next={{ request.horizon.panel.get_absolute_url }}">{{ region }}</a></li>
++ {% endfor %}
++ </ul>
++ </div>
++ {% endif %}
++ {% endwith %}
++
+ {% horizon_dashboard_nav %}
+</div>
diff --git a/openstack_dashboard_theme/templates/splash.html b/openstack_dashboard_theme/templates/splash.html
+++ /dev/null
-From 9058dd457bf4ce116848c48cc9fdcd0319e77e84 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-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,"<a href=\"$1\">$1</a>"));
-+ });
-+ return $(returning);
-+ },
-+ linkUser: function() {
-+ var returning = [];
-+ var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
-+ this.each(function() {
-+ returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>"));
-+ });
-+ return $(returning);
-+ },
-+ linkHash: function() {
-+ var returning = [];
-+ var regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
-+ this.each(function() {
-+ returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+s.username.join("%2BOR%2B")+'">#$1</a>'));
-+ });
-+ return $(returning);
-+ },
-+ capAwesome: function() {
-+ var returning = [];
-+ this.each(function() {
-+ returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'));
-+ });
-+ return $(returning);
-+ },
-+ capEpic: function() {
-+ var returning = [];
-+ this.each(function() {
-+ returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>'));
-+ });
-+ return $(returning);
-+ },
-+ makeHeart: function() {
-+ var returning = [];
-+ this.each(function() {
-+ returning.push(this.replace(/(<)+[3]/gi, "<tt class='heart'>♥</tt>"));
-+ });
-+ 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 = $('<ul class="tweet_list">').appendTo(this);
-+ var intro = '<p class="tweet_intro">'+s.intro_text+'</p>';
-+ var outro = '<p class="tweet_outro">'+s.outro_text+'</p>';
-+ var loading = $('<p class="loading">'+s.loading_text+'</p>');
-+
-+ 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 = '<span class="tweet_join"> '+join_text+' </span>';
-+ var join = ((s.join_text) ? join_template : ' ');
-+ var avatar_template = '<a class="tweet_avatar" href="http://twitter.com/'+from_user+'"><img src="'+profile_image_url+'" height="'+s.avatar_size+'" width="'+s.avatar_size+'" alt="'+from_user+'\'s avatar" title="'+from_user+'\'s avatar" border="0"/></a>';
-+ var avatar = (s.avatar_size ? avatar_template : '');
-+ var date = '<a href="http://twitter.com/'+from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+relative_time(item.created_at)+'</a>';
-+ var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ '</span>';
-+
-+ // until we create a template option, arrange the items below to alter a tweet's display.
-+ list.append('<li>' + avatar + date + join + text + '</li>');
-+
-+ 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 %}
-+ <div class="sphinxsidebar">
-+ <div class="sphinxsidebarwrapper">
-+ {%- block sidebarlogo %}
-+ {%- if logo %}
-+ <p class="logo"><a href="{{ pathto(master_doc) }}">
-+ <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
-+ </a></p>
-+ {%- endif %}
-+ {%- endblock %}
-+ {%- block sidebartoc %}
-+ {%- if display_toc %}
-+ <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
-+ {{ toc }}
-+ {%- endif %}
-+ {%- endblock %}
-+ {%- block sidebarrel %}
-+ {%- if prev %}
-+ <h4>{{ _('Previous topic') }}</h4>
-+ <p class="topless"><a href="{{ prev.link|e }}"
-+ title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
-+ {%- endif %}
-+ {%- if next %}
-+ <h4>{{ _('Next topic') }}</h4>
-+ <p class="topless"><a href="{{ next.link|e }}"
-+ title="{{ _('next chapter') }}">{{ next.title }}</a></p>
-+ {%- endif %}
-+ {%- endblock %}
-+ {%- block sidebarsourcelink %}
-+ {%- if show_source and has_source and sourcename %}
-+ <h3>{{ _('This Page') }}</h3>
-+ <ul class="this-page-menu">
-+ <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
-+ rel="nofollow">{{ _('Show Source') }}</a></li>
-+ </ul>
-+ {%- endif %}
-+ {%- endblock %}
-+ {%- if customsidebar %}
-+ {% include customsidebar %}
-+ {%- endif %}
-+ {%- block sidebarsearch %}
-+ {%- if pagename != "search" %}
-+ <div id="searchbox" style="display: none">
-+ <h3>{{ _('Quick search') }}</h3>
-+ <form class="search" action="{{ pathto('search') }}" method="get">
-+ <input type="text" name="q" size="18" />
-+ <input type="submit" value="{{ _('Go') }}" />
-+ <input type="hidden" name="check_keywords" value="yes" />
-+ <input type="hidden" name="area" value="default" />
-+ </form>
-+ <p class="searchtip" style="font-size: 90%">
-+ {{ _('Enter search terms or a module, class or function name.') }}
-+ </p>
-+ </div>
-+ <script type="text/javascript">$('#searchbox').show(0);</script>
-+ {%- endif %}
-+ {%- endblock %}
-+ </div>
-+ </div>
-+ {%- endif %}{% endif %}
-+{%- endmacro %}
-+
-+{% block relbar1 %}{% endblock relbar1 %}
-+
-+{% block header %}
-+ <div id="header">
-+ <h1 id="logo"><a href="http://www.openstack.org/">OpenStack</a></h1>
-+ <ul id="navigation">
-+ <li><a href="http://www.openstack.org/" title="Go to the Home page" class="link">Home</a></li>
-+ <li><a href="http://www.openstack.org/projects/" title="Go to the OpenStack Projects page">Projects</a></li>
-+ <li><a href="http://www.openstack.org/user-stories/" title="Go to the User Stories page" class="link">User Stories</a></li>
-+ <li><a href="http://www.openstack.org/community/" title="Go to the Community page" class="link">Community</a></li>
-+ <li><a href="http://www.openstack.org/blog/" title="Go to the OpenStack Blog">Blog</a></li>
-+ <li><a href="http://wiki.openstack.org/" title="Go to the OpenStack Wiki">Wiki</a></li>
-+ <li><a href="http://docs.openstack.org/" title="Go to OpenStack Documentation" class="current">Documentation</a></li>
-+ </ul>
-+ </div>
-+{% 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,<1.2
- # for bug 1091333, remove after sphinx >1.1.3 is released.
- docutils==0.9.1
--oslo.sphinx
-From 78e5ed6e2be464922850f68ec4c371428c9c56d7 Mon Sep 17 00:00:00 2001
+From 499eaf237a6fb1b8e0233f59793d54827bfbf2e7 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Mon, 9 Sep 2013 14:13:07 +0200
Subject: [PATCH] move RBAC policy files and checks to /etc/openstack-dashboard
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
+index 832358e..6838944 100644
--- a/openstack_dashboard/local/local_settings.py.example
+++ b/openstack_dashboard/local/local_settings.py.example
@@ -228,12 +228,13 @@ TIME_ZONE = "UTC"
-From 09539805488bcb346dbd43770f4d0d9edf39c800 Mon Sep 17 00:00:00 2001
+From 7f7882eb403c493cb857c0c7523e964ffd165c19 Mon Sep 17 00:00:00 2001
From: Matthias Runge <mrunge@redhat.com>
Date: Mon, 9 Sep 2013 20:52:51 +0200
-Subject: [PATCH] move SECRET_KEY secret_key_store to /tmp
+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 afa95f1..d120dfc 100644
+index 6838944..cd31406 100644
--- a/openstack_dashboard/local/local_settings.py.example
+++ b/openstack_dashboard/local/local_settings.py.example
@@ -77,7 +77,6 @@ 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
+++ /dev/null
-From 9bf1112382a3ce8ea197f207c417c7351dc05c8f Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-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 %}
-
- <div class='sidebar'>
-- <h1 class="rhos clearfix"><a href="{% url horizon:user_home %}">{% site_branding %}</a></h1>
-+ <h1 class="rhos clearfix"><a href="{% url 'horizon:user_home' %}">{% site_branding %}</a></h1>
-
- {% horizon_main_nav %}
-
-@@ -22,7 +23,7 @@
- <li class='divider'></li>
- {% for tenant in authorized_tenants %}
- {% if tenant.enabled and tenant.id != request.user.tenant_id %}
-- <li><a href="{% url switch_tenants tenant.id %}">{{ tenant.name }}</a></li>
-+ <li><a href="{% url 'switch_tenants' tenant.id %}?next={{ request.horizon.dashboard.get_absolute_url }}">{{ tenant.name }}</a></li>
- {% endif %}
- {% endfor %}
- </ul>
-@@ -31,5 +32,23 @@
- </div>
- {% endif %}
-
-+ {% with num_of_regions=request.user.available_services_regions|length %}
-+ {% if num_of_regions > 1 %}
-+ <div id="services_region_switcher" class="dropdown switcher_bar" tabindex="1">
-+ <a class="dropdown-toggle" data-toggle="dropdown" href="#services_region_switcher">
-+ <h4>{% trans "Managing Region" %}</h4>
-+ <h3>{{ request.user.services_region }}</h3>
-+ </a>
-+
-+ <ul id="services_regions_list" class="dropdown-menu">
-+ <li class='divider'></li>
-+ {% for region in request.user.available_services_regions %}
-+ <li><a href="{% url 'switch_services_region' region %}?next={{ request.horizon.panel.get_absolute_url }}">{{ region }}</a></li>
-+ {% endfor %}
-+ </ul>
-+ </div>
-+ {% endif %}
-+ {% endwith %}
-+
- {% horizon_dashboard_nav %}
- </div>
+++ /dev/null
-From daed1adb7fa46c0398542f88ebf002088daf96b3 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-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;
- }
+++ /dev/null
-From 2c3a2c7c2c7e0d396bc80ebfa9fdc2af773050c1 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-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
Name: python-django-horizon
-Version: 2013.2
+Version: 2013.2.3
Release: 1%{?dist}
Summary: Django application for talking to Openstack
# Code in horizon/horizon/utils taken from django which is BSD
License: ASL 2.0 and BSD
URL: http://horizon.openstack.org/
-BuildArch: noarch
-Source0: horizon-2013.2.2.fuel4.1.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
Source11: rh-logo.png
#
-# patches_base=2013.2
+# patches_base=2013.2.3
#
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
+Patch0005: 0005-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch
+Patch0006: 0006-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch
+
#mirantis OpenStack patch
Patch0100: mos-disable-metering.patch
Patch0101: mos-fix-murano-savana-dashboard.patch
+BuildArch: noarch
+## epel6 has a separate Django14 package
+#%if 0%{?rhel}==6
+#Requires: Django14
+#BuildRequires: Django14
+#%else
+#BuildRequires: Django
+#Requires: Django
+#%endif
# Migrate to Django 15 (python-django)
BuildRequires: python-django
Requires: python-django
-
Requires: python-dateutil
Requires: pytz
Requires: python-lockfile
+Requires: python-pbr
BuildRequires: python2-devel
BuildRequires: python-setuptools
+BuildRequires: git
BuildRequires: python-d2to1
BuildRequires: python-pbr >= 0.5.21
BuildRequires: python-lockfile
Requires: python-swiftclient
Requires: python-heatclient
Requires: python-ceilometerclient >= 1.0.5
-# Requires: python-troveclient
+Requires: python-troveclient
Requires: python-netaddr
Requires: python-oslo-config
-Requires: python-lesscpy
+Requires: python-eventlet
BuildRequires: python2-devel
BuildRequires: python-django-openstack-auth >= 1.0.11
BuildRequires: python-swiftclient
BuildRequires: python-heatclient
BuildRequires: python-ceilometerclient
-# BuildRequires: python-troveclient
+BuildRequires: python-troveclient
+BuildRequires: python-oslo-sphinx
%description doc
Documentation for the Django Horizon application for talking with Openstack
%prep
%setup -q -n horizon-%{version}
-
+## Use git to manage patches.
+## http://rwmj.wordpress.com/2011/08/09/nice-rpm-git-patch-management-trick/
+#git init
+#git config user.email "python-django-horizon-owner@fedoraproject.org"
+#git config user.name "python-django-horizon"
+#git add .
+#git commit -a -q -m "%{version} baseline"
+#git am %{patches}
%patch0001 -p1
%patch0002 -p1
%patch0003 -p1
%patch0004 -p1
%patch0005 -p1
%patch0006 -p1
-%patch0007 -p1
-%patch0008 -p1
-%patch0009 -p1
-%patch0010 -p1
%patch0100 -p1
%patch0101 -p1
+
# remove unnecessary .po files
find . -name "django*.po" -exec rm -f '{}' \;
# create /var/run/openstack-dashboard/ and own it
mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard
+
+# create /var/log/horizon and own it
+mkdir -p %{buildroot}%{_var}/log/horizon
+
#%check
#sed -i 's:^SECRET_KEY =.*:SECRET_KEY = "badcafe":' openstack_dashboard/local/local_settings.py
#./run_tests.sh -N
%dir %attr(0750, root, apache) %{_sysconfdir}/openstack-dashboard
%dir %attr(0750, apache, apache) %{_sharedstatedir}/openstack-dashboard
+%dir %attr(0750, apache, apache) %{_var}/log/horizon
%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
%{_datadir}/openstack-dashboard/openstack_dashboard_theme
%changelog
-* Fri Oct 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-1
+* Thu Apr 10 2014 Matthias Runge <mrunge@redhat.com> - 2013.2.3-1
+- rebase to 2013.2.3
+- fix CVE-2014-0157 (rhbz#1085826)
+
+* Fri Feb 14 2014 Matthias Runge <mrunge@redhat.com> - 2013.2.2-1
+- rebase to 2013.2.2
+
+* Wed Dec 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2.1-1
+- rebase to 2013.2.1
+
+* Tue Dec 03 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-4
+- fix CVE-2013-6406 (RHBZ#1035914)
+
+* Thu Nov 21 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-3
+- add runtime requiremt python-pbr
+
+* Fri Oct 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-2
- Horizon-2013.2 final
+- create /var/log/horizon
+- add requirement to python-eventlet
* Thu Oct 17 2013 Matthias Runge <mrunge@redhat.com> - 2013.2.0.15.rc3
- rebase to Havana-rc3