This commit is contained in:
PetrDlouhy 2024-05-22 09:20:42 +00:00
commit c3b07a4851
261 changed files with 92045 additions and 0 deletions

4
.buildinfo Normal file
View file

@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: f1e97c9a958e74d2c3610edf3ceaa470
tags: 645f666f9bcd5a90fca523b33c5a78b7

0
.nojekyll Normal file
View file

View file

@ -0,0 +1,578 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.admin &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/admin';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.admin</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.admin</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Admin interface classes.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">.base</span> <span class="kn">import</span> <span class="n">CategoryBaseAdmin</span><span class="p">,</span> <span class="n">CategoryBaseAdminForm</span>
<span class="kn">from</span> <span class="nn">.genericcollection</span> <span class="kn">import</span> <span class="n">GenericCollectionTabularInline</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Category</span>
<span class="kn">from</span> <span class="nn">.settings</span> <span class="kn">import</span> <span class="n">JAVASCRIPT_URL</span><span class="p">,</span> <span class="n">MODEL_REGISTRY</span><span class="p">,</span> <span class="n">REGISTER_ADMIN</span><span class="p">,</span> <span class="n">RELATION_MODELS</span>
<div class="viewcode-block" id="NullTreeNodeChoiceField">
<a class="viewcode-back" href="../../api/categories.admin.NullTreeNodeChoiceField.html#categories.admin.NullTreeNodeChoiceField">[docs]</a>
<span class="k">class</span> <span class="nc">NullTreeNodeChoiceField</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelChoiceField</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A ModelChoiceField for tree nodes.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level_indicator</span><span class="o">=</span><span class="s2">&quot;---&quot;</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">level_indicator</span> <span class="o">=</span> <span class="n">level_indicator</span>
<span class="nb">super</span><span class="p">(</span><span class="n">NullTreeNodeChoiceField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__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">def</span> <span class="nf">label_from_instance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates labels which represent the tree level of each node when generating option labels.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">level_indicator</span> <span class="o">*</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">_mptt_meta</span><span class="o">.</span><span class="n">level_attr</span><span class="p">),</span> <span class="n">obj</span><span class="p">)</span></div>
<span class="k">if</span> <span class="n">RELATION_MODELS</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">CategoryRelation</span>
<div class="viewcode-block" id="InlineCategoryRelation">
<a class="viewcode-back" href="../../api/categories.admin.InlineCategoryRelation.html#categories.admin.InlineCategoryRelation">[docs]</a>
<span class="k">class</span> <span class="nc">InlineCategoryRelation</span><span class="p">(</span><span class="n">GenericCollectionTabularInline</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The inline admin panel for category relations.&quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">CategoryRelation</span></div>
<div class="viewcode-block" id="CategoryAdminForm">
<a class="viewcode-back" href="../../api/categories.admin.CategoryAdminForm.html#categories.admin.CategoryAdminForm">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryAdminForm</span><span class="p">(</span><span class="n">CategoryBaseAdminForm</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The form for a category in the admin.&quot;&quot;&quot;</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Category</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span>
<span class="k">def</span> <span class="nf">clean_alternate_title</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return either the name or alternate title for the category.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;alternate_title&quot;</span><span class="p">]:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;name&quot;</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">cleaned_data</span><span class="p">[</span><span class="s2">&quot;alternate_title&quot;</span><span class="p">]</span></div>
<div class="viewcode-block" id="CategoryAdmin">
<a class="viewcode-back" href="../../api/categories.admin.CategoryAdmin.html#categories.admin.CategoryAdmin">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryAdmin</span><span class="p">(</span><span class="n">CategoryBaseAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Admin for categories.&quot;&quot;&quot;</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">CategoryAdminForm</span>
<span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="s2">&quot;alternate_title&quot;</span><span class="p">,</span> <span class="s2">&quot;active&quot;</span><span class="p">)</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="s2">&quot;thumbnail&quot;</span><span class="p">,</span> <span class="s2">&quot;active&quot;</span><span class="p">)}),</span>
<span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Meta Data&quot;</span><span class="p">),</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;alternate_title&quot;</span><span class="p">,</span> <span class="s2">&quot;alternate_url&quot;</span><span class="p">,</span> <span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;meta_keywords&quot;</span><span class="p">,</span> <span class="s2">&quot;meta_extra&quot;</span><span class="p">),</span>
<span class="s2">&quot;classes&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;collapse&quot;</span><span class="p">,),</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Advanced&quot;</span><span class="p">),</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;slug&quot;</span><span class="p">),</span>
<span class="s2">&quot;classes&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;collapse&quot;</span><span class="p">,),</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">autocomplete_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">,)</span>
<span class="k">if</span> <span class="n">RELATION_MODELS</span><span class="p">:</span>
<span class="n">inlines</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">InlineCategoryRelation</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">class</span> <span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">(</span><span class="n">JAVASCRIPT_URL</span> <span class="o">+</span> <span class="s2">&quot;genericcollections.js&quot;</span><span class="p">,)</span></div>
<span class="k">if</span> <span class="n">REGISTER_ADMIN</span><span class="p">:</span>
<span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">Category</span><span class="p">,</span> <span class="n">CategoryAdmin</span><span class="p">)</span>
<span class="k">for</span> <span class="n">model</span><span class="p">,</span> <span class="n">modeladmin</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">_registry</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="k">if</span> <span class="n">model</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">MODEL_REGISTRY</span><span class="o">.</span><span class="n">values</span><span class="p">())</span> <span class="ow">and</span> <span class="n">modeladmin</span><span class="o">.</span><span class="n">fieldsets</span><span class="p">:</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">modeladmin</span><span class="p">,</span> <span class="s2">&quot;fieldsets&quot;</span><span class="p">,</span> <span class="p">())</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="n">cat</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">cat</span> <span class="ow">in</span> <span class="n">MODEL_REGISTRY</span> <span class="k">if</span> <span class="n">MODEL_REGISTRY</span><span class="p">[</span><span class="n">cat</span><span class="p">]</span> <span class="o">==</span> <span class="n">model</span><span class="p">]</span>
<span class="c1"># check each field to see if already defined</span>
<span class="k">for</span> <span class="n">cat</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">fieldsets</span><span class="p">:</span>
<span class="k">if</span> <span class="n">cat</span> <span class="ow">in</span> <span class="n">v</span><span class="p">[</span><span class="s2">&quot;fields&quot;</span><span class="p">]:</span>
<span class="n">fields</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">cat</span><span class="p">)</span>
<span class="c1"># if there are any fields left, add them under the categories fieldset</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">register</span><span class="p">(</span>
<span class="n">model</span><span class="p">,</span>
<span class="nb">type</span><span class="p">(</span>
<span class="s2">&quot;newadmin&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="n">modeladmin</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,),</span>
<span class="p">{</span><span class="s2">&quot;fieldsets&quot;</span><span class="p">:</span> <span class="n">fieldsets</span> <span class="o">+</span> <span class="p">((</span><span class="s2">&quot;Categories&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="n">fields</span><span class="p">}),)},</span>
<span class="p">),</span>
<span class="p">)</span>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,511 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.apps &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/apps';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.apps</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.apps</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Django application setup.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.apps</span> <span class="kn">import</span> <span class="n">AppConfig</span>
<div class="viewcode-block" id="CategoriesConfig">
<a class="viewcode-back" href="../../api/categories.apps.CategoriesConfig.html#categories.apps.CategoriesConfig">[docs]</a>
<span class="k">class</span> <span class="nc">CategoriesConfig</span><span class="p">(</span><span class="n">AppConfig</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Application configuration for categories.&quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;categories&quot;</span>
<span class="n">verbose_name</span> <span class="o">=</span> <span class="s2">&quot;Categories&quot;</span>
<span class="k">def</span> <span class="fm">__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">CategoriesConfig</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__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="kn">from</span> <span class="nn">django.db.models.signals</span> <span class="kn">import</span> <span class="n">class_prepared</span>
<span class="n">class_prepared</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">handle_class_prepared</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">ready</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Migrate the app after it is ready.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.db.models.signals</span> <span class="kn">import</span> <span class="n">post_migrate</span>
<span class="kn">from</span> <span class="nn">.migration</span> <span class="kn">import</span> <span class="n">migrate_app</span>
<span class="n">post_migrate</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">migrate_app</span><span class="p">)</span></div>
<div class="viewcode-block" id="handle_class_prepared">
<a class="viewcode-back" href="../../api/categories.apps.handle_class_prepared.html#categories.apps.handle_class_prepared">[docs]</a>
<span class="k">def</span> <span class="nf">handle_class_prepared</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> See if this class needs registering of fields.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">.registration</span> <span class="kn">import</span> <span class="n">registry</span>
<span class="kn">from</span> <span class="nn">.settings</span> <span class="kn">import</span> <span class="n">FK_REGISTRY</span><span class="p">,</span> <span class="n">M2M_REGISTRY</span>
<span class="n">sender_app</span> <span class="o">=</span> <span class="n">sender</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span>
<span class="n">sender_name</span> <span class="o">=</span> <span class="n">sender</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">FK_REGISTRY</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">app_name</span> <span class="o">==</span> <span class="n">sender_app</span> <span class="ow">and</span> <span class="n">sender_name</span> <span class="o">==</span> <span class="n">model_name</span><span class="p">:</span>
<span class="n">registry</span><span class="o">.</span><span class="n">register_model</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="s2">&quot;ForeignKey&quot;</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">M2M_REGISTRY</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">app_name</span> <span class="o">==</span> <span class="n">sender_app</span> <span class="ow">and</span> <span class="n">sender_name</span> <span class="o">==</span> <span class="n">model_name</span><span class="p">:</span>
<span class="n">registry</span><span class="o">.</span><span class="n">register_model</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="s2">&quot;ManyToManyField&quot;</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,658 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.base &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/base';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.base</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.base</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This is the base class on which to build a hierarchical category-like model.</span>
<span class="sd">It provides customizable metadata and its own name space.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">force_str</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">mptt.fields</span> <span class="kn">import</span> <span class="n">TreeForeignKey</span>
<span class="kn">from</span> <span class="nn">mptt.managers</span> <span class="kn">import</span> <span class="n">TreeManager</span>
<span class="kn">from</span> <span class="nn">mptt.models</span> <span class="kn">import</span> <span class="n">MPTTModel</span>
<span class="kn">from</span> <span class="nn">.editor.tree_editor</span> <span class="kn">import</span> <span class="n">TreeEditor</span>
<span class="kn">from</span> <span class="nn">.settings</span> <span class="kn">import</span> <span class="n">ALLOW_SLUG_CHANGE</span><span class="p">,</span> <span class="n">SLUG_TRANSLITERATOR</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">slugify</span>
<div class="viewcode-block" id="CategoryManager">
<a class="viewcode-back" href="../../api/categories.base.CategoryManager.html#categories.base.CategoryManager">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryManager</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Manager</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A manager that adds an &quot;active()&quot; method for all active categories.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">active</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Only categories that are active.</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_queryset</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">active</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="CategoryBase">
<a class="viewcode-back" href="../../api/categories.base.CategoryBase.html#categories.base.CategoryBase">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryBase</span><span class="p">(</span><span class="n">MPTTModel</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This base model includes the absolute bare-bones fields and methods.</span>
<span class="sd"> One could simply subclass this model, do nothing else, and it should work.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">TreeForeignKey</span><span class="p">(</span>
<span class="s2">&quot;self&quot;</span><span class="p">,</span>
<span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">,</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">related_name</span><span class="o">=</span><span class="s2">&quot;children&quot;</span><span class="p">,</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">))</span>
<span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;slug&quot;</span><span class="p">),</span> <span class="n">unique</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">active</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;active&quot;</span><span class="p">))</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">CategoryManager</span><span class="p">()</span>
<span class="n">tree</span> <span class="o">=</span> <span class="n">TreeManager</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">save</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Save the category.</span>
<span class="sd"> While you can activate an item without activating its descendants,</span>
<span class="sd"> It doesn&#39;t make sense that you can deactivate an item and have its</span>
<span class="sd"> decendants remain active.</span>
<span class="sd"> Args:</span>
<span class="sd"> args: generic args</span>
<span class="sd"> kwargs: generic keyword arguments</span>
<span class="sd"> &quot;&quot;&quot;</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="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="o">=</span> <span class="n">slugify</span><span class="p">(</span><span class="n">SLUG_TRANSLITERATOR</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))[:</span><span class="mi">50</span><span class="p">]</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CategoryBase</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">save</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="bp">self</span><span class="o">.</span><span class="n">active</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">get_descendants</span><span class="p">():</span>
<span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">active</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">active</span><span class="p">:</span>
<span class="n">item</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">active</span>
<span class="n">item</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">ancestors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ancestors</span><span class="p">()</span>
<span class="k">return</span> <span class="s2">&quot; &gt; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="p">[</span><span class="n">force_str</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ancestors</span><span class="p">]</span>
<span class="o">+</span> <span class="p">[</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">unique_together</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span>
<span class="n">ordering</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;tree_id&quot;</span><span class="p">,</span> <span class="s2">&quot;lft&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">MPTTMeta</span><span class="p">:</span>
<span class="n">order_insertion_by</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></div>
<div class="viewcode-block" id="CategoryBaseAdminForm">
<a class="viewcode-back" href="../../api/categories.base.CategoryBaseAdminForm.html#categories.base.CategoryBaseAdminForm">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryBaseAdminForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base admin form for categories.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">clean_slug</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Prune and transliterate the slug.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;slug&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">ALLOW_SLUG_CHANGE</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;slug&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">slugify</span><span class="p">(</span><span class="n">SLUG_TRANSLITERATOR</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;slug&quot;</span><span class="p">][:</span><span class="mi">50</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Clean the data passed from the admin interface.&quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CategoryBaseAdminForm</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">clean</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">is_valid</span><span class="p">():</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span>
<span class="c1"># Validate slug is valid in that level</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;parent__isnull&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;parent__pk&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="n">this_level_slugs</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">c</span><span class="p">[</span><span class="s2">&quot;slug&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">values</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="s2">&quot;slug&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">c</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">id</span>
<span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;slug&quot;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">this_level_slugs</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;The slug must be unique among &quot;</span> <span class="s2">&quot;the items at its level.&quot;</span><span class="p">))</span>
<span class="c1"># Validate Category Parent</span>
<span class="c1"># Make sure the category doesn&#39;t set itself or any of its children as</span>
<span class="c1"># its parent.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">id</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">:</span>
<span class="n">decendant_ids</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">get_descendants</span><span class="p">()</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">decendant_ids</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">id</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You can&#39;t set the parent of the &quot;</span> <span class="s2">&quot;item to itself.&quot;</span><span class="p">))</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">id</span> <span class="ow">in</span> <span class="n">decendant_ids</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You can&#39;t set the parent of the &quot;</span> <span class="s2">&quot;item to a descendant.&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span></div>
<div class="viewcode-block" id="CategoryBaseAdmin">
<a class="viewcode-back" href="../../api/categories.base.CategoryBaseAdmin.html#categories.base.CategoryBaseAdmin">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryBaseAdmin</span><span class="p">(</span><span class="n">TreeEditor</span><span class="p">,</span> <span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base admin class for categories.&quot;&quot;&quot;</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">CategoryBaseAdminForm</span>
<span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="s2">&quot;active&quot;</span><span class="p">)</span>
<span class="n">search_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,)</span>
<span class="n">prepopulated_fields</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;slug&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,)}</span>
<span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;activate&quot;</span><span class="p">,</span> <span class="s2">&quot;deactivate&quot;</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">get_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get available actions for the admin interface.&quot;&quot;&quot;</span>
<span class="n">actions</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">CategoryBaseAdmin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_actions</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;delete_selected&quot;</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="k">del</span> <span class="n">actions</span><span class="p">[</span><span class="s2">&quot;delete_selected&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">actions</span>
<span class="k">def</span> <span class="nf">deactivate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">queryset</span><span class="p">):</span> <span class="c1"># NOQA: queryset is not used.</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set active to False for selected items.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">selected_cats</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="s2">&quot;_selected_action&quot;</span><span class="p">)])</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">selected_cats</span><span class="p">:</span>
<span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">active</span><span class="p">:</span>
<span class="n">item</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">item</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">item</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">active</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">deactivate</span><span class="o">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Deactivate selected categories and their children&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">activate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">queryset</span><span class="p">):</span> <span class="c1"># NOQA: queryset is not used.</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set active to True for selected items.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">selected_cats</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="s2">&quot;_selected_action&quot;</span><span class="p">)])</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">selected_cats</span><span class="p">:</span>
<span class="n">item</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">item</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">item</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">active</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">activate</span><span class="o">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Activate selected categories and their children&quot;</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,633 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.editor.templatetags.admin_tree_list_tags &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/editor/templatetags/admin_tree_list_tags';</script>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.e...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.editor.templatetags.admin_tree_list_tags</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Template tags used to render the tree editor.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.templatetags.admin_list</span> <span class="kn">import</span> <span class="n">_boolean_icon</span><span class="p">,</span> <span class="n">result_headers</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.utils</span> <span class="kn">import</span> <span class="n">lookup_field</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ObjectDoesNotExist</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.template</span> <span class="kn">import</span> <span class="n">Library</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">force_str</span><span class="p">,</span> <span class="n">smart_str</span>
<span class="kn">from</span> <span class="nn">django.utils.html</span> <span class="kn">import</span> <span class="n">conditional_escape</span><span class="p">,</span> <span class="n">escape</span><span class="p">,</span> <span class="n">escapejs</span><span class="p">,</span> <span class="n">format_html</span>
<span class="kn">from</span> <span class="nn">django.utils.safestring</span> <span class="kn">import</span> <span class="n">mark_safe</span>
<span class="kn">from</span> <span class="nn">categories.editor</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">categories.editor.utils</span> <span class="kn">import</span> <span class="n">display_for_field</span>
<span class="n">register</span> <span class="o">=</span> <span class="n">Library</span><span class="p">()</span>
<span class="n">TREE_LIST_RESULTS_TEMPLATE</span> <span class="o">=</span> <span class="s2">&quot;admin/editor/tree_list_results.html&quot;</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">IS_GRAPPELLI_INSTALLED</span><span class="p">:</span>
<span class="n">TREE_LIST_RESULTS_TEMPLATE</span> <span class="o">=</span> <span class="s2">&quot;admin/editor/grappelli_tree_list_results.html&quot;</span>
<div class="viewcode-block" id="get_empty_value_display">
<a class="viewcode-back" href="../../../../api/categories.editor.templatetags.admin_tree_list_tags.get_empty_value_display.html#categories.editor.templatetags.admin_tree_list_tags.get_empty_value_display">[docs]</a>
<span class="k">def</span> <span class="nf">get_empty_value_display</span><span class="p">(</span><span class="n">cl</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the value to display when empty.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">cl</span><span class="o">.</span><span class="n">model_admin</span><span class="p">,</span> <span class="s2">&quot;get_empty_value_display&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">cl</span><span class="o">.</span><span class="n">model_admin</span><span class="o">.</span><span class="n">get_empty_value_display</span><span class="p">()</span>
<span class="c1"># Django &lt; 1.9</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.views.main</span> <span class="kn">import</span> <span class="n">EMPTY_CHANGELIST_VALUE</span>
<span class="k">return</span> <span class="n">EMPTY_CHANGELIST_VALUE</span></div>
<div class="viewcode-block" id="items_for_tree_result">
<a class="viewcode-back" href="../../../../api/categories.editor.templatetags.admin_tree_list_tags.items_for_tree_result.html#categories.editor.templatetags.admin_tree_list_tags.items_for_tree_result">[docs]</a>
<span class="k">def</span> <span class="nf">items_for_tree_result</span><span class="p">(</span><span class="n">cl</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generates the actual list of data.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">first</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">pk</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">lookup_opts</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span>
<span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">cl</span><span class="o">.</span><span class="n">list_display</span><span class="p">:</span>
<span class="n">row_class</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">f</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">lookup_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">cl</span><span class="o">.</span><span class="n">model_admin</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="n">ObjectDoesNotExist</span><span class="p">):</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">get_empty_value_display</span><span class="p">(</span><span class="n">cl</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">allow_tags</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="s2">&quot;allow_tags&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">boolean</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="s2">&quot;boolean&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">boolean</span><span class="p">:</span>
<span class="n">allow_tags</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">_boolean_icon</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">smart_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="c1"># Strip HTML tags in the resulting text, except if the</span>
<span class="c1"># function has an &quot;allow_tags&quot; attribute set to True.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">allow_tags</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">escape</span><span class="p">(</span><span class="n">result_repr</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">result_repr</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">get_empty_value_display</span><span class="p">(</span><span class="n">cl</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s2">&quot;rel&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">ManyToOneRel</span><span class="p">):</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">escape</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">display_for_field</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">DateField</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">TimeField</span><span class="p">):</span>
<span class="n">row_class</span> <span class="o">=</span> <span class="s1">&#39; class=&quot;nowrap&quot;&#39;</span>
<span class="k">if</span> <span class="n">force_str</span><span class="p">(</span><span class="n">result_repr</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">mark_safe</span><span class="p">(</span><span class="s2">&quot;&amp;nbsp;&quot;</span><span class="p">)</span>
<span class="c1"># If list_display_links not defined, add the link tag to the first field</span>
<span class="k">if</span> <span class="p">(</span><span class="n">first</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">cl</span><span class="o">.</span><span class="n">list_display_links</span><span class="p">)</span> <span class="ow">or</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">cl</span><span class="o">.</span><span class="n">list_display_links</span><span class="p">:</span>
<span class="n">table_tag</span> <span class="o">=</span> <span class="p">{</span><span class="kc">True</span><span class="p">:</span> <span class="s2">&quot;th&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span> <span class="s2">&quot;td&quot;</span><span class="p">}[</span><span class="n">first</span><span class="p">]</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">url_for_result</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="c1"># Convert the pk to something that can be used in Javascript.</span>
<span class="c1"># Problem cases are long ints (23L) and non-ASCII strings.</span>
<span class="k">if</span> <span class="n">cl</span><span class="o">.</span><span class="n">to_field</span><span class="p">:</span>
<span class="n">attr</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">cl</span><span class="o">.</span><span class="n">to_field</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">attr</span> <span class="o">=</span> <span class="n">pk</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">serializable_value</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="n">result_id</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">force_str</span><span class="p">(</span><span class="n">value</span><span class="p">))[</span><span class="mi">1</span><span class="p">:]</span>
<span class="n">first</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">result_id</span> <span class="o">=</span> <span class="n">escapejs</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">mark_safe</span><span class="p">(</span>
<span class="n">format_html</span><span class="p">(</span>
<span class="n">smart_str</span><span class="p">(</span><span class="s1">&#39;&lt;</span><span class="si">{}{}</span><span class="s1">&gt;&lt;a href=&quot;</span><span class="si">{}</span><span class="s1">&quot;</span><span class="si">{}</span><span class="s1">&gt;</span><span class="si">{}</span><span class="s1">&lt;/a&gt;&lt;/</span><span class="si">{}</span><span class="s1">&gt;&#39;</span><span class="p">),</span>
<span class="n">table_tag</span><span class="p">,</span>
<span class="n">row_class</span><span class="p">,</span>
<span class="n">url</span><span class="p">,</span>
<span class="p">(</span>
<span class="n">format_html</span><span class="p">(</span>
<span class="s1">&#39; onclick=&quot;opener.dismissRelatedLookupPopup(window, &#39;</span> <span class="s1">&#39;&amp;#39;</span><span class="si">{}</span><span class="s1">&amp;#39;); return false;&quot;&#39;</span><span class="p">,</span>
<span class="n">result_id</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">cl</span><span class="o">.</span><span class="n">is_popup</span>
<span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="p">),</span>
<span class="n">result_repr</span><span class="p">,</span>
<span class="n">table_tag</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># By default the fields come from ModelAdmin.list_editable, but if we pull</span>
<span class="c1"># the fields out of the form instead of list_editable custom admins</span>
<span class="c1"># can provide fields on a per request basis</span>
<span class="k">if</span> <span class="n">form</span> <span class="ow">and</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">form</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="n">bf</span> <span class="o">=</span> <span class="n">form</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">force_str</span><span class="p">(</span><span class="n">bf</span><span class="o">.</span><span class="n">errors</span><span class="p">)</span> <span class="o">+</span> <span class="n">force_str</span><span class="p">(</span><span class="n">bf</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result_repr</span> <span class="o">=</span> <span class="n">conditional_escape</span><span class="p">(</span><span class="n">result_repr</span><span class="p">)</span>
<span class="k">yield</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">smart_str</span><span class="p">(</span><span class="s2">&quot;&lt;td</span><span class="si">%s</span><span class="s2">&gt;</span><span class="si">%s</span><span class="s2">&lt;/td&gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">row_class</span><span class="p">,</span> <span class="n">result_repr</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">form</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">form</span><span class="p">[</span><span class="n">cl</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">smart_str</span><span class="p">(</span><span class="s2">&quot;&lt;td&gt;</span><span class="si">%s</span><span class="s2">&lt;/td&gt;&quot;</span> <span class="o">%</span> <span class="n">force_str</span><span class="p">(</span><span class="n">form</span><span class="p">[</span><span class="n">cl</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">name</span><span class="p">])))</span></div>
<div class="viewcode-block" id="TreeList">
<a class="viewcode-back" href="../../../../api/categories.editor.templatetags.admin_tree_list_tags.TreeList.html#categories.editor.templatetags.admin_tree_list_tags.TreeList">[docs]</a>
<span class="k">class</span> <span class="nc">TreeList</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A list subclass for tree result.&quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="tree_results">
<a class="viewcode-back" href="../../../../api/categories.editor.templatetags.admin_tree_list_tags.tree_results.html#categories.editor.templatetags.admin_tree_list_tags.tree_results">[docs]</a>
<span class="k">def</span> <span class="nf">tree_results</span><span class="p">(</span><span class="n">cl</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates a list of results for the tree.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">cl</span><span class="o">.</span><span class="n">formset</span><span class="p">:</span>
<span class="k">for</span> <span class="n">res</span><span class="p">,</span> <span class="n">form</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">cl</span><span class="o">.</span><span class="n">result_list</span><span class="p">,</span> <span class="n">cl</span><span class="o">.</span><span class="n">formset</span><span class="o">.</span><span class="n">forms</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">TreeList</span><span class="p">(</span><span class="n">items_for_tree_result</span><span class="p">(</span><span class="n">cl</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="n">form</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s2">&quot;pk&quot;</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">pk</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">pk</span>
<span class="k">if</span> <span class="n">res</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">parent_pk</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">pk</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">res</span><span class="o">.</span><span class="n">parent_pk</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">yield</span> <span class="n">result</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">res</span> <span class="ow">in</span> <span class="n">cl</span><span class="o">.</span><span class="n">result_list</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">TreeList</span><span class="p">(</span><span class="n">items_for_tree_result</span><span class="p">(</span><span class="n">cl</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s2">&quot;pk&quot;</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">pk</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">pk</span>
<span class="k">if</span> <span class="n">res</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">parent_pk</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">pk</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">res</span><span class="o">.</span><span class="n">parent_pk</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">yield</span> <span class="n">result</span></div>
<div class="viewcode-block" id="result_tree_list">
<a class="viewcode-back" href="../../../../api/categories.editor.templatetags.admin_tree_list_tags.result_tree_list.html#categories.editor.templatetags.admin_tree_list_tags.result_tree_list">[docs]</a>
<span class="k">def</span> <span class="nf">result_tree_list</span><span class="p">(</span><span class="n">cl</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Displays the headers and data list together.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;cl&quot;</span><span class="p">:</span> <span class="n">cl</span><span class="p">,</span> <span class="s2">&quot;result_headers&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">result_headers</span><span class="p">(</span><span class="n">cl</span><span class="p">)),</span> <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">tree_results</span><span class="p">(</span><span class="n">cl</span><span class="p">))}</span>
<span class="k">return</span> <span class="n">result</span></div>
<span class="n">result_tree_list</span> <span class="o">=</span> <span class="n">register</span><span class="o">.</span><span class="n">inclusion_tag</span><span class="p">(</span><span class="n">TREE_LIST_RESULTS_TEMPLATE</span><span class="p">)(</span><span class="n">result_tree_list</span><span class="p">)</span>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,791 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.editor.tree_editor &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/editor/tree_editor';</script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.e...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.editor.tree_editor</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Classes for representing tree structures in Django&#39;s admin.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span>
<span class="kn">import</span> <span class="nn">django</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.options</span> <span class="kn">import</span> <span class="n">IncorrectLookupParameters</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.views.main</span> <span class="kn">import</span> <span class="n">ChangeList</span>
<span class="kn">from</span> <span class="nn">django.db.models.query</span> <span class="kn">import</span> <span class="n">QuerySet</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">render</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">settings</span>
<div class="viewcode-block" id="TreeEditorQuerySet">
<a class="viewcode-back" href="../../../api/categories.editor.tree_editor.TreeEditorQuerySet.html#categories.editor.tree_editor.TreeEditorQuerySet">[docs]</a>
<span class="k">class</span> <span class="nc">TreeEditorQuerySet</span><span class="p">(</span><span class="n">QuerySet</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A special query set used only in the TreeEditor ChangeList page.</span>
<span class="sd"> The only difference to a regular QuerySet is that it will enforce:</span>
<span class="sd"> (a) The result is ordered in correct tree order so that</span>
<span class="sd"> the TreeAdmin works all right.</span>
<span class="sd"> (b) It ensures that all ancestors of selected items are included</span>
<span class="sd"> in the result set, so the resulting tree display actually</span>
<span class="sd"> makes sense.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">iterator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Iterates through the items in thee query set.&quot;&quot;&quot;</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span>
<span class="c1"># Reaching into the bowels of query sets to find out whether the qs is</span>
<span class="c1"># actually filtered and we need to do the INCLUDE_ANCESTORS dance at all.</span>
<span class="c1"># INCLUDE_ANCESTORS is quite expensive, so don&#39;t do it if not needed.</span>
<span class="n">is_filtered</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">qs</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">where</span><span class="o">.</span><span class="n">children</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_filtered</span><span class="p">:</span>
<span class="n">include_pages</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1"># Order by &#39;rght&#39; will return the tree deepest nodes first;</span>
<span class="c1"># this cuts down the number of queries considerably since all ancestors</span>
<span class="c1"># will already be in include_pages when they are checked, thus not</span>
<span class="c1"># trigger additional queries.</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">(</span><span class="n">TreeEditorQuerySet</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;rght&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">iterator</span><span class="p">():</span>
<span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">parent_id</span> <span class="ow">and</span> <span class="n">p</span><span class="o">.</span><span class="n">parent_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">include_pages</span> <span class="ow">and</span> <span class="n">p</span><span class="o">.</span><span class="n">id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">include_pages</span><span class="p">:</span>
<span class="n">ancestor_id_list</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">get_ancestors</span><span class="p">()</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">include_pages</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">ancestor_id_list</span><span class="p">)</span>
<span class="k">if</span> <span class="n">include_pages</span><span class="p">:</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">qs</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">id__in</span><span class="o">=</span><span class="n">include_pages</span><span class="p">)</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">distinct</span><span class="p">()</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">(</span><span class="n">TreeEditorQuerySet</span><span class="p">,</span> <span class="n">qs</span><span class="p">)</span><span class="o">.</span><span class="n">iterator</span><span class="p">():</span>
<span class="k">yield</span> <span class="n">obj</span>
<span class="c1"># Although slicing isn&#39;t nice in a tree, it is used in the deletion action</span>
<span class="c1"># in the admin changelist. This causes github issue #25</span>
<span class="c1"># def __getitem__(self, index):</span>
<span class="c1"># return self # Don&#39;t even try to slice</span>
<span class="k">def</span> <span class="nf">get</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="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Quick and dirty hack to fix change_view and delete_view.</span>
<span class="sd"> They use ``self.queryset(request).get(...)`` to get the object they should work</span>
<span class="sd"> with. Our modifications to the queryset when ``INCLUDE_ANCESTORS`` is enabled make ``get()``</span>
<span class="sd"> fail often with a ``MultipleObjectsReturned`` exception.</span>
<span class="sd"> Args:</span>
<span class="sd"> args: generic arguments</span>
<span class="sd"> kwargs: generic keyword arguments</span>
<span class="sd"> Returns:</span>
<span class="sd"> The object they should work with.</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">model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">get</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>
<div class="viewcode-block" id="TreeChangeList">
<a class="viewcode-back" href="../../../api/categories.editor.tree_editor.TreeChangeList.html#categories.editor.tree_editor.TreeChangeList">[docs]</a>
<span class="k">class</span> <span class="nc">TreeChangeList</span><span class="p">(</span><span class="n">ChangeList</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A change list for a tree.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_get_default_ordering</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">get_ordering</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return ordering information for the change list.</span>
<span class="sd"> Always returns empty/default ordering.</span>
<span class="sd"> Args:</span>
<span class="sd"> request: The incoming request.</span>
<span class="sd"> queryset: The current queryset</span>
<span class="sd"> Returns:</span>
<span class="sd"> Either a tuple of empty strings or an empty list.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">get_queryset</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="w"> </span><span class="sd">&quot;&quot;&quot;Return a queryset.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">TreeChangeList</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</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="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;tree_id&quot;</span><span class="p">,</span> <span class="s2">&quot;lft&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="TreeEditor">
<a class="viewcode-back" href="../../../api/categories.editor.tree_editor.TreeEditor.html#categories.editor.tree_editor.TreeEditor">[docs]</a>
<span class="k">class</span> <span class="nc">TreeEditor</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A tree editor view for Django&#39;s admin.&quot;&quot;&quot;</span>
<span class="n">list_per_page</span> <span class="o">=</span> <span class="mi">999999999</span> <span class="c1"># We can&#39;t have pagination</span>
<span class="n">list_max_show_all</span> <span class="o">=</span> <span class="mi">200</span> <span class="c1"># new in django 1.4</span>
<span class="k">class</span> <span class="nc">Media</span><span class="p">:</span>
<span class="n">css</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;all&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">MEDIA_PATH</span> <span class="o">+</span> <span class="s2">&quot;jquery.treeTable.css&quot;</span><span class="p">,)}</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">js</span><span class="o">.</span><span class="n">extend</span><span class="p">((</span><span class="n">settings</span><span class="o">.</span><span class="n">MEDIA_PATH</span> <span class="o">+</span> <span class="s2">&quot;jquery.treeTable.js&quot;</span><span class="p">,))</span>
<span class="k">def</span> <span class="fm">__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">TreeEditor</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__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">list_display</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">list_display</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;action_checkbox&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_display</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_display</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;action_checkbox&quot;</span><span class="p">)</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">grappelli_prefix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">IS_GRAPPELLI_INSTALLED</span><span class="p">:</span>
<span class="n">grappelli_prefix</span> <span class="o">=</span> <span class="s2">&quot;grappelli_&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">change_list_template</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;admin/</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">/editor/</span><span class="si">%s</span><span class="s2">tree_editor.html&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">grappelli_prefix</span><span class="p">),</span>
<span class="s2">&quot;admin/</span><span class="si">%s</span><span class="s2">/editor/</span><span class="si">%s</span><span class="s2">tree_editor.html&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">grappelli_prefix</span><span class="p">),</span>
<span class="s2">&quot;admin/editor/</span><span class="si">%s</span><span class="s2">tree_editor.html&quot;</span> <span class="o">%</span> <span class="n">grappelli_prefix</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">def</span> <span class="nf">get_changelist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the ChangeList class for use on the changelist page.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">TreeChangeList</span>
<span class="k">def</span> <span class="nf">old_changelist_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">extra_context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The &#39;change list&#39; admin view for this model.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.views.main</span> <span class="kn">import</span> <span class="n">ERROR_FLAG</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">PermissionDenied</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">force_str</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">ngettext</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">app_label</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_change_permission</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">PermissionDenied</span>
<span class="c1"># Check actions to see if any are available on this changelist</span>
<span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_actions</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="c1"># Remove action checkboxes if there aren&#39;t any actions available.</span>
<span class="n">list_display</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">list_display</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">actions</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">list_display</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">&quot;action_checkbox&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">django</span><span class="o">.</span><span class="n">VERSION</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span>
<span class="n">list_display</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_display_links</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_filter</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">date_hierarchy</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">search_fields</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_select_related</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_per_page</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_max_show_all</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_editable</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">sortable_by</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span>
<span class="n">list_display</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_display_links</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_filter</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">date_hierarchy</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">search_fields</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_select_related</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_per_page</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_max_show_all</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">list_editable</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">sortable_by</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">search_help_text</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">cl</span> <span class="o">=</span> <span class="n">TreeChangeList</span><span class="p">(</span><span class="o">*</span><span class="n">params</span><span class="p">)</span>
<span class="k">except</span> <span class="n">IncorrectLookupParameters</span><span class="p">:</span>
<span class="c1"># Wacky lookup parameters were given, so redirect to the main</span>
<span class="c1"># changelist page, without parameters, and pass an &#39;invalid=1&#39;</span>
<span class="c1"># parameter via the query string. If wacky parameters were given and</span>
<span class="c1"># the &#39;invalid=1&#39; parameter was already in the query string, something</span>
<span class="c1"># is screwed up with the database, so display an error page.</span>
<span class="k">if</span> <span class="n">ERROR_FLAG</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s2">&quot;admin/invalid_setup.html&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Database error&quot;</span><span class="p">)})</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">path</span> <span class="o">+</span> <span class="s2">&quot;?&quot;</span> <span class="o">+</span> <span class="n">ERROR_FLAG</span> <span class="o">+</span> <span class="s2">&quot;=1&quot;</span><span class="p">)</span>
<span class="c1"># If the request was POSTed, this might be a bulk action or a bulk edit.</span>
<span class="c1"># Try to look up an action first, but if this isn&#39;t an action the POST</span>
<span class="c1"># will fall through to the bulk edit check, below.</span>
<span class="k">if</span> <span class="n">actions</span> <span class="ow">and</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_action</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="n">cl</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">())</span>
<span class="k">if</span> <span class="n">response</span><span class="p">:</span>
<span class="k">return</span> <span class="n">response</span>
<span class="c1"># If we&#39;re allowing changelist editing, we need to construct a formset</span>
<span class="c1"># for the changelist given all the fields to be edited. Then we&#39;ll</span>
<span class="c1"># use the formset to validate/process POSTed data.</span>
<span class="n">formset</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">formset</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Handle POSTed bulk-edit data.</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_editable</span><span class="p">:</span>
<span class="n">FormSet</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_changelist_formset</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">formset</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">formset</span> <span class="o">=</span> <span class="n">FormSet</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="n">cl</span><span class="o">.</span><span class="n">result_list</span><span class="p">)</span>
<span class="k">if</span> <span class="n">formset</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">changecount</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">formset</span><span class="o">.</span><span class="n">forms</span><span class="p">:</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">has_changed</span><span class="p">():</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_form</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">save_model</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">form</span><span class="o">.</span><span class="n">save_m2m</span><span class="p">()</span>
<span class="n">change_msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">construct_change_message</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log_change</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">change_msg</span><span class="p">)</span>
<span class="n">changecount</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">changecount</span><span class="p">:</span>
<span class="k">if</span> <span class="n">changecount</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">force_str</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">force_str</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">ngettext</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(count)s</span><span class="s2"> </span><span class="si">%(name)s</span><span class="s2"> was changed successfully.&quot;</span><span class="p">,</span>
<span class="s2">&quot;</span><span class="si">%(count)s</span><span class="s2"> </span><span class="si">%(name)s</span><span class="s2"> were changed successfully.&quot;</span><span class="p">,</span>
<span class="n">changecount</span><span class="p">,</span>
<span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;count&quot;</span><span class="p">:</span> <span class="n">changecount</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;obj&quot;</span><span class="p">:</span> <span class="n">force_str</span><span class="p">(</span><span class="n">obj</span><span class="p">)}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">message_user</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">get_full_path</span><span class="p">())</span>
<span class="c1"># Handle GET -- construct a formset for display.</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">list_editable</span><span class="p">:</span>
<span class="n">FormSet</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_changelist_formset</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">formset</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">formset</span> <span class="o">=</span> <span class="n">FormSet</span><span class="p">(</span><span class="n">queryset</span><span class="o">=</span><span class="n">cl</span><span class="o">.</span><span class="n">result_list</span><span class="p">)</span>
<span class="c1"># Build the list of media to be used by the formset.</span>
<span class="k">if</span> <span class="n">formset</span><span class="p">:</span>
<span class="n">media</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">media</span> <span class="o">+</span> <span class="n">formset</span><span class="o">.</span><span class="n">media</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">media</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">media</span>
<span class="c1"># Build the action form and populate it with available actions.</span>
<span class="k">if</span> <span class="n">actions</span><span class="p">:</span>
<span class="n">action_form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">action_form</span><span class="p">(</span><span class="n">auto_id</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="n">action_form</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">&quot;action&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">choices</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_action_choices</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">action_form</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="n">cl</span><span class="o">.</span><span class="n">title</span><span class="p">,</span>
<span class="s2">&quot;is_popup&quot;</span><span class="p">:</span> <span class="n">cl</span><span class="o">.</span><span class="n">is_popup</span><span class="p">,</span>
<span class="s2">&quot;cl&quot;</span><span class="p">:</span> <span class="n">cl</span><span class="p">,</span>
<span class="s2">&quot;media&quot;</span><span class="p">:</span> <span class="n">media</span><span class="p">,</span>
<span class="s2">&quot;has_add_permission&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_add_permission</span><span class="p">(</span><span class="n">request</span><span class="p">),</span>
<span class="s2">&quot;app_label&quot;</span><span class="p">:</span> <span class="n">app_label</span><span class="p">,</span>
<span class="s2">&quot;action_form&quot;</span><span class="p">:</span> <span class="n">action_form</span><span class="p">,</span>
<span class="s2">&quot;actions_on_top&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">actions_on_top</span><span class="p">,</span>
<span class="s2">&quot;actions_on_bottom&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">actions_on_bottom</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;opts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra_context</span> <span class="ow">or</span> <span class="p">{})</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">change_list_template</span>
<span class="ow">or</span> <span class="p">[</span>
<span class="s2">&quot;admin/</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">/change_list.html&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()),</span>
<span class="s2">&quot;admin/</span><span class="si">%s</span><span class="s2">/change_list.html&quot;</span> <span class="o">%</span> <span class="n">app_label</span><span class="p">,</span>
<span class="s2">&quot;admin/change_list.html&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">changelist_view</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">extra_context</span><span class="o">=</span><span class="kc">None</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle the changelist view, the django view for the model instances change list/actions page.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">extra_context</span> <span class="o">=</span> <span class="n">extra_context</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">extra_context</span><span class="p">[</span><span class="s2">&quot;EDITOR_MEDIA_PATH&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">MEDIA_PATH</span>
<span class="n">extra_context</span><span class="p">[</span><span class="s2">&quot;EDITOR_TREE_INITIAL_STATE&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">TREE_INITIAL_STATE</span>
<span class="c1"># FIXME</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">old_changelist_view</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">extra_context</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">TreeEditorQuerySet</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a QuerySet of all model instances that can be edited by the admin site.</span>
<span class="sd"> This is used by changelist_view.</span>
<span class="sd"> Args:</span>
<span class="sd"> request: the incoming request.</span>
<span class="sd"> Returns:</span>
<span class="sd"> A QuerySet of editable model instances</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">qs</span><span class="o">.</span><span class="vm">__class__</span> <span class="o">=</span> <span class="n">TreeEditorQuerySet</span>
<span class="k">return</span> <span class="n">qs</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,476 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.editor.utils &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/editor/utils';</script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.e...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.editor.utils</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Provides compatibility with Django 1.8.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.utils</span> <span class="kn">import</span> <span class="n">display_for_field</span> <span class="k">as</span> <span class="n">_display_for_field</span>
<div class="viewcode-block" id="display_for_field">
<a class="viewcode-back" href="../../../api/categories.editor.utils.display_for_field.html#categories.editor.utils.display_for_field">[docs]</a>
<span class="k">def</span> <span class="nf">display_for_field</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">empty_value_display</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compatility for displaying a field in Django 1.8.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_display_for_field</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">empty_value_display</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_display_for_field</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,487 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.fields &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/fields';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.fields</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.fields</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Custom category fields for other models.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.db.models</span> <span class="kn">import</span> <span class="n">ForeignKey</span><span class="p">,</span> <span class="n">ManyToManyField</span>
<div class="viewcode-block" id="CategoryM2MField">
<a class="viewcode-back" href="../../api/categories.fields.CategoryM2MField.html#categories.fields.CategoryM2MField">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryM2MField</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A many to many field to a Category model.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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="s2">&quot;to&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;to&quot;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CategoryM2MField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">to</span><span class="o">=</span><span class="s2">&quot;categories.Category&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="CategoryFKField">
<a class="viewcode-back" href="../../api/categories.fields.CategoryFKField.html#categories.fields.CategoryFKField">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryFKField</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A foreign key to the Category model.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</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="s2">&quot;to&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;to&quot;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CategoryFKField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">to</span><span class="o">=</span><span class="s2">&quot;categories.Category&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,516 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.genericcollection &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/genericcollection';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.g...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.genericcollection</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Special helpers for generic collections.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib.contenttypes.models</span> <span class="kn">import</span> <span class="n">ContentType</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">NoReverseMatch</span><span class="p">,</span> <span class="n">reverse</span>
<div class="viewcode-block" id="GenericCollectionInlineModelAdmin">
<a class="viewcode-back" href="../../api/categories.genericcollection.GenericCollectionInlineModelAdmin.html#categories.genericcollection.GenericCollectionInlineModelAdmin">[docs]</a>
<span class="k">class</span> <span class="nc">GenericCollectionInlineModelAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">InlineModelAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Inline admin for generic model collections.&quot;&quot;&quot;</span>
<span class="n">ct_field</span> <span class="o">=</span> <span class="s2">&quot;content_type&quot;</span>
<span class="n">ct_fk_field</span> <span class="o">=</span> <span class="s2">&quot;object_id&quot;</span>
<span class="k">def</span> <span class="nf">get_content_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the content types supported by this collection.&quot;&quot;&quot;</span>
<span class="n">ctypes</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="s2">&quot;app_label&quot;</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
<span class="n">elements</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="ow">in</span> <span class="n">ctypes</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">elements</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;admin:</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s</span><span class="s2">_changelist&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">elements</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_formset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the formset for the generic collection.&quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">GenericCollectionInlineModelAdmin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_formset</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">content_types</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_content_types</span><span class="p">()</span>
<span class="n">result</span><span class="o">.</span><span class="n">ct_fk_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ct_fk_field</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">class</span> <span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;contentrelations/js/genericlookup.js&quot;</span><span class="p">,)</span></div>
<div class="viewcode-block" id="GenericCollectionTabularInline">
<a class="viewcode-back" href="../../api/categories.genericcollection.GenericCollectionTabularInline.html#categories.genericcollection.GenericCollectionTabularInline">[docs]</a>
<span class="k">class</span> <span class="nc">GenericCollectionTabularInline</span><span class="p">(</span><span class="n">GenericCollectionInlineModelAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Tabular model admin for a generic collection.&quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;admin/edit_inline/gen_coll_tabular.html&quot;</span></div>
<div class="viewcode-block" id="GenericCollectionStackedInline">
<a class="viewcode-back" href="../../api/categories.genericcollection.GenericCollectionStackedInline.html#categories.genericcollection.GenericCollectionStackedInline">[docs]</a>
<span class="k">class</span> <span class="nc">GenericCollectionStackedInline</span><span class="p">(</span><span class="n">GenericCollectionInlineModelAdmin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Stacked model admin for a generic collection.&quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;admin/edit_inline/gen_coll_stacked.html&quot;</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,495 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.management.commands.add_category_fields &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/management/commands/add_category_fields';</script>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.m...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.management.commands.add_category_fields</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;The add_category_fields command.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.core.management.base</span> <span class="kn">import</span> <span class="n">BaseCommand</span>
<div class="viewcode-block" id="Command">
<a class="viewcode-back" href="../../../../api/categories.management.commands.add_category_fields.Command.html#categories.management.commands.add_category_fields.Command">[docs]</a>
<span class="k">class</span> <span class="nc">Command</span><span class="p">(</span><span class="n">BaseCommand</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Alter one or more models&#39; tables with the registered attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">help</span> <span class="o">=</span> <span class="s2">&quot;Alter the tables for all registered models, or just specified models&quot;</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">&quot;[appname ...]&quot;</span>
<span class="n">can_import_settings</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">requires_system_checks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">add_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Add app_names argument to the command.&quot;&quot;&quot;</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;app_names&quot;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">&quot;*&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handle</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">options</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Alter the tables.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">categories.migration</span> <span class="kn">import</span> <span class="n">migrate_app</span>
<span class="kn">from</span> <span class="nn">categories.settings</span> <span class="kn">import</span> <span class="n">MODEL_REGISTRY</span>
<span class="k">if</span> <span class="n">options</span><span class="p">[</span><span class="s2">&quot;app_names&quot;</span><span class="p">]:</span>
<span class="k">for</span> <span class="n">app</span> <span class="ow">in</span> <span class="n">options</span><span class="p">[</span><span class="s2">&quot;app_names&quot;</span><span class="p">]:</span>
<span class="n">migrate_app</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">app</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">app</span> <span class="ow">in</span> <span class="n">MODEL_REGISTRY</span><span class="p">:</span>
<span class="n">migrate_app</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">app</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,494 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.management.commands.drop_category_field &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/management/commands/drop_category_field';</script>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.m...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.management.commands.drop_category_field</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Alter one or more models&#39; tables with the registered attributes.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.core.management.base</span> <span class="kn">import</span> <span class="n">BaseCommand</span><span class="p">,</span> <span class="n">CommandError</span>
<div class="viewcode-block" id="Command">
<a class="viewcode-back" href="../../../../api/categories.management.commands.drop_category_field.Command.html#categories.management.commands.drop_category_field.Command">[docs]</a>
<span class="k">class</span> <span class="nc">Command</span><span class="p">(</span><span class="n">BaseCommand</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Alter one or more models&#39; tables with the registered attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">help</span> <span class="o">=</span> <span class="s2">&quot;Drop the given field from the given model&#39;s table&quot;</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">&quot;appname modelname fieldname&quot;</span>
<span class="n">can_import_settings</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">requires_system_checks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">add_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Add app_name, model_name, and field_name arguments to the command.&quot;&quot;&quot;</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;app_name&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;model_name&quot;</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;field_name&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handle</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">options</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Alter the tables.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">categories.migration</span> <span class="kn">import</span> <span class="n">drop_field</span>
<span class="k">if</span> <span class="s2">&quot;app_name&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span> <span class="ow">or</span> <span class="s2">&quot;model_name&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span> <span class="ow">or</span> <span class="s2">&quot;field_name&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">CommandError</span><span class="p">(</span><span class="s2">&quot;You must specify an Application name, a Model name and a Field name&quot;</span><span class="p">)</span>
<span class="n">drop_field</span><span class="p">(</span><span class="n">options</span><span class="p">[</span><span class="s2">&quot;app_name&quot;</span><span class="p">],</span> <span class="n">options</span><span class="p">[</span><span class="s2">&quot;model_name&quot;</span><span class="p">],</span> <span class="n">options</span><span class="p">[</span><span class="s2">&quot;field_name&quot;</span><span class="p">])</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,555 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.management.commands.import_categories &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/management/commands/import_categories';</script>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../../../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.m...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.management.commands.import_categories</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Import category trees from a file.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.core.management.base</span> <span class="kn">import</span> <span class="n">BaseCommand</span><span class="p">,</span> <span class="n">CommandError</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">transaction</span>
<span class="kn">from</span> <span class="nn">categories.models</span> <span class="kn">import</span> <span class="n">Category</span>
<span class="kn">from</span> <span class="nn">categories.settings</span> <span class="kn">import</span> <span class="n">SLUG_TRANSLITERATOR</span>
<span class="kn">from</span> <span class="nn">...utils</span> <span class="kn">import</span> <span class="n">slugify</span>
<div class="viewcode-block" id="Command">
<a class="viewcode-back" href="../../../../api/categories.management.commands.import_categories.Command.html#categories.management.commands.import_categories.Command">[docs]</a>
<span class="k">class</span> <span class="nc">Command</span><span class="p">(</span><span class="n">BaseCommand</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Import category trees from a file.&quot;&quot;&quot;</span>
<span class="n">help</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;Imports category tree(s) from a file. Sub categories must be indented by the same multiple of spaces or tabs.&quot;</span>
<span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">&quot;file_path [file_path ...]&quot;</span>
<span class="k">def</span> <span class="nf">get_indent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Look through the string and count the spaces.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">indent_amt</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">string</span><span class="p">:</span>
<span class="k">if</span> <span class="n">char</span> <span class="o">==</span> <span class="s2">&quot; &quot;</span><span class="p">:</span>
<span class="n">indent_amt</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="n">indent_amt</span>
<span class="nd">@transaction</span><span class="o">.</span><span class="n">atomic</span>
<span class="k">def</span> <span class="nf">make_category</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make and save a category object from a string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cat</span> <span class="o">=</span> <span class="n">Category</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span>
<span class="n">slug</span><span class="o">=</span><span class="n">slugify</span><span class="p">(</span><span class="n">SLUG_TRANSLITERATOR</span><span class="p">(</span><span class="n">string</span><span class="o">.</span><span class="n">strip</span><span class="p">()))[:</span><span class="mi">49</span><span class="p">],</span>
<span class="c1"># arent=parent,</span>
<span class="n">order</span><span class="o">=</span><span class="n">order</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">cat</span><span class="o">.</span><span class="n">_tree_manager</span><span class="o">.</span><span class="n">insert_node</span><span class="p">(</span><span class="n">cat</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="s2">&quot;last-child&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">cat</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">if</span> <span class="n">parent</span><span class="p">:</span>
<span class="n">parent</span><span class="o">.</span><span class="n">rght</span> <span class="o">=</span> <span class="n">cat</span><span class="o">.</span><span class="n">rght</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">parent</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">cat</span>
<span class="k">def</span> <span class="nf">parse_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lines</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Do the work of parsing each line.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">level</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span><span class="p">]:</span>
<span class="k">raise</span> <span class="n">CommandError</span><span class="p">(</span><span class="s2">&quot;The first line in the file cannot start with a space or tab.&quot;</span><span class="p">)</span>
<span class="c1"># This keeps track of the current parents at a given level</span>
<span class="n">current_parents</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">line</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">indent</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="n">indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_indent</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">line</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">indent</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">CommandError</span><span class="p">(</span><span class="s2">&quot;You can&#39;t mix spaces and tabs for indents&quot;</span><span class="p">)</span>
<span class="n">level</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="n">indent</span><span class="p">)</span>
<span class="n">current_parents</span><span class="p">[</span><span class="n">level</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_category</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">current_parents</span><span class="p">[</span><span class="n">level</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># We are back to a zero level, so reset the whole thing</span>
<span class="n">current_parents</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_category</span><span class="p">(</span><span class="n">line</span><span class="p">)}</span>
<span class="n">current_parents</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">_tree_manager</span><span class="o">.</span><span class="n">rebuild</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">file_paths</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle the basic import.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="k">for</span> <span class="n">file_path</span> <span class="ow">in</span> <span class="n">file_paths</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;File </span><span class="si">%s</span><span class="s2"> not found.&quot;</span> <span class="o">%</span> <span class="n">file_path</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parse_lines</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,552 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.migration &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/migration';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.migration</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.migration</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Adds and removes category relations on the database.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.apps</span> <span class="kn">import</span> <span class="n">apps</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">DatabaseError</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">transaction</span>
<span class="kn">from</span> <span class="nn">django.db.utils</span> <span class="kn">import</span> <span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span>
<div class="viewcode-block" id="table_exists">
<a class="viewcode-back" href="../../api/categories.migration.table_exists.html#categories.migration.table_exists">[docs]</a>
<span class="k">def</span> <span class="nf">table_exists</span><span class="p">(</span><span class="n">table_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if a table exists in the database.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="field_exists">
<a class="viewcode-back" href="../../api/categories.migration.field_exists.html#categories.migration.field_exists">[docs]</a>
<span class="k">def</span> <span class="nf">field_exists</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Does the FK or M2M table exist in the database already?</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span><span class="p">)</span>
<span class="n">table_name</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_table</span>
<span class="n">cursor</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
<span class="n">field_info</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">introspection</span><span class="o">.</span><span class="n">get_table_description</span><span class="p">(</span><span class="n">cursor</span><span class="p">,</span> <span class="n">table_name</span><span class="p">)</span>
<span class="n">field_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">field_info</span><span class="p">]</span>
<span class="c1"># Return True if the many to many table exists</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;m2m_db_table&quot;</span><span class="p">):</span>
<span class="n">m2m_table_name</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">m2m_db_table</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">m2m_field_info</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">introspection</span><span class="o">.</span><span class="n">get_table_description</span><span class="p">(</span><span class="n">cursor</span><span class="p">,</span> <span class="n">m2m_table_name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">DatabaseError</span><span class="p">:</span> <span class="c1"># Django &gt;= 4.1 throws DatabaseError</span>
<span class="n">m2m_field_info</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">m2m_field_info</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">field_names</span></div>
<div class="viewcode-block" id="drop_field">
<a class="viewcode-back" href="../../api/categories.migration.drop_field.html#categories.migration.drop_field">[docs]</a>
<span class="k">def</span> <span class="nf">drop_field</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Drop the given field from the app&#39;s model.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">app_config</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">app_name</span><span class="p">)</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">with</span> <span class="n">connection</span><span class="o">.</span><span class="n">schema_editor</span><span class="p">()</span> <span class="k">as</span> <span class="n">schema_editor</span><span class="p">:</span>
<span class="n">schema_editor</span><span class="o">.</span><span class="n">remove_field</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span></div>
<div class="viewcode-block" id="migrate_app">
<a class="viewcode-back" href="../../api/categories.migration.migrate_app.html#categories.migration.migrate_app">[docs]</a>
<span class="k">def</span> <span class="nf">migrate_app</span><span class="p">(</span><span class="n">sender</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Migrate all models of this app registered.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">.registration</span> <span class="kn">import</span> <span class="n">registry</span>
<span class="k">if</span> <span class="s2">&quot;app_config&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">app_config</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;app_config&quot;</span><span class="p">]</span>
<span class="n">app_name</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">label</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="n">fld</span> <span class="k">for</span> <span class="n">fld</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">registry</span><span class="o">.</span><span class="n">_field_registry</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="k">if</span> <span class="n">fld</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">app_name</span><span class="p">)]</span>
<span class="n">sid</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">savepoint</span><span class="p">()</span>
<span class="k">for</span> <span class="n">fld</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span> <span class="o">=</span> <span class="n">fld</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="n">field_exists</span><span class="p">(</span><span class="n">app_name</span><span class="p">,</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="n">connection</span><span class="o">.</span><span class="n">schema_editor</span><span class="p">()</span> <span class="k">as</span> <span class="n">schema_editor</span><span class="p">:</span>
<span class="n">schema_editor</span><span class="o">.</span><span class="n">add_field</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">registry</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">[</span><span class="n">fld</span><span class="p">])</span>
<span class="k">if</span> <span class="n">sid</span><span class="p">:</span>
<span class="n">transaction</span><span class="o">.</span><span class="n">savepoint_commit</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span>
<span class="c1"># Django 4.1 with sqlite3 has for some reason started throwing OperationalError</span>
<span class="c1"># instead of ProgrammingError, so we need to catch both.</span>
<span class="k">except</span> <span class="p">(</span><span class="n">ProgrammingError</span><span class="p">,</span> <span class="n">OperationalError</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sid</span><span class="p">:</span>
<span class="n">transaction</span><span class="o">.</span><span class="n">savepoint_rollback</span><span class="p">(</span><span class="n">sid</span><span class="p">)</span>
<span class="k">continue</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,632 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.models &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/models';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.models</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.models</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Category models.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">reduce</span>
<span class="kn">from</span> <span class="nn">django.contrib.contenttypes.fields</span> <span class="kn">import</span> <span class="n">GenericForeignKey</span>
<span class="kn">from</span> <span class="nn">django.contrib.contenttypes.models</span> <span class="kn">import</span> <span class="n">ContentType</span>
<span class="kn">from</span> <span class="nn">django.core.files.images</span> <span class="kn">import</span> <span class="n">get_image_dimensions</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="kn">import</span> <span class="n">force_str</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">.base</span> <span class="kn">import</span> <span class="n">CategoryBase</span>
<span class="kn">from</span> <span class="nn">.settings</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">RELATION_MODELS</span><span class="p">,</span>
<span class="n">RELATIONS</span><span class="p">,</span>
<span class="n">THUMBNAIL_STORAGE_ALIAS</span><span class="p">,</span>
<span class="n">THUMBNAIL_UPLOAD_PATH</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Determine storage method based on Django version</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># Django 4.2+</span>
<span class="kn">from</span> <span class="nn">django.core.files.storage</span> <span class="kn">import</span> <span class="n">storages</span>
<span class="n">STORAGE</span> <span class="o">=</span> <span class="n">storages</span><span class="p">[</span><span class="n">THUMBNAIL_STORAGE_ALIAS</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">django.core.files.storage</span> <span class="kn">import</span> <span class="n">get_storage_class</span>
<span class="kn">from</span> <span class="nn">.settings</span> <span class="kn">import</span> <span class="n">THUMBNAIL_STORAGE</span>
<span class="n">STORAGE</span> <span class="o">=</span> <span class="n">get_storage_class</span><span class="p">(</span><span class="n">THUMBNAIL_STORAGE</span><span class="p">)()</span>
<div class="viewcode-block" id="Category">
<a class="viewcode-back" href="../../api/categories.models.Category.html#categories.models.Category">[docs]</a>
<span class="k">class</span> <span class="nc">Category</span><span class="p">(</span><span class="n">CategoryBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;A basic category model.&quot;&quot;&quot;</span>
<span class="n">thumbnail</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">FileField</span><span class="p">(</span>
<span class="n">upload_to</span><span class="o">=</span><span class="n">THUMBNAIL_UPLOAD_PATH</span><span class="p">,</span>
<span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">storage</span><span class="o">=</span><span class="n">STORAGE</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">thumbnail_width</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">thumbnail_height</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">order</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">alternate_title</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;An alternative title to use on pages with this category.&quot;</span>
<span class="p">)</span>
<span class="n">alternate_url</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">max_length</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;An alternative URL to use instead of the one derived from &quot;</span> <span class="s2">&quot;the category hierarchy.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">meta_keywords</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;Comma-separated keywords for search engines.&quot;</span>
<span class="p">)</span>
<span class="n">meta_extra</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">TextField</span><span class="p">(</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;(Advanced) Any additional HTML to be placed verbatim &quot;</span> <span class="s2">&quot;in the &amp;lt;head&amp;gt;&quot;</span>
<span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">short_title</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the name.&quot;&quot;&quot;</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">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a path.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">NoReverseMatch</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">alternate_url</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">alternate_url</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;categories_tree_list&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span>
<span class="n">ancestors</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_ancestors</span><span class="p">())</span> <span class="o">+</span> <span class="p">[</span>
<span class="bp">self</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">return</span> <span class="n">prefix</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">force_str</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">slug</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ancestors</span><span class="p">])</span> <span class="o">+</span> <span class="s2">&quot;/&quot;</span>
<span class="k">if</span> <span class="n">RELATION_MODELS</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">get_related_content_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content_type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all related items of the specified content type.</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">categoryrelation_set</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">content_type__name</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_relation_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relation_type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all relations of the specified relation type.</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">categoryrelation_set</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">relation_type</span><span class="o">=</span><span class="n">relation_type</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">save</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="w"> </span><span class="sd">&quot;&quot;&quot;Save the category.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">thumbnail</span><span class="p">:</span>
<span class="n">width</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="n">get_image_dimensions</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thumbnail</span><span class="o">.</span><span class="n">file</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">width</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thumbnail_width</span> <span class="o">=</span> <span class="n">width</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thumbnail_height</span> <span class="o">=</span> <span class="n">height</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Category</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">save</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">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="n">CategoryBase</span><span class="o">.</span><span class="n">Meta</span><span class="p">):</span>
<span class="n">verbose_name</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;category&quot;</span><span class="p">)</span>
<span class="n">verbose_name_plural</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;categories&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">MPTTMeta</span><span class="p">:</span>
<span class="n">order_insertion_by</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span></div>
<span class="k">if</span> <span class="n">RELATIONS</span><span class="p">:</span>
<span class="n">CATEGORY_RELATION_LIMITS</span> <span class="o">=</span> <span class="n">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span> <span class="o">|</span> <span class="n">y</span><span class="p">,</span> <span class="n">RELATIONS</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">CATEGORY_RELATION_LIMITS</span> <span class="o">=</span> <span class="p">[]</span>
<div class="viewcode-block" id="CategoryRelationManager">
<a class="viewcode-back" href="../../api/categories.models.CategoryRelationManager.html#categories.models.CategoryRelationManager">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryRelationManager</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Manager</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom access functions for category relations.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">get_content_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content_type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all the items of the given content type related to this item.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">content_type__name</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_relation_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relation_type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all the items of the given relationship type related to this item.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">relation_type</span><span class="o">=</span><span class="n">relation_type</span><span class="p">)</span></div>
<div class="viewcode-block" id="CategoryRelation">
<a class="viewcode-back" href="../../api/categories.models.CategoryRelation.html#categories.models.CategoryRelation">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryRelation</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Related category item.&quot;&quot;&quot;</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Category</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;category&quot;</span><span class="p">),</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">)</span>
<span class="n">content_type</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span>
<span class="n">ContentType</span><span class="p">,</span>
<span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">,</span>
<span class="n">limit_choices_to</span><span class="o">=</span><span class="n">CATEGORY_RELATION_LIMITS</span><span class="p">,</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;content type&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">object_id</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;object id&quot;</span><span class="p">))</span>
<span class="n">content_object</span> <span class="o">=</span> <span class="n">GenericForeignKey</span><span class="p">(</span><span class="s2">&quot;content_type&quot;</span><span class="p">,</span> <span class="s2">&quot;object_id&quot;</span><span class="p">)</span>
<span class="n">relation_type</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;relation type&quot;</span><span class="p">),</span>
<span class="n">max_length</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">help_text</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;A generic text field to tag a relation, like &#39;leadphoto&#39;.&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">CategoryRelationManager</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="s2">&quot;CategoryRelation&quot;</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,640 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.registration &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/registration';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.r...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.registration</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">These functions handle the adding of fields to other models.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Type</span><span class="p">,</span> <span class="n">Union</span>
<span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Iterable</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">FieldDoesNotExist</span><span class="p">,</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span> <span class="nn">django.db.models</span> <span class="kn">import</span> <span class="n">CASCADE</span><span class="p">,</span> <span class="n">ForeignKey</span><span class="p">,</span> <span class="n">ManyToManyField</span>
<span class="c1"># from settings import self._field_registry, self._model_registry</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">fields</span>
<span class="n">FIELD_TYPES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;ForeignKey&quot;</span><span class="p">:</span> <span class="n">ForeignKey</span><span class="p">,</span>
<span class="s2">&quot;ManyToManyField&quot;</span><span class="p">:</span> <span class="n">ManyToManyField</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="Registry">
<a class="viewcode-back" href="../../api/categories.registration.Registry.html#categories.registration.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="w"> </span><span class="sd">&quot;&quot;&quot;Keeps track of fields and models registered.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__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">_field_registry</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">register_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">app</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">field_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">field_definitions</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">]):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Registration process for Django 1.7+.</span>
<span class="sd"> Args:</span>
<span class="sd"> app: app name/label</span>
<span class="sd"> model_name: name of the model</span>
<span class="sd"> field_definitions: a string, tuple or list of field configurations</span>
<span class="sd"> field_type: either &#39;ForeignKey&#39; or &#39;ManyToManyField&#39;</span>
<span class="sd"> Raises:</span>
<span class="sd"> ImproperlyConfigured: For incorrect parameter types or missing model.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.apps</span> <span class="kn">import</span> <span class="n">apps</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">app</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field_definitions</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">field_definitions</span> <span class="o">=</span> <span class="p">[</span><span class="n">field_definitions</span><span class="p">]</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field_definitions</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;Field configuration for </span><span class="si">%(app)s</span><span class="s2"> should be a string or iterable&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;app&quot;</span><span class="p">:</span> <span class="n">app</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">field_type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;ForeignKey&quot;</span><span class="p">,</span> <span class="s2">&quot;ManyToManyField&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;`field_type` must be either `&quot;ForeignKey&quot;` or `&quot;ManyToManyField&quot;`.&#39;</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_name</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">):</span>
<span class="n">app_config</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_app_config</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">label</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">model_name</span>
<span class="n">model_name</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span>
<span class="n">opts</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="k">if</span> <span class="n">app_label</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">model</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s1">&#39;Model &quot;</span><span class="si">%(model)s</span><span class="s1">&quot; doesn</span><span class="se">\&#39;</span><span class="s1">t exist in app &quot;</span><span class="si">%(app)s</span><span class="s1">&quot;.&#39;</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="n">model_name</span><span class="p">,</span> <span class="s2">&quot;app&quot;</span><span class="p">:</span> <span class="n">app</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field_definitions</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="n">field_definitions</span> <span class="o">=</span> <span class="p">[</span><span class="n">field_definitions</span><span class="p">]</span>
<span class="k">for</span> <span class="n">fld</span> <span class="ow">in</span> <span class="n">field_definitions</span><span class="p">:</span>
<span class="n">extra_params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;to&quot;</span><span class="p">:</span> <span class="s2">&quot;categories.Category&quot;</span><span class="p">,</span> <span class="s2">&quot;blank&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">}</span>
<span class="k">if</span> <span class="n">field_type</span> <span class="o">!=</span> <span class="s2">&quot;ManyToManyField&quot;</span><span class="p">:</span>
<span class="n">extra_params</span><span class="p">[</span><span class="s2">&quot;on_delete&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">CASCADE</span>
<span class="n">extra_params</span><span class="p">[</span><span class="s2">&quot;null&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fld</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">field_name</span> <span class="o">=</span> <span class="n">fld</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fld</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">if</span> <span class="s2">&quot;name&quot;</span> <span class="ow">in</span> <span class="n">fld</span><span class="p">:</span>
<span class="n">field_name</span> <span class="o">=</span> <span class="n">fld</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">extra_params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">fld</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(settings)s</span><span class="s2"> doesn&#39;t recognize the value of </span><span class="si">%(app)s</span><span class="s2">.</span><span class="si">%(model)s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="o">%</span> <span class="p">{</span><span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="s2">&quot;CATEGORY_SETTINGS&quot;</span><span class="p">,</span> <span class="s2">&quot;app&quot;</span><span class="p">:</span> <span class="n">app</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="n">model_name</span><span class="p">}</span>
<span class="p">)</span>
<span class="n">registry_name</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">field_name</span><span class="p">])</span>
<span class="k">if</span> <span class="n">registry_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">[</span><span class="n">registry_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">FIELD_TYPES</span><span class="p">[</span><span class="n">field_type</span><span class="p">](</span><span class="o">**</span><span class="n">extra_params</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">[</span><span class="n">registry_name</span><span class="p">]</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">register_m2m</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;categories&quot;</span><span class="p">,</span> <span class="n">extra_params</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Register a field name to the model as a many to many field.&quot;&quot;&quot;</span>
<span class="n">extra_params</span> <span class="o">=</span> <span class="n">extra_params</span> <span class="ow">or</span> <span class="p">{}</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">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">extra_params</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">CategoryM2MField</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">register_fk</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;category&quot;</span><span class="p">,</span> <span class="n">extra_params</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Register a field name to the model as a foreign key.&quot;&quot;&quot;</span>
<span class="n">extra_params</span> <span class="o">=</span> <span class="n">extra_params</span> <span class="ow">or</span> <span class="p">{}</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">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">extra_params</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">CategoryFKField</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">model</span><span class="p">,</span>
<span class="n">field_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">extra_params</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">field</span><span class="p">:</span> <span class="n">Type</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">CategoryFKField</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Does the heavy lifting for registering a field to a model.&quot;&quot;&quot;</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span>
<span class="n">extra_params</span> <span class="o">=</span> <span class="n">extra_params</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">registry_name</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">field_name</span><span class="p">))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">registry_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">:</span>
<span class="k">return</span> <span class="c1"># raise AlreadyRegistered</span>
<span class="n">opts</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
<span class="k">if</span> <span class="n">app_label</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">model</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_model_registry</span><span class="p">[</span><span class="n">app_label</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">[</span><span class="n">registry_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">field</span><span class="p">(</span><span class="o">**</span><span class="n">extra_params</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_field_registry</span><span class="p">[</span><span class="n">registry_name</span><span class="p">]</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">)</span></div>
<span class="n">registry</span> <span class="o">=</span> <span class="n">Registry</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_process_registry</span><span class="p">(</span><span class="n">registry</span><span class="p">,</span> <span class="n">call_func</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Given a dictionary, and a registration function, process the registry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.apps</span> <span class="kn">import</span> <span class="n">apps</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="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">registry</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="o">*</span><span class="n">key</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">model</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(key)s</span><span class="s2"> is not a model&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">key</span><span class="p">})</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">call_func</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="n">field_name</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span>
<span class="n">call_func</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">extra_params</span><span class="o">=</span><span class="n">item</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(settings)s</span><span class="s2"> doesn&#39;t recognize the value of </span><span class="si">%(key)s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="o">%</span> <span class="p">{</span><span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="s2">&quot;CATEGORY_SETTINGS&quot;</span><span class="p">,</span> <span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">key</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">call_func</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="n">field_name</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">)</span>
<span class="n">call_func</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">extra_params</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(settings)s</span><span class="s2"> doesn&#39;t recognize the value of </span><span class="si">%(key)s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="o">%</span> <span class="p">{</span><span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="s2">&quot;CATEGORY_SETTINGS&quot;</span><span class="p">,</span> <span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">key</span><span class="p">}</span>
<span class="p">)</span>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,471 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.utils &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/utils';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.utils</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.utils</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;This module contains utility functions that are used across the project.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.utils.text</span> <span class="kn">import</span> <span class="n">slugify</span> <span class="k">as</span> <span class="n">django_slugify</span>
<div class="viewcode-block" id="slugify">
<a class="viewcode-back" href="../../api/categories.utils.slugify.html#categories.utils.slugify">[docs]</a>
<span class="k">def</span> <span class="nf">slugify</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Slugify a string. This function is a wrapper to unify the slugify function across the project.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">django_slugify</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">allow_unicode</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,628 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>categories.views &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/documentation_options.js?v=51b770b3"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/categories/views';</script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Module code</a></li>
<li class="breadcrumb-item active" aria-current="page">categories.views</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>Source code for categories.views</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;View functions for categories.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">Http404</span><span class="p">,</span> <span class="n">HttpResponse</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">get_object_or_404</span>
<span class="kn">from</span> <span class="nn">django.template.loader</span> <span class="kn">import</span> <span class="n">select_template</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">django.views.generic</span> <span class="kn">import</span> <span class="n">DetailView</span><span class="p">,</span> <span class="n">ListView</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Category</span>
<div class="viewcode-block" id="category_detail">
<a class="viewcode-back" href="../../api/categories.views.category_detail.html#categories.views.category_detail">[docs]</a>
<span class="k">def</span> <span class="nf">category_detail</span><span class="p">(</span>
<span class="n">request</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">template_name</span><span class="o">=</span><span class="s2">&quot;categories/category_detail.html&quot;</span><span class="p">,</span> <span class="n">extra_context</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Render the detail page for a category.&quot;&quot;&quot;</span>
<span class="n">extra_context</span> <span class="o">=</span> <span class="n">extra_context</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">path_items</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span>
<span class="n">Category</span><span class="p">,</span> <span class="n">slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">level</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">parent__slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span><span class="n">Category</span><span class="p">,</span> <span class="n">slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">level</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">templates</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">path_items</span><span class="p">:</span>
<span class="n">templates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;categories/</span><span class="si">%s</span><span class="s2">.html&quot;</span> <span class="o">%</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path_items</span><span class="p">))</span>
<span class="n">path_items</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">templates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">template_name</span><span class="p">)</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="n">category</span><span class="p">}</span>
<span class="k">if</span> <span class="n">extra_context</span><span class="p">:</span>
<span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra_context</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="n">select_template</span><span class="p">(</span><span class="n">templates</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="p">))</span></div>
<div class="viewcode-block" id="get_category_for_path">
<a class="viewcode-back" href="../../api/categories.views.get_category_for_path.html#categories.views.get_category_for_path">[docs]</a>
<span class="k">def</span> <span class="nf">get_category_for_path</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="n">Category</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the category for a path.&quot;&quot;&quot;</span>
<span class="n">path_items</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">level</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">parent__slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="n">path_items</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">level</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">path_items</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">queryset</span><span class="o">.</span><span class="n">get</span><span class="p">()</span></div>
<div class="viewcode-block" id="CategoryDetailView">
<a class="viewcode-back" href="../../api/categories.views.CategoryDetailView.html#categories.views.CategoryDetailView">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryDetailView</span><span class="p">(</span><span class="n">DetailView</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Detail view for a category.&quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Category</span>
<span class="n">path_field</span> <span class="o">=</span> <span class="s2">&quot;path&quot;</span>
<span class="k">def</span> <span class="nf">get_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the category.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="s2">&quot;Category detail view </span><span class="si">%s</span><span class="s2"> must be called with &quot;</span> <span class="s2">&quot;a </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">get_category_for_path</span><span class="p">(</span><span class="bp">self</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">path_field</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="k">except</span> <span class="n">Category</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http404</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;No </span><span class="si">%(verbose_name)s</span><span class="s2"> found matching the query&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;verbose_name&quot;</span><span class="p">:</span> <span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">get_template_names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the potential template names.&quot;&quot;&quot;</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">path_items</span> <span class="o">=</span> <span class="bp">self</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">path_field</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">while</span> <span class="n">path_items</span><span class="p">:</span>
<span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;categories/</span><span class="si">%s</span><span class="s2">.html&quot;</span> <span class="o">%</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path_items</span><span class="p">))</span>
<span class="n">path_items</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">names</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">CategoryDetailView</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_template_names</span><span class="p">())</span>
<span class="k">return</span> <span class="n">names</span></div>
<div class="viewcode-block" id="CategoryRelatedDetail">
<a class="viewcode-back" href="../../api/categories.views.CategoryRelatedDetail.html#categories.views.CategoryRelatedDetail">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryRelatedDetail</span><span class="p">(</span><span class="n">DetailView</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Detailed view for a category relation.&quot;&quot;&quot;</span>
<span class="n">path_field</span> <span class="o">=</span> <span class="s2">&quot;category_path&quot;</span>
<span class="n">object_name_field</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">get_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the object to render.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="s2">&quot;Category detail view </span><span class="si">%s</span><span class="s2"> must be called with &quot;</span> <span class="s2">&quot;a </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">CategoryRelatedDetail</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">get_category_for_path</span><span class="p">(</span><span class="bp">self</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">path_field</span><span class="p">])</span>
<span class="k">except</span> <span class="n">Category</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http404</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;No </span><span class="si">%(verbose_name)s</span><span class="s2"> found matching the query&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span><span class="s2">&quot;verbose_name&quot;</span><span class="p">:</span> <span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">}</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">queryset</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_template_names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get all template names.&quot;&quot;&quot;</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">path_items</span> <span class="o">=</span> <span class="bp">self</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">path_field</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">object_name_field</span><span class="p">:</span>
<span class="n">path_items</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">object_name_field</span><span class="p">))</span>
<span class="k">while</span> <span class="n">path_items</span><span class="p">:</span>
<span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/category_</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s%s</span><span class="s2">.html&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path_items</span><span class="p">),</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_name_suffix</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">path_items</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/category_</span><span class="si">%s%s</span><span class="s2">.html&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_name_suffix</span><span class="p">))</span>
<span class="n">names</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">CategoryRelatedDetail</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_template_names</span><span class="p">())</span>
<span class="k">return</span> <span class="n">names</span></div>
<div class="viewcode-block" id="CategoryRelatedList">
<a class="viewcode-back" href="../../api/categories.views.CategoryRelatedList.html#categories.views.CategoryRelatedList">[docs]</a>
<span class="k">class</span> <span class="nc">CategoryRelatedList</span><span class="p">(</span><span class="n">ListView</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;List related category items.&quot;&quot;&quot;</span>
<span class="n">path_field</span> <span class="o">=</span> <span class="s2">&quot;category_path&quot;</span>
<span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the list of items.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="s2">&quot;Category detail view </span><span class="si">%s</span><span class="s2"> must be called with &quot;</span> <span class="s2">&quot;a </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_field</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">CategoryRelatedList</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">category</span> <span class="o">=</span> <span class="n">get_category_for_path</span><span class="p">(</span><span class="bp">self</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">path_field</span><span class="p">])</span>
<span class="k">return</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_template_names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the template names.&quot;&quot;&quot;</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">object_list</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">):</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">object_list</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">path_items</span> <span class="o">=</span> <span class="bp">self</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">path_field</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
<span class="k">while</span> <span class="n">path_items</span><span class="p">:</span>
<span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/category_</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s%s</span><span class="s2">.html&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="s2">&quot;_&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path_items</span><span class="p">),</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_name_suffix</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">path_items</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/category_</span><span class="si">%s%s</span><span class="s2">.html&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_name_suffix</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">names</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">CategoryRelatedList</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_template_names</span><span class="p">())</span>
<span class="k">return</span> <span class="n">names</span></div>
</pre></div>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

