# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, OpenStack Foundation
# This file is distributed under the same license as the horizon package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: horizon 20.0.1.dev7\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-02 08:36+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../../../docstring of openstack_auth.utils.LOG:5
msgid ""
"Calling \"patch_middleware_get_user\" is done in our custom middleware at "
"\"openstack_auth.middleware\" to monkeypatch the code in before it is needed."
msgstr ""

#: ../../../docstring of openstack_auth.utils.LOG:1
msgid ""
"We need the request object to get the user, so we'll slightly modify the "
"existing django.contrib.auth.get_user method. To do so we update the auth "
"middleware to point to our overridden method."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:1 of
msgid "A base class for defining Horizon dashboard panels."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:1 of
msgid "A base class for defining Horizon dashboards."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.PanelGroup:1 of
msgid "A container for a set of :class:`~horizon.Panel` classes."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.PanelGroup:17 of
msgid ""
"A list of panel module names which should be contained within this grouping."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:60 of
msgid ""
"A list of permission names, all of which a user must possess in order to "
"access any panel registered with this dashboard. This attribute is combined "
"cumulatively with any permissions required on individual :class:`~horizon."
"Panel` classes."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:20 of
msgid ""
"A list of permission names, all of which a user must possess in order to "
"access any view associated with this panel. This attribute is combined "
"cumulatively with any permissions required on the ``Dashboard`` class with "
"which it is registered."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:16 of
msgid ""
"A unique \"short name\" for the dashboard. The slug is used as a component "
"of the URL path for the dashboard. Default: ``''``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:15 of
msgid ""
"A unique \"short name\" for the panel. The slug is used as a component of "
"the URL path for the panel. Default: ``''``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.PanelGroup:8 of
msgid "A unique string to identify this panel group. Required."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.PanelGroup:12 of
msgid ""
"A user-friendly name which will be used as the group heading in places such "
"as the navigation. Default: ``None``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:3 of
msgid ""
"All Horizon dashboard panels should extend from this class. It provides the "
"appropriate hooks for automatically constructing URLconfs, and providing "
"permission-based access control."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:3 of
msgid ""
"All Horizon dashboards should extend from this base class. It provides the "
"appropriate hooks for automatic discovery of :class:`~horizon.Panel` "
"modules, automatically constructing URLconfs, and providing permission-based "
"access control."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_user_home:7 of
msgid ""
"An alternative function can be supplied to customize this behavior by "
"specifying a either a URL or a function which returns a URL via the ``"
"\"user_home\"`` key in ``HORIZON_CONFIG``. Each of these would be valid::"
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_dashboards:7 of
msgid ""
"Any remaining :class:`~horizon.Dashboard` classes registered with Horizon "
"but not listed in ``HORIZON_CONFIG['dashboards']`` will be appended to the "
"end of the list alphabetically."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:34 of
msgid ""
"Automatically generated navigation will use the order of the modules in this "
"attribute."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:79 of
msgid ""
"Boolean value to determine whether this dashboard can be viewed without "
"being logged in. Defaults to ``False``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.allowed:3 of
msgid ""
"Checks for access to any panels in the dashboard and of the dashboard itself."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.allowed:1 of
msgid "Checks for role based access for this dashboard."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:37 of
msgid "Default: ``[]``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_default_dashboard:3
#: of
msgid ""
"If ``\"default_dashboard\"`` is specified in ``HORIZON_CONFIG`` then that "
"dashboard will be returned. If not, the first dashboard returned by :func:"
"`~horizon.get_dashboards` will be returned."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:67 of
msgid ""
"Optional path to a URLconf of additional views for this dashboard which are "
"not connected to specific panels. Default: ``None``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_dashboards:3 of
msgid ""
"Orders dashboards according to the ``\"dashboards\"`` key in "
"``HORIZON_CONFIG`` or else returns all registered dashboards in alphabetical "
"order."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_panels:3 of
msgid "Panel grouping information is not included."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:48 of
msgid ""
"Panel modules must be listed in ``panels`` in order to be discovered by the "
"automatic registration mechanism."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:27 of
msgid ""
"Path to a URLconf of views for this panel using dotted Python notation. If "
"no value is specified, a file called ``urls.py`` living in the same package "
"as the ``panel.py`` file is used. Default: ``None``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.register:1 of
msgid "Registers a :class:`~horizon.Dashboard` with Horizon."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.register:1 of
msgid "Registers a :class:`~horizon.Panel` with this dashboard."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_panel_group:3
#: of
msgid "Returns None if not registered."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_dashboards:1 of
msgid "Returns an ordered tuple of :class:`~horizon.Dashboard` modules."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_panel:1 of
msgid "Returns the Panel instance registered with this dashboard."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_panels:1 of
msgid "Returns the Panel instances registered with this dashboard in order."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_default_dashboard:1
#: of
msgid "Returns the default :class:`~horizon.Dashboard` instance."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_absolute_url:1 of
msgid "Returns the default URL for Horizon's URLconf."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_user_home:1 of
msgid "Returns the default URL for a particular user."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_absolute_url:1
#: of
msgid "Returns the default URL for this dashboard."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel.get_absolute_url:1 of
msgid "Returns the default URL for this panel."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_dashboard:1 of
msgid "Returns the specified :class:`~horizon.Dashboard` instance."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_panel_group:1
#: of
msgid "Returns the specified :class:~horizon.PanelGroup."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:41 of
msgid ""
"The ``name`` argument for the URL pattern which corresponds to the index "
"view for this ``Panel``. This is the view that :meth:`.Panel."
"get_absolute_url` will attempt to reverse."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:72 of
msgid ""
"The ``nav`` attribute can be either a boolean value or a callable which "
"accepts a ``RequestContext`` object as a single argument to control whether "
"or not this dashboard should appear in automatically-generated navigation. "
"Default: ``True``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:34 of
msgid ""
"The ``nav`` attribute can be either a boolean value or a callable which "
"accepts a ``RequestContext`` object as a single argument to control whether "
"or not this panel should appear in automatically-generated navigation. "
"Default: ``True``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:21 of
msgid ""
"The ``panels`` attribute can be either a flat list containing the name of "
"each panel **module**  which should be loaded as part of this dashboard, or "
"a list of :class:`~horizon.PanelGroup` classes which define groups of panels "
"as in the following example::"
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.get_absolute_url:3
#: of
msgid ""
"The default URL is defined as the URL pattern with ``name=\"index\"`` in the "
"URLconf for the :class:`~horizon.Panel` specified by :attr:`~horizon."
"Dashboard.default_panel`."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel.get_absolute_url:3 of
msgid ""
"The default URL is defined as the URL pattern with ``name=\"index\"`` in the "
"URLconf for this panel."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_absolute_url:3 of
msgid ""
"The default URL is determined by calling :meth:`~horizon.Dashboard."
"get_absolute_url` on the :class:`~horizon.Dashboard` instance returned by :"
"meth:`~horizon.get_default_dashboard`."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:10 of
msgid ""
"The name of the dashboard. This will be displayed in the auto-generated "
"navigation and various other places. Default: ``''``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:53 of
msgid ""
"The name of the panel which should be treated as the default panel for the "
"dashboard, i.e. when you visit the root URL for this dashboard, that's the "
"panel that is displayed. Default: ``None``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:9 of
msgid ""
"The name of the panel. This will be displayed in the auto-generated "
"navigation and various other places. Default: ``''``."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard:41 of
msgid ""
"The values for this attribute should not correspond to the :attr:`~.Panel."
"name` attributes of the ``Panel`` classes. They should be the names of the "
"Python modules in which the ``panel.py`` files live. This is used for the "
"automatic loading and registration of ``Panel`` classes much like Django's "
"``ModelAdmin`` machinery."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_user_home:17 of
msgid ""
"This can be useful if the default dashboard may not be accessible to all "
"users. When user_home is missing from HORIZON_CONFIG, it will default to the "
"settings.LOGIN_REDIRECT_URL value."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.get_user_home:3 of
msgid ""
"This method can be used to customize where a user is sent when they log in, "
"etc. By default it returns the value of :meth:`get_absolute_url`."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.allowed:6 of
msgid ""
"This method should be overridden to return the result of any policy checks "
"required for the user to access this dashboard when more complex checks are "
"required."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Panel:47 of
msgid ""
"This optional static method can be used to specify conditions that need to "
"be satisfied to load this panel. Unlike ``permissions`` and ``allowed`` this "
"method is intended to handle settings based conditions rather than user "
"based permission and policy checks. The return value is boolean. If the "
"method returns ``True``, then the panel will be registered and available to "
"user (if ``permissions`` and ``allowed`` runtime checks are also satisfied). "
"If the method returns ``False``, then the panel will not be registered and "
"will not be available via normal navigation or direct URL access."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Site.unregister:1 of
msgid "Unregisters a :class:`~horizon.Dashboard` from Horizon."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.Dashboard.unregister:1 of
msgid "Unregisters a :class:`~horizon.Panel` from this dashboard."
msgstr ""

#: ../../../horizon/base.py:docstring horizon.base.PanelGroup:3 of
msgid ""
"When iterated, it will yield each of the ``Panel`` instances it contains."
msgstr ""

#: ../../../horizon/context_processors.py:docstring
#: horizon.context_processors:1 of
msgid "Context processors used by Horizon."
msgstr ""

#: ../../../horizon/context_processors.py:docstring
#: horizon.context_processors.horizon:9 of
msgid ""
"Don't put API calls in context processors; they will be called once for each "
"template/template fragment which takes context that is used to render the "
"complete output."
msgstr ""

#: ../../../horizon/context_processors.py:docstring
#: horizon.context_processors.horizon:3 of
msgid ""
"It adds the Horizon config to the context as well as setting the names "
"``True`` and ``False`` in the context to their boolean equivalents for "
"convenience."
msgstr ""

#: ../../../horizon/context_processors.py:docstring
#: horizon.context_processors.horizon:1 of
msgid "The main Horizon context processor. Required for Horizon to function."
msgstr ""

#: ../../../horizon/decorators.py:docstring
#: horizon.decorators.require_component_access:3 of
msgid ":param component containing the view (panel or dashboard)."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_perms:3
#: of
msgid ""
"A tuple of permission names, all of which the request user must possess in "
"order access the decorated view."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_perms:1
#: of
msgid "Enforces permission-based access controls."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_perms:6
#: of
msgid "Example usage::"
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators:1 of
msgid "General-purpose decorators for use with Horizon."
msgstr ""

#: ../../../horizon/decorators.py:docstring
#: ../../../openstack_auth/forms.py:docstring
#: ../../../openstack_auth/user.py:docstring
#: ../../../openstack_auth/utils.py:docstring
#: ../../../openstack_auth/views.py:docstring
#: horizon.decorators.require_perms:0 of
#: openstack_auth.forms.DummyAuth.get_headers:0
#: openstack_auth.user.User.is_token_expired:0
#: openstack_auth.utils.get_client_ip:0 openstack_auth.utils.get_websso_url:0
#: openstack_auth.utils.is_token_valid:0
#: openstack_auth.utils.store_initial_k2k_session:0
#: openstack_auth.views.logout:0
msgid "Parameters"
msgstr ""

#: ../../../horizon/decorators.py:docstring
#: horizon.decorators.require_component_access:1 of
msgid "Perform component can_access check to access the view."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_auth:1
#: of
msgid "Performs user authentication check."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_perms:15
#: of
msgid ""
"Raises a :exc:`~horizon.exceptions.NotAuthorized` exception if the "
"requirements are not met."
msgstr ""

#: ../../../horizon/decorators.py:docstring
#: horizon.decorators.require_component_access:5 of
msgid ""
"Raises a :exc:`~horizon.exceptions.NotAuthorized` exception if the user "
"cannot access the component containing the view. By example the check of "
"component policy rules will be applied to its views."
msgstr ""

#: ../../../horizon/decorators.py:docstring horizon.decorators.require_auth:3
#: of
msgid ""
"Similar to Django's `login_required` decorator, except that this throws :exc:"
"`~horizon.exceptions.NotAuthenticated` exception if the user is not signed-"
"in."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.ServiceCatalogException:1 of
msgid "A requested service is not available in the ``ServiceCatalog``."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.AlreadyExists:1
#: of
msgid "API resources tried to create already exists."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:20 of
msgid ""
"All other exceptions bubble the stack as normal unless the ``ignore`` "
"argument is passed in as ``True``, in which case only unrecognized errors "
"are bubbled."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.HorizonException:1 of
msgid "Base exception class for distinguishing our own exception classes."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:3 of
msgid ""
"Because Horizon consumes so many different APIs with completely different "
"``Exception`` types, it's necessary to have a centralized place for handling "
"exceptions which may be raised."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:1 of
msgid "Centralized error handling for Horizon."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.check_message:1
#: of
msgid "Checks an exception for given keywords and raises an error if found."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.HorizonReporterFilter:1 of
msgid "Error report filter that's always active, even in DEBUG mode."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.MessageFailure:1
#: of
msgid "Exception raised during message notification."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.WorkflowValidationError:1 of
msgid "Exception raised during workflow validation."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.ConfigurationError:1 of
msgid "Exception to be raised when invalid settings have been provided."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.WorkflowError:1
#: of
msgid "Exception to be raised when something goes wrong in a workflow."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.NotAvailable:1
#: of
msgid "Exception to be raised when something is not available."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.GetFileError:1
#: of
msgid "Exception to be raised when the value of get_file is not expected."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.Http302:1 of
msgid "Exception used to redirect at the middleware level."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:7 of
msgid "Exceptions are roughly divided into 3 types:"
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions:1 of
msgid ""
"Exceptions raised by the Horizon code and the machinery for handling them."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.BadRequest:1 of
msgid "Generic error to replace all \"BadRequest\"-type API errors."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.Conflict:1 of
msgid "Generic error to replace all \"Conflict\"-type API errors."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.NotFound:1 of
msgid "Generic error to replace all \"Not Found\"-type API errors."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.RecoverableError:1 of
msgid "Generic error to replace any \"Recoverable\"-type API errors."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:24 of
msgid ""
"If the exception is not re-raised, an appropriate wrapper exception class "
"indicating the type of exception that was encountered will be returned. If "
"details is None (default), take it from exception sys.exc_info. If details "
"is other string, then use that string explicitly or if details is empty then "
"suppress it."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.WorkflowValidationError:3 of
msgid ""
"It is raised if required data is missing, or existing data is not valid."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.HandledException:3 of
msgid ""
"It is used to track exceptions that have gone through :func:`horizon."
"exceptions.handle` more than once."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.check_message:3
#: of
msgid ""
"It raises a new ``ActionError`` with the desired message if the keywords are "
"found. This allows selective control over API error messages."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.NotAuthenticated:1 of
msgid ""
"Raised when a user is trying to make requests and they are not logged in."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.NotAuthorized:3
#: of
msgid ""
"Raised whenever a user attempts to access a resource which they do not have "
"permission-based access to (such as when failing the :func:`~horizon."
"decorators.require_perms` decorator)."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.GetFileError:3
#: of
msgid ""
"The expected values start with https:// or http://. Otherwise this exception "
"will be raised."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.NotAuthenticated:3 of
msgid ""
"The included :class:`~horizon.middleware.HorizonMiddleware` catches "
"``NotAuthenticated`` and handles it gracefully by displaying an error "
"message and redirecting the user to a login page."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.NotAuthorized:7
#: of
msgid ""
"The included :class:`~horizon.middleware.HorizonMiddleware` catches "
"``NotAuthorized`` and handles it gracefully by displaying an error message "
"and redirecting the user to a login page."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.Http302:3 of
msgid ""
"This error class which can be raised from within a handler to cause an early "
"bailout and redirect at the middleware level."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.HorizonReporterFilter.is_active:1 of
msgid ""
"This filter is to add safety in production environments (i.e. DEBUG is "
"False). If DEBUG is True then your site is not safe anyway. This hook is "
"provided as a convenience to easily activate or deactivate the filter on a "
"per request basis."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.HandledException:1 of
msgid "Used internally to track exceptions that are already handled."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.NotAuthorized:1
#: of
msgid "User tries to access a resource without sufficient permissions."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:11 of
msgid ""
"``NOT_FOUND``: Errors resulting from objects which could not be located via "
"the API. These generally result in a user-facing error message, but are "
"otherwise returned to the normal code flow. Optionally a redirect value may "
"be passed to the error handler so users are returned to a different view "
"than the one requested in addition to the error message."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:17 of
msgid ""
"``RECOVERABLE``: Generic API errors which generate a user-facing message but "
"drop directly back to the regular code flow."
msgstr ""

#: ../../../horizon/exceptions.py:docstring
#: horizon.exceptions.ServiceCatalogException:3 of
msgid "``ServiceCatalog`` is fetched from Keystone."
msgstr ""

#: ../../../horizon/exceptions.py:docstring horizon.exceptions.handle:9 of
msgid ""
"``UNAUTHORIZED``: Errors resulting from authentication or authorization "
"problems. These result in being logged out and sent to the login screen."
msgstr ""

#: ../../../horizon/forms/base.py:docstring
#: horizon.forms.base.SelfHandlingForm:1 of
msgid "A base Form class which includes processing logic in its subclasses."
msgstr ""

#: ../../../horizon/forms/base.py:docstring horizon.forms.base.DateForm:1 of
msgid "A simple form for selecting a range of time."
msgstr ""

#: ../../../horizon/forms/base.py:docstring
#: horizon.forms.base.SelfHandlingForm.api_error:1 of
msgid "Adds an error to the form's error dictionary."
msgstr ""

#: ../../../horizon/forms/base.py:docstring
#: horizon.forms.base.SelfHandlingForm.api_error:3 of
msgid ""
"It can be used after validation based on problems reported via the API. This "
"is useful when you wish for API errors to appear as errors on the form "
"rather than using the messages framework."
msgstr ""

#: ../../../horizon/forms/base.py:docstring
#: horizon.forms.base.SelfHandlingForm.set_warning:1 of
msgid "Sets a warning on the form."
msgstr ""

#: ../../../horizon/forms/base.py:docstring
#: horizon.forms.base.SelfHandlingForm.set_warning:3 of
msgid "Unlike NON_FIELD_ERRORS, this doesn't fail form validation."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget:22 of
msgid ""
"A callable used to render additional HTML attributes for the option object. "
"It returns a dictionary containing the html attributes and their values. For "
"example, to define a title attribute for the choices::"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget:17 of
msgid "A callable used to render the display value from the option object."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicSelectWidget:3 of
msgid ""
"A subclass of the ``Select`` widget which renders extra attributes for use "
"in callbacks to handle dynamic changes to the available choices."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ChoiceInput:3 of
msgid ""
"An object used by ChoiceFieldRenderer that represents a single <input "
"type='$input_type'>."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.IPField:22
#: of
msgid ""
"Boolean flag to validate subnet masks along with IP address. E.g: 10.0.0.1/32"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ThemableSelectWidget:1 of
msgid "Bootstrap base select field widget."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ThemableChoiceField:1 of
msgid "Bootstrap based select field."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ThemableCheckboxInput:1 of
msgid "Checkbox widget which renders extra markup."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicChoiceField:1 of
msgid "ChoiceField that make dynamically updating its elements easier."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ChoiceInput:1 of
msgid "ChoiceInput class from django 1.10.7 codebase"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget:1 of
msgid "Custom select widget."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.MultiIPField:1 of
msgid "Extends IPField to allow comma-separated lists of addresses."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.IPField:1 of
msgid "Form field for entering IP/range values, with validation."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.MACAddressField:1 of
msgid "Form field for entering a MAC address with validation."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget.build_attrs:1 of
msgid "Helper function for building an attribute dictionary."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget:3 of
msgid ""
"It allows to render data-xxx attributes from choices. This widget also "
"allows user to specify additional html attributes for choices."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ThemableCheckboxInput:3 of
msgid "It is used to allow a custom checkbox experience."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ExternalUploadMeta:1 of
msgid "Metaclass to process ExternalFileField fields in a specific way."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicChoiceField:3 of
msgid ""
"Notably, the field declaration takes an extra argument, ``add_item_link`` "
"which may be a string or callable defining the URL that should be used for "
"the \"add\" link associated with the field."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicSelectWidget.render:1
#: horizon.forms.fields.SelectWidget.render:1
#: horizon.forms.fields.ThemableCheckboxInput.render:1
#: horizon.forms.fields.ThemableSelectWidget.render:1 of
msgid "Render the widget as an HTML string."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ExternalUploadMeta:3 of
msgid ""
"Set this class as the metaclass of a form that contains ExternalFileField in "
"order to process ExternalFileField fields in a specific way. A hidden "
"CharField twin of FieldField is created which contains just the filename (if "
"any file was selected on browser side) and a special `clean` method for "
"FileField is defined which extracts just file name. This allows to avoid "
"actual file upload to Django server, yet process form clean() phase as "
"usual. Actual file upload happens entirely on client-side."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicTypedChoiceField:1 of
msgid "Simple mix of ``DynamicChoiceField`` and ``TypedChoiceField``."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ThemableDynamicTypedChoiceField:1 of
msgid "Simple mix of ``ThemableDynamicChoiceField`` & ``TypedChoiceField``."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.SubWidget:3
#: of
msgid ""
"Some widgets are made of multiple HTML elements -- namely, RadioSelect. This "
"is a class that represents the \"inner\" HTML element of a widget."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ExternalFileField:1 of
msgid "Special FileField to upload file to some external location."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.SelectWidget:9 of
msgid ""
"Specifies object properties to serialize as data-xxx attribute. If passed "
"('id', ), this will be rendered as: <option data-id=\"123\">option_value</"
"option> where 123 is the value of choice_value.id"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.IPField:15
#: of
msgid ""
"Specifies which IP version to validate, valid values are 1 (fields.IPv4), 2 "
"(fields.IPv6) or both - 3 (fields.IPv4 | fields.IPv6). Defaults to IPv4 (1)"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.SubWidget:1
#: of
msgid "SubWidget class from django 1.10.7 codebase"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring horizon.forms.fields.IPField:3 of
msgid ""
"Supports IPv4/IPv6 in the format: .. xxx.xxx.xxx.xxx .. xxx.xxx.xxx.xxx/"
"zz .. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff .. ffff:ffff:ffff:ffff:ffff:"
"ffff:ffff:ffff/zz and all compressed forms. Also the short forms are "
"supported: xxx/yy xxx.xxx/yy"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.MACAddressField:3 of
msgid ""
"Supports all formats known by netaddr.EUI(), for example: .. xx:xx:xx:xx:xx:"
"xx .. xx-xx-xx-xx-xx-xx .. xxxx.xxxx.xxxx"
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.ExternalFileField:3 of
msgid ""
"This is a special flavor of FileField which is meant to be used in cases "
"when instead of uploading file to Django it should be uploaded to some "
"external location, while the form validation is done as usual. It should be "
"paired with ExternalUploadMeta metaclass embedded into the Form class."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.IPField.clean:1
#: horizon.forms.fields.MACAddressField.clean:1
#: horizon.forms.fields.MultiIPField.clean:1 of
msgid ""
"Validate the given value and return its \"cleaned\" value as an appropriate "
"Python object. Raise ValidationError for any errors."
msgstr ""

#: ../../../horizon/forms/fields.py:docstring
#: horizon.forms.fields.DynamicSelectWidget:1 of
msgid "``Select`` widget to handle dynamic changes to the available choices."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView:3 of
msgid ""
"All view which handles forms in Horiozn should inherit this class. It takes "
"care of all details with processing :class:`~horizon.forms.base."
"SelfHandlingForm` classes, and modal concerns when the associated template "
"inherits from `horizon/common/_modal_form.html`."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_object_id:3 of
msgid ""
"For  dynamic insertion of resources created in modals, this method returns "
"the id of the created object. Defaults to returning the ``id`` attribute."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_object_display:3 of
msgid ""
"For dynamic insertion of resources created in modals, this method returns "
"the display name of the created object. Defaults to returning the ``name`` "
"attribute."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.form_invalid:1 of
msgid "If the form is invalid, render the invalid form."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: ../../../openstack_auth/views.py:docstring
#: horizon.forms.views.ModalFormView.form_valid:1 of
#: openstack_auth.views.PasswordView.form_valid:1
msgid "If the form is valid, redirect to the supplied URL."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_context_data:1 of
msgid "Insert the form into the context dict."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalBackdropMixin:1 of
msgid "Mixin class to allow ModalFormView and WorkflowView together."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_form:1 of
msgid "Returns an instance of the form to be used in this view."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_object_id:1 of
msgid "Returns the ID of the created object."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView.get_object_display:1 of
msgid "Returns the display name of the created object."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView:12 of
msgid ""
"See Django's documentation on the `FormView <https://docs.djangoproject.com /"
"en/dev/ref/class-based-views/generic-editing/#formview>`_ class for more "
"details."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView:9 of
msgid ""
"Subclasses must define a ``form_class`` and ``template_name`` attribute at "
"minimum."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalFormView:1 of
msgid "The main view class for all views which handle forms in Horizon."
msgstr ""

#: ../../../horizon/forms/views.py:docstring
#: horizon.forms.views.ModalBackdropMixin:3 of
msgid ""
"This mixin class is to be used for together with ModalFormView and "
"WorkflowView classes to augment them with modal_backdrop context data."
msgstr ""

#: ../../../horizon/middleware/base.py:docstring
#: horizon.middleware.base.HorizonMiddleware.process_exception:1 of
msgid "Catches internal Horizon exception classes."
msgstr ""

#: ../../../horizon/middleware/base.py:docstring
#: horizon.middleware.base.HorizonMiddleware.process_exception:3 of
msgid ""
"Exception classes such as NotAuthorized, NotFound and Http302 are caught and "
"handles them gracefully."
msgstr ""

#: ../../../horizon/middleware/base.py:docstring
#: horizon.middleware.base.HorizonMiddleware:1 of
msgid "The main Horizon middleware class. Required for use of Horizon."
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware.process_exception:1
#: of
msgid "Log error info when exception occurred."
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:1 of
msgid "Middleware to output operation log."
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:3 of
msgid "This log can includes information below:"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:6 of
msgid "``domain id``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:5 of
msgid "``domain name``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:16 of
msgid "``http status``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:14 of
msgid "``message``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:15 of
msgid "``method``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:8 of
msgid "``project id``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:7 of
msgid "``project name``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:12 of
msgid "``referer url``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:17 of
msgid "``request parameters``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:11 of
msgid "``request scheme``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:13 of
msgid "``request url``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:10 of
msgid "``user id``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:9 of
msgid "``user name``"
msgstr ""

#: ../../../horizon/middleware/operation_log.py:docstring
#: horizon.middleware.operation_log.OperationLogMiddleware:19 of
msgid "and log format is defined in OPERATION_LOG_OPTIONS."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:1 of
msgid "A base class representing a filter action for a table."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:10 horizon.tables.actions.FilterAction:10 of
msgid ""
"A descriptive name used for display purposes. Defaults to the value of "
"``name`` with the first letter of each word capitalized."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction:1 of
msgid "A filter action with fixed buttons."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:40 horizon.tables.actions.LinkAction:20 of
msgid ""
"A list that contains the allowed data types of the action.  If the datum's "
"type is in this list, the action will be shown on the row for the datum."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction:5 of
msgid "A short name or \"slug\" representing this action. Defaults to 'delete'"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:7 of
msgid ""
"A short name or \"slug\" representing this action. Should be one word such "
"as \"delete\", \"add\", \"disable\", etc."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction:14 of
msgid ""
"A string or a callable which resolves to a url to be used as the link "
"target. You must either define the ``url`` attribute or override the "
"``get_link_url`` method on the class."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:15 of
msgid ""
"A string representing the name of the request parameter used for the search "
"term. Default: ``\"q\"``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:20 of
msgid ""
"A string representing the type of this filter. If this is set to ``\"server"
"\"`` then ``filter_choices`` must also be provided. Default: ``\"query\"``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction:10 of
msgid "A string which will be rendered as the link text. (Required)"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction:1 of
msgid "A table action used to perform delete operations on table data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction:1 of
msgid "A table action which is simply a link rather than a form POST."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:1 of
msgid "A table action which takes batch action on one or more objects."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.action:1 of
msgid "Accepts a single object id and performs the specific action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction.action:3 of
msgid ""
"Accepts a single object id passing it over to the delete method responsible "
"for the object's destruction."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction.action:1 of
msgid "Action entry point. Overrides base class' action method."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:65 of
msgid "At least one of the following methods must be defined:"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:25 of
msgid ""
"Boolean value indicating whether or not this action can be taken without any "
"additional input (e.g. an object id). Defaults to ``True``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:30 of
msgid ""
"Boolean value indicating whether this action should be evaluated in the "
"period after the table is instantiated but before the data has been loaded."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:44 of
msgid ""
"Default to be an empty list (``[]``). When set to empty, the action will "
"accept any kind of data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.get_param_name:3 of
msgid ""
"Defaults to ``{{ table.name }}__{{ action.name }}__{{ action.param_name }}``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action.get_param_name:3 of
msgid "Defaults to ``{{ table.name }}__{{ action.name }}``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction:24 of
msgid ""
"Defaults to be an empty list (``[]``). When set to empty, the action will "
"accept any kind of data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.is_api_filter:1 of
msgid "Determine if agiven filter field should be used as an API filter."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.get_fixed_buttons:3 of
msgid "Each list item should be a dict with the following keys:"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:69 of
msgid "Handler for a single-object action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:73 of
msgid "Handler for multi-object actions."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:46 of
msgid ""
"If True, the filter function will be called for the initial GET request with "
"an empty ``filter_string``, regardless of the value of ``method``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction.get_link_url:3 of
msgid ""
"If ``url`` is callable it will call the function. If not, it will then try "
"to call ``reverse`` on ``url``. Failing that, it will simply return the "
"value of ``url`` as-is."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:77 of
msgid ""
"If a single function can work for both single-object and multi-object cases "
"then simply providing a ``handle`` function will internally route both "
"``single`` and ``multiple`` requests to ``handle`` with the calls from "
"``single`` being transformed into a list containing only the single object "
"id."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:22 horizon.tables.actions.DeleteAction:20
#: of
msgid ""
"If tuple or list - then setting self.current_present_action = n will set the "
"current active item from the list(action_present[n])"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:14 horizon.tables.actions.BatchAction:30
#: horizon.tables.actions.DeleteAction:12
#: horizon.tables.actions.DeleteAction:28 of
msgid ""
"Method must accept an integer/long parameter and return the display forms of "
"the name properly pluralised (depending on the integer) and translated in a "
"string or tuple/list."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:27 horizon.tables.actions.DeleteAction:25
#: of
msgid ""
"Method returning a past action name. This is usually used to display a "
"message when the action is completed."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:12 horizon.tables.actions.DeleteAction:10
#: of
msgid ""
"Method returning a present action name. This is used as an action label."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:38 horizon.tables.actions.DeleteAction:36
#: of
msgid ""
"Optional location to redirect after completion of the delete action. "
"Defaults to the current page."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:43 horizon.tables.actions.DeleteAction:41
#: of
msgid ""
"Optional message for providing an appropriate help text for the horizon user."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction.delete:3 of
msgid "Override to provide delete functionality specific to your data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.categorize:1 of
msgid "Override to separate rows into categories."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.get_select_options:1 of
msgid "Provide the value, string, and help_text for the template to render."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.filter:1
#: horizon.tables.actions.FixedFilterAction.filter:1 of
msgid "Provides the actual filtering logic."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring horizon.tables.actions.Action:1
#: of
msgid "Represents an action which can be taken on this table's data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:26 of
msgid ""
"Required for server type filters. A tuple of tuples representing the filter "
"options. Tuple composition should evaluate to (string, string, boolean, "
"string, boolean), representing the following:"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.DeleteAction.delete:1 of
msgid "Required. Deletes an object referenced by obj_id."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring horizon.tables.actions.Action:5
#: horizon.tables.actions.LinkAction:5 of
msgid ""
"Required. The short name or \"slug\" representing this action. This name "
"should not be changed at runtime."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.categorize:7 of
msgid ""
"Return a dict with a key for the value of each fixed button, and a value "
"that is a list of rows in that category."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.action:5 of
msgid "Return values are discarded, errors raised are caught and logged."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.get_fixed_buttons:1 of
msgid "Returns a list of dict describing fixed buttons used for filtering."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.get_default_attrs:1 of
msgid "Returns a list of the default HTML attributes for the action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.get_success_url:1 of
msgid "Returns the URL to redirect to after a successful action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction.get_link_url:1 of
msgid "Returns the final URL based on the value of ``url``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action.get_param_name:1 of
msgid "Returns the full POST parameter name for this action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.get_param_name:1 of
msgid "Returns the full query parameter name for this action."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.update:1 of
msgid "Switches the action verbose name, if needed."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:20 of
msgid ""
"The HTTP method for this action. Defaults to ``POST``. Other methods may or "
"may not succeed currently."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:34 horizon.tables.actions.DeleteAction:32
#: of
msgid "The detail is same as that of ``action_present``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:40 of
msgid ""
"The fifth optional value determines whether or not the choice is displayed "
"to users. It defaults to ``True``. This is useful when the choice needs to "
"be displayed conditionally."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:30 of
msgid "The first value is the filter parameter."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:38 of
msgid ""
"The fourth optional value is used as help text if provided. The default is "
"``None`` which means no help text."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:18 horizon.tables.actions.DeleteAction:16
#: of
msgid ""
"The returned display form is highly recommended to be a complete action name "
"with a form of a transitive verb and an object noun. Each word is "
"capitalized and the string should be marked as translatable."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:31 of
msgid "The second value represents display value."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:5 of
msgid ""
"The short name or \"slug\" representing this action. Defaults to ``\"filter"
"\"``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction:32 of
msgid ""
"The third optional value indicates whether or not it should be applied to "
"the API request as an API query attribute. API type filters do not need to "
"be accounted for in the filter method since the API will do the filtering. "
"However, server type filters in general will need to be performed in the "
"filter method. By default this attribute is not provided (``False``)."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction:3 of
msgid "This action should not require user input on a per-object basis."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:34 of
msgid ""
"This can allow actions which don't need access to the full table data to "
"bypass any API calls and processing which would otherwise be required to "
"load the table."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.BatchAction.action:3 of
msgid "This method is required."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.filter:3
#: horizon.tables.actions.FixedFilterAction.filter:3 of
msgid ""
"This method must be overridden by subclasses and return the filtered data."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.categorize:3 of
msgid ""
"To have filtering working properly on the client, each row will need CSS "
"class(es) beginning with 'category-', followed by the value of the fixed "
"button."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.Action:15 of
msgid ""
"Used like ``verbose_name`` in cases where ``handles_multiple`` is ``True``. "
"Defaults to ``verbose_name`` with the letter \"s\" appended."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.LinkAction.get_link_url:7 of
msgid ""
"When called for a row action, the current row data object will be passed as "
"the first parameter."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.get_fixed_buttons:6 of
msgid "``icon``: Icon class for icon element (inserted before text)."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.get_fixed_buttons:5 of
msgid "``text``: Text to display on the button"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FixedFilterAction.get_fixed_buttons:7 of
msgid ""
"``value``: Value returned when the button is clicked. This value is passed "
"to ``filter()`` as ``filter_string``."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: horizon.tables.actions.FilterAction.get_select_options:3 of
msgid "help_text is returned if applicable."
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: ../../../horizon/workflows/base.py:docstring
#: horizon.tables.actions.Action:49 horizon.workflows.base.Action:39 of
msgid ""
"list of scope and rule tuples to do policy checks on, the composition of "
"which is (scope, rule)"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: ../../../horizon/tables/base.py:docstring
#: ../../../horizon/workflows/base.py:docstring
#: horizon.tables.actions.Action:53 horizon.tables.base.Column:191
#: horizon.workflows.base.Action:43 of
msgid "rule: string representing the action to be checked"
msgstr ""

