mirror of
https://github.com/evennia/evennia.git
synced 2026-03-25 17:26:32 +01:00
266 lines
No EOL
19 KiB
HTML
266 lines
No EOL
19 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>evennia.accounts.models — Evennia 1.0-dev documentation</title>
|
|
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
|
|
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
|
|
<script src="../../../_static/jquery.js"></script>
|
|
<script src="../../../_static/underscore.js"></script>
|
|
<script src="../../../_static/doctools.js"></script>
|
|
<script src="../../../_static/language_data.js"></script>
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
|
|
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
|
|
|
</head><body>
|
|
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
|
|
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.accounts.models</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">Account</span>
|
|
|
|
<span class="sd">The account class is an extension of the default Django user class,</span>
|
|
<span class="sd">and is customized for the needs of Evennia.</span>
|
|
|
|
<span class="sd">We use the Account to store a more mud-friendly style of permission</span>
|
|
<span class="sd">system as well as to allow the admin more flexibility by storing</span>
|
|
<span class="sd">attributes on the Account. Within the game we should normally use the</span>
|
|
<span class="sd">Account manager's methods to create users so that permissions are set</span>
|
|
<span class="sd">correctly.</span>
|
|
|
|
<span class="sd">To make the Account model more flexible for your own game, it can also</span>
|
|
<span class="sd">persistently store attributes of its own. This is ideal for extra</span>
|
|
<span class="sd">account info and OOC account configuration variables etc.</span>
|
|
|
|
<span class="sd">"""</span>
|
|
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
|
|
<span class="kn">from</span> <span class="nn">django.db</span> <span class="k">import</span> <span class="n">models</span>
|
|
<span class="kn">from</span> <span class="nn">django.contrib.auth.models</span> <span class="k">import</span> <span class="n">AbstractUser</span>
|
|
<span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="k">import</span> <span class="n">smart_str</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">evennia.accounts.manager</span> <span class="k">import</span> <span class="n">AccountDBManager</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="k">import</span> <span class="n">TypedObject</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">make_iter</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.server.signals</span> <span class="k">import</span> <span class="n">SIGNAL_ACCOUNT_POST_RENAME</span>
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"AccountDB"</span><span class="p">,)</span>
|
|
|
|
<span class="c1"># _ME = _("me")</span>
|
|
<span class="c1"># _SELF = _("self")</span>
|
|
|
|
<span class="n">_MULTISESSION_MODE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">MULTISESSION_MODE</span>
|
|
|
|
<span class="n">_GA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span>
|
|
<span class="n">_SA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__setattr__</span>
|
|
<span class="n">_DA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__delattr__</span>
|
|
|
|
<span class="n">_TYPECLASS</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># AccountDB</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># ------------------------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="AccountDB"><a class="viewcode-back" href="../../../api/evennia.accounts.html#evennia.accounts.admin.AccountDB">[docs]</a><span class="k">class</span> <span class="nc">AccountDB</span><span class="p">(</span><span class="n">TypedObject</span><span class="p">,</span> <span class="n">AbstractUser</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This is a special model using Django's 'profile' functionality</span>
|
|
<span class="sd"> and extends the default Django User model. It is defined as such</span>
|
|
<span class="sd"> by use of the variable AUTH_PROFILE_MODULE in the settings.</span>
|
|
<span class="sd"> One accesses the fields/methods. We try use this model as much</span>
|
|
<span class="sd"> as possible rather than User, since we can customize this to</span>
|
|
<span class="sd"> our liking.</span>
|
|
|
|
<span class="sd"> The TypedObject supplies the following (inherited) properties:</span>
|
|
|
|
<span class="sd"> - key - main name</span>
|
|
<span class="sd"> - typeclass_path - the path to the decorating typeclass</span>
|
|
<span class="sd"> - typeclass - auto-linked typeclass</span>
|
|
<span class="sd"> - date_created - time stamp of object creation</span>
|
|
<span class="sd"> - permissions - perm strings</span>
|
|
<span class="sd"> - dbref - #id of object</span>
|
|
<span class="sd"> - db - persistent attribute storage</span>
|
|
<span class="sd"> - ndb - non-persistent attribute storage</span>
|
|
|
|
<span class="sd"> The AccountDB adds the following properties:</span>
|
|
|
|
<span class="sd"> - is_connected - If any Session is currently connected to this Account</span>
|
|
<span class="sd"> - name - alias for user.username</span>
|
|
<span class="sd"> - sessions - sessions connected to this account</span>
|
|
<span class="sd"> - is_superuser - bool if this account is a superuser</span>
|
|
<span class="sd"> - is_bot - bool if this account is a bot and not a real account</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># AccountDB Database model setup</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># inherited fields (from TypedObject):</span>
|
|
<span class="c1"># db_key, db_typeclass_path, db_date_created, db_permissions</span>
|
|
|
|
<span class="c1"># store a connected flag here too, not just in sessionhandler.</span>
|
|
<span class="c1"># This makes it easier to track from various out-of-process locations</span>
|
|
<span class="n">db_is_connected</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">False</span><span class="p">,</span>
|
|
<span class="n">verbose_name</span><span class="o">=</span><span class="s2">"is_connected"</span><span class="p">,</span>
|
|
<span class="n">help_text</span><span class="o">=</span><span class="s2">"If player is connected to game or not"</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># database storage of persistant cmdsets.</span>
|
|
<span class="n">db_cmdset_storage</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="s2">"cmdset"</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">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="s2">"optional python path to a cmdset class. If creating a Character, this will default to settings.CMDSET_CHARACTER."</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># marks if this is a "virtual" bot account object</span>
|
|
<span class="n">db_is_bot</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">False</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="s2">"is_bot"</span><span class="p">,</span> <span class="n">help_text</span><span class="o">=</span><span class="s2">"Used to identify irc/rss bots"</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># Database manager</span>
|
|
<span class="n">objects</span> <span class="o">=</span> <span class="n">AccountDBManager</span><span class="p">()</span>
|
|
|
|
<span class="c1"># defaults</span>
|
|
<span class="n">__defaultclasspath__</span> <span class="o">=</span> <span class="s2">"evennia.accounts.accounts.DefaultAccount"</span>
|
|
<span class="n">__applabel__</span> <span class="o">=</span> <span class="s2">"accounts"</span>
|
|
<span class="n">__settingsclasspath__</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span>
|
|
|
|
<span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="n">verbose_name</span> <span class="o">=</span> <span class="s2">"Account"</span>
|
|
|
|
<span class="c1"># cmdset_storage property</span>
|
|
<span class="c1"># This seems very sensitive to caching, so leaving it be for now /Griatch</span>
|
|
<span class="c1"># @property</span>
|
|
<span class="k">def</span> <span class="nf">__cmdset_storage_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Getter. Allows for value = self.name. Returns a list of cmdset_storage.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">storage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_cmdset_storage</span>
|
|
<span class="c1"># we need to check so storage is not None</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">path</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">storage</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">","</span><span class="p">)]</span> <span class="k">if</span> <span class="n">storage</span> <span class="k">else</span> <span class="p">[]</span>
|
|
|
|
<span class="c1"># @cmdset_storage.setter</span>
|
|
<span class="k">def</span> <span class="nf">__cmdset_storage_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Setter. Allows for self.name = value. Stores as a comma-separated</span>
|
|
<span class="sd"> string.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">_SA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"db_cmdset_storage"</span><span class="p">,</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
|
|
<span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"save"</span><span class="p">)()</span>
|
|
|
|
<span class="c1"># @cmdset_storage.deleter</span>
|
|
<span class="k">def</span> <span class="nf">__cmdset_storage_del</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Deleter. Allows for del self.name"</span>
|
|
<span class="n">_SA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"db_cmdset_storage"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"save"</span><span class="p">)()</span>
|
|
|
|
<span class="n">cmdset_storage</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__cmdset_storage_get</span><span class="p">,</span> <span class="n">__cmdset_storage_set</span><span class="p">,</span> <span class="n">__cmdset_storage_del</span><span class="p">)</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># property/field access</span>
|
|
<span class="c1">#</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">smart_str</span><span class="p">(</span><span class="n">f</span><span class="s2">"</span><span class="si">{self.name}</span><span class="s2">(account </span><span class="si">{self.dbid}</span><span class="s2">)"</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">f</span><span class="s2">"</span><span class="si">{self.name}</span><span class="s2">(account#</span><span class="si">{self.dbid}</span><span class="s2">)"</span>
|
|
|
|
<span class="c1"># @property</span>
|
|
<span class="k">def</span> <span class="nf">__username_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__username_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="n">old_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">value</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">"username"</span><span class="p">])</span>
|
|
<span class="n">SIGNAL_ACCOUNT_POST_RENAME</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="o">=</span><span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__username_del</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span>
|
|
|
|
<span class="c1"># aliases</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__username_get</span><span class="p">,</span> <span class="n">__username_set</span><span class="p">,</span> <span class="n">__username_del</span><span class="p">)</span>
|
|
<span class="n">key</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__username_get</span><span class="p">,</span> <span class="n">__username_set</span><span class="p">,</span> <span class="n">__username_del</span><span class="p">)</span>
|
|
|
|
<span class="c1"># @property</span>
|
|
<span class="k">def</span> <span class="nf">__uid_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Getter. Retrieves the user id"</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__uid_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User id cannot be set!"</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">__uid_del</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User id cannot be deleted!"</span><span class="p">)</span>
|
|
|
|
<span class="n">uid</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">__uid_get</span><span class="p">,</span> <span class="n">__uid_set</span><span class="p">,</span> <span class="n">__uid_del</span><span class="p">)</span></div>
|
|
</pre></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<div 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" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script>$('#searchbox').show(0);</script><div class="relations">
|
|
<h3>Related Topics</h3>
|
|
<ul>
|
|
<li><a href="../../../index.html">Documentation overview</a><ul>
|
|
<li><a href="../../index.html">Module code</a><ul>
|
|
<li><a href="../../evennia.html">evennia</a><ul>
|
|
</ul></li>
|
|
</ul></li>
|
|
</ul></li>
|
|
</ul>
|
|
</div>
|
|
<h3>Versions</h3>
|
|
<ul>
|
|
<li><a href="models.html">1.0-dev (develop branch)</a></li>
|
|
<li><a href="../../../../../versions/0.9.1/index.html">0.9.1 (master branch)</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="footer">
|
|
©2020, The Evennia developer community.
|
|
|
|
|
|
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.4.4</a>
|
|
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html> |