474
_modules/index.html Normal file
View file

@ -0,0 +1,474 @@
<!DOCTYPE html>
<html lang="en" data-content_root="../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Overview: module code &#8212; Django Categories 2.0.0 documentation</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="../_static/css/custom.css?v=ea07567a" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../_static/documentation_options.js?v=51b770b3"></script>
<script src="../_static/doctools.js?v=9a2dae69"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/index';</script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../index.html">
<p class="title logo__title">Django Categories 2.0.0 documentation</p>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
More
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar hide-on-wide">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../installation.html">
Installation
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../getting_started.html">
Getting Started
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../user_guide/index.html">
User Guide
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../reference/index.html">
Reference
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../api/index.html">
API
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
More
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../changelog.html">
Changelog
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
</div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item active" aria-current="page">Overview:...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<h1>All modules for which code is available</h1>
<ul><li><a href="categories/admin.html">categories.admin</a></li>
<li><a href="categories/apps.html">categories.apps</a></li>
<li><a href="categories/base.html">categories.base</a></li>
<li><a href="categories/editor/templatetags/admin_tree_list_tags.html">categories.editor.templatetags.admin_tree_list_tags</a></li>
<li><a href="categories/editor/tree_editor.html">categories.editor.tree_editor</a></li>
<li><a href="categories/editor/utils.html">categories.editor.utils</a></li>
<li><a href="categories/fields.html">categories.fields</a></li>
<li><a href="categories/genericcollection.html">categories.genericcollection</a></li>
<li><a href="categories/management/commands/add_category_fields.html">categories.management.commands.add_category_fields</a></li>
<li><a href="categories/management/commands/drop_category_field.html">categories.management.commands.drop_category_field</a></li>
<li><a href="categories/management/commands/import_categories.html">categories.management.commands.import_categories</a></li>
<li><a href="categories/migration.html">categories.migration</a></li>
<li><a href="categories/models.html">categories.models</a></li>
<li><a href="categories/registration.html">categories.registration</a></li>
<li><a href="categories/templatetags/category_tags.html">categories.templatetags.category_tags</a></li>
<li><a href="categories/utils.html">categories.utils</a></li>
<li><a href="categories/views.html">categories.views</a></li>
</ul>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2010-2024, Corey Oordt.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 7.3.7.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,267 @@
.. rst-class:: h4 text-secondary
categories.admin.CategoryAdmin
CategoryAdmin
=============
.. currentmodule:: categories.admin
.. autoclass:: CategoryAdmin
.. rubric:: Methods
.. autosummary::
~CategoryAdmin.action_checkbox
~CategoryAdmin.activate
~CategoryAdmin.add_view
~CategoryAdmin.change_view
~CategoryAdmin.changeform_view
~CategoryAdmin.changelist_view
~CategoryAdmin.check
~CategoryAdmin.construct_change_message
~CategoryAdmin.deactivate
~CategoryAdmin.delete_model
~CategoryAdmin.delete_queryset
~CategoryAdmin.delete_view
~CategoryAdmin.formfield_for_choice_field
~CategoryAdmin.formfield_for_dbfield
~CategoryAdmin.formfield_for_foreignkey
~CategoryAdmin.formfield_for_manytomany
~CategoryAdmin.get_action
~CategoryAdmin.get_action_choices
~CategoryAdmin.get_actions
~CategoryAdmin.get_autocomplete_fields
~CategoryAdmin.get_changeform_initial_data
~CategoryAdmin.get_changelist
~CategoryAdmin.get_changelist_form
~CategoryAdmin.get_changelist_formset
~CategoryAdmin.get_changelist_instance
~CategoryAdmin.get_deleted_objects
~CategoryAdmin.get_empty_value_display
~CategoryAdmin.get_exclude
~CategoryAdmin.get_field_queryset
~CategoryAdmin.get_fields
~CategoryAdmin.get_fieldsets
~CategoryAdmin.get_form
~CategoryAdmin.get_formsets_with_inlines
~CategoryAdmin.get_inline_formsets
~CategoryAdmin.get_inline_instances
~CategoryAdmin.get_inlines
~CategoryAdmin.get_list_display
~CategoryAdmin.get_list_display_links
~CategoryAdmin.get_list_filter
~CategoryAdmin.get_list_select_related
~CategoryAdmin.get_model_perms
~CategoryAdmin.get_object
~CategoryAdmin.get_ordering
~CategoryAdmin.get_paginator
~CategoryAdmin.get_prepopulated_fields
~CategoryAdmin.get_preserved_filters
~CategoryAdmin.get_queryset
~CategoryAdmin.get_readonly_fields
~CategoryAdmin.get_search_fields
~CategoryAdmin.get_search_results
~CategoryAdmin.get_sortable_by
~CategoryAdmin.get_urls
~CategoryAdmin.get_view_on_site_url
~CategoryAdmin.has_add_permission
~CategoryAdmin.has_change_permission
~CategoryAdmin.has_delete_permission
~CategoryAdmin.has_module_permission
~CategoryAdmin.has_view_or_change_permission
~CategoryAdmin.has_view_permission
~CategoryAdmin.history_view
~CategoryAdmin.log_addition
~CategoryAdmin.log_change
~CategoryAdmin.log_deletion
~CategoryAdmin.lookup_allowed
~CategoryAdmin.message_user
~CategoryAdmin.old_changelist_view
~CategoryAdmin.render_change_form
~CategoryAdmin.render_delete_form
~CategoryAdmin.response_action
~CategoryAdmin.response_add
~CategoryAdmin.response_change
~CategoryAdmin.response_delete
~CategoryAdmin.response_post_save_add
~CategoryAdmin.response_post_save_change
~CategoryAdmin.save_form
~CategoryAdmin.save_formset
~CategoryAdmin.save_model
~CategoryAdmin.save_related
~CategoryAdmin.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~CategoryAdmin.actions
~CategoryAdmin.actions_on_bottom
~CategoryAdmin.actions_on_top
~CategoryAdmin.actions_selection_counter
~CategoryAdmin.add_form_template
~CategoryAdmin.autocomplete_fields
~CategoryAdmin.change_form_template
~CategoryAdmin.change_list_template
~CategoryAdmin.date_hierarchy
~CategoryAdmin.delete_confirmation_template
~CategoryAdmin.delete_selected_confirmation_template
~CategoryAdmin.exclude
~CategoryAdmin.fields
~CategoryAdmin.filter_horizontal
~CategoryAdmin.filter_vertical
~CategoryAdmin.formfield_overrides
~CategoryAdmin.inlines
~CategoryAdmin.list_display
~CategoryAdmin.list_display_links
~CategoryAdmin.list_editable
~CategoryAdmin.list_filter
~CategoryAdmin.list_max_show_all
~CategoryAdmin.list_per_page
~CategoryAdmin.list_select_related
~CategoryAdmin.media
~CategoryAdmin.object_history_template
~CategoryAdmin.ordering
~CategoryAdmin.popup_response_template
~CategoryAdmin.prepopulated_fields
~CategoryAdmin.preserve_filters
~CategoryAdmin.radio_fields
~CategoryAdmin.raw_id_fields
~CategoryAdmin.readonly_fields
~CategoryAdmin.save_as
~CategoryAdmin.save_as_continue
~CategoryAdmin.save_on_top
~CategoryAdmin.search_fields
~CategoryAdmin.show_full_result_count
~CategoryAdmin.sortable_by
~CategoryAdmin.urls
~CategoryAdmin.view_on_site