#: ../../../horizon/tables/actions.py:docstring
#: ../../../horizon/tables/base.py:docstring
#: ../../../horizon/workflows/base.py:docstring
#: horizon.tables.actions.Action:52 horizon.tables.base.Column:190
#: horizon.workflows.base.Action:42 of
msgid "scope: service type managing the policy for action"
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:111 of
msgid ""
"A callable to get the HTML attributes of a column cell depending on the "
"data. For example, to add additional description or help information for "
"data in a column cell (e.g. in Images panel, for the column 'format')::"
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.DataTable:1 of
msgid "A class which defines a table with all data and associated actions."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:1 of
msgid "A class which represents a single column in a :class:`.DataTable`."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:129 of
msgid ""
"A custom CSS class or classes to add to the ``<table>`` tag of the rendered "
"table, for when the particular table requires special styling. Default: ``"
"\"\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:106 of
msgid ""
"A dict of HTML attribute strings which should be added to this column. "
"Example: ``attrs={\"data-foo\": \"bar\"}``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:178 of
msgid ""
"A dict of HTML attribute strings which should be added when the column's "
"text is displayed as a link. Examples: ``link_attrs={\"data-foo\": \"bar\"}"
"``. ``link_attrs={\"target\": \"_blank\", \"class\": \"link-foo link-bar\"}"
"``. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:156 of
msgid ""
"A form field used for inline editing of the column. A django forms.Field can "
"be used or django form.Widget can be used."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:31 of
msgid ""
"A label of a menu button for ``table_actions_menu``. The default is \"Actions"
"\" or \"More Actions\" depending on ``table_actions``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:18 of
msgid ""
"A list of action classes derived from the :class:`~horizon.tables.Action` "
"class. These actions will handle tasks such as bulk deletion, etc. for "
"multiple objects at once."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:24 of
msgid ""
"A list of action classes similar to ``table_actions`` except these will be "
"displayed in a menu instead of as individual buttons. Actions from this list "
"will take precedence over actions from the ``table_actions`` list."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:13 of
msgid ""
"A list of column objects or column names. Controls ordering/display of the "
"columns in the table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:35 of
msgid ""
"A list of data types for which the link should be created. Default is an "
"empty list (``[]``)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:140 of
msgid ""
"A list of data types that this table would accept. Default to be an empty "
"list, but if the attribute ``mixed_data_type`` is set to ``True``, then this "
"list must have at least one element."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:95 of
msgid ""
"A list of functions (often template filters) to be applied to the value of "
"the data for this column prior to output. This is effectively a shortcut for "
"writing a custom ``transform`` function in simple cases."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:161 of
msgid ""
"A list of permission names which this table requires in order to be "
"displayed. Defaults to an empty list (``[]``)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:101 of
msgid ""
"A list or tuple of column names which represents the \"state\" of the data "
"object being represented."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:36 of
msgid ""
"A list similar to ``table_actions`` except tailored to appear for each row. "
"These actions act on a single object at a time."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:9 of
msgid "A more verbose name for the table meant for display purposes."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:5 of
msgid "A short name or slug for the table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:88 of
msgid ""
"A string containing the name of a summation method to be used in the "
"generation of a summary row for this column. By default the options are ``"
"\"sum\"`` or ``\"average\"``, which behave as expected. Optional."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:210 of
msgid ""
"A string of simple help text displayed in a tooltip when you hover over the "
"help icon beside the Column name. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:83 of
msgid ""
"A string or callable to be used for cells which have no data. Defaults to "
"the string ``\"-\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:30 of
msgid ""
"A string or callable which returns a URL which will be wrapped around this "
"column's text as a link."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:5 of
msgid ""
"A string or callable. If ``transform`` is a string, it should be the name of "
"the attribute on the underlying data class which should be displayed in this "
"column. If it is a callable, it will be passed the current row's data at "
"render-time and should return the contents of the cell. Required."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:26 of
msgid ""
"A string uniquely representing this row composed of the table name and the "
"row data object's identifier."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:135 of
msgid ""
"A toggle to indicate if the table accepts two or more types of data. "
"Optional. Default: ``False``"
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:49 of
msgid ""
"A tuple of tuples representing the possible data values for the status "
"column and their associated boolean equivalent. Positive states should "
"equate to ``True``, negative states should equate to ``False``, and "
"indeterminate states should be ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:78 of
msgid ""
"A tuple of tuples representing the possible values to substitute the data "
"when displayed in the column cell."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:133 of
msgid ""
"An integer for the maximum length of the string in this column. If the "
"length of the data in this column is larger than the supplied number, the "
"data for this column will be truncated and an ellipsis will be appended to "
"the truncated data. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:101 of
msgid ""
"An iterable of CSS classes which should be added to this column. Example: "
"``classes=('foo', 'bar')``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:141 of
msgid ""
"An iterable of CSS classes which will be added when the column's text is "
"displayed as a link. This is left for backward compatibility. Deprecated in "
"favor of the link_attributes attribute. Example: ``link_classes=('link-foo', "
"'link-bar')``. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:43 of
msgid ""
"Boolean designating whether or not this column represents a status (i.e. "
"\"enabled/disabled\", \"up/down\", \"active/inactive\"). Default: ``False``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:151 of
msgid ""
"Boolean to control whether or not to show the table's footer. Default: "
"``True``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:156 of
msgid ""
"Boolean to control whether or not to show the table's title. Default: "
"``True``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:25 of
msgid ""
"Boolean to determine whether or not this column should be displayed when "
"rendering the table. Default: ``False``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:20 of
msgid ""
"Boolean to determine whether this column should be sortable or not. Defaults "
"to ``True``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:150 of
msgid ""
"Boolean value indicating whether the contents of this cell should be wrapped "
"in a ``<ul></ul>`` tag. Useful in conjunction with Django's "
"``unordered_list`` template filter. Defaults to ``False``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:36 of
msgid ""
"Boolean value representing the status of this row calculated from the values "
"of the table's ``status_columns`` if they are set."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:41 of
msgid ""
"Boolean value to control rendering of an additional column containing the "
"various actions for each row. Defaults to ``True`` if any actions are "
"specified in the ``row_actions`` option."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:47 of
msgid ""
"Boolean value to control rendering of an extra column with checkboxes for "
"selecting multiple objects in the table. Defaults to ``True`` if any actions "
"are specified in the ``table_actions`` option."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:53 of
msgid ""
"Boolean value to control the display of the \"filter\" search box in the "
"table actions. By default it checks whether or not an instance of :class:`."
"FilterAction` is in ``table_actions``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:45 of
msgid ""
"Boolean value to determine whether ajax updating for this row is enabled."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.DataTable:10
#: of
msgid ""
"Boolean. Read-only access to whether or not this table should display a "
"column for multi-select checkboxes."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.can_be_selected:3 of
msgid ""
"By default if multiselect enabled return True. You can remove the checkbox "
"after an ajax update here if required."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.parse_action:3 of
msgid ""
"By default this parses a string formatted as ``{{ table_name }}"
"__{{ action_name }}__{{ row_id }}`` and returns each of the pieces. The "
"``row_id`` is optional."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_id:3 of
msgid ""
"By default this returns an ``id`` attribute on the given object, but this "
"can be overridden to return other values."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:6 of
msgid "By default, it uses the following logic:"
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_display:3 of
msgid ""
"By default, this returns a ``name`` attribute from the given object, but "
"this can be overridden to return other values."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:1 of
msgid "Contains options for :class:`.DataTable` objects."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.allowed:1 of
msgid "Determine whether processing/displaying the column is allowed."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.check_handler:1 of
msgid "Determine whether the request should be handled by this table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.maybe_preempt:1 of
msgid "Determine whether the request should be handled in earlier phase."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.can_be_selected:1 of
msgid "Determines whether the row can be selected."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:56 of
msgid "Example (these are also the default values)::"
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:159 of
msgid "Example: ``form_field=forms.CharField()``. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row.get_data:1
#: of
msgid "Fetches the updated data for the row based on the given object ID."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_string:3 of
msgid ""
"For 'server' type filters this is saved in the session so that it gets "
"persisted across table loads.  For other filter types this is obtained from "
"the POST dict."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_absolute_url:7 of
msgid ""
"For convenience it defaults to the value of ``request.get_full_path()`` with "
"any query string stripped off, e.g. the path at which the table was "
"requested."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_field:1 of
msgid "Get the filter field value used for 'server' type filters."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_string:1 of
msgid "Get the filter string value."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.maybe_handle:1 of
msgid "Handles table actions if needed."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.inline_update_action:1 of
msgid "Handling update by POST of the cell."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_link_url:3 of
msgid ""
"If ``allowed_data_types`` of this column  is not empty and the datum has an "
"assigned type, check if the datum's type is in the ``allowed_data_types`` "
"list. If not, the datum won't be displayed as a link."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_link_url:8 of
msgid ""
"If ``link`` is a callable, it will be passed the current data object and "
"should return a URL. Otherwise ``get_link_url`` will attempt to call "
"``reverse`` on ``link`` with the object's id as a parameter. Failing that, "
"it will simply return the value of ``link``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:104 of
msgid ""
"If ``status_columns`` is set, when the rows are rendered the value of this "
"column will be used to add an extra class to the row in the form of ``"
"\"status_up\"`` or ``\"status_down\"`` for that row's data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:10 of
msgid "If all statuses are ``True``, return ``True``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:8 of
msgid "If any statuses are ``False``, return ``False``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:9 of
msgid "If no statuses are ``False`` but any or ``None``, return ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.DataTable.has_actions:1 of
msgid "Indicates whether there are any available actions on this table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.inline_edit_handle:1 of
msgid "Inline edit handler."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.load_cells:3 of
msgid ""
"It also set the appropriate row properties which require the row's data to "
"be determined."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.maybe_preempt:3 of
msgid ""
"It determines the request should be handled by a preemptive action on this "
"table or by an AJAX row update before loading any data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.maybe_handle:3 of
msgid ""
"It determines whether the request should be handled by any action on this "
"table after data has been loaded."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.allowed:3 of
msgid "It is determined based on the current request."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:3 of
msgid ""
"It is detremined based on the dictionary of column name to status mappings "
"passed in."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.sanitize_id:3 of
msgid ""
"It is used to modify an incoming obj_id (used in Horizon) to the data type "
"or format expected by the API."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_summation:3 of
msgid ""
"It returns the summary value if a valid summation method is specified for "
"it. Otherwise returns ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:187 of
msgid ""
"List of scope and rule tuples to do policy checks on, the composition of "
"which is (scope, rule)"
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.load_cells:1 of
msgid "Load the row's data and initialize all the cells in the row."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.take_action:1 of
msgid "Locates the appropriate action and routes the object data to it."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_id:8 of
msgid ""
"Make sure that the value returned is a unique value for the id otherwise "
"rendering issues can occur."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row.get_data:3
#: of
msgid "Must be implemented by a subclass to allow AJAX updating."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_raw_data:3 of
msgid ""
"No filters or formatting are applied to the returned data. This is useful "
"when doing calculations on data in the table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.sanitize_id:1 of
msgid "Override to modify an incoming obj_id to match existing API."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.parse_action:1 of
msgid "Parses the ``action_string`` parameter sent back with the POST data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.DataTable:19
#: of
msgid ""
"Read-only access to the data this table represents, filtered by the :meth:"
"`~horizon.tables.FilterAction.filter` method of the table's :class:`~horizon."
"tables.FilterAction` class (if one is provided) using the current request's "
"query parameters."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.DataTable:15
#: of
msgid "Read-only access to the data this table represents."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.render_row_actions:1 of
msgid "Renders the actions specified in ``Meta.row_actions``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.render_table_actions:1 of
msgid "Renders the actions specified in ``Meta.table_actions``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.render:1 of
msgid "Renders the table using the template from the table options."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:1 of
msgid "Represents a row in the table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_first_message:1 of
msgid "Return the message to be displayed first in the filter."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.base.DataTable.get_rows:1
#: horizon.tables.formset.FormsetDataTableMixin.get_rows:1 of
msgid "Return the row data for this table broken out by columns."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.has_more_data:3 of
msgid ""
"Returns True if there is more data available to this table from the source "
"(generally an API)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.has_prev_data:3 of
msgid ""
"Returns True if there is previous data available to this table from the "
"source (generally an API)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:1 of
msgid "Returns a boolean value determining the overall row status."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.has_more_data:1 of
msgid "Returns a boolean value indicating whether there is more data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.has_prev_data:1 of
msgid "Returns a boolean value indicating whether there is previous data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.DataTable.has_actions:3
#: horizon.tables.DataTable.needs_form_wrapper:3 of
msgid "Returns a boolean value."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:41 of
msgid "Returns a css class for the status of the row based on ``status``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_row_status_class:1 of
msgid "Returns a css class name determined by the status value."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_display:1 of
msgid "Returns a display name that identifies this object."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_row_actions:1 of
msgid "Returns a list of the action instances for a specific row."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_table_actions:1 of
msgid "Returns a list of the action instances for this table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.DataTable.needs_form_wrapper:1 of
msgid "Returns if this table should be rendered wrapped in a ``<form>`` tag."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.css_classes:1 of
msgid "Returns the additional CSS class to be added to <table> tag."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.get_cells:1 of
msgid "Returns the bound cells for this row in order."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_absolute_url:1 of
msgid "Returns the canonical URL for this table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_by_id:1 of
msgid "Returns the data object whose ID matches ``loopup`` parameter."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_data:1 of
msgid "Returns the final display data for this column from the given inputs."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_link_url:1 of
msgid "Returns the final value for the column's ``link`` property."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_full_url:1 of
msgid "Returns the full URL path for this table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_prev_marker:1 of
msgid "Returns the identifier for the first object in the current data set."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_marker:1 of
msgid "Returns the identifier for the last object in the current data set."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_id:1 of
msgid "Returns the identifier for the object this row will represent."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_empty_message:1 of
msgid "Returns the message to be displayed when there is no data."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_pagination_string:1 of
msgid "Returns the query parameter string to paginate to the next page."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_prev_pagination_string:1 of
msgid "Returns the query parameter string to paginate to the prev page."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_raw_data:1 of
msgid "Returns the raw data for this column."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_summation:1 of
msgid "Returns the summary value for the data in this column."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_columns:1 of
msgid "Returns this table's columns including auto-generated ones."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:5 of
msgid "Rows are capable of AJAX updating, with a little added work:"
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.inline_edit_handle:3 of
msgid "Showing form or handling update by POST of the cell."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:64 of
msgid ""
"String containing the template which should be used to render the row "
"actions dropdown. Defaults to ``\"horizon/common/"
"_data_table_row_actions_dropdown.html\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:70 of
msgid ""
"String containing the template which should be used to render the row "
"actions. Defaults to ``\"horizon/common/_data_table_row_actions_row.html\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:76 of
msgid ""
"String containing the template which should be used to render the table "
"actions. Defaults to ``\"horizon/common/_data_table_table_actions.html\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:59 of
msgid ""
"String containing the template which should be used to render the table. "
"Defaults to ``\"horizon/common/_data_table.html\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:56 of
msgid ""
"String that is used for the query parameter key to request AJAX updates of "
"cell. Generally you won't need to change this value. It is also used for "
"inline edit of the cell. Default: ``\"cell_update\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:50 of
msgid ""
"String that is used for the query parameter key to request AJAX updates. "
"Generally you won't need to change this value. Default: ``\"row_update\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.DataTable:5 of
msgid ""
"String. Read-only access to the name specified in the table's Meta options."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:7 of
msgid ""
"The ``ajax`` property needs to be set to ``True``, and subclasses need to "
"define a ``get_data`` method which returns a data object appropriate for "
"consumption by the table (effectively the \"get\" lookup versus the table's "
"\"list\" lookup)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:15 of
msgid ""
"The ``statuses`` parameter is passed in as a dictionary mapping column names "
"to their statuses in order to allow this function to be overridden in such a "
"way as to weight one column's status over another should that behavior be "
"desired."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.take_action:3 of
msgid ""
"The action should return an HTTP redirect if successful, or a value which "
"evaluates to ``False`` if unsuccessful."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.render_row_actions:3 of
msgid ""
"The actions are rendered using the current row data. If `row` is True, the "
"actions are rendered in a row of buttons. Otherwise they are rendered in a "
"dropdown box."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:164 of
msgid ""
"The additional html attributes that will be rendered to form_field. Example: "
"``form_field_attributes={'class': 'bold_input_field'}``. Defaults to "
"``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:12 of
msgid ""
"The automatic update interval is configurable by setting the key "
"``ajax_poll_interval`` in the ``HORIZON_CONFIG`` dictionary. Default: "
"``2500`` (measured in milliseconds)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:31 of
msgid ""
"The cells belonging to this row stored in a ``OrderedDict`` object. This "
"attribute is populated during instantiation."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:170 of
msgid ""
"The class that inherits from tables.actions.UpdateAction, update_cell method "
"takes care of saving inline edited data. The tables.base.Row get_data method "
"needs to be connected to table for obtaining the data. Example: "
"``update_action=UpdateCell``. Defaults to ``None``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:124 of
msgid ""
"The class which should be used for handling the columns of this table. "
"Optional. Default: :class:`~horizon.tables.Column`."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:114 of
msgid ""
"The class which should be used for rendering the cells of this table. "
"Optional. Default: :class:`~horizon.tables.Cell`."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:119 of
msgid ""
"The class which should be used for rendering the rows of this table. "
"Optional. Default: :class:`~horizon.tables.Row`."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_by_id:3 of
msgid ""
"The data object is looked up from the table's dataset and the data which "
"matches the ``lookup`` parameter specified. An error will be raised if the "
"match is not a single data object."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:22 of
msgid "The data object which this row represents."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.has_more_data:6
#: horizon.tables.base.DataTable.has_prev_data:6 of
msgid ""
"The method is largely meant for internal use, but if you want to override it "
"to provide custom behavior you can do so at your own risk."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:13 of
msgid ""
"The name for this column which should be used for display purposes. Defaults "
"to the value of ``transform`` with the first letter of each word capitalized "
"if the ``transform`` is not callable, otherwise it defaults to an empty "
"string (``\"\"``)."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:146 of
msgid ""
"The name of an attribute to assign to data passed to the table when it "
"accepts mix data. Default: ``\"_table_data_type\"``"
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:82 of
msgid ""
"The name of the context variable which will contain the table when it is "
"rendered. Defaults to ``\"table\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:87 of
msgid ""
"The name of the query string parameter which will be used when paginating "
"backward in this table. When using multiple tables in a single view this "
"will need to be changed to differentiate between the tables. Default: ``"
"\"prev_marker\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:94 of
msgid ""
"The name of the query string parameter which will be used when paginating "
"forward in this table. When using multiple tables in a single view this will "
"need to be changed to differentiate between the tables. Default: ``\"marker"
"\"``."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Column.get_data:3 of
msgid ""
"The return value will be either the attribute specified for this column or "
"the return value of the attr:`~horizon.tables.Column.transform` method for "
"this column."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_marker:3
#: horizon.tables.base.DataTable.get_prev_marker:3 of
msgid "The return value will be used as marker/limit-based paging in the API."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTableOptions:109 of
msgid ""
"The row status is used by other Horizon components to trigger tasks such as "
"dynamic AJAX updating."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.load_cells:6 of
msgid ""
"The row's data is provided either at initialization or as an argument to "
"this function."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:18 of
msgid "The table which this row belongs to."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_row_status_class:3 of
msgid ""
"This class name is used to indicate the status of the rows in the table if "
"any ``status_columns`` have been specified."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.Row.load_cells:9 of
msgid ""
"This function is called automatically by :meth:`~horizon.tables.Row."
"__init__` if the ``datum`` argument is provided. However, by not providing "
"the data during initialization this function allows for the possibility of a "
"two-step loading pattern when you need a row instance but don't yet have the "
"data available."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_field:3 of
msgid "This is the value from the filter action's list of filter choices."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_absolute_url:3 of
msgid ""
"This is used for the POST action attribute on the form element wrapping the "
"table. In many cases it is also useful for redirecting after a successful "
"action on the table."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_full_url:3 of
msgid ""
"This is used for the POST action attribute on the form element wrapping the "
"table. We use this method to persist the pagination marker."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.calculate_row_status:12 of
msgid ""
"This provides the greatest protection against false positives without "
"weighting any particular columns."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_by_id:10 of
msgid "Uses :meth:`~horizon.tables.DataTable.get_object_id` internally."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:54 of
msgid "Values are compared in a case-insensitive manner."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_object_by_id:7 of
msgid ""
"We will convert the object id and ``lookup`` to unicode before comparison."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Row:3 of
msgid "When iterated, the ``Row`` instance will yield each of its cells."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:38 of
msgid ""
"When the list is empty and the ``link`` attribute is not None, all the rows "
"under this column will be links."
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:193 of
msgid ""
"for a policy that requires a single rule check, policy_rules should look "
"like:"
msgstr ""

#: ../../../horizon/tables/base.py:docstring horizon.tables.base.Column:200 of
msgid ""
"for a policy that requires multiple rule checks, rules should look like:"
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.set_multiselect_column_visibility:1 of
msgid "hide checkbox column if no current table action is allowed."
msgstr ""

#: ../../../horizon/tables/base.py:docstring
#: horizon.tables.base.DataTable.get_filter_first_message:3 of
msgid ""
"when the user needs to provide a search criteria first before loading any "
"data."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTable:1 of
msgid "A DataTable with support for Django Formsets."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTable:9 of
msgid ""
"A class made with ``django.forms.formsets.formset_factory`` containing the "
"definition of the formset to use with this data table."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin:1 of
msgid "A mixin for DataTable to support Django Formsets."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin.get_required_columns:1 of
msgid "Lists names of columns that have required fields."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTable:3 of
msgid ""
"Note that :attr:`horizon.tables.DataTableOptions.row_class` and :attr:"
"`horizon.tables.DataTaleOptions.cell_class` are overwritten in this class, "
"so setting them in ``Meta`` has no effect."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin.get_formset:1 of
msgid "Provide the formset corresponding to this DataTable."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin.get_empty_row:1 of
msgid "Return a row with no data, for adding at the end of the table."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTable:12 of
msgid ""
"The columns that are named the same as the formset fields will be replaced "
"with form widgets in the table. Any hidden fields from the formset will also "
"be included. The fields that are not hidden and don't correspond to any "
"column will not be included in the form."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin.get_rows:3 of
msgid ""
"The row objects get an additional ``form`` parameter, with the formset form "
"corresponding to that row."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin:3 of
msgid ""
"This works the same as the ``FormsetDataTable`` below, but can be used to "
"add to existing DataTable subclasses."
msgstr ""

#: ../../../horizon/tables/formset.py:docstring
#: horizon.tables.formset.FormsetDataTableMixin.get_formset:3 of
msgid "Use this to validate the formset and to get the submitted data back."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.DataTableView:1 of
msgid "A class-based generic view to handle basic DataTable processing."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.MultiTableView:3 of
msgid ""
"Each DataTable class must be a :class:`~horizon.tables.DataTable` class or "
"its subclass."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.MultiTableView:1 of
msgid "Generic view to handle multiple DataTable classes in a single view."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.DataTableView:8 of
msgid ""
"Optionally, you can override the ``has_more_data`` method to trigger "
"pagination handling for APIs that support it."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.DataTableView:3 of
msgid ""
"Three steps are required to use this view: set the ``table_class`` attribute "
"with the desired :class:`~horizon.tables.DataTable` class; define a "
"``get_data`` method which returns a set of data for the table; and specify a "
"template for the ``template_name`` attribute."
msgstr ""

#: ../../../horizon/tables/views.py:docstring
#: horizon.tables.views.MultiTableView:6 of
msgid ""
"Three steps are required to use this view: set the ``table_classes`` "
"attribute with a tuple of the desired :class:`~horizon.tables.DataTable` "
"classes; define a ``get_{{ table_name }}_data`` method for each table class "
"which returns a set of data for that table; and specify a template for the "
"``template_name`` attribute."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.render:3 of
msgid ""
":meth:`~horizon.tabs.Tab.get_context_data` method and the :meth:`~horizon."
"tabs.Tab.get_template_name` method are called."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TableTab:1 of
msgid ""
"A Tab class which knows how to deal with DataTable classes inside of it."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:1 of
msgid "A container class which knows how to manage and render Tab objects."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:39 of
msgid ""
"A dictionary of HTML attributes which should be rendered into the markup for "
"this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:25 of
msgid ""
"A dictionary of HTML attributes which should be rendered into the markup for "
"this tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:9 of
msgid ""
"A list of :class:`.Tab` classes. Tabs specified here are displayed in the "
"order of the list."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:35 of
msgid "A list of CSS classes which should be displayed on this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:21 of
msgid "A list of CSS classes which should be displayed on this tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:35 of
msgid ""
"A list of permission names which this tab requires in order to be displayed. "
"Defaults to an empty list (``[]``)."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:1 of
msgid "A reusable interface for constructing a tab within a TabGroup."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TableTab.get_context_data:1 of
msgid "Adds a ``{{ table_name }}_table`` item to the context for each table."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TableTab:9 of
msgid ""
"An iterable containing the :class:`~horizon.tables.DataTable` classes which "
"this tab will contain. Equivalent to the :attr:`~horizon.tables."
"MultiTableView.table_classes` attribute on :class:`~horizon.tables."
"MultiTableView`. For each table class you need to define a corresponding "
"``get_{{ table_name }}_data`` method as with :class:`~horizon.tables."
"MultiTableView`."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:19 of
msgid ""
"Boolean to control whether the active tab state should be stored across "
"requests for a given user. (State storage is all done client-side.)"
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:25 of
msgid ""
"Boolean to control whether the tab bar is shown when the tab group has only "
"one tab. Default: ``False``"
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_template_name:3 of
msgid ""
"By default it returns the value of the ``template_name`` attribute on the "
"``Tab`` class."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TableTab.load_table_data:1 of
msgid "Calls the ``get_{{ table_name }}_data`` methods for each table class."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.get_id:3 of
msgid "Defaults to ``\"{{ tab_group.slug }}__{{ tab.slug }}\"``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.get_default_classes:3 of
msgid "Defaults to ``[\"nav\", \"nav-tabs\", \"ajax-tabs\"]``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_default_classes:3 of
msgid ""
"Defaults to and empty list (``[]``), however additional classes may be added "
"depending on the state of the tab as follows:"
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.get_id:3
#: of
msgid "Defaults to the value of the tab group's :attr:`horizon.tabs.Tab.slug`."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.allowed:1 of
msgid "Determines whether or not the tab is displayed."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.enabled:1 of
msgid "Determines whether or not the tab should be accessible."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:15 of
msgid ""
"Determines whether the contents of the tab should be rendered into the "
"page's HTML when the tab group is rendered, or whether it should be loaded "
"dynamically when the tab is selected. Default: ``True``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.enabled:3 of
msgid ""
"For example, the tab should be rendered into the HTML on load and respond to "
"a click event."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.post:1 of
msgid "Handles POST data sent to a tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.render:6 of
msgid ""
"If :attr:`~horizon.tabs.Tab.preload` is ``False`` and ``force_load`` is not "
"``True``, or either :meth:`~horizon.tabs.Tab.allowed` or :meth:`~horizon."
"tabs.Tab.enabled` returns ``False`` this method will return an empty string."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.enabled:6 of
msgid ""
"If a tab returns ``False`` from ``enabled`` it will ignore the value of "
"``preload`` and only render the HTML of the tab after being clicked."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TableTab.get_context_data:6 of
msgid ""
"If only one table class is provided, a shortcut ``table`` context variable "
"is also added containing the single table."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.get_tab:5
#: of
msgid ""
"If the tab is disabled but you wish to return it anyway, you can pass "
"``True`` to the allow_disabled argument."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.get_tab:3
#: of
msgid "If the tab is not allowed or not enabled this method returns ``None``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_default_classes:9 of
msgid ""
"If the tab is not enabled, the classes the class ``\"disabled\"`` will be "
"added."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_default_classes:6 of
msgid ""
"If the tab is the active tab for the tab group, in which the class ``\"active"
"\"`` will be added."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.tabs_not_available:3 of
msgid ""
"In the event that no tabs are either allowed or enabled, this method is the "
"fallback handler. By default it's a no-op, but it exists to make redirecting "
"or raising exceptions possible for subclasses."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.get_selected_tab:3 of
msgid ""
"In the event that there is no GET request parameter, the value of the query "
"parameter is invalid, or the tab is not allowed/enabled, the return value of "
"this function is None."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.is_active:1 of
msgid "Method to access whether or not this tab is the active tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.load_tab_data:1 of
msgid "Preload all data that for the tabs that will be displayed."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:30 of
msgid ""
"Read-only access to determine whether or not this tab's data should be "
"loaded immediately."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:44 of
msgid ""
"Read-only property which is set to the instance of the currently-selected "
"tab if there is one, otherwise ``None``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:49 of
msgid ""
"Read-only property which is set to the value of the current active tab. This "
"may not be the same as the value of ``selected`` if no specific tab was "
"requested via the ``GET`` parameter."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.render:1
#: of
msgid "Renders the HTML output for this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.render:1 of
msgid "Renders the tab to HTML."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_context_data:3 of
msgid "Required."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_context_data:1 of
msgid "Return a dictionary of context data used to render the tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.get_tabs:1 of
msgid "Returns a list of the allowed tabs for this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.get_default_classes:1 of
msgid "Returns a list of the default classes for the tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_default_classes:1 of
msgid "Returns a list of the default classes for the tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.get_tab:1
#: of
msgid "Returns a specific tab from this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup.get_id:1
#: of
msgid "Returns the id for this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.get_id:1 of
msgid "Returns the id for this tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.Tab.get_template_name:1 of
msgid "Returns the name of the template to be used for rendering this tab."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.get_selected_tab:1 of
msgid "Returns the tab specific by the GET request parameter."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.post:3 of
msgid ""
"Tab instances can override this method to have tab-specific POST logic "
"without polluting the TabView code."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.allowed:3 of
msgid ""
"Tab instances can override this method to specify conditions under which "
"this tab should not be shown at all by returning ``False``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:10 of
msgid ""
"The URL slug and id attribute for the tab. This should be unique for a given "
"tab group. Required."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:5 of
msgid "The URL slug and pseudo-unique identifier for this tab group."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab.post:6 of
msgid "The default behavior is to ignore POST data."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: ../../../horizon/workflows/base.py:docstring horizon.tabs.base.Tab.enabled:9
#: horizon.workflows.base.Step.allowed:6 of
msgid "The default behavior is to return ``True`` for all cases."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.Tab:5 of
msgid ""
"The display name for the tab which will be rendered as the text for the tab "
"element in the HTML. Required."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TabGroup.tabs_not_available:1 of
msgid "The fallback handler if no tabs are either allowed or enabled."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:30 of
msgid ""
"The name of the GET request parameter which will be used when requesting "
"specific tab data. Default: ``tab``."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TabGroup:14 of
msgid ""
"The name of the template which will be used to render this tab group. "
"Default: ``\"horizon/common/_tab_group.html\"``"
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TableTab.get_context_data:3 of
msgid ""
"The target tables are specified by the :attr:`~horizon.tabs.TableTab."
"table_classes` attribute."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring horizon.tabs.base.TableTab:3 of
msgid ""
"This distinct class is required due to the complexity involved in handling "
"both dynamic tab loading, dynamic table updating and table actions all "
"within one view."
msgstr ""

#: ../../../horizon/tabs/base.py:docstring
#: horizon.tabs.base.TableTab.load_table_data:3 of
msgid "When returning, the loaded data is set on the tables."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring horizon.tabs.views.TabView:1 of
msgid "A generic view for displaying a :class:`horizon.tabs.TabGroup`."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabbedTableView.get_tables:1 of
msgid "A no-op on this class. Tables are handled at the tab level."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabView.get_context_data:1 of
msgid "Adds the ``tab_group`` variable to the context data."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabbedTableView.handle_table:3 of
msgid ""
"For the given dict containing a ``DataTable`` and a ``TableTab`` instance, "
"it loads the table data for that tab and calls the table's :meth:`~horizon."
"tables.DataTable.maybe_handle` method. The return value will be the result "
"of ``maybe_handle``."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabbedTableView.load_tabs:3 of
msgid ""
"It compiles the table instances for each table attached to any :class:"
"`horizon.tabs.TableTab` instances on the tab group. This step is necessary "
"before processing any tab or table actions."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabbedTableView.load_tabs:1 of
msgid "Loads the tab group."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabbedTableView.handle_table:1 of
msgid "Loads the table data based on a given table_dict and handles them."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabView.handle_tabbed_response:3 of
msgid "Otherwise renders the response as normal."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabView.get_tabs:1 of
msgid "Returns the initialized tab group for this view."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring
#: horizon.tabs.views.TabView.handle_tabbed_response:1 of
msgid "Sends back an AJAX-appropriate response for the tab group if needed."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring horizon.tabs.views.TabView:8 of
msgid ""
"The only required attribute for ``TabView``. It should be a class which "
"inherits from :class:`horizon.tabs.TabGroup`."
msgstr ""

#: ../../../horizon/tabs/views.py:docstring horizon.tabs.views.TabView:3 of
msgid ""
"This view handles selecting specific tabs and deals with AJAX requests "
"gracefully."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: ../../../openstack_dashboard/test/helpers.py:docstring
#: horizon.test.helpers.TestCase:3 of
#: openstack_dashboard.test.helpers.TestCase:11
msgid ""
"A ``RequestFactory`` class which supports Django's ``contrib.messages`` "
"framework via ``self.factory``."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: ../../../openstack_dashboard/test/helpers.py:docstring
#: horizon.test.helpers.TestCase:5 of
#: openstack_dashboard.test.helpers.TestCase:13
msgid "A ready-to-go request object via ``self.request``."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.assertNoMessages:1 of
msgid "Asserts no messages have been attached by the messages framework."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.assertMessageCount:1 of
msgid "Asserts that the expected number of messages have been attached."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring horizon.test.helpers.TestCase:1
#: of
msgid "Base test case class for Horizon with numerous additional features."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: ../../../openstack_dashboard/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.tearDown:1 of
#: openstack_dashboard.test.helpers.TestCase.tearDown:1
msgid "Hook method for deconstructing the test fixture after testing it."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: ../../../openstack_dashboard/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.setUp:1 of
#: openstack_dashboard.test.helpers.APITestCase.setUp:1
#: openstack_dashboard.test.helpers.TestCase.setUp:1
msgid "Hook method for setting up the test fixture before exercising it."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.assertNoMessages:3 of
msgid "The expected messages framework is ``django.contrib.messages``."
msgstr ""

