Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 6f61f4fc58119d17ef9d99939eb417b3 > files > 13

python-django-horizon-doc-2012.2.3-1.fc18.noarch.rpm


<!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 &mdash; 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 &quot;License&quot;); 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 &quot;AS IS&quot; 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">&quot;&quot;&quot;</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">&quot;&quot;&quot;</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">&#39;dashboards&#39;</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">&#39;default_dashboard&#39;</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span>
    <span class="c"># Default redirect url for users&#39; home</span>
    <span class="s">&#39;user_home&#39;</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">&#39;exceptions&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s">&#39;unauthorized&#39;</span><span class="p">:</span> <span class="p">[],</span>
                   <span class="s">&#39;not_found&#39;</span><span class="p">:</span> <span class="p">[],</span>
                   <span class="s">&#39;recoverable&#39;</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">&#39;callback&#39;</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">&#39;url_patterns&#39;</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">&#39;Every </span><span class="si">%s</span><span class="s"> must have a slug.&#39;</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">&#39;name&#39;</span><span class="p">,</span> <span class="s">u&quot;Unnamed </span><span class="si">%s</span><span class="s">&quot;</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">&#39;.&#39;</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">&#39;.&#39;</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">&#39;urls&#39;</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">&#39;.</span><span class="si">%s</span><span class="s">&#39;</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">&#39;urls&#39;</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">&#39;.urls&#39;</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">&#39;&#39;</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">&#39;_registerable_class&#39;</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">&#39;Subclasses of Registry must set a &#39;</span>
                                       <span class="s">&#39;&quot;_registerable_class&quot; property.&#39;</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">&quot;&quot;&quot;Registers the given class.</span>

<span class="sd">        If the specified class is already registered then it is ignored.</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;Only classes may be registered.&#39;</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">&#39;Only </span><span class="si">%s</span><span class="s"> classes or subclasses may be registered.&#39;</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">&quot;&quot;&quot;Unregisters the given class.</span>