View file

@ -0,0 +1,83 @@
.. rst-class:: h4 text-secondary
categories.admin.CategoryAdminForm
CategoryAdminForm
=================
.. currentmodule:: categories.admin
.. autoclass:: CategoryAdminForm
.. rubric:: Methods
.. autosummary::
~CategoryAdminForm.add_error
~CategoryAdminForm.add_initial_prefix
~CategoryAdminForm.add_prefix
~CategoryAdminForm.as_p
~CategoryAdminForm.as_table
~CategoryAdminForm.as_ul
~CategoryAdminForm.clean
~CategoryAdminForm.clean_alternate_title
~CategoryAdminForm.clean_slug
~CategoryAdminForm.full_clean
~CategoryAdminForm.get_initial_for_field
~CategoryAdminForm.has_changed
~CategoryAdminForm.has_error
~CategoryAdminForm.hidden_fields
~CategoryAdminForm.is_multipart
~CategoryAdminForm.is_valid
~CategoryAdminForm.non_field_errors
~CategoryAdminForm.order_fields
~CategoryAdminForm.save
~CategoryAdminForm.validate_unique
~CategoryAdminForm.visible_fields
.. rubric:: Attributes
.. autosummary::
~CategoryAdminForm.changed_data
~CategoryAdminForm.default_renderer
~CategoryAdminForm.errors
~CategoryAdminForm.field_order
~CategoryAdminForm.media
~CategoryAdminForm.prefix
~CategoryAdminForm.use_required_attribute

