<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>horizon.base — Horizon 2012.2.3 documentation</title> <link rel="stylesheet" href="../../_static/nature.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="../../_static/tweaks.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../', VERSION: '2012.2.3', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> <script type="text/javascript" src="../../_static/jquery.tweet.js"></script> <link rel="top" title="Horizon 2012.2.3 documentation" href="../../index.html" /> <link rel="up" title="horizon" href="../horizon.html" /> </head> <body> <div id="header"> <h1 id="logo"><a href="http://www.openstack.org/">OpenStack</a></h1> <ul id="navigation"> <li><a href="http://www.openstack.org/" title="Go to the Home page" class="link">Home</a></li> <li><a href="http://www.openstack.org/projects/" title="Go to the OpenStack Projects page">Projects</a></li> <li><a href="http://www.openstack.org/user-stories/" title="Go to the User Stories page" class="link">User Stories</a></li> <li><a href="http://www.openstack.org/community/" title="Go to the Community page" class="link">Community</a></li> <li><a href="http://www.openstack.org/blog/" title="Go to the OpenStack Blog">Blog</a></li> <li><a href="http://wiki.openstack.org/" title="Go to the OpenStack Wiki">Wiki</a></li> <li><a href="http://docs.openstack.org/" title="Go to OpenStack Documentation" class="current">Documentation</a></li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <h1>Source code for horizon.base</h1><div class="highlight"><pre> <span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span> <span class="c"># Copyright 2012 Nebula, Inc.</span> <span class="c">#</span> <span class="c"># Licensed under the Apache License, Version 2.0 (the "License"); you may</span> <span class="c"># not use this file except in compliance with the License. You may obtain</span> <span class="c"># a copy of the License at</span> <span class="c">#</span> <span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span> <span class="c">#</span> <span class="c"># Unless required by applicable law or agreed to in writing, software</span> <span class="c"># distributed under the License is distributed on an "AS IS" BASIS, WITHOUT</span> <span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span> <span class="c"># License for the specific language governing permissions and limitations</span> <span class="c"># under the License.</span> <span class="sd">"""</span> <span class="sd">Contains the core classes and functionality that makes Horizon what it is.</span> <span class="sd">This module is considered internal, and should not be relied on directly.</span> <span class="sd">Public APIs are made available through the :mod:`horizon` module and</span> <span class="sd">the classes contained therein.</span> <span class="sd">"""</span> <span class="kn">import</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="nn">logging</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span> <span class="kn">from</span> <span class="nn">django.conf.urls.defaults</span> <span class="kn">import</span> <span class="n">patterns</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">include</span> <span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ImproperlyConfigured</span> <span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span> <span class="kn">from</span> <span class="nn">django.utils.datastructures</span> <span class="kn">import</span> <span class="n">SortedDict</span> <span class="kn">from</span> <span class="nn">django.utils.functional</span> <span class="kn">import</span> <span class="n">SimpleLazyObject</span> <span class="kn">from</span> <span class="nn">django.utils.importlib</span> <span class="kn">import</span> <span class="n">import_module</span> <span class="kn">from</span> <span class="nn">django.utils.module_loading</span> <span class="kn">import</span> <span class="n">module_has_submodule</span> <span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">ugettext</span> <span class="k">as</span> <span class="n">_</span> <span class="kn">from</span> <span class="nn">horizon</span> <span class="kn">import</span> <span class="n">loaders</span> <span class="kn">from</span> <span class="nn">horizon.decorators</span> <span class="kn">import</span> <span class="n">require_auth</span><span class="p">,</span> <span class="n">require_perms</span><span class="p">,</span> <span class="n">_current_component</span> <span class="n">LOG</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span> <span class="c"># Default configuration dictionary. Do not mutate directly. Use copy.copy().</span> <span class="n">HORIZON_CONFIG</span> <span class="o">=</span> <span class="p">{</span> <span class="c"># Allow for ordering dashboards; list or tuple if provided.</span> <span class="s">'dashboards'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="c"># Name of a default dashboard; defaults to first alphabetically if None</span> <span class="s">'default_dashboard'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="c"># Default redirect url for users' home</span> <span class="s">'user_home'</span><span class="p">:</span> <span class="n">settings</span><span class="o">.</span><span class="n">LOGIN_REDIRECT_URL</span><span class="p">,</span> <span class="s">'exceptions'</span><span class="p">:</span> <span class="p">{</span><span class="s">'unauthorized'</span><span class="p">:</span> <span class="p">[],</span> <span class="s">'not_found'</span><span class="p">:</span> <span class="p">[],</span> <span class="s">'recoverable'</span><span class="p">:</span> <span class="p">[]}</span> <span class="p">}</span> <span class="k">def</span> <span class="nf">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">decorator</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">urlpatterns</span><span class="p">:</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="s">'callback'</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span> <span class="n">pattern</span><span class="o">.</span><span class="n">_callback</span> <span class="o">=</span> <span class="n">decorator</span><span class="p">(</span><span class="n">pattern</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="s">'url_patterns'</span><span class="p">,</span> <span class="p">[]):</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">pattern</span><span class="o">.</span><span class="n">url_patterns</span><span class="p">,</span> <span class="n">decorator</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <div class="viewcode-block" id="NotRegistered"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.NotRegistered">[docs]</a><span class="k">class</span> <span class="nc">NotRegistered</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="k">pass</span> </div> <div class="viewcode-block" id="HorizonComponent"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.HorizonComponent">[docs]</a><span class="k">class</span> <span class="nc">HorizonComponent</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">HorizonComponent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">:</span> <span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s">'Every </span><span class="si">%s</span><span class="s"> must have a slug.'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'name'</span><span class="p">,</span> <span class="s">u"Unnamed </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="k">return</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_get_default_urlpatterns</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">package_string</span> <span class="o">=</span> <span class="s">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__module__</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'urls'</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="s">'.</span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">urls</span><span class="p">,</span> <span class="n">package_string</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="n">mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">urls</span><span class="p">)</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">urlpatterns</span> <span class="k">else</span><span class="p">:</span> <span class="c"># Try importing a urls.py from the dashboard package</span> <span class="k">if</span> <span class="n">module_has_submodule</span><span class="p">(</span><span class="n">import_module</span><span class="p">(</span><span class="n">package_string</span><span class="p">),</span> <span class="s">'urls'</span><span class="p">):</span> <span class="n">urls_mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="s">'.urls'</span><span class="p">,</span> <span class="n">package_string</span><span class="p">)</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">urls_mod</span><span class="o">.</span><span class="n">urlpatterns</span> <span class="k">else</span><span class="p">:</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">''</span><span class="p">)</span> <span class="k">return</span> <span class="n">urlpatterns</span> </div> <div class="viewcode-block" id="Registry"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Registry">[docs]</a><span class="k">class</span> <span class="nc">Registry</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_registerable_class'</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span> <span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s">'Subclasses of Registry must set a '</span> <span class="s">'"_registerable_class" property.'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="sd">"""Registers the given class.</span> <span class="sd"> If the specified class is already registered then it is ignored.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'Only classes may be registered.'</span><span class="p">)</span> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'Only </span><span class="si">%s</span><span class="s"> classes or subclasses may be registered.'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="k">if</span> <span class="n">cls</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">:</span> <span class="n">cls</span><span class="o">.</span><span class="n">_registered_with</span> <span class="o">=</span> <span class="bp">self</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">[</span><span class="n">cls</span><span class="p">]</span> <span class="o">=</span> <span class="n">cls</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">[</span><span class="n">cls</span><span class="p">]</span> <span class="k">def</span> <span class="nf">_unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="sd">"""Unregisters the given class.</span> <span class="sd"> If the specified class isn't registered, ``NotRegistered`` will</span> <span class="sd"> be raised.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'Only </span><span class="si">%s</span><span class="s"> classes or subclasses may be '</span> <span class="s">'unregistered.'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="p">)</span> <span class="k">if</span> <span class="n">cls</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s"> is not registered'</span> <span class="o">%</span> <span class="n">cls</span><span class="p">)</span> <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">[</span><span class="n">cls</span><span class="p">]</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">def</span> <span class="nf">_registered</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="p">):</span> <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">found</span><span class="p">:</span> <span class="k">return</span> <span class="n">found</span> <span class="k">else</span><span class="p">:</span> <span class="c"># Allow for fetching by slugs as well.</span> <span class="k">for</span> <span class="n">registered</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">if</span> <span class="n">registered</span><span class="o">.</span><span class="n">slug</span> <span class="o">==</span> <span class="n">cls</span><span class="p">:</span> <span class="k">return</span> <span class="n">registered</span> <span class="n">class_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registerable_class</span><span class="o">.</span><span class="n">__name__</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"_registered_with"</span><span class="p">):</span> <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered_with</span><span class="o">.</span><span class="n">_registerable_class</span><span class="o">.</span><span class="n">__name__</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">'</span><span class="si">%(type)s</span><span class="s"> with slug "</span><span class="si">%(slug)s</span><span class="s">" is not '</span> <span class="s">'registered with </span><span class="si">%(parent)s</span><span class="s"> "</span><span class="si">%(name)s</span><span class="s">".'</span> <span class="o">%</span> <span class="p">{</span><span class="s">"type"</span><span class="p">:</span> <span class="n">class_name</span><span class="p">,</span> <span class="s">"slug"</span><span class="p">:</span> <span class="n">cls</span><span class="p">,</span> <span class="s">"parent"</span><span class="p">:</span> <span class="n">parent</span><span class="p">,</span> <span class="s">"name"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">})</span> <span class="k">else</span><span class="p">:</span> <span class="n">slug</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="s">"slug"</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">'</span><span class="si">%(type)s</span><span class="s"> with slug "</span><span class="si">%(slug)s</span><span class="s">" is not '</span> <span class="s">'registered.'</span> <span class="o">%</span> <span class="p">{</span><span class="s">"type"</span><span class="p">:</span> <span class="n">class_name</span><span class="p">,</span> <span class="s">"slug"</span><span class="p">:</span> <span class="n">slug</span><span class="p">})</span> </div> <div class="viewcode-block" id="Panel"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Panel">[docs]</a><span class="k">class</span> <span class="nc">Panel</span><span class="p">(</span><span class="n">HorizonComponent</span><span class="p">):</span> <span class="sd">""" A base class for defining Horizon dashboard panels.</span> <span class="sd"> All Horizon dashboard panels should extend from this class. It provides</span> <span class="sd"> the appropriate hooks for automatically constructing URLconfs, and</span> <span class="sd"> providing permission-based access control.</span> <span class="sd"> .. attribute:: name</span> <span class="sd"> The name of the panel. This will be displayed in the</span> <span class="sd"> auto-generated navigation and various other places.</span> <span class="sd"> Default: ``''``.</span> <span class="sd"> .. attribute:: slug</span> <span class="sd"> A unique "short name" for the panel. The slug is used as</span> <span class="sd"> a component of the URL path for the panel. Default: ``''``.</span> <span class="sd"> .. attribute:: permissions</span> <span class="sd"> A list of permission names, all of which a user must possess in order</span> <span class="sd"> to access any view associated with this panel. This attribute</span> <span class="sd"> is combined cumulatively with any permissions required on the</span> <span class="sd"> ``Dashboard`` class with which it is registered.</span> <span class="sd"> .. attribute:: urls</span> <span class="sd"> Path to a URLconf of views for this panel using dotted Python</span> <span class="sd"> notation. If no value is specified, a file called ``urls.py``</span> <span class="sd"> living in the same package as the ``panel.py`` file is used.</span> <span class="sd"> Default: ``None``.</span> <span class="sd"> .. attribute:: nav</span> <span class="sd"> .. method:: nav(context)</span> <span class="sd"> The ``nav`` attribute can be either boolean value or a callable</span> <span class="sd"> which accepts a ``RequestContext`` object as a single argument</span> <span class="sd"> to control whether or not this panel should appear in</span> <span class="sd"> automatically-generated navigation. Default: ``True``.</span> <span class="sd"> .. attribute:: index_url_name</span> <span class="sd"> The ``name`` argument for the URL pattern which corresponds to</span> <span class="sd"> the index view for this ``Panel``. This is the view that</span> <span class="sd"> :meth:`.Panel.get_absolute_url` will attempt to reverse.</span> <span class="sd"> """</span> <span class="n">name</span> <span class="o">=</span> <span class="s">''</span> <span class="n">slug</span> <span class="o">=</span> <span class="s">''</span> <span class="n">urls</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">nav</span> <span class="o">=</span> <span class="bp">True</span> <span class="n">index_url_name</span> <span class="o">=</span> <span class="s">"index"</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">"<Panel: </span><span class="si">%s</span><span class="s">>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <div class="viewcode-block" id="Panel.get_absolute_url"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Panel.get_absolute_url">[docs]</a> <span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns the default URL for this panel.</span> <span class="sd"> The default URL is defined as the URL pattern with ``name="index"`` in</span> <span class="sd"> the URLconf for this panel.</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="s">'horizon:</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registered_with</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">index_url_name</span><span class="p">))</span> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span> <span class="c"># Logging here since this will often be called in a template</span> <span class="c"># where the exception would be hidden.</span> <span class="n">LOG</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">"Error reversing absolute URL for </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="p">))</span> <span class="k">raise</span> </div> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">_decorated_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_urlpatterns</span><span class="p">()</span> <span class="c"># Apply access controls to all views in the patterns</span> <span class="n">permissions</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'permissions'</span><span class="p">,</span> <span class="p">[])</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">require_perms</span><span class="p">,</span> <span class="n">permissions</span><span class="p">)</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">_current_component</span><span class="p">,</span> <span class="n">panel</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="c"># Return the three arguments to django.conf.urls.defaults.include</span> <span class="k">return</span> <span class="n">urlpatterns</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> </div> <div class="viewcode-block" id="PanelGroup"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.PanelGroup">[docs]</a><span class="k">class</span> <span class="nc">PanelGroup</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">""" A container for a set of :class:`~horizon.Panel` classes.</span> <span class="sd"> When iterated, it will yield each of the ``Panel`` instances it</span> <span class="sd"> contains.</span> <span class="sd"> .. attribute:: slug</span> <span class="sd"> A unique string to identify this panel group. Required.</span> <span class="sd"> .. attribute:: name</span> <span class="sd"> A user-friendly name which will be used as the group heading in</span> <span class="sd"> places such as the navigation. Default: ``None``.</span> <span class="sd"> .. attribute:: panels</span> <span class="sd"> A list of panel module names which should be contained within this</span> <span class="sd"> grouping.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">,</span> <span class="n">slug</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">panels</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">dashboard</span> <span class="o">=</span> <span class="n">dashboard</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="o">=</span> <span class="n">slug</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"slug"</span><span class="p">,</span> <span class="s">"default"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"name"</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="c"># Our panels must be mutable so it can be extended by others.</span> <span class="bp">self</span><span class="o">.</span><span class="n">panels</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">panels</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"panels"</span><span class="p">,</span> <span class="p">[]))</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">"<</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">panel_instances</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">panels</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">panel_instances</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dashboard</span><span class="o">.</span><span class="n">get_panel</span><span class="p">(</span><span class="n">name</span><span class="p">))</span> <span class="k">except</span> <span class="n">NotRegistered</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">LOG</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="n">panel_instances</span><span class="p">)</span> </div> <div class="viewcode-block" id="Dashboard"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard">[docs]</a><span class="k">class</span> <span class="nc">Dashboard</span><span class="p">(</span><span class="n">Registry</span><span class="p">,</span> <span class="n">HorizonComponent</span><span class="p">):</span> <span class="sd">""" A base class for defining Horizon dashboards.</span> <span class="sd"> All Horizon dashboards should extend from this base class. It provides the</span> <span class="sd"> appropriate hooks for automatic discovery of :class:`~horizon.Panel`</span> <span class="sd"> modules, automatically constructing URLconfs, and providing</span> <span class="sd"> permission-based access control.</span> <span class="sd"> .. attribute:: name</span> <span class="sd"> The name of the dashboard. This will be displayed in the</span> <span class="sd"> auto-generated navigation and various other places.</span> <span class="sd"> Default: ``''``.</span> <span class="sd"> .. attribute:: slug</span> <span class="sd"> A unique "short name" for the dashboard. The slug is used as</span> <span class="sd"> a component of the URL path for the dashboard. Default: ``''``.</span> <span class="sd"> .. attribute:: panels</span> <span class="sd"> The ``panels`` attribute can be either a flat list containing the name</span> <span class="sd"> of each panel **module** which should be loaded as part of this</span> <span class="sd"> dashboard, or a list of :class:`~horizon.PanelGroup` classes which</span> <span class="sd"> define groups of panels as in the following example::</span> <span class="sd"> class SystemPanels(horizon.PanelGroup):</span> <span class="sd"> slug = "syspanel"</span> <span class="sd"> name = _("System Panel")</span> <span class="sd"> panels = ('overview', 'instances', ...)</span> <span class="sd"> class Syspanel(horizon.Dashboard):</span> <span class="sd"> panels = (SystemPanels,)</span> <span class="sd"> Automatically generated navigation will use the order of the</span> <span class="sd"> modules in this attribute.</span> <span class="sd"> Default: ``[]``.</span> <span class="sd"> .. warning::</span> <span class="sd"> The values for this attribute should not correspond to the</span> <span class="sd"> :attr:`~.Panel.name` attributes of the ``Panel`` classes.</span> <span class="sd"> They should be the names of the Python modules in which the</span> <span class="sd"> ``panel.py`` files live. This is used for the automatic</span> <span class="sd"> loading and registration of ``Panel`` classes much like</span> <span class="sd"> Django's ``ModelAdmin`` machinery.</span> <span class="sd"> Panel modules must be listed in ``panels`` in order to be</span> <span class="sd"> discovered by the automatic registration mechanism.</span> <span class="sd"> .. attribute:: default_panel</span> <span class="sd"> The name of the panel which should be treated as the default</span> <span class="sd"> panel for the dashboard, i.e. when you visit the root URL</span> <span class="sd"> for this dashboard, that's the panel that is displayed.</span> <span class="sd"> Default: ``None``.</span> <span class="sd"> .. attribute:: permissions</span> <span class="sd"> A list of permission names, all of which a user must possess in order</span> <span class="sd"> to access any panel registered with this dashboard. This attribute</span> <span class="sd"> is combined cumulatively with any permissions required on individual</span> <span class="sd"> :class:`~horizon.Panel` classes.</span> <span class="sd"> .. attribute:: urls</span> <span class="sd"> Optional path to a URLconf of additional views for this dashboard</span> <span class="sd"> which are not connected to specific panels. Default: ``None``.</span> <span class="sd"> .. attribute:: nav</span> <span class="sd"> Optional boolean to control whether or not this dashboard should</span> <span class="sd"> appear in automatically-generated navigation. Default: ``True``.</span> <span class="sd"> .. attribute:: supports_tenants</span> <span class="sd"> Optional boolean that indicates whether or not this dashboard includes</span> <span class="sd"> support for projects/tenants. If set to ``True`` this dashboard's</span> <span class="sd"> navigation will include a UI element that allows the user to select</span> <span class="sd"> project/tenant. Default: ``False``.</span> <span class="sd"> .. attribute:: public</span> <span class="sd"> Boolean value to determine whether this dashboard can be viewed</span> <span class="sd"> without being logged in. Defaults to ``False``.</span> <span class="sd"> """</span> <span class="n">_registerable_class</span> <span class="o">=</span> <span class="n">Panel</span> <span class="n">name</span> <span class="o">=</span> <span class="s">''</span> <span class="n">slug</span> <span class="o">=</span> <span class="s">''</span> <span class="n">urls</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">panels</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">default_panel</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">nav</span> <span class="o">=</span> <span class="bp">True</span> <span class="n">supports_tenants</span> <span class="o">=</span> <span class="bp">False</span> <span class="n">public</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">"<Dashboard: </span><span class="si">%s</span><span class="s">>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">Dashboard</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_panel_groups</span> <span class="o">=</span> <span class="bp">None</span> <div class="viewcode-block" id="Dashboard.get_panel"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.get_panel">[docs]</a> <span class="k">def</span> <span class="nf">get_panel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns the specified :class:`~horizon.Panel` instance registered</span> <span class="sd"> with this dashboard.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="n">panel</span><span class="p">)</span> </div> <div class="viewcode-block" id="Dashboard.get_panels"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.get_panels">[docs]</a> <span class="k">def</span> <span class="nf">get_panels</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns the :class:`~horizon.Panel` instances registered with this</span> <span class="sd"> dashboard in order, without any panel groupings.</span> <span class="sd"> """</span> <span class="n">all_panels</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">panel_groups</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_panel_groups</span><span class="p">()</span> <span class="k">for</span> <span class="n">panel_group</span> <span class="ow">in</span> <span class="n">panel_groups</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="n">all_panels</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">panel_group</span><span class="p">)</span> <span class="k">return</span> <span class="n">all_panels</span> </div> <div class="viewcode-block" id="Dashboard.get_panel_group"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.get_panel_group">[docs]</a> <span class="k">def</span> <span class="nf">get_panel_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slug</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_panel_groups</span><span class="p">[</span><span class="n">slug</span><span class="p">]</span> </div> <div class="viewcode-block" id="Dashboard.get_panel_groups"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.get_panel_groups">[docs]</a> <span class="k">def</span> <span class="nf">get_panel_groups</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">registered</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">)</span> <span class="n">panel_groups</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># Gather our known panels</span> <span class="k">for</span> <span class="n">panel_group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_panel_groups</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">for</span> <span class="n">panel</span> <span class="ow">in</span> <span class="n">panel_group</span><span class="p">:</span> <span class="n">registered</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">panel</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span> <span class="n">panel_groups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">panel_group</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">panel_group</span><span class="p">))</span> <span class="c"># Deal with leftovers (such as add-on registrations)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">registered</span><span class="p">):</span> <span class="n">slugs</span> <span class="o">=</span> <span class="p">[</span><span class="n">panel</span><span class="o">.</span><span class="n">slug</span> <span class="k">for</span> <span class="n">panel</span> <span class="ow">in</span> <span class="n">registered</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span> <span class="n">new_group</span> <span class="o">=</span> <span class="n">PanelGroup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slug</span><span class="o">=</span><span class="s">"other"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s">"Other"</span><span class="p">),</span> <span class="n">panels</span><span class="o">=</span><span class="n">slugs</span><span class="p">)</span> <span class="n">panel_groups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">new_group</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">new_group</span><span class="p">))</span> <span class="k">return</span> <span class="n">SortedDict</span><span class="p">(</span><span class="n">panel_groups</span><span class="p">)</span> </div> <div class="viewcode-block" id="Dashboard.get_absolute_url"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.get_absolute_url">[docs]</a> <span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns the default URL for this dashboard.</span> <span class="sd"> The default URL is defined as the URL pattern with ``name="index"``</span> <span class="sd"> in the URLconf for the :class:`~horizon.Panel` specified by</span> <span class="sd"> :attr:`~horizon.Dashboard.default_panel`.</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_panel</span><span class="p">)</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="c"># Logging here since this will often be called in a template</span> <span class="c"># where the exception would be hidden.</span> <span class="n">LOG</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">"Error reversing absolute URL for </span><span class="si">%s</span><span class="s">."</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span> <span class="k">raise</span> </div> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">_decorated_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_urlpatterns</span><span class="p">()</span> <span class="n">default_panel</span> <span class="o">=</span> <span class="bp">None</span> <span class="c"># Add in each panel's views except for the default view.</span> <span class="k">for</span> <span class="n">panel</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">if</span> <span class="n">panel</span><span class="o">.</span><span class="n">slug</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_panel</span><span class="p">:</span> <span class="n">default_panel</span> <span class="o">=</span> <span class="n">panel</span> <span class="k">continue</span> <span class="n">urlpatterns</span> <span class="o">+=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">''</span><span class="p">,</span> <span class="n">url</span><span class="p">(</span><span class="s">r'^</span><span class="si">%s</span><span class="s">/'</span> <span class="o">%</span> <span class="n">panel</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">panel</span><span class="o">.</span><span class="n">_decorated_urls</span><span class="p">)))</span> <span class="c"># Now the default view, which should come last</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">default_panel</span><span class="p">:</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">'The default panel "</span><span class="si">%s</span><span class="s">" is not registered.'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_panel</span><span class="p">)</span> <span class="n">urlpatterns</span> <span class="o">+=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">''</span><span class="p">,</span> <span class="n">url</span><span class="p">(</span><span class="s">r''</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">default_panel</span><span class="o">.</span><span class="n">_decorated_urls</span><span class="p">)))</span> <span class="c"># Require login if not public.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">public</span><span class="p">:</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">require_auth</span><span class="p">)</span> <span class="c"># Apply access controls to all views in the patterns</span> <span class="n">permissions</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'permissions'</span><span class="p">,</span> <span class="p">[])</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">require_perms</span><span class="p">,</span> <span class="n">permissions</span><span class="p">)</span> <span class="n">_decorate_urlconf</span><span class="p">(</span><span class="n">urlpatterns</span><span class="p">,</span> <span class="n">_current_component</span><span class="p">,</span> <span class="n">dashboard</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="c"># Return the three arguments to django.conf.urls.defaults.include</span> <span class="k">return</span> <span class="n">urlpatterns</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="k">def</span> <span class="nf">_autodiscover</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Discovers panels to register from the current dashboard module. """</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"_autodiscover_complete"</span><span class="p">,</span> <span class="bp">False</span><span class="p">):</span> <span class="k">return</span> <span class="n">panels_to_discover</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">panel_groups</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># If we have a flat iterable of panel names, wrap it again so</span> <span class="c"># we have a consistent structure for the next step.</span> <span class="k">if</span> <span class="nb">all</span><span class="p">([</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">panels</span><span class="p">]):</span> <span class="bp">self</span><span class="o">.</span><span class="n">panels</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">panels</span><span class="p">]</span> <span class="c"># Now iterate our panel sets.</span> <span class="k">for</span> <span class="n">panel_set</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">panels</span><span class="p">:</span> <span class="c"># Instantiate PanelGroup classes.</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">panel_set</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">Iterable</span><span class="p">)</span> <span class="ow">and</span> \ <span class="nb">issubclass</span><span class="p">(</span><span class="n">panel_set</span><span class="p">,</span> <span class="n">PanelGroup</span><span class="p">):</span> <span class="n">panel_group</span> <span class="o">=</span> <span class="n">panel_set</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="c"># Check for nested tuples, and convert them to PanelGroups</span> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">panel_set</span><span class="p">,</span> <span class="n">PanelGroup</span><span class="p">):</span> <span class="n">panel_group</span> <span class="o">=</span> <span class="n">PanelGroup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">panels</span><span class="o">=</span><span class="n">panel_set</span><span class="p">)</span> <span class="c"># Put our results into their appropriate places</span> <span class="n">panels_to_discover</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">panel_group</span><span class="o">.</span><span class="n">panels</span><span class="p">)</span> <span class="n">panel_groups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">panel_group</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">panel_group</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">_panel_groups</span> <span class="o">=</span> <span class="n">SortedDict</span><span class="p">(</span><span class="n">panel_groups</span><span class="p">)</span> <span class="c"># Do the actual discovery</span> <span class="n">package</span> <span class="o">=</span> <span class="s">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__module__</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="n">mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">package</span><span class="p">)</span> <span class="k">for</span> <span class="n">panel</span> <span class="ow">in</span> <span class="n">panels_to_discover</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">before_import_registry</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">)</span> <span class="n">import_module</span><span class="p">(</span><span class="s">'.</span><span class="si">%s</span><span class="s">.panel'</span> <span class="o">%</span> <span class="n">panel</span><span class="p">,</span> <span class="n">package</span><span class="p">)</span> <span class="k">except</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span> <span class="o">=</span> <span class="n">before_import_registry</span> <span class="k">if</span> <span class="n">module_has_submodule</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">_autodiscover_complete</span> <span class="o">=</span> <span class="bp">True</span> <span class="nd">@classmethod</span> <div class="viewcode-block" id="Dashboard.register"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.register">[docs]</a> <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="sd">""" Registers a :class:`~horizon.Panel` with this dashboard. """</span> <span class="n">panel_class</span> <span class="o">=</span> <span class="n">Horizon</span><span class="o">.</span><span class="n">register_panel</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">panel</span><span class="p">)</span> <span class="c"># Support template loading from panel template directories.</span> <span class="n">panel_mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">panel</span><span class="o">.</span><span class="n">__module__</span><span class="p">)</span> <span class="n">panel_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">panel_mod</span><span class="o">.</span><span class="n">__file__</span><span class="p">)</span> <span class="n">template_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">panel_dir</span><span class="p">,</span> <span class="s">"templates"</span><span class="p">)</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">template_dir</span><span class="p">):</span> <span class="n">key</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">panel</span><span class="o">.</span><span class="n">slug</span><span class="p">)</span> <span class="n">loaders</span><span class="o">.</span><span class="n">panel_template_dirs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">template_dir</span> <span class="k">return</span> <span class="n">panel_class</span> </div> <span class="nd">@classmethod</span> <div class="viewcode-block" id="Dashboard.unregister"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Dashboard.unregister">[docs]</a> <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="sd">""" Unregisters a :class:`~horizon.Panel` from this dashboard. """</span> <span class="n">success</span> <span class="o">=</span> <span class="n">Horizon</span><span class="o">.</span><span class="n">unregister_panel</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">panel</span><span class="p">)</span> <span class="k">if</span> <span class="n">success</span><span class="p">:</span> <span class="c"># Remove the panel's template directory.</span> <span class="n">key</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">panel</span><span class="o">.</span><span class="n">slug</span><span class="p">)</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">loaders</span><span class="o">.</span><span class="n">panel_template_dirs</span><span class="p">:</span> <span class="k">del</span> <span class="n">loaders</span><span class="o">.</span><span class="n">panel_template_dirs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">return</span> <span class="n">success</span> </div></div> <div class="viewcode-block" id="Workflow"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Workflow">[docs]</a><span class="k">class</span> <span class="nc">Workflow</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span> </div> <span class="k">try</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">django.utils.functional</span> <span class="kn">import</span> <span class="n">empty</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c">#Django 1.3 fallback</span> <span class="n">empty</span> <span class="o">=</span> <span class="bp">None</span> <div class="viewcode-block" id="LazyURLPattern"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.LazyURLPattern">[docs]</a><span class="k">class</span> <span class="nc">LazyURLPattern</span><span class="p">(</span><span class="n">SimpleLazyObject</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_wrapped</span> <span class="ow">is</span> <span class="n">empty</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setup</span><span class="p">()</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_wrapped</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__reversed__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_wrapped</span> <span class="ow">is</span> <span class="n">empty</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setup</span><span class="p">()</span> <span class="k">return</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_wrapped</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site">[docs]</a><span class="k">class</span> <span class="nc">Site</span><span class="p">(</span><span class="n">Registry</span><span class="p">,</span> <span class="n">HorizonComponent</span><span class="p">):</span> <span class="sd">""" The overarching class which encompasses all dashboards and panels. """</span> <span class="c"># Required for registry</span> <span class="n">_registerable_class</span> <span class="o">=</span> <span class="n">Dashboard</span> <span class="n">name</span> <span class="o">=</span> <span class="s">"Horizon"</span> <span class="n">namespace</span> <span class="o">=</span> <span class="s">'horizon'</span> <span class="n">slug</span> <span class="o">=</span> <span class="s">'horizon'</span> <span class="n">urls</span> <span class="o">=</span> <span class="s">'horizon.site_urls'</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">u"<Site: </span><span class="si">%s</span><span class="s">>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">conf</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">HORIZON_CONFIG</span><span class="p">)</span> <span class="n">conf</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s">'HORIZON_CONFIG'</span><span class="p">,</span> <span class="p">{}))</span> <span class="k">return</span> <span class="n">conf</span> <span class="nd">@property</span> <div class="viewcode-block" id="Site.dashboards"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.dashboards">[docs]</a> <span class="k">def</span> <span class="nf">dashboards</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conf</span><span class="p">[</span><span class="s">'dashboards'</span><span class="p">]</span> </div> <span class="nd">@property</span> <div class="viewcode-block" id="Site.default_dashboard"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.default_dashboard">[docs]</a> <span class="k">def</span> <span class="nf">default_dashboard</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conf</span><span class="p">[</span><span class="s">'default_dashboard'</span><span class="p">]</span> </div> <div class="viewcode-block" id="Site.register"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.register">[docs]</a> <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">):</span> <span class="sd">""" Registers a :class:`~horizon.Dashboard` with Horizon."""</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_register</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.unregister"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.unregister">[docs]</a> <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">):</span> <span class="sd">""" Unregisters a :class:`~horizon.Dashboard` from Horizon. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unregister</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.registered"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.registered">[docs]</a> <span class="k">def</span> <span class="nf">registered</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.register_panel"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.register_panel">[docs]</a> <span class="k">def</span> <span class="nf">register_panel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="n">dash_instance</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">registered</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> <span class="k">return</span> <span class="n">dash_instance</span><span class="o">.</span><span class="n">_register</span><span class="p">(</span><span class="n">panel</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.unregister_panel"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.unregister_panel">[docs]</a> <span class="k">def</span> <span class="nf">unregister_panel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">,</span> <span class="n">panel</span><span class="p">):</span> <span class="n">dash_instance</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">registered</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">dash_instance</span><span class="p">:</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">"The dashboard </span><span class="si">%s</span><span class="s"> is not registered."</span> <span class="o">%</span> <span class="n">dashboard</span><span class="p">)</span> <span class="k">return</span> <span class="n">dash_instance</span><span class="o">.</span><span class="n">_unregister</span><span class="p">(</span><span class="n">panel</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.get_dashboard"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.get_dashboard">[docs]</a> <span class="k">def</span> <span class="nf">get_dashboard</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dashboard</span><span class="p">):</span> <span class="sd">""" Returns the specified :class:`~horizon.Dashboard` instance. """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.get_dashboards"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.get_dashboards">[docs]</a> <span class="k">def</span> <span class="nf">get_dashboards</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns an ordered tuple of :class:`~horizon.Dashboard` modules.</span> <span class="sd"> Orders dashboards according to the ``"dashboards"`` key in</span> <span class="sd"> ``settings.HORIZON_CONFIG`` or else returns all registered dashboards</span> <span class="sd"> in alphabetical order.</span> <span class="sd"> Any remaining :class:`~horizon.Dashboard` classes registered with</span> <span class="sd"> Horizon but not listed in ``settings.HORIZON_CONFIG['dashboards']``</span> <span class="sd"> will be appended to the end of the list alphabetically.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dashboards</span><span class="p">:</span> <span class="n">registered</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">)</span> <span class="n">dashboards</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dashboards</span><span class="p">:</span> <span class="n">dashboard</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="n">dashboards</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dashboard</span><span class="p">)</span> <span class="n">registered</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">dashboard</span><span class="o">.</span><span class="n">__class__</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">registered</span><span class="p">):</span> <span class="n">extra</span> <span class="o">=</span> <span class="n">registered</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="n">extra</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="n">dashboards</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span> <span class="k">return</span> <span class="n">dashboards</span> <span class="k">else</span><span class="p">:</span> <span class="n">dashboards</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">values</span><span class="p">()</span> <span class="n">dashboards</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="k">return</span> <span class="n">dashboards</span> </div> <div class="viewcode-block" id="Site.get_default_dashboard"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.get_default_dashboard">[docs]</a> <span class="k">def</span> <span class="nf">get_default_dashboard</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns the default :class:`~horizon.Dashboard` instance.</span> <span class="sd"> If ``"default_dashboard"`` is specified in ``settings.HORIZON_CONFIG``</span> <span class="sd"> then that dashboard will be returned. If not, the first dashboard</span> <span class="sd"> returned by :func:`~horizon.get_dashboards` will be returned.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_dashboard</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registered</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_dashboard</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_dashboards</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">NotRegistered</span><span class="p">(</span><span class="s">"No dashboard modules have been registered."</span><span class="p">)</span> </div> <div class="viewcode-block" id="Site.get_user_home"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.get_user_home">[docs]</a> <span class="k">def</span> <span class="nf">get_user_home</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">):</span> <span class="sd">""" Returns the default URL for a particular user.</span> <span class="sd"> This method can be used to customize where a user is sent when</span> <span class="sd"> they log in, etc. By default it returns the value of</span> <span class="sd"> :meth:`get_absolute_url`.</span> <span class="sd"> An alternative function can be supplied to customize this behavior</span> <span class="sd"> by specifying a either a URL or a function which returns a URL via</span> <span class="sd"> the ``"user_home"`` key in ``settings.HORIZON_CONFIG``. Each of these</span> <span class="sd"> would be valid::</span> <span class="sd"> {"user_home": "/home",} # A URL</span> <span class="sd"> {"user_home": "my_module.get_user_home",} # Path to a function</span> <span class="sd"> {"user_home": lambda user: "/" + user.name,} # A function</span> <span class="sd"> {"user_home": None,} # Will always return the default dashboard</span> <span class="sd"> This can be useful if the default dashboard may not be accessible</span> <span class="sd"> to all users. When user_home is missing from HORIZON_CONFIG,</span> <span class="sd"> it will default to the settings.LOGIN_REDIRECT_URL value.</span> <span class="sd"> """</span> <span class="n">user_home</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conf</span><span class="p">[</span><span class="s">'user_home'</span><span class="p">]</span> <span class="k">if</span> <span class="n">user_home</span><span class="p">:</span> <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">user_home</span><span class="p">):</span> <span class="k">return</span> <span class="n">user_home</span><span class="p">(</span><span class="n">user</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">user_home</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span> <span class="c"># Assume we've got a URL if there's a slash in it</span> <span class="k">if</span> <span class="n">user_home</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"/"</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="n">user_home</span> <span class="k">else</span><span class="p">:</span> <span class="n">mod</span><span class="p">,</span> <span class="n">func</span> <span class="o">=</span> <span class="n">user_home</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">"."</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">import_module</span><span class="p">(</span><span class="n">mod</span><span class="p">),</span> <span class="n">func</span><span class="p">)(</span><span class="n">user</span><span class="p">)</span> <span class="c"># If it's not callable and not a string, it's wrong.</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">'The user_home setting must be either a string '</span> <span class="s">'or a callable object (e.g. a function).'</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span> </div> <div class="viewcode-block" id="Site.get_absolute_url"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.Site.get_absolute_url">[docs]</a> <span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Returns the default URL for Horizon's URLconf.</span> <span class="sd"> The default URL is determined by calling</span> <span class="sd"> :meth:`~horizon.Dashboard.get_absolute_url`</span> <span class="sd"> on the :class:`~horizon.Dashboard` instance returned by</span> <span class="sd"> :meth:`~horizon.get_default_dashboard`.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_default_dashboard</span><span class="p">()</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span> </div> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">_lazy_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Lazy loading for URL patterns.</span> <span class="sd"> This method avoids problems associated with attempting to evaluate</span> <span class="sd"> the the URLconf before the settings module has been loaded.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">url_patterns</span><span class="p">():</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_urls</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="k">return</span> <span class="n">LazyURLPattern</span><span class="p">(</span><span class="n">url_patterns</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="k">def</span> <span class="nf">_urls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Constructs the URLconf for Horizon from registered Dashboards. """</span> <span class="n">urlpatterns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_urlpatterns</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_autodiscover</span><span class="p">()</span> <span class="c"># Discover each dashboard's panels.</span> <span class="k">for</span> <span class="n">dash</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="n">dash</span><span class="o">.</span><span class="n">_autodiscover</span><span class="p">()</span> <span class="c"># Allow for override modules</span> <span class="n">config</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="s">"HORIZON_CONFIG"</span><span class="p">,</span> <span class="p">{})</span> <span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">"customization_module"</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span> <span class="n">customization_module</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s">"customization_module"</span><span class="p">]</span> <span class="n">bits</span> <span class="o">=</span> <span class="n">customization_module</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)</span> <span class="n">mod_name</span> <span class="o">=</span> <span class="n">bits</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="n">package</span> <span class="o">=</span> <span class="s">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">bits</span><span class="p">)</span> <span class="n">mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">package</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">before_import_registry</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">)</span> <span class="n">import_module</span><span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">package</span><span class="p">,</span> <span class="n">mod_name</span><span class="p">))</span> <span class="k">except</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span> <span class="o">=</span> <span class="n">before_import_registry</span> <span class="k">if</span> <span class="n">module_has_submodule</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">mod_name</span><span class="p">):</span> <span class="k">raise</span> <span class="c"># Compile the dynamic urlconf.</span> <span class="k">for</span> <span class="n">dash</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="n">urlpatterns</span> <span class="o">+=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">''</span><span class="p">,</span> <span class="n">url</span><span class="p">(</span><span class="s">r'^</span><span class="si">%s</span><span class="s">/'</span> <span class="o">%</span> <span class="n">dash</span><span class="o">.</span><span class="n">slug</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">dash</span><span class="o">.</span><span class="n">_decorated_urls</span><span class="p">)))</span> <span class="c"># Return the three arguments to django.conf.urls.defaults.include</span> <span class="k">return</span> <span class="n">urlpatterns</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="k">def</span> <span class="nf">_autodiscover</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Discovers modules to register from ``settings.INSTALLED_APPS``.</span> <span class="sd"> This makes sure that the appropriate modules get imported to register</span> <span class="sd"> themselves with Horizon.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_registerable_class'</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span> <span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s">'You must set a '</span> <span class="s">'"_registerable_class" property '</span> <span class="s">'in order to use autodiscovery.'</span><span class="p">)</span> <span class="c"># Discover both dashboards and panels, in that order</span> <span class="k">for</span> <span class="n">mod_name</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'dashboard'</span><span class="p">,</span> <span class="s">'panel'</span><span class="p">):</span> <span class="k">for</span> <span class="n">app</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">INSTALLED_APPS</span><span class="p">:</span> <span class="n">mod</span> <span class="o">=</span> <span class="n">import_module</span><span class="p">(</span><span class="n">app</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">before_import_registry</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_registry</span><span class="p">)</span> <span class="n">import_module</span><span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">mod_name</span><span class="p">))</span> <span class="k">except</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry</span> <span class="o">=</span> <span class="n">before_import_registry</span> <span class="k">if</span> <span class="n">module_has_submodule</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">mod_name</span><span class="p">):</span> <span class="k">raise</span> </div> <div class="viewcode-block" id="HorizonSite"><a class="viewcode-back" href="../../sourcecode/horizon/horizon.base.html#horizon.base.HorizonSite">[docs]</a><span class="k">class</span> <span class="nc">HorizonSite</span><span class="p">(</span><span class="n">Site</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> A singleton implementation of Site such that all dealings with horizon</span> <span class="sd"> get the same instance no matter what. There can be only one.</span> <span class="sd"> """</span> <span class="n">_instance</span> <span class="o">=</span> <span class="bp">None</span> <span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">cls</span><span class="o">.</span><span class="n">_instance</span><span class="p">:</span> <span class="n">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">Site</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="c"># The one true Horizon</span></div> <span class="n">Horizon</span> <span class="o">=</span> <span class="n">HorizonSite</span><span class="p">()</span> </pre></div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li><a href="../../index.html">Horizon 2012.2.3 documentation</a> »</li> <li><a href="../index.html" >Module code</a> »</li> <li><a href="../horizon.html" accesskey="U">horizon</a> »</li> </ul> </div> <div class="footer"> © Copyright 2012, OpenStack, LLC. Last updated on Feb 08, 2013. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> </body> </html>