#: ../../../horizon/test/helpers.py:docstring
#: horizon.test.helpers.TestCase.assertMessageCount:3 of
msgid ""
"The expected number of messages can be specified per message type. Usage "
"would look like ``self.assertMessageCount(success=1)``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:1 of
msgid "A Workflow is a collection of Steps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:17
#: of
msgid "A ``Step`` class has the following attributes:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:67
#: of
msgid ""
"A boolean value which indicates whether or not this step has any errors on "
"the action within it or in the scope of the workflow. This attribute will "
"only accurately reflect this status after validation has occurred."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:36
#: of
msgid ""
"A dictionary which maps context data key names to lists of callbacks. The "
"callbacks may be functions, dotted python paths to functions which may be "
"imported, or dotted strings beginning with ``\"self\"`` to indicate methods "
"on the current ``Step`` instance."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:35 of
msgid ""
"A list of :class:`~horizon.workflows.Step` classes which serve as the "
"starting point for this workflow's ordered steps. Defaults to an empty list "
"(``[]``)."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:25
#: of
msgid ""
"A list of context data keys which this step requires in order to begin "
"interaction."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:30
#: of
msgid ""
"A list of keys which this step will contribute to the workflow's context "
"data. Optional keys should still be listed, even if their values may be set "
"to ``None``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:34 of
msgid ""
"A list of permission names which this action requires in order to be "
"completed. Defaults to an empty list (``[]``)."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:65 of
msgid ""
"A path to a template which contains more complex help text to be displayed "
"alongside the Action's fields. In conjunction with :meth:`~horizon.workflows."
"Action.get_help_text` method you can customize your help text template to "
"display practically anything."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:61
#: of
msgid ""
"A path to a template which will be used to render this step. In general the "
"default common template should be used. Default: ``\"horizon/common/"
"_workflow_step.html\"``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:62 of
msgid ""
"A roll-up list of all the ``contributes`` values compiled from the "
"workflow's steps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:57 of
msgid ""
"A roll-up list of all the ``depends_on`` values compiled from the workflow's "
"steps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:29 of
msgid ""
"A semi-unique slug for this action. Defaults to the \"slugified\" name of "
"the class."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:60 of
msgid ""
"A string of simple help text to be displayed alongside the Action's fields."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:56
#: of
msgid ""
"A string of simple help text which will be prepended to the ``Action`` "
"class' help text if desired."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:52 of
msgid ""
"A string which will be displayed to the user upon failure to complete the "
"workflow. Defaults to ``\"{{ workflow.name }} did not complete.\"``"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:46 of
msgid ""
"A string which will be displayed to the user upon successful completion of "
"the workflow. Defaults to ``\"{{ workflow.name }} completed successfully.\"``"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:1
#: of
msgid "A wrapper around an action which defines its context in a workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.add_error_to_step:1 of
msgid "Adds an error message to the workflow's Step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action.add_action_error:1 of
msgid "Adds an error to the Action's Step based on API issues."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.add_step_error:1 of
msgid "Adds an error to the Step based on API issues."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.contribute:1 of
msgid "Adds the data listed in ``contributes`` to the workflow's context."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Action:1
#: of
msgid "An ``Action`` represents an atomic logical interaction with the system."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:50
#: of
msgid ""
"Another ``Step`` class. This attribute has the same purpose as :meth:"
"`~horizon.workflows.Step.before` except that it will instead attempt to "
"place the current step after the given step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:43
#: of
msgid ""
"Another ``Step`` class. This optional attribute is used to provide control "
"over workflow ordering when steps are dynamically added to workflows. The "
"workflow mechanism will attempt to place the current step before the step "
"specified in the attribute."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Action:7
#: of
msgid ""
"Because ``Actions`` are always interactive, they always provide form "
"controls, and thus inherit from Django's ``Form`` class. However, they have "
"some additional intelligence added to them:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.format_status_message:6 of
msgid ""
"By default it simply inserts the workflow's name into the message string."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_success_url:3 of
msgid ""
"By default it will attempt to parse a ``success_url`` attribute on the "
"workflow, which can take the form of a reversible URL pattern name, or a "
"standard HTTP URL."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.contribute:3 of
msgid ""
"By default, the context is simply updated with all the data returned by the "
"action."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.allowed:1 of
msgid "Determines whether or not the step is displayed."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:8 of
msgid ""
"Determining if the workflow can be completed by a given user at runtime "
"based on all available information."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:11 of
msgid ""
"Dispatching connections between steps to ensure that when context data "
"changes all the applicable callback functions are executed."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.finalize:1 of
msgid "Finalizes a workflow by running through all the actions."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_absolute_url:6 of
msgid ""
"For convenience it defaults to the value of ``request.get_full_path()`` with "
"any query string stripped off, e.g. the path at which the workflow was "
"requested."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.handle:1 of
msgid "Handles any final processing for this workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action.handle:1 of
msgid "Handles any requisite processing for this action."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:6 of
msgid "Handling the injection, removal, and ordering of arbitrary steps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.validate:1 of
msgid "Hook for custom context data validation."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.format_status_message:1 of
msgid "Hook to allow customization of the message returned to the user."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.prepare_action_context:1 of
msgid "Hook to customize how the workflow context is passed to the action."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:74
#: horizon.workflows.base.Step:78 horizon.workflows.base.Step:82 of
msgid "Inherited from the ``Action`` class."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.is_valid:3 of
msgid ""
"It also calls the ``validate`` method to allow for finer-grained checks on "
"the context data."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:3
#: of
msgid "It knows about details such as:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.finalize:3 of
msgid ""
"It runs all the actions in order and calling their ``handle`` methods. "
"Returns ``True`` on full success, or ``False`` for a partial success, e.g. "
"there were non-critical errors. (If it failed completely the function "
"wouldn't return.)"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:3 of
msgid ""
"Its interface is very straightforward, but it is responsible for handling "
"some very important tasks such as:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.contribute:6 of
msgid ""
"Note that even if the value of one of the ``contributes`` keys is not "
"present (e.g. optional) the key should still be added to the context with a "
"value of ``None``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:67 of
msgid ""
"Path to the template which should be used to render this workflow. In "
"general the default common template should be used. Default: ``\"horizon/"
"common/_workflow.html\"``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:30 of
msgid ""
"Read-only access to the final ordered set of step instances for this "
"workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.register:1 of
msgid "Registers a :class:`~horizon.workflows.Step` with the workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.render:1 of
msgid "Renders the step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.render:1 of
msgid "Renders the workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.has_required_fields:1 of
msgid "Returns True if action contains any required fields."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action.handle:6 of
msgid "Returns ``None`` by default, effectively making it a no-op."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_success_url:1 of
msgid "Returns a URL to redirect the user to upon completion."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.get_id:1 of
msgid "Returns the ID for this step. Suitable for use in HTML markup."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_absolute_url:1 of
msgid "Returns the canonical URL for this workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action.get_help_text:1
#: horizon.workflows.base.Step.get_help_text:1 of
msgid "Returns the help text for this step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_step:1 of
msgid "Returns the instantiated step matching the given slug."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_entry_point:1 of
msgid "Returns the slug of the step which the workflow should begin on."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.handle:3 of
msgid "Should return a boolean value indicating success."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.validate:3 of
msgid ""
"Should return a booleanvalue or raise :class:`~horizon.exceptions."
"WorkflowValidationError`."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.prepare_action_context:7 of
msgid "Simply returns the unaltered context by default."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.allowed:3 of
msgid ""
"Step instances can override this method to specify conditions under which "
"this tab should not be shown at all by returning ``False``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:21
#: of
msgid "The :class:`~horizon.workflows.Action` class which this step wraps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:17 of
msgid "The ``Workflow`` class has the following attributes:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:13
#: of
msgid ""
"The connections between this step's fields and changes in the context data "
"(e.g. if that piece of data changes, what needs to be updated in this step)."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:7
#: of
msgid ""
"The data which must be present in the context to begin this step (the step's "
"dependencies)."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:10
#: of
msgid ""
"The keys which will be added to the context data upon completion of the step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action.handle:3 of
msgid ""
"The method should return either ``None`` or a dictionary of data to be "
"passed to :meth:`~horizon.workflows.Step.contribute`."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:80 of
msgid ""
"The name of a parameter used for tracking the URL to redirect to upon "
"completion of the workflow. Defaults to ``\"next\"``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:41 of
msgid ""
"The name which will appear on the submit button for the workflow's form. "
"Defaults to ``\"Save\"``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:85 of
msgid ""
"The object (if any) which this workflow relates to. In the case of a "
"workflow which creates a new resource the object would be the created "
"resource after the relevant creation steps have been undertaken. In the case "
"of a workflow which updates a resource it would be the resource being "
"updated after it has been retrieved."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:73 of
msgid ""
"The slug of the step which should initially be active when the workflow is "
"rendered. This can be passed in upon initialization of the workflow, or set "
"anytime after initialization but before calling either ``get_entry_point`` "
"or ``render``."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:26 of
msgid "The unique slug for this workflow. Required."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:25 of
msgid "The verbose name for this action. Defaults to the name of the class."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:21 of
msgid ""
"The verbose name for this workflow which will be displayed to the user. "
"Defaults to the class name."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.add_error_to_step:6 of
msgid "The workflow's Step is specified by its slug."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Step:5
#: of
msgid "The workflow's context data (data passed from step to step)."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.format_status_message:3 of
msgid ""
"This is called upon both successful or unsuccessful completion of the "
"workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring horizon.workflows.base.Action:3
#: of
msgid ""
"This is easier to understand with a conceptual example: in the context of a "
"\"launch instance\" workflow, actions would include \"naming the instance\", "
"\"selecting an image\", and ultimately \"launching the instance\"."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Step.prepare_action_context:3 of
msgid ""
"This is the reverse of what \"contribute\" does to make the action outputs "
"sane for the workflow. Changes to the context are not saved globally here. "
"They are localized to the action."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_absolute_url:3 of
msgid ""
"This is used for the POST action attribute on the form element wrapping the "
"workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.add_error_to_step:3 of
msgid ""
"This is useful when you wish for API errors to appear as errors on the form "
"rather than using the messages framework."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.get_entry_point:3 of
msgid ""
"This method takes into account both already-available data and errors within "
"the steps."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.unregister:1 of
msgid "Unregisters a :class:`~horizon.workflows.Step` from the workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow.is_valid:1 of
msgid "Verifies that all required data is present in the context."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:14 of
msgid ""
"Verifying/validating the overall data integrity and subsequently triggering "
"the final method to complete the workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Workflow:93 of
msgid ""
"Whether to present the workflow as a wizard, with \"prev\" and \"next\" "
"buttons and validation after every step."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:20 of
msgid ""
"``Action`` classes may define the following attributes in a ``Meta`` class "
"within them:"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:11 of
msgid "``Actions`` are aware of the permissions required to complete them."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:13 of
msgid ""
"``Actions`` have a meta-level concept of \"help text\" which is meant to be "
"displayed in such a way as to give context to the action regardless of where "
"the action is presented in a site or workflow."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:17 of
msgid ""
"``Actions`` understand how to handle their inputs and produce outputs, much "
"like :class:`~horizon.forms.SelfHandlingForm` does now."
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:45 of
msgid "for a policy that requires a single rule check::"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:50 of
msgid "for a policy that requires multiple rule checks::"
msgstr ""

#: ../../../horizon/workflows/base.py:docstring
#: horizon.workflows.base.Action:56 of
msgid "where two service-rule clauses are OR-ed."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView:1 of
msgid "A generic view which handles the intricacies of workflow processing."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_initial:3 of
msgid ""
"Defaults to using the GET parameters to allow pre-seeding of the workflow "
"context values."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get:1 of
msgid "Handler for HTTP GET requests."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.post:1 of
msgid "Handler for HTTP POST requests."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.validate_steps:3 of
msgid "Returns a dict describing the validation state of the workflow."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_layout:1 of
msgid "Returns classes for the workflow element in template."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_initial:1 of
msgid "Returns initial data for the workflow."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_workflow:1 of
msgid "Returns the instantiated workflow class."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_context_data:1 of
msgid "Returns the template context, including the workflow class."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_template_names:1 of
msgid "Returns the template name to use for this request."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView:5 of
msgid ""
"The :class:`~horizon.workflows.Workflow` class which this view handles. "
"Required."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView:21 of
msgid ""
"The key which should be used for the workflow object in the template "
"context. Defaults to ``\"workflow\"``."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_layout:3 of
msgid ""
"The returned classes are determied based on the workflow characteristics."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView:15 of
msgid ""
"The template to use when rendering the workflow for AJAX requests. In "
"general the default common template should be used. Defaults to ``\"horizon/"
"common/_workflow.html\"``."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView:10 of
msgid ""
"The template to use when rendering this view via standard HTTP requests. "
"Required."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.get_context_data:3 of
msgid ""
"This method should be overridden in subclasses to provide additional context "
"data to the template."
msgstr ""

#: ../../../horizon/workflows/views.py:docstring
#: horizon.workflows.views.WorkflowView.validate_steps:1 of
msgid "Validates the workflow steps from ``start`` to ``end``, inclusive."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.authenticate:1
msgid "Authenticates a user via the Keystone Identity API."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.has_module_perms:3
msgid "Currently this matches for the app_label ``\"openstack\"``."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend:1
msgid "Django authentication backend for use with ``django.contrib.auth``."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_user:3
msgid ""
"If authenticated, this return the user object based on the user ID and "
"session data."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of openstack_auth.backend:1
msgid "Module defining the Django auth backend class for the Keystone API."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.has_perm:1
msgid "Returns True if the given user has the specified permission."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.has_module_perms:1
msgid "Returns True if user has any permissions in the given app_label."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_all_permissions:1
msgid "Returns a set of permission strings that the user has."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_group_permissions:1
msgid "Returns an empty set since Keystone doesn't support \"groups\"."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_user:1
msgid "Returns the current user from the session data."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_all_permissions:6
msgid "The permissions are returned as ``\"openstack.{{ role.name }}\"``."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_all_permissions:3
msgid ""
"This permission available to the user is derived from the user's Keystone "
"\"roles\"."
msgstr ""

#: ../../../openstack_auth/backend.py:docstring of
#: openstack_auth.backend.KeystoneBackend.get_user:8
msgid ""
"This required monkey-patching the ``contrib.auth`` middleware to make the "
"``request`` object available to the auth backend class."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:6
msgid ""
"A domain name is required if authenticating with Keystone V3 running multi-"
"domain configuration."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth:1
msgid "A dummy Auth object"
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:1
msgid "Fetch authentication headers for message."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.Password:1
msgid "Form used for changing user's password without having to log in."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:1
msgid "Form used for logging in a user."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:3
msgid ""
"Handles authentication with Keystone by providing the domain name, username "
"and password. A scoped token is fetched after successful authentication."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:26
msgid ""
"Headers that are set to authenticate a message or None for failure. Note "
"that when checking this value that the empty dict is a valid, non-failure "
"response."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.Login.clean:1 openstack_auth.forms.Password.clean:1
msgid ""
"Hook for doing any extra form-wide cleaning after Field.clean() has been "
"called on every field. Any ValidationError raised by this method will not be "
"associated with a particular field; it will have a special-case association "
"with the field named '__all__'."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:7
msgid ""
"How the authentication headers are obtained is up to the plugin. If the "
"headers are still valid they may be re-used, retrieved from cache or the "
"plugin may invoke an authentication request against a server."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:9
msgid ""
"If the user authenticated has a default project set, the token will be "
"automatically scoped to their default project."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:12
msgid ""
"If the user authenticated has no default project set, the authentication "
"backend will try to scope to the projects returned from the user's assigned "
"projects. The first successful project scoped will be returned."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of openstack_auth.forms.Login:16
msgid ""
"Inherits from the base ``django.contrib.auth.forms.AuthenticationForm`` "
"class for added security features."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth:3
msgid ""
"It is needed for _KeystoneAdapter to get the user_id from, but otherwise "
"behaves as if it doesn't exist (is falsy)."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring
#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:0
#: openstack_auth.utils.get_client_ip:0 openstack_auth.utils.get_websso_url:0
msgid "Return type"
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:19
msgid ""
"Returning None will indicate that no token was able to be retrieved and that "
"authorization was a failure. Adding no authentication data can be achieved "
"by returning an empty dictionary."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring
#: ../../../openstack_auth/user.py:docstring
#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:0
#: openstack_auth.user.User.is_anonymous:0
#: openstack_auth.user.User.is_superuser:0
#: openstack_auth.user.User.is_token_expired:0
#: openstack_auth.utils.get_admin_permissions:0
#: openstack_auth.utils.get_admin_roles:0 openstack_auth.utils.get_client_ip:0
#: openstack_auth.utils.get_role_permission:0
#: openstack_auth.utils.get_websso_url:0
msgid "Returns"
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:11
msgid ""
"The default implementation of get_headers calls the `get_token` method to "
"enable older style plugins to continue functioning unchanged. Subclasses "
"should feel free to completely override this function to provide the headers "
"that they want."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:23
msgid "The session object that the auth_plugin belongs to."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:16
msgid ""
"There are no required kwargs. They are passed directly to the auth plugin "
"and they are implementation specific."
msgstr ""

#: ../../../openstack_auth/forms.py:docstring of
#: openstack_auth.forms.DummyAuth.get_headers:3
msgid ""
"This is a more generalized replacement of the older get_token to allow "
"plugins to specify different or additional authentication headers to the "
"OpenStack standard 'X-Auth-Token' header."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:1
msgid "A User class with some extra special sauce for Keystone."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:39
msgid ""
"A list of dictionaries containing role names and ids as returned by Keystone."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:44
msgid ""
"A list of non-identity service endpoint regions extracted from the service "
"catalog."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_token_expired:7
msgid ""
"A security time margin in seconds before real expiration. Will return "
"``True`` if the token expires in less than ``margin`` seconds of time. A "
"default margin can be set by the TOKEN_TIMEOUT_MARGIN in the django settings."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.Token:6
msgid ""
"Added for maintaining backward compatibility with horizon that expects Token "
"object in the user object."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.time_until_expiration:3
msgid ""
"Calculates the number days until the user must change their password, once "
"the password expires the user will not able to log in until an admin changes "
"its password."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_authenticated:1
msgid "Checks for a valid authentication."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_token_expired:1
msgid "Determine if the token is expired."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.Token:1
msgid "Encapsulates the AccessInfo object from keystoneclient."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_superuser:1
msgid "Evaluates whether this user has admin privileges."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.has_a_matching_perm:3
msgid ""
"If object is passed, it checks if the user has any of the required perms for "
"this object."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:3
msgid ""
"In addition to the standard Django user attributes, this class also has the "
"following:"
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:69
msgid "Password expiration date."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_anonymous:1
msgid "Return if the user is not authenticated."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.has_perms:1
msgid "Returns True if the user has all of the specified permissions."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.has_a_matching_perm:1
msgid "Returns True if the user has one of the specified permissions."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_active:3
msgid ""
"Returns True when the argument x is true, False otherwise. The builtins True "
"and False are the only two instances of the class bool. The class bool is a "
"subclass of the class int, and cannot be subclassed."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.authorized_tenants:1
msgid "Returns a memoized list of tenants this user may access."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.available_services_regions:1
msgid "Returns list of unique region name values in service catalog."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.time_until_expiration:1
msgid "Returns the number of remaining days until user's password expires."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User.save:1
msgid ""
"Save the current instance. Override this in a subclass if you want to "
"control the saving process."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User.save:4
msgid ""
"The 'force_insert' and 'force_update' parameters can be used to insist that "
"the \"save\" must be an SQL insert or update (or equivalent for non-SQL "
"backends), respectively. Normally, they should not be set."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:8
msgid "The Keystone token object associated with the current user/tenant."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:35
msgid "The ``ServiceCatalog`` data returned by Keystone."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:49
msgid "The domain id of the current user."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:53
msgid "The domain name of the current user."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:57
msgid "The id of the Keystone domain scoped for the current user/token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:27
msgid "The id of the Keystone project for the current user/token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:14
msgid "The id of the Keystone tenant for the current user/token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:31
msgid "The name of the Keystone project for the current user/token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:20
msgid "The name of the Keystone tenant for the current user/token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:16
msgid "The tenant_id keyword argument is deprecated, use project_id instead."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:22
msgid ""
"The tenant_name keyword argument is deprecated, use project_name instead."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:10
msgid "The token object is deprecated, user auth_ref instead."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.Token:3
msgid ""
"Token object provides a consistent interface for accessing the keystone "
"token information and service catalog."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.has_perms:3
msgid ""
"Tuples in the list will possess the required permissions if the user has a "
"permissions matching one of the elements of that tuple"
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:65
msgid "Unscoped Keystone token."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of openstack_auth.user.User:61
msgid "Whether user is federated Keystone user. (Boolean)"
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_anonymous:3
msgid "``True`` if not authenticated,``False`` otherwise."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_token_expired:3
msgid ""
"``True`` if the token is expired, ``False`` if not, and ``None`` if there is "
"no token set."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_superuser:3
msgid "``True`` or ``False``."
msgstr ""

#: ../../../openstack_auth/user.py:docstring of
#: openstack_auth.user.User.is_active:1
msgid "bool(x) -> bool"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.is_token_valid:7
msgid ""
"A time margin in seconds to subtract from the real token's validity. An "
"example usage is that the token can be valid once the middleware passed, and "
"invalid (timed-out) during a view rendering and this generates authorization "
"errors during the view rendering. A default margin can be set by the "
"TOKEN_TIMEOUT_MARGIN in the django settings."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:17
msgid ""
"Authentication type selected by the user from the login form. The value is "
"derived from the horizon setting WEBSSO_CHOICES."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:6
msgid ""
"Based on the authentication type selected by the user in the login form, it "
"will construct the keystone WebSSO endpoint."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.allow_expired_passowrd_change:1
msgid "Checks if users should be able to change their expired passwords."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.clean_up_auth_url:1
msgid "Clean up the auth url to extract the exact Keystone URL"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_permissions:1
msgid "Common function for getting the admin permissions from settings"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_roles:1
msgid "Common function for getting the admin roles from settings"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_role_permission:1
msgid "Common function for getting the permission froms arg"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_endpoint_region:1
msgid "Common function for getting the region from endpoint."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.set_response_cookie:1
msgid "Common function for setting the cookie in the response."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:15
msgid "Django http request object"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_client_ip:5 openstack_auth.utils.get_websso_url:9
msgid "Django http request object."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.build_absolute_uri:1
msgid "Ensure absolute_uri are relative to WEBROOT."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:22
msgid "Example of horizon WebSSO setting::"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.fix_auth_url_version_prefix:3
msgid ""
"Fix the URL to say v3 in this case and add version if it is missing "
"entirely. This should be smarter and use discovery. Until version discovery "
"is implemented we need this method to get everything working."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.fix_auth_url_version_prefix:1
msgid "Fix up the auth url if an invalid or no version prefix was given."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:3
msgid ""
"Generate the keystone WebSSO endpoint that will redirect the user to the "
"login page of the federated identity provider."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:49
msgid ""
"If no value is found from the WEBSSO_IDP_MAPPING dictionary, it will treat "
"the value as the global WebSSO protocol <protocol_id> and construct the "
"WebSSO URL by::"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_client_ip:3
msgid "If not present or not defined on settings then REMOTE_ADDR is used."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_endpoint_region:3
msgid "In Keystone V3, region has been deprecated in favor of region_id."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.default_services_region:9
msgid ""
"In each case the value must also be present in available_regions or we move "
"to the next level of precedence."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:55
msgid "Keystone WebSSO endpoint."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:11
msgid ""
"Keystone endpoint configured in the horizon setting. If WEBSSO_KEYSTONE_URL "
"is defined, its value will be used. Otherwise, the value is derived from: - "
"OPENSTACK_KEYSTONE_URL - AVAILABLE_REGIONS"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.default_services_region:3
msgid ""
"Order of precedence: 1. 'services_region' cookie value 2. Matching endpoint "
"in DEFAULT_SERVICE_REGIONS 3. '*' key in DEFAULT_SERVICE_REGIONS 4. First "
"valid region from catalog"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_client_ip:8
msgid "Possible client ip address"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.set_response_cookie:3
msgid ""
"Provides a common policy of setting cookies for last used project and "
"region, can be reused in other locations."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.url_path_replace:3
msgid ""
"Return a copy of url with all occurrences of old replaced by new in the url "
"path.  If the optional argument count is given, only the first count "
"occurrences are replaced."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.url_path_replace:1
msgid "Return a copy of url with replaced path."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_client_ip:1
msgid "Return client ip address using SECURE_PROXY_ADDR_HEADER variable."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.default_services_region:1
msgid "Return the default service region."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:1
msgid "Return the keystone endpoint for initiating WebSSO."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.is_token_valid:3
msgid "Returns ``True`` if the token has not yet expired, otherwise ``False``."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:16
msgid "Scoped Keystone access info object"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_permissions:6
msgid ""
"Set object including all admin permission. If there is no permission, this "
"will return empty::"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_permissions:5
msgid ""
"Set object including all admin permission. If there is no permission, this "
"will return empty::   {      \"openstack.roles.foo\",      \"openstack.roles."
"bar\",      \"openstack.roles.admin\"  }"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_roles:4
msgid ""
"Set object including all admin roles. If there is no role, this will return "
"empty::"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_roles:3
msgid ""
"Set object including all admin roles. If there is no role, this will return "
"empty::    {       \"foo\", \"bar\", \"admin\"   }"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:1
msgid "Stores session variables if there are k2k service providers"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_role_permission:5
msgid ""
"String like \"openstack.roles.admin\" If role is None, this will return None."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.has_in_url_path:1
msgid "Test if any of `subs` strings is present in the `url` path."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.is_token_valid:5
msgid "The openstack_auth.user.Token instance to check"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:42
msgid ""
"The value in WEBSSO_IDP_MAPPING is expected to be a tuple formatted as "
"(<idp_id>, <protocol_id>). Using the values found, a IdP/protocol specific "
"URL will be constructed::"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_websso_url:38
msgid ""
"The value of websso_auth will be looked up in the WEBSSO_IDP_MAPPING "
"dictionary, if a match is found it will return a IdP specific WebSSO "
"endpoint using the values found in the mapping."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_admin_permissions:3
#: openstack_auth.utils.get_role_permission:3
msgid "This format is 'openstack.roles.xxx' and 'xxx' is a real role name."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.get_endpoint_region:6
msgid ""
"This method provides a way to get region that works for both Keystone V2 and "
"V3."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.set_response_cookie:6
msgid "This method will set the cookie to expire in 365 days."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:3
msgid ""
"This stores variables related to Keystone2Keystone federation. This function "
"gets skipped if there are no Keystone service providers. An unscoped token "
"to the identity provider keystone gets stored so that it can be used to do "
"federated login into the service providers when switching keystone "
"providers. The settings file can be configured to set the display name of "
"the local (identity provider) keystone by setting "
"KEYSTONE_PROVIDER_IDP_NAME. The KEYSTONE_PROVIDER_IDP_ID settings variable "
"is used for comparison against the service providers. It should not conflict "
"with any of the service provider ids."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.is_token_valid:1
msgid "Timezone-aware checking of the auth token's expiration timestamp."
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:17
msgid "Unscoped Keystone access info object"
msgstr ""

#: ../../../openstack_auth/utils.py:docstring of
#: openstack_auth.utils.store_initial_k2k_session:14
msgid "base token auth url"
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.PasswordView:1
msgid "Changes user's password when it's expired or otherwise inaccessible."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.switch_keystone_provider:3
msgid ""
"If keystone_provider is given then we switch the user to the keystone "
"provider using K2K federation. Otherwise if keystone_provider is None then "
"we switch the user back to the Identity Provider Keystone which a non "
"federated token auth will be used."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.websso:1
msgid "Logs a user in using a token from Keystone's POST."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.login:1
msgid "Logs a user in using the :class:`~openstack_auth.forms.Login` form."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.logout:1
msgid ""
"Logs out the user if he is logged in. Then redirects to the log-in page."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.logout:3
msgid "Once logged out, defines the URL where to redirect after login"
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.PasswordView.get_initial:1
msgid "Return the initial data to use for forms on this view."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.switch:1
msgid "Switches an authenticated user from one project to another."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.switch_keystone_provider:1
msgid "Switches the user's keystone provider using K2K Federation"
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.switch_region:1
msgid "Switches the user's region for all services except Identity service."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of
#: openstack_auth.views.switch_region:3
msgid ""
"The region will be switched if the given region is one of the regions "
"available for the scoped project. Otherwise the region is not switched."
msgstr ""

#: ../../../openstack_auth/views.py:docstring of openstack_auth.views.logout:6
msgid "see django.contrib.auth.views.logout_then_login extra parameters."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:5
msgid ""
"A full suite of test data through various attached objects and managers (e."
"g. ``self.servers``, ``self.user``, etc.). See the docs for :class:"
"`~openstack_dashboard.test.test_data.utils.TestData` for more information."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:10
msgid "A set of request context data via ``self.context``."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertRedirectsNoFollow:3
msgid ""
"Asserts that the given response issued a 302 redirect without processing the "
"view which is redirected to."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertFormErrors:3
msgid ""
"Asserts that the response does contain a form in its context, and that form "
"has errors, if count were given, it must match the exact numbers of errors"
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertWorkflowErrors:3
msgid ""
"Asserts that the response does contain a workflow in its context, and that "
"workflow has errors, if count were given, it must match the exact numbers of "
"errors"
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertNoFormErrors:3
msgid ""
"Asserts that the response either does not contain a form in its context, or "
"that if it does, that form has no errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertNoWorkflowErrors:3
msgid ""
"Asserts that the response either does not contain a workflow in its context, "
"or that if it does, that workflow has no errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertFormErrors:1
msgid "Check for form errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertRedirectsNoFollow:1
msgid "Check for redirect."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertWorkflowErrors:1
msgid "Check for workflow errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertNoFormErrors:1
msgid "Checks for no form errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertNoWorkflowErrors:1
msgid "Checks for no workflow errors."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.BaseAdminViewTests:3
msgid "For testing admin-only views and functionality."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:3
msgid "It gives access to numerous additional features:"
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertStatusCode:3
msgid "Matches camel case of other assert functions"
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.BaseAdminViewTests:1
msgid "Sets an active user with the \"admin\" role."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:15
msgid "Several handy additional assertion methods."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:1
msgid "Specialized base test case class for Horizon."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase:14
msgid "The ability to override specific time data controls for easier testing."
msgstr ""

#: ../../../openstack_dashboard/test/helpers.py:docstring of
#: openstack_dashboard.test.helpers.TestCase.assertStatusCode:1
msgid "Validates an expected status code."
msgstr ""

#: ../../source/contributor/contributing.rst:3
msgid "So You Want to Contribute..."
msgstr ""

#: ../../source/contributor/contributing.rst:5
msgid ""
"For general information on contributing to OpenStack, please check out the "
"`contributor guide <https://docs.openstack.org/contributors/>`_ to get "
"started. It covers all the basics that are common to all OpenStack projects: "
"the accounts you need, the basics of interacting with our Gerrit review "
"system, how we communicate as a community, etc."
msgstr ""

#: ../../source/contributor/contributing.rst:11
msgid ""
"Below will cover the more project specific information you need to get "
"started with horizon."
msgstr ""

#: ../../source/contributor/contributing.rst:15
msgid "Project Resources"
msgstr ""

#: ../../source/contributor/contributing.rst:17
msgid "Source code: https://opendev.org/openstack/horizon"
msgstr ""

#: ../../source/contributor/contributing.rst:18
msgid "Documentation: https://docs.openstack.org/horizon/latest/"
msgstr ""

#: ../../source/contributor/contributing.rst:19
msgid "Project page: https://launchpad.net/horizon"
msgstr ""

#: ../../source/contributor/contributing.rst:20
msgid "Bug tracker: https://bugs.launchpad.net/horizon"
msgstr ""

#: ../../source/contributor/contributing.rst:21
msgid ""
"Code review: https://review.opendev.org/#/q/project:openstack/horizon+status:"
"open"
msgstr ""

#: ../../source/contributor/contributing.rst:24
msgid "Communication"
msgstr ""

#: ../../source/contributor/contributing.rst:26
msgid "IRC channel: ``#openstack-horizon`` at OFTC"
msgstr ""

#: ../../source/contributor/contributing.rst:28
msgid ""
"Most active contributors are online at IRC while they are active, so it "
"would be the easiest way to contact the team directly. Note that all IRC "
"conversations are stored `here <http://eavesdrop.openstack.org/irclogs/"
"%23openstack-horizon/>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:33
msgid ""
"Mailing list: `openstack-discuss <http://lists.openstack.org/cgi-bin/mailman/"
"listinfo/openstack-discuss>`__ with ``[horizon]`` tag."
msgstr ""

#: ../../source/contributor/contributing.rst:38
msgid ""
"The mailing list would be a good place if you would like to discuss your "
"topic with the OpenStack community more broadly. Most OpenStack users, "
"operators and developers subscribe it and you can get useful feedbacks from "
"various perspectives."
msgstr ""

#: ../../source/contributor/contributing.rst:43
msgid "Team meeting:"
msgstr ""

#: ../../source/contributor/contributing.rst:45
msgid ""
"The horizon team has a weekly meeting which covers all things related to the "
"horizon project like announcements, project priorities, community goals, "
"bugs and so on."
msgstr ""

#: ../../source/contributor/contributing.rst:49
msgid ""
"There is the \"On Demand Agenda\" section at the end of the meeting, where "
"anyone can add a topic to discuss with the team. It is suggested to add such "
"topic to the On-Demand agenda in the \"Weekly meeting\" in `horizon release "
"priority etherpad <https://etherpad.opendev.org/p/horizon-release-"
"priorities>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:55
msgid "Time: http://eavesdrop.openstack.org/#Horizon_Team_Meeting"
msgstr ""

#: ../../source/contributor/contributing.rst:56
msgid "Agenda: https://wiki.openstack.org/wiki/Meetings/Horizon"
msgstr ""

#: ../../source/contributor/contributing.rst:59
msgid "Contacting the Core Team"
msgstr ""

#: ../../source/contributor/contributing.rst:61
msgid ""
"The list of the current core reviewers is found at `gerrit <https://review."
"opendev.org/#/admin/groups/43,members>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:64
msgid ""
"Most core reviewers are online in the IRC channel and you can contact them "
"there."
msgstr ""

#: ../../source/contributor/contributing.rst:68
msgid "New Feature Planning"
msgstr ""

#: ../../source/contributor/contributing.rst:70
msgid ""
"If you would like to add a new feature to horizon, file a blueprint to "
"https://blueprints.launchpad.net/horizon. You can find a template for a "
"blueprint at https://blueprints.launchpad.net/horizon/+spec/template. The "
"template is not a strict requirement but it would be nice to cover a "
"motivation and an approach of your blueprint. From the nature of GUI, a "
"discussion on UI design during a patch review could be more productive, so "
"there is no need to explain the detail of UI design in your blueprint "
"proposal."
msgstr ""

#: ../../source/contributor/contributing.rst:79
msgid ""
"We don't have a specific deadline during a development cycle. You can "
"propose a feature any time. Only thing you keep in your mind is that we do "
"not merge features during the feature freeze period after the milestone 3 in "
"each cycle."
msgstr ""

#: ../../source/contributor/contributing.rst:83
msgid ""
"There are a number of unsupported OpenStack features in horizon. "
"Implementing such would be appreciated even if it is small."
msgstr ""

#: ../../source/contributor/contributing.rst:87
msgid "Task Tracking"
msgstr ""

#: ../../source/contributor/contributing.rst:89
msgid ""
"We track our tasks in `Launchpad <https://bugs.launchpad.net/horizon>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:91
msgid ""
"If you're looking for some smaller, please look through the list of bugs and "
"find what you think you can work on. If you are not sure the status of a bug "
"feel free to ask to the horizon team. We can help you. Note that we recently "
"do not maintain 'low-hanging-fruit' tag and some of them with this tag are "
"not simple enough."
msgstr ""

#: ../../source/contributor/contributing.rst:98
msgid "Reporting a Bug"
msgstr ""

#: ../../source/contributor/contributing.rst:100
msgid ""
"You found an issue and want to make sure we are aware of it? You can do so "
"on `Launchpad <https://bugs.launchpad.net/horizon>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:103
msgid ""
"Please file a bug first even if you already have a fix for it. If you can "
"reproduce the bug reliably and identify its cause then it's usually safe to "
"start working on it. However, getting independent confirmation (and "
"verifying that it's not a duplicate) is always a good idea if you can be "
"patient."
msgstr ""

#: ../../source/contributor/contributing.rst:110
msgid "Getting Your Patch Merged"
msgstr ""

#: ../../source/contributor/contributing.rst:112
msgid ""
"All changes proposed to horizon require two +2 votes from the horizon core "
"reviewers before one of the core reviewers can approve a change by giving "
"\"Workflow +1\" vote."
msgstr ""

#: ../../source/contributor/contributing.rst:116
msgid ""
"In general, all changes should be proposed along with at least unit test "
"coverage (python or JavaScript). Integration test support would be "
"appreciated."
msgstr ""

#: ../../source/contributor/contributing.rst:120
msgid ""
"More detailed guidelines for reviewers of patches are available at `OpenDev "
"Developer's Guide <https://docs.opendev.org/opendev/infra-manual/latest/"
"developers.html#code-review>`__."
msgstr ""

#: ../../source/contributor/contributing.rst:124
msgid "Project Team Lead Duties"
msgstr ""

#: ../../source/contributor/contributing.rst:126
msgid ""
"All common PTL duties are enumerated in the `PTL guide <https://docs."
"openstack.org/project-team-guide/ptl.html>`_."
msgstr ""

#: ../../source/contributor/contributing.rst:129
msgid ""
"The horizon PTL is expected to coordinate and encourage the core reviewer "
"team and contributors for the success. The expectations for the core "
"reviewer team is documented at :doc:`policies/core-reviewers` and the PTL "
"would play an important role in this."
msgstr ""

#: ../../source/contributor/contributing.rst:135
msgid "Etiquette"
msgstr ""

#: ../../source/contributor/contributing.rst:137
msgid "The community's guidelines for etiquette are fairly simple:"
msgstr ""

#: ../../source/contributor/contributing.rst:139
msgid "Treat everyone respectfully and professionally."
msgstr ""

#: ../../source/contributor/contributing.rst:140
msgid ""
"If a bug is \"in progress\" in the bug tracker, don't start working on it "
"without contacting the author. Try on IRC, or via the launchpad email "
"contact link. If you don't get a response after a reasonable time, then go "
"ahead. Checking first avoids duplicate work and makes sure nobody's toes get "
"stepped on."
msgstr ""

#: ../../source/contributor/contributing.rst:145
msgid ""
"If a blueprint is assigned, even if it hasn't been started, be sure you "
"contact the assignee before taking it on. These larger issues often have a "
"history of discussion or specific implementation details that the assignee "
"may be aware of that you are not."
msgstr ""

#: ../../source/contributor/contributing.rst:149
msgid ""
"Please don't re-open tickets closed by a core developer. If you disagree "
"with the decision on the ticket, the appropriate solution is to take it up "
"on IRC or the mailing list."
msgstr ""

#: ../../source/contributor/contributing.rst:152
msgid ""
"Give credit where credit is due; if someone helps you substantially with a "
"piece of code, it's polite (though not required) to thank them in your "
"commit message."
msgstr ""

#: ../../source/contributor/faq.rst:5
msgid "Frequently Asked Questions"
msgstr ""

#: ../../source/contributor/faq.rst:8
msgid ""
"The navigational structure is strongly encouraged to flow from ``Dashboard`` "
"objects as top-level navigation items to ``Panel`` objects as sub-navigation "
"items as in the current implementation. Template tags are provided to "
"automatically generate this structure."
msgstr ""

#: ../../source/contributor/faq.rst:13
msgid ""
"That said, you are not required to use the provided tools and can write "
"templates and URLconfs by hand to create any desired structure."
msgstr ""

#: ../../source/contributor/faq.rst:14
msgid ""
"What is the relationship between ``Dashboards``, ``Panels``, and navigation?"
msgstr ""

#: ../../source/contributor/faq.rst:17
msgid ""
"A panel can live in any Python module. It can be a standalone which ties "
"into an existing dashboard, or it can be contained alongside others within a "
"larger dashboard \"app\". There is no strict enforcement here. Python is \"a "
"language for consenting adults.\" A module containing a Panel does not need "
"to be added to ``INSTALLED_APPS``, but this is a common and convenient way "
"to load a standalone panel."
msgstr ""

#: ../../source/contributor/faq.rst:22
msgid "Does a panel have to be an app in ``INSTALLED_APPS``?"
msgstr ""

#: ../../source/contributor/faq.rst:25
msgid ""
"Panels are just entry-points to hook views into the larger dashboard "
"navigational structure and enforce common attributes like RBAC. The views "
"and corresponding templates can contain anything you would like, including "
"iFrames."
msgstr ""

#: ../../source/contributor/faq.rst:28
msgid ""
"Could I hook an external service into a panel using, for example, an iFrame?"
msgstr ""

#: ../../source/contributor/faq.rst:31
msgid ""
"The ability to add an arbitrary number of top-level navigational items "
"(``Dashboard`` objects) poses a new design challenge. Horizon's lead "
"designer has taken on the challenge of providing a reference design for "
"Horizon which supports this possibility."
msgstr ""

#: ../../source/contributor/faq.rst:34
msgid "What does this mean for visual design?"
msgstr ""

#: ../../source/contributor/index.rst:3
msgid "Contributor Documentation"
msgstr ""

#: ../../source/contributor/intro.rst:5
msgid "Horizon Basics"
msgstr ""

#: ../../source/contributor/intro.rst:8
msgid "Values"
msgstr ""

#: ../../source/contributor/intro.rst:10
msgid ""
"\"Think simple\" as my old master used to say - meaning reduce the whole of "
"its parts into the simplest terms, getting back to first principles."
msgstr ""

#: ../../source/contributor/intro.rst:16
msgid ""
"Horizon holds several key values at the core of its design and architecture:"
msgstr ""

#: ../../source/contributor/intro.rst:18
msgid "Core Support: Out-of-the-box support for all core OpenStack projects."
msgstr ""

#: ../../source/contributor/intro.rst:19
msgid ""
"Extensible: Anyone can add a new component as a \"first-class citizen\"."
msgstr ""