View file

@ -0,0 +1,143 @@
.. rst-class:: h4 text-secondary
categories.admin.InlineCategoryRelation
InlineCategoryRelation
======================
.. currentmodule:: categories.admin
.. autoclass:: InlineCategoryRelation
.. rubric:: Methods
.. autosummary::
~InlineCategoryRelation.check
~InlineCategoryRelation.formfield_for_choice_field
~InlineCategoryRelation.formfield_for_dbfield
~InlineCategoryRelation.formfield_for_foreignkey
~InlineCategoryRelation.formfield_for_manytomany
~InlineCategoryRelation.get_autocomplete_fields
~InlineCategoryRelation.get_content_types
~InlineCategoryRelation.get_empty_value_display
~InlineCategoryRelation.get_exclude
~InlineCategoryRelation.get_extra
~InlineCategoryRelation.get_field_queryset
~InlineCategoryRelation.get_fields
~InlineCategoryRelation.get_fieldsets
~InlineCategoryRelation.get_formset
~InlineCategoryRelation.get_inlines
~InlineCategoryRelation.get_max_num
~InlineCategoryRelation.get_min_num
~InlineCategoryRelation.get_ordering
~InlineCategoryRelation.get_prepopulated_fields
~InlineCategoryRelation.get_queryset
~InlineCategoryRelation.get_readonly_fields
~InlineCategoryRelation.get_sortable_by
~InlineCategoryRelation.get_view_on_site_url
~InlineCategoryRelation.has_add_permission
~InlineCategoryRelation.has_change_permission
~InlineCategoryRelation.has_delete_permission
~InlineCategoryRelation.has_module_permission
~InlineCategoryRelation.has_view_or_change_permission
~InlineCategoryRelation.has_view_permission
~InlineCategoryRelation.lookup_allowed
~InlineCategoryRelation.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~InlineCategoryRelation.autocomplete_fields
~InlineCategoryRelation.can_delete
~InlineCategoryRelation.classes
~InlineCategoryRelation.ct_field
~InlineCategoryRelation.ct_fk_field
~InlineCategoryRelation.exclude
~InlineCategoryRelation.extra
~InlineCategoryRelation.fields
~InlineCategoryRelation.filter_horizontal
~InlineCategoryRelation.filter_vertical
~InlineCategoryRelation.fk_name
~InlineCategoryRelation.formfield_overrides
~InlineCategoryRelation.max_num
~InlineCategoryRelation.media
~InlineCategoryRelation.min_num
~InlineCategoryRelation.ordering
~InlineCategoryRelation.prepopulated_fields
~InlineCategoryRelation.radio_fields
~InlineCategoryRelation.raw_id_fields
~InlineCategoryRelation.readonly_fields
~InlineCategoryRelation.show_change_link
~InlineCategoryRelation.show_full_result_count
~InlineCategoryRelation.sortable_by
~InlineCategoryRelation.template
~InlineCategoryRelation.verbose_name
~InlineCategoryRelation.verbose_name_plural
~InlineCategoryRelation.view_on_site