<span class="sd">        If the specified class isn&#39;t registered, ``NotRegistered`` will</span>
<span class="sd">        be raised.</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;Only </span><span class="si">%s</span><span class="s"> classes or subclasses may be &#39;</span>
                             <span class="s">&#39;unregistered.&#39;</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">&#39;</span><span class="si">%s</span><span class="s"> is not registered&#39;</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">&quot;_registered_with&quot;</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">&#39;</span><span class="si">%(type)s</span><span class="s"> with slug &quot;</span><span class="si">%(slug)s</span><span class="s">&quot; is not &#39;</span>
                                <span class="s">&#39;registered with </span><span class="si">%(parent)s</span><span class="s"> &quot;</span><span class="si">%(name)s</span><span class="s">&quot;.&#39;</span>
                                    <span class="o">%</span> <span class="p">{</span><span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="n">class_name</span><span class="p">,</span>
                                       <span class="s">&quot;slug&quot;</span><span class="p">:</span> <span class="n">cls</span><span class="p">,</span>
                                       <span class="s">&quot;parent&quot;</span><span class="p">:</span> <span class="n">parent</span><span class="p">,</span>
                                       <span class="s">&quot;name&quot;</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">&quot;slug&quot;</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">&#39;</span><span class="si">%(type)s</span><span class="s"> with slug &quot;</span><span class="si">%(slug)s</span><span class="s">&quot; is not &#39;</span>
                                <span class="s">&#39;registered.&#39;</span> <span class="o">%</span> <span class="p">{</span><span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="n">class_name</span><span class="p">,</span>
                                                 <span class="s">&quot;slug&quot;</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">&quot;&quot;&quot; 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: ``&#39;&#39;``.</span>

<span class="sd">    .. attribute:: slug</span>

<span class="sd">        A unique &quot;short name&quot; for the panel. The slug is used as</span>
<span class="sd">        a component of the URL path for the panel. Default: ``&#39;&#39;``.</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">    &quot;&quot;&quot;</span>
    <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
    <span class="n">slug</span> <span class="o">=</span> <span class="s">&#39;&#39;</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">&quot;index&quot;</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">&quot;&lt;Panel: </span><span class="si">%s</span><span class="s">&gt;&quot;</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">&quot;&quot;&quot; Returns the default URL for this panel.</span>

<span class="sd">        The default URL is defined as the URL pattern with ``name=&quot;index&quot;`` in</span>
<span class="sd">        the URLconf for this panel.</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;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">&#39;</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">&quot;Error reversing absolute URL for </span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</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">&#39;permissions&#39;</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">&quot;&quot;&quot; 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">    &quot;&quot;&quot;</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">&quot;slug&quot;</span><span class="p">,</span> <span class="s">&quot;default&quot;</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">&quot;name&quot;</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">&quot;panels&quot;</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">&quot;&lt;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&gt;&quot;</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">&quot;&quot;&quot; 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: ``&#39;&#39;``.</span>

<span class="sd">    .. attribute:: slug</span>

<span class="sd">        A unique &quot;short name&quot; for the dashboard. The slug is used as</span>
<span class="sd">        a component of the URL path for the dashboard. Default: ``&#39;&#39;``.</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 = &quot;syspanel&quot;</span>
<span class="sd">                name = _(&quot;System Panel&quot;)</span>
<span class="sd">                panels = (&#39;overview&#39;, &#39;instances&#39;, ...)</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&#39;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&#39;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&#39;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">    &quot;&quot;&quot;</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">&#39;&#39;</span>
    <span class="n">slug</span> <span class="o">=</span> <span class="s">&#39;&#39;</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">&quot;&lt;Dashboard: </span><span class="si">%s</span><span class="s">&gt;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd">        Returns the specified :class:`~horizon.Panel` instance registered</span>
<span class="sd">        with this dashboard.</span>
<span class="sd">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;other&quot;</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">&quot;Other&quot;</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">&quot;&quot;&quot; Returns the default URL for this dashboard.</span>

<span class="sd">        The default URL is defined as the URL pattern with ``name=&quot;index&quot;``</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">        &quot;&quot;&quot;</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">&quot;Error reversing absolute URL for </span><span class="si">%s</span><span class="s">.&quot;</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&#39;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">&#39;&#39;</span><span class="p">,</span>
                    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^</span><span class="si">%s</span><span class="s">/&#39;</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">&#39;The default panel &quot;</span><span class="si">%s</span><span class="s">&quot; is not registered.&#39;</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">&#39;&#39;</span><span class="p">,</span>
                <span class="n">url</span><span class="p">(</span><span class="s">r&#39;&#39;</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">&#39;permissions&#39;</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">&quot;&quot;&quot; Discovers panels to register from the current dashboard module. &quot;&quot;&quot;</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">&quot;_autodiscover_complete&quot;</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">&#39;.&#39;</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">&#39;.&#39;</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">&#39;.</span><span class="si">%s</span><span class="s">.panel&#39;</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">&quot;&quot;&quot; Registers a :class:`~horizon.Panel` with this dashboard. &quot;&quot;&quot;</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">&quot;templates&quot;</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">&quot;&quot;&quot; Unregisters a :class:`~horizon.Panel` from this dashboard. &quot;&quot;&quot;</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&#39;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">&quot;&quot;&quot; The overarching class which encompasses all dashboards and panels. &quot;&quot;&quot;</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">&quot;Horizon&quot;</span>
    <span class="n">namespace</span> <span class="o">=</span> <span class="s">&#39;horizon&#39;</span>
    <span class="n">slug</span> <span class="o">=</span> <span class="s">&#39;horizon&#39;</span>
    <span class="n">urls</span> <span class="o">=</span> <span class="s">&#39;horizon.site_urls&#39;</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&quot;&lt;Site: </span><span class="si">%s</span><span class="s">&gt;&quot;</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">&#39;HORIZON_CONFIG&#39;</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">&#39;dashboards&#39;</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">&#39;default_dashboard&#39;</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">&quot;&quot;&quot; Registers a :class:`~horizon.Dashboard` with Horizon.&quot;&quot;&quot;</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">&quot;&quot;&quot; Unregisters a :class:`~horizon.Dashboard` from Horizon. &quot;&quot;&quot;</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">&quot;The dashboard </span><span class="si">%s</span><span class="s"> is not registered.&quot;</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">&quot;&quot;&quot; Returns the specified :class:`~horizon.Dashboard` instance. &quot;&quot;&quot;</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">&quot;&quot;&quot; Returns an ordered tuple of :class:`~horizon.Dashboard` modules.</span>

<span class="sd">        Orders dashboards according to the ``&quot;dashboards&quot;`` 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[&#39;dashboards&#39;]``</span>
<span class="sd">        will be appended to the end of the list alphabetically.</span>
<span class="sd">        &quot;&quot;&quot;</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">&quot;&quot;&quot; Returns the default :class:`~horizon.Dashboard` instance.</span>

<span class="sd">        If ``&quot;default_dashboard&quot;`` 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">        &quot;&quot;&quot;</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">&quot;No dashboard modules have been registered.&quot;</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">&quot;&quot;&quot; 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 ``&quot;user_home&quot;`` key in ``settings.HORIZON_CONFIG``. Each of these</span>
<span class="sd">        would be valid::</span>

<span class="sd">            {&quot;user_home&quot;: &quot;/home&quot;,}  # A URL</span>
<span class="sd">            {&quot;user_home&quot;: &quot;my_module.get_user_home&quot;,}  # Path to a function</span>
<span class="sd">            {&quot;user_home&quot;: lambda user: &quot;/&quot; + user.name,}  # A function</span>
<span class="sd">            {&quot;user_home&quot;: 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">        &quot;&quot;&quot;</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">&#39;user_home&#39;</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&#39;ve got a URL if there&#39;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">&quot;/&quot;</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">&quot;.&quot;</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&#39;s not callable and not a string, it&#39;s wrong.</span>
            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&#39;The user_home setting must be either a string &#39;</span>
                             <span class="s">&#39;or a callable object (e.g. a function).&#39;</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">&quot;&quot;&quot; Returns the default URL for Horizon&#39;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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&quot;&quot;&quot; Constructs the URLconf for Horizon from registered Dashboards. &quot;&quot;&quot;</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&#39;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">&quot;HORIZON_CONFIG&quot;</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">&quot;customization_module&quot;</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">&quot;customization_module&quot;</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">&#39;.&#39;</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">&#39;.&#39;</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">&#39;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&#39;</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">&#39;&#39;</span><span class="p">,</span>
                    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^</span><span class="si">%s</span><span class="s">/&#39;</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">&quot;&quot;&quot; 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">        &quot;&quot;&quot;</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">&#39;_registerable_class&#39;</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">&#39;You must set a &#39;</span>
                                       <span class="s">&#39;&quot;_registerable_class&quot; property &#39;</span>
                                       <span class="s">&#39;in order to use autodiscovery.&#39;</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">&#39;dashboard&#39;</span><span class="p">,</span> <span class="s">&#39;panel&#39;</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">&#39;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">&#39;</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">&quot;&quot;&quot;</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">    &quot;&quot;&quot;</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> &raquo;</li>
          <li><a href="../index.html" >Module code</a> &raquo;</li>
          <li><a href="../horizon.html" accesskey="U">horizon</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; 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>