#: ../../source/contributor/intro.rst:19
msgid "Frank Lloyd Wright"
msgstr ""

#: ../../source/contributor/intro.rst:20
msgid "Manageable: The core codebase should be simple and easy-to-navigate."
msgstr ""

#: ../../source/contributor/intro.rst:21
msgid "Consistent: Visual and interaction paradigms are maintained throughout."
msgstr ""

#: ../../source/contributor/intro.rst:22
msgid "Stable: A reliable API with an emphasis on backwards-compatibility."
msgstr ""

#: ../../source/contributor/intro.rst:23
msgid "Usable: Providing an *awesome* interface that people *want* to use."
msgstr ""

#: ../../source/contributor/intro.rst:25
msgid ""
"The only way to attain and uphold those ideals is to make it *easy* for "
"developers to implement those values."
msgstr ""

#: ../../source/contributor/intro.rst:29
msgid "History"
msgstr ""

#: ../../source/contributor/intro.rst:31
msgid ""
"Horizon started life as a single app to manage OpenStack's compute project. "
"As such, all it needed was a set of views, templates, and API calls."
msgstr ""

#: ../../source/contributor/intro.rst:34
msgid ""
"From there it grew to support multiple OpenStack projects and APIs "
"gradually, arranged rigidly into \"dash\" and \"syspanel\" groupings."
msgstr ""

#: ../../source/contributor/intro.rst:37
msgid ""
"During the \"Diablo\" release cycle an initial plugin system was added using "
"signals to hook in additional URL patterns and add links into the \"dash\" "
"and \"syspanel\" navigation."
msgstr ""

#: ../../source/contributor/intro.rst:41
msgid ""
"This incremental growth served the goal of \"Core Support\" phenomenally, "
"but left \"Extensible\" and \"Manageable\" behind. And while the other key "
"values took shape of their own accord, it was time to re-architect for an "
"extensible, modular future."
msgstr ""

#: ../../source/contributor/intro.rst:48
msgid "The Current Architecture & How It Meets Our Values"
msgstr ""

#: ../../source/contributor/intro.rst:50
msgid ""
"At its core, **Horizon should be a registration pattern for applications to "
"hook into**. Here's what that means and how it is implemented in terms of "
"our values:"
msgstr ""

#: ../../source/contributor/intro.rst:55
msgid "Core Support"
msgstr ""

#: ../../source/contributor/intro.rst:57
msgid ""
"Horizon ships with three central dashboards, a \"User Dashboard\", a "
"\"System Dashboard\", and a \"Settings\" dashboard. Between these three they "
"cover the core OpenStack applications and deliver on Core Support."
msgstr ""

#: ../../source/contributor/intro.rst:61
msgid ""
"The Horizon application also ships with a set of API abstractions for the "
"core OpenStack projects in order to provide a consistent, stable set of "
"reusable methods for developers. Using these abstractions, developers "
"working on Horizon don't need to be intimately familiar with the APIs of "
"each OpenStack project."
msgstr ""

#: ../../source/contributor/intro.rst:68
msgid "Extensible"
msgstr ""

#: ../../source/contributor/intro.rst:70
msgid ""
"A Horizon dashboard application is based around the :class:`~horizon."
"Dashboard` class that provides a consistent API and set of capabilities for "
"both core OpenStack dashboard apps shipped with Horizon and equally for "
"third-party apps. The :class:`~horizon.Dashboard` class is treated as a top-"
"level navigation item."
msgstr ""

#: ../../source/contributor/intro.rst:76
msgid ""
"Should a developer wish to provide functionality within an existing "
"dashboard (e.g. adding a monitoring panel to the user dashboard) the simple "
"registration pattern makes it possible to write an app which hooks into "
"other dashboards just as easily as creating a new dashboard. All you have to "
"do is import the dashboard you wish to modify."
msgstr ""

#: ../../source/contributor/intro.rst:83
msgid "Manageable"
msgstr ""

#: ../../source/contributor/intro.rst:85
msgid ""
"Within the application, there is a simple method for registering a :class:"
"`~horizon.Panel` (sub-navigation items). Each panel contains the necessary "
"logic (views, forms, tests, etc.) for that interface. This granular "
"breakdown prevents files (such as ``api.py``) from becoming thousands of "
"lines long and makes code easy to find by correlating it directly to the "
"navigation."
msgstr ""

#: ../../source/contributor/intro.rst:93
msgid "Consistent"
msgstr ""

#: ../../source/contributor/intro.rst:95
msgid ""
"By providing the necessary core classes to build from, as well as a solid "
"set of reusable templates and additional tools (base form classes, base "
"widget classes, template tags, and perhaps even class-based views) we can "
"maintain consistency across applications."
msgstr ""

#: ../../source/contributor/intro.rst:101
msgid "Stable"
msgstr ""

#: ../../source/contributor/intro.rst:103
msgid ""
"By architecting around these core classes and reusable components we create "
"an implicit contract that changes to these components will be made in the "
"most backwards-compatible ways whenever possible."
msgstr ""

#: ../../source/contributor/intro.rst:108
msgid "Usable"
msgstr ""

#: ../../source/contributor/intro.rst:110
msgid ""
"Ultimately that's up to each and every developer that touches the code, but "
"if we get all the other goals out of the way then we are free to focus on "
"the best possible experience."
msgstr ""

#: ../../source/contributor/intro.rst:116
msgid ":ref:`quickstart` A short guide to getting started with using Horizon."
msgstr ""

#: ../../source/contributor/intro.rst:117
msgid ":ref:`faq` Common questions and answers."
msgstr ""

#: ../../source/contributor/intro.rst:118
msgid ":ref:`glossary` Common terms and their definitions."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:3
#: ../../source/contributor/policies/horizon-groups.rst:11
msgid "Core Reviewer Team"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:5
msgid ""
"The horizon core reviewer team is responsible for many aspects of the "
"horizon project. These include, but are not limited to:"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:8
msgid ""
"Mentor community contributors in solution design, testing, and the review "
"process"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:10
msgid ""
"Actively reviewing patch submissions, considering whether the patch: - is "
"functional - fits use cases and vision of the project - is complete in terms "
"of testing, documentation, and release notes - takes into consideration "
"upgrade concerns from previous versions"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:15
msgid "Assist in bug triage and delivery of bug fixes"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:16
msgid "Curating the gate and triaging failures"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:17
msgid "Maintaining accurate, complete, and relevant documentation"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:18
msgid ""
"Ensuring the level of testing is adequate and remains relevant as features "
"are added"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:20
msgid "Answering questions and participating in mailing list discussions"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:21
msgid "Interfacing with other OpenStack teams"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:22
msgid "Helping horizon plugin maintenances"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:24
msgid "In essence, core reviewers share the following common ideals:"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:26
msgid "They share responsibility in the project's success in its mission."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:27
msgid "They value a healthy, vibrant, and active developer and user community."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:28
msgid ""
"They have made a long-term, recurring time investment to improve the project."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:29
msgid ""
"They spend their time doing what needs to be done to ensure the project's "
"success, not necessarily what is the most interesting or fun."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:31
msgid "A core reviewer's responsibility doesn't end with merging code."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:34
msgid "Core Reviewer Expectations"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:36
msgid "Members of the core reviewer team are expected to:"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:38
msgid ""
"Attend and participate in the weekly IRC meetings (if your timezone allows)"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:39
msgid "Monitor and participate in-channel at #openstack-horizon"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:40
msgid ""
"Monitor and participate in ``[horizon]`` discussions on the mailing list"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:41
msgid ""
"Participate in related design sessions at Project Team Gatherings (PTGs)"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:42
msgid "Review patch submissions actively and consistently"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:44
msgid ""
"Please note in-person attendance at PTGs, mid-cycles, and other code sprints "
"is not a requirement to be a core reviewer. Participation can also include "
"contributing to the design documents discussed at the design sessions."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:48
msgid ""
"Active and consistent review of review activity, bug triage and other "
"activity will be performed periodically and fed back to the core reviewer "
"team so everyone knows how things are progressing."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:53
msgid "Code Merge Responsibilities"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:55
msgid ""
"While everyone is encouraged to review changes, members of the core reviewer "
"team have the ability to +2/-2 and +A changes to these repositories. This is "
"an extra level of responsibility not to be taken lightly. Correctly merging "
"code requires not only understanding the code itself, but also how the code "
"affects things like documentation, testing, upgrade impacts and interactions "
"with other projects. It also means you pay attention to release milestones "
"and understand if a patch you are merging is marked for the release, "
"especially critical during the feature freeze."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:66
msgid "Horizon Plugin Maintenance"
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:68
msgid ""
"GUI supports for most OpenStack projects are achieved via horizon plugins. "
"The horizon core reviewer team has responsibility to help horizon plugin "
"teams from the perspective of horizon related changes as the framework, for "
"example, Django version bump, testing improvements, plugin interface changes "
"in horizon and so on. A member of the team is expected to send and review "
"patches related to such changes."
msgstr ""

#: ../../source/contributor/policies/core-reviewers.rst:75
msgid ""
"Note that involvements in more works in horizon plugins are up to "
"individuals but it would be nice to be involved if you have time :)"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:3
msgid "Horizon Bugs"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:5
msgid ""
"Horizon project maintains all bugs in `Launchpad horizon <https://bugs."
"launchpad.net/horizon>`__."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:9
msgid "Bug Tags"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:11
msgid ""
"Tags are used to classify bugs in a meaningful way. Popular tags are found "
"at `OpenStack Wiki <https://wiki.openstack.org/wiki/Bug_Tags>`__ (See "
"``Horizon`` and ``All projects`` sections)."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:17
msgid "Triaging Bugs"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:19
msgid ""
"One of the important things in the bug management process is to triage "
"incoming bugs appropriately. To keep you up-to-date to incoming bugs, see "
"`Receiving incoming bugs`_."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:24
msgid "The bug triaging process would be:"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:26
msgid ""
"Check if a bug is filed for a correct project. Otherwise, change the project "
"or mark it as \"Invalid\""
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:28
msgid "Check if enough information like below is provided:"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:30
msgid "High level description"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:31
msgid "Step-by-step instruction to reproduce the bug"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:32
msgid "Expected output and actual output"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:33
msgid "Version(s) of related components (at least horizon version is required)"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:35
msgid ""
"Check if a similar bug was reported before. If found, mark it as duplicate "
"(using \"Mark as duplicate\" button in the right-top menu)."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:38
msgid "Add or update proper bug tags"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:39
msgid "Verify if a bug can be reproduced."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:41
msgid ""
"If the bug cannot be reproduced, there would be some pre-conditions. It is "
"recommended to request more information from the bug reporter. Setting the "
"status to \"Incomplete\" usually makes sense in this case."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:45
msgid ""
"Assign the importance. If it breaks horizon basic functionality, the "
"importance should be marked as \"Critical\" or \"High\"."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:50
msgid "Receiving incoming bugs"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:52
msgid ""
"To check incoming bugs, you can check Launchpad bug page directly, but at "
"the moment the easiest way is to subscribe Launchpad bug mails. The steps to "
"subscribe to the Launchpad bugs are as follows:"
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:56
msgid "Go to the `horizon bugs page <https://bugs.launchpad.net/horizon>`__."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:57
msgid "On the right hand side, click on \"Subscribe to bug mail\"."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:58
msgid ""
"In the pop-up that is displayed, keep the recipient as \"Yourself\", and set "
"the subscription name to something useful like \"horizon-bugs\". You can "
"choose either option for how much mail you get, but keep in mind that "
"getting mail for all changes - while informative - will result in more "
"emails."
msgstr ""

#: ../../source/contributor/policies/horizon-bugs.rst:63
msgid ""
"You will now receive bug mails from Launchpad when a new bug is filed. Note "
"that you can classify emails based on the subscription name above."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:3
msgid "Horizon Teams"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:5
msgid "Horizon project defines several teams to maintain the project."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:8
msgid "Gerrit"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:13
msgid ""
"The core reviewer team is responsible for the horizon development in the "
"master branch from various perspective. See :doc:`core-reviewers` for more "
"detail."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:18
msgid "Stable Maintenance Team"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:20
msgid ""
"Members of this gerrit group are responsible for maintaining stable "
"branches. The members are expected to understand `the stable branch policy "
"<https://docs.openstack.org/project-team-guide/stable-branches.html>`__. "
"Most members overlaps with the core reviewer team but being a core reviewer "
"is not a requirement for being a member of the stable maintenance team. "
"Folks who would like to be a member of this team is recommended to express "
"how they understand the stable branch policy in reviews."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:28
msgid ""
"The member list is found at https://review.opendev.org/#/admin/groups/537,"
"members."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:32
msgid "Launchpad"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:35
msgid "Bug Supervisor Team"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:37
msgid ""
"Members of this launchpad group are responsible for bug management. They "
"have privileges to set status, priority and milestone of bugs. Most members "
"overlaps with the core reviewer team but it is not a requirement for being a "
"member of this team."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:42
msgid "The member list is found at https://launchpad.net/~horizon-bugs."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:45
msgid "Horizon Drivers Team"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:47
msgid ""
"Members of this launchpad group can do all things in the horizon launchpad "
"such as defining series and milestones. This group is included to the bug "
"supervisor team."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:51
msgid "The member list is found at https://launchpad.net/~horizon-drivers."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:54
msgid "Security Contact Team"
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:56
msgid ""
"Members of this launchpad group are responsible for security issues. Members "
"are expected to be familiar with `Vulnerability Management Process <https://"
"security.openstack.org/vmt-process.html>`__ in OpenStack. Private security "
"issues are handled differently from usual public reports. All steps "
"including patch development and review are done in a launchpad bug report."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:64
msgid "The member list is found at https://launchpad.net/~horizon-coresec."
msgstr ""

#: ../../source/contributor/policies/horizon-groups.rst:66
msgid ""
"Note that the access permission to private information of this team is "
"configured at https://launchpad.net/horizon/+sharing. (You can find \"Sharing"
"\" menu at the top-right corder of `the launchpad top page <https://"
"launchpad.net/horizon>`__.)"
msgstr ""

#: ../../source/contributor/policies/index.rst:3
msgid "Project Policies"
msgstr ""

#: ../../source/contributor/policies/index.rst:5
msgid "This page collects basic policies on horizon development."
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:3
msgid "Supported Software"
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:6
msgid "Back-end service support"
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:8
msgid ""
"``N`` release of horizon supports ``N`` and ``N-1`` releases of back-end "
"OpenStack services (like nova, cinder, neutron and so on). This allows "
"operators to upgrade horizon separately from other OpenStack services."
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:13
msgid ""
"Horizon should check features in back-end services through APIs as much as "
"possible by using micro-versioning for nova, cinder and so on and API "
"extensions for neutron (and others if any)."
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:17
msgid ""
"Related to the previous item, features available in ``N-4`` releases (which "
"means the recent four releases including the development version) are "
"assumed without checking the availability of features to simplify the "
"implementation."
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:22
msgid ""
"Removals and deprecations of back-end feature supports basically follows "
"`the standard deprecation policy <https://governance.openstack.org/tc/"
"reference/tags/assert_follows-standard-deprecation.html>`__ defined by the "
"technical committee, but there are some notes. Deprecations in back-end "
"services are applied to corresponding horizon features automatically and it "
"is allowed to drop some feature from horizon without an explicit deprecation."
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:33
msgid "Django support"
msgstr ""

#: ../../source/contributor/policies/supported-software.rst:35
msgid ""
"Horizon usually syncs with `Django's Roadmap <https://www.djangoproject.com/"
"weblog/2015/jun/25/roadmap/>`__ and supports LTS (long term support) "
"versions of Django as of the feature freeze of each OpenStack release. "
"Supports for other maintained Django versions are optional and best-effort."
msgstr ""

#: ../../source/contributor/quickstart.rst:5
msgid "Quickstart"
msgstr ""

#: ../../source/contributor/quickstart.rst:9
msgid ""
"This section has been tested for Horizon on Ubuntu (18.04-amd64) and RPM-"
"based (RHEL 8.x) distributions. Feel free to add notes and any changes "
"according to your experiences or operating system."
msgstr ""

#: ../../source/contributor/quickstart.rst:14
msgid "Linux Systems"
msgstr ""

#: ../../source/contributor/quickstart.rst:16
msgid "Install the prerequisite packages."
msgstr ""

#: ../../source/contributor/quickstart.rst:18
msgid "On Ubuntu"
msgstr ""

#: ../../source/contributor/quickstart.rst:24
msgid "On RPM-based distributions (e.g., Fedora/RHEL/CentOS)"
msgstr ""

#: ../../source/contributor/quickstart.rst:32
msgid ""
"Some tests rely on the Chrome web browser being installed. While the above "
"requirements will allow you to run and manually test Horizon, you will need "
"to install Chrome to run the full test suite."
msgstr ""

#: ../../source/contributor/quickstart.rst:37
msgid "Setup"
msgstr ""

#: ../../source/contributor/quickstart.rst:39
msgid ""
"To begin setting up a Horizon development environment simply clone the "
"Horizon git repository from https://opendev.org/openstack/horizon"
msgstr ""

#: ../../source/contributor/quickstart.rst:46
msgid ""
"Next you will need to configure Horizon by adding a ``local_settings.py`` "
"file. A good starting point is to use the example config with the following "
"command, from within the ``horizon`` directory."
msgstr ""

#: ../../source/contributor/quickstart.rst:54
msgid ""
"Horizon connects to the rest of OpenStack via a Keystone service catalog. By "
"default Horizon looks for an endpoint at ``http://localhost/identity/v3``; "
"this can be customised by modifying the ``OPENSTACK_HOST`` and "
"``OPENSTACK_KEYSTONE_URL`` values in ``openstack_dashboard/local/"
"local_settings.py``"
msgstr ""

#: ../../source/contributor/quickstart.rst:62
msgid ""
"The DevStack project (http://devstack.org/) can be used to install an "
"OpenStack development environment from scratch. For a local.conf that "
"enables most services that Horizon supports managing, see :ref:`local-conf`"
msgstr ""

#: ../../source/contributor/quickstart.rst:67
msgid ""
"Horizon uses ``tox`` to manage virtual environments for testing and other "
"development tasks. You can install it with"
msgstr ""

#: ../../source/contributor/quickstart.rst:74
msgid ""
"The ``tox`` environments provide wrappers around ``manage.py``. For more "
"information on ``manage.py``, which is a Django command, see https://docs."
"djangoproject.com/en/dev/ref/django-admin/"
msgstr ""

#: ../../source/contributor/quickstart.rst:78
msgid "To start the Horizon development server use the command below"
msgstr ""

#: ../../source/contributor/quickstart.rst:86
msgid ""
"The default port for runserver is 8000 which might be already consumed by "
"heat-api-cfn in DevStack. If running in DevStack ``tox -e runserver -- "
"localhost:9000`` will start the test server at ``http://localhost:9000``. If "
"you use ``tox -e runserver`` for developments, then configure "
"``SESSION_ENGINE`` to ``django.contrib.sessions.backends.signed_cookies`` in "
"``openstack_dashboard/local/local_settings.py`` file."
msgstr ""

#: ../../source/contributor/quickstart.rst:94
msgid ""
"Once the Horizon server is running, point a web browser to ``http://"
"localhost`` or to the IP and port the server is listening for. Enter your "
"Keystone credentials, log in and you'll be presented with the Horizon "
"dashboard. Congratulations!"
msgstr ""

#: ../../source/contributor/quickstart.rst:100
msgid "Managing Settings"
msgstr ""

#: ../../source/contributor/quickstart.rst:102
msgid ""
"You can save changes you made to ``openstack_dashboard/local/local_settings."
"py`` with the following command:"
msgstr ""

#: ../../source/contributor/quickstart.rst:111
msgid ""
"This creates a ``local_settings.diff`` file which is a diff between "
"``local_settings.py`` and ``local_settings.py.example``"
msgstr ""

#: ../../source/contributor/quickstart.rst:114
msgid ""
"If you upgrade Horizon, you might need to update your ``openstack_dashboard/"
"local/local_settings.py`` file with new parameters from "
"``openstack_dashboard/local/local_settings.py.example`` to do so, first "
"update Horizon"
msgstr ""

#: ../../source/contributor/quickstart.rst:123
msgid "Then update your  ``openstack_dashboard/local/local_settings.py`` file"
msgstr ""

#: ../../source/contributor/quickstart.rst:132
msgid ""
"This applies ``openstack_dashboard/local/local_settings.diff`` on "
"``openstack_dashboard/local/local_settings.py.example`` to regenerate an "
"``openstack_dashboard/local/local_settings.py`` file. The migration can "
"sometimes have difficulties to migrate some settings, if this happens you "
"will be warned with a conflict message pointing to an ``openstack_dashboard/"
"local/local_settings.py_Some_DateTime.rej`` file. In this file, you will see "
"the lines which could not be automatically changed and you will have to redo "
"only these few changes manually instead of modifying the full "
"``openstack_dashboard/local/local_settings.py.example`` file."
msgstr ""

#: ../../source/contributor/quickstart.rst:143
msgid ""
"When all settings have been migrated, it is safe to regenerate a clean diff "
"in order to prevent Conflicts for future migrations"
msgstr ""

#: ../../source/contributor/quickstart.rst:152
msgid "Editing Horizon's Source"
msgstr ""

#: ../../source/contributor/quickstart.rst:154
msgid ""
"Although DevStack installs and configures an instance of Horizon when "
"running stack.sh, the preferred development setup follows the instructions "
"above on the server/VM running DevStack. There are several advantages to "
"maintaining a separate copy of the Horizon repo, rather than editing the "
"DevStack installed copy."
msgstr ""

#: ../../source/contributor/quickstart.rst:160
msgid ""
"Source code changes aren't as easily lost when running ``unstack.sh`` / "
"``stack.sh``"
msgstr ""

#: ../../source/contributor/quickstart.rst:162
msgid ""
"The development server picks up source code changes while still running."
msgstr ""

#: ../../source/contributor/quickstart.rst:163
msgid "Log messages and print statements go directly to the console."
msgstr ""

#: ../../source/contributor/quickstart.rst:164
msgid "Debugging with ``pdb`` becomes much simpler to interact with."
msgstr ""

#: ../../source/contributor/quickstart.rst:168
msgid ""
"To ensure that JS and CSS changes are picked up without a server restart, "
"you can disable compression with ``COMPRESS_ENABLED = False`` in your local "
"settings file."
msgstr ""

#: ../../source/contributor/quickstart.rst:173
msgid "Horizon's Structure"
msgstr ""

#: ../../source/contributor/quickstart.rst:175
msgid ""
"This project is a bit different from other OpenStack projects in that it has "
"two very distinct components underneath it: ``horizon``, and "
"``openstack_dashboard``."
msgstr ""

#: ../../source/contributor/quickstart.rst:179
msgid ""
"The ``horizon`` directory holds the generic libraries and components that "
"can be used in any Django project."
msgstr ""

#: ../../source/contributor/quickstart.rst:182
msgid ""
"The ``openstack_dashboard`` directory contains a reference Django project "
"that uses ``horizon``."
msgstr ""

#: ../../source/contributor/quickstart.rst:185
msgid ""
"If dependencies are added to either ``horizon`` or ``openstack_dashboard``, "
"they should be added to ``requirements.txt``."
msgstr ""

#: ../../source/contributor/quickstart.rst:189
msgid "Project Structure"
msgstr ""

#: ../../source/contributor/quickstart.rst:192
msgid "Dashboard configuration"
msgstr ""

#: ../../source/contributor/quickstart.rst:194
msgid ""
"To add a new dashboard to your project, you need to add a configuration file "
"to ``openstack_dashboard/local/enabled`` directory. For more information on "
"this, see :ref:`pluggable-settings-label`."
msgstr ""

#: ../../source/contributor/quickstart.rst:199
#: ../../source/contributor/tutorials/dashboard.rst:458
msgid "URLs"
msgstr ""

#: ../../source/contributor/quickstart.rst:201
msgid "Then you add a single line to your project's ``urls.py``"
msgstr ""

#: ../../source/contributor/quickstart.rst:207
msgid ""
"Those urls are automatically constructed based on the registered Horizon "
"apps. If a different URL structure is desired it can be constructed by hand."
msgstr ""

#: ../../source/contributor/quickstart.rst:211
msgid "Templates"
msgstr ""

#: ../../source/contributor/quickstart.rst:213
msgid ""
"Pre-built template tags generate navigation. In your ``nav.html`` template "
"you might have the following"
msgstr ""

#: ../../source/contributor/quickstart.rst:224
msgid "And in your ``sidebar.html`` you might have"
msgstr ""

#: ../../source/contributor/quickstart.rst:234
msgid ""
"These template tags are aware of the current \"active\" dashboard and panel "
"via template context variables and will render accordingly."
msgstr ""

#: ../../source/contributor/quickstart.rst:238
msgid "Application Design"
msgstr ""

#: ../../source/contributor/quickstart.rst:241
#: ../../source/contributor/tutorials/dashboard.rst:55
#: ../../source/contributor/tutorials/dashboard.rst:130
msgid "Structure"
msgstr ""

#: ../../source/contributor/quickstart.rst:243
msgid ""
"An application would have the following structure (we'll use project as an "
"example)"
msgstr ""

#: ../../source/contributor/quickstart.rst:265
msgid "Dashboard Classes"
msgstr ""

#: ../../source/contributor/quickstart.rst:267
msgid ""
"Inside of ``dashboard.py`` you would have a class definition and the "
"registration process"
msgstr ""

#: ../../source/contributor/quickstart.rst:295
msgid "Panel Classes"
msgstr ""

#: ../../source/contributor/quickstart.rst:297
msgid ""
"To connect a :class:`~horizon.Panel` with a :class:`~horizon.Dashboard` "
"class you register it in a ``panel.py`` file"
msgstr ""

#: ../../source/contributor/quickstart.rst:316
msgid ""
"By default a :class:`~horizon.Panel` class looks for a ``urls.py`` file in "
"the same directory as ``panel.py`` to include in the rollup of url patterns "
"from panels to dashboards to Horizon, resulting in a wholly extensible, "
"configurable URL structure."
msgstr ""

#: ../../source/contributor/quickstart.rst:321
msgid ""
"Policy rules are defined in ``horizon/openstack_dashboard/conf/``. "
"Permissions are inherited from Keystone and take either the form 'openstack."
"roles.role_name' or 'openstack.services.service_name' for the user's roles "
"in keystone and the services in their service catalog."
msgstr ""

#: ../../source/contributor/ref/context_processors.rst:3
msgid "Horizon Context Processors"
msgstr ""

#: ../../source/contributor/ref/decorators.rst:3
msgid "Horizon Decorators"
msgstr ""

#: ../../source/contributor/ref/exceptions.rst:3
msgid "Horizon Exceptions"
msgstr ""

#: ../../source/contributor/ref/forms.rst:3
msgid "Horizon Forms"
msgstr ""

#: ../../source/contributor/ref/forms.rst:5
msgid ""
"Horizon ships with some very useful base form classes, form fields, class-"
"based views, and javascript helpers which streamline most of the common "
"tasks related to form handling."
msgstr ""

#: ../../source/contributor/ref/forms.rst:10
msgid "Form Classes"
msgstr ""

#: ../../source/contributor/ref/forms.rst:16
msgid "Form Fields"
msgstr ""

#: ../../source/contributor/ref/forms.rst:22
msgid "Form Views"
msgstr ""

#: ../../source/contributor/ref/forms.rst:28
msgid "Forms Javascript"
msgstr ""

#: ../../source/contributor/ref/forms.rst:31
msgid "Switchable Fields"
msgstr ""

#: ../../source/contributor/ref/forms.rst:33
msgid ""
"By marking fields with the ``\"switchable\"`` and ``\"switched\"`` classes "
"along with defining a few data attributes you can programmatically hide, "
"show, and rename fields in a form."
msgstr ""

#: ../../source/contributor/ref/forms.rst:37
msgid ""
"The triggers are fields using a ``select`` input widget, marked with the "
"\"switchable\" class, and defining a \"data-slug\" attribute. When they are "
"changed, any input with the ``\"switched\"`` class and defining a ``\"data-"
"switch-on\"`` attribute which matches the ``select`` input's ``\"data-slug"
"\"`` attribute will be evaluated for necessary changes. In simpler terms, if "
"the ``\"switched\"`` target input's ``\"switch-on\"`` matches the ``\"slug"
"\"`` of the ``\"switchable\"`` trigger input, it gets switched. Simple, "
"right?"
msgstr ""

#: ../../source/contributor/ref/forms.rst:45
msgid ""
"The ``\"switched\"`` inputs also need to define states. For each state in "
"which the input should be shown, it should define a data attribute like the "
"following: ``data-<slug>-<value>=\"<desired label>\"``. When the switch "
"event happens the value of the ``\"switchable\"`` field will be compared to "
"the data attributes and the correct label will be applied to the field. If a "
"corresponding label for that value is *not* found, the field will be hidden "
"instead."
msgstr ""

#: ../../source/contributor/ref/forms.rst:53
msgid "A simplified example is as follows::"
msgstr ""

#: ../../source/contributor/ref/forms.rst:87
msgid ""
"That code would create the ``\"switchable\"`` control field ``source``, and "
"the two ``\"switched\"`` fields ``cidr`` and ``security group`` which are "
"hidden or shown depending on the value of ``source``."
msgstr ""

#: ../../source/contributor/ref/forms.rst:93
msgid ""
"A field can only safely define one slug in its ``\"switch-on\"`` attribute. "
"While switching on multiple fields is possible, the behavior is very hard to "
"predict due to the events being fired from the various switchable fields in "
"order. You generally end up just having it hidden most of the time by "
"accident, so it's not recommended. Instead just add a second field to the "
"form and control the two independently, then merge their results in the "
"form's clean or handle methods at the end."
msgstr ""

#: ../../source/contributor/ref/horizon.rst:3
msgid "The Horizon Module"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:7
msgid ""
"Horizon ships with a single point of contact for hooking into your project "
"if you aren't developing your own :class:`~horizon.Dashboard` or :class:"
"`~horizon.Panel`::"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:13
msgid "From there you can access all the key methods you need."
msgstr ""

#: ../../source/contributor/ref/horizon.rst:16
msgid "Horizon"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:20
msgid "The auto-generated URLconf for horizon. Usage::"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:33
msgid "Dashboard"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:39
msgid "Panel"
msgstr ""

#: ../../source/contributor/ref/horizon.rst:45
msgid "Panel Group"
msgstr ""

#: ../../source/contributor/ref/index.rst:3
msgid "Module Reference"
msgstr ""

#: ../../source/contributor/ref/index.rst:6
msgid "Horizon Framework"
msgstr ""

#: ../../source/contributor/ref/index.rst:23
msgid "openstack_auth Module"
msgstr ""

#: ../../source/contributor/ref/middleware.rst:3
msgid "Horizon Middleware"
msgstr ""

#: ../../source/contributor/ref/middleware.rst:6
msgid "HorizonMiddleware"
msgstr ""

#: ../../source/contributor/ref/middleware.rst:12
msgid "OperationLogMiddleware"
msgstr ""

#: ../../source/contributor/ref/openstack_auth/backend.rst:3
msgid "The Backend Module"
msgstr ""

#: ../../source/contributor/ref/openstack_auth/forms.rst:3
msgid "The Forms Module"
msgstr ""

#: ../../source/contributor/ref/openstack_auth/user.rst:3
msgid "The User Module"
msgstr ""

#: ../../source/contributor/ref/openstack_auth/utils.rst:3
msgid "The Utils Module"
msgstr ""

#: ../../source/contributor/ref/openstack_auth/views.rst:3
msgid "The Views Module"
msgstr ""

#: ../../source/contributor/ref/tables.rst:5
msgid "Horizon DataTables"
msgstr ""

#: ../../source/contributor/ref/tables.rst:9
msgid ""
"Horizon includes a componentized API for programmatically creating tables in "
"the UI. Why would you want this? It means that every table renders correctly "
"and consistently, table-level and row-level actions all have a consistent "
"API and appearance, and generally you don't have to reinvent the wheel or "
"copy-and-paste every time you need a new table!"
msgstr ""

#: ../../source/contributor/ref/tables.rst:17
msgid ""
"For usage information, tips & tricks and more examples check out the :ref:"
"`topics-datatables`."
msgstr ""

#: ../../source/contributor/ref/tables.rst:21
msgid "DataTable"
msgstr ""

#: ../../source/contributor/ref/tables.rst:23
msgid ""
"The core class which defines the high-level structure of the table being "
"represented. Example::"
msgstr ""

#: ../../source/contributor/ref/tables.rst:35
msgid "A full reference is included below:"
msgstr ""

#: ../../source/contributor/ref/tables.rst:41
msgid "DataTable Options"
msgstr ""

#: ../../source/contributor/ref/tables.rst:43
msgid ""
"The following options can be defined in a ``Meta`` class inside a :class:`."
"DataTable` class. Example::"
msgstr ""

#: ../../source/contributor/ref/tables.rst:55
msgid "FormsetDataTable"
msgstr ""

#: ../../source/contributor/ref/tables.rst:57
msgid ""
"You can integrate the :class:`.DataTable` with a Django Formset using one of "
"following classes:"
msgstr ""

#: ../../source/contributor/ref/tables.rst:67
msgid "Table Components"
msgstr ""

#: ../../source/contributor/ref/tables.rst:76
#: ../../source/contributor/ref/workflows.rst:31
#: ../../source/contributor/topics/tables.rst:68
msgid "Actions"
msgstr ""

#: ../../source/contributor/ref/tables.rst:97
msgid "Class-Based Views"
msgstr ""

#: ../../source/contributor/ref/tables.rst:99
msgid ""
"Several class-based views are provided to make working with DataTables "
"easier in your UI."
msgstr ""

#: ../../source/contributor/ref/tabs.rst:3
msgid "Horizon Tabs and TabGroups"
msgstr ""

#: ../../source/contributor/ref/tabs.rst:7
msgid ""
"Horizon includes a set of reusable components for programmatically building "
"tabbed interfaces with fancy features like dynamic AJAX loading and nearly "
"effortless templating and styling."
msgstr ""

#: ../../source/contributor/ref/tabs.rst:12
msgid "Tab Groups"
msgstr ""

#: ../../source/contributor/ref/tabs.rst:14
msgid ""
"For any tabbed interface, your fundamental element is the tab group which "
"contains all your tabs. This class provides a dead-simple API for building "
"tab groups and encapsulates all the necessary logic behind the scenes."
msgstr ""

#: ../../source/contributor/ref/tabs.rst:22
msgid "Tabs"
msgstr ""

#: ../../source/contributor/ref/tabs.rst:24
msgid ""
"The tab itself is the discrete unit for a tab group, representing one view "
"of data."
msgstr ""

#: ../../source/contributor/ref/tabs.rst:36
msgid "TabView"
msgstr ""

#: ../../source/contributor/ref/tabs.rst:38
msgid ""
"There is also a useful and simple generic class-based view for handling the "
"display of a :class:`~horizon.tabs.TabGroup` class."
msgstr ""

#: ../../source/contributor/ref/test.rst:3
msgid "Horizon TestCase Classes"
msgstr ""

#: ../../source/contributor/ref/test.rst:7
msgid ""
"Horizon provides a base test case class which provides several useful pre-"
"prepared attributes for testing Horizon components."
msgstr ""

#: ../../source/contributor/ref/test.rst:15
msgid ""
"The OpenStack Dashboard also provides test case classes for greater ease-of-"
"use when testing APIs and OpenStack-specific auth scenarios."
msgstr ""

#: ../../source/contributor/ref/workflows.rst:5
msgid "Horizon Workflows"
msgstr ""

#: ../../source/contributor/ref/workflows.rst:9
#: ../../source/contributor/topics/workflows.rst:7
msgid ""
"One of the most challenging aspects of building a compelling user experience "
"is crafting complex multi-part workflows. Horizon's ``workflows`` module "
"aims to bring that capability within everyday reach."
msgstr ""

#: ../../source/contributor/ref/workflows.rst:15
msgid ""
"For usage information, tips & tricks and more examples check out the :ref:"
"`topics-workflows`."
msgstr ""

#: ../../source/contributor/ref/workflows.rst:19
#: ../../source/contributor/topics/workflows.rst:16
msgid "Workflows"
msgstr ""

#: ../../source/contributor/ref/workflows.rst:25
msgid "Steps"
msgstr ""

#: ../../source/contributor/ref/workflows.rst:37
msgid "WorkflowView"
msgstr ""

#: ../../source/contributor/testing.rst:3
msgid "Horizon's tests and you"
msgstr ""

#: ../../source/contributor/testing.rst:6
msgid "How to run the tests"
msgstr ""

#: ../../source/contributor/testing.rst:8
msgid ""
"Because Horizon is composed of both the ``horizon`` app and the "
"``openstack_dashboard`` reference project, there are in fact two sets of "
"unit tests. While they can be run individually without problem, there is an "
"easier way:"
msgstr ""

#: ../../source/contributor/testing.rst:13
msgid ""
"Included at the root of the repository is the ``tox.ini`` config which "
"invokes both sets of tests, and optionally generates analyses on both "
"components in the process. ``tox`` is what Jenkins uses to verify the "
"stability of the project, so you should make sure you run it and it passes "
"before you submit any pull requests/patches."
msgstr ""

#: ../../source/contributor/testing.rst:19
msgid "To run all tests::"
msgstr ""

#: ../../source/contributor/testing.rst:23
msgid ""
"It's also possible to run a subset of the tests. Open ``tox.ini`` in the "
"Horizon root directory to see a list of test environments. You can read more "
"about tox in general at https://tox.readthedocs.io/en/latest/."
msgstr ""