View file

@ -0,0 +1,61 @@
.. rst-class:: h4 text-secondary
categories.admin.NullTreeNodeChoiceField
NullTreeNodeChoiceField
=======================
.. currentmodule:: categories.admin
.. autoclass:: NullTreeNodeChoiceField
.. rubric:: Methods
.. autosummary::
~NullTreeNodeChoiceField.bound_data
~NullTreeNodeChoiceField.clean
~NullTreeNodeChoiceField.get_bound_field
~NullTreeNodeChoiceField.get_limit_choices_to
~NullTreeNodeChoiceField.has_changed
~NullTreeNodeChoiceField.label_from_instance
~NullTreeNodeChoiceField.prepare_value
~NullTreeNodeChoiceField.run_validators
~NullTreeNodeChoiceField.to_python
~NullTreeNodeChoiceField.valid_value
~NullTreeNodeChoiceField.validate
~NullTreeNodeChoiceField.widget_attrs
.. rubric:: Attributes
.. autosummary::
~NullTreeNodeChoiceField.choices
~NullTreeNodeChoiceField.default_error_messages
~NullTreeNodeChoiceField.default_validators
~NullTreeNodeChoiceField.empty_values
~NullTreeNodeChoiceField.queryset

View file

@ -0,0 +1,24 @@
.. rst-class:: h4 text-secondary
categories.admin
admin
=====
.. currentmodule:: categories.admin
.. automodule:: categories.admin
.. rubric:: Classes
.. autosummary::
:toctree:
CategoryAdmin
CategoryAdminForm
InlineCategoryRelation
NullTreeNodeChoiceField

View file

@ -0,0 +1,14 @@
.. rst-class:: h4 text-secondary
categories.api
api
===
.. currentmodule:: categories.api
.. automodule:: categories.api

View file

