mirror of
https://github.com/evennia/evennia.git
synced 2026-03-20 06:46:31 +01:00
351 lines
No EOL
33 KiB
HTML
351 lines
No EOL
33 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>rest_framework.viewsets — Evennia latest documentation</title>
|
|
<link rel="stylesheet" href="../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d75fae25" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/nature.css?v=245aff17" />
|
|
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
|
|
<script src="../../_static/documentation_options.js?v=c6e86fd7"></script>
|
|
<script src="../../_static/doctools.js?v=9bcbadda"></script>
|
|
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
<link rel="index" title="Index" href="../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../search.html" />
|
|
</head><body>
|
|
|
|
|
|
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">rest_framework.viewsets</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<search id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for rest_framework.viewsets</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">ViewSets are essentially just a type of class based view, that doesn't provide</span>
|
|
<span class="sd">any method handlers, such as `get()`, `post()`, etc... but instead has actions,</span>
|
|
<span class="sd">such as `list()`, `retrieve()`, `create()`, etc...</span>
|
|
|
|
<span class="sd">Actions are only bound to methods at the point of instantiating the views.</span>
|
|
|
|
<span class="sd"> user_list = UserViewSet.as_view({'get': 'list'})</span>
|
|
<span class="sd"> user_detail = UserViewSet.as_view({'get': 'retrieve'})</span>
|
|
|
|
<span class="sd">Typically, rather than instantiate views from viewsets directly, you'll</span>
|
|
<span class="sd">register the viewset with a router and let the URL conf be determined</span>
|
|
<span class="sd">automatically.</span>
|
|
|
|
<span class="sd"> router = DefaultRouter()</span>
|
|
<span class="sd"> router.register(r'users', UserViewSet, 'user')</span>
|
|
<span class="sd"> urlpatterns = router.urls</span>
|
|
<span class="sd">"""</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">update_wrapper</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">inspect</span><span class="w"> </span><span class="kn">import</span> <span class="n">getmembers</span>
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">django.urls</span><span class="w"> </span><span class="kn">import</span> <span class="n">NoReverseMatch</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.decorators</span><span class="w"> </span><span class="kn">import</span> <span class="n">classonlymethod</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">django.views.decorators.csrf</span><span class="w"> </span><span class="kn">import</span> <span class="n">csrf_exempt</span>
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework</span><span class="w"> </span><span class="kn">import</span> <span class="n">generics</span><span class="p">,</span> <span class="n">mixins</span><span class="p">,</span> <span class="n">views</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework.decorators</span><span class="w"> </span><span class="kn">import</span> <span class="n">MethodMapper</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework.reverse</span><span class="w"> </span><span class="kn">import</span> <span class="n">reverse</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_extra_action</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="s1">'mapping'</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="o">.</span><span class="n">mapping</span><span class="p">,</span> <span class="n">MethodMapper</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_check_attr_name</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
|
<span class="k">assert</span> <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">==</span> <span class="n">name</span><span class="p">,</span> <span class="p">(</span>
|
|
<span class="s1">'Expected function (`</span><span class="si">{func.__name__}</span><span class="s1">`) to match its attribute name '</span>
|
|
<span class="s1">'(`</span><span class="si">{name}</span><span class="s1">`). If using a decorator, ensure the inner function is '</span>
|
|
<span class="s1">'decorated with `functools.wraps`, or that `</span><span class="si">{func.__name__}</span><span class="s1">.__name__` '</span>
|
|
<span class="s1">'is otherwise set to `</span><span class="si">{name}</span><span class="s1">`.'</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">func</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">func</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ViewSetMixin</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This is the magic.</span>
|
|
|
|
<span class="sd"> Overrides `.as_view()` so that it takes an `actions` keyword that performs</span>
|
|
<span class="sd"> the binding of HTTP methods to actions on the Resource.</span>
|
|
|
|
<span class="sd"> For example, to create a concrete view binding the 'GET' and 'POST' methods</span>
|
|
<span class="sd"> to the 'list' and 'create' actions...</span>
|
|
|
|
<span class="sd"> view = MyViewSet.as_view({'get': 'list', 'post': 'create'})</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="nd">@classonlymethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">as_view</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">actions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">initkwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Because of the way class based views create a closure around the</span>
|
|
<span class="sd"> instantiated view, we need to totally reimplement `.as_view`,</span>
|
|
<span class="sd"> and slightly modify the view function that is created and returned.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># The name and description initkwargs may be explicitly overridden for</span>
|
|
<span class="c1"># certain route configurations. eg, names of extra actions.</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">description</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># The suffix initkwarg is reserved for displaying the viewset type.</span>
|
|
<span class="c1"># This initkwarg should have no effect if the name is provided.</span>
|
|
<span class="c1"># eg. 'List' or 'Instance'.</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">suffix</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># The detail initkwarg is reserved for introspecting the viewset type.</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">detail</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># Setting a basename allows a view to reverse its action urls. This</span>
|
|
<span class="c1"># value is provided by the router through the initkwargs.</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">basename</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># actions must not be empty</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">actions</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"The `actions` argument must be provided when "</span>
|
|
<span class="s2">"calling `.as_view()` on a ViewSet. For example "</span>
|
|
<span class="s2">"`.as_view({'get': 'list'})`"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># sanitize keyword arguments</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">initkwargs</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">http_method_names</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"You tried to pass in the </span><span class="si">%s</span><span class="s2"> method name as a "</span>
|
|
<span class="s2">"keyword argument to </span><span class="si">%s</span><span class="s2">(). Don't do that."</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</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="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">() received an invalid keyword </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span>
|
|
|
|
<span class="c1"># name and suffix are mutually exclusive</span>
|
|
<span class="k">if</span> <span class="s1">'name'</span> <span class="ow">in</span> <span class="n">initkwargs</span> <span class="ow">and</span> <span class="s1">'suffix'</span> <span class="ow">in</span> <span class="n">initkwargs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">() received both `name` and `suffix`, which are "</span>
|
|
<span class="s2">"mutually exclusive arguments."</span> <span class="o">%</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">view</span><span class="p">(</span><span class="n">request</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="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">initkwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="s1">'get'</span> <span class="ow">in</span> <span class="n">actions</span> <span class="ow">and</span> <span class="s1">'head'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
|
|
<span class="n">actions</span><span class="p">[</span><span class="s1">'head'</span><span class="p">]</span> <span class="o">=</span> <span class="n">actions</span><span class="p">[</span><span class="s1">'get'</span><span class="p">]</span>
|
|
|
|
<span class="c1"># We also store the mapping of request methods to actions,</span>
|
|
<span class="c1"># so that we can later set the action attribute.</span>
|
|
<span class="c1"># eg. `self.action = 'list'` on an incoming GET request.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">action_map</span> <span class="o">=</span> <span class="n">actions</span>
|
|
|
|
<span class="c1"># Bind methods to actions</span>
|
|
<span class="c1"># This is the bit that's different to a standard view</span>
|
|
<span class="k">for</span> <span class="n">method</span><span class="p">,</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="n">handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">)</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
|
|
|
|
<span class="c1"># And continue as usual</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="n">request</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="c1"># take name and docstring from class</span>
|
|
<span class="n">update_wrapper</span><span class="p">(</span><span class="n">view</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">updated</span><span class="o">=</span><span class="p">())</span>
|
|
|
|
<span class="c1"># and possible attributes set by decorators</span>
|
|
<span class="c1"># like csrf_exempt from dispatch</span>
|
|
<span class="n">update_wrapper</span><span class="p">(</span><span class="n">view</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">dispatch</span><span class="p">,</span> <span class="n">assigned</span><span class="o">=</span><span class="p">())</span>
|
|
|
|
<span class="c1"># We need to set these on the view function, so that breadcrumb</span>
|
|
<span class="c1"># generation can pick out these bits of information from a</span>
|
|
<span class="c1"># resolved URL.</span>
|
|
<span class="n">view</span><span class="o">.</span><span class="n">cls</span> <span class="o">=</span> <span class="bp">cls</span>
|
|
<span class="n">view</span><span class="o">.</span><span class="n">initkwargs</span> <span class="o">=</span> <span class="n">initkwargs</span>
|
|
<span class="n">view</span><span class="o">.</span><span class="n">actions</span> <span class="o">=</span> <span class="n">actions</span>
|
|
<span class="k">return</span> <span class="n">csrf_exempt</span><span class="p">(</span><span class="n">view</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">initialize_request</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">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">"""</span>
|
|
<span class="sd"> Set the `.action` attribute on the view, depending on the request method.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">request</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">initialize_request</span><span class="p">(</span><span class="n">request</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="n">method</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">method</span> <span class="o">==</span> <span class="s1">'options'</span><span class="p">:</span>
|
|
<span class="c1"># This is a special case as we always provide handling for the</span>
|
|
<span class="c1"># options method in the base `View` class.</span>
|
|
<span class="c1"># Unlike the other explicitly defined actions, 'metadata' is implicit.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">=</span> <span class="s1">'metadata'</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">action_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">method</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">request</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">reverse_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url_name</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">"""</span>
|
|
<span class="sd"> Reverse the action for the given `url_name`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">url_name</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">-</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">basename</span><span class="p">,</span> <span class="n">url_name</span><span class="p">)</span>
|
|
<span class="n">namespace</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">resolver_match</span><span class="p">:</span>
|
|
<span class="n">namespace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">resolver_match</span><span class="o">.</span><span class="n">namespace</span>
|
|
<span class="k">if</span> <span class="n">namespace</span><span class="p">:</span>
|
|
<span class="n">url_name</span> <span class="o">=</span> <span class="n">namespace</span> <span class="o">+</span> <span class="s1">':'</span> <span class="o">+</span> <span class="n">url_name</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'request'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="n">url_name</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="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">get_extra_actions</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get the methods that are marked as an extra ViewSet `@action`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">_check_attr_name</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">method</span>
|
|
<span class="ow">in</span> <span class="n">getmembers</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">_is_extra_action</span><span class="p">)]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">get_extra_action_url_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Build a map of {names: urls} for the extra actions.</span>
|
|
|
|
<span class="sd"> This method will noop if `detail` was not provided as a view initkwarg.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">action_urls</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="c1"># exit early if `detail` has not been provided</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">detail</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">action_urls</span>
|
|
|
|
<span class="c1"># filter for the relevant extra actions</span>
|
|
<span class="n">actions</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="n">action</span> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_extra_actions</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">detail</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">detail</span>
|
|
<span class="p">]</span>
|
|
|
|
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">url_name</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">-</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">basename</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">url_name</span><span class="p">)</span>
|
|
<span class="n">namespace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">resolver_match</span><span class="o">.</span><span class="n">namespace</span>
|
|
<span class="k">if</span> <span class="n">namespace</span><span class="p">:</span>
|
|
<span class="n">url_name</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">:</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">url_name</span><span class="p">)</span>
|
|
|
|
<span class="n">url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">url_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</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="n">request</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">)</span>
|
|
<span class="n">view</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="o">**</span><span class="n">action</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="n">action_urls</span><span class="p">[</span><span class="n">view</span><span class="o">.</span><span class="n">get_view_name</span><span class="p">()]</span> <span class="o">=</span> <span class="n">url</span>
|
|
<span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
<span class="k">pass</span> <span class="c1"># URL requires additional arguments, ignore</span>
|
|
|
|
<span class="k">return</span> <span class="n">action_urls</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ViewSet</span><span class="p">(</span><span class="n">ViewSetMixin</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">APIView</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> The base ViewSet class does not provide any actions by default.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">GenericViewSet</span><span class="p">(</span><span class="n">ViewSetMixin</span><span class="p">,</span> <span class="n">generics</span><span class="o">.</span><span class="n">GenericAPIView</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> The GenericViewSet class does not provide any actions by default,</span>
|
|
<span class="sd"> but does include the base set of generic view behavior, such as</span>
|
|
<span class="sd"> the `get_object` and `get_queryset` methods.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ReadOnlyModelViewSet</span><span class="p">(</span><span class="n">mixins</span><span class="o">.</span><span class="n">RetrieveModelMixin</span><span class="p">,</span>
|
|
<span class="n">mixins</span><span class="o">.</span><span class="n">ListModelMixin</span><span class="p">,</span>
|
|
<span class="n">GenericViewSet</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A viewset that provides default `list()` and `retrieve()` actions.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">pass</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ModelViewSet">
|
|
<a class="viewcode-back" href="../../api/evennia.web.api.views.html#evennia.web.api.views.ModelViewSet">[docs]</a>
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">ModelViewSet</span><span class="p">(</span><span class="n">mixins</span><span class="o">.</span><span class="n">CreateModelMixin</span><span class="p">,</span>
|
|
<span class="n">mixins</span><span class="o">.</span><span class="n">RetrieveModelMixin</span><span class="p">,</span>
|
|
<span class="n">mixins</span><span class="o">.</span><span class="n">UpdateModelMixin</span><span class="p">,</span>
|
|
<span class="n">mixins</span><span class="o">.</span><span class="n">DestroyModelMixin</span><span class="p">,</span>
|
|
<span class="n">mixins</span><span class="o">.</span><span class="n">ListModelMixin</span><span class="p">,</span>
|
|
<span class="n">GenericViewSet</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> A viewset that provides default `create()`, `retrieve()`, `update()`,</span>
|
|
<span class="sd"> `partial_update()`, `destroy()` and `list()` actions.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">rest_framework.viewsets</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2024, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
|
</div>
|
|
</body>
|
|
</html> |