#: ../../source/contributor/testing.rst:27
msgid ""
"By default running the Selenium tests will open your Firefox browser (you "
"have to install it first, else an error is raised), and you will be able to "
"see the tests actions::"
msgstr ""

#: ../../source/contributor/testing.rst:33
msgid ""
"If you want to run the suite headless, without being able to see them (as "
"they are ran on Jenkins), you can run the tests::"
msgstr ""

#: ../../source/contributor/testing.rst:38
msgid ""
"Selenium will use a virtual display in this case, instead of your own. In "
"order to run the tests this way you have to install the dependency `xvfb`, "
"like this::"
msgstr ""

#: ../../source/contributor/testing.rst:44
msgid "for a Debian OS flavour, or for Fedora/Red Hat flavours::"
msgstr ""

#: ../../source/contributor/testing.rst:48
msgid ""
"If you can't run a virtual display, or would prefer not to, you can use the "
"PhantomJS web driver instead::"
msgstr ""

#: ../../source/contributor/testing.rst:53
msgid "If you need to install PhantomJS, you may do so with `npm` like this::"
msgstr ""

#: ../../source/contributor/testing.rst:57
msgid ""
"Alternatively, many distributions have system packages for PhantomJS, or it "
"can be downloaded from http://phantomjs.org/download.html."
msgstr ""

#: ../../source/contributor/testing.rst:60
msgid "To run integration tests you should use `integration` tox environment::"
msgstr ""

#: ../../source/contributor/testing.rst:64
msgid ""
"These tests requires `geckodriver` installed. It could be downloaded from "
"https://github.com/mozilla/geckodriver/releases."
msgstr ""

#: ../../source/contributor/testing.rst:68
msgid "tox Test Environments"
msgstr ""

#: ../../source/contributor/testing.rst:70
msgid ""
"This is a list of test environments available to be executed by ``tox -e "
"<name>``."
msgstr ""

#: ../../source/contributor/testing.rst:74
msgid "pep8"
msgstr ""

#: ../../source/contributor/testing.rst:76
msgid ""
"Runs pep8, which is a tool that checks Python code style. You can read more "
"about pep8 at https://www.python.org/dev/peps/pep-0008/"
msgstr ""

#: ../../source/contributor/testing.rst:80
msgid "py37"
msgstr ""

#: ../../source/contributor/testing.rst:82
msgid ""
"Runs the Python unit tests against the current default version of Django "
"with Python 3.7 environment. Check ``requirements.txt`` in horizon "
"repository to know which version of Django is actually used."
msgstr ""

#: ../../source/contributor/testing.rst:86
msgid ""
"All other dependencies are as defined by the upper-constraints file at "
"https://opendev.org/openstack/requirements/raw/branch/master/upper-"
"constraints.txt"
msgstr ""

#: ../../source/contributor/testing.rst:89
msgid ""
"You can run a subset of the tests by passing the test path as an argument to "
"tox::"
msgstr ""

#: ../../source/contributor/testing.rst:94
msgid ""
"The following is more example to run a specific test class and a specific "
"test:"
msgstr ""

#: ../../source/contributor/testing.rst:102
msgid ""
"The detail way to specify tests is found at `pytest documentation <https://"
"docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests>`__."
msgstr ""

#: ../../source/contributor/testing.rst:105
msgid ""
"You can also pass other arguments. For example, to drop into a live debugger "
"when a test fails you can use::"
msgstr ""

#: ../../source/contributor/testing.rst:111
msgid "py3-dj111, py3-dj21, py3-dj22"
msgstr ""

#: ../../source/contributor/testing.rst:113
msgid ""
"Runs the Python unit tests against Django 1.11, Django 2.1 and Django 2.2 "
"respectively"
msgstr ""

#: ../../source/contributor/testing.rst:117
msgid "py36"
msgstr ""

#: ../../source/contributor/testing.rst:119
msgid "Runs the Python unit tests with a Python 3.6 environment."
msgstr ""

#: ../../source/contributor/testing.rst:122
msgid "releasenotes"
msgstr ""

#: ../../source/contributor/testing.rst:124
msgid "Outputs Horizons release notes as HTML to ``releasenotes/build/html``."
msgstr ""

#: ../../source/contributor/testing.rst:126
msgid ""
"Also takes an alternative builder as an optional argument, such as ``tox -e "
"docs -- <builder>``, which will output to ``releasenotes/build/<builder>``. "
"Available builders are listed at http://www.sphinx-doc.org/en/latest/"
"builders.html"
msgstr ""

#: ../../source/contributor/testing.rst:131
msgid ""
"This environment also runs the documentation style checker ``doc8`` against "
"RST and YAML files under ``releasenotes/source`` to keep the documentation "
"style consistent. If you would like to run ``doc8`` manually, see **docs** "
"environment below."
msgstr ""

#: ../../source/contributor/testing.rst:137
msgid "npm"
msgstr ""

#: ../../source/contributor/testing.rst:139
msgid ""
"Installs the npm dependencies listed in ``package.json`` and runs the "
"JavaScript tests. Can also take optional arguments, which will be executed "
"as an npm script following the dependency install, instead of ``test``."
msgstr ""

#: ../../source/contributor/testing.rst:143
#: ../../source/contributor/testing.rst:157
#: ../../source/contributor/topics/tables.rst:280
#: ../../source/contributor/topics/tables.rst:305
msgid "Example::"
msgstr ""

#: ../../source/contributor/testing.rst:148
msgid "docs"
msgstr ""

#: ../../source/contributor/testing.rst:150
msgid "Outputs Horizons documentation as HTML to ``doc/build/html``."
msgstr ""

#: ../../source/contributor/testing.rst:152
msgid ""
"Also takes an alternative builder as an optional argument, such as ``tox -e "
"docs -- <builder>``, which will output to ``doc/build/<builder>``. Available "
"builders are listed at http://www.sphinx-doc.org/en/latest/builders.html"
msgstr ""

#: ../../source/contributor/testing.rst:161
msgid ""
"This environment also runs the documentation style checker ``doc8`` against "
"RST files under ``doc/source`` to keep the documentation style consistent. "
"If you would like to run ``doc8`` manually, run:"
msgstr ""

#: ../../source/contributor/testing.rst:172
msgid "Writing tests"
msgstr ""

#: ../../source/contributor/testing.rst:174
msgid ""
"Horizon uses Django's unit test machinery (which extends Python's "
"``unittest2`` library) as the core of its test suite. As such, all tests for "
"the Python code should be written as unit tests. No doctests please."
msgstr ""

#: ../../source/contributor/testing.rst:178
msgid ""
"In general new code without unit tests will not be accepted, and every "
"bugfix *must* include a regression test."
msgstr ""

#: ../../source/contributor/testing.rst:181
msgid ""
"For a much more in-depth discussion of testing, see the :ref:`testing topic "
"guide <topics-testing>`."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:5
msgid "AngularJS Topic Guide"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:8
msgid ""
"This guide is a work in progress. It has been uploaded to encourage faster "
"reviewing and code development in Angular, and to help the community "
"standardize on a set of guidelines. There are notes inline on sections that "
"are likely to change soon, and the docs will be updated promptly after any "
"changes."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:15
msgid "Getting Started"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:17
msgid ""
"The tooling for AngularJS testing and code linting relies on npm, the node "
"package manager, and thus relies on Node.js. While it is not a prerequisite "
"to developing with Horizon, it is advisable to install Node.js, either "
"through `downloading <https://nodejs.org/download/>`_ or `via a package "
"manager <https://github.com/nodejs/node-v0.x-archive/wiki/Installing-Node.js-"
"via-package-manager>`_."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:23
msgid ""
"Once you have npm available on your system, run ``npm install`` from the "
"horizon root directory."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:29
#: ../../source/contributor/topics/code-style.rst:3
msgid "Code Style"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:31
msgid ""
"We currently use the `Angular Style Guide`_ by John Papa as reference "
"material. When reviewing AngularJS code, it is helpful to link directly to "
"the style guide to reinforce a point, e.g. https://github.com/johnpapa/"
"angular-styleguide#style-y024"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:39
#: ../../source/contributor/topics/code-style.rst:247
msgid "ESLint"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:41
msgid ""
"ESLint is a tool for identifying and reporting on patterns in your JS code, "
"and is part of the automated tests run by Jenkins. You can run ESLint from "
"the horizon root directory with ``tox -e npm -- lint``, or alternatively on "
"a specific directory or file with ``eslint file.js``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:46
msgid ""
"Horizon includes a `.eslintrc` in its root directory, that is used by the "
"local tests. An explanation of the options, and details of others you may "
"want to use, can be found in the `ESLint user guide <https://eslint.org/docs/"
"user-guide/configuring>`_."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:52
msgid "Application Structure"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:54
msgid ""
"OpenStack Dashboard is an example of a Horizon-based Angular application. "
"Other applications built on the Horizon framework can follow a similar "
"structure. It is composed of two key Angular modules:"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:59
msgid ""
"**app.module.js** - The root of the application. Defines the modules "
"required by"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:59
msgid "the application, and includes modules from its pluggable dashboards."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:62
msgid "**framework.module.js** - Reusable Horizon components. It is one of the"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:62
msgid "application dependencies."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:67
#: ../../source/contributor/tutorials/plugin.rst:58
#: ../../source/contributor/tutorials/workflow_extend.rst:24
msgid "File Structure"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:69
msgid "Horizon has three kinds of angular code:"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:71
msgid "Specific to one dashboard in the OpenStack Dashboard application"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:72
msgid ""
"Specific to the OpenStack Dashboard application, but reusable by multiple "
"dashboards"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:74
msgid "Reusable by any application based on the Horizon framework"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:76
msgid ""
"When adding code to horizon, consider whether it is dashboard-specific or "
"should be broken out as a reusable utility or widget."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:80
msgid "Code specific to one dashboard"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:82
msgid ""
"Code that isn't shared beyond a single dashboard is placed in "
"``openstack_dashboard/dashboards/mydashboard/static``. Entire dashboards may "
"be enabled or disabled using Horizon's plugin mechanism. Therefore no "
"dashboards other than ``mydashboard`` can safely use this code."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:87
msgid ""
"The ``openstack_dashboard/dashboards/mydashboard/static`` directory "
"structure determines how the code is deployed and matches the module "
"structure. For example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:97
msgid ""
"Because the code is in ``openstack_dashboard/dashboards/identity`` we know "
"it is specific to just the ``identity`` dashboard and not used by any others."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:101
msgid "Code shared by multiple dashboards"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:103
msgid ""
"Views or utilities needed by multiple dashboards are placed in "
"``openstack_dashboard/static/app``. For example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:113
msgid ""
"The ``cloud-services`` module is used by panels in multiple dashboards. It "
"cannot be placed within ``openstack_dashboard/dashboards/mydashboard`` "
"because disabling that one dashboard would break others. Therefore, it is "
"included as part of the application ``core`` module. Code in ``app/`` is "
"guaranteed to always be present, even if all other dashboards are disabled."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:120
msgid "Reusable components"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:122
msgid ""
"Finally, components that are easily reused by any application are placed in "
"``horizon/static/framework/``. These do not contain URLs or business logic "
"that is specific to any application (even the OpenStack Dashboard "
"application)."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:126
msgid ""
"The modal directive ``horizon/static/framework/widgets/modal/`` is a good "
"example of a reusable component."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:130
msgid "One folder per component"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:132
msgid ""
"Each component should have its own folder, with the code broken up into one "
"JS component per file. (See `Single Responsibility <https://github.com/"
"johnpapa/angular-styleguide#single-responsibility>`_ in the style guide). "
"Each folder may include styling (``*.scss``), as well as templates (``*."
"html``) and tests (``*.spec.js``). You may also include examples, by "
"appending ``.example``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:139
msgid ""
"For larger components, such as workflows with multiple steps, consider "
"breaking the code down further. For example, the Launch Instance workflow, "
"has one directory per step. See ``openstack_dashboard/dashboards/project/"
"static/dashboard/project/workflow/launch-instance/``"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:145
msgid "SCSS files"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:147
msgid ""
"The top-level SCSS file in ``openstack_dashboard/static/app/_app.scss``. It "
"includes any styling that is part of the application ``core`` and may be "
"reused by multiple dashboards. SCSS files that are specific to a particular "
"dashboard are linked to the application by adding them in that dashboard's "
"enabled file. For example, `_1920_project_containers_panel.py` is the "
"enabled file for the ``Project`` dashboard's ``Container`` panel and "
"includes: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:159
msgid ""
"Styling files are hierarchical, and include any direct child SCSS files. For "
"example, ``project.scss`` would includes the ``workflow`` SCSS file, which "
"in turn includes any launch instance styling: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:166
msgid ""
"This allows the application to easily include all needed styling, simply by "
"including a dashboard's top-level SCSS file."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:170
msgid "Module Structure"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:172
msgid ""
"Horizon Angular modules use names that map to the source code directory "
"structure. This provides namespace isolation for modules and services, which "
"makes dependency injection clearer. It also reduces code conflicts where two "
"different modules define a module, service or constant of the same name. For "
"example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:182
msgid ""
"The preferred Angular module name in this example is ``horizon.dashboard."
"identity``. The ``horizon`` part of the module name maps to the ``static`` "
"directory and indicates this is a ``horizon`` based application. ``dashboard."
"identity`` maps to folders that are created within ``static``. This allows a "
"direct mapping between the angular module name of ``horizon.dashboard."
"identity`` and the source code directory of ``static\\dashboard\\identity``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:190
msgid ""
"Services and constants within these modules should all start with their "
"module name to avoid dependency injection collisions. For example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:196
msgid ""
"Directives do not require the module name but are encouraged to begin with "
"the ``hz`` prefix. For example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:202
msgid ""
"Finally, each module lists its child modules as a dependency. This allows "
"the root module to be included by an application, which will automatically "
"define all child modules. For example: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:213
msgid ""
"``horizon.framework`` declares a dependency on ``horizon.framework."
"widgets``, which declares dependencies on each individual widget. This "
"allows the application to access any widget, simply by depending on the top-"
"level ``horizon.framework`` module."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:219
#: ../../source/contributor/tutorials/workflow_extend.rst:203
msgid "Testing"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:221
msgid ""
"Open <dev_server_ip:port>/jasmine in a browser. The development server can "
"be run with ``tox -e runserver`` from the horizon root directory; by "
"default, this will run the development server at ``http://localhost:8000``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:224
msgid "``tox -e npm`` from the horizon root directory."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:226
msgid ""
"The code linting job can be run with ``tox -e npm -- lint``. If there are "
"many warnings, you can also use ``tox -e npm -- lintq`` to see only errors "
"and ignore warnings."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:230
msgid "For more detailed information, see :ref:`topics-javascript-testing`."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:233
msgid "Translation (Internationalization and Localization)"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:235
msgid ""
"See :ref:`making_strings_translatable` for information on the translation "
"architecture and how to ensure your code is translatable."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:239
msgid "Creating your own panel"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:242
msgid ""
"This section will be extended as standard practices are adopted upstream. "
"Currently, it may be useful to look at the Project Images Panel as a "
"complete reference. Since Newton, it is Angular by default (set to True in "
"the ANGULAR_FEATURES dict in ``settings.py``). You may track all the changes "
"made to the Image Panel `here <https://github.com/openstack/horizon/commits/"
"master/openstack_dashboard/static/app/core/images>`__"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:250
msgid ""
"Currently, Angular module names must still be manually declared with "
"``ADD_ANGULAR_MODULES``, even when using automatic file discovery."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:253
msgid ""
"This section serves as a basic introduction to writing your own panel for "
"horizon, using AngularJS. A panel may be included with the plugin system, or "
"it may be part of the upstream horizon project."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:258
msgid "Upstream"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:260
msgid ""
"JavaScript files can be discovered automatically, handled manually, or a mix "
"of the two. Where possible, use the automated mechanism. To use the "
"automatic functionality, add::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:266
msgid ""
"to your enabled file (``enabled/<plugin_name>.py``). To make this possible, "
"you need to follow some structural conventions:"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:269
msgid ""
"Static files should be put in a ``static/`` folder, which should be found "
"directly under the folder for the dashboard/panel/panel groups Python "
"package."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:272
msgid ""
"JS code that defines an Angular module should be in a file with extension of "
"``.module.js``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:274
msgid ""
"JS code for testing should be named with extension of ``.mock.js`` and of ``."
"spec.js``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:276
msgid "Angular templates should have extension of ``.html``."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:278
#: ../../source/contributor/topics/javascript_testing.rst:89
msgid ""
"You can read more about the functionality in the :ref:"
"`auto_discover_static_files` section of the settings documentation."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:281
msgid ""
"To manually add files, add the following arrays and file paths to the "
"enabled file: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:304
msgid "Plugins"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:306
msgid ""
"Add a new panel/ panel group/ dashboard (See :ref:`tutorials-dashboard`). "
"JavaScript file inclusion is the same as the Upstream process."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:309
msgid ""
"To include external stylesheets, you must ensure that ``ADD_SCSS_FILES`` is "
"defined in your enabled file, and add the relevant filepath, as below: ::"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:320
msgid ""
"We highly recommend using a single SCSS file for your plugin. SCSS supports "
"nesting with @import, so if you have multiple files (i.e. per panel styling) "
"it is best to import them all into one, and include that single file. You "
"can read more in the `SASS documentation`_."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:328
msgid "Schema Forms"
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:330
msgid ""
"`JSON schemas`_ are used to define model layout and then `angular-schema-"
"form`_ is used to create forms from that schema. Horizon adds some "
"functionality on top of that to make things even easier through "
"``ModalFormService`` which will open a modal with the form inside."
msgstr ""

#: ../../source/contributor/topics/angularjs.rst:335
msgid "A very simple example::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:5
msgid "As a project, Horizon adheres to code quality standards."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:8
msgid "Python"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:10
msgid ""
"We follow PEP8_ for all our Python code, and use ``pep8.py`` (available via "
"the shortcut ``tox -e pep8``) to validate that our code meets proper Python "
"style guidelines."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:17
msgid "Django"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:19
msgid ""
"Additionally, we follow `Django's style guide`_ for templates, views, and "
"other miscellany."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:25
msgid "JavaScript"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:27
msgid ""
"The following standards are divided into required and recommended sections. "
"Our main goal in establishing these best practices is to have code that is "
"reliable, readable, and maintainable."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:32
#: ../../source/contributor/topics/code-style.rst:234
msgid "Required"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:34
msgid "**Reliable**"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:36
msgid ""
"The code has to work on the stable and latest versions of Firefox, Chrome, "
"Safari, and Opera web browsers, and on Microsoft Internet Explorer 11 and "
"later."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:40
msgid ""
"If you turned compression off during development via ``COMPRESS_ENABLED = "
"False`` in local_settings.py, re-enable compression and test your code "
"before submitting."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:44
msgid ""
"Use ``===`` as opposed to ``==`` for equality checks. The ``==`` will do a "
"type cast before comparing, which can lead to unwanted results."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:49
msgid ""
"If typecasting is desired, explicit casting is preferred to keep the meaning "
"of your code clear."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:52
msgid ""
"Keep document reflows to a minimum. DOM manipulation is expensive, and can "
"become a performance issue. If you are accessing the DOM, make sure that you "
"are doing it in the most optimized way. One example is to build up a "
"document fragment and then append the fragment to the DOM in one pass "
"instead of doing multiple smaller DOM updates."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:58
msgid ""
"Use \"strict\", enclosing each JavaScript file inside a self-executing "
"function. The self-executing function keeps the strict scoped to the file, "
"so its variables and methods are not exposed to other JavaScript files in "
"the product."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:64
msgid ""
"Using strict will throw exceptions for common coding errors, like accessing "
"global vars, that normally are not flagged."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:67
msgid "Example: ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:75
msgid ""
"Use ``forEach`` | ``each`` when looping whenever possible. AngularJS and "
"jQuery both provide for each loops that provide both iteration and scope."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:78
msgid "AngularJS: ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:85
msgid "jQuery: ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:92
msgid ""
"Do not put variables or functions in the global namespace. There are several "
"reasons why globals are bad, one being that all JavaScript included in an "
"application runs in the same scope. The issue with that is if another script "
"has the same method or variable names they overwrite each other."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:96
msgid ""
"Always put ``var`` in front of your variables. Not putting ``var`` in front "
"of a variable puts that variable into the global space, see above."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:98
msgid ""
"Do not use ``eval( )``. The eval (expression) evaluates the expression "
"passed to it. This can open up your code to security vulnerabilities and "
"other issues."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:101
msgid ""
"Do not use '``with`` object {code}'. The ``with`` statement is used to "
"access properties of an object. The issue with ``with`` is that its "
"execution is not consistent, so by reading the statement in the code it is "
"not always clear how it is being used."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:106
#: ../../source/contributor/topics/code-style.rst:172
msgid "**Readable & Maintainable**"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:108
msgid "Give meaningful names to methods and variables."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:109
msgid "Avoid excessive nesting."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:110
msgid ""
"Avoid HTML and CSS in JS code. HTML and CSS belong in templates and "
"stylesheets respectively. For example:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:113
msgid "In our HTML files, we should focus on layout."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:115
msgid "Reduce the small/random ``<script>`` and ``<style>`` elements in HTML."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:117
msgid ""
"Avoid in-lining styles into element in HTML. Use attributes and classes "
"instead."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:120
msgid ""
"In our JS files, we should focus on logic rather than attempting to "
"manipulate/style elements."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:123
msgid ""
"Avoid statements such as ``element.css({property1,property2...})`` they "
"belong in a CSS class."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:126
msgid ""
"Avoid statements such as ``$(\"<div><span>abc</span></div>\")`` they belong "
"in a HTML template file. Use ``show`` | ``hide`` | ``clone`` elements if "
"dynamic content is required."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:130
msgid ""
"Avoid using classes for detection purposes only, instead, defer to "
"attributes. For example to find a div:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:138
msgid "is better found like:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:145
msgid "Avoid commented-out code."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:146
msgid "Avoid dead code."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:148
msgid "**Performance**"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:150
msgid ""
"Avoid creating instances of the same object repeatedly within the same "
"scope. Instead, assign the object to a variable and re-use the existing "
"object. For example: ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:158
msgid "A better approach: ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:165
msgid ""
"In the first approach a jQuery object for ``document`` is created each time. "
"The second approach creates only one jQuery object and reuses it. Each "
"object needs to be created, uses memory, and needs to be garbage collected."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:170
msgid "Recommended"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:174
msgid ""
"Put a comment at the top of every file explaining what the purpose of this "
"file is when the naming is not obvious. This guideline also applies to "
"methods and variables."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:177
msgid ""
"Source-code formatting – (or \"beautification\") is recommended but should "
"be used with caution. Keep in mind that if you reformat an entire file that "
"was not previously formatted the same way, it will mess up the diff during "
"the code review. It is best to use a formatter when you are working on a new "
"file by yourself, or with others who are using the same formatter. You can "
"also choose to format a selected portion of a file only. Instructions for "
"setting up ESLint for Eclipse, Sublime Text, Notepad++ and WebStorm/PyCharm "
"are provided_."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:185
msgid "Use 2 spaces for code indentation."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:186
msgid ""
"Use ``{ }`` for ``if``, ``for``, ``while`` statements, and don't combine "
"them on one line. ::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:195
msgid "Use ESLint in your development environment."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:200
msgid "AngularJS"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:204
msgid ""
"This section is intended as a quick intro to contributing with AngularJS. "
"For more detailed information, check the :ref:`topics-angularjs`."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:208
msgid "\"John Papa Style Guide\""
msgstr ""

#: ../../source/contributor/topics/code-style.rst:210
msgid ""
"The John Papa Style Guide is the primary point of reference for Angular code "
"style. This style guide has been endorsed by the AngularJS team::"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:219
msgid "The style guide is found at the below location:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:221
msgid "https://github.com/johnpapa/angular-styleguide"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:223
msgid ""
"When reviewing / writing, please refer to the sections of this guide. If an "
"issue is encountered, note it with a comment and provide a link back to the "
"specific issue. For example, code should use named functions. A review "
"noting this should provide the following link in the comments:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:228
msgid "https://github.com/johnpapa/angular-styleguide#style-y024"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:230
msgid ""
"In addition to John Papa, the following guidelines are divided into required "
"and recommended sections."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:236
msgid ""
"Scope is not the model (model is your JavaScript Objects). The scope "
"references the model. Use isolate scopes wherever possible."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:239
msgid "https://github.com/angular/angular.js/wiki/Understanding-Scopes"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:240
msgid "Read-only in templates."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:241
msgid "Write-only in controllers."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:243
msgid ""
"Since Django already uses ``{{ }}``, use ``{$ $}`` or ``{% verbatim %}`` "
"instead."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:249
msgid ""
"ESLint is a great tool to be used during your code editing to improve "
"JavaScript quality by checking your code against a configurable list of "
"checks. Therefore, JavaScript developers should configure their editors to "
"use ESLint to warn them of any such errors so they can be addressed. Since "
"ESLint has a ton of configuration options to choose from, links are provided "
"below to the options Horizon wants enforced along with the instructions for "
"setting up ESLint for Eclipse, Sublime Text, Notepad++ and WebStorm/PyCharm."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:257
msgid "Instructions for setting up ESLint: `ESLint setup instructions`_"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:260
msgid ""
"ESLint is part of the automated unit tests performed by Jenkins. The "
"automated test use the default configurations, which are less strict than "
"the configurations we recommended to run in your local development "
"environment."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:268
msgid "CSS"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:270
msgid ""
"Style guidelines for CSS are currently quite minimal. Do your best to make "
"the code readable and well-organized. Two spaces are preferred for "
"indentation so as to match both the JavaScript and HTML files."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:275
msgid "JavaScript and CSS libraries using xstatic"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:277
msgid ""
"We do not bundle third-party code in Horizon's source tree. Instead, we "
"package the required files as xstatic Python packages and add them as "
"dependencies to Horizon."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:281
msgid "To create a new xstatic package:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:283
msgid ""
"Check if the library is already packaged as xstatic on PyPi, by searching "
"for the library name. If it already is, go to step 5. If it is, but not in "
"the right version, contact the original packager to have them update it."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:286
msgid ""
"Package the library as an xstatic package by following the instructions in "
"xstatic documentation_. Install the xstatic-release_ script and follow the "
"instructions that come with it."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:289
msgid ""
"`Create a new repository under OpenStack`_. Use \"xstatic-core\" and "
"\"xstatic-ptl\" groups for the ACLs. Make sure to include the ``-pypi-wheel-"
"upload`` job in the project config."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:292
msgid ""
"`Set up PyPi`_ to allow OpenStack (the \"openstackci\" user) to publish your "
"package."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:294
msgid "Add the new package to `global-requirements`_."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:296
msgid "To make a new release of the package, you need to:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:298
msgid ""
"Ensure the version information in the `xstatic/pkg/<package name>/__init__."
"py` file is up to date, especially the `BUILD`."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:301
msgid "Push your updated package up for review in gerrit."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:302
msgid ""
"Once the review is approved and the change merged, `request a release`_ by "
"updating or creating the appropriate file for the xstatic package in the "
"`releases repository`_ under `deliverables/_independent`. That will cause it "
"to be automatically packaged and released to PyPi."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:309
msgid ""
"Note that once a package is released, you can not \"un-release\" it. You "
"should never attempt to modify, delete or rename a released package without "
"a lot of careful planning and feedback from all projects that use it."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:313
msgid ""
"For the purpose of fixing packaging mistakes, xstatic has the build number "
"mechanism. Simply fix the error, increment the build number and release the "
"newer package."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:327
msgid "Integrating a new xstatic package into Horizon"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:329
msgid "Having done a release of an xstatic package:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:331
msgid ""
"Look for the `upper-constraints.txt`_ edit related to the xstatic release "
"that was just performed. One will be created automatically by the release "
"process in the ``openstack/requirements`` project with the topic `new-"
"release`_. You should -1 that patch until you are confident Horizon does not "
"break (or you have generated a patch to fix Horizon for that release.) If no "
"upper-constraints.txt patch is automatically generated, ensure the releases "
"yaml file created in the `releases repository`_ has the \"include-pypi-link: "
"yes\" setting."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:339
msgid ""
"Pull that patch down so you have the edited upper-constraints.txt file "
"locally."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:341
msgid ""
"Set the environment variable `TOX_CONSTRAINTS_FILE` to the edited upper-"
"constraints.txt file name and run tests or local development server through "
"tox. This will pull in the precise version of the xstatic package that you "
"need."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:345
msgid "Move on to releasing once you're happy the Horizon changes are stable."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:347
msgid ""
"Releasing a new compatible version of Horizon to address issues in the new "
"xstatic release:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:350
msgid ""
"Continue to -1 the upper-constraints.txt patch above until this process is "
"complete. A +1 from a Horizon developer will indicate to the requirements "
"team that the upper-constraints.txt patch is OK to merge."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:353
msgid ""
"When submitting your changes to Horizon to address issues around the new "
"xstatic release, use a Depends-On: referencing the upper-constraints.txt "
"review. This will cause the OpenStack testing infrastructure to pull in your "
"updated xstatic package as well."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:357
msgid ""
"Merge the upper-constraints.txt patch and the Horizon patch noting that "
"Horizon's gate may be broken in the interim between these steps, so try to "
"minimise any delay there. With the Depends-On it's actually safe to +W the "
"Horizon patch, which will be held up until the related upper-constraints.txt "
"patch merges."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:362
msgid ""
"Once the upper-constraints.txt patch merges, you should propose a patch to "
"global-requirements which bumps the minimum version of the package up to the "
"upper-constraints version so that deployers / packagers who don't honor "
"upper-constraints still get compatible versions of the packages."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:372
msgid "HTML"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:374
msgid ""
"Again, readability is paramount; however be conscientious of how the browser "
"will handle whitespace when rendering the output. Two spaces is the "
"preferred indentation style to match all front-end code."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:379
msgid "Exception Handling"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:381
msgid ""
"Avoid propogating direct exception messages thrown by OpenStack APIs to the "
"UI. It is a precaution against giving obscure or possibly sensitive data to "
"a user. These error messages from the API are also not translatable. Until "
"there is a standard error handling framework implemented by the services "
"which presents clean and translated messages, horizon catches all the "
"exceptions thrown by the API and normalizes them in :func:`horizon."
"exceptions.handle`."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:390
msgid "Documentation"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:392
msgid ""
"Horizon's documentation is written in reStructuredText (reST) and uses "
"Sphinx for additional parsing and functionality, and should follow standard "
"practices for writing reST. This includes:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:396
msgid "Flow paragraphs such that lines wrap at 80 characters or less."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:397
msgid ""
"Use proper grammar, spelling, capitalization and punctuation at all times."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:398
msgid ""
"Make use of Sphinx's autodoc feature to document modules, classes and "
"functions. This keeps the docs close to the source."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:400
msgid ""
"Where possible, use Sphinx's cross-reference syntax (e.g. ``:class:`~horizon."
"foo.Bar``) when referring to other Horizon components. The better-linked our "
"docs are, the easier they are to use."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:404
msgid ""
"Be sure to generate the documentation before submitting a patch for review. "
"Unexpected warnings often appear when building the documentation, and slight "
"reST syntax errors frequently cause links or cross-references not to work "
"correctly."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:409
msgid ""
"Documentation is generated with Sphinx using the tox command. To create HTML "
"docs and man pages:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:416
msgid ""
"The results are in the doc/build/html and doc/build/man directories "
"respectively."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:420
msgid "Conventions"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:422
msgid "Simply by convention, we have a few rules about naming:"
msgstr ""

#: ../../source/contributor/topics/code-style.rst:424
msgid ""
"The term \"project\" is used in place of Keystone's \"tenant\" terminology "
"in all user-facing text. The term \"tenant\" is still used in API code to "
"make things more obvious for developers."
msgstr ""

#: ../../source/contributor/topics/code-style.rst:428
msgid ""
"The term \"dashboard\" refers to a top-level dashboard class, and \"panel\" "
"to the sub-items within a dashboard. Referring to a panel as a dashboard is "
"both confusing and incorrect."
msgstr ""

#: ../../source/contributor/topics/devstack.rst:5
msgid "DevStack for Horizon"
msgstr ""

#: ../../source/contributor/topics/devstack.rst:7
msgid ""
"Place the following content into ``devstack/local.conf`` to start the "
"services that Horizon supports in DevStack when ``stack.sh`` is run. If you "
"need to use this with a stable branch you need to add ``stable/<branch "
"name>`` to the end of each ``enable_plugin`` line (e.g. ``stable/mitaka``). "
"You can also check out DevStack using a stable branch tag. For more "
"information on DevStack, see https://docs.openstack.org/devstack/latest/"
msgstr ""

#: ../../source/contributor/topics/index.rst:3
msgid "Topic Guides"
msgstr ""

#: ../../source/contributor/topics/index.rst:5
msgid ""
"Information on how to work with specific areas of Horizon can be found in "
"the following topic guides."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:3
msgid "Defining default settings in code"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:7
msgid ""
"This page tries to explain the plan to define default values of horizon/"
"openstack_dashboard settings in code. This includes a blueprint `ini-based-"
"configuration <https://blueprints.launchpad.net/horizon/+spec/ini-based-"
"configuration>`__. This page will be updated once the effort is completed."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:15
msgid "Planned Steps"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:17
msgid "Define the default values of existing settings"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:18
#: ../../source/contributor/topics/ini-based-configuration.rst:68
msgid "Revisit HORIZON_CONFIG"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:19
msgid "Introduce ``oslo.config``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:22
msgid "Define default values of existing settings"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:24
msgid ""
"Currently all default values are defined in codes where they are consumed. "
"This leads to the situation that it is not easy to know what are the default "
"values and in a worse case default values defined in our codebase can have "
"different default values."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:29
msgid ""
"As the first step toward ini-based-configuration, I propose to define all "
"default values of existing settings in a single place per module. More "
"specifically, the following modules are used:"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:33
msgid "``openstack_dashboard.defaults`` for openstack_dashboard"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:34
msgid "``horizon.defaults`` for horizon"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:35
msgid "``openstack_auth.defaults`` for openstack_auth"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:37
msgid ""
"``horizon.defaults`` load ``openstack_auth.defaults`` and overrides "
"openstack_auth settings if necessary. Similarly, ``openstack_dashboard."
"defaults`` loads ``horizon.defaults`` and overrides horizon (and "
"openstack_auth) settings if necessary."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:42
msgid ""
"The current style of ``getattr(settings, <foo>, <default value>)`` will be "
"removed at the same time."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:45
msgid ""
"Note that ``HORIZON_CONFIG`` is not touched in this step. It will be covered "
"in the next step."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:49
#: ../../source/contributor/topics/ini-based-configuration.rst:217
msgid "Handling Django settings"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:51
msgid ""
"Django provides a lot of settings and it is not practical to cover all in "
"horizon. Only Django settings which horizon explicitly set will be defined "
"in a dedicated python module."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:55
msgid ""
"The open question is how to maintain Django related settings in "
"openstack_dashboard and horizon. How can we make them common? The following "
"files are related:"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:59
msgid "openstack_dashboard.settings (and local_settings.py)"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:60
msgid "openstack_dashboard.test.settings"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:61
msgid "horizon.test.settings"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:63
msgid ""
"This will be considered as the final step of the ini-based-configuration "
"effort after horizon and openstack_dashboard settings succeed to be migrated "
"to oslo.config explained below."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:70
msgid ""
"HORIZON_CONFIG is an internal interface now and most/some(?) of them should "
"not be exposed as config options. For example, the horizon plugin mechanism "
"touches HORIZON_CONFIG to register horizon plugins."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:74
msgid ""
"It is better to expose only HORIZON_CONFIG settings which can be really "
"exposed to operators. For such settings, we should define new settings in "
"openstack_dashboard and can populate them into HORIZON_CONFIG in ``settings."
"py``."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:79
msgid ""
"For example, ``ajax_poll_interval`` in HORIZON_CONFIG can be exposed to "
"operators. In such case, we can define a new settings ``AJAX_POLL_INTERVAL`` "
"in ``openstack_dashboard/defaults.py`` (or ``horizon/defaults.py``)."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:84
msgid ""
"Investigation is being summarized in `an etherpad page <https://etherpad."
"openstack.org/p/horizon-config-rethink>`__."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:88
msgid "Introduce oslo.config"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:90
msgid ""
"local_settings.py will have a priority over oslo.config. This means settings "
"values from oslo.config will be loaded first and then ``local_settings.py`` "
"and ``local_settings.d`` will be loaded in ``settings.py``."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:95
msgid "Basic strategy of mapping"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:97
msgid ""
"The current naming convention is random, so it sounds less reasonable to use "
"the same name for oslo.config. oslo.config and python ini-based "
"configuration mechanism provide a concept of category and there is no reason "
"to use it. As category name, the categories of :doc:`/configuration/"
"settings` (like keystone, glance) will be honored."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:104
msgid ""
"For example, some keystone settings have a prefix ``OPENSTACK_KEYSTONE_`` "
"like OPENSTACK_KEYSTONE_DEFAULT_ROLE. Some use ``KEYSTONE_`` like "
"``KEYSTONE_IDP_PROVIDER_ID``. Some do not (like ``ENFORCE_PASSWORD_CHECK``). "
"In the oslo.config options, all prefixes will be dropped. The mapping will "
"be:"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:110
msgid "``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` <-> ``[keystone] default_role``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:111
msgid "``KEYSTONE_IDP_PROVIDER_ID`` <-> ``[keystone] idp_provider_id``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:112
msgid "``ENFORCE_PASSWORD_CHECK`` <-> ``[keystone] enforce_password_check``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:114
msgid ""
"``[default]`` section is not used as much as possible. It will be used only "
"for limited number of well-known options. Perhaps some common Django "
"settings like ``DEBUG``, ``LOGGING`` will match this category."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:118
msgid "Opt classes defined in oslo.config are used as much as possible."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:120
msgid "StrOpt, IntOpt"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:121
msgid "ListOpt"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:122
msgid "MultiStrOpt"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:123
msgid "DictOpt"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:125
msgid ""
"A dictionary settings will be broken down into separate options. Good "
"examples are ``OPENSTACK_KEYSTONE_BACKEND`` and "
"``OPENSTACK_NEUTRON_NETWORK``."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:129
msgid "``OPENSTACK_KEYSTONE_BACKEND['name']`` <-> ``[keystone] backend_name``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:130
msgid ""
"``OPENSTACK_KEYSTONE_BACKEND['can_edit_user']`` <-> ``[keystone] "
"backend_can_edit_user``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:132
msgid ""
"``OPENSTACK_KEYSTONE_BACKEND['can_edit_group']`` <-> ``[keystone] "
"backend_can_edit_group``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:134
msgid ""
"``OPENSTACK_NEUTRON_NETWORK['enable_router']`` <-> ``[neutron] "
"enable_router``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:136
msgid ""
"``OPENSTACK_NEUTRON_NETWORK['enable_ipv6']`` <-> ``[neutron] enable_ipv6``"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:140
msgid "Automatic Mapping"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:142
msgid ""
"The straight-forward approach is to have a dictionary from setting names to "
"oslo.config options like:"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:155
msgid ""
"A key of the top-level dict is a name of Django settings. A corresponding "
"value specifies oslo.config name by a list or a tuple where the first and "
"second elements specify a section and a option name respectively."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:159
msgid ""
"When a value is a dict, this means a corresponding Django dict setting is "
"broken down into several oslo.config options. In the above example, "
"``OPENSTACK_NEUTRON_NETWORK['enable_router']`` is mapped to ``[neutron] "
"enable_router``."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:164
msgid ""
"Another idea is to introduce a new field to oslo.config classes. oslo-sample-"
"generator might need to be updated. If this approach is really attractive, "
"we can try this approach in future. The above dictionary-based approach will "
"be used in the initial effort."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:186
msgid "Special Considerations"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:189
msgid "LOGGING"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:191
msgid ""
"``LOGGING`` setting is long enough. Python now recommend to configure "
"logging using python dict directly, but from operator/packager perspective "
"the legacy style of using the ini format sounds reasonable. The ini format "
"is also used in other OpenStack projects too. In this effort, I propose to "
"use the logging configuration via the ini format file and specify the "
"logging conf file in a oslo.config option"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:198
msgid ""
"Adopting oslo.log might be a good candidate, but it is not covered by this "
"effort. It can be explored as future possible improvement."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:202
msgid "SECURITY_GROUP_RULES"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:204
msgid ""
"``SECURITY_GROUP_RULES`` will be defined by YAML file. The YAML file can be "
"validated by JSON schema in future (out of the scope of this effort)"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:208
msgid ""
"``all_tcp``, ``all_udp`` and ``all_icmp`` are the reserved keyword, so it "
"looks better to split the first three rules (``all_tcp`` to ``all_icmp``) "
"and other remaining rules. The remaining rules will be loaded from a YAML "
"file. For the first three rules, a boolean option to control their "
"visibility in the security group rule form will be introduces in oslo."
"config. I am not sure this option is required or not, but as the first step "
"of the migration it is reasonable to provide all compatibilities."
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:219
msgid ""
"Django (and django related packages) provide many settings. It is not a good "
"idea to expose all of them via oslo.config. What should we expose?"
msgstr ""