@ -0,0 +1,43 @@
.. rst-class:: h4 text-secondary
categories.apps.CategoriesConfig
CategoriesConfig
================
.. currentmodule:: categories.apps
.. autoclass:: CategoriesConfig
.. rubric:: Methods
.. autosummary::
~CategoriesConfig.create
~CategoriesConfig.get_model
~CategoriesConfig.get_models
~CategoriesConfig.import_models
~CategoriesConfig.ready
.. rubric:: Attributes
.. autosummary::
~CategoriesConfig.default_auto_field
~CategoriesConfig.name
~CategoriesConfig.verbose_name

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.apps.handle_class_prepared
handle\_class\_prepared
=======================
.. currentmodule:: categories.apps
.. autofunction:: handle_class_prepared

View file

@ -0,0 +1,28 @@
.. rst-class:: h4 text-secondary
categories.apps
apps
====
.. currentmodule:: categories.apps
.. automodule:: categories.apps
.. rubric:: Functions
.. autosummary::
:toctree:
handle_class_prepared
.. rubric:: Classes
.. autosummary::
:toctree:
CategoriesConfig

View file

@ -0,0 +1,109 @@
.. rst-class:: h4 text-secondary
categories.base.CategoryBase
CategoryBase
============
.. currentmodule:: categories.base
.. autoclass:: CategoryBase
.. rubric:: Methods
.. autosummary::
~CategoryBase.check
~CategoryBase.clean
~CategoryBase.clean_fields
~CategoryBase.date_error_message
~CategoryBase.delete
~CategoryBase.from_db
~CategoryBase.full_clean
~CategoryBase.get_ancestors
~CategoryBase.get_children
~CategoryBase.get_deferred_fields
~CategoryBase.get_descendant_count
~CategoryBase.get_descendants
~CategoryBase.get_family
~CategoryBase.get_leafnodes
~CategoryBase.get_level
~CategoryBase.get_next_sibling
~CategoryBase.get_previous_sibling
~CategoryBase.get_root
~CategoryBase.get_siblings
~CategoryBase.insert_at
~CategoryBase.is_ancestor_of
~CategoryBase.is_child_node
~CategoryBase.is_descendant_of
~CategoryBase.is_leaf_node
~CategoryBase.is_root_node
~CategoryBase.move_to
~CategoryBase.prepare_database_save
~CategoryBase.refresh_from_db
~CategoryBase.save
~CategoryBase.save_base
~CategoryBase.serializable_value
~CategoryBase.unique_error_message
~CategoryBase.validate_unique
.. rubric:: Attributes
.. autosummary::
~CategoryBase.active
~CategoryBase.name
~CategoryBase.objects
~CategoryBase.parent
~CategoryBase.parent_id
~CategoryBase.pk
~CategoryBase.slug
~CategoryBase.tree

View file

@ -0,0 +1,267 @@
.. rst-class:: h4 text-secondary
categories.base.CategoryBaseAdmin
CategoryBaseAdmin
=================
.. currentmodule:: categories.base
.. autoclass:: CategoryBaseAdmin
.. rubric:: Methods
.. autosummary::
~CategoryBaseAdmin.action_checkbox
~CategoryBaseAdmin.activate
~CategoryBaseAdmin.add_view
~CategoryBaseAdmin.change_view
~CategoryBaseAdmin.changeform_view
~CategoryBaseAdmin.changelist_view
~CategoryBaseAdmin.check
~CategoryBaseAdmin.construct_change_message
~CategoryBaseAdmin.deactivate
~CategoryBaseAdmin.delete_model
~CategoryBaseAdmin.delete_queryset
~CategoryBaseAdmin.delete_view
~CategoryBaseAdmin.formfield_for_choice_field
~CategoryBaseAdmin.formfield_for_dbfield
~CategoryBaseAdmin.formfield_for_foreignkey
~CategoryBaseAdmin.formfield_for_manytomany
~CategoryBaseAdmin.get_action
~CategoryBaseAdmin.get_action_choices
~CategoryBaseAdmin.get_actions
~CategoryBaseAdmin.get_autocomplete_fields
~CategoryBaseAdmin.get_changeform_initial_data
~CategoryBaseAdmin.get_changelist
~CategoryBaseAdmin.get_changelist_form
~CategoryBaseAdmin.get_changelist_formset
~CategoryBaseAdmin.get_changelist_instance
~CategoryBaseAdmin.get_deleted_objects
~CategoryBaseAdmin.get_empty_value_display
~CategoryBaseAdmin.get_exclude
~CategoryBaseAdmin.get_field_queryset
~CategoryBaseAdmin.get_fields
~CategoryBaseAdmin.get_fieldsets
~CategoryBaseAdmin.get_form
~CategoryBaseAdmin.get_formsets_with_inlines
~CategoryBaseAdmin.get_inline_formsets
~CategoryBaseAdmin.get_inline_instances
~CategoryBaseAdmin.get_inlines
~CategoryBaseAdmin.get_list_display
~CategoryBaseAdmin.get_list_display_links
~CategoryBaseAdmin.get_list_filter
~CategoryBaseAdmin.get_list_select_related
~CategoryBaseAdmin.get_model_perms
~CategoryBaseAdmin.get_object
~CategoryBaseAdmin.get_ordering
~CategoryBaseAdmin.get_paginator
~CategoryBaseAdmin.get_prepopulated_fields
~CategoryBaseAdmin.get_preserved_filters
~CategoryBaseAdmin.get_queryset
~CategoryBaseAdmin.get_readonly_fields
~CategoryBaseAdmin.get_search_fields
~CategoryBaseAdmin.get_search_results
~CategoryBaseAdmin.get_sortable_by
~CategoryBaseAdmin.get_urls
~CategoryBaseAdmin.get_view_on_site_url
~CategoryBaseAdmin.has_add_permission
~CategoryBaseAdmin.has_change_permission
~CategoryBaseAdmin.has_delete_permission
~CategoryBaseAdmin.has_module_permission
~CategoryBaseAdmin.has_view_or_change_permission
~CategoryBaseAdmin.has_view_permission
~CategoryBaseAdmin.history_view
~CategoryBaseAdmin.log_addition
~CategoryBaseAdmin.log_change
~CategoryBaseAdmin.log_deletion
~CategoryBaseAdmin.lookup_allowed
~CategoryBaseAdmin.message_user
~CategoryBaseAdmin.old_changelist_view
~CategoryBaseAdmin.render_change_form
~CategoryBaseAdmin.render_delete_form
~CategoryBaseAdmin.response_action
~CategoryBaseAdmin.response_add
~CategoryBaseAdmin.response_change
~CategoryBaseAdmin.response_delete
~CategoryBaseAdmin.response_post_save_add
~CategoryBaseAdmin.response_post_save_change
~CategoryBaseAdmin.save_form
~CategoryBaseAdmin.save_formset
~CategoryBaseAdmin.save_model
~CategoryBaseAdmin.save_related
~CategoryBaseAdmin.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~CategoryBaseAdmin.actions
~CategoryBaseAdmin.actions_on_bottom
~CategoryBaseAdmin.actions_on_top
~CategoryBaseAdmin.actions_selection_counter
~CategoryBaseAdmin.add_form_template
~CategoryBaseAdmin.autocomplete_fields
~CategoryBaseAdmin.change_form_template
~CategoryBaseAdmin.change_list_template
~CategoryBaseAdmin.date_hierarchy
~CategoryBaseAdmin.delete_confirmation_template
~CategoryBaseAdmin.delete_selected_confirmation_template
~CategoryBaseAdmin.exclude
~CategoryBaseAdmin.fields
~CategoryBaseAdmin.filter_horizontal
~CategoryBaseAdmin.filter_vertical
~CategoryBaseAdmin.formfield_overrides
~CategoryBaseAdmin.inlines
~CategoryBaseAdmin.list_display
~CategoryBaseAdmin.list_display_links
~CategoryBaseAdmin.list_editable
~CategoryBaseAdmin.list_filter
~CategoryBaseAdmin.list_max_show_all
~CategoryBaseAdmin.list_per_page
~CategoryBaseAdmin.list_select_related
~CategoryBaseAdmin.media
~CategoryBaseAdmin.object_history_template
~CategoryBaseAdmin.ordering
~CategoryBaseAdmin.popup_response_template
~CategoryBaseAdmin.prepopulated_fields
~CategoryBaseAdmin.preserve_filters
~CategoryBaseAdmin.radio_fields
~CategoryBaseAdmin.raw_id_fields
~CategoryBaseAdmin.readonly_fields
~CategoryBaseAdmin.save_as
~CategoryBaseAdmin.save_as_continue
~CategoryBaseAdmin.save_on_top
~CategoryBaseAdmin.search_fields
~CategoryBaseAdmin.show_full_result_count
~CategoryBaseAdmin.sortable_by
~CategoryBaseAdmin.urls
~CategoryBaseAdmin.view_on_site

View file

@ -0,0 +1,81 @@
.. rst-class:: h4 text-secondary
categories.base.CategoryBaseAdminForm
CategoryBaseAdminForm
=====================
.. currentmodule:: categories.base
.. autoclass:: CategoryBaseAdminForm
.. rubric:: Methods
.. autosummary::
~CategoryBaseAdminForm.add_error
~CategoryBaseAdminForm.add_initial_prefix
~CategoryBaseAdminForm.add_prefix
~CategoryBaseAdminForm.as_p
~CategoryBaseAdminForm.as_table
~CategoryBaseAdminForm.as_ul
~CategoryBaseAdminForm.clean
~CategoryBaseAdminForm.clean_slug
~CategoryBaseAdminForm.full_clean
~CategoryBaseAdminForm.get_initial_for_field
~CategoryBaseAdminForm.has_changed
~CategoryBaseAdminForm.has_error
~CategoryBaseAdminForm.hidden_fields
~CategoryBaseAdminForm.is_multipart
~CategoryBaseAdminForm.is_valid
~CategoryBaseAdminForm.non_field_errors
~CategoryBaseAdminForm.order_fields
~CategoryBaseAdminForm.save
~CategoryBaseAdminForm.validate_unique
~CategoryBaseAdminForm.visible_fields
.. rubric:: Attributes
.. autosummary::
~CategoryBaseAdminForm.changed_data
~CategoryBaseAdminForm.default_renderer
~CategoryBaseAdminForm.errors
~CategoryBaseAdminForm.field_order
~CategoryBaseAdminForm.media
~CategoryBaseAdminForm.prefix
~CategoryBaseAdminForm.use_required_attribute

View file

@ -0,0 +1,133 @@
.. rst-class:: h4 text-secondary
categories.base.CategoryManager
CategoryManager
===============
.. currentmodule:: categories.base
.. autoclass:: CategoryManager
.. rubric:: Methods
.. autosummary::
~CategoryManager.active
~CategoryManager.aggregate
~CategoryManager.alias
~CategoryManager.all
~CategoryManager.annotate
~CategoryManager.bulk_create
~CategoryManager.bulk_update
~CategoryManager.check
~CategoryManager.complex_filter
~CategoryManager.contribute_to_class
~CategoryManager.count
~CategoryManager.create
~CategoryManager.dates
~CategoryManager.datetimes
~CategoryManager.db_manager
~CategoryManager.deconstruct
~CategoryManager.defer
~CategoryManager.difference
~CategoryManager.distinct
~CategoryManager.earliest
~CategoryManager.exclude
~CategoryManager.exists
~CategoryManager.explain
~CategoryManager.extra
~CategoryManager.filter
~CategoryManager.first
~CategoryManager.from_queryset
~CategoryManager.get
~CategoryManager.get_or_create
~CategoryManager.get_queryset
~CategoryManager.in_bulk
~CategoryManager.intersection
~CategoryManager.iterator
~CategoryManager.last
~CategoryManager.latest
~CategoryManager.none
~CategoryManager.only
~CategoryManager.order_by
~CategoryManager.prefetch_related
~CategoryManager.raw
~CategoryManager.reverse
~CategoryManager.select_for_update
~CategoryManager.select_related
~CategoryManager.union
~CategoryManager.update
~CategoryManager.update_or_create
~CategoryManager.using
~CategoryManager.values
~CategoryManager.values_list
.. rubric:: Attributes
.. autosummary::
~CategoryManager.auto_created
~CategoryManager.creation_counter
~CategoryManager.db
~CategoryManager.use_in_migrations

View file

@ -0,0 +1,24 @@
.. rst-class:: h4 text-secondary
categories.base
base
====
.. currentmodule:: categories.base
.. automodule:: categories.base
.. rubric:: Classes
.. autosummary::
:toctree:
CategoryBase
CategoryBaseAdmin
CategoryBaseAdminForm
CategoryManager

View file

@ -0,0 +1,14 @@
.. rst-class:: h4 text-secondary
categories.editor.models
models
======
.. currentmodule:: categories.editor.models
.. automodule:: categories.editor.models

View file

@ -0,0 +1,27 @@
.. rst-class:: h4 text-secondary
categories.editor
editor
======
.. currentmodule:: categories.editor
.. automodule:: categories.editor
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.editor.models
categories.editor.settings
categories.editor.templatetags
categories.editor.tree_editor
categories.editor.utils

View file

@ -0,0 +1,14 @@
.. rst-class:: h4 text-secondary
categories.editor.settings
settings
========
.. currentmodule:: categories.editor.settings
.. automodule:: categories.editor.settings

View file

@ -0,0 +1,45 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags.TreeList
TreeList
========
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. autoclass:: TreeList
.. rubric:: Methods
.. autosummary::
~TreeList.append
~TreeList.clear
~TreeList.copy
~TreeList.count
~TreeList.extend
~TreeList.index
~TreeList.insert
~TreeList.pop
~TreeList.remove
~TreeList.reverse
~TreeList.sort

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags.get_empty_value_display
get\_empty\_value\_display
==========================
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. autofunction:: get_empty_value_display

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags.items_for_tree_result
items\_for\_tree\_result
========================
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. autofunction:: items_for_tree_result

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags.result_tree_list
result\_tree\_list
==================
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. autofunction:: result_tree_list

View file

@ -0,0 +1,31 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags
admin\_tree\_list\_tags
=======================
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. automodule:: categories.editor.templatetags.admin_tree_list_tags
.. rubric:: Functions
.. autosummary::
:toctree:
get_empty_value_display
items_for_tree_result
result_tree_list
tree_results
.. rubric:: Classes
.. autosummary::
:toctree:
TreeList

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags.admin_tree_list_tags.tree_results
tree\_results
=============
.. currentmodule:: categories.editor.templatetags.admin_tree_list_tags
.. autofunction:: tree_results

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.editor.templatetags
templatetags
============
.. currentmodule:: categories.editor.templatetags
.. automodule:: categories.editor.templatetags
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.editor.templatetags.admin_tree_list_tags

View file

@ -0,0 +1,45 @@
.. rst-class:: h4 text-secondary
categories.editor.tree_editor.TreeChangeList
TreeChangeList
==============
.. currentmodule:: categories.editor.tree_editor
.. autoclass:: TreeChangeList
.. rubric:: Methods
.. autosummary::
~TreeChangeList.apply_select_related
~TreeChangeList.get_filters
~TreeChangeList.get_filters_params
~TreeChangeList.get_ordering
~TreeChangeList.get_ordering_field
~TreeChangeList.get_ordering_field_columns
~TreeChangeList.get_query_string
~TreeChangeList.get_queryset
~TreeChangeList.get_results
~TreeChangeList.has_related_field_in_list_display
~TreeChangeList.url_for_result

View file

@ -0,0 +1,263 @@
.. rst-class:: h4 text-secondary
categories.editor.tree_editor.TreeEditor
TreeEditor
==========
.. currentmodule:: categories.editor.tree_editor
.. autoclass:: TreeEditor
.. rubric:: Methods
.. autosummary::
~TreeEditor.action_checkbox
~TreeEditor.add_view
~TreeEditor.change_view
~TreeEditor.changeform_view
~TreeEditor.changelist_view
~TreeEditor.check
~TreeEditor.construct_change_message
~TreeEditor.delete_model
~TreeEditor.delete_queryset
~TreeEditor.delete_view
~TreeEditor.formfield_for_choice_field
~TreeEditor.formfield_for_dbfield
~TreeEditor.formfield_for_foreignkey
~TreeEditor.formfield_for_manytomany
~TreeEditor.get_action
~TreeEditor.get_action_choices
~TreeEditor.get_actions
~TreeEditor.get_autocomplete_fields
~TreeEditor.get_changeform_initial_data
~TreeEditor.get_changelist
~TreeEditor.get_changelist_form
~TreeEditor.get_changelist_formset
~TreeEditor.get_changelist_instance
~TreeEditor.get_deleted_objects
~TreeEditor.get_empty_value_display
~TreeEditor.get_exclude
~TreeEditor.get_field_queryset
~TreeEditor.get_fields
~TreeEditor.get_fieldsets
~TreeEditor.get_form
~TreeEditor.get_formsets_with_inlines
~TreeEditor.get_inline_formsets
~TreeEditor.get_inline_instances
~TreeEditor.get_inlines
~TreeEditor.get_list_display
~TreeEditor.get_list_display_links
~TreeEditor.get_list_filter
~TreeEditor.get_list_select_related
~TreeEditor.get_model_perms
~TreeEditor.get_object
~TreeEditor.get_ordering
~TreeEditor.get_paginator
~TreeEditor.get_prepopulated_fields
~TreeEditor.get_preserved_filters
~TreeEditor.get_queryset
~TreeEditor.get_readonly_fields
~TreeEditor.get_search_fields
~TreeEditor.get_search_results
~TreeEditor.get_sortable_by
~TreeEditor.get_urls
~TreeEditor.get_view_on_site_url
~TreeEditor.has_add_permission
~TreeEditor.has_change_permission
~TreeEditor.has_delete_permission
~TreeEditor.has_module_permission
~TreeEditor.has_view_or_change_permission
~TreeEditor.has_view_permission
~TreeEditor.history_view
~TreeEditor.log_addition
~TreeEditor.log_change
~TreeEditor.log_deletion
~TreeEditor.lookup_allowed
~TreeEditor.message_user
~TreeEditor.old_changelist_view
~TreeEditor.render_change_form
~TreeEditor.render_delete_form
~TreeEditor.response_action
~TreeEditor.response_add
~TreeEditor.response_change
~TreeEditor.response_delete
~TreeEditor.response_post_save_add
~TreeEditor.response_post_save_change
~TreeEditor.save_form
~TreeEditor.save_formset
~TreeEditor.save_model
~TreeEditor.save_related
~TreeEditor.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~TreeEditor.actions
~TreeEditor.actions_on_bottom
~TreeEditor.actions_on_top
~TreeEditor.actions_selection_counter
~TreeEditor.add_form_template
~TreeEditor.autocomplete_fields
~TreeEditor.change_form_template
~TreeEditor.change_list_template
~TreeEditor.date_hierarchy
~TreeEditor.delete_confirmation_template
~TreeEditor.delete_selected_confirmation_template
~TreeEditor.exclude
~TreeEditor.fields
~TreeEditor.filter_horizontal
~TreeEditor.filter_vertical
~TreeEditor.formfield_overrides
~TreeEditor.inlines
~TreeEditor.list_display
~TreeEditor.list_display_links
~TreeEditor.list_editable
~TreeEditor.list_filter
~TreeEditor.list_max_show_all
~TreeEditor.list_per_page
~TreeEditor.list_select_related
~TreeEditor.media
~TreeEditor.object_history_template
~TreeEditor.ordering
~TreeEditor.popup_response_template
~TreeEditor.prepopulated_fields
~TreeEditor.preserve_filters
~TreeEditor.radio_fields
~TreeEditor.raw_id_fields
~TreeEditor.readonly_fields
~TreeEditor.save_as
~TreeEditor.save_as_continue
~TreeEditor.save_on_top
~TreeEditor.search_fields
~TreeEditor.show_full_result_count
~TreeEditor.sortable_by
~TreeEditor.urls
~TreeEditor.view_on_site

