diff options
| author | gbrandl <devnull@localhost> | 2007-02-14 17:18:40 +0100 |
|---|---|---|
| committer | gbrandl <devnull@localhost> | 2007-02-14 17:18:40 +0100 |
| commit | 3e1463ced2669526d6c1ea5cc7748438367c2847 (patch) | |
| tree | da8e5b61674c372d5e70a082ba4423c3aff9dd66 /tests/examplefiles/test.html | |
| parent | 0fa948e73c48996de904aeb2f0e4990fc40385ec (diff) | |
| download | pygments-3e1463ced2669526d6c1ea5cc7748438367c2847.tar.gz | |
[svn] Shorten some testfiles, silence some pylint warnings,
add a latex formatter unittest.
Diffstat (limited to 'tests/examplefiles/test.html')
| -rw-r--r-- | tests/examplefiles/test.html | 1668 |
1 files changed, 0 insertions, 1668 deletions
diff --git a/tests/examplefiles/test.html b/tests/examplefiles/test.html index 72cba437..ea723232 100644 --- a/tests/examplefiles/test.html +++ b/tests/examplefiles/test.html @@ -1119,1671 +1119,3 @@ pre.syntax { padding: 5px; margin-top: 0px; } <span class="kw">else</span>: <span class="kw">raise</span> <span class="name">PocooRuntimeError</span>(<span class="st st-sg">'</span><span class="st">req.cache_control invalid</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">resp</span> - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.captcha - ~~~~~~~~~~~~~~~~~~~~~~ - - Captcha URL Handler. - - Displays a random captcha picture (debugging only). - - :copyright: 2006-2007 by Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">RequestHandler</span> -<span class="kw">from </span><span class="cls">pocoo.http</span><span class="kw"> import</span> <span class="name">Response</span> - - -<span class="kw">class </span><span class="cls">CaptchaImage</span>(<span class="name">RequestHandler</span>): - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">'</span><span class="st">!captcha$</span><span class="st st-sg">'</span>] - - <span class="kw">def </span><span class="fun">handle_request</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="kw">from </span><span class="cls">pocoo.utils.captcha</span><span class="kw"> import</span> <span class="name">Captcha</span> - - <span class="name">c</span> <span class="op">=</span> <span class="name">Captcha</span>() - <span class="name">response</span> <span class="op">=</span> <span class="name">Response</span>(<span class="name">c</span>.<span class="name">generate_image</span>()) - <span class="name">response</span>[<span class="st st-sg">'</span><span class="st">Content-Type</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="st st-sg">'</span><span class="st">image/png</span><span class="st st-sg">'</span> - - <span class="kw">return</span> <span class="name">response</span> -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.cobalt - ~~~~~~~~~~~~~~~~~~~~~ - - Provides static content serving like mozilla's chrome:// scheme. - - :copyright: 2006-2007 by Armin Ronacher, Georg Brandl. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">os</span> -<span class="kw">import </span><span class="cls">time</span> - -<span class="kw">from </span><span class="cls">mimetypes</span><span class="kw"> import</span> <span class="name">guess_type</span> -<span class="kw">from </span><span class="cls">pocoo.template</span><span class="kw"> import</span> <span class="name">FileRequirements</span> - - -<span class="kw">class </span><span class="cls">CobaltMiddleware</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - - The Cobalt middleware serves static files. - </span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">app</span>, <span class="name">ctx</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">app</span> <span class="op">=</span> <span class="name">app</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span> <span class="op">=</span> <span class="name">ctx</span> - <span class="bn bn-pseudo">self</span>.<span class="name">cache_enabled</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">get_bool</span>(<span class="st st-sg">'</span><span class="st">cache</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">static_cache</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_stylesheet_imports</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">cache_enabled</span> <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">cobalt/stylesheet_imports</span><span class="st st-sg">'</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>: - <span class="name">handled</span> <span class="op">=</span> <span class="name">set</span>() - <span class="name">lines</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">FileRequirements</span>): - <span class="kw">for</span> <span class="name">name</span> <span class="op op-word">in</span> <span class="name">comp</span>.<span class="name">get_stylesheet_imports</span>(): - <span class="name">item</span> <span class="op">=</span> (<span class="name">comp</span>.<span class="name">package</span>, <span class="name">name</span>) - <span class="kw">if</span> <span class="name">item</span> <span class="op op-word">in</span> <span class="name">handled</span>: - <span class="kw">continue</span> - - <span class="name">handled</span>.<span class="name">add</span>(<span class="name">item</span>) - <span class="name">url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">!cobalt/</span><span class="st st-int">%s</span><span class="st">/</span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">item</span> - - <span class="name">lines</span>.<span class="name">append</span>(<span class="st st-sg">'</span><span class="st">@import url(</span><span class="st st-int">%s</span><span class="st">);</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn">str</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">url</span>))) - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>[<span class="st st-sg">'</span><span class="st">cobalt/stylesheet_imports</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="st st-sg">'</span><span class="st st-esc">\n</span><span class="st st-sg">'</span>.<span class="name">join</span>(<span class="name">lines</span>) - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>[<span class="st st-sg">'</span><span class="st">cobalt/stylesheet_imports</span><span class="st st-sg">'</span>] - - <span class="kw">def </span><span class="fun">get_javascript_imports</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">cache_enabled</span> <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">cobalt/javascript_imports</span><span class="st st-sg">'</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>: - <span class="name">handled</span> <span class="op">=</span> <span class="name">set</span>() - <span class="name">lines</span> <span class="op">=</span> [] - <span class="name">onload</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">FileRequirements</span>): - <span class="kw">for</span> <span class="name">name</span> <span class="op op-word">in</span> <span class="name">comp</span>.<span class="name">get_javascript_imports</span>(): - <span class="name">item</span> <span class="op">=</span> (<span class="name">comp</span>.<span class="name">package</span>, <span class="name">name</span>) - <span class="kw">if</span> <span class="name">item</span> <span class="op op-word">in</span> <span class="name">handled</span>: - <span class="kw">continue</span> - - <span class="name">handled</span>.<span class="name">add</span>(<span class="name">item</span>) - <span class="name">imp</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">pkgmanager</span>.<span class="name">importers</span>[<span class="name">comp</span>.<span class="name">package</span>] - <span class="name">lines</span>.<span class="name">append</span>(<span class="name">imp</span>.<span class="name">get_data</span>(<span class="name">os</span>.<span class="name">path</span>.<span class="name">join</span>(<span class="st st-sg">'</span><span class="st">static</span><span class="st st-sg">'</span>, <span class="name">name</span>))) - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>[<span class="st st-sg">'</span><span class="st">cobalt/javascript_imports</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="st st-sg">'</span><span class="st st-esc">\n\n</span><span class="st st-sg">'</span>.<span class="name">join</span>(<span class="name">lines</span>) - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">_cache</span>[<span class="st st-sg">'</span><span class="st">cobalt/javascript_imports</span><span class="st st-sg">'</span>] - - <span class="kw">def </span><span class="fun">__call__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">environ</span>, <span class="name">start_response</span>): - <span class="name">path</span> <span class="op">=</span> <span class="name">environ</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">PATH_INFO</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">/</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">path</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">/!cobalt/</span><span class="st st-sg">'</span>): - <span class="name">mime_type</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">try</span>: - <span class="name">pkgname</span>, <span class="name">fname</span> <span class="op">=</span> <span class="name">path</span>[<span class="nb nb-int">9</span>:].<span class="name">split</span>(<span class="st st-sg">'</span><span class="st">/</span><span class="st st-sg">'</span>, <span class="nb nb-int">1</span>) - <span class="kw">if</span> <span class="name">pkgname</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">_import_</span><span class="st st-sg">'</span>: - <span class="kw">if</span> <span class="name">fname</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">styles.css</span><span class="st st-sg">'</span>: - <span class="name">mime_type</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">text/css</span><span class="st st-sg">'</span> - - <span class="name">content</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">get_stylesheet_imports</span>() - <span class="kw">elif</span> <span class="name">fname</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">script.js</span><span class="st st-sg">'</span>: - <span class="name">mime_type</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">application/x-javascript</span><span class="st st-sg">'</span> - - <span class="name">content</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">get_javascript_imports</span>() - <span class="kw">else</span>: - <span class="name">guessed_type</span> <span class="op">=</span> <span class="name">guess_type</span>(<span class="name">fname</span>) - <span class="name">mime_type</span> <span class="op">=</span> <span class="name">guessed_type</span>[<span class="nb nb-int">0</span>] <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">text/plain</span><span class="st st-sg">'</span> - - <span class="name">imp</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">pkgmanager</span>.<span class="name">importers</span>[<span class="name">pkgname</span>] - <span class="name">content</span> <span class="op">=</span> <span class="name">imp</span>.<span class="name">get_data</span>(<span class="name">os</span>.<span class="name">path</span>.<span class="name">join</span>(<span class="st st-sg">'</span><span class="st">static</span><span class="st st-sg">'</span>, <span class="name">fname</span>)) - <span class="kw">if</span> <span class="name">mime_type</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">expiry</span> <span class="op">=</span> <span class="name">time</span>.<span class="name">time</span>() <span class="op">+</span> <span class="nb nb-int">3600</span> <span class="cm"># cache for one hour</span> - - <span class="name">expiry</span> <span class="op">=</span> <span class="name">time</span>.<span class="name">asctime</span>(<span class="name">time</span>.<span class="name">gmtime</span>(<span class="name">expiry</span>)) - <span class="name">headers</span> <span class="op">=</span> [(<span class="st st-sg">'</span><span class="st">Content-Type</span><span class="st st-sg">'</span>, <span class="name">mime_type</span>), - (<span class="st st-sg">'</span><span class="st">Cache-Control</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">public</span><span class="st st-sg">'</span>), - (<span class="st st-sg">'</span><span class="st">Expires</span><span class="st st-sg">'</span>, <span class="name">expiry</span>)] - <span class="name">start_response</span>(<span class="st st-sg">'</span><span class="st">200 OK</span><span class="st st-sg">'</span>, <span class="name">headers</span>) - <span class="kw">if</span> <span class="name">environ</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">REQUEST_METHOD</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">GET</span><span class="st st-sg">'</span>) <span class="op">==</span> <span class="st st-sg">'</span><span class="st">HEAD</span><span class="st st-sg">'</span>: - <span class="kw">return</span> [] - <span class="kw">else</span>: - <span class="kw">return</span> [<span class="name">content</span>] - <span class="kw">except</span> (<span class="exc">ValueError</span>, <span class="exc">KeyError</span>, <span class="exc">IOError</span>): - <span class="cm"># XXX: output custom error message?</span> - - <span class="kw">pass</span> - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">app</span>(<span class="name">environ</span>, <span class="name">start_response</span>) -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - - pocoo.pkg.core.db - ~~~~~~~~~~~~~~~~~ - - Pocoo core database definition. - - :copyright: 2006-2007 by Armin Ronacher, Georg Brandl. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">from </span><span class="cls">pocoo.db</span><span class="kw"> import</span> <span class="name">meta</span>, <span class="name">DatabaseObserver</span> - - -<span class="name">ANONYMOUS_USER_ID</span> <span class="op">=</span> <span class="op">-</span><span class="nb nb-int">1</span> - -<span class="name">DEFAULT_USER_ID</span> <span class="op">=</span> <span class="nb nb-int">0</span> - - -<span class="name">sessions</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_sessions</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">session_key</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">40</span>), <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">ip_addr</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">15</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">expires</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">DateTime</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">last_reload</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">DateTime</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">data</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Pickled</span>(<span class="bn">dict</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">action</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>), -) - - -<span class="name">users</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_users</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">subject_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_subjects.subject_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">40</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">250</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">pwhash</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">60</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">act_key</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">8</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">language</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">2</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Pickled</span>(<span class="bn">dict</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">settings</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Pickled</span>(<span class="bn">dict</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">last_login</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">DateTime</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">DateTime</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">read_threads</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Binary</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">read_posts</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Binary</span>), -) - - -<span class="name">groups</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_groups</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">group_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">subject_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_subjects.subject_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">40</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">public</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Boolean</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">hidden</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Boolean</span>) -) - - -<span class="name">group_members</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_group_members</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_users.user_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">group_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_groups.group_id</span><span class="st st-sg">'</span>)) -) - - -<span class="name">forums</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_forums</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_forums.forum_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_objects.object_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">100</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">position</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">100</span>)), - <span class="cm">#XXX: foreign key doesn't work</span> - - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">last_post_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">thread_count</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>) -) - - -<span class="name">posts</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_posts</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_forums.forum_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_posts.post_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_posts.post_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_objects.object_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">view_count</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">author_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_users.user_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">200</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">200</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">DateTime</span>) -) - - -<span class="name">privileges</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_privileges</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">priv_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Unicode</span>(<span class="nb nb-int">100</span>)) -) - - -<span class="name">acl_mapping</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_acl_mapping</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">priv_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_privileges.priv_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">subject_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_subjects.subject_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, - <span class="name">meta</span>.<span class="name">ForeignKey</span>(<span class="st st-sg">'</span><span class="st">core_acl_objects.object_id</span><span class="st st-sg">'</span>)), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">state</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>) -) - - -<span class="name">acl_subjects</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_acl_subjects</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">subject_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">subject_type</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">String</span>(<span class="nb nb-int">10</span>)) -) - - -<span class="name">acl_objects</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">Table</span>(<span class="st st-sg">'</span><span class="st">core_acl_objects</span><span class="st st-sg">'</span>, - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">Integer</span>, <span class="name">primary_key</span><span class="op">=</span><span class="bn bn-pseudo">True</span>), - <span class="name">meta</span>.<span class="name">Column</span>(<span class="st st-sg">'</span><span class="st">object_type</span><span class="st st-sg">'</span>, <span class="name">meta</span>.<span class="name">String</span>(<span class="nb nb-int">10</span>)) -) - - -<span class="name">acl_subject_join</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">polymorphic_union</span>({ - <span class="st st-sg">'</span><span class="st">user</span><span class="st st-sg">'</span>: <span class="name">users</span>, - <span class="st st-sg">'</span><span class="st">group</span><span class="st st-sg">'</span>: <span class="name">groups</span> -}, <span class="st st-sg">'</span><span class="st">subject_type</span><span class="st st-sg">'</span>) - - -<span class="name">acl_object_join</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">polymorphic_union</span>({ - <span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>: <span class="name">forums</span>, - <span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>: <span class="name">posts</span> -}, <span class="st st-sg">'</span><span class="st">object_type</span><span class="st st-sg">'</span>) - - -<span class="kw">class </span><span class="cls">CoreTableObserver</span>(<span class="name">DatabaseObserver</span>): - - <span class="kw">def </span><span class="fun">after_table_creation</span>(<span class="bn bn-pseudo">self</span>, <span class="name">table</span>): - <span class="kw">if</span> <span class="name">table</span> <span class="op op-word">is</span> <span class="name">users</span>: - <span class="name">e</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span> - - <span class="name">e</span>(<span class="name">users</span>.<span class="name">insert</span>(), <span class="name">user_id</span><span class="op">=</span><span class="name">ANONYMOUS_USER_ID</span>, <span class="name">username</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">anonymous</span><span class="st st-sg">'</span>) - <span class="name">e</span>(<span class="name">users</span>.<span class="name">insert</span>(), <span class="name">user_id</span><span class="op">=</span><span class="name">DEFAULT_USER_ID</span>, <span class="name">username</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">default</span><span class="st st-sg">'</span>) - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.feeds - ~~~~~~~~~~~~~~~~~~~~ - - Provides RSS Feeds. - - :copyright: 2006-2007 by Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">from </span><span class="cls">pocoo</span><span class="kw"> import</span> <span class="name">Component</span> -<span class="kw">from </span><span class="cls">pocoo.http</span><span class="kw"> import</span> <span class="name">PageNotFound</span>, <span class="name">Response</span> - -<span class="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">RequestHandler</span> -<span class="kw">from </span><span class="cls">pocoo.db</span><span class="kw"> import</span> <span class="name">meta</span> -<span class="kw">from </span><span class="cls">pocoo.utils.feed</span><span class="kw"> import</span> <span class="name">Feed</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.db</span><span class="kw"> import</span> <span class="name">forums</span>, <span class="name">posts</span>, <span class="name">users</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.textfmt</span><span class="kw"> import</span> <span class="name">parse_and_render</span> - - -<span class="kw">class </span><span class="cls">FeedProvider</span>(<span class="name">Component</span>): - <span class="cm">#: identifier for this feed. must be lowercase</span> - <span class="name">identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">unknown</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_feed</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">parameter</span>): - <span class="st st-db">"""</span><span class="st"> - Return a dict in the following form:: - - {'title': 'Title of this feed', - 'description': 'Description of this feed', - 'items': [{ - 'title': 'title of this item', - 'link': 'relative link of this item', - 'author': 'author of this item', - 'description': 'description of this item', - 'pub_date': 'date of this item' - - }]} - - Can raise a `FeedNotFound` exception. - </span><span class="st st-db">"""</span> - - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">url</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">feeds/</span><span class="st st-int">%s</span><span class="st">.xml</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">identifier</span>) - - - -<span class="kw">class </span><span class="cls">FeedNotFound</span>(<span class="exc">Exception</span>): - <span class="kw">pass</span> - - -<span class="kw">class </span><span class="cls">ThreadFeed</span>(<span class="name">FeedProvider</span>): - <span class="name">identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">thread</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_feed</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>): - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">try</span>: - <span class="name">post_id</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">post_id</span>) - <span class="kw">except</span>: - <span class="kw">raise</span> <span class="name">FeedNotFound</span>() - <span class="name">row</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span>], - (<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) - )).<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">raise</span> <span class="name">FeedNotFound</span>() - <span class="name">root_post_id</span> <span class="op">=</span> <span class="name">row</span>[<span class="nb nb-int">0</span>] - <span class="cm"># select data</span> - - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>( - [<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">title</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">text</span>, - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">timestamp</span>, <span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span>], - (<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">posts</span>.<span class="name">c</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="nb nb-int">10</span> - - )) - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Last Posts in Thread </span><span class="st st-int">%d</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">root_post_id</span>, - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The last 10 posts in Thread </span><span class="st st-int">%d</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">root_post_id</span>, - <span class="st st-sg">'</span><span class="st">items</span><span class="st st-sg">'</span>: [{ - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">post/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]), - <span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">pub_date</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>] - } <span class="kw">for</span> <span class="name">post</span> <span class="op op-word">in</span> <span class="name">result</span>] - } - - - -<span class="kw">class </span><span class="cls">ForumFeed</span>(<span class="name">FeedProvider</span>): - <span class="name">identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_feed</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">forum_id</span>): - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">try</span>: - <span class="name">forum_id</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">forum_id</span>) - <span class="kw">except</span>: - <span class="kw">raise</span> <span class="name">FeedNotFound</span>() - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span>], - (<span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">forum_id</span>) - )).<span class="name">fetchone</span>() <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">raise</span> <span class="name">FeedNotFound</span>() - <span class="cm"># select data</span> - - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>( - [<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">title</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">text</span>, - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">timestamp</span>, <span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span>], - (<span class="name">posts</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">forum_id</span>) <span class="op">&</span> - - (<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">posts</span>.<span class="name">c</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="nb nb-int">10</span> - - )) - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Last Posts in Forum </span><span class="st st-int">%d</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">forum_id</span>, - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The last 10 posts of forum </span><span class="st st-int">%d</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">forum_id</span>, - <span class="st st-sg">'</span><span class="st">items</span><span class="st st-sg">'</span>: [{ - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">post/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]), - <span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">pub_date</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>] - } <span class="kw">for</span> <span class="name">post</span> <span class="op op-word">in</span> <span class="name">result</span>] - } - - - -<span class="kw">class </span><span class="cls">RecentChangesFeed</span>(<span class="name">FeedProvider</span>): - <span class="name">identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">recent</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_title</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Recent Changes</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_description</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The recent posts</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_feed</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">parameter</span>): - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">if</span> <span class="name">parameter</span>: - <span class="kw">raise</span> <span class="name">FeedNotFound</span>() - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>( - [<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">title</span>, <span class="name">posts</span>.<span class="name">c</span>.<span class="name">text</span>, - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">timestamp</span>, <span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span>], - (<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">posts</span>.<span class="name">c</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="nb nb-int">10</span> - - )) - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Recent Changes</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The most recent posts</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">items</span><span class="st st-sg">'</span>: [{ - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">post/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>: <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]), - <span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">pub_date</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>] - } <span class="kw">for</span> <span class="name">post</span> <span class="op op-word">in</span> <span class="name">result</span>] - } - - - -<span class="kw">class </span><span class="cls">FeedDisplay</span>(<span class="name">RequestHandler</span>): - <span class="name">handler_regexes</span> <span class="op">=</span> [ - <span class="st st-sg">r'</span><span class="st">^feeds/(?P<feed>[a-z0-9_-]+)\.xml$</span><span class="st st-sg">'</span>, - <span class="st st-sg">r'</span><span class="st">^feeds/(?P<feed>[a-z0-9_-]+)/(?P<parameter>.+)\.xml$</span><span class="st st-sg">'</span> - - ] - - <span class="kw">def </span><span class="fun">handle_request</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">feed</span>, <span class="name">parameter</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="kw">for</span> <span class="name">feed_provider</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">FeedProvider</span>): - <span class="kw">if</span> <span class="name">feed_provider</span>.<span class="name">identifier</span> <span class="op">==</span> <span class="name">feed</span>: - <span class="name">data</span> <span class="op">=</span> <span class="name">feed_provider</span>.<span class="name">get_feed</span>(<span class="name">req</span>, <span class="name">parameter</span>) - <span class="name">feed</span> <span class="op">=</span> <span class="name">Feed</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">data</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="name">data</span>[<span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>], - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">make_external_url</span>(<span class="st st-sg">''</span>)) - <span class="kw">try</span>: - <span class="kw">for</span> <span class="name">item</span> <span class="op op-word">in</span> <span class="name">data</span>[<span class="st st-sg">'</span><span class="st">items</span><span class="st st-sg">'</span>]: - <span class="name">feed</span>.<span class="name">add_item</span>(<span class="op">**</span><span class="name">item</span>) - <span class="kw">except</span> <span class="name">FeedNotFound</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="name">resp</span> <span class="op">=</span> <span class="name">Response</span>(<span class="name">feed</span>.<span class="name">generate</span>()) - <span class="name">resp</span>[<span class="st st-sg">'</span><span class="st">Content-Type</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="st st-sg">'</span><span class="st">text/xml</span><span class="st st-sg">'</span> - - <span class="kw">return</span> <span class="name">resp</span> - <span class="kw">return</span> <span class="name">PageNotFound</span>() -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.forum - ~~~~~~~~~~~~~~~~~~~~ - - Forum Utilities. - - :copyright: 2006-2007 by Armin Ronacher, Benjamin Wiegand. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">from </span><span class="cls">datetime</span><span class="kw"> import</span> <span class="name">datetime</span> - -<span class="kw">from </span><span class="cls">math</span><span class="kw"> import</span> <span class="name">ceil</span> - -<span class="kw">from </span><span class="cls">pocoo</span><span class="kw"> import</span> <span class="name">Component</span> -<span class="kw">from </span><span class="cls">pocoo.db</span><span class="kw"> import</span> <span class="name">meta</span>, <span class="name">DatabaseModel</span>, <span class="name">lazy_column</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.user</span><span class="kw"> import</span> <span class="name">User</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.db</span><span class="kw"> import</span> <span class="name">forums</span>, <span class="name">posts</span>, <span class="name">users</span>, <span class="name">ANONYMOUS_USER_ID</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.template</span><span class="kw"> import</span> <span class="name">Pagination</span>, <span class="name">LazyPagination</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.textfmt</span><span class="kw"> import</span> <span class="name">parse_and_render</span>, <span class="name">quote_text</span> - -<span class="kw">from </span><span class="cls">pocoo.utils.uri</span><span class="kw"> import</span> <span class="name">urlencode</span> -<span class="kw">from </span><span class="cls">pocoo.utils.iterators</span><span class="kw"> import</span> <span class="name">inciter</span> - -<span class="cm"># for default arguments in Thread</span> - -<span class="name">_missing</span> <span class="op">=</span> <span class="bn">object</span>() - - -<span class="kw">class </span><span class="cls">PostProcessor</span>(<span class="name">Component</span>): - <span class="st st-db">"""</span><span class="st"> - Process a posting before it is stored in the database. - </span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">process_post</span>(<span class="bn bn-pseudo">self</span>, <span class="name">text</span>, <span class="name">title</span>, <span class="name">reason</span>): - <span class="st st-db">"""</span><span class="st"> - - Process a posting. - - :param text: Text of the posting, possibly changed by - another PostProcessor. - :param title: The subject of the posting - :param reason: Can be ``'new'`` or ``'edit'``. - - :returns: - * ``True``: store the posting as-is, or - * ``False``: refuse to store the posting, or - * a string: use as the new posting text, or - * a tuple: (text, title) for the posting - </span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="bn bn-pseudo">True</span> - - -<span class="kw">def </span><span class="fun">apply_post_processors</span>(<span class="name">ctx</span>, <span class="name">text</span>, <span class="name">title</span>, <span class="name">reason</span>): - <span class="st st-db">"""</span><span class="st"> - - Apply all `PostProcessor` components to the posting. - - Return (``text``, ``title``) tuple. - </span><span class="st st-db">"""</span> - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">PostProcessor</span>): - <span class="name">rv</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">process_post</span>(<span class="name">text</span>, <span class="name">title</span>, <span class="st st-sg">'</span><span class="st">new</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">rv</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">creation of posting denied</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">rv</span>, <span class="bn">basestring</span>): - <span class="name">text</span> <span class="op">=</span> <span class="bn">unicode</span>(<span class="name">rv</span>) - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">rv</span>, <span class="bn">tuple</span>): - <span class="name">text</span> <span class="op">=</span> <span class="bn">unicode</span>(<span class="name">rv</span>[<span class="nb nb-int">0</span>]) - <span class="name">title</span> <span class="op">=</span> <span class="bn">unicode</span>(<span class="name">rv</span>[<span class="nb nb-int">1</span>]) - <span class="kw">return</span> <span class="name">text</span>, <span class="name">title</span> - - -<span class="kw">def </span><span class="fun">get_forum_index</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return a list of dicts with forum information so that - the template can use it. - - If the request object has an identified user object attached - the returned dict will include status information. (read, - unread) - </span><span class="st st-db">"""</span> - <span class="name">ctx</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span> - - <span class="name">f</span> <span class="op">=</span> <span class="name">forums</span>.<span class="name">c</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - <span class="name">columns</span> <span class="op">=</span> [<span class="name">f</span>.<span class="name">forum_id</span>, <span class="name">f</span>.<span class="name">description</span>, <span class="name">f</span>.<span class="name">name</span>, <span class="name">f</span>.<span class="name">link</span>, <span class="name">f</span>.<span class="name">post_count</span>, - <span class="name">f</span>.<span class="name">thread_count</span>] - - <span class="name">categories</span> <span class="op">=</span> [] - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="kw">for</span> <span class="name">category</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">columns</span>, - <span class="name">f</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="bn bn-pseudo">None</span>)): - <span class="name">category</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">category</span>) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">is_external_link</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">category</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>)) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="name">forums</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">forum</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">columns</span> <span class="op">+</span> [<span class="name">f</span>.<span class="name">last_post_id</span>], - <span class="name">f</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>])): - <span class="name">forum</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">forum</span>) - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">is_external_link</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">forum</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>)) - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="cm"># get last post</span> - - <span class="name">last_post_id</span> <span class="op">=</span> <span class="name">forum</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">last_post_id</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">last_post_id</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">result</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, - <span class="name">p</span>.<span class="name">timestamp</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">last_post_id</span>) <span class="op">&</span> - - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">!=</span> <span class="bn bn-pseudo">None</span>) <span class="op">&</span> - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - <span class="name">last_post</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">result</span>.<span class="name">fetchone</span>()) - <span class="name">username</span> <span class="op">=</span> <span class="name">urlencode</span>(<span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>]) - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span>\ - <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">username</span>) - } - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="kw">else</span>: - <span class="name">last_post</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">last_post</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">last_post</span> - <span class="name">subforums</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">sf</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">f</span>.<span class="name">forum_id</span>, <span class="name">f</span>.<span class="name">name</span>, <span class="name">f</span>.<span class="name">link</span>], - <span class="name">f</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>])): - <span class="name">sf</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">sf</span>) - <span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">is_external_url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">sf</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>)) - <span class="name">subforums</span>.<span class="name">append</span>(<span class="name">sf</span>) - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">subforums</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">subforums</span> - - <span class="name">forums</span>.<span class="name">append</span>(<span class="name">forum</span>) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forums</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">forums</span> - <span class="name">categories</span>.<span class="name">append</span>(<span class="name">category</span>) - <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - <span class="kw">return</span> <span class="name">categories</span> - - -<span class="kw">def </span><span class="fun">get_forum</span>(<span class="name">req</span>, <span class="name">forum_id</span>, <span class="name">page</span><span class="op">=</span><span class="nb nb-int">1</span>): - <span class="st st-db">"""</span><span class="st"> - Return a list of dicts so that the template can use it. - - Return ``None`` if the forum does not exist. - </span><span class="st st-db">"""</span> - - <span class="name">ctx</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span> - <span class="name">f</span> <span class="op">=</span> <span class="name">forums</span>.<span class="name">c</span> - - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - - <span class="name">columns</span> <span class="op">=</span> [<span class="name">f</span>.<span class="name">forum_id</span>, <span class="name">f</span>.<span class="name">description</span>, <span class="name">f</span>.<span class="name">name</span>, <span class="name">f</span>.<span class="name">link</span>, <span class="name">f</span>.<span class="name">post_count</span>, - <span class="name">f</span>.<span class="name">thread_count</span>] - <span class="name">forum_columns</span> <span class="op">=</span> [<span class="name">f</span>.<span class="name">forum_id</span>, <span class="name">f</span>.<span class="name">name</span>, <span class="name">f</span>.<span class="name">description</span>, <span class="name">f</span>.<span class="name">link</span>, - <span class="name">f</span>.<span class="name">post_count</span>, <span class="name">f</span>.<span class="name">thread_count</span>, <span class="name">f</span>.<span class="name">last_post_id</span>] - <span class="name">sf_columns</span> <span class="op">=</span> [<span class="name">f</span>.<span class="name">forum_id</span>, <span class="name">f</span>.<span class="name">name</span>, <span class="name">f</span>.<span class="name">link</span>] - <span class="name">thread_columns</span> <span class="op">=</span> [<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">p</span>.<span class="name">post_count</span>, <span class="name">p</span>.<span class="name">view_count</span>, <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)] - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="name">category</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">columns</span>, - <span class="name">f</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">forum_id</span> - - )).<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">category</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> - <span class="name">category</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">category</span>) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="cm"># wo don't pop link here so that the ForumPage request handler</span> - - <span class="cm"># can use the link key for redirecting. That means we don't</span> - <span class="cm"># need a second query. But template designers shouldn't</span> - <span class="cm"># ever access {{ forum.link }}</span> - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">is_external_url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">category</span>[<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>]) - <span class="name">forums</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">forum</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">forum_columns</span>, - <span class="name">f</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>])): - <span class="name">forum</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">forum</span>) - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="cm"># wo don't pop that here so that the ForumPage request handler</span> - - <span class="cm"># can use the link key for redirecting. That means we don't</span> - <span class="cm"># need a second query. But template designers shouldn't</span> - <span class="cm"># ever access {{ forum.link }}</span> - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">is_external_link</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">forum</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>)) - <span class="name">subforums</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">sf</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">sf_columns</span>, - <span class="name">f</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>])): - <span class="name">sf</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">sf</span>) - <span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">is_external_link</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">bool</span>(<span class="name">sf</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>)) - <span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">sf</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) - <span class="name">subforums</span>.<span class="name">append</span>(<span class="name">sf</span>) - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">subforums</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">subforums</span> - - <span class="cm"># get last post</span> - <span class="name">last_post_id</span> <span class="op">=</span> <span class="name">forum</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">last_post_id</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">last_post_id</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">result</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>), - <span class="name">p</span>.<span class="name">timestamp</span>], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">last_post_id</span>) <span class="op">&</span> - - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">!=</span> <span class="bn bn-pseudo">None</span>) <span class="op">&</span> - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - <span class="name">last_post</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="name">last_post</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">last_post</span>) - <span class="name">username</span> <span class="op">=</span> <span class="name">urlencode</span>(<span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>]) - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>] <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span>\ - <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">username</span>), - } - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="kw">else</span>: - <span class="name">last_post</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">last_post</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">last_post</span> - <span class="name">forums</span>.<span class="name">append</span>(<span class="name">forum</span>) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forums</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">forums</span> - - <span class="cm"># pagination</span> - <span class="kw">def </span><span class="fun">get_page_link</span>(<span class="name">number</span>): - <span class="name">link</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">forum/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">forum_id</span> - - <span class="kw">if</span> <span class="name">number</span> <span class="op">></span> <span class="nb nb-int">1</span>: - <span class="name">link</span> <span class="op">+=</span> <span class="st st-sg">'</span><span class="st">?page=</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">number</span> - - <span class="kw">return</span> <span class="name">link</span> - <span class="name">threads_per_page</span> <span class="op">=</span> <span class="name">get_threads_per_page</span>(<span class="name">req</span>) - <span class="name">page_count</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">ceil</span>(<span class="name">category</span>[<span class="st st-sg">'</span><span class="st">thread_count</span><span class="st st-sg">'</span>] <span class="op">/</span> (<span class="name">threads_per_page</span> <span class="op">*</span> <span class="nb nb-flt">1.0</span>))) - <span class="name">pagination</span> <span class="op">=</span> <span class="name">LazyPagination</span>(<span class="name">req</span>, <span class="name">page</span>, <span class="name">threads_per_page</span>, <span class="name">page_count</span>, - <span class="name">get_page_link</span>) - - <span class="name">threads</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">thread</span> <span class="op op-word">in</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>(<span class="name">thread_columns</span>, - (<span class="name">p</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]) <span class="op">&</span> - - (<span class="name">p</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="bn bn-pseudo">None</span>) <span class="op">&</span> - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">p</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="name">threads_per_page</span>, - <span class="name">offset</span><span class="op">=</span><span class="name">threads_per_page</span> <span class="op">*</span> (<span class="name">page</span> <span class="op">-</span> <span class="nb nb-int">1</span>) - )): - <span class="name">thread</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">thread</span>) - <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>] <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">thread</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">thread</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">thread</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>))) - } - <span class="cm"># get last post</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, <span class="name">p</span>.<span class="name">post_id</span>, - <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">timestamp</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">p</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="nb nb-int">1</span> - - )) - <span class="name">last_post</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">last_post</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">last_post</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">last_post</span>) - <span class="name">username</span> <span class="op">=</span> <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>) - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>] <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">last_post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">username</span>, - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">username</span>)), - } - <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">last_post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">last_post</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">last_post</span> - - <span class="name">threads</span>.<span class="name">append</span>(<span class="name">thread</span>) - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">threads</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">threads</span> - <span class="name">category</span>[<span class="st st-sg">'</span><span class="st">pagination</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">pagination</span> - - <span class="kw">return</span> <span class="name">category</span> - <span class="kw">return</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - - -<span class="kw">def </span><span class="fun">get_forum_pathbar</span>(<span class="name">ctx</span>, <span class="name">forum_id</span>): - <span class="st st-db">"""</span><span class="st">Return the pathbar for a given forum.</span><span class="st st-db">"""</span> - - <span class="name">f</span> <span class="op">=</span> <span class="name">forums</span>.<span class="name">c</span> - <span class="name">pathbar</span> <span class="op">=</span> [] - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>, <span class="name">fid</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="kw">if</span> <span class="name">fid</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">fid</span> <span class="op">=</span> <span class="name">forum_id</span> - - <span class="name">row</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">f</span>.<span class="name">parent_id</span>, <span class="name">f</span>.<span class="name">name</span>], - <span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">fid</span> - - )).<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">l</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">forum/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">fid</span> - - <span class="name">pathbar</span>.<span class="name">append</span>({ - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">l</span>), - <span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>: <span class="name">fid</span>, - <span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>] - }) - <span class="kw">if</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>] <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">do</span>(<span class="name">con</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>]) - <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - <span class="name">pathbar</span>.<span class="name">reverse</span>() - <span class="kw">return</span> <span class="name">pathbar</span> - - -<span class="kw">def </span><span class="fun">get_post_pathbar</span>(<span class="name">ctx</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st">Returns the pathbar for a given post including all forums and subforums</span><span class="st st-db">"""</span> - <span class="name">thread</span> <span class="op">=</span> <span class="name">Thread</span>.<span class="name">by_child</span>(<span class="name">ctx</span>, <span class="name">post_id</span>) - <span class="name">pathbar</span> <span class="op">=</span> <span class="name">get_forum_pathbar</span>(<span class="name">ctx</span>, <span class="name">thread</span>.<span class="name">forum_id</span>) - <span class="name">post_list</span> <span class="op">=</span> [ <span class="name">thread</span>.<span class="name">root_post_id</span> ] - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="kw">if</span> <span class="name">thread</span>.<span class="name">root_post_id</span> <span class="op">!=</span> <span class="bn">int</span>(<span class="name">post_id</span>): - <span class="name">post_list</span>.<span class="name">append</span>(<span class="name">post_id</span>) - - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="kw">for</span> <span class="bn">id</span> <span class="op op-word">in</span> <span class="name">post_list</span>: - <span class="name">row</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">title</span>], - <span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="bn">id</span> - - )).<span class="name">fetchone</span>() - <span class="name">pathbar</span>.<span class="name">append</span>({ - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post/</span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn">id</span>), - <span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-db">"</span><span class="st">title</span><span class="st st-db">"</span>] - }) - <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - <span class="kw">return</span> <span class="name">pathbar</span> - - -<span class="kw">def </span><span class="fun">get_post_tree</span>(<span class="name">req</span>, <span class="name">post_id</span>, <span class="name">inc_view_count</span><span class="op">=</span><span class="bn bn-pseudo">True</span>): - <span class="st st-db">"""</span><span class="st"> - Return a dict with the thread information and a tree of posts. - - Per default it will increment the view counter of the - thread requested. If you don't want that set ``inc_view_count`` - to ``False``. - </span><span class="st st-db">"""</span> - - <span class="name">ctx</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - <span class="name">f</span> <span class="op">=</span> <span class="name">forums</span>.<span class="name">c</span> - - <span class="cm"># load the post requested and lookup root_post_id</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">root_post_id</span>, <span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, - <span class="name">p</span>.<span class="name">text</span>, <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">user_id</span>, - <span class="name">u</span>.<span class="name">register_date</span>, - <span class="name">u</span>.<span class="name">username</span>, <span class="name">u</span>.<span class="name">profile</span>, <span class="name">u</span>.<span class="name">post_count</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="cm"># XXX: need error return here</span> - - <span class="kw">return</span> - <span class="name">post</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">self</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>))), - <span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>), - } - <span class="name">signature</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>].<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>): - <span class="name">signature</span> <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>], - <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">True</span>) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">signature</span> - - <span class="cm">#XXX: cache here</span> - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">parsed_text</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]) - <span class="name">root_post_id</span> <span class="op">=</span> <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>) - - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">root_post_id</span>, <span class="name">p</span>.<span class="name">title</span>, - <span class="name">p</span>.<span class="name">parent_id</span>, <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - - <span class="kw">def </span><span class="fun">prepare</span>(<span class="name">row</span>): - <span class="name">d</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">self</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>))), - } - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">active</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>] <span class="op">==</span> <span class="name">post_id</span> - - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">d</span> - - <span class="cm"># map threads by their parents and prepare the context</span> - <span class="name">mapping</span> <span class="op">=</span> {} - <span class="name">flat_posts</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">row</span> <span class="op op-word">in</span> <span class="name">result</span>: - <span class="name">tmp</span> <span class="op">=</span> <span class="name">prepare</span>(<span class="name">row</span>) - <span class="name">mapping</span>.<span class="name">setdefault</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>], []).<span class="name">append</span>(<span class="name">tmp</span>) - <span class="name">flat_posts</span>.<span class="name">append</span>(<span class="name">tmp</span>) - <span class="name">root</span> <span class="op">=</span> <span class="name">mapping</span>.<span class="name">pop</span>(<span class="bn bn-pseudo">None</span>, <span class="bn bn-pseudo">None</span>) - <span class="kw">if</span> <span class="name">root</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> - - <span class="kw">assert</span> <span class="bn">len</span>(<span class="name">root</span>) <span class="op">==</span> <span class="nb nb-int">1</span>, <span class="st st-sg">'</span><span class="st">something went seriously wrong</span><span class="st st-sg">'</span> - - <span class="cm"># reassamble thread</span> - - <span class="kw">def </span><span class="fun">reassamble</span>(<span class="name">nodes</span>): - <span class="kw">for</span> <span class="name">node</span> <span class="op op-word">in</span> <span class="name">nodes</span>: - <span class="name">node</span>[<span class="st st-sg">'</span><span class="st">children</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">n</span> <span class="op">=</span> <span class="name">mapping</span>.<span class="name">pop</span>(<span class="name">node</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], []) - <span class="name">reassamble</span>(<span class="name">n</span>) - <span class="name">reassamble</span>(<span class="name">root</span>) - - <span class="cm"># increment view_count</span> - - <span class="kw">if</span> <span class="name">inc_view_count</span>: - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">view_count</span>], - <span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>)) - <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">update</span>(<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>), - <span class="name">view_count</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span> - - ) - - - <span class="cm"># fetch overall information for whole thread</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">forum_id</span>, - <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">f</span>.<span class="name">name</span>, <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) <span class="op">&</span> - (<span class="name">f</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">forum_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]), - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>: { - <span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]), - }, - <span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>: { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>] <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>] <span class="op op-word">or</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - }, - <span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>: <span class="name">root</span>, - <span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>: <span class="name">post</span> - - } - - -<span class="kw">def </span><span class="fun">get_post</span>(<span class="name">req</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st"> - Return exactly one post. If the post does not exist the result - will be ``None``. - </span><span class="st st-db">"""</span> - <span class="name">ctx</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span> - - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - - <span class="name">r</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">text</span>, <span class="name">p</span>.<span class="name">timestamp</span>, - <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, <span class="name">u</span>.<span class="name">profile</span>, - <span class="name">u</span>.<span class="name">register_date</span>, - <span class="name">u</span>.<span class="name">post_count</span>, <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">r</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> - - <span class="name">post</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">self</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>))), - <span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>: <span class="name">post</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>) - } - <span class="name">signature</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>].<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>): - <span class="name">signature</span> <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>]) - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">signature</span> - - <span class="cm">#XXX: cache here</span> - <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">parsed_text</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">post</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">post</span> - - -<span class="kw">def </span><span class="fun">get_last_posts</span>(<span class="name">req</span>, <span class="name">root_post_id</span>, <span class="name">n</span><span class="op">=</span><span class="nb nb-int">1</span>, <span class="name">offset</span><span class="op">=</span><span class="nb nb-int">0</span>): - <span class="st st-db">"""</span><span class="st"> - - Returns a flat view of the n latest posts that are - children of root_post_id. - </span><span class="st st-db">"""</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">text</span>, - <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">profile</span>, - <span class="name">u</span>.<span class="name">post_count</span>, <span class="name">u</span>.<span class="name">register_date</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">p</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="name">n</span>, - <span class="name">offset</span><span class="op">=</span><span class="name">offset</span> - - )) - - <span class="kw">def </span><span class="fun">prepare</span>(<span class="name">row</span>): - <span class="name">d</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">user_id</span> <span class="op">=</span> <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">user_id</span>, - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">user_id</span> <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">self</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>, - <span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - } - <span class="name">signature</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>].<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>): - <span class="name">signature</span> <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>], - <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">True</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">signature</span> - - <span class="cm">#XXX: this doesn't cache by now</span> - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">parsed_text</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">d</span> - - <span class="name">post_list</span> <span class="op">=</span> [<span class="name">prepare</span>(<span class="name">row</span>) <span class="kw">for</span> <span class="name">row</span> <span class="op op-word">in</span> <span class="name">result</span>] - <span class="kw">return</span> <span class="name">post_list</span> - - -<span class="kw">def </span><span class="fun">get_flat_view</span>(<span class="name">req</span>, <span class="name">post_id</span>, <span class="name">inc_view_count</span><span class="op">=</span><span class="bn bn-pseudo">True</span>, <span class="name">order</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">asc</span><span class="st st-sg">'</span>): - <span class="st st-db">"""</span><span class="st"> - - Returns the flat view of an post and the next n posts so - that the template can render a page. n is the number of - posts per page defined in either the user settings or the - global forum configuration. - - Per default it will increment the view counter of the - thread requested. If you don't want that set ``inc_view_count`` - to ``False``. - - If you want to get the latest post first, set ``order`` - to ``'desc'``. - </span><span class="st st-db">"""</span> - <span class="name">ctx</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="name">f</span> <span class="op">=</span> <span class="name">forums</span>.<span class="name">c</span> - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - - <span class="cm"># find root_post_id</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">root_post_id</span>], - <span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span> - - )) - <span class="cm"># XXX: This raises TypeError on failure.</span> - <span class="name">root_post_id</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] - - <span class="cm"># select all post ids to calculate the position of the post on a page</span> - - <span class="cm"># the purpose of this calculation is to find the first and last post</span> - <span class="cm"># on the page if the post_id given the function</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>], - <span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">root_post_id</span> - - )) - <span class="name">posts_per_page</span> <span class="op">=</span> <span class="name">get_posts_per_page</span>(<span class="name">req</span>) - <span class="name">postlist</span> <span class="op">=</span> [<span class="name">row</span>[<span class="nb nb-int">0</span>] <span class="kw">for</span> <span class="name">row</span> <span class="op op-word">in</span> <span class="name">result</span>] - <span class="name">post_index</span> <span class="op">=</span> <span class="name">postlist</span>.<span class="name">index</span>(<span class="name">post_id</span>) - <span class="name">page</span> <span class="op">=</span> <span class="name">post_index</span> <span class="op">//</span> <span class="name">posts_per_page</span> - - <span class="name">page_start</span> <span class="op">=</span> <span class="name">page</span> <span class="op">*</span> <span class="name">posts_per_page</span> - <span class="name">post_range_low</span> <span class="op">=</span> <span class="name">postlist</span>[<span class="name">page_start</span>] - <span class="name">post_range_high</span> <span class="op">=</span> <span class="name">postlist</span>[<span class="name">page_start</span>:<span class="name">page_start</span> <span class="op">+</span> <span class="name">posts_per_page</span>][<span class="op">-</span><span class="nb nb-int">1</span>] - - <span class="name">pagination</span> <span class="op">=</span> <span class="name">Pagination</span>(<span class="name">req</span>, <span class="name">postlist</span>, <span class="name">page_start</span>, <span class="name">posts_per_page</span>, - <span class="kw">lambda</span> <span class="name">x</span>: <span class="st st-sg">'</span><span class="st">post/</span><span class="st st-int">%d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">x</span>) - - <span class="name">orderfunc</span> <span class="op">=</span> (<span class="name">order</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">desc</span><span class="st st-sg">'</span> <span class="op op-word">and</span> <span class="name">meta</span>.<span class="name">desc</span> <span class="op op-word">or</span> <span class="name">meta</span>.<span class="name">asc</span>) - <span class="cm"># select matching posts</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">root_post_id</span>, <span class="name">p</span>.<span class="name">title</span>, - <span class="name">p</span>.<span class="name">forum_id</span>, <span class="name">p</span>.<span class="name">parent_id</span>, <span class="name">p</span>.<span class="name">text</span>, - <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">username</span>, <span class="name">u</span>.<span class="name">user_id</span>, - <span class="name">u</span>.<span class="name">profile</span>, <span class="name">u</span>.<span class="name">post_count</span>, <span class="name">u</span>.<span class="name">register_date</span>, - <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">>=</span> <span class="name">post_range_low</span>) <span class="op">&</span> - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op"><=</span> <span class="name">post_range_high</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">orderfunc</span>(<span class="name">p</span>.<span class="name">post_id</span>)] - )) - - <span class="kw">def </span><span class="fun">prepare</span>(<span class="name">number</span>, <span class="name">row</span>): - <span class="name">d</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">user_id</span> <span class="op">=</span> <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">post_number</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">number</span> - - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>] <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">user_id</span>, - <span class="st st-sg">'</span><span class="st">registered</span><span class="st st-sg">'</span>: <span class="name">user_id</span> <span class="op">></span> <span class="nb nb-int">0</span>, - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">self</span><span class="st st-sg">'</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>, - <span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>: <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - } - <span class="name">signature</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>].<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>): - <span class="name">signature</span> <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>], - <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">True</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>][<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">signature</span> - - <span class="cm">#XXX: this doesn't cache by now</span> - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">parsed_text</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">d</span> - - <span class="name">real_posts</span> <span class="op">=</span> [<span class="name">prepare</span>(<span class="name">num</span>, <span class="name">row</span>) <span class="kw">for</span> <span class="name">num</span>, <span class="name">row</span> <span class="op op-word">in</span> <span class="name">inciter</span>(<span class="name">result</span>, <span class="name">page_start</span>)] - - <span class="cm"># increment view_count</span> - - <span class="kw">if</span> <span class="name">inc_view_count</span>: - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">view_count</span>], - <span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>)) - <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">update</span>(<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>), - <span class="name">view_count</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span> - - ) - - <span class="cm"># and another query for the overview page</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">post_id</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">forum_id</span>, - <span class="name">p</span>.<span class="name">timestamp</span>, <span class="name">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">username</span>, - <span class="name">f</span>.<span class="name">name</span>, <span class="name">p</span>.<span class="name">username</span>.<span class="name">label</span>(<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>)], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">root_post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) <span class="op">&</span> - (<span class="name">f</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">forum_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]), - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>: { - <span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">forum</span><span class="st st-sg">'</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>]), - }, - <span class="st st-sg">'</span><span class="st">author</span><span class="st st-sg">'</span>: { - <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">guestname</span><span class="st st-sg">'</span>] <span class="op op-word">or</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="name">ctx</span>.<span class="name">make_url</span>(<span class="st st-sg">'</span><span class="st">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - }, - <span class="st st-sg">'</span><span class="st">pagination</span><span class="st st-sg">'</span>: <span class="name">pagination</span>, - <span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>: <span class="name">real_posts</span> - - } - - -<span class="kw">def </span><span class="fun">get_last_thread_change</span>(<span class="name">req</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st"> - Return the timestamp of the last change in the thread. - ``post_id`` must be the root_post_id, there is no further - check done. - - Return ``None`` if something in the query went wrong (eg. - no thread with the requested root_post_id exists) - </span><span class="st st-db">"""</span> - <span class="cm">#XXX: doesn't cover edits</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">timestamp</span>], - (<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">post_id</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">meta</span>.<span class="name">desc</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span>)], - <span class="name">limit</span><span class="op">=</span><span class="nb nb-int">1</span> - - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> - - <span class="kw">return</span> <span class="name">row</span>[<span class="nb nb-int">0</span>] - - -<span class="kw">def </span><span class="fun">get_posts_per_page</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return the number of posts a user wishes to display on the - flat view page. - </span><span class="st st-db">"""</span> - <span class="kw">try</span>: - <span class="name">posts_per_page</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">settings</span>[<span class="st st-sg">'</span><span class="st">posts_per_page</span><span class="st st-sg">'</span>] - <span class="kw">if</span> <span class="name">posts_per_page</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">posts_per_page</span> - - <span class="kw">except</span> <span class="exc">KeyError</span>: - <span class="kw">pass</span> - <span class="kw">return</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">get_int</span>(<span class="st st-sg">'</span><span class="st">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">posts_per_page</span><span class="st st-sg">'</span>, <span class="nb nb-int">15</span>) - - - -<span class="kw">def </span><span class="fun">get_threads_per_page</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return the number of posts a users whishes to display on the - viewforum page. - </span><span class="st st-db">"""</span> - <span class="kw">try</span>: - <span class="name">threads_per_page</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">settings</span>[<span class="st st-sg">'</span><span class="st">threads_per_page</span><span class="st st-sg">'</span>] - <span class="kw">if</span> <span class="name">threads_per_page</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">threads_per_page</span> - - <span class="kw">except</span> <span class="exc">KeyError</span>: - <span class="kw">pass</span> - <span class="kw">return</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">get_int</span>(<span class="st st-sg">'</span><span class="st">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">threads_per_page</span><span class="st st-sg">'</span>, <span class="nb nb-int">20</span>) - - - -<span class="kw">def </span><span class="fun">get_view_mode</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return the display mode a user has defined in the user settings - or fall back to the default mode from the pocoo.conf. - - :return: either ``'flat'`` or ``'threaded'``. - </span><span class="st st-db">"""</span> - <span class="name">val</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">settings</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">view_mode</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">val</span> <span class="op op-word">in</span> (<span class="st st-sg">'</span><span class="st">flat</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">threaded</span><span class="st st-sg">'</span>): - <span class="kw">return</span> <span class="name">val</span> - - <span class="name">val</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">default_view</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">None</span>) - <span class="kw">return</span> (<span class="name">val</span> <span class="op op-word">in</span> (<span class="st st-sg">'</span><span class="st">flat</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">threaded</span><span class="st st-sg">'</span>)) <span class="op op-word">and</span> <span class="name">val</span> <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">threaded</span><span class="st st-sg">'</span> - - -<span class="kw">def </span><span class="fun">quote_post</span>(<span class="name">req</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st"> - Return a tuple in the form ``(text, title)`` which is useful - for replying and quoting existing posts. The title is - prefixed with a local representation of 'Re:' and the text - is quoted with the selected markup. - </span><span class="st st-db">"""</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">text</span>, <span class="name">u</span>.<span class="name">username</span>], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) <span class="op">&</span> - - (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">p</span>.<span class="name">author_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="cm"># XXX: ValueError?</span> - - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">post </span><span class="st st-int">%s</span><span class="st"> does not exist</span><span class="st st-sg">'</span>) - - <span class="name">suffix</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Re:</span><span class="st st-sg">'</span>) - <span class="name">title</span> <span class="op">=</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>] - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">title</span>.<span class="name">startswith</span>(<span class="name">suffix</span>): - <span class="name">title</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st st-int">%s</span><span class="st"> </span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> (<span class="name">suffix</span>, <span class="name">title</span>) - <span class="name">text</span> <span class="op">=</span> <span class="name">quote_text</span>(<span class="name">req</span>, <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>], <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">text</span>, <span class="name">title</span> - - -<span class="kw">def </span><span class="fun">edit_post</span>(<span class="name">req</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st"> - Return a tuple in the form (``text``, ``title``, ``username``) - for the edit view. - - :see: `quote_post` - </span><span class="st st-db">"""</span> - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">p</span>.<span class="name">text</span>, <span class="name">p</span>.<span class="name">title</span>, <span class="name">p</span>.<span class="name">username</span>], - (<span class="name">p</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="cm"># XXX: ValueError?</span> - - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">post </span><span class="st st-int">%s</span><span class="st"> does not exist</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="bn">tuple</span>(<span class="name">row</span>) - - -<span class="kw">class </span><span class="cls">_Site</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st">A special singleton representing a whole site.</span><span class="st st-db">"""</span> - - <span class="name">object_id</span> <span class="op">=</span> <span class="nb nb-int">0</span> - - <span class="kw">def </span><span class="fun">__repr__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st"><</span><span class="st st-int">%s</span><span class="st">></span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span> - -<span class="name">Site</span> <span class="op">=</span> <span class="name">_Site</span>() - - -<span class="kw">class </span><span class="cls">Forum</span>(<span class="name">DatabaseModel</span>): - <span class="st st-db">"""</span><span class="st"> - This class represents one forum. Don't pass instances of this - class to templates, therefore there are some other functions - in this module. - - The main purpose of this class is the creation and management - of forums. You can also use this class for the ACL functions. - </span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">ctx</span>, <span class="name">forum_id</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span> <span class="op">=</span> <span class="name">ctx</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span> <span class="op">=</span> <span class="name">forum_id</span> - <span class="bn">super</span>(<span class="name">Forum</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>, <span class="name">forums</span>, <span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>) - - <span class="name">parent_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>) - <span class="name">object_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>) - <span class="name">name</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">name</span><span class="st st-sg">'</span>) - <span class="name">description</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">description</span><span class="st st-sg">'</span>) - <span class="name">position</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">position</span><span class="st st-sg">'</span>) - <span class="name">link</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>) - - <span class="deco">@staticmethod</span> - - <span class="kw">def </span><span class="fun">create</span>(<span class="name">ctx</span>, <span class="name">name</span>, <span class="name">description</span><span class="op">=</span><span class="st st-db">""</span>, <span class="name">parent</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, <span class="name">position</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, - <span class="name">link</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st">Create a new forum.</span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">parent</span>, <span class="name">Forum</span>): - <span class="name">parent</span> <span class="op">=</span> <span class="name">parent</span>.<span class="name">forum_id</span> - - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">forums</span>.<span class="name">insert</span>(), - <span class="name">parent_id</span><span class="op">=</span><span class="name">parent</span>, - <span class="name">name</span><span class="op">=</span><span class="name">name</span>, - <span class="name">description</span><span class="op">=</span><span class="name">description</span>, - <span class="name">position</span><span class="op">=</span><span class="name">position</span>, - <span class="name">link</span><span class="op">=</span><span class="name">link</span>, - <span class="name">post_count</span><span class="op">=</span><span class="nb nb-int">0</span>, - <span class="name">thread_count</span><span class="op">=</span><span class="nb nb-int">0</span> - - ) - <span class="kw">return</span> <span class="name">Forum</span>(<span class="name">ctx</span>, <span class="name">result</span>.<span class="name">last_inserted_ids</span>()[<span class="nb nb-int">0</span>]) - - <span class="kw">def </span><span class="fun">parent_get</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="name">Forum</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="bn bn-pseudo">self</span>.<span class="name">parent_id</span>) - <span class="kw">def </span><span class="fun">parent_set</span>(<span class="bn bn-pseudo">self</span>, <span class="name">value</span>): - <span class="kw">if</span> <span class="name">value</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">parent_id</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">value</span>, <span class="name">Forum</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">parent_id</span> <span class="op">=</span> <span class="name">value</span>.<span class="name">forum_id</span> - - <span class="name">parent</span> <span class="op">=</span> <span class="bn">property</span>(<span class="name">parent_get</span>, <span class="name">parent_set</span>) - <span class="kw">del</span> <span class="name">parent_get</span>, <span class="name">parent_set</span> - - <span class="kw">def </span><span class="fun">__repr__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st"><</span><span class="st st-int">%s</span><span class="st"> </span><span class="st st-int">%d</span><span class="st">: </span><span class="st st-int">%r</span><span class="st">></span><span class="st st-sg">'</span> <span class="op">%</span> ( - <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">name</span> - - ) - - -<span class="kw">class </span><span class="cls">Thread</span>(<span class="name">DatabaseModel</span>): - <span class="st st-db">"""</span><span class="st"> - This class represents a root post with all of its children. - You can use this class to manage a thread, add a new reply - or edit one of its children. - </span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">ctx</span>, <span class="name">root_post_id</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span> <span class="op">=</span> <span class="name">ctx</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> <span class="op">=</span> <span class="name">root_post_id</span> - <span class="bn">super</span>(<span class="name">Thread</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>, <span class="name">posts</span>, <span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>, - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">parent_id</span> <span class="op">==</span> <span class="bn bn-pseudo">None</span> - - ) - - <span class="name">forum_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">forum_id</span><span class="st st-sg">'</span>) - <span class="name">parent_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>) - <span class="name">root_post_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>) - <span class="name">object_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">object_id</span><span class="st st-sg">'</span>) - <span class="name">author_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">author_id</span><span class="st st-sg">'</span>) - <span class="name">title</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>) - <span class="name">text</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>) - <span class="name">timestamp</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>) - - <span class="deco">@staticmethod</span> - - <span class="kw">def </span><span class="fun">create</span>(<span class="name">ctx</span>, <span class="name">forum</span>, <span class="name">author</span>, <span class="name">title</span>, <span class="name">text</span>, <span class="name">timestamp</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st">Create a new thread. - If author is a string it will be an anonymous posting.</span><span class="st st-db">"""</span> - - <span class="name">username</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">forum</span>, <span class="name">Forum</span>): - <span class="name">forum</span> <span class="op">=</span> <span class="name">forum</span>.<span class="name">forum_id</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">author</span>, <span class="name">User</span>): - <span class="name">author</span> <span class="op">=</span> <span class="name">author</span>.<span class="name">user_id</span> - - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">author</span>, <span class="bn">basestring</span>): - <span class="name">username</span> <span class="op">=</span> <span class="name">author</span> - <span class="name">author</span> <span class="op">=</span> <span class="name">ANONYMOUS_USER_ID</span> - - <span class="kw">if</span> <span class="name">timestamp</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">timestamp</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>() - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="name">result</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">insert</span>(), - <span class="name">forum_id</span> <span class="op">=</span> <span class="name">forum</span>, - <span class="name">author_id</span> <span class="op">=</span> <span class="name">author</span>, - <span class="name">username</span> <span class="op">=</span> <span class="name">username</span>, - <span class="name">title</span> <span class="op">=</span> <span class="name">title</span>, - <span class="name">text</span> <span class="op">=</span> <span class="name">text</span>, - <span class="name">timestamp</span> <span class="op">=</span> <span class="name">timestamp</span>, - <span class="name">post_count</span> <span class="op">=</span> <span class="nb nb-int">1</span>, - <span class="name">view_count</span> <span class="op">=</span> <span class="nb nb-int">0</span> - - ) - <span class="name">thread_id</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">last_inserted_ids</span>()[<span class="op">-</span><span class="nb nb-int">1</span>] - <span class="cm"># increment author post count</span> - <span class="kw">if</span> <span class="name">author</span> <span class="op">></span> <span class="op">-</span><span class="nb nb-int">1</span>: - <span class="name">old</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">select</span>([<span class="name">users</span>.<span class="name">c</span>.<span class="name">post_count</span>], <span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">author</span>) - <span class="name">con</span>.<span class="name">execute</span>(<span class="name">users</span>.<span class="name">update</span>(<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">author</span>), - <span class="name">post_count</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">old</span>).<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span> - - ) - <span class="cm"># increment forum post and thread count</span> - <span class="name">old</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">select</span>([<span class="name">forums</span>.<span class="name">c</span>.<span class="name">post_count</span>, <span class="name">forums</span>.<span class="name">c</span>.<span class="name">thread_count</span>], - <span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">forum</span>) - <span class="name">row</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">old</span>).<span class="name">fetchone</span>() - <span class="name">con</span>.<span class="name">execute</span>(<span class="name">forums</span>.<span class="name">update</span>(<span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="name">forum</span>), - <span class="name">post_count</span> <span class="op">=</span> <span class="name">row</span>[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span>, - <span class="name">thread_count</span> <span class="op">=</span> <span class="name">row</span>[<span class="nb nb-int">1</span>] <span class="op">+</span> <span class="nb nb-int">1</span>, - <span class="name">last_post_id</span> <span class="op">=</span> <span class="name">thread_id</span> - - ) - <span class="kw">return</span> <span class="name">thread_id</span> - <span class="name">thread_id</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - <span class="cm"># XXX: this feels a bit strange</span> - - <span class="name">t</span> <span class="op">=</span> <span class="name">Thread</span>(<span class="name">ctx</span>, <span class="name">thread_id</span>) - <span class="name">t</span>.<span class="name">root_post_id</span> <span class="op">=</span> <span class="name">t</span>.<span class="name">post_id</span> - - <span class="name">t</span>.<span class="name">save</span>() - <span class="kw">return</span> <span class="name">t</span> - - <span class="deco">@staticmethod</span> - <span class="kw">def </span><span class="fun">by_child</span>(<span class="name">ctx</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st"> - - Return the thread of a given ``post_id``. - </span><span class="st st-db">"""</span> - <span class="name">result</span> <span class="op">=</span> <span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span>], - (<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>) - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="cm"># XXX: ValueError?</span> - - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">post </span><span class="st st-int">%s</span><span class="st"> does not exist</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post_id</span>) - <span class="kw">return</span> <span class="name">Thread</span>(<span class="name">ctx</span>, <span class="name">row</span>[<span class="nb nb-int">0</span>]) - - <span class="kw">def </span><span class="fun">reply</span>(<span class="bn bn-pseudo">self</span>, <span class="name">post_id</span>, <span class="name">author</span>, <span class="name">title</span>, <span class="name">text</span>, <span class="name">timestamp</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, - <span class="name">no_processor</span><span class="op">=</span><span class="bn bn-pseudo">False</span>): - <span class="st st-db">"""</span><span class="st"> - - Reply to post ``post_id`` which is a child of the thread. - Return the id of the new post. - - If ``author`` is a string it will be an anonymous posting. - </span><span class="st st-db">"""</span> - <span class="name">username</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="kw">if</span> <span class="name">post_id</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">post_id</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">author</span>, <span class="name">User</span>): - <span class="name">author</span> <span class="op">=</span> <span class="name">author</span>.<span class="name">user_id</span> - - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">author</span>, <span class="bn">basestring</span>): - <span class="name">username</span> <span class="op">=</span> <span class="name">author</span> - <span class="name">author</span> <span class="op">=</span> <span class="name">ANONYMOUS_USER_ID</span> - - <span class="kw">if</span> <span class="name">timestamp</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">timestamp</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>() - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">no_processor</span>: - <span class="name">text</span>, <span class="name">title</span> <span class="op">=</span> <span class="name">apply_post_processors</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">text</span>, - <span class="name">title</span>, <span class="st st-sg">'</span><span class="st">new</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="name">result</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span>], - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span> - - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span> <span class="op op-word">or</span> <span class="name">row</span>[<span class="nb nb-int">0</span>] <span class="op">!=</span> <span class="bn">int</span>(<span class="bn bn-pseudo">self</span>.<span class="name">post_id</span>): - <span class="cm"># XXX: ValueError?</span> - - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">The post either does not exist or does not </span><span class="st st-sg">'</span> - <span class="st st-sg">'</span><span class="st">belong to this thread</span><span class="st st-sg">'</span>) - <span class="name">new_post_id</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">insert</span>(), - <span class="name">forum_id</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span>, - <span class="name">parent_id</span> <span class="op">=</span> <span class="name">post_id</span>, - <span class="name">root_post_id</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span>, - <span class="name">author_id</span> <span class="op">=</span> <span class="name">author</span>, - <span class="name">username</span> <span class="op">=</span> <span class="name">username</span>, - <span class="name">title</span> <span class="op">=</span> <span class="name">title</span>, - <span class="name">text</span> <span class="op">=</span> <span class="name">text</span>, - <span class="name">timestamp</span> <span class="op">=</span> <span class="name">timestamp</span> - - ).<span class="name">last_inserted_ids</span>()[<span class="nb nb-int">0</span>] - - <span class="cm"># increment author post count</span> - <span class="kw">if</span> <span class="name">author</span> <span class="op">></span> <span class="op">-</span><span class="nb nb-int">1</span>: - <span class="name">old</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">select</span>([<span class="name">users</span>.<span class="name">c</span>.<span class="name">post_count</span>], <span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">author</span>) - <span class="name">con</span>.<span class="name">execute</span>(<span class="name">users</span>.<span class="name">update</span>(<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">author</span>), - <span class="name">post_count</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">old</span>).<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span> - - ) - <span class="cm"># increment forum post count and update last_post_id</span> - <span class="name">old</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">select</span>([<span class="name">forums</span>.<span class="name">c</span>.<span class="name">post_count</span>], - <span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span>) - <span class="name">con</span>.<span class="name">execute</span>(<span class="name">forums</span>.<span class="name">update</span>(<span class="name">forums</span>.<span class="name">c</span>.<span class="name">forum_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span>), - <span class="name">post_count</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">old</span>).<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span>, - <span class="name">last_post_id</span> <span class="op">=</span> <span class="name">new_post_id</span> - - ) - <span class="cm"># increment thread post count</span> - <span class="name">old</span> <span class="op">=</span> <span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_count</span>], - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span>) - <span class="name">con</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">update</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span>), - <span class="name">post_count</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">old</span>).<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] <span class="op">+</span> <span class="nb nb-int">1</span> - - ) - <span class="kw">return</span> <span class="name">new_post_id</span> - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">transaction</span>(<span class="name">do</span>) - - <span class="kw">def </span><span class="fun">edit_reply</span>(<span class="bn bn-pseudo">self</span>, <span class="name">post_id</span>, <span class="name">author</span><span class="op">=</span><span class="name">_missing</span>, <span class="name">title</span><span class="op">=</span><span class="name">_missing</span>, - <span class="name">text</span><span class="op">=</span><span class="name">_missing</span>, <span class="name">timestamp</span><span class="op">=</span><span class="name">_missing</span>, - <span class="name">no_processor</span><span class="op">=</span><span class="bn bn-pseudo">False</span>): - <span class="st st-db">"""</span><span class="st">Edit a reply.</span><span class="st st-db">"""</span> - - <span class="name">d</span> <span class="op">=</span> {} - <span class="kw">if</span> <span class="name">author</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="name">_missing</span>: - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">author</span>, <span class="name">User</span>): - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author_id</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">author</span>.<span class="name">user_id</span> <span class="cm"># pylint: disable-msg=E1101</span> - - <span class="kw">else</span>: - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">author_id</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">author</span> - <span class="kw">if</span> <span class="name">title</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="name">_missing</span>: - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">title</span> - - <span class="kw">if</span> <span class="name">text</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="name">_missing</span>: - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">text</span> - - <span class="kw">if</span> <span class="name">timestamp</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="name">_missing</span>: - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">timestamp</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">timestamp</span> - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">no_processor</span> <span class="op op-word">and</span> <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">d</span> <span class="op op-word">and</span> <span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">d</span>: - <span class="name">rv</span> <span class="op">=</span> <span class="name">apply_post_processors</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>], <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>], <span class="st st-sg">'</span><span class="st">edit</span><span class="st st-sg">'</span>) - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>], <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">rv</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">update</span>(<span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span>), <span class="op">**</span><span class="name">d</span>) - - <span class="kw">def </span><span class="fun">has_child</span>(<span class="bn bn-pseudo">self</span>, <span class="name">post_id</span>): - <span class="st st-db">"""</span><span class="st">Check if a post_id is a child of this thread.</span><span class="st st-db">"""</span> - - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span>], - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">post_id</span> - - )) - <span class="name">row</span> <span class="op">=</span> <span class="name">result</span>.<span class="name">fetchone</span>() - <span class="kw">return</span> <span class="name">row</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span> <span class="op op-word">and</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>] <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> - - <span class="kw">def </span><span class="fun">get_post_list</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st"> - Return a flat list of all posts in this thread sorted by their post_id. - </span><span class="st st-db">"""</span> - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">posts</span>.<span class="name">select</span>( - <span class="name">posts</span>.<span class="name">c</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> - - )) - <span class="kw">return</span> <span class="bn">map</span>(<span class="bn">dict</span>, <span class="name">result</span>) - - <span class="kw">def </span><span class="fun">count_children</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st"> - Return the number of direct or indirect children of this thread. - </span><span class="st st-db">"""</span> - - <span class="name">p</span> <span class="op">=</span> <span class="name">posts</span>.<span class="name">c</span> - <span class="name">result</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">engine</span>.<span class="name">execute</span>(<span class="name">meta</span>.<span class="name">select</span>([<span class="name">meta</span>.<span class="name">func</span>.<span class="name">count</span>(<span class="name">p</span>.<span class="name">post_id</span>)], - <span class="name">p</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> - - )) - <span class="kw">return</span> <span class="name">result</span>.<span class="name">fetchone</span>()[<span class="nb nb-int">0</span>] - - <span class="name">__len__</span> <span class="op">=</span> <span class="name">count_children</span> - - <span class="kw">def </span><span class="fun">forum_get</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span> <span class="op op-word">is</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">Forum</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span>) - <span class="kw">def </span><span class="fun">forum_set</span>(<span class="bn bn-pseudo">self</span>, <span class="name">value</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn">isinstance</span>(<span class="name">value</span>, <span class="name">Forum</span>): - <span class="kw">raise</span> <span class="exc">TypeError</span>(<span class="st st-sg">'</span><span class="st">Can only set Forum instances</span><span class="st st-sg">'</span>) - <span class="bn bn-pseudo">self</span>.<span class="name">forum_id</span> <span class="op">=</span> <span class="name">value</span>.<span class="name">forum_id</span> - - <span class="name">forum</span> <span class="op">=</span> <span class="bn">property</span>(<span class="name">forum_get</span>, <span class="name">forum_set</span>) - <span class="kw">del</span> <span class="name">forum_get</span>, <span class="name">forum_set</span> - - <span class="kw">def </span><span class="fun">__eq__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">other</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="name">other</span>.<span class="name">post_id</span> - - <span class="kw">def </span><span class="fun">__ne__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">other</span>): - <span class="kw">return</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">__eq__</span>(<span class="name">other</span>) - - <span class="kw">def </span><span class="fun">__repr__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st"><</span><span class="st st-int">%s</span><span class="st"> </span><span class="st st-int">%d</span><span class="st">: </span><span class="st st-int">%r</span><span class="st">></span><span class="st st-sg">'</span> <span class="op">%</span> ( - <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">post_id</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">title</span> - - ) -<span class="cm"># -*- coding: utf-8 -*-</span> -</pre> -<script type="text/javascript">initCodeBlock('code-block')</script> -</body> -</html> |
