The OpenStack Dashboard Site Title branding (i.e. “OpenStack Dashboard”) can be overwritten by adding the attribute SITE_BRANDING to local_settings.py with the value being the desired name.
The file local_settings.py can be found at the Horizon directory path of horizon/openstack-dashboard/local/local_settings.py.
The OpenStack Logo is pulled in through style.css:
#splash .modal {
background: #fff url(../images/logo.png) no-repeat center 35px;
h1.brand a {
background: url(../images/logo.png) top left no-repeat;
To override the OpenStack Logo image, replace the image at the directory path horizon/openstack-dashboard/dashboard/static/dashboard/images/logo.png.
The dimensions should be width: 108px, height: 121px.
If you wish to alter dashboards or panels which are not part of your codebase, you can specify a custom python module which will be loaded after the entire Horizon site has been initialized, but prior to the URLconf construction. This allows for common site-customization requirements such as:
To specify the python module containing your modifications, add the key customization_module to your settings.HORIZON_CONFIG dictionary. The value should be a string containing the path to your module in dotted python path notation. Example:
HORIZON_CONFIG = {
"customization_module": "my_project.overrides"
}
You can do essentially anything you like in the customization module. For example, you could change the name of a panel:
from django.utils.translation import ugettext_lazy as _
import horizon
# Rename "User Settings" to "User Options"
settings = horizon.get_dashboard("settings")
user_panel = settings.get_panel("user")
user_panel.name = _("User Options")
Or get the instances panel:
projects_dashboard = horizon.get_dashboard("project")
instances_panel = projects_dashboard.get_panel("instances")
And limit access to users with the Keystone Admin role:
permissions = list(getattr(instances_panel, 'permissions', []))
permissions.append('openstack.roles.admin')
instances_panel.permissions = tuple(permissions)
Or just remove it entirely:
projects_dashboard.unregister(instances_panel.__class__)
Note
my_project.overrides needs to be importable by the python process running Horizon. If your module is not installed as a system-wide python package, you can either make it installable (e.g., with a setup.py) or you can adjust the python path used by your WSGI server to include its location.
Probably the easiest way is to add a python-path argument to the WSGIDaemonProcess line in Apache’s Horizon config.
Assuming your my_project module lives in /opt/python/my_project, you’d make it look like the following:
WSGIDaemonProcess [... existing options ...] python-path=/opt/python
Horizon provides hooks for customizing the look and feel of each class of button on the site. The following classes are used to identify each type of button:
Additionally, the site-wide default button classes can be configured by setting ACTION_CSS_CLASSES to a tuple of the classes you wish to appear on all action buttons in your local_settings.py file.