View file

@ -0,0 +1,123 @@
.. rst-class:: h4 text-secondary
categories.editor.tree_editor.TreeEditorQuerySet
TreeEditorQuerySet
==================
.. currentmodule:: categories.editor.tree_editor
.. autoclass:: TreeEditorQuerySet
.. rubric:: Methods
.. autosummary::
~TreeEditorQuerySet.aggregate
~TreeEditorQuerySet.alias
~TreeEditorQuerySet.all
~TreeEditorQuerySet.annotate
~TreeEditorQuerySet.as_manager
~TreeEditorQuerySet.bulk_create
~TreeEditorQuerySet.bulk_update
~TreeEditorQuerySet.complex_filter
~TreeEditorQuerySet.count
~TreeEditorQuerySet.create
~TreeEditorQuerySet.dates
~TreeEditorQuerySet.datetimes
~TreeEditorQuerySet.defer
~TreeEditorQuerySet.delete
~TreeEditorQuerySet.difference
~TreeEditorQuerySet.distinct
~TreeEditorQuerySet.earliest
~TreeEditorQuerySet.exclude
~TreeEditorQuerySet.exists
~TreeEditorQuerySet.explain
~TreeEditorQuerySet.extra
~TreeEditorQuerySet.filter
~TreeEditorQuerySet.first
~TreeEditorQuerySet.get
~TreeEditorQuerySet.get_or_create
~TreeEditorQuerySet.in_bulk
~TreeEditorQuerySet.intersection
~TreeEditorQuerySet.iterator
~TreeEditorQuerySet.last
~TreeEditorQuerySet.latest
~TreeEditorQuerySet.none
~TreeEditorQuerySet.only
~TreeEditorQuerySet.order_by
~TreeEditorQuerySet.prefetch_related
~TreeEditorQuerySet.raw
~TreeEditorQuerySet.resolve_expression
~TreeEditorQuerySet.reverse
~TreeEditorQuerySet.select_for_update
~TreeEditorQuerySet.select_related
~TreeEditorQuerySet.union
~TreeEditorQuerySet.update
~TreeEditorQuerySet.update_or_create
~TreeEditorQuerySet.using
~TreeEditorQuerySet.values
~TreeEditorQuerySet.values_list
.. rubric:: Attributes
.. autosummary::
~TreeEditorQuerySet.db
~TreeEditorQuerySet.ordered
~TreeEditorQuerySet.query

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.editor.tree_editor
tree\_editor
============
.. currentmodule:: categories.editor.tree_editor
.. automodule:: categories.editor.tree_editor
.. rubric:: Classes
.. autosummary::
:toctree:
TreeChangeList
TreeEditor
TreeEditorQuerySet

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.editor.utils.display_for_field
display\_for\_field
===================
.. currentmodule:: categories.editor.utils
.. autofunction:: display_for_field

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.editor.utils
utils
=====
.. currentmodule:: categories.editor.utils
.. automodule:: categories.editor.utils
.. rubric:: Functions
.. autosummary::
:toctree:
display_for_field

View file

@ -0,0 +1,211 @@
.. rst-class:: h4 text-secondary
categories.fields.CategoryFKField
CategoryFKField
===============
.. currentmodule:: categories.fields
.. autoclass:: CategoryFKField
.. rubric:: Methods
.. autosummary::
~CategoryFKField.cast_db_type
~CategoryFKField.check
~CategoryFKField.clean
~CategoryFKField.clone
~CategoryFKField.contribute_to_class
~CategoryFKField.contribute_to_related_class
~CategoryFKField.convert_empty_strings
~CategoryFKField.db_check
~CategoryFKField.db_parameters
~CategoryFKField.db_type
~CategoryFKField.db_type_parameters
~CategoryFKField.db_type_suffix
~CategoryFKField.deconstruct
~CategoryFKField.delete_cached_value
~CategoryFKField.do_related_class
~CategoryFKField.formfield
~CategoryFKField.get_attname
~CategoryFKField.get_attname_column
~CategoryFKField.get_cache_name
~CategoryFKField.get_cached_value
~CategoryFKField.get_choices
~CategoryFKField.get_col
~CategoryFKField.get_db_converters
~CategoryFKField.get_db_prep_save
~CategoryFKField.get_db_prep_value
~CategoryFKField.get_default
~CategoryFKField.get_extra_descriptor_filter
~CategoryFKField.get_extra_restriction
~CategoryFKField.get_filter_kwargs_for_object
~CategoryFKField.get_foreign_related_value
~CategoryFKField.get_forward_related_filter
~CategoryFKField.get_instance_value_for_fields
~CategoryFKField.get_internal_type
~CategoryFKField.get_joining_columns
~CategoryFKField.get_limit_choices_to
~CategoryFKField.get_local_related_value
~CategoryFKField.get_lookup
~CategoryFKField.get_lookups
~CategoryFKField.get_path_info
~CategoryFKField.get_pk_value_on_save
~CategoryFKField.get_prep_value
~CategoryFKField.get_reverse_joining_columns
~CategoryFKField.get_reverse_path_info
~CategoryFKField.get_reverse_related_filter
~CategoryFKField.get_transform
~CategoryFKField.has_default
~CategoryFKField.is_cached
~CategoryFKField.merge_dicts
~CategoryFKField.pre_save
~CategoryFKField.register_lookup
~CategoryFKField.rel_db_type
~CategoryFKField.related_query_name
~CategoryFKField.resolve_related_fields
~CategoryFKField.run_validators
~CategoryFKField.save_form_data
~CategoryFKField.select_format
~CategoryFKField.set_attributes_from_name
~CategoryFKField.set_attributes_from_rel
~CategoryFKField.set_cached_value
~CategoryFKField.to_python
~CategoryFKField.validate
~CategoryFKField.value_from_object
~CategoryFKField.value_to_string
.. rubric:: Attributes
.. autosummary::
~CategoryFKField.auto_creation_counter
~CategoryFKField.cached_col
~CategoryFKField.class_lookups
~CategoryFKField.creation_counter
~CategoryFKField.db_returning
~CategoryFKField.db_tablespace
~CategoryFKField.default_error_messages
~CategoryFKField.default_validators
~CategoryFKField.description
~CategoryFKField.empty_strings_allowed
~CategoryFKField.empty_values
~CategoryFKField.flatchoices
~CategoryFKField.foreign_related_fields
~CategoryFKField.hidden
~CategoryFKField.local_related_fields
~CategoryFKField.many_to_many
~CategoryFKField.many_to_one
~CategoryFKField.one_to_many
~CategoryFKField.one_to_one
~CategoryFKField.related_fields
~CategoryFKField.related_model
~CategoryFKField.requires_unique_target
~CategoryFKField.reverse_related_fields
~CategoryFKField.swappable_setting
~CategoryFKField.system_check_deprecated_details
~CategoryFKField.system_check_removed_details
~CategoryFKField.target_field
~CategoryFKField.unique
~CategoryFKField.validators

View file

@ -0,0 +1,183 @@
.. rst-class:: h4 text-secondary
categories.fields.CategoryM2MField
CategoryM2MField
================
.. currentmodule:: categories.fields
.. autoclass:: CategoryM2MField
.. rubric:: Methods
.. autosummary::
~CategoryM2MField.cast_db_type
~CategoryM2MField.check
~CategoryM2MField.clean
~CategoryM2MField.clone
~CategoryM2MField.contribute_to_class
~CategoryM2MField.contribute_to_related_class
~CategoryM2MField.db_check
~CategoryM2MField.db_parameters
~CategoryM2MField.db_type
~CategoryM2MField.db_type_parameters
~CategoryM2MField.db_type_suffix
~CategoryM2MField.deconstruct
~CategoryM2MField.delete_cached_value
~CategoryM2MField.do_related_class
~CategoryM2MField.formfield
~CategoryM2MField.get_attname
~CategoryM2MField.get_attname_column
~CategoryM2MField.get_cache_name
~CategoryM2MField.get_cached_value
~CategoryM2MField.get_choices
~CategoryM2MField.get_col
~CategoryM2MField.get_db_converters
~CategoryM2MField.get_db_prep_save
~CategoryM2MField.get_db_prep_value
~CategoryM2MField.get_default
~CategoryM2MField.get_filter_kwargs_for_object
~CategoryM2MField.get_forward_related_filter
~CategoryM2MField.get_internal_type
~CategoryM2MField.get_limit_choices_to
~CategoryM2MField.get_lookup
~CategoryM2MField.get_lookups
~CategoryM2MField.get_path_info
~CategoryM2MField.get_pk_value_on_save
~CategoryM2MField.get_prep_value
~CategoryM2MField.get_reverse_path_info
~CategoryM2MField.get_reverse_related_filter
~CategoryM2MField.get_transform
~CategoryM2MField.has_default
~CategoryM2MField.is_cached
~CategoryM2MField.merge_dicts
~CategoryM2MField.pre_save
~CategoryM2MField.register_lookup
~CategoryM2MField.rel_db_type
~CategoryM2MField.related_query_name
~CategoryM2MField.run_validators
~CategoryM2MField.save_form_data
~CategoryM2MField.select_format
~CategoryM2MField.set_attributes_from_name
~CategoryM2MField.set_attributes_from_rel
~CategoryM2MField.set_cached_value
~CategoryM2MField.to_python
~CategoryM2MField.validate
~CategoryM2MField.value_from_object
~CategoryM2MField.value_to_string
.. rubric:: Attributes
.. autosummary::
~CategoryM2MField.auto_creation_counter
~CategoryM2MField.cached_col
~CategoryM2MField.class_lookups
~CategoryM2MField.creation_counter
~CategoryM2MField.db_returning
~CategoryM2MField.db_tablespace
~CategoryM2MField.default_error_messages
~CategoryM2MField.default_validators
~CategoryM2MField.description
~CategoryM2MField.empty_strings_allowed
~CategoryM2MField.empty_values
~CategoryM2MField.flatchoices
~CategoryM2MField.hidden
~CategoryM2MField.many_to_many
~CategoryM2MField.many_to_one
~CategoryM2MField.one_to_many
~CategoryM2MField.one_to_one
~CategoryM2MField.related_model
~CategoryM2MField.swappable_setting
~CategoryM2MField.system_check_deprecated_details
~CategoryM2MField.system_check_removed_details
~CategoryM2MField.target_field
~CategoryM2MField.unique
~CategoryM2MField.validators

View file

@ -0,0 +1,22 @@
.. rst-class:: h4 text-secondary
categories.fields
fields
======
.. currentmodule:: categories.fields
.. automodule:: categories.fields
.. rubric:: Classes
.. autosummary::
:toctree:
CategoryFKField
CategoryM2MField

View file

@ -0,0 +1,145 @@
.. rst-class:: h4 text-secondary
categories.genericcollection.GenericCollectionInlineModelAdmin
GenericCollectionInlineModelAdmin
=================================
.. currentmodule:: categories.genericcollection
.. autoclass:: GenericCollectionInlineModelAdmin
.. rubric:: Methods
.. autosummary::
~GenericCollectionInlineModelAdmin.check
~GenericCollectionInlineModelAdmin.formfield_for_choice_field
~GenericCollectionInlineModelAdmin.formfield_for_dbfield
~GenericCollectionInlineModelAdmin.formfield_for_foreignkey
~GenericCollectionInlineModelAdmin.formfield_for_manytomany
~GenericCollectionInlineModelAdmin.get_autocomplete_fields
~GenericCollectionInlineModelAdmin.get_content_types
~GenericCollectionInlineModelAdmin.get_empty_value_display
~GenericCollectionInlineModelAdmin.get_exclude
~GenericCollectionInlineModelAdmin.get_extra
~GenericCollectionInlineModelAdmin.get_field_queryset
~GenericCollectionInlineModelAdmin.get_fields
~GenericCollectionInlineModelAdmin.get_fieldsets
~GenericCollectionInlineModelAdmin.get_formset
~GenericCollectionInlineModelAdmin.get_inlines
~GenericCollectionInlineModelAdmin.get_max_num
~GenericCollectionInlineModelAdmin.get_min_num
~GenericCollectionInlineModelAdmin.get_ordering
~GenericCollectionInlineModelAdmin.get_prepopulated_fields
~GenericCollectionInlineModelAdmin.get_queryset
~GenericCollectionInlineModelAdmin.get_readonly_fields
~GenericCollectionInlineModelAdmin.get_sortable_by
~GenericCollectionInlineModelAdmin.get_view_on_site_url
~GenericCollectionInlineModelAdmin.has_add_permission
~GenericCollectionInlineModelAdmin.has_change_permission
~GenericCollectionInlineModelAdmin.has_delete_permission
~GenericCollectionInlineModelAdmin.has_module_permission
~GenericCollectionInlineModelAdmin.has_view_or_change_permission
~GenericCollectionInlineModelAdmin.has_view_permission
~GenericCollectionInlineModelAdmin.lookup_allowed
~GenericCollectionInlineModelAdmin.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~GenericCollectionInlineModelAdmin.autocomplete_fields
~GenericCollectionInlineModelAdmin.can_delete
~GenericCollectionInlineModelAdmin.classes
~GenericCollectionInlineModelAdmin.ct_field
~GenericCollectionInlineModelAdmin.ct_fk_field
~GenericCollectionInlineModelAdmin.exclude
~GenericCollectionInlineModelAdmin.extra
~GenericCollectionInlineModelAdmin.fields
~GenericCollectionInlineModelAdmin.filter_horizontal
~GenericCollectionInlineModelAdmin.filter_vertical
~GenericCollectionInlineModelAdmin.fk_name
~GenericCollectionInlineModelAdmin.formfield_overrides
~GenericCollectionInlineModelAdmin.max_num
~GenericCollectionInlineModelAdmin.media
~GenericCollectionInlineModelAdmin.min_num
~GenericCollectionInlineModelAdmin.model
~GenericCollectionInlineModelAdmin.ordering
~GenericCollectionInlineModelAdmin.prepopulated_fields
~GenericCollectionInlineModelAdmin.radio_fields
~GenericCollectionInlineModelAdmin.raw_id_fields
~GenericCollectionInlineModelAdmin.readonly_fields
~GenericCollectionInlineModelAdmin.show_change_link
~GenericCollectionInlineModelAdmin.show_full_result_count
~GenericCollectionInlineModelAdmin.sortable_by
~GenericCollectionInlineModelAdmin.template
~GenericCollectionInlineModelAdmin.verbose_name
~GenericCollectionInlineModelAdmin.verbose_name_plural
~GenericCollectionInlineModelAdmin.view_on_site

View file

@ -0,0 +1,145 @@
.. rst-class:: h4 text-secondary
categories.genericcollection.GenericCollectionStackedInline
GenericCollectionStackedInline
==============================
.. currentmodule:: categories.genericcollection
.. autoclass:: GenericCollectionStackedInline
.. rubric:: Methods
.. autosummary::
~GenericCollectionStackedInline.check
~GenericCollectionStackedInline.formfield_for_choice_field
~GenericCollectionStackedInline.formfield_for_dbfield
~GenericCollectionStackedInline.formfield_for_foreignkey
~GenericCollectionStackedInline.formfield_for_manytomany
~GenericCollectionStackedInline.get_autocomplete_fields
~GenericCollectionStackedInline.get_content_types
~GenericCollectionStackedInline.get_empty_value_display
~GenericCollectionStackedInline.get_exclude
~GenericCollectionStackedInline.get_extra
~GenericCollectionStackedInline.get_field_queryset
~GenericCollectionStackedInline.get_fields
~GenericCollectionStackedInline.get_fieldsets
~GenericCollectionStackedInline.get_formset
~GenericCollectionStackedInline.get_inlines
~GenericCollectionStackedInline.get_max_num
~GenericCollectionStackedInline.get_min_num
~GenericCollectionStackedInline.get_ordering
~GenericCollectionStackedInline.get_prepopulated_fields
~GenericCollectionStackedInline.get_queryset
~GenericCollectionStackedInline.get_readonly_fields
~GenericCollectionStackedInline.get_sortable_by
~GenericCollectionStackedInline.get_view_on_site_url
~GenericCollectionStackedInline.has_add_permission
~GenericCollectionStackedInline.has_change_permission
~GenericCollectionStackedInline.has_delete_permission
~GenericCollectionStackedInline.has_module_permission
~GenericCollectionStackedInline.has_view_or_change_permission
~GenericCollectionStackedInline.has_view_permission
~GenericCollectionStackedInline.lookup_allowed
~GenericCollectionStackedInline.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~GenericCollectionStackedInline.autocomplete_fields
~GenericCollectionStackedInline.can_delete
~GenericCollectionStackedInline.classes
~GenericCollectionStackedInline.ct_field
~GenericCollectionStackedInline.ct_fk_field
~GenericCollectionStackedInline.exclude
~GenericCollectionStackedInline.extra
~GenericCollectionStackedInline.fields
~GenericCollectionStackedInline.filter_horizontal
~GenericCollectionStackedInline.filter_vertical
~GenericCollectionStackedInline.fk_name
~GenericCollectionStackedInline.formfield_overrides
~GenericCollectionStackedInline.max_num
~GenericCollectionStackedInline.media
~GenericCollectionStackedInline.min_num
~GenericCollectionStackedInline.model
~GenericCollectionStackedInline.ordering
~GenericCollectionStackedInline.prepopulated_fields
~GenericCollectionStackedInline.radio_fields
~GenericCollectionStackedInline.raw_id_fields
~GenericCollectionStackedInline.readonly_fields
~GenericCollectionStackedInline.show_change_link
~GenericCollectionStackedInline.show_full_result_count
~GenericCollectionStackedInline.sortable_by
~GenericCollectionStackedInline.template
~GenericCollectionStackedInline.verbose_name
~GenericCollectionStackedInline.verbose_name_plural
~GenericCollectionStackedInline.view_on_site

View file