#: ../../source/contributor/topics/ini-based-configuration.rst:223
msgid ""
"The proposal here is to expose only settings which openstack_dashboard "
"expects to expose to deployers. Most Django settings are internally used in "
"``openstack_dashboard/settings.py``. Settings required for horizon plugins "
"are already exposed via the plugin settings, so there is no need to expose "
"them. If deployers would like to customize Django basic settings, they can "
"still configure them via ``local_settings.py`` or ``local_settings.d``."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:5
msgid "JavaScript Testing"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:7
msgid "There are multiple components in our JavaScript testing framework:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:9
msgid ""
"`Jasmine`_ is our testing framework, so this defines the syntax and file "
"structure we use to test our JavaScript."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:11
msgid ""
"`Karma`_ is our test runner. Amongst other things, this lets us run the "
"tests against multiple browsers and generate test coverage reports. "
"Alternatively, tests can be run inside the browser with the Jasmine spec "
"runner."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:15
msgid ""
"`PhantomJS`_ provides a headless WebKit (the browser engine). This gives us "
"native support for many web features without relying on specific browsers "
"being installed."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:18
msgid ""
"`ESLint`_ is a pluggable code linting utility. This will catch small errors "
"and inconsistencies in your JS, which may lead to bigger issues later on. "
"See :ref:`js_code_style` for more detail."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:22
msgid ""
"Jasmine uses specs (``.spec.js``) which are kept with the JavaScript files "
"that they are testing. See the :ref:`js_file_structure` section or the "
"`Examples`_ below for more detail on this."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:32
msgid "Running Tests"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:34
msgid "Tests can be run in two ways:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:36
msgid ""
"Open <dev_server_ip:port>/jasmine in a browser. The development server can "
"be run with ``tox -e runserver`` from the horizon root directory."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:38
msgid ""
"``tox -e npm`` from the horizon root directory. This runs Karma, so it will "
"run all the tests against PhantomJS and generate coverage reports."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:42
msgid ""
"The code linting job can be run with ``tox -e npm -- lint``, or ``tox -e npm "
"-- lintq`` to show errors, but not warnings."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:45
msgid ""
"To decipher where tests are failing it may be useful to use Jasmine in the "
"browser to run individual tests to see where the tests are specifically "
"breaking. To do this, navigate to your local horizon in the browser and add "
"'/jasmine' to the end of the url. e.g: 'http://localhost:8000/jasmine'. Once "
"you have the jasmine report you may click on the title of an individual test "
"to re-run just that test. From here, you can also use chrome dev tools or "
"similar to set breakpoints in the code by accessing the 'Sources' tab and "
"clicking on lines of code where you wish to break the code. This will then "
"show you the exact places where the code breaks."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:56
msgid "Coverage Reports"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:58
msgid ""
"Our Karma setup includes a plugin to generate test coverage reports. When "
"developing, be sure to check the coverage reports on the master branch and "
"compare your development branch; this will help identify missing tests."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:62
msgid ""
"To generate coverage reports, run ``tox -e npm``. The coverage reports can "
"be found at ``cover/horizon/`` (framework tests) and ``cover/"
"openstack_dashboard/`` (dashboard tests). Load ``<browser>/index.html`` in a "
"browser to view the reports."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:68
msgid "Writing Tests"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:70
msgid "Jasmine uses suites and specs:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:72
msgid ""
"Suites begin with a call to ``describe``, which takes two parameters; a "
"string and a function. The string is a name or title for the spec suite, "
"whilst the function is a block that implements the suite."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:75
msgid ""
"Specs begin with a call to ``it``, which also takes a string and a function "
"as parameters. The string is a name or title, whilst the function is a block "
"with one or more expectations (``expect``) that test the state of the code. "
"An expectation in Jasmine is an assertion that is either true or false; "
"every expectation in a spec must be true for the spec to pass."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:81
msgid ""
"``.spec.js`` files can be handled manually or automatically. To use the "
"automatic file discovery add::"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:86
msgid ""
"to your enabled file. JS code for testing should use the extensions ``.mock."
"js`` and ``.spec.js``."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:92
msgid ""
"To manually add specs, add the following array and relevant file paths to "
"your enabled file:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:104
msgid "Examples"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:108
msgid ""
"The code below is just for example purposes, and may not be current in "
"horizon. Ellipses (...) are used to represent code that has been removed for "
"the sake of brevity."
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:113
msgid "Example 1 - A reusable component in the **horizon** directory"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:115
#: ../../source/contributor/topics/javascript_testing.rst:214
msgid "File tree:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:125
msgid "Lines added to ``horizon/test/jasmine/jasmine_tests.py``:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:144
msgid "``modal.spec.js``:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:212
msgid ""
"Example 2 - Panel-specific code in the **openstack_dashboard** directory"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:226
msgid "Lines added to ``openstack_dashboard/enabled/_10_project.py``:"
msgstr ""

#: ../../source/contributor/topics/javascript_testing.rst:244
msgid "``network.spec.js``:"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:0
msgid "API-WG"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:0
msgid "Cinder"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:0
msgid "Nova"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:3
msgid "Horizon Microversion Support"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:6
#: ../../source/contributor/topics/policy.rst:8
msgid "Introduction"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:8
msgid ""
"Several services use API microversions, which allows consumers of that API "
"to specify an exact version when making a request. This can be useful in "
"ensuring a feature continues to work as expected across many service "
"releases."
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:13
msgid "Adding a feature that was introduced in a microversion"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:15
msgid ""
"Add the feature to the ``MICROVERSION_FEATURES`` dict in "
"``openstack_dashboard/api/microversions.py`` under the appropriate service "
"name. The feature should have at least two versions listed; the minimum "
"version (i.e. the version that introduced the feature) and the current "
"working version. Providing multiple versions reduces project maintenance "
"overheads and helps Horizon work with older service deployments."
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:23
msgid ""
"Use the ``is_feature_available`` function for your service to show or hide "
"the function.::"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:33
msgid ""
"Send the correct microversion with ``get_microversion`` function in the API "
"layer.::"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:43
msgid "Microversion references"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:45
msgid ""
"https://docs.openstack.org/nova/latest/reference/api-microversion-history."
"html"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:46
msgid ""
"https://docs.openstack.org/cinder/latest/contributor/"
"api_microversion_history.html"
msgstr ""

#: ../../source/contributor/topics/microversion_support.rst:47
msgid ""
"https://specs.openstack.org/openstack/api-wg/guidelines/"
"microversion_specification.html"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:3
msgid "Packaging Software"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:7
msgid "Software packages"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:9
msgid ""
"This section describes some general things that a developer should know "
"about packaging software. This content is mostly derived from best practices."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:12
msgid ""
"A developer building a package is comparable to an engineer building a car "
"with only a manual and very few tools. If the engineer needs a specific tool "
"to build the car, he must create the tool, too."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:16
msgid ""
"As a developer, if you are going to add a library named \"foo\", the package "
"must adhere to the following standards:"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:19
msgid "Be a free package created with free software."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:20
msgid "Include all tools that are required to build the package."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:21
msgid "Have an active and responsive upstream to maintain the package."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:22
msgid ""
"Adhere to Filesystem Hierarchy Standards (FHS). A specific file system "
"layout is not required."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:27
msgid "Embedded copies not allowed"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:29
msgid ""
"Imagine if all packages had a local copy of jQuery. If a security hole is "
"discovered in jQuery, we must write more than 90 patches in Debian, one for "
"each package that includes a copy. This is simply not practical. Therefore, "
"it is unacceptable for Horizon to copy code from other repositories when "
"creating a package. Copying code from another repository tends to create a "
"fork, diverging from the upstream code. The fork includes code that is not "
"being maintained, so if a bug is discovered in the original upstream, it "
"cannot easily be fixed by updating a single package."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:38
msgid ""
"Another reason to avoid copying a library into Horizon source code is that "
"it might create conflicting licenses. Distributing sources with conflicting "
"licenses in one tarball revokes rights in best case. In the worst case, you "
"could be held legally responsible."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:45
msgid "Free software"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:47
msgid ""
"Red Hat, Debian, and SUSE distributions are made only of free software (free "
"as in Libre, or free speech). The software that we include in our repository "
"is free. The tools are also free, and available in the distribution."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:51
msgid ""
"Because package maintainers care about the quality of the packages we "
"upload, we run tests that are available from upstream repositories. This "
"also qualifies test requirements as build requirements. The same rules apply "
"for building the software as for the software itself. Special build "
"requirements that are not included in the overall distribution are not "
"allowed."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:57
msgid ""
"An example of historically limiting, non-free software is Selenium. For a "
"long time, Selenium was only available from the non-free repositories of "
"Debian. The reason was that upstream included some .xpi binaries. These .xpi "
"included some Windows .dll and Linux .so files. Because they could not be "
"rebuilt from the source, all of python-selenium was declared non-free. If we "
"made Horizon build-depends on python-selenium, this would mean Horizon "
"wouldn't be in Debian main anymore (contrib and non-free are *not* "
"considered part of Debian). Recently, the package maintainer of python-"
"selenium decided to remove the .xpi files from python-selenium, and upload "
"it to Debian Experimental (this time, in main, not in non-free). If at some "
"point it is possible for Horizon to use python-selenium (without the non-"
"free .xpi files), then we could run Selenium tests at package build time."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:72
msgid "Running unit tests at build time"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:74
msgid ""
"The build environment inside a distribution is not exactly the same as the "
"one in the OpenStack gate. For example, versions of a given library can be "
"slightly different from the one in the gate. We want to detect when "
"problematic differences exist so that we can fix them. Whenever possible, "
"try to make the lives of the package maintainer easier, and allow them (or "
"help them) to run unit tests."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:83
msgid "Minified JavaScript policy"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:85
msgid ""
"In free software distributions that actively maintain OpenStack packages "
"(such as RDO, Debian, and Ubuntu), minified JavaScript is considered non-"
"free. This means that minified JavaScript should *not* be present in "
"upstream source code. At the very least, a non-minified version should be "
"present next to the minified version. Also, be aware of potential security "
"issues with minifiers. This `blog post`_ explains it very well."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:96
msgid "Component version"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:98
msgid ""
"Be careful about the version of all the components you use in your "
"application. Since it is not acceptable to embed a given component within "
"Horizon, we must use what is in the distribution, including all fonts, "
"JavaScript, etc. This is where it becomes a bit tricky."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:103
msgid ""
"In most distributions, it is not acceptable to have multiple versions of the "
"same piece of software. In Red Hat systems, it is technically possible to "
"install 2 versions of one library at the same time, but a few restrictions "
"apply, especially for usage. However, package maintainers try to avoid "
"multiple versions as much as possible. For package dependency resolution, it "
"might be necessary to provide packages for depending packages as well. For "
"example, if you had Django-1.4 and Django-1.8 in the same release, you must "
"provide Horizon built for Django-1.4 and another package providing Horizon "
"built for Django-1.8. This is a large effort and needs to be evaluated "
"carefully."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:114
msgid ""
"In Debian, it is generally forbidden to have multiple versions of the same "
"library in the same Debian release. Very few exceptions exist."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:117
msgid ""
"Component versioning has consequences for an upstream author willing to "
"integrate their software in a downstream distribution. The best situation is "
"when it is possible to support whatever version is currently available in "
"the target distributions, up to the latest version upstream. Declaring lower "
"and upper bounds within your requirements.txt does not solve the issue. It "
"allows all the tests to pass on gate because they are run against a narrow "
"set of versions in requirements.txt. The downstream distribution might still "
"have some dependencies with versions outside of the range that is specified "
"in requirements.txt. These dependencies may lead to failures that are not "
"caught in the OpenStack gate."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:128
msgid ""
"At times it might not be possible to support all versions of a library. It "
"might be too much work, or it might be very hard to test in the gate. In "
"this case, it is best to use whatever is available inside the target "
"distributions. For example, Horizon currently supports jQuery >= 1.7.2, as "
"this is what is currently available in Debian Jessie and Ubuntu Trusty (the "
"last LTS)."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:134
msgid ""
"You can search in a distribution for a piece of software foo using a command "
"like ``dnf search foo``, or ``zypper se -s foo``. ``dnf info foo`` returns "
"more detailed information about the package."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:140
msgid "Filesystem Hierarchy Standards"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:142
msgid ""
"Every distribution must comply with the Filesystem Hierarchy Standards "
"(FHS). The FHS defines a set of rules that we *must* follow as package "
"maintainers. Some of the most important ones are:"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:146
msgid ""
"/usr is considered read only. Software must not write in /usr at runtime. "
"However, it is fine for a package post-installation script to write in /usr. "
"When this rule was not followed, distributions had to write many tricks to "
"convince Horizon to write in ``/var/lib`` only. For example, distributions "
"wrote symlinks to ``/var/lib/openstack-dashboard``, or patched the default "
"``local_settings.py`` to write the ``SECRET_KEY`` in /var."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:152
msgid ""
"Configuration must always be in /etc, no matter what. When this rule was not "
"followed, package maintainers had to place symlinks to ``/etc/openstack-"
"dashboard/local_settings`` in Red Hat based distributions instead of using "
"directly ``/usr/share/openstack-dashboard/openstack_dashboard/local/"
"local_settings.py`` which Horizon expects. In Debian,the configuration file "
"is named ``/etc/openstack-dashboard/local_settings.py.``"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:162
msgid "Packaging Horizon"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:166
msgid "Why we use XStatic"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:168
msgid ""
"XStatic provides the following features that are not currently available by "
"default with systems like NPM and Grunt:"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:171
msgid ""
"Dependency checks: XStatic checks that dependencies, such as fonts and "
"JavaScript libs, are available in downstream distributions."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:173
msgid ""
"Reusable components across projects: The XStatic system ensures components "
"are reusable by other packages, like Fuel."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:175
msgid ""
"System-wide registry of static content: XStatic brings a system-wide "
"registry of components, so that it is easy to check if one is missing. For "
"example, it can detect if there is no egg-info, or a broken package "
"dependency exists."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:179
msgid ""
"No embedded content: The XStatic system helps us avoid embedding files that "
"are already available in the distribution, for example, libjs-* or fonts-* "
"packages. It even provides a compatibility layer for distributions. Not "
"every distribution places static files in the same position in the file "
"system. If you are packaging an XStatic package for your distribution, make "
"sure that you are using the static files provided by that specific "
"distribution. Having put together an XStatic package is *no* guarantee to "
"get it into a distribution. XStatic provides only the abstraction layer to "
"use distribution provided static files."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:188
msgid ""
"Package build systems are disconnected from the outside network (for several "
"reasons). Other packaging systems download dependencies directly from the "
"internet without verifying that the downloaded file is intact, matches a "
"provided checksum, etc. With these other systems, there is no way to provide "
"a mirror, a proxy or a cache, making builds even more unstable when minor "
"networking issues are encountered."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:195
msgid ""
"The previous features are critical requirements of the Horizon packaging "
"system. Any new system *must* keep these features. Although XStatic may mean "
"a few additional steps from individual developers, those steps help maintain "
"consistency and prevent errors across the project."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:202
msgid "Packaging Horizon for distributions"
msgstr ""

#: ../../source/contributor/topics/packaging.rst:204
msgid ""
"Horizon is a Python module. Preferably, it is installed at the default "
"location for python. In Fedora and openSUSE, this is ``/usr/lib/python3.7/"
"site-packages/horizon``, and in Debian/Ubuntu it is ``/usr/lib/python3.7/"
"dist-packages/horizon``."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:209
msgid ""
"Configuration files should reside under ``/etc/openstack-dashboard``. Policy "
"files should be created and modified there as well."
msgstr ""

#: ../../source/contributor/topics/packaging.rst:212
msgid ""
"It is expected that ``manage.py collectstatic`` will be run during package "
"build. This is the `recommended way`_ for Django applications. Depending on "
"configuration, it might be required to ``manage.py compress`` during package "
"build, too."
msgstr ""

#: ../../source/contributor/topics/policy.rst:5
msgid "Horizon Policy Enforcement (RBAC: Role Based Access Control)"
msgstr ""

#: ../../source/contributor/topics/policy.rst:10
msgid ""
"Horizon's policy enforcement builds on the oslo_policy engine. The basis of "
"which is ``openstack_auth/policy.py``. Services in OpenStack use the oslo "
"policy engine to define policy rules to limit access to APIs based primarily "
"on role grants and resource ownership."
msgstr ""

#: ../../source/contributor/topics/policy.rst:16
msgid ""
"The implementation in Horizon is based on copies of policy files found in "
"the service's source code."
msgstr ""

#: ../../source/contributor/topics/policy.rst:19
msgid ""
"The service rules files are loaded into the policy engine to determine "
"access rights to actions and service APIs."
msgstr ""

#: ../../source/contributor/topics/policy.rst:23
msgid "Horizon Settings"
msgstr ""

#: ../../source/contributor/topics/policy.rst:25
msgid ""
"There are a few settings that must be in place for the Horizon policy engine "
"to work."
msgstr ""

#: ../../source/contributor/topics/policy.rst:28
msgid "``POLICY_CHECK_FUNCTION``"
msgstr ""

#: ../../source/contributor/topics/policy.rst:29
msgid "``POLICY_DIRS``"
msgstr ""

#: ../../source/contributor/topics/policy.rst:30
msgid "``POLICY_FILES_PATH``"
msgstr ""

#: ../../source/contributor/topics/policy.rst:31
msgid "``POLICY_FILES``"
msgstr ""

#: ../../source/contributor/topics/policy.rst:32
msgid "``DEFAULT_POLICY_FILES``"
msgstr ""

#: ../../source/contributor/topics/policy.rst:34
msgid "For more detail, see :doc:`/configuration/settings`."
msgstr ""

#: ../../source/contributor/topics/policy.rst:37
msgid "How user's roles are determined"
msgstr ""

#: ../../source/contributor/topics/policy.rst:39
msgid ""
"Each policy check uses information about the user stored on the request to "
"determine the user's roles. This information was extracted from the scoped "
"token received from Keystone when authenticating."
msgstr ""

#: ../../source/contributor/topics/policy.rst:43
msgid ""
"Entity ownership is also a valid role. To verify access to specific entities "
"like a project, the target must be specified. See the section :ref:`rule "
"targets <rule_targets>` later in this document."
msgstr ""

#: ../../source/contributor/topics/policy.rst:48
msgid "How to Utilize RBAC"
msgstr ""

#: ../../source/contributor/topics/policy.rst:51
msgid "Django: Table action"
msgstr ""

#: ../../source/contributor/topics/policy.rst:53
msgid ""
"The primary way to add role based access control checks to panels is in the "
"definition of table actions. When implementing a derived action class, "
"setting the :attr:`~horizon.tables.Action.policy_rules` attribute to valid "
"policy rules will force a policy check before the :meth:`horizon.tables."
"Action.allowed` method is called on the action. These rules are defined in "
"the policy files pointed to by ``POLICY_PATH`` and ``POLICY_FILES``. The "
"rules are role based, where entity owner is also a role. The format for the "
"``policy_rules`` is a list of two item tuples. The first component of the "
"tuple is the scope of the policy rule, this is the service type. This "
"informs the policy engine which policy file to reference. The second "
"component is the rule to enforce from the policy file specified by the "
"scope. An example tuple is::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:68
msgid "x tuples can be added to enforce x rules."
msgstr ""

#: ../../source/contributor/topics/policy.rst:72
msgid ""
"If a rule specified is not found in the policy file, the policy check will "
"return False and the action will not be allowed."
msgstr ""

#: ../../source/contributor/topics/policy.rst:76
msgid "Django: policy check function"
msgstr ""

#: ../../source/contributor/topics/policy.rst:78
msgid ""
"The secondary way to add a role based check is to directly use the :meth:"
"`~openstack_dashboard.policy.check` method.  The method takes a list of "
"actions, same format as the :attr:`~horizon.tables.Action.policy_rules` "
"attribute detailed above; the current request object; and a dictionary of "
"action targets. This is the method that :class:`horizon.tables.Action` class "
"utilizes.  Examples look like::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:95
msgid ""
"Any time multiple rules are specified in a single `policy.check` method "
"call, the result is the logical `and` of each rule check. So, if any rule "
"fails verification, the result is `False`."
msgstr ""

#: ../../source/contributor/topics/policy.rst:100
msgid "Angular: ifAllowed method"
msgstr ""

#: ../../source/contributor/topics/policy.rst:102
msgid ""
"The third way to add a role based check is in javascript files. Use the "
"method 'ifAllowed()' in file 'openstack_dashboard.static.app.core.policy."
"service.js'. The method takes a list of actions, similar format with the :"
"attr:`~horizon.tables.Action.policy_rules` attribute detailed above. An "
"Example looks like::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:122
msgid "Angular: hz-if-policies"
msgstr ""

#: ../../source/contributor/topics/policy.rst:124
msgid ""
"The fourth way to add a role based check is in html files. Use angular "
"directive 'hz-if-policies' in file 'openstack_dashboard/static/app/core/"
"cloud-services/hz-if-policies.directive.js'. Assume you have the following "
"policy defined in your angular controller::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:131
msgid "Then in your HTML, use it like so::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:140
msgid "Rule Targets"
msgstr ""

#: ../../source/contributor/topics/policy.rst:142
msgid ""
"Some rules allow access if the user owns the entity. Policy check targets "
"specify particular entities to check for user ownership. The target "
"parameter to the :meth:`~openstack_dashboard.policy.check` method is a "
"simple dictionary. For instance, the target for checking access a project "
"looks like::"
msgstr ""

#: ../../source/contributor/topics/policy.rst:149
msgid ""
"If the value matches the ``project_id`` to which the user's token is scoped, "
"then access is allowed."
msgstr ""

#: ../../source/contributor/topics/policy.rst:152
msgid ""
"When deriving the :class:`horizon.tables.Action` class for use in a table, "
"if a policy check is desired for a particular target, the implementer should "
"override the :meth:`horizon.tables.Action.get_policy_target` method. This "
"allows a programmatic way to specify the target based on the current datum. "
"The value returned should be the target dictionary."
msgstr ""

#: ../../source/contributor/topics/policy.rst:159
msgid "Policy-in-Code and deprecated rules"
msgstr ""

#: ../../source/contributor/topics/policy.rst:161
msgid ""
"As the effort of `policy-in-code <https://governance.openstack.org/tc/goals/"
"queens/policy-in-code.html>`__, most OpenStack projects define their default "
"policies in their codes. All projects (except swift) covered by horizon "
"supports \"policy-in-code\". (Note that swift is an exception as it has its "
"own mechanism to control RBAC.)"
msgstr ""

#: ../../source/contributor/topics/policy.rst:167
msgid ""
"\"oslo.policy\" provides a way to deprecate existing policy rules like "
"renaming rule definitions (\"check_str\") and renaming rule names. They are "
"defined as part of python codes in back-end services. horizon cannot import "
"python codes of back-end services, so we need a way to restore policies "
"defined by \"policy-in-code\" including deprecated rules."
msgstr ""

#: ../../source/contributor/topics/policy.rst:173
msgid ""
"To address the above issue, horizon adopts the following two-step approach:"
msgstr ""

#: ../../source/contributor/topics/policy.rst:175
msgid ""
"The first step scans policy-in-code of back-end services and and dump the "
"loaded default policies into YAML files per service including information of "
"deprecated rules. This step is executed as part of the development process "
"per release cycle and these YAML files are shipped per release."
msgstr ""

#: ../../source/contributor/topics/policy.rst:181
msgid ""
"Note that `oslopolicy-sample-generator` does not output deprecated rules in "
"a structured way, so we prepare a dedicated script for this purpose in the "
"horizon repo."
msgstr ""

#: ../../source/contributor/topics/policy.rst:185
msgid ""
"The horizon policy implementation loads the above YAML file into a list of "
"RuleDefault and registers the list as the default rules to the policy "
"enforcer. The default rules and operator-defined rules are maintained "
"separately, so operators still can edit the policy files as oslo.policy does "
"in back-end services."
msgstr ""

#: ../../source/contributor/topics/policy.rst:191
msgid "This approach has the following merits:"
msgstr ""

#: ../../source/contributor/topics/policy.rst:193
msgid ""
"All features supported by oslo.policy can be supported in horizon as default "
"rules in back-end services are restored as-is. Horizon can evaluate "
"deprecated rules."
msgstr ""

#: ../../source/contributor/topics/policy.rst:196
msgid ""
"The default rules and operator defined rules are maintained separately. "
"Operators can use the same way to maintain policy files of back-end services."
msgstr ""

#: ../../source/contributor/topics/policy.rst:199
msgid "The related files in the horizon codebase are:"
msgstr ""

#: ../../source/contributor/topics/policy.rst:201
msgid ""
"`openstack_dashboard/conf/<service>_policy.yaml`: operator-defined policies. "
"These files are generated by `oslopolicy-sample-generator`."
msgstr ""

#: ../../source/contributor/topics/policy.rst:204
msgid ""
"`openstack_dashboard/conf/default_policies/<service>.yaml` YAML files "
"contain default policies."
msgstr ""

#: ../../source/contributor/topics/policy.rst:206
msgid ""
"`openstack_dashboard/management/commands/dump_default_policies.py`: This "
"script scans policy-in-code of a specified namespace under `oslo.policy."
"policies` entrypoints and dump them into the YAML file under "
"`openstack_dashboard/conf/default_policies`."
msgstr ""

#: ../../source/contributor/topics/policy.rst:210
msgid ""
"`openstack_auth/policy.py`: `_load_default_rules` function loads the YAML "
"files with default rules and call `register_defautls` method of the policy "
"enforcer per service."
msgstr ""

#: ../../source/contributor/topics/policy.rst:215
msgid "Policy file maintenance"
msgstr ""

#: ../../source/contributor/topics/policy.rst:217
msgid "YAML files for default policies"
msgstr ""

#: ../../source/contributor/topics/policy.rst:219
msgid ""
"Run the following command after installing a corresponding project. You need "
"to run it for keystone, nova, cinder, neutron, glance."
msgstr ""

#: ../../source/contributor/topics/policy.rst:228
msgid "Sample policy files"
msgstr ""

#: ../../source/contributor/topics/policy.rst:230
msgid ""
"Run the following commands after installing a corresponding project. You "
"need to run it for keystone, nova, cinder, neutron, glance."
msgstr ""

#: ../../source/contributor/topics/policy.rst:241
msgid ""
"We now use YAML format for sample policy files now. \"oslo.policy\" can "
"accept both YAML and JSON files. We now support default policies so there is "
"no need to define all policies using JSON files. YAML files also allows us "
"to use comments, so we can provide good sample policy files. This is the "
"same motivation as the Wallaby community goal `Migrate RBAC Policy Format "
"from JSON to YAML <https://governance.openstack.org/tc/goals/selected/"
"wallaby/migrate-policy-format-from-json-to-yaml.html>`__."
msgstr ""

#: ../../source/contributor/topics/policy.rst:252
msgid ""
"The second \"sed\" command is to comment out rules for rule renames. "
"`oslopolicy-sample-generator` does not comment out them, but they are "
"unnecessary in horizon usage. A single renaming rule can map to multiple "
"rules, so it does not work as-is. In addition, they trigger deprecation "
"warnings in horizon log if these sample files are used in horizon as-is. "
"Thus, we comment them out by default."
msgstr ""

#: ../../source/contributor/topics/policy.rst:260
msgid ""
"After syncing policies from back-end services, you need to check what are "
"changed. If a policy referred by horizon has been changed, you need to check "
"and modify the horizon code base accordingly."
msgstr ""

#: ../../source/contributor/topics/policy.rst:266
msgid ""
"After the support of default policies, the following tool does not work. It "
"is a future work to make it work again or evaluate the need itself."
msgstr ""

#: ../../source/contributor/topics/policy.rst:269
msgid ""
"To summarize which policies are removed or added, a convenient tool is "
"provided:"
msgstr ""

#: ../../source/contributor/topics/profiling.rst:3
msgid "Profiling Pages"
msgstr ""

#: ../../source/contributor/topics/profiling.rst:5
msgid ""
"In the Ocata release of Horizon a new \"OpenStack Profiler\" panel was "
"introduced. Once it is enabled and all prerequisites are set up, you can see "
"which API calls Horizon actually makes when rendering a specific page. To re-"
"render the page while profiling it, you'll need to use the \"Profile\" "
"dropdown menu located in the top right corner of the screen. In order to be "
"able to use \"Profile\" menu, the following steps need to be completed:"
msgstr ""

#: ../../source/contributor/topics/profiling.rst:12
msgid ""
"Enable the Developer dashboard by copying ``_9001_developer.py`` from "
"``openstack_dashboard/contrib/developer/enabled/`` to ``openstack_dashboard/"
"local/enabled/``."
msgstr ""

#: ../../source/contributor/topics/profiling.rst:15
msgid ""
"Copy ``openstack_dashboard/local/local_settings.d/_9030_profiler_settings.py."
"example`` to ``openstack_dashboard/local/local_settings.d/"
"_9030_profiler_settings.py``"
msgstr ""

#: ../../source/contributor/topics/profiling.rst:18
msgid ""
"Copy ``openstack_dashboard/contrib/developer/enabled/_9030_profiler.py`` to "
"``openstack_dashboard/local/enabled/_9030_profiler.py``."
msgstr ""

#: ../../source/contributor/topics/profiling.rst:20
msgid ""
"To support storing profiler data on server-side, MongoDB cluster needs to be "
"installed on your Devstack host (default configuration), see `Installing "
"MongoDB <https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/"
"#install-mongodb-community-edition>`__. Then, change the ``bindIp`` key in "
"``/etc/mongod.conf`` to ``0.0.0.0`` and invoke ``sudo service mongod "
"restart``."
msgstr ""

#: ../../source/contributor/topics/profiling.rst:26
msgid ""
"Collect and compress static assets with ``python manage.py collectstatic -"
"c`` and ``python manage.py compress``."
msgstr ""

#: ../../source/contributor/topics/profiling.rst:28
#: ../../source/contributor/topics/styling.rst:121
msgid "Restart the web server."
msgstr ""

#: ../../source/contributor/topics/profiling.rst:29
msgid ""
"The \"Profile\" drop-down menu should appear in the top-right corner, you "
"are ready to profile your pages!"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:3
msgid "Release Notes"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:5
msgid ""
"Release notes for a patch should be included in the patch with the "
"associated changes whenever possible. This allow for simpler tracking. It "
"also enables a single cherry pick to be done if the change is backported to "
"a previous release. In some cases, such as a feature that is provided via "
"multiple patches, release notes can be done in a follow-on review."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:11
msgid "If the following applies to the patch, a release note is required:"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:13
msgid "The deployer needs to take an action when upgrading"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:14
msgid "A new feature is implemented"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:15
msgid "Function was removed (hopefully it was deprecated)"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:16
msgid "Current behavior is changed"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:17
msgid ""
"A new config option is added that the deployer should consider changing from "
"the default"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:19
msgid "A security bug is fixed"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:23
msgid ""
"A release note is suggested if a long-standing or important bug is fixed. "
"Otherwise, a release note is not required."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:25
msgid ""
"It is not recommended that individual release notes use **prelude** section "
"as it is for release highlights."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:30
msgid ""
"Avoid modifying an existing release note file even though it is related to "
"your change. If you modify a release note file of a past release, the whole "
"content will be shown in a latest release. The only allowed case is to "
"update a release note in a same release."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:35
msgid ""
"If you need to update a release note of a past release, edit a corresponding "
"release note file in a stable branch directly."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:38
msgid ""
"Horizon uses `reno <https://docs.openstack.org/reno/latest/user/usage."
"html>`_ to generate release notes. Please read the docs for details. In "
"summary, use"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:45
msgid ""
"Then edit the sample file that was created and push it with your change."
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:47
msgid "To see the results:"
msgstr ""

#: ../../source/contributor/topics/release-notes.rst:55
msgid ""
"Then look at the generated release notes files in releasenotes/build/html in "
"your favorite browser."
msgstr ""

#: ../../source/contributor/topics/styling.rst:3
msgid "Styling in Horizon (SCSS)"
msgstr ""

#: ../../source/contributor/topics/styling.rst:5
msgid ""
"Horizon uses `SCSS`_ (not to be confused with Sass) to style its HTML. This "
"guide is targeted at developers adding code to upstream Horizon. For "
"information on creating your own branding/theming, see :ref:`install-"
"customizing`."
msgstr ""

#: ../../source/contributor/topics/styling.rst:13
msgid "Code Layout"
msgstr ""

#: ../../source/contributor/topics/styling.rst:15
msgid ""
"The base SCSS can be found at ``openstack_dashboard/static/dashboard/scss/"
"``. This directory should **only** contain the minimal styling for "
"functionality code that isn't configurable by themes. ``horizon.scss`` is a "
"top level file that imports from the ``components/`` directory, as well as "
"other base styling files; potentially some basic page layout rules that "
"Horizon relies on to function."
msgstr ""

#: ../../source/contributor/topics/styling.rst:23
msgid ""
"Currently, a great deal of theming is also kept in the ``horizon.scss`` file "
"in this directory, but that will be reduced as we proceed with the new code "
"design."
msgstr ""

#: ../../source/contributor/topics/styling.rst:27
msgid ""
"Horizon's ``default`` theme stylesheets can be found at "
"``openstack_dashboard/themes/default/``."
msgstr ""

#: ../../source/contributor/topics/styling.rst:39
msgid ""
"The top level ``_styles.scss`` and ``_variables.scss`` contain imports from "
"the ``bootstrap`` and ``horizon`` directories."
msgstr ""

#: ../../source/contributor/topics/styling.rst:43
msgid "The \"bootstrap\" directory"
msgstr ""

#: ../../source/contributor/topics/styling.rst:45
msgid ""
"This directory contains overrides and customization of Bootstrap variables, "
"and markup used by Bootstrap components. This should **only** override "
"existing Bootstrap content. For examples of these components, see the `Theme "
"Preview Panel`_."
msgstr ""

#: ../../source/contributor/topics/styling.rst:60
msgid "``_styles.scss`` imports the SCSS defined for each component."
msgstr ""