@ -0,0 +1,145 @@
.. rst-class:: h4 text-secondary
categories.genericcollection.GenericCollectionTabularInline
GenericCollectionTabularInline
==============================
.. currentmodule:: categories.genericcollection
.. autoclass:: GenericCollectionTabularInline
.. rubric:: Methods
.. autosummary::
~GenericCollectionTabularInline.check
~GenericCollectionTabularInline.formfield_for_choice_field
~GenericCollectionTabularInline.formfield_for_dbfield
~GenericCollectionTabularInline.formfield_for_foreignkey
~GenericCollectionTabularInline.formfield_for_manytomany
~GenericCollectionTabularInline.get_autocomplete_fields
~GenericCollectionTabularInline.get_content_types
~GenericCollectionTabularInline.get_empty_value_display
~GenericCollectionTabularInline.get_exclude
~GenericCollectionTabularInline.get_extra
~GenericCollectionTabularInline.get_field_queryset
~GenericCollectionTabularInline.get_fields
~GenericCollectionTabularInline.get_fieldsets
~GenericCollectionTabularInline.get_formset
~GenericCollectionTabularInline.get_inlines
~GenericCollectionTabularInline.get_max_num
~GenericCollectionTabularInline.get_min_num
~GenericCollectionTabularInline.get_ordering
~GenericCollectionTabularInline.get_prepopulated_fields
~GenericCollectionTabularInline.get_queryset
~GenericCollectionTabularInline.get_readonly_fields
~GenericCollectionTabularInline.get_sortable_by
~GenericCollectionTabularInline.get_view_on_site_url
~GenericCollectionTabularInline.has_add_permission
~GenericCollectionTabularInline.has_change_permission
~GenericCollectionTabularInline.has_delete_permission
~GenericCollectionTabularInline.has_module_permission
~GenericCollectionTabularInline.has_view_or_change_permission
~GenericCollectionTabularInline.has_view_permission
~GenericCollectionTabularInline.lookup_allowed
~GenericCollectionTabularInline.to_field_allowed
.. rubric:: Attributes
.. autosummary::
~GenericCollectionTabularInline.autocomplete_fields
~GenericCollectionTabularInline.can_delete
~GenericCollectionTabularInline.classes
~GenericCollectionTabularInline.ct_field
~GenericCollectionTabularInline.ct_fk_field
~GenericCollectionTabularInline.exclude
~GenericCollectionTabularInline.extra
~GenericCollectionTabularInline.fields
~GenericCollectionTabularInline.filter_horizontal
~GenericCollectionTabularInline.filter_vertical
~GenericCollectionTabularInline.fk_name
~GenericCollectionTabularInline.formfield_overrides
~GenericCollectionTabularInline.max_num
~GenericCollectionTabularInline.media
~GenericCollectionTabularInline.min_num
~GenericCollectionTabularInline.model
~GenericCollectionTabularInline.ordering
~GenericCollectionTabularInline.prepopulated_fields
~GenericCollectionTabularInline.radio_fields
~GenericCollectionTabularInline.raw_id_fields
~GenericCollectionTabularInline.readonly_fields
~GenericCollectionTabularInline.show_change_link
~GenericCollectionTabularInline.show_full_result_count
~GenericCollectionTabularInline.sortable_by
~GenericCollectionTabularInline.template
~GenericCollectionTabularInline.verbose_name
~GenericCollectionTabularInline.verbose_name_plural
~GenericCollectionTabularInline.view_on_site

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.genericcollection
genericcollection
=================
.. currentmodule:: categories.genericcollection
.. automodule:: categories.genericcollection
.. rubric:: Classes
.. autosummary::
:toctree:
GenericCollectionInlineModelAdmin
GenericCollectionStackedInline
GenericCollectionTabularInline

View file

@ -0,0 +1,61 @@
.. rst-class:: h4 text-secondary
categories.management.commands.add_category_fields.Command
Command
=======
.. currentmodule:: categories.management.commands.add_category_fields
.. autoclass:: Command
.. rubric:: Methods
.. autosummary::
~Command.add_arguments
~Command.check
~Command.check_migrations
~Command.create_parser
~Command.execute
~Command.get_version
~Command.handle
~Command.print_help
~Command.run_from_argv
.. rubric:: Attributes
.. autosummary::
~Command.args
~Command.base_stealth_options
~Command.can_import_settings
~Command.help
~Command.output_transaction
~Command.requires_migrations_checks
~Command.requires_system_checks
~Command.stealth_options

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.management.commands.add_category_fields
add\_category\_fields
=====================
.. currentmodule:: categories.management.commands.add_category_fields
.. automodule:: categories.management.commands.add_category_fields
.. rubric:: Classes
.. autosummary::
:toctree:
Command

View file

@ -0,0 +1,61 @@
.. rst-class:: h4 text-secondary
categories.management.commands.drop_category_field.Command
Command
=======
.. currentmodule:: categories.management.commands.drop_category_field
.. autoclass:: Command
.. rubric:: Methods
.. autosummary::
~Command.add_arguments
~Command.check
~Command.check_migrations
~Command.create_parser
~Command.execute
~Command.get_version
~Command.handle
~Command.print_help
~Command.run_from_argv
.. rubric:: Attributes
.. autosummary::
~Command.args
~Command.base_stealth_options
~Command.can_import_settings
~Command.help
~Command.output_transaction
~Command.requires_migrations_checks
~Command.requires_system_checks
~Command.stealth_options

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.management.commands.drop_category_field
drop\_category\_field
=====================
.. currentmodule:: categories.management.commands.drop_category_field
.. automodule:: categories.management.commands.drop_category_field
.. rubric:: Classes
.. autosummary::
:toctree:
Command

View file

@ -0,0 +1,65 @@
.. rst-class:: h4 text-secondary
categories.management.commands.import_categories.Command
Command
=======
.. currentmodule:: categories.management.commands.import_categories
.. autoclass:: Command
.. rubric:: Methods
.. autosummary::
~Command.add_arguments
~Command.check
~Command.check_migrations
~Command.create_parser
~Command.execute
~Command.get_indent
~Command.get_version
~Command.handle
~Command.make_category
~Command.parse_lines
~Command.print_help
~Command.run_from_argv
.. rubric:: Attributes
.. autosummary::
~Command.args
~Command.base_stealth_options
~Command.help
~Command.output_transaction
~Command.requires_migrations_checks
~Command.requires_system_checks
~Command.stealth_options

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.management.commands.import_categories
import\_categories
==================
.. currentmodule:: categories.management.commands.import_categories
.. automodule:: categories.management.commands.import_categories
.. rubric:: Classes
.. autosummary::
:toctree:
Command

View file

@ -0,0 +1,25 @@
.. rst-class:: h4 text-secondary
categories.management.commands
commands
========
.. currentmodule:: categories.management.commands
.. automodule:: categories.management.commands
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.management.commands.add_category_fields
categories.management.commands.drop_category_field
categories.management.commands.import_categories

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.management
management
==========
.. currentmodule:: categories.management
.. automodule:: categories.management
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.management.commands

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.migration.drop_field
drop\_field
===========
.. currentmodule:: categories.migration
.. autofunction:: drop_field

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.migration.field_exists
field\_exists
=============
.. currentmodule:: categories.migration
.. autofunction:: field_exists

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.migration.migrate_app
migrate\_app
============
.. currentmodule:: categories.migration
.. autofunction:: migrate_app

View file

@ -0,0 +1,24 @@
.. rst-class:: h4 text-secondary
categories.migration
migration
=========
.. currentmodule:: categories.migration
.. automodule:: categories.migration
.. rubric:: Functions
.. autosummary::
:toctree:
drop_field
field_exists
migrate_app
table_exists

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.migration.table_exists
table\_exists
=============
.. currentmodule:: categories.migration
.. autofunction:: table_exists

View file

@ -0,0 +1,161 @@
.. rst-class:: h4 text-secondary
categories.models.Category
Category
========
.. currentmodule:: categories.models
.. autoclass:: Category
.. rubric:: Methods
.. autosummary::
~Category.check
~Category.clean
~Category.clean_fields
~Category.date_error_message
~Category.delete
~Category.from_db
~Category.full_clean
~Category.get_absolute_url
~Category.get_ancestors
~Category.get_children
~Category.get_deferred_fields
~Category.get_descendant_count
~Category.get_descendants
~Category.get_family
~Category.get_leafnodes
~Category.get_level
~Category.get_next_sibling
~Category.get_previous_sibling
~Category.get_related_content_type
~Category.get_relation_type
~Category.get_root
~Category.get_siblings
~Category.insert_at
~Category.is_ancestor_of
~Category.is_child_node
~Category.is_descendant_of
~Category.is_leaf_node
~Category.is_root_node
~Category.move_to
~Category.prepare_database_save
~Category.refresh_from_db
~Category.save
~Category.save_base
~Category.serializable_value
~Category.unique_error_message
~Category.validate_unique
.. rubric:: Attributes
.. autosummary::
~Category.active
~Category.alternate_title
~Category.alternate_url
~Category.categoryrelation_set
~Category.children
~Category.description
~Category.flatpage_set
~Category.id
~Category.level
~Category.lft
~Category.m2mcats
~Category.meta_extra
~Category.meta_keywords
~Category.more_cats
~Category.name
~Category.objects
~Category.order
~Category.other_cats
~Category.parent
~Category.parent_id
~Category.pk
~Category.rght
~Category.short_title
~Category.simpletext_sec_cat
~Category.simpletext_set
~Category.slug
~Category.thumbnail
~Category.thumbnail_height
~Category.thumbnail_width
~Category.tree
~Category.tree_id

View file

@ -0,0 +1,77 @@
.. rst-class:: h4 text-secondary
categories.models.CategoryRelation
CategoryRelation
================
.. currentmodule:: categories.models
.. autoclass:: CategoryRelation
.. rubric:: Methods
.. autosummary::
~CategoryRelation.check
~CategoryRelation.clean
~CategoryRelation.clean_fields
~CategoryRelation.date_error_message
~CategoryRelation.delete
~CategoryRelation.from_db
~CategoryRelation.full_clean
~CategoryRelation.get_deferred_fields
~CategoryRelation.prepare_database_save
~CategoryRelation.refresh_from_db
~CategoryRelation.save
~CategoryRelation.save_base
~CategoryRelation.serializable_value
~CategoryRelation.unique_error_message
~CategoryRelation.validate_unique
.. rubric:: Attributes
.. autosummary::
~CategoryRelation.category
~CategoryRelation.category_id
~CategoryRelation.content_object
~CategoryRelation.content_type
~CategoryRelation.content_type_id
~CategoryRelation.id
~CategoryRelation.object_id
~CategoryRelation.objects
~CategoryRelation.pk
~CategoryRelation.relation_type

View file

@ -0,0 +1,135 @@
.. rst-class:: h4 text-secondary
categories.models.CategoryRelationManager
CategoryRelationManager
=======================
.. currentmodule:: categories.models
.. autoclass:: CategoryRelationManager
.. rubric:: Methods
.. autosummary::
~CategoryRelationManager.aggregate
~CategoryRelationManager.alias
~CategoryRelationManager.all
~CategoryRelationManager.annotate
~CategoryRelationManager.bulk_create
~CategoryRelationManager.bulk_update
~CategoryRelationManager.check
~CategoryRelationManager.complex_filter
~CategoryRelationManager.contribute_to_class
~CategoryRelationManager.count
~CategoryRelationManager.create
~CategoryRelationManager.dates
~CategoryRelationManager.datetimes
~CategoryRelationManager.db_manager
~CategoryRelationManager.deconstruct
~CategoryRelationManager.defer
~CategoryRelationManager.difference
~CategoryRelationManager.distinct
~CategoryRelationManager.earliest
~CategoryRelationManager.exclude
~CategoryRelationManager.exists
~CategoryRelationManager.explain
~CategoryRelationManager.extra
~CategoryRelationManager.filter
~CategoryRelationManager.first
~CategoryRelationManager.from_queryset
~CategoryRelationManager.get
~CategoryRelationManager.get_content_type
~CategoryRelationManager.get_or_create
~CategoryRelationManager.get_queryset
~CategoryRelationManager.get_relation_type
~CategoryRelationManager.in_bulk
~CategoryRelationManager.intersection
~CategoryRelationManager.iterator
~CategoryRelationManager.last
~CategoryRelationManager.latest
~CategoryRelationManager.none
~CategoryRelationManager.only
~CategoryRelationManager.order_by
~CategoryRelationManager.prefetch_related
~CategoryRelationManager.raw
~CategoryRelationManager.reverse
~CategoryRelationManager.select_for_update
~CategoryRelationManager.select_related
~CategoryRelationManager.union
~CategoryRelationManager.update
~CategoryRelationManager.update_or_create
~CategoryRelationManager.using
~CategoryRelationManager.values
~CategoryRelationManager.values_list
.. rubric:: Attributes
.. autosummary::
~CategoryRelationManager.auto_created
~CategoryRelationManager.creation_counter
~CategoryRelationManager.db
~CategoryRelationManager.use_in_migrations

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.models
models
======
.. currentmodule:: categories.models
.. automodule:: categories.models
.. rubric:: Classes
.. autosummary::
:toctree:
Category
CategoryRelation
CategoryRelationManager

View file

@ -0,0 +1,29 @@
.. rst-class:: h4 text-secondary
categories.registration.Registry
Registry
========
.. currentmodule:: categories.registration
.. autoclass:: Registry
.. rubric:: Methods
.. autosummary::
~Registry.register_fk
~Registry.register_m2m
~Registry.register_model

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.registration
registration
============
.. currentmodule:: categories.registration
.. automodule:: categories.registration
.. rubric:: Classes
.. autosummary::
:toctree:
Registry

View file

@ -0,0 +1,40 @@
.. rst-class:: h4 text-secondary
categories
categories
==========
.. currentmodule:: categories
.. automodule:: categories
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.admin
categories.api
categories.apps
categories.base
categories.editor
categories.fields
categories.genericcollection
categories.management
categories.migration
categories.models
categories.registration
categories.settings
categories.templatetags
categories.urls
categories.utils
categories.views

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.settings.SLUG_TRANSLITERATOR
SLUG\_TRANSLITERATOR
====================
.. currentmodule:: categories.settings
.. autofunction:: SLUG_TRANSLITERATOR

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.settings
settings
========
.. currentmodule:: categories.settings
.. automodule:: categories.settings
.. rubric:: Functions
.. autosummary::
:toctree:
SLUG_TRANSLITERATOR

View file

@ -0,0 +1,39 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.CategoryDrillDownNode
CategoryDrillDownNode
=====================
.. currentmodule:: categories.templatetags.category_tags
.. autoclass:: CategoryDrillDownNode
.. rubric:: Methods
.. autosummary::
~CategoryDrillDownNode.get_nodes_by_type
~CategoryDrillDownNode.render
~CategoryDrillDownNode.render_annotated
.. rubric:: Attributes
.. autosummary::
~CategoryDrillDownNode.child_nodelists
~CategoryDrillDownNode.must_be_first
~CategoryDrillDownNode.token

View file

@ -0,0 +1,39 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.LatestObjectsNode
LatestObjectsNode
=================
.. currentmodule:: categories.templatetags.category_tags
.. autoclass:: LatestObjectsNode
.. rubric:: Methods
.. autosummary::
~LatestObjectsNode.get_nodes_by_type
~LatestObjectsNode.render
~LatestObjectsNode.render_annotated
.. rubric:: Attributes
.. autosummary::
~LatestObjectsNode.child_nodelists
~LatestObjectsNode.must_be_first
~LatestObjectsNode.token

View file

@ -0,0 +1,39 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.TopLevelCategoriesNode
TopLevelCategoriesNode
======================
.. currentmodule:: categories.templatetags.category_tags
.. autoclass:: TopLevelCategoriesNode
.. rubric:: Methods
.. autosummary::
~TopLevelCategoriesNode.get_nodes_by_type
~TopLevelCategoriesNode.render
~TopLevelCategoriesNode.render_annotated
.. rubric:: Attributes
.. autosummary::
~TopLevelCategoriesNode.child_nodelists
~TopLevelCategoriesNode.must_be_first
~TopLevelCategoriesNode.token

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.breadcrumbs
breadcrumbs
===========
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: breadcrumbs

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.display_drilldown_as_ul
display\_drilldown\_as\_ul
==========================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: display_drilldown_as_ul

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.display_path_as_ul
display\_path\_as\_ul
=====================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: display_path_as_ul

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.do_get_latest_objects_by_category
do\_get\_latest\_objects\_by\_category
======================================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: do_get_latest_objects_by_category

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.get_cat_model
get\_cat\_model
===============
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: get_cat_model

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.get_category
get\_category
=============
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: get_category

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.get_category_drilldown
get\_category\_drilldown
========================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: get_category_drilldown

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.get_latest_objects_by_category
get\_latest\_objects\_by\_category
==================================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: get_latest_objects_by_category

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.get_top_level_categories
get\_top\_level\_categories
===========================
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: get_top_level_categories

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.recursetree
recursetree
===========
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: recursetree

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.resolve
resolve
=======
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: resolve

View file

@ -0,0 +1,41 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags
category\_tags
==============
.. currentmodule:: categories.templatetags.category_tags
.. automodule:: categories.templatetags.category_tags
.. rubric:: Functions
.. autosummary::
:toctree:
breadcrumbs
display_drilldown_as_ul
display_path_as_ul
do_get_latest_objects_by_category
get_cat_model
get_category
get_category_drilldown
get_latest_objects_by_category
get_top_level_categories
recursetree
resolve
tree_queryset
.. rubric:: Classes
.. autosummary::
:toctree:
CategoryDrillDownNode
LatestObjectsNode
TopLevelCategoriesNode

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.templatetags.category_tags.tree_queryset
tree\_queryset
==============
.. currentmodule:: categories.templatetags.category_tags
.. autofunction:: tree_queryset

View file

@ -0,0 +1,23 @@
.. rst-class:: h4 text-secondary
categories.templatetags
templatetags
============
.. currentmodule:: categories.templatetags
.. automodule:: categories.templatetags
.. rubric:: Submodules
.. autosummary::
:toctree:
:recursive:
categories.templatetags.category_tags

View file

@ -0,0 +1,14 @@
.. rst-class:: h4 text-secondary
categories.urls
urls
====
.. currentmodule:: categories.urls
.. automodule:: categories.urls

View file

@ -0,0 +1,21 @@
.. rst-class:: h4 text-secondary
categories.utils
utils
=====
.. currentmodule:: categories.utils
.. automodule:: categories.utils
.. rubric:: Functions
.. autosummary::
:toctree:
slugify

View file

@ -0,0 +1,9 @@
.. rst-class:: h4 text-secondary
categories.utils.slugify
slugify
=======
.. currentmodule:: categories.utils
.. autofunction:: slugify

View file

@ -0,0 +1,81 @@
.. rst-class:: h4 text-secondary
categories.views.CategoryDetailView
CategoryDetailView
==================
.. currentmodule:: categories.views
.. autoclass:: CategoryDetailView
.. rubric:: Methods
.. autosummary::
~CategoryDetailView.as_view
~CategoryDetailView.dispatch
~CategoryDetailView.get
~CategoryDetailView.get_context_data
~CategoryDetailView.get_context_object_name
~CategoryDetailView.get_object
~CategoryDetailView.get_queryset
~CategoryDetailView.get_slug_field
~CategoryDetailView.get_template_names
~CategoryDetailView.http_method_not_allowed
~CategoryDetailView.options
~CategoryDetailView.render_to_response
~CategoryDetailView.setup
.. rubric:: Attributes
.. autosummary::
~CategoryDetailView.content_type
~CategoryDetailView.context_object_name
~CategoryDetailView.extra_context
~CategoryDetailView.http_method_names
~CategoryDetailView.path_field
~CategoryDetailView.pk_url_kwarg
~CategoryDetailView.query_pk_and_slug
~CategoryDetailView.queryset
~CategoryDetailView.slug_field
~CategoryDetailView.slug_url_kwarg
~CategoryDetailView.template_engine
~CategoryDetailView.template_name
~CategoryDetailView.template_name_field
~CategoryDetailView.template_name_suffix

Some files were not shown because too many files have changed in this diff Show more