#: ../../source/contributor/topics/styling.rst:61
msgid ""
"``_variables.scss`` contains the definitions for every Bootstrap variable. "
"These variables can be altered to affect the look and feel of Horizon's "
"default theme."
msgstr ""

#: ../../source/contributor/topics/styling.rst:64
msgid ""
"The ``components`` directory contains overrides for Bootstrap components, "
"such as tables or navbars."
msgstr ""

#: ../../source/contributor/topics/styling.rst:68
msgid "The \"horizon\" directory"
msgstr ""

#: ../../source/contributor/topics/styling.rst:70
msgid ""
"This directory contains SCSS that is absolutely specific to Horizon; code "
"here should **not** override existing Bootstrap content, such as variables "
"and rules."
msgstr ""

#: ../../source/contributor/topics/styling.rst:83
msgid ""
"``_styles.scss`` imports the SCSS defined for each component. It may also "
"contain some minor styling overrides."
msgstr ""

#: ../../source/contributor/topics/styling.rst:85
msgid ""
"``_variables.scss`` contains variable definitions that are specific to the "
"horizon theme. This should **not** override any bootstrap variables, only "
"define new ones. You can however, inherit bootstrap variables for reuse (and "
"are encouraged to do so where possible)."
msgstr ""

#: ../../source/contributor/topics/styling.rst:89
msgid ""
"The ``components`` directory contains styling for each individual component "
"defined by Horizon, such as the sidebar or pie charts."
msgstr ""

#: ../../source/contributor/topics/styling.rst:93
msgid "Adding new SCSS"
msgstr ""

#: ../../source/contributor/topics/styling.rst:95
msgid ""
"To keep Horizon easily themable, there are several code design guidelines "
"that should be adhered to:"
msgstr ""

#: ../../source/contributor/topics/styling.rst:98
msgid ""
"Reuse Bootstrap variables where possible. This allows themes to influence "
"styling by simply overriding a few existing variables, instead of rewriting "
"large chunks of the SCSS files."
msgstr ""

#: ../../source/contributor/topics/styling.rst:101
msgid ""
"If you are unable to use existing variables - such as for very specific "
"functionality - keep the new rules as specific as possible to your component "
"so they do not cause issues in unexpected places."
msgstr ""

#: ../../source/contributor/topics/styling.rst:104
msgid ""
"Check if existing components suit your use case. There may be existing "
"components defined by Bootstrap or Horizon that can be reused, rather than "
"writing new ones."
msgstr ""

#: ../../source/contributor/topics/styling.rst:109
msgid "Theme Preview Panel"
msgstr ""

#: ../../source/contributor/topics/styling.rst:111
msgid ""
"The Bootstrap Theme Preview panel contains examples of all stock Bootstrap "
"markup with the currently applied theme, as well as source code for "
"replicating them; click the ``</>`` symbol when hovering over a component."
msgstr ""

#: ../../source/contributor/topics/styling.rst:115
msgid "To enable the Developer dashboard with the Theme Preview panel:"
msgstr ""

#: ../../source/contributor/topics/styling.rst:117
msgid "Set :ref:`DEBUG <debug_setting>` setting to ``True``."
msgstr ""

#: ../../source/contributor/topics/styling.rst:118
msgid ""
"Copy ``_9001_developer.py`` and ``_9010_preview.py`` from "
"``openstack_dashboard/contrib/developer/enabled/`` to ``openstack_dashboard/"
"local/enabled/``."
msgstr ""

#: ../../source/contributor/topics/styling.rst:124
msgid "Alternate Theme"
msgstr ""

#: ../../source/contributor/topics/styling.rst:126
msgid ""
"A second theme is provided by default at ``openstack_dashboard/themes/"
"material/``. When adding new SCSS to horizon, you should check that it does "
"not interfere with the Material theme. Images of how the Material theme "
"should look can be found at https://bootswatch.com/3/paper/. This theme is "
"now configured to run as the alternate theme within Horizon."
msgstr ""

#: ../../source/contributor/topics/tables.rst:5
msgid "DataTables Topic Guide"
msgstr ""

#: ../../source/contributor/topics/tables.rst:7
msgid ""
"Horizon provides the :mod:`horizon.tables` module to provide a convenient, "
"reusable API for building data-driven displays and interfaces. The core "
"components of this API fall into three categories: ``DataTables``, "
"``Actions``, and ``Class-based Views``."
msgstr ""

#: ../../source/contributor/topics/tables.rst:14
msgid "For a detailed API information check out the :ref:`ref-datatables`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:17
msgid "Tables"
msgstr ""

#: ../../source/contributor/topics/tables.rst:19
msgid ""
"The majority of interface in a dashboard-style interface ends up being "
"tabular displays of the various resources the dashboard interacts with. The :"
"class:`~horizon.tables.DataTable` class exists so you don't have to reinvent "
"the wheel each time."
msgstr ""

#: ../../source/contributor/topics/tables.rst:25
msgid "Creating your own tables"
msgstr ""

#: ../../source/contributor/topics/tables.rst:27
msgid "Creating a table is fairly simple:"
msgstr ""

#: ../../source/contributor/topics/tables.rst:29
msgid "Create a subclass of :class:`~horizon.tables.DataTable`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:30
msgid "Define columns on it using :class:`~horizon.tables.Column`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:31
msgid ""
"Create an inner ``Meta`` class to contain the special options for this table."
msgstr ""

#: ../../source/contributor/topics/tables.rst:33
msgid ""
"Define any actions for the table, and add them to :attr:`~horizon.tables."
"DataTableOptions.table_actions` or :attr:`~horizon.tables.DataTableOptions."
"row_actions`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:37
msgid ""
"Examples of this can be found in any of the ``tables.py`` modules included "
"in the reference modules under ``horizon.dashboards``."
msgstr ""

#: ../../source/contributor/topics/tables.rst:41
msgid "Connecting a table to a view"
msgstr ""

#: ../../source/contributor/topics/tables.rst:43
msgid ""
"Once you've got your table set up the way you like it, the next step is to "
"wire it up to a view. To make this as easy as possible Horizon provides the :"
"class:`~horizon.tables.DataTableView` class-based view which can be "
"subclassed to display your table with just a couple lines of code. At its "
"simplest, it looks like this::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:60
msgid ""
"In the template you would just need to include the following to render the "
"table::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:65
msgid "That's it! Easy, right?"
msgstr ""

#: ../../source/contributor/topics/tables.rst:70
msgid ""
"Actions comprise any manipulations that might happen on the data in the "
"table or the table itself. For example, this may be the standard object "
"CRUD, linking to related views based on the object's id, filtering the data "
"in the table, or fetching updated data when appropriate."
msgstr ""

#: ../../source/contributor/topics/tables.rst:76
msgid "When actions get run"
msgstr ""

#: ../../source/contributor/topics/tables.rst:78
msgid ""
"There are two points in the request-response cycle in which actions can take "
"place; prior to data being loaded into the table, and after the data is "
"loaded. When you're using one of the pre-built class-based views for working "
"with your tables the pseudo-workflow looks like this:"
msgstr ""

#: ../../source/contributor/topics/tables.rst:83
msgid "The request enters view."
msgstr ""

#: ../../source/contributor/topics/tables.rst:84
msgid "The table class is instantiated without data."
msgstr ""

#: ../../source/contributor/topics/tables.rst:85
msgid "Any \"preemptive\" actions are checked to see if they should run."
msgstr ""

#: ../../source/contributor/topics/tables.rst:86
msgid "Data is fetched and loaded into the table."
msgstr ""

#: ../../source/contributor/topics/tables.rst:87
msgid "All other actions are checked to see if they should run."
msgstr ""

#: ../../source/contributor/topics/tables.rst:88
msgid ""
"If none of the actions have caused an early exit from the view, the standard "
"response from the view is returned (usually the rendered table)."
msgstr ""

#: ../../source/contributor/topics/tables.rst:92
msgid ""
"The benefit of the multi-step table instantiation is that you can use "
"preemptive actions which don't need access to the entire collection of data "
"to save yourself on processing overhead, API calls, etc."
msgstr ""

#: ../../source/contributor/topics/tables.rst:97
msgid "Basic actions"
msgstr ""

#: ../../source/contributor/topics/tables.rst:99
msgid ""
"At their simplest, there are three types of actions: actions which act on "
"the data in the table, actions which link to related resources, and actions "
"that alter which data is displayed. These correspond to :class:`~horizon."
"tables.Action`, :class:`~horizon.tables.LinkAction`, and :class:`~horizon."
"tables.FilterAction`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:105
msgid ""
"Writing your own actions generally starts with subclassing one of those "
"action classes and customizing the designated attributes and methods."
msgstr ""

#: ../../source/contributor/topics/tables.rst:109
msgid "Shortcut actions"
msgstr ""

#: ../../source/contributor/topics/tables.rst:111
msgid ""
"There are several common tasks for which Horizon provides pre-built shortcut "
"classes. These include :class:`~horizon.tables.BatchAction`, and :class:"
"`~horizon.tables.DeleteAction`. Each of these abstracts away nearly all of "
"the boilerplate associated with writing these types of actions and provides "
"consistent error handling, logging, and user-facing interaction."
msgstr ""

#: ../../source/contributor/topics/tables.rst:117
msgid ""
"It is worth noting that ``BatchAction`` and ``DeleteAction`` are extensions "
"of the standard ``Action`` class. Some ``BatchAction`` or ``DeleteAction`` "
"classes may cause some unrecoverable results, like deleted images or "
"unrecoverable instances. It may be helpful to specify specific help_text to "
"explain the concern to the user, such as \"Deleted images are not recoverable"
"\"."
msgstr ""

#: ../../source/contributor/topics/tables.rst:124
msgid "Preemptive actions"
msgstr ""

#: ../../source/contributor/topics/tables.rst:126
msgid ""
"Action classes which have their :attr:`~horizon.tables.Action.preempt` "
"attribute set to ``True`` will be evaluated before any data is loaded into "
"the table. As such, you must be careful not to rely on any table methods "
"that require data, such as :meth:`~horizon.tables.DataTable."
"get_object_display` or :meth:`~horizon.tables.DataTable.get_object_by_id`. "
"The advantage of preemptive actions is that you can avoid having to do all "
"the processing, API calls, etc. associated with loading data into the table "
"for actions which don't require access to that information."
msgstr ""

#: ../../source/contributor/topics/tables.rst:136
msgid "Policy checks on actions"
msgstr ""

#: ../../source/contributor/topics/tables.rst:138
msgid ""
"The :attr:`~horizon.tables.Action.policy_rules` attribute, when set, will "
"validate access to the action using the policy rules specified.  The "
"attribute is a list of scope/rule pairs.  Where the scope is the service "
"type defining the rule and the rule is a rule from the corresponding service "
"policy.json file.  The format of :attr:`horizon.tables.Action.policy_rules` "
"looks like::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:146
msgid ""
"Multiple checks can be made for the same action by merely adding more tuples "
"to the list.  The policy check will use information stored in the session "
"about the user and the result of :meth:`~horizon.tables.Action."
"get_policy_target` (which can be overridden in the derived action class) to "
"determine if the user can execute the action.  If the user does not have "
"access to the action, the action is not added to the table."
msgstr ""

#: ../../source/contributor/topics/tables.rst:154
msgid ""
"If :attr:`~horizon.tables.Action.policy_rules` is not set, no policy checks "
"will be made to determine if the action should be visible and will be "
"displayed solely based on the result of :meth:`~horizon.tables.Action."
"allowed`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:159
msgid ""
"For more information on policy based Role Based Access Control see :ref:"
"`topics-policy`."
msgstr ""

#: ../../source/contributor/topics/tables.rst:163
msgid "Table Cell filters (decorators)"
msgstr ""

#: ../../source/contributor/topics/tables.rst:165
msgid ""
"DataTable displays lists of objects in rows and object attributes in cell. "
"How should we proceed, if we want to decorate some column, e.g. if we have "
"column ``memory`` which returns a number e.g. 1024, and we want to show "
"something like 1024.00 GB inside table?"
msgstr ""

#: ../../source/contributor/topics/tables.rst:171
msgid "Decorator pattern"
msgstr ""

#: ../../source/contributor/topics/tables.rst:173
msgid ""
"The clear anti-pattern is defining the new attributes on object like "
"``ram_float_format_2_gb`` or to tweak a DataTable in any way for displaying "
"purposes."
msgstr ""

#: ../../source/contributor/topics/tables.rst:177
msgid ""
"The cleanest way is to use ``filters``. Filters are decorators, following "
"GOF ``Decorator pattern``. This way ``DataTable logic`` and ``displayed "
"object logic`` are correctly separated from ``presentation logic`` of the "
"object inside of the various tables. And therefore the filters are reusable "
"in all tables."
msgstr ""

#: ../../source/contributor/topics/tables.rst:184
msgid "Filter function"
msgstr ""

#: ../../source/contributor/topics/tables.rst:186
msgid ""
"Horizon DatablesTable takes a tuple of pointers to filter functions or "
"anonymous lambda functions. When displaying a ``Cell``, ``DataTable`` takes "
"``Column`` filter functions from left to right, using the returned value of "
"the previous function as a parameter of the following function. Then "
"displaying the returned value of the last filter function."
msgstr ""

#: ../../source/contributor/topics/tables.rst:192
msgid ""
"A valid filter function takes one parameter and returns the decorated value. "
"So e.g. these are valid filter functions ::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:209
msgid "Using filters in DataTable column"
msgstr ""

#: ../../source/contributor/topics/tables.rst:211
msgid ""
"DataTable takes tuple of filter functions, so e.g. this is valid decorating "
"of a value with float format and with unit ::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:220
msgid "It always takes tuple, so using only one filter would look like this ::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:224
msgid ""
"The decorated parameter doesn't have to be only a string or number, it can "
"be anything e.g. list or an object. So decorating of object, that has "
"attributes value and unit would look like this ::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:235
msgid "Available filters"
msgstr ""

#: ../../source/contributor/topics/tables.rst:237
msgid ""
"There are a load of filters, that can be used, defined in django already: "
"https://github.com/django/django/blob/master/django/template/defaultfilters."
"py"
msgstr ""

#: ../../source/contributor/topics/tables.rst:240
msgid "So it's enough to just import and use them, e.g. ::"
msgstr ""

#: ../../source/contributor/topics/tables.rst:256
msgid "Inline editing"
msgstr ""

#: ../../source/contributor/topics/tables.rst:258
msgid ""
"Table cells can be easily upgraded with in-line editing. With use of django."
"form.Field, we are able to run validations of the field and correctly parse "
"the data. The updating process is fully encapsulated into table "
"functionality, communication with the server goes through AJAX in JSON "
"format. The javascript wrapper for inline editing allows each table cell "
"that has in-line editing available to:"
msgstr ""

#: ../../source/contributor/topics/tables.rst:265
msgid "Refresh itself with new data from the server."
msgstr ""

#: ../../source/contributor/topics/tables.rst:266
msgid "Display in edit mode."
msgstr ""

#: ../../source/contributor/topics/tables.rst:267
msgid "Send changed data to server."
msgstr ""

#: ../../source/contributor/topics/tables.rst:268
msgid "Display validation errors."
msgstr ""

#: ../../source/contributor/topics/tables.rst:270
msgid ""
"There are basically 3 things that need to be defined in the table in order "
"to enable in-line editing."
msgstr ""

#: ../../source/contributor/topics/tables.rst:274
msgid "Fetching the row data"
msgstr ""

#: ../../source/contributor/topics/tables.rst:276
msgid ""
"Defining an ``get_data`` method in a class inherited from ``tables.Row``. "
"This method takes care of fetching the row data. This class has to be then "
"defined in the table Meta class as ``row_class = UpdateRow``."
msgstr ""

#: ../../source/contributor/topics/tables.rst:293
msgid ""
"Defining a form_field for each Column that we want to be in-line edited."
msgstr ""

#: ../../source/contributor/topics/tables.rst:295
msgid ""
"Form field should be ``django.form.Field`` instance, so we can use django "
"validations and parsing of the values sent by POST (in example validation "
"``required=True`` and correct parsing of the checkbox value from the POST "
"data)."
msgstr ""

#: ../../source/contributor/topics/tables.rst:300
msgid ""
"Form field can be also ``django.form.Widget`` class, if we need to just "
"display the form widget in the table and we don't need Field functionality."
msgstr ""

#: ../../source/contributor/topics/tables.rst:303
msgid "Then connecting ``UpdateRow`` and ``UpdateCell`` classes to the table."
msgstr ""

#: ../../source/contributor/topics/testing.rst:5
msgid "Testing Overview"
msgstr ""

#: ../../source/contributor/topics/testing.rst:7
msgid ""
"Having good tests in place is absolutely critical for ensuring a stable, "
"maintainable codebase. Hopefully that doesn't need any more explanation."
msgstr ""

#: ../../source/contributor/topics/testing.rst:10
msgid ""
"However, what defines a \"good\" test is not always obvious, and there are a "
"lot of common pitfalls that can easily shoot your test suite in the foot."
msgstr ""

#: ../../source/contributor/topics/testing.rst:14
msgid ""
"If you already know everything about testing but are fed up with trying to "
"debug why a specific test failed, you can skip the intro and jump straight "
"to :ref:`debugging_unit_tests`."
msgstr ""

#: ../../source/contributor/topics/testing.rst:18
msgid "Angular specific testing"
msgstr ""

#: ../../source/contributor/topics/testing.rst:24
msgid "An overview of testing"
msgstr ""

#: ../../source/contributor/topics/testing.rst:26
msgid ""
"There are three main types of tests, each with their associated pros and "
"cons:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:29
msgid "Unit tests"
msgstr ""

#: ../../source/contributor/topics/testing.rst:31
msgid ""
"These are isolated, stand-alone tests with no external dependencies. They "
"are written from the perspective of \"knowing the code\", and test the "
"assumptions of the codebase and the developer."
msgstr ""

#: ../../source/contributor/topics/testing.rst:35
#: ../../source/contributor/topics/testing.rst:55
#: ../../source/contributor/topics/testing.rst:79
msgid "Pros:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:37
msgid "Generally lightweight and fast."
msgstr ""

#: ../../source/contributor/topics/testing.rst:38
msgid "Can be run anywhere, anytime since they have no external dependencies."
msgstr ""

#: ../../source/contributor/topics/testing.rst:40
#: ../../source/contributor/topics/testing.rst:63
#: ../../source/contributor/topics/testing.rst:86
msgid "Cons:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:42
msgid "Easy to be lax in writing them, or lazy in constructing them."
msgstr ""

#: ../../source/contributor/topics/testing.rst:43
msgid "Can't test interactions with live external services."
msgstr ""

#: ../../source/contributor/topics/testing.rst:46
msgid "Functional tests"
msgstr ""

#: ../../source/contributor/topics/testing.rst:48
msgid ""
"These are generally also isolated tests, though sometimes they may interact "
"with other services running locally. The key difference between functional "
"tests and unit tests, however, is that functional tests are written from the "
"perspective of the user (who knows nothing about the code) and only knows "
"what they put in and what they get back. Essentially this is a higher-level "
"testing of \"does the result match the spec?\"."
msgstr ""

#: ../../source/contributor/topics/testing.rst:57
msgid ""
"Ensures that your code *always* meets the stated functional requirements."
msgstr ""

#: ../../source/contributor/topics/testing.rst:58
msgid ""
"Verifies things from an \"end user\" perspective, which helps to ensure a "
"high-quality experience."
msgstr ""

#: ../../source/contributor/topics/testing.rst:60
msgid ""
"Designing your code with a functional testing perspective in mind helps keep "
"a higher-level viewpoint in mind."
msgstr ""

#: ../../source/contributor/topics/testing.rst:65
msgid ""
"Requires an additional layer of thinking to define functional requirements "
"in terms of inputs and outputs."
msgstr ""

#: ../../source/contributor/topics/testing.rst:67
msgid ""
"Often requires writing a separate set of tests and/or using a different "
"testing framework from your unit tests."
msgstr ""

#: ../../source/contributor/topics/testing.rst:69
msgid ""
"Doesn't offer any insight into the quality or status of the underlying code, "
"only verifies that it works or it doesn't."
msgstr ""

#: ../../source/contributor/topics/testing.rst:73
msgid "Integration Tests"
msgstr ""

#: ../../source/contributor/topics/testing.rst:75
msgid ""
"This layer of testing involves testing all of the components that your "
"codebase interacts with or relies on in conjunction. This is equivalent to "
"\"live\" testing, but in a repeatable manner."
msgstr ""

#: ../../source/contributor/topics/testing.rst:81
msgid "Catches *many* bugs that unit and functional tests will not."
msgstr ""

#: ../../source/contributor/topics/testing.rst:82
msgid "Doesn't rely on assumptions about the inputs and outputs."
msgstr ""

#: ../../source/contributor/topics/testing.rst:83
msgid "Will warn you when changes in external components break your code."
msgstr ""

#: ../../source/contributor/topics/testing.rst:84
msgid "Will take screenshot of the current page on test fail for easy debug"
msgstr ""

#: ../../source/contributor/topics/testing.rst:88
msgid "Difficult and time-consuming to create a repeatable test environment."
msgstr ""

#: ../../source/contributor/topics/testing.rst:89
msgid "Did I mention that setting it up is a pain?"
msgstr ""

#: ../../source/contributor/topics/testing.rst:91
msgid ""
"Screenshot directory could be set through horizon.conf file, default value: "
"``./integration_tests_screenshots``"
msgstr ""

#: ../../source/contributor/topics/testing.rst:95
msgid "So what should I write?"
msgstr ""

#: ../../source/contributor/topics/testing.rst:97
msgid "A few simple guidelines:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:99
msgid "Every bug fix should have a regression test. Period."
msgstr ""

#: ../../source/contributor/topics/testing.rst:101
msgid ""
"When writing a new feature, think about writing unit tests to verify the "
"behavior step-by-step as you write the feature. Every time you'd go to run "
"your code by hand and verify it manually, think \"could I write a test to do "
"this instead?\". That way when the feature is done and you're ready to "
"commit it you've already got a whole set of tests that are more thorough "
"than anything you'd write after the fact."
msgstr ""

#: ../../source/contributor/topics/testing.rst:108
msgid ""
"Write tests that hit every view in your application. Even if they don't "
"assert a single thing about the code, it tells you that your users aren't "
"getting fatal errors just by interacting with your code."
msgstr ""

#: ../../source/contributor/topics/testing.rst:113
msgid "What makes a good unit test?"
msgstr ""

#: ../../source/contributor/topics/testing.rst:115
msgid ""
"Limiting our focus just to unit tests, there are a number of things you can "
"do to make your unit tests as useful, maintainable, and unburdensome as "
"possible."
msgstr ""

#: ../../source/contributor/topics/testing.rst:120
msgid "Test data"
msgstr ""

#: ../../source/contributor/topics/testing.rst:122
msgid ""
"Use a single, consistent set of test data. Grow it over time, but do "
"everything you can not to fragment it. It quickly becomes unmaintainable and "
"perniciously out-of-sync with reality."
msgstr ""

#: ../../source/contributor/topics/testing.rst:126
msgid ""
"Make your test data as accurate to reality as possible. Supply *all* the "
"attributes of an object, provide objects in all the various states you may "
"want to test."
msgstr ""

#: ../../source/contributor/topics/testing.rst:130
msgid ""
"If you do the first suggestion above *first* it makes the second one far "
"less painful. Write once, use everywhere."
msgstr ""

#: ../../source/contributor/topics/testing.rst:133
msgid ""
"To make your life even easier, if your codebase doesn't have a built-in ORM-"
"like function to manage your test data you can consider building (or "
"borrowing) one yourself. Being able to do simple retrieval queries on your "
"test data is incredibly valuable."
msgstr ""

#: ../../source/contributor/topics/testing.rst:139
msgid "Mocking"
msgstr ""

#: ../../source/contributor/topics/testing.rst:141
msgid ""
"Mocking is the practice of providing stand-ins for objects or pieces of code "
"you don't need to test. While convenient, they should be used with *extreme* "
"caution."
msgstr ""

#: ../../source/contributor/topics/testing.rst:145
msgid ""
"Why? Because overuse of mocks can rapidly land you in a situation where "
"you're not testing any real code. All you've done is verified that your "
"mocking framework returns what you tell it to. This problem can be very "
"tricky to recognize, since you may be mocking things in ``setUp`` methods, "
"other modules, etc."
msgstr ""

#: ../../source/contributor/topics/testing.rst:151
msgid ""
"A good rule of thumb is to mock as close to the source as possible. If you "
"have a function call that calls an external API in a view , mock out the "
"external API, not the whole function. If you mock the whole function you've "
"suddenly lost test coverage for an entire chunk of code *inside* your "
"codebase. Cut the ties cleanly right where your system ends and the external "
"world begins."
msgstr ""

#: ../../source/contributor/topics/testing.rst:157
msgid ""
"Similarly, don't mock return values when you could construct a real return "
"value of the correct type with the correct attributes. You're just adding "
"another point of potential failure by exercising your mocking framework "
"instead of real code. Following the suggestions for testing above will make "
"this a lot less burdensome."
msgstr ""

#: ../../source/contributor/topics/testing.rst:164
msgid "Assertions and verification"
msgstr ""

#: ../../source/contributor/topics/testing.rst:166
msgid ""
"Think long and hard about what you really want to verify in your unit test. "
"In particular, think about what custom logic your code executes."
msgstr ""

#: ../../source/contributor/topics/testing.rst:169
msgid ""
"A common pitfall is to take a known test object, pass it through your code, "
"and then verify the properties of that object on the output. This is all "
"well and good, except if you're verifying properties that were untouched by "
"your code. What you want to check are the pieces that were *changed*, "
"*added*, or *removed*. Don't check the object's id attribute unless you have "
"reason to suspect it's not the object you started with. But if you added a "
"new attribute to it, be damn sure you verify that came out right."
msgstr ""

#: ../../source/contributor/topics/testing.rst:177
msgid ""
"It's also very common to avoid testing things you really care about because "
"it's more difficult. Verifying that the proper messages were displayed to "
"the user after an action, testing for form errors, making sure exception "
"handling is tested... these types of things aren't always easy, but they're "
"extremely necessary."
msgstr ""

#: ../../source/contributor/topics/testing.rst:183
msgid ""
"To that end, Horizon includes several custom assertions to make these tasks "
"easier. :meth:`~openstack_dashboard.test.helpers.TestCase."
"assertNoFormErrors`, :meth:`~horizon.test.helpers.TestCase."
"assertMessageCount`, and :meth:`~horizon.test.helpers.TestCase."
"assertNoMessages` all exist for exactly these purposes. Moreover, they "
"provide useful output when things go wrong so you're not left scratching "
"your head wondering why your view test didn't redirect as expected when you "
"posted a form."
msgstr ""

#: ../../source/contributor/topics/testing.rst:194
msgid "Debugging Unit Tests"
msgstr ""

#: ../../source/contributor/topics/testing.rst:197
msgid "Tips and tricks"
msgstr ""

#: ../../source/contributor/topics/testing.rst:199
msgid ""
"Use :meth:`~openstack_dashboard.test.helpers.TestCase.assertNoFormErrors` "
"immediately after your ``client.post`` call for tests that handle form "
"views. This will immediately fail if your form POST failed due to a "
"validation error and tell you what the error was."
msgstr ""

#: ../../source/contributor/topics/testing.rst:204
msgid ""
"Use :meth:`~horizon.test.helpers.TestCase.assertMessageCount` and :meth:"
"`~horizon.test.helpers.TestCase.assertNoMessages` when a piece of code is "
"failing inexplicably. Since the core error handlers attach user-facing error "
"messages (and since the core logging is silenced during test runs) these "
"methods give you the dual benefit of verifying the output you expect while "
"clearly showing you the problematic error message if they fail."
msgstr ""

#: ../../source/contributor/topics/testing.rst:211
msgid ""
"Use Python's ``pdb`` module liberally. Many people don't realize it works "
"just as well in a test case as it does in a live view. Simply inserting "
"``import pdb; pdb.set_trace()`` anywhere in your codebase will drop the "
"interpreter into an interactive shell so you can explore your test "
"environment and see which of your assumptions about the code isn't, in fact, "
"flawlessly correct."
msgstr ""

#: ../../source/contributor/topics/testing.rst:218
msgid ""
"If the error is in the Selenium test suite, you're likely getting very "
"little information about the error. To increase the information provided to "
"you, edit ``horizon/test/settings.py`` to set ``DEBUG = True`` and set the "
"logging level to 'DEBUG' for the default 'test' logger. Also, add a logger "
"config for Django::"
msgstr ""

#: ../../source/contributor/topics/testing.rst:233
msgid "Testing with different Django versions"
msgstr ""

#: ../../source/contributor/topics/testing.rst:235
msgid ""
"Horizon supports multiple Django versions and our CI tests proposed patches "
"with various supported Django versions. The corresponding job names are like "
"``horizon-tox-python3-django111``."
msgstr ""

#: ../../source/contributor/topics/testing.rst:239
msgid ""
"You can know which tox env and django version are used by checking "
"``tox_envlist`` and ``django_version`` of the corresponding job definition "
"in ``.zuul.yaml``."
msgstr ""

#: ../../source/contributor/topics/testing.rst:243
msgid ""
"To test it locally, you need some extra steps. Here is an example where "
"``tox_envlist`` is ``py36`` and ``django_version`` is ``>=1.11,<2.0``."
msgstr ""

#: ../../source/contributor/topics/testing.rst:255
msgid ""
"``-r`` in the first command recreates the tox environment. Omit it if you "
"know what happens."
msgstr ""

#: ../../source/contributor/topics/testing.rst:257
msgid ""
"We usually need to quote the django version in the pip command-line in most "
"shells to escape interpretations by the shell."
msgstr ""

#: ../../source/contributor/topics/testing.rst:260
msgid "To check the django version installed in your tox env, run:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:267
msgid ""
"To reset the tox env used for testing with different Django version to the "
"regular tox env, run ``tox`` command with ``-r`` to recreate it."
msgstr ""

#: ../../source/contributor/topics/testing.rst:275
msgid "Coverage reports"
msgstr ""

#: ../../source/contributor/topics/testing.rst:277
msgid ""
"It is possible for tests to fail on your patch due to the npm-run-test not "
"passing the minimum threshold. This is not necessarily related directly to "
"the functions in the patch that have failed, but more that there are not "
"enough tests across horizon that are related to your patch."
msgstr ""

#: ../../source/contributor/topics/testing.rst:282
msgid ""
"The coverage reports may be found in the 'cover' directory. There's a "
"subdirectory for horizon and openstack_dashboard, and then under a directory "
"for the browser used to run the tests you should find an ``index.html``. "
"This can then be viewed to see the coverage details."
msgstr ""

#: ../../source/contributor/topics/testing.rst:287
msgid ""
"In this scenario you may need to submit a secondary patch to address test "
"coverage for another function within horizon to ensure tests rise above the "
"coverage threshold and your original patch can pass the necessary tests."
msgstr ""

#: ../../source/contributor/topics/testing.rst:292
msgid "Common pitfalls"
msgstr ""

#: ../../source/contributor/topics/testing.rst:294
msgid ""
"There are a number of typical (and non-obvious) ways to break the unit "
"tests. Some common things to look for:"
msgstr ""

#: ../../source/contributor/topics/testing.rst:297
msgid ""
"Make sure you stub out the method exactly as it's called in the code being "
"tested. For example, if your real code calls ``api.keystone.tenant_get``, "
"stubbing out ``api.tenant_get`` (available for legacy reasons) will fail."
msgstr ""

#: ../../source/contributor/topics/testing.rst:302
msgid ""
"When defining the expected input to a stubbed call, make sure the arguments "
"are *identical*, this includes ``str`` vs. ``int`` differences."
msgstr ""

#: ../../source/contributor/topics/testing.rst:305
msgid ""
"Make sure your test data are completely in line with the expected inputs. "
"Again, ``str`` vs. ``int`` or missing properties on test objects will kill "
"your tests."
msgstr ""

#: ../../source/contributor/topics/testing.rst:309
msgid ""
"Make sure there's nothing amiss in your templates (particularly the ``{% url "
"%}`` tag and its arguments). This often comes up when refactoring views or "
"renaming context variables. It can easily result in errors that you might "
"not stumble across while clicking around the development server."
msgstr ""

#: ../../source/contributor/topics/testing.rst:314
msgid ""
"Make sure you're not redirecting to views that no longer exist, e.g. the "
"``index`` view for a panel that got combined (such as instances & volumes)."
msgstr ""

#: ../../source/contributor/topics/testing.rst:318
msgid ""
"Make sure you repeat any stubbed out method calls that happen more than "
"once. They don't automatically repeat, you have to explicitly define them. "
"While this is a nuisance, it makes you acutely aware of how many API calls "
"are involved in a particular function."
msgstr ""

#: ../../source/contributor/topics/translation.rst:3
msgid "Translation in Horizon"
msgstr ""

#: ../../source/contributor/topics/translation.rst:6
msgid "What is the point of translating my code?"
msgstr ""

#: ../../source/contributor/topics/translation.rst:8
msgid ""
"You introduced an awesome piece of code and revel in your glorious "
"accomplishment. Suddenly your world comes crashing down when a core hands "
"you a -1 because your code is not translated. What gives?"
msgstr ""

#: ../../source/contributor/topics/translation.rst:12
msgid ""
"If you are writing software for a global audience, you must ensure that it "
"is translated so that other people around the world are able to use it. "
"Adding translation to your code is not that hard and a requirement for "
"horizon."
msgstr ""

#: ../../source/contributor/topics/translation.rst:16
msgid ""
"If you are interested in contributing translations, you may want to "
"investigate `Zanata <https://translate.openstack.org>`_ and the `upstream "
"translations <https://docs.openstack.org/i18n/latest/>`_. You can visit the "
"internationalization project IRC channel **#openstack-i18n**, if you need "
"further assistance."
msgstr ""

#: ../../source/contributor/topics/translation.rst:23
msgid "Overview and Architecture"
msgstr ""

#: ../../source/contributor/topics/translation.rst:25
msgid ""
"You can skip this section if you are only interested in learning how to use "
"translation. This section explains the two main components to translation: "
"message extraction and message substitution. We will briefly go over what "
"each one does for translation as a whole."
msgstr ""

#: ../../source/contributor/topics/translation.rst:31
msgid "Message Extraction"
msgstr ""

#: ../../source/contributor/topics/translation.rst:41
msgid ""
"Message extraction is the process of collecting translatable strings from "
"the code. The diagram above shows the flow of how messages are extracted and "
"then translated. Lets break this up into steps we can follow:"
msgstr ""

#: ../../source/contributor/topics/translation.rst:45
msgid ""
"The first step is to mark untranslated strings so that the extractor is able "
"to locate them. Refer to the guide below on how to use translation and what "
"these markers look like."
msgstr ""

#: ../../source/contributor/topics/translation.rst:49
msgid ""
"Once marked, we can then run ``tox -e manage -- extract_messages``, which "
"searches the codebase for these markers and extracts them into a Portable "
"Object Template (POT) file. In horizon, we extract from both the ``horizon`` "
"folder and the ``openstack_dashboard`` folder. We use the AngularJS "
"extractor for JavaScript and HTML files and the Django extractor for Python "
"and Django templates; both extractors are Babel plugins."
msgstr ""

#: ../../source/contributor/topics/translation.rst:56
msgid ""
"To update the .po files, you can run ``tox -e manage -- update_catalog`` to "
"update the .po file for every language, or you can specify a specific "
"language to update like this: ``tox -e manage -- update_catalog de``. This "
"is useful if you want to add a few extra translatabale strings for a "
"downstream customisation."
msgstr ""

#: ../../source/contributor/topics/translation.rst:64
msgid ""
"When pushing code upstream, the only requirement is to mark the strings "
"correctly. All creation of POT and PO files is handled by a daily upstream "
"job. Further information can be found in the `translation infrastructure "
"documentation <https://docs.openstack.org/i18n/latest/infra.html>`_."
msgstr ""

#: ../../source/contributor/topics/translation.rst:71
msgid "Message Substitution"
msgstr ""

#: ../../source/contributor/topics/translation.rst:81
msgid ""
"Message substitution is not the reverse process of message extraction. The "
"process is entirely different. Lets walk through this process."
msgstr ""

#: ../../source/contributor/topics/translation.rst:84
msgid ""
"Remember those markers we talked about earlier? Most of them are functions "
"like gettext or one of its variants. This allows the function to serve a "
"dual purpose - acting as a marker and also as a replacer."
msgstr ""

#: ../../source/contributor/topics/translation.rst:88
msgid ""
"In order for translation to work properly, we need to know the user's "
"locale. In horizon, the user can specify the locale using the Settings "
"panel. Once we know the locale, we know which Portable Object (PO) file to "
"use. The PO file is the file we received from translators in the message "
"extraction process. The gettext functions that we wrapped our code around "
"are then able to replace the untranslated strings with the translated one by "
"using the untranslated string as the message id."
msgstr ""

#: ../../source/contributor/topics/translation.rst:96
msgid ""
"For client-side translation, Django embeds a corresponding Django message "
"catalog. Javascript code on the client can use this catalog to do string "
"replacement similar to how server-side translation works."
msgstr ""

#: ../../source/contributor/topics/translation.rst:100
msgid ""
"If you are setting up a project and need to know how to make it "
"translatable, please refer to `this guide <https://docs.openstack.org/infra/"
"manual/creators.html#enabling-translation-infrastructure>`_."
msgstr ""

#: ../../source/contributor/topics/translation.rst:107
msgid "Making strings translatable"
msgstr ""

#: ../../source/contributor/topics/translation.rst:109
msgid ""
"To make your strings translatable, you need to mark it so that horizon can "
"locate and extract it into a POT file. When a user from another locale "
"visits your page, your string is replaced with the correct translated "
"version."
msgstr ""

#: ../../source/contributor/topics/translation.rst:114
msgid "In Django"
msgstr ""

#: ../../source/contributor/topics/translation.rst:116
msgid ""
"To translate a string, simply wrap one of the gettext variants around the "
"string. The examples below show you how to do translation for various "
"scenarios, such as interpolation, contextual markers and translation "
"comments."
msgstr ""

#: ../../source/contributor/topics/translation.rst:149
msgid ""
"In the example above, we imported ``ugettext`` as ``_``. This is a common "
"alias for gettext or any of its variants."
msgstr ""

#: ../../source/contributor/topics/translation.rst:153
msgid "In Django templates"
msgstr ""

#: ../../source/contributor/topics/translation.rst:155
msgid ""
"To use translation in your template, make sure you load the i18n module. To "
"translate a line of text, use the ``trans`` template tag. If you need to "
"translate a block of text, use the ``blocktrans`` template tag."
msgstr ""

#: ../../source/contributor/topics/translation.rst:159
msgid ""
"Sometimes, it is helpful to provide some context via the ``comment`` "
"template tag. There a number of other tags and filters at your disposal "
"should you need to use them. For more information, see the `Django docs "
"<https://docs.djangoproject.com/en/1.8/topics/i18n/translation/>`_"
msgstr ""

#: ../../source/contributor/topics/translation.rst:180
msgid "In JavaScript"
msgstr ""

#: ../../source/contributor/topics/translation.rst:182
msgid ""
"The Django message catalog is injected into the front-end. The gettext "
"function is available as a global function so you can just use it directly. "
"If you are writing AngularJS code, we prefer that you use the gettext "
"service, which is essentially a wrapper around the gettext function."
msgstr ""

#: ../../source/contributor/topics/translation.rst:203
msgid ""
"For localization in AngularJS files, use the AngularJS service ``horizon."
"framework.util.i18n.gettext``. Ensure that the injected dependency is named "
"``gettext`` or ``nggettext``. If you do not do this, message extraction will "
"not work properly!"
msgstr ""

#: ../../source/contributor/topics/translation.rst:209
msgid "In AngularJS templates"
msgstr ""

#: ../../source/contributor/topics/translation.rst:211
msgid ""
"To use translation in your AngularJS template, use the translate tag or the "
"translate filter. Note that we are using `angular-gettext <https://angular-"
"gettext.rocketeer.be/>`_ for message substitution but not for message "
"extraction."
msgstr ""

#: ../../source/contributor/topics/translation.rst:231
msgid ""
"The annotations in the example above are guaranteed to work. However, not "
"all of the angular-gettext annotations are supported because we wrote our "
"own custom babel extractor. If you need support for the annotations, ask on "
"IRC in the **#openstack-horizon** room or report a bug. Also note that you "
"should avoid embedding HTML fragments in your texts because it makes it "
"harder to translate. Use your best judgement if you absolutely need to "
"include HTML."
msgstr ""

#: ../../source/contributor/topics/translation.rst:241
msgid "Pseudo translation tool"
msgstr ""

#: ../../source/contributor/topics/translation.rst:243
msgid ""
"The pseudo translation tool can be used to verify that code is ready to be "
"translated. The pseudo tool replaces a language's translation with a "
"complete, fake translation. Then you can verify that your code properly "
"displays fake translations to validate that your code is ready for "
"translation."
msgstr ""

#: ../../source/contributor/topics/translation.rst:249
msgid "Running the pseudo translation tool"
msgstr ""

#: ../../source/contributor/topics/translation.rst:251
msgid "Make sure your .pot files are up to date"
msgstr ""

#: ../../source/contributor/topics/translation.rst:257
msgid ""
"Run the pseudo tool to create pseudo translations. This example replaces the "
"German translation with a pseudo translation"
msgstr ""

#: ../../source/contributor/topics/translation.rst:264
msgid "Compile the catalog"
msgstr ""

#: ../../source/contributor/topics/translation.rst:270
msgid "Run your development server."
msgstr ""

#: ../../source/contributor/topics/translation.rst:276
msgid "Log in and change to the language you pseudo translated."
msgstr ""

#: ../../source/contributor/topics/translation.rst:278
msgid ""
"It should look weird. More specifically, the translatable segments are going "
"to start and end with a bracket and they are going to have some added "
"characters. For example, \"Log In\" will become \"[~Log In~您好яшçあ]\" This "
"is useful because you can inspect for the following, and consider if your "
"code is working like it should:"
msgstr ""

#: ../../source/contributor/topics/translation.rst:284
msgid "If you see a string in English it's not translatable. Should it be?"
msgstr ""

#: ../../source/contributor/topics/translation.rst:285
msgid ""
"If you see brackets next to each other that might be concatenation. "
"Concatenation can make quality translations difficult or impossible. See "
"`Use string formatting variables, never perform string concatenation "
"<https://wiki.openstack.org/wiki/I18n/"
"TranslatableStrings#Use_string_formating_variables.2C_never_perform_string_concatenation>`_ "
"for additional information."
msgstr ""

#: ../../source/contributor/topics/translation.rst:290
msgid ""
"If there is unexpected wrapping/truncation there might not be enough space "
"for translations."
msgstr ""

#: ../../source/contributor/topics/translation.rst:292
msgid ""
"If you see a string in the proper translated language, it comes from an "
"external source. (That's not bad, just sometimes useful to know)"
msgstr ""

#: ../../source/contributor/topics/translation.rst:294
msgid "If you get new crashes, there is probably a bug."
msgstr ""

#: ../../source/contributor/topics/translation.rst:296
msgid ""
"Don't forget to remove any pseudo translated ``.pot`` or ``.po`` files. "
"Those should **not** be submitted for review."
msgstr ""

#: ../../source/contributor/topics/translation.rst:None
msgid "Message extraction diagram"
msgstr ""

#: ../../source/contributor/topics/translation.rst:None
msgid "Message substitution diagram"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:5
msgid "Workflows Topic Guide"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:13
msgid "For detailed API information refer to the :ref:`ref-workflows`."
msgstr ""

#: ../../source/contributor/topics/workflows.rst:18
msgid ""
"Workflows are complex forms with tabs, each workflow must consist of classes "
"extending the :class:`~horizon.workflows.Workflow`, :class:`~horizon."
"workflows.Step` and :class:`~horizon.workflows.Action`"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:23
msgid "Complex example of a workflow"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:25
msgid ""
"The following is a complex example of how data is exchanged between urls, "
"views, workflows and templates:"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:28
msgid ""
"In ``urls.py``, we have the named parameter. E.g. ``resource_class_id``. ::"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:36
msgid ""
"In ``views.py``, we pass data to the template and to the action(form) "
"(action can also pass data to the ``get_context_data`` method and to the "
"template). ::"
msgstr ""

#: ../../source/contributor/topics/workflows.rst:69
msgid ""
"In ``workflows.py`` we process the data, it is just more complex django "
"form. ::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:5
msgid "Tutorial: Building a Dashboard using Horizon"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:7
msgid ""
"This tutorial covers how to use the various components in horizon to build "
"an example dashboard and a panel with a tab which has a table containing "
"data from the back end."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:11
msgid ""
"As an example, we'll create a new ``My Dashboard`` dashboard with a ``My "
"Panel`` panel that has an ``Instances Tab`` tab. The tab has a table which "
"contains the data pulled by the Nova instances API."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:18
msgid ""
"This tutorial assumes you have either a ``devstack`` or ``openstack`` "
"environment up and running.  There are a variety of other resources which "
"may be helpful to read first.  For example, you may want to start with the :"
"ref:`quickstart` or the `Django tutorial`_."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:28
msgid "Creating a dashboard"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:31
msgid "The quick version"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:33
msgid ""
"Horizon provides a custom management command to create a typical base "
"dashboard structure for you. Run the following commands in your Horizon root "
"directory. It generates most of the boilerplate code you need::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:49
msgid ""
"You will notice that the directory ``mydashboard`` gets automatically "
"populated with the files related to a dashboard and the ``mypanel`` "
"directory gets automatically populated with the files related to a panel."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:56
msgid ""
"If you use the ``tree mydashboard`` command to list the ``mydashboard`` "
"directory in ``openstack_dashboard/dashboards`` , you will see a directory "
"structure that looks like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:83
msgid ""
"For this tutorial, we will not deal with the static directory, or the "
"``tests.py`` file. Leave them as they are."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:86
msgid ""
"With the rest of the files and directories in place, we can move on to add "
"our own dashboard."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:91
msgid "Defining a dashboard"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:93
msgid ""
"Open the ``dashboard.py`` file. You will notice the following code has been "
"automatically generated::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:111
msgid ""
"If you want the dashboard name to be something else, you can change the "
"``name`` attribute in the ``dashboard.py`` file . For example, you can "
"change it to be ``My Dashboard`` ::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:118
msgid ""
"A dashboard class will usually contain a ``name`` attribute (the display "
"name of the dashboard), a ``slug`` attribute (the internal name that could "
"be referenced by other components), a list of panels, default panel, etc. We "
"will cover how to add a panel in the next section."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:125
msgid "Creating a panel"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:127
msgid "We'll create a panel and call it ``My Panel``."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:132
msgid ""
"As described above, the ``mypanel`` directory under ``openstack_dashboard/"
"dashboards/mydashboard`` should look like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:147
msgid "Defining a panel"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:149
msgid ""
"The ``panel.py`` file referenced above has a special meaning. Within a "
"dashboard, any module name listed in the ``panels`` attribute on the "
"dashboard class will be auto-discovered by looking for the ``panel.py`` file "
"in a corresponding directory (the details are a bit magical, but have been "
"thoroughly vetted in Django's admin codebase)."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:155
msgid ""
"Open the ``panel.py`` file, you will have the following auto-generated code::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:172
msgid ""
"If you want the panel name to be something else, you can change the ``name`` "
"attribute in the ``panel.py`` file . For example, you can change it to be "
"``My Panel``::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:179
msgid ""
"Open the ``dashboard.py`` file again, insert the following code above the "
"``Mydashboard`` class. This code defines the ``Mygroup`` class and adds a "
"panel called ``mypanel``::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:189
msgid ""
"Modify the ``Mydashboard`` class to include ``Mygroup`` and add ``mypanel`` "
"as the default panel::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:199
msgid "The completed ``dashboard.py`` file should look like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:225
msgid "Tables, Tabs, and Views"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:227
msgid ""
"We'll start with the table, combine that with the tabs, and then build our "
"view from the pieces."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:231
msgid "Defining a table"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:233
msgid ""
"Horizon provides a :class:`~horizon.forms.SelfHandlingForm` :class:`~horizon."
"tables.DataTable` class which simplifies the vast majority of displaying "
"data to an end-user. We're just going to skim the surface here, but it has a "
"tremendous number of capabilities. Create a ``tables.py`` file under the "
"``mypanel`` directory and add the following code::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:256
msgid ""
"There are several things going on here... we created a table subclass, and "
"defined four columns that we want to retrieve data and display. Each of "
"those columns defines what attribute it accesses on the instance object as "
"the first argument, and since we like to make everything translatable, we "
"give each column a ``verbose_name`` that's marked for translation."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:262
msgid ""
"Lastly, we added a ``Meta`` class which indicates the meta object that "
"describes the ``instances`` table."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:267
msgid ""
"This is a slight simplification from the reality of how the instance object "
"is actually structured. In reality, accessing other attributes requires an "
"additional step."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:272
msgid "Adding actions to a table"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:274
msgid ""
"Horizon provides three types of basic action classes which can be taken on a "
"table's data:"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:277
msgid ":class:`~horizon.tables.Action`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:278
msgid ":class:`~horizon.tables.LinkAction`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:279
msgid ":class:`~horizon.tables.FilterAction`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:282
msgid ""
"There are also additional actions which are extensions of the basic Action "
"classes:"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:285
msgid ":class:`~horizon.tables.BatchAction`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:286
msgid ":class:`~horizon.tables.DeleteAction`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:287
msgid ":class:`~horizon.tables.FixedFilterAction`"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:291
msgid ""
"Now let's create and add a filter action to the table. To do so, we will "
"need to edit the ``tables.py`` file used above. To add a filter action which "
"will only show rows which contain the string entered in the filter field, we "
"must first define the action::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:302
msgid ""
"The action specified above will default the ``filter_type`` to be ``\"query"
"\"``. This means that the filter will use the client side table sorter."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:305
msgid "Then, we add that action to the table actions for our table.::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:312
msgid "The completed ``tables.py`` file should look like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:340
msgid "Defining tabs"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:342
msgid ""
"So we have a table, ready to receive our data. We could go straight to a "
"view from here, but in this case we're also going to use horizon's :class:"
"`~horizon.tabs.TabGroup` class."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:346
msgid ""
"Create a ``tabs.py`` file under the ``mypanel`` directory. Let's make a tab "
"group which has one tab. The completed code should look like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:392
msgid ""
"This tab gets a little more complicated. The tab handles data tables (and "
"all their associated features), and it also uses the ``preload`` attribute "
"to specify that this tab shouldn't be loaded by default. It will instead be "
"loaded via AJAX when someone clicks on it, saving us on API calls in the "
"vast majority of cases."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:398
msgid ""
"Additionally, the displaying of the table is handled by a reusable template, "
"``horizon/common/_detail_table.html``. Some simple pagination code was added "
"to handle large instance lists."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:402
msgid ""
"Lastly, this code introduces the concept of error handling in horizon. The :"
"func:`horizon.exceptions.handle` function is a centralized error handling "
"mechanism that takes all the guess-work and inconsistency out of dealing "
"with exceptions from the API. Use it everywhere."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:408
msgid "Tying it together in a view"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:410
msgid ""
"There are lots of pre-built class-based views in horizon. We try to provide "
"the starting points for all the common combinations of components."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:413
msgid ""
"Open the ``views.py`` file, the auto-generated code is like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:427
msgid ""
"In this case we want a starting view type that works with both tabs and "
"tables... that'd be the :class:`~horizon.tabs.TabbedTableView` class. It "
"takes the best of the dynamic delayed-loading capabilities tab groups "
"provide and mixes in the actions and AJAX-updating that tables are capable "
"of with almost no work on the user's end. Change ``views.APIView`` to be "
"``tabs.TabbedTableView`` and add ``MypanelTabs`` as the tab group class in "
"the ``IndexView`` class::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:439
msgid ""
"After importing the proper package, the completed ``views.py`` file  now "
"looks like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:459
msgid "The auto-generated ``urls.py`` file is like::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:472
msgid "The template"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:474
msgid ""
"Open the ``index.html`` file in the ``mydashboard/mypanel/templates/"
"mypanel`` directory, the auto-generated code is like the following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:489
msgid "The ``main`` block must be modified to insert the following code::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:498
msgid ""
"If you want to change the title of the ``index.html`` file to be something "
"else, you can change it. For example, change it to be ``My Panel`` in the "
"``block title`` section.  If you want the ``title`` in the ``block "
"page_header`` section to be something else, you can change it. For example, "
"change it to be ``My Panel``. The updated code could be like::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:521
msgid ""
"This gives us a custom page title, a header, and renders our tab group "
"provided by the view."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:524
msgid ""
"With all our code in place, the only thing left to do is to integrate it "
"into our OpenStack Dashboard site."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:530
msgid ""
"For more information about Django views, URLs and templates, please refer to "
"the `Django documentation`_."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:537
msgid "Enable and show the dashboard"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:539
msgid ""
"In order to make ``My Dashboard`` show up along with the existing dashboards "
"like ``Project`` or ``Admin`` on horizon, you need to create a file called "
"``_50_mydashboard.py`` under ``openstack_dashboard/enabled`` and add the "
"following::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:557
#: ../../source/contributor/tutorials/table_actions.rst:277
msgid "Run and check the dashboard"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:559
msgid "Everything is in place, now run ``Horizon`` on the different port::"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:563
msgid ""
"Go to ``http://<your server>:9000`` using a browser. After login as an admin "
"you should be able see ``My Dashboard`` shows up at the left side on "
"horizon. Click it, ``My Group`` will expand with ``My Panel``. Click on ``My "
"Panel``, the right side panel will display an ``Instances Tab`` which has an "
"``Instances`` table."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:569
msgid ""
"If you don't see any instance data, you haven't created any instances yet. "
"Go to dashboard ``Project`` -> ``Images``, select a small image, for "
"example, ``cirros-0.3.1-x86_64-uec`` , click ``Launch`` and enter an "
"``Instance Name``, click the button ``Launch``. It should create an instance "
"if the OpenStack or devstack is correctly set up. Once the creation of an "
"instance is successful, go to ``My Dashboard`` again to check the data."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:578
msgid "Adding a complex action to a table"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:580
msgid ""
"For a more detailed look into adding a table action, one that requires forms "
"for gathering data, you can walk through :ref:`tutorials-table-actions` "
"tutorial."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:585
#: ../../source/contributor/tutorials/table_actions.rst:293
msgid "Conclusion"
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:587
msgid ""
"What you've learned here is the fundamentals of how to write interfaces for "
"your own project based on the components horizon provides."
msgstr ""

#: ../../source/contributor/tutorials/dashboard.rst:590
#: ../../source/contributor/tutorials/table_actions.rst:300
msgid ""
"If you have feedback on how this tutorial could be improved, please feel "
"free to submit a bug against ``Horizon`` in `launchpad <https://bugs."
"launchpad.net/horizon>`__."
msgstr ""

#: ../../source/contributor/tutorials/index.rst:3
msgid "Tutorials"
msgstr ""

#: ../../source/contributor/tutorials/index.rst:5
msgid "Detailed tutorials to help you get started."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:5
msgid "Tutorial: Creating an Horizon Plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:8
msgid "Why should I package my code as a plugin?"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:10
msgid ""
"We highly encourage that you write and maintain your code using our plugin "
"architecture. A plugin by definition means the ability to be connected. In "
"practical terms, plugins are a way to extend and add to the functionality "
"that already exists. You can control its content and progress at a rate "
"independent of Horizon. If you write and package your code as a plugin, it "
"will continue to work in future releases."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:17
msgid ""
"Writing your code as a plugin also modularizes your code making it easier to "
"translate and test. This also makes it easier for deployers to consume your "
"code allowing selective enablement of features. We are currently using this "
"pattern internally for our dashboards."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:23
msgid "Creating the Plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:25
msgid ""
"This tutorial assumes you have a basic understanding of Python, HTML, "
"JavaScript. Knowledge of AngularJS is optional but recommended if you are "
"attempting to create an Angular plugin."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:30
msgid "Name of your repository"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:32
msgid ""
"Needless to say, it is important to choose a meaningful repository name."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:34
msgid ""
"In addition, if you plan to support translation on your dashboard plugin, it "
"is recommended to choose a name like ``xxxx-dashboard`` (or ``xxxx-ui``. "
"``xxxx-horizon``). The OpenStack CI infra script considers a repository with "
"these suffixes as Django project."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:40
msgid "Types of Plugins that add content"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:42
msgid ""
"The file structure for your plugin type will be different depending on your "
"needs. Your plugin can be categorized into two types:"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:45
msgid "Plugins that create new panels or dashboards"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:46
msgid "Plugins that modify existing workflows, actions, etc... (Angular only)"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:48
msgid ""
"We will cover the basics of working with panels for both Python and Angular. "
"If you are interested in creating a new panel, follow the steps below."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:53
msgid ""
"This tutorial shows you how to create a new panel. If you are interested in "
"creating a new dashboard plugin, use the file structure from :ref:`tutorials-"
"dashboard` instead."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:59
msgid "Below is a skeleton of what your plugin should look like.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:109
msgid ""
"If you are creating a Python plugin, you may ignore the ``static`` folder. "
"Most of the classes you need are provided for in Python. If you intend on "
"adding custom front-end logic, you will need to include additional "
"JavaScript here."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:113
msgid ""
"An AngularJS plugin is a collection of JavaScript files or static resources. "
"Because it runs entirely in your browser, we need to place all of our static "
"resources inside the ``static`` folder. This ensures that the Django static "
"collector picks it up and distributes it to the browser correctly."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:119
msgid "The Enabled File"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:121
msgid ""
"The enabled folder contains the configuration file(s) that registers your "
"plugin with Horizon. The file is prefixed with an alpha-numeric string that "
"determines the load order of your plugin. For more information on what you "
"can include in this file, see pluggable settings in :ref:`install-settings`."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:126
msgid "_31000_myplugin.py::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:157
msgid ""
"Currently, ``AUTO_DISCOVER_STATIC_FILES = True`` will only discover "
"JavaScript files, not SCSS files."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:161
msgid "my_rest_api.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:163
msgid ""
"This file will likely be necessary if creating a plugin using Angular. Your "
"plugin will need to communicate with a new service or require new "
"interactions with a service already supported by Horizon. In this particular "
"example, the plugin will augment the support for the already supported "
"Identity service, Keystone. This file serves to define new REST interfaces "
"for the plugin's client-side to communicate with Horizon. Typically, the "
"REST interfaces here make calls into ``myservice.py``."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:171
msgid ""
"This file is unnecessary in a purely Django based plugin, or if your Angular "
"based plugin is relying on CORS support in the desired service. For more "
"information on CORS, see https://docs.openstack.org/oslo.middleware/latest/"
"admin/cross-project-cors.html"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:177
msgid "myservice.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:179
msgid ""
"This file will likely be necessary if creating a Django or Angular driven "
"plugin. This file is intended to act as a convenient location for "
"interacting with the new service this plugin is supporting. While "
"interactions with the service can be handled in the ``views.py``, isolating "
"the logic is an established pattern in Horizon."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:186
msgid "panel.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:188
msgid ""
"We define a panel where our plugin's content will reside in. This is "
"currently a necessity even for Angular plugins. The slug is the panel's "
"unique identifier and is often use as part of the URL. Make sure that it "
"matches what you have in your enabled file.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:202
msgid "tests.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:204
msgid ""
"Write some tests for the Django portion of your plugin and place them here."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:207
msgid "urls.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:209
msgid ""
"Now that we have a panel, we need to provide a URL so that users can visit "
"our new panel! This URL generally will point to a view.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:221
msgid "views.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:223
msgid ""
"Because rendering is done client-side, all our view needs is to reference "
"some HTML page. If you are writing a Python plugin, this view can be much "
"more complex. Refer to the topic guides for more details.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:234
#: ../../source/contributor/tutorials/plugin.rst:323
msgid "index.html"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:236
msgid ""
"The index HTML is where rendering occurs. In this example, we are only using "
"Django. If you are interested in using Angular directives instead, read the "
"AngularJS section below.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:252
msgid ""
"At this point, you have a very basic plugin. Note that new templates are "
"required to extend base.html. Including base.html is important for a number "
"of reasons. It is the template that contains all of your static resources "
"along with any functionality external to your panel (things like navigation, "
"context selection, etc...). As of this moment, this is also true for Angular "
"plugins."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:259
msgid "MANIFEST.in"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:260
msgid ""
"This file is responsible for listing the paths you want included in your "
"tar.::"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:268
msgid "setup.py"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:287
msgid "setup.cfg"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:316
msgid "AngularJS Plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:318
msgid ""
"If you have no plans to add AngularJS to your plugin, you may skip this "
"section. In the tutorial below, we will show you how to customize your panel "
"using Angular."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:325
msgid ""
"The index HTML is where rendering occurs and serves as an entry point for "
"Angular. This is where we start to diverge from the traditional Python "
"plugin. In this example, we use a Django template as the glue to our Angular "
"template. Why are we going through a Django template for an Angular plugin? "
"Long story short, ``base.html`` contains the navigation piece that we still "
"need for each panel."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:350
msgid ""
"This template contains both Django and AngularJS code. Angular is denoted by "
"``{$..$}`` while Django is denoted by ``{{..}}`` and ``{%..%}``. This "
"template gets processed twice, once by Django on the server-side and once "
"more by Angular on the client-side. This means that the expressions in "
"``{{..}}`` and ``{%..%}`` are substituted with values by the time it reaches "
"your Angular template."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:356
msgid ""
"What you chose to include in ``block main`` is entirely up to you. Since you "
"are creating an Angular plugin, we recommend that you keep everything in "
"this section Angular. Do not mix Python code in here! If you find yourself "
"passing in Python data, do it via our REST services instead."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:361
msgid ""
"Remember to always use ``STATIC_URL`` when referencing your static "
"resources. This ensures that changes to the static path in settings will "
"continue to serve your static resources properly."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:367
msgid ""
"Angular's directives are prefixed with ng. Similarly, Horizon's directives "
"are prefixed with hz. You can think of them as namespaces."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:371
msgid "mypanel.js"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:373
msgid ""
"Your controller is the glue between the model and the view. In this example, "
"we are going to give it some fake data to render. To load more complex data, "
"consider using the $http service."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:399
msgid ""
"This is a basic example where we mocked the data. For exercise, load your "
"data using the ``$http`` service."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:403
msgid "mypanel.html"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:405
msgid ""
"This is our view. In this example, we are looping through the list of items "
"provided by the controller and displaying the name and id. The important "
"thing to note is the reference to our controller using the ``ng-controller`` "
"directive."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:423
msgid "mypanel.scss"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:425
msgid ""
"You can choose to customize your panel by providing your own scss. Be sure "
"to include it in your enabled file via the ``ADD_SCSS_FILES`` setting."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:429
msgid "Translation Support"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:431
msgid ""
"A general instruction on how to enable translation support is described in "
"the Infrastructure User Manual [#]_."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:434
msgid "This section describes topics specific to Horizon plugins."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:437
msgid "ADD_INSTALLED_APPS"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:439
msgid ""
"Be sure to include ``<modulename>`` (``myplugin`` in this example) in "
"``ADD_INSTALLED_APPS`` in the corresponding ``enabled`` file."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:442
msgid ""
"If you are preparing a new plugin, you will use ``<modulename>`` as "
"``INSTALLED_APPS`` in most cases as suggested in this tutorial. This is good "
"and there is nothing more to do."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:445
msgid ""
"If for some reason your plugin needs to register other python modules to "
"``ADD_INSTALLED_APPS``, ensure that you include its ``<modulename>`` "
"additionally."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:449
msgid "This comes from the combination of the following two reasons."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:451
msgid ""
"Django looks for translation message catalogs from each path specified in "
"``INSTALLED_APPS`` [#]_."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:453
msgid ""
"OpenStack infra scripts assumes translation message catalogs are placed "
"under ``<modulename>/locale`` (for example ``myplugin/locale``)."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:456
msgid ""
"https://docs.openstack.org/infra/manual/creators.html#enabling-translation-"
"infrastructure"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:457
msgid ""
"https://docs.djangoproject.com/es/1.9/topics/i18n/translation/#how-django-"
"discovers-translations"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:460
msgid "myplugin/locale"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:462
msgid ""
"Translated message catalog files (PO files) are placed under this directory."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:466
msgid "babel-django.cfg, babel-djangojs.cfg"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:468
msgid ""
"These files are used to extract messages by ``pybabel``: ``babel-django."
"cfg`` for python code and template files, and ``babel-djangojs.cfg`` for "
"JavaScript files."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:472
msgid ""
"They are required to enable translation support by OpenStack CI infra. If "
"they do not exist, the translation jobs will skip processing for your "
"project."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:477
msgid "Installing Your Plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:479
msgid ""
"Now that you have a complete plugin, it is time to install and test it. The "
"instructions below assume that you have a working plugin."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:482
msgid "``plugin`` is the location of your plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:483
msgid "``horizon`` is the location of horizon"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:484
msgid "``package`` is the complete name of your packaged plugin"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:486
msgid "Run \"cd ``plugin`` & python setup.py sdist\""
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:487
msgid "Run \"cp -rv enabled ``horizon``/openstack_dashboard/local/\""
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:488
msgid ""
"Run \"``horizon``/tools/with_venv.sh pip install dist/``package``.tar.gz\""
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:489
msgid "Restart Apache or your Django test server"
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:493
msgid ""
"Step 3 installs your package into the Horizon's virtual environment. You can "
"install your plugin without using ``with_venv.sh`` and ``pip``. The package "
"would simply be installed in the ``PYTHON_PATH`` of the system instead."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:497
msgid ""
"If you are able to hit the URL pattern in ``urls.py`` in your browser, you "
"have successfully deployed your plugin! For plugins that do not have a URL, "
"check that your static resources are loaded using the browser inspector."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:501
msgid ""
"Assuming you implemented ``my_rest_api.py``, you can use a REST client to "
"hit the url directly and test it. There should be many REST clients "
"available on your web browser."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:505
msgid ""
"Note that you may need to rebuild your virtual environment if your plugin is "
"not showing up properly. If your plugin does not show up properly, check "
"your ``.tox`` folder to make sure the plugin's content is as you expect."
msgstr ""

#: ../../source/contributor/tutorials/plugin.rst:511
msgid ""
"To uninstall, use ``pip uninstall``. You will also need to remove the "
"enabled file from the ``local/enabled`` folder."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:5
msgid "Tutorial: Adding a complex action to a table"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:7
msgid ""
"This tutorial covers how to add a more complex action to a table, one that "
"requires an action and form definitions, as well as changes to the view, "
"urls, and table."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:11
msgid ""
"This tutorial assumes you have already completed :ref:`tutorials-dashboard`. "
"If not, please do so now as we will be modifying the files created there."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:15
msgid ""
"This action will create a snapshot of the instance. When the action is "
"taken, it will display a form that will allow the user to enter a snapshot "
"name, and will create that snapshot when the form is closed using the "
"``Create snapshot`` button."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:21
msgid "Defining the view"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:23
msgid ""
"To define the view, we must create a view class, along with the template "
"(``HTML``) file and the form class for that view."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:27
msgid "The template file"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:28
msgid "The template file contains the HTML that will be used to show the view."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:30
msgid ""
"Create a ``create_snapshot.html`` file under the ``mypanel/templates/"
"mypanel`` directory and add the following code::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:46
msgid ""
"As you can see, the main body will be defined in ``_create_snapshot.html``, "
"so we must also create that file under the ``mypanel/templates/mypanel`` "
"directory. It should contain the following code::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:60
msgid "The form"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:62
msgid ""
"Horizon provides a :class:`~horizon.forms.base.SelfHandlingForm` class which "
"simplifies some of the details involved in creating a form. Our form will "
"derive from this class, adding a character field to allow the user to "
"specify a name for the snapshot, and handling the successful closure of the "
"form by calling the nova api to create the snapshot."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:68
msgid ""
"Create the ``forms.py`` file under the ``mypanel`` directory and add the "
"following::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:98
msgid "The view"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:100
msgid ""
"Now, the view will tie together the template and the form. Horizon provides "
"a :class:`~horizon.forms.views.ModalFormView` class which simplifies the "
"creation of a view that will contain a modal form."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:104
msgid ""
"Open the ``views.py`` file under the ``mypanel`` directory and add the code "
"for the CreateSnapshotView and the necessary imports. The complete file "
"should now look something like this::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:168
msgid "Adding the url"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:170
msgid ""
"We must add the url for our new view.  Open the ``urls.py`` file under the "
"``mypanel`` directory and add the following as a new url pattern::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:177
msgid "The complete ``urls.py`` file should look like this::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:195
msgid "Define the action"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:197
msgid ""
"Horizon provides a :class:`~horizon.tables.LinkAction` class which "
"simplifies adding an action which can be used to display another view."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:200
msgid ""
"We will add a link action to the table that will be accessible from each row "
"in the table. The action will use the view defined above to create a "
"snapshot of the instance represented by the row in the table."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:204
msgid ""
"To do this, we must edit the ``tables.py`` file under the ``mypanel`` "
"directory and add the following::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:228
msgid "We must also add our new action as a row action for the table::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:233
msgid "The complete ``tables.py`` file should look like this::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:279
msgid "We must once again run horizon to verify our dashboard is working::"
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:284
msgid ""
"Go to ``http://<your server>:9000`` using a browser. After login as an "
"admin, display ``My Panel`` to see the ``Instances`` table. For every "
"``ACTIVE`` instance in the table, there will be a ``Create Snapshot`` action "
"on the row. Click on ``Create Snapshot``, enter a snapshot name in the form "
"that is shown, then click to close the form. The ``Project Images`` view "
"should be shown with the new snapshot added to the table."
msgstr ""

#: ../../source/contributor/tutorials/table_actions.rst:295
msgid ""
"What you've learned here is the fundamentals of how to add a table action "
"that requires a form for data entry. This can easily be expanded from "
"creating a snapshot to other API calls that require more complex forms to "
"gather the necessary information."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:2
msgid "Extending an AngularJS Workflow"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:4
msgid ""
"A workflow extends the ``extensibleService``. This means that all workflows "
"inherit properties and methods provided by the ``extensibleService``. "
"Extending a workflow allows you to add your own steps, remove existing "
"steps, and inject custom data handling logic. Refer to inline documentation "
"on what those properties and methods are."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:10
msgid ""
"We highly recommend that you complete the :ref:`tutorials-plugin` if you "
"have not done so already. If you do not know how to package and install a "
"plugin, the rest of this tutorial will not make sense! In this tutorial, we "
"will examine an existing workflow and how we can extend it as a plugin."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:18
msgid ""
"Although this tutorial focuses on extending a workflow, the steps here can "
"easily be adapted to extend any service that inherited the "
"``extensibleService``. Examples of other extensible points include table "
"columns and table actions."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:26
msgid ""
"Remember that the goal of this tutorial is to inject our custom step into an "
"**existing** workflow. All of the files we are interested in reside in the "
"``static`` folder."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:52
msgid "myplugin.module.js"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:54
msgid ""
"This is the entry point into our plugin. We hook into an existing module via "
"the run block which is executed after the module has been initialized. All "
"we need to do is inject it as a dependency and then use the methods provided "
"in the extensible service to override or modify steps. In this example, we "
"are going to prepend our custom step so that it will show up as the first "
"step in the wizard."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:89
msgid ""
"Replace ``horizon.app.core.images.workflows.create-volume.service`` with the "
"workflow you intend to augment."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:93
msgid "mystep.controller.js"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:95
msgid ""
"It is important to note that the scope is the glue between our controllers, "
"this is how we are propagating events from one controller to another. We can "
"propagate events upward using the $emit method and propagate events downward "
"using the $broadcast method."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:100
msgid ""
"Using the $on method, we can listen to events generated within the scope. In "
"this manner, actions we completed in the wizard are visually reflected in "
"the table even though they are two completely different widgets. Similarly, "
"you can share data between steps in your workflow as long as they share the "
"same parent scope."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:106
msgid ""
"In this example, we are listening for events generated by the wizard and the "
"user panel. We also emit a custom event that other controllers can register "
"to when favorite color changes."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:164
msgid "mystep.help.html"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:166
msgid ""
"In this tutorial, we will leave this file blank. Include additional "
"information here if your step requires it. Otherwise, remove the file and "
"the ``helpUrl`` property from your step."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:171
msgid "mystep.html"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:173
msgid ""
"This file contains contents you want to display to the user. We will provide "
"a simple example of a step that asks for your favorite color. The most "
"important thing to note here is the reference to our controller via the ``ng-"
"controller`` directive. This is essentially the link to our controller."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""
nt thing to note here is the reference to our controller via the ``ng-"
"controller`` directive. This is essentially the link to our controller."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""
tr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""
in`."
msgstr ""
n the wizard."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:89
msgid ""
"Replace ``horizon.app.core.images.workflows.create-volume.service`` with the "
"workflow you intend to augment."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:93
msgid "mystep.controller.js"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:95
msgid ""
"It is important to note that the scope is the glue between our controllers, "
"this is how we are propagating events from one controller to another. We can "
"propagate events upward using the $emit method and propagate events downward "
"using the $broadcast method."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:100
msgid ""
"Using the $on method, we can listen to events generated within the scope. In "
"this manner, actions we completed in the wizard are visually reflected in "
"the table even though they are two completely different widgets. Similarly, "
"you can share data between steps in your workflow as long as they share the "
"same parent scope."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:106
msgid ""
"In this example, we are listening for events generated by the wizard and the "
"user panel. We also emit a custom event that other controllers can register "
"to when favorite color changes."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:164
msgid "mystep.help.html"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:166
msgid ""
"In this tutorial, we will leave this file blank. Include additional "
"information here if your step requires it. Otherwise, remove the file and "
"the ``helpUrl`` property from your step."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:171
msgid "mystep.html"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:173
msgid ""
"This file contains contents you want to display to the user. We will provide "
"a simple example of a step that asks for your favorite color. The most "
"important thing to note here is the reference to our controller via the ``ng-"
"controller`` directive. This is essentially the link to our controller."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""
extend.rst:173
msgid ""
"This file contains contents you want to display to the user. We will provide "
"a simple example of a step that asks for your favorite color. The most "
"important thing to note here is the reference to our controller via the ``ng-"
"controller`` directive. This is essentially the link to our controller."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""
ise, remove the file and "
"the ``helpUrl`` property from your step."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:171
msgid "mystep.html"
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:173
msgid ""
"This file contains contents you want to display to the user. We will provide "
"a simple example of a step that asks for your favorite color. The most "
"important thing to note here is the reference to our controller via the ``ng-"
"controller`` directive. This is essentially the link to our controller."
msgstr ""

#: ../../source/contributor/tutorials/workflow_extend.rst:205
msgid ""
"Now that we have completed our plugin, lets package it and test that it "
"works. If you need a refresher, take a look at the installation section in :"
"ref:`tutorials-plugin`."
msgstr ""

