diff options
Diffstat (limited to 'tests/examplefiles/test.html')
-rw-r--r-- | tests/examplefiles/test.html | 3553 |
1 files changed, 0 insertions, 3553 deletions
diff --git a/tests/examplefiles/test.html b/tests/examplefiles/test.html index 4527a3fb..52adca81 100644 --- a/tests/examplefiles/test.html +++ b/tests/examplefiles/test.html @@ -2783,3559 +2783,6 @@ pre.syntax { padding: 5px; margin-top: 0px; } ) <span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.i18n - ~~~~~~~~~~~~~~~~~~~ - - Pocoo internationalization components. - - :copyright: 2006 by Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">gettext</span> -<span class="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">RequestWrapper</span> - -<span class="kw">from </span><span class="cls">jinja.nodes</span><span class="kw"> import</span> <span class="name">Node</span>, <span class="name">KeywordNode</span>, <span class="name">VariableNode</span>, <span class="name">ValueNode</span>, <span class="name">CollectionNode</span> -<span class="kw">from </span><span class="cls">jinja.base</span><span class="kw"> import</span> <span class="name">TOKEN_TEXT</span>, <span class="name">TOKEN_VAR</span> - -<span class="kw">from </span><span class="cls">jinja.exceptions</span><span class="kw"> import</span> <span class="name">TemplateSyntaxError</span> -<span class="kw">from </span><span class="cls">cStringIO</span><span class="kw"> import</span> <span class="name">StringIO</span> - - -<span class="kw">class </span><span class="cls">TranslatableTag</span>(<span class="name">Node</span>): - <span class="st st-db">"""</span><span class="st"> - - Translatable Tag - ================ - - Usage:: - - {% trans %} - somestring - {% trans %} - - Or:: - - {% trans "string" %} - </span><span class="st st-db">"""</span> - - <span class="name">rules</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">long</span><span class="st st-sg">'</span>: [<span class="name">KeywordNode</span>(<span class="st st-sg">'</span><span class="st">trans</span><span class="st st-sg">'</span>)], - <span class="st st-sg">'</span><span class="st">plural</span><span class="st st-sg">'</span>: [<span class="name">KeywordNode</span>(<span class="st st-sg">'</span><span class="st">trans</span><span class="st st-sg">'</span>), <span class="name">KeywordNode</span>(<span class="st st-sg">'</span><span class="st">pluralizing</span><span class="st st-sg">'</span>), - <span class="name">VariableNode</span>()], - <span class="st st-sg">'</span><span class="st">short</span><span class="st st-sg">'</span>: [<span class="name">KeywordNode</span>(<span class="st st-sg">'</span><span class="st">trans</span><span class="st st-sg">'</span>), <span class="name">ValueNode</span>(), <span class="name">CollectionNode</span>()] - } - - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">parser</span>, <span class="name">matched_tag</span>, <span class="name">handler_args</span>, <span class="name">stack</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">_body_pl</span> <span class="op">=</span> [] - <span class="bn bn-pseudo">self</span>.<span class="name">_vars_pl</span> <span class="op">=</span> {} - <span class="kw">if</span> <span class="name">matched_tag</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">short</span><span class="st st-sg">'</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">_body_sg</span> <span class="op">=</span> [<span class="name">handler_args</span>[<span class="nb nb-int">1</span>].<span class="name">resolve</span>()] - <span class="bn bn-pseudo">self</span>.<span class="name">_vars_sg</span> <span class="op">=</span> <span class="name">handler_args</span>[<span class="nb nb-int">2</span>] - <span class="kw">else</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">_body_sg</span>, <span class="bn bn-pseudo">self</span>.<span class="name">_vars_sg</span>, <span class="bn bn-pseudo">self</span>.<span class="name">_body_pl</span>, <span class="bn bn-pseudo">self</span>.<span class="name">_vars_pl</span> <span class="op">=</span> \ - <span class="bn bn-pseudo">self</span>.<span class="name">_forkparse</span>(<span class="name">parser</span>) - <span class="kw">if</span> <span class="name">matched_tag</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">plural</span><span class="st st-sg">'</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">_indicator</span> <span class="op">=</span> <span class="name">handler_args</span>[<span class="nb nb-int">2</span>] - <span class="bn bn-pseudo">self</span>.<span class="name">msgid</span> <span class="op">=</span> (<span class="st st-sg">''</span>.<span class="name">join</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_body_sg</span>)).<span class="name">strip</span>() - <span class="bn bn-pseudo">self</span>.<span class="name">msgid_plural</span> <span class="op">=</span> (<span class="st st-sg">''</span>.<span class="name">join</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_body_pl</span>)).<span class="name">strip</span>() - <span class="name">Node</span>.<span class="name">__init__</span>(<span class="bn bn-pseudo">self</span>) - - <span class="kw">def </span><span class="fun">_forkparse</span>(<span class="bn bn-pseudo">self</span>, <span class="name">parser</span>): - <span class="name">lib</span> <span class="op">=</span> <span class="name">parser</span>.<span class="name">library</span> - - <span class="name">sg</span> <span class="op">=</span> []; <span class="name">vars_sg</span> <span class="op">=</span> {} - <span class="name">pl</span> <span class="op">=</span> []; <span class="name">vars_pl</span> <span class="op">=</span> {} - <span class="name">out</span> <span class="op">=</span> <span class="name">sg</span>; <span class="name">vars_out</span> <span class="op">=</span> <span class="name">vars_sg</span> - - <span class="kw">while</span> <span class="name">parser</span>.<span class="name">tokens</span>: - <span class="name">token</span> <span class="op">=</span> <span class="name">parser</span>.<span class="name">pop_token</span>() - <span class="kw">if</span> <span class="name">token</span>.<span class="name">token_type</span> <span class="op">==</span> <span class="name">TOKEN_VAR</span>: - <span class="name">var</span> <span class="op">=</span> <span class="name">lib</span>.<span class="name">parse</span>(<span class="name">parser</span>, <span class="name">u</span><span class="st st-sg">'</span><span class="st">print </span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">token</span>.<span class="name">contents</span>) - <span class="name">var_key</span> <span class="op">=</span> <span class="name">token</span>.<span class="name">contents</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">0</span>].<span class="name">strip</span>() - <span class="name">vars_out</span>[<span class="name">var_key</span>] <span class="op">=</span> <span class="name">var</span> - - <span class="name">out</span>.<span class="name">append</span>(<span class="st st-sg">'</span><span class="st st-int">%%</span><span class="st">(</span><span class="st st-int">%s</span><span class="st">)s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">var_key</span>) - <span class="kw">elif</span> <span class="name">token</span>.<span class="name">token_type</span> <span class="op">==</span> <span class="name">TOKEN_TEXT</span>: - <span class="name">lines</span> <span class="op">=</span> <span class="name">token</span>.<span class="name">contents</span>.<span class="name">splitlines</span>() - <span class="cm"># XXX: this protects whitespaces between different tokens (really?)</span> - - <span class="name">text</span> <span class="op">=</span> <span class="name">u</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="nb nb-int">1</span>] <span class="op">+</span> [<span class="name">line</span>.<span class="name">lstrip</span>() <span class="kw">for</span> <span class="name">line</span> <span class="op op-word">in</span> <span class="name">lines</span>[<span class="nb nb-int">1</span>:]]) - <span class="name">out</span>.<span class="name">append</span>(<span class="name">text</span>) - <span class="kw">else</span>: - <span class="kw">if</span> <span class="name">token</span>.<span class="name">contents</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">plural</span><span class="st st-sg">'</span>: - <span class="kw">if</span> <span class="name">out</span> <span class="op op-word">is</span> <span class="name">sg</span>: - <span class="name">out</span> <span class="op">=</span> <span class="name">pl</span> - - <span class="name">vars_out</span> <span class="op">=</span> <span class="name">vars_pl</span> - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="name">TemplateSyntaxError</span>(<span class="st st-sg">'</span><span class="st">plural used twice</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="name">token</span>.<span class="name">contents</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">endtrans</span><span class="st st-sg">'</span>: - <span class="kw">break</span> - - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="name">TemplateSyntaxError</span>(<span class="st st-sg">'</span><span class="st">you can</span><span class="st st-esc">\'</span><span class="st">t use blocks inside of a </span><span class="st st-sg">'</span> - <span class="st st-sg">'</span><span class="st">`trans` tag.</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">sg</span>, <span class="name">vars_sg</span>, <span class="name">pl</span>, <span class="name">vars_pl</span> - - <span class="kw">def </span><span class="fun">render</span>(<span class="bn bn-pseudo">self</span>, <span class="name">context</span>): - <span class="name">req</span> <span class="op">=</span> <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">REQUEST</span><span class="st st-sg">'</span>] - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">msgid_plural</span>: - <span class="name">var</span> <span class="op">=</span> <span class="nb nb-int">1</span> - - <span class="kw">if</span> <span class="bn">hasattr</span>(<span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">_indicator</span><span class="st st-sg">'</span>): - <span class="name">var</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_indicator</span>.<span class="name">resolve</span>(<span class="name">context</span>) - <span class="name">rv</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">msgid</span>, <span class="bn bn-pseudo">self</span>.<span class="name">msgid_plural</span>, <span class="name">var</span>) - <span class="kw">else</span>: - <span class="name">rv</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">msgid</span>) - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_vars_sg</span>, <span class="bn">list</span>): - <span class="kw">return</span> <span class="name">rv</span> <span class="op">%</span> <span class="bn">tuple</span>(<span class="name">v</span>.<span class="name">render</span>(<span class="name">context</span>) <span class="kw">for</span> <span class="name">v</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">_vars_sg</span>) - <span class="name">args</span> <span class="op">=</span> <span class="bn">dict</span>((<span class="name">n</span>, <span class="name">v</span>.<span class="name">render</span>(<span class="name">context</span>)) <span class="kw">for</span> <span class="name">n</span>, <span class="name">v</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">_vars_sg</span>.<span class="name">iteritems</span>()) - <span class="name">args</span>.<span class="name">update</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_vars_pl</span>) - <span class="kw">return</span> <span class="name">rv</span> <span class="op">%</span> <span class="name">args</span> - - -<span class="kw">def </span><span class="fun">load_translations</span>(<span class="name">ctx</span>, <span class="name">lng</span>): - <span class="st st-db">"""</span><span class="st"> - loads all available translations for the given language. - </span><span class="st st-db">"""</span> - <span class="name">result</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">res</span> <span class="op op-word">in</span> <span class="name">ctx</span>.<span class="name">pkgmanager</span>.<span class="name">get_resources</span>(<span class="st st-sg">'</span><span class="st">i18n</span><span class="st st-sg">'</span>, <span class="st st-sg">''</span>, <span class="name">lng</span>): - <span class="name">f</span> <span class="op">=</span> <span class="name">StringIO</span>(<span class="name">res</span>) - <span class="name">result</span>.<span class="name">append</span>(<span class="name">gettext</span>.<span class="name">GNUTranslations</span>(<span class="name">f</span>)) - <span class="kw">return</span> <span class="name">result</span> - - -<span class="kw">def </span><span class="fun">parse_http_accept_language</span>(<span class="name">s</span>): - <span class="st st-db">"""</span><span class="st"> - Return the accepted languages as set in the user browser. - </span><span class="st st-db">"""</span> - <span class="name">result</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">item</span> <span class="op op-word">in</span> <span class="name">s</span>.<span class="name">split</span>(<span class="st st-sg">'</span><span class="st">,</span><span class="st st-sg">'</span>): - <span class="name">lng</span> <span class="op">=</span> <span class="name">item</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="nb nb-int">0</span>] - <span class="name">lng</span> <span class="op">=</span> <span class="name">lng</span>.<span class="name">lower</span>() - <span class="name">result</span>.<span class="name">append</span>(<span class="name">lng</span>) - <span class="kw">if</span> <span class="st st-sg">'</span><span class="st">-</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">lng</span>: - <span class="name">result</span>.<span class="name">append</span>(<span class="name">lng</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">0</span>]) - <span class="kw">return</span> <span class="name">result</span> - - -<span class="kw">def </span><span class="fun">get_request_languages</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return the list of languages a request could handle. - </span><span class="st st-db">"""</span> - <span class="kw">if</span> <span class="bn">hasattr</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">user</span><span class="st st-sg">'</span>) <span class="op op-word">and</span> <span class="name">req</span>.<span class="name">user</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">req</span>.<span class="name">user</span>.<span class="name">language</span>: - <span class="name">lng</span> <span class="op">=</span> [<span class="name">req</span>.<span class="name">user</span>.<span class="name">language</span>] - <span class="kw">else</span>: - <span class="name">lng</span> <span class="op">=</span> [] - <span class="cm"># before checking the HTTP_ACCEPT_LANGUAGE check for</span> - - <span class="cm"># a forced language.</span> - <span class="name">forced</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">general</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">language</span><span class="st st-sg">'</span>, <span class="st st-sg">''</span>) - <span class="kw">if</span> <span class="name">forced</span> <span class="op op-word">and</span> <span class="name">forced</span> <span class="op">!=</span> <span class="st st-sg">'</span><span class="st">auto</span><span class="st st-sg">'</span> <span class="op op-word">and</span> <span class="name">forced</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="name">lng</span>: - <span class="name">lng</span>.<span class="name">append</span>(<span class="name">forced</span>) - <span class="cm"># now prase the HTTP_ACCEPT_LANGUAGE string and add</span> - - <span class="cm"># the languages to the list of accepted languages.</span> - <span class="name">language_string</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">environ</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">HTTP_ACCEPT_LANGUAGE</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">en</span><span class="st st-sg">'</span>) - <span class="kw">for</span> <span class="name">item</span> <span class="op op-word">in</span> <span class="name">parse_http_accept_language</span>(<span class="name">language_string</span>): - <span class="kw">if</span> <span class="name">item</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="name">lng</span>: - <span class="name">lng</span>.<span class="name">append</span>(<span class="name">item</span>) - <span class="cm"># add "en" if not set</span> - - <span class="kw">if</span> <span class="st st-sg">'</span><span class="st">en</span><span class="st st-sg">'</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="name">lng</span>: - <span class="name">lng</span>.<span class="name">append</span>(<span class="st st-sg">'</span><span class="st">en</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">lng</span> - - -<span class="kw">class </span><span class="cls">Translator</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - A callable that allows you to use pluralized and - non pluralized strings. A translator instance always - exists on the request object as ``req.gettext``:: - - _ = req.gettext - _('Hello World!', 'Hello Worlds!', 2) - - The example above defines a singular and pluralized - version of "Hello World". The number two tells the - gettext system that we have two worlds in that case. - Some languages provide more than just one plural form - so this number allows it to decide which plural form - to use. - - If you just have a singular string you can use this:: - - _ = req.gettext - _('This is just a small example') - - Strings marked as ``_()`` automagically get tracked - by the gettext translation generator script. - </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">translations</span>, <span class="name">languages</span>): - <span class="cm">#XXX: should we cache that?</span> - <span class="bn bn-pseudo">self</span>.<span class="name">translator</span> <span class="op">=</span> <span class="name">gettext</span>.<span class="name">NullTranslations</span>() - <span class="kw">for</span> <span class="name">lng</span> <span class="op op-word">in</span> <span class="name">languages</span>: - <span class="kw">for</span> <span class="name">translation</span> <span class="op op-word">in</span> <span class="name">translations</span>[<span class="name">lng</span>]: - <span class="bn bn-pseudo">self</span>.<span class="name">translator</span>.<span class="name">add_fallback</span>(<span class="name">translation</span>) - <span class="bn bn-pseudo">self</span>.<span class="name">languages</span> <span class="op">=</span> <span class="name">languages</span> - - <span class="kw">def </span><span class="fun">__call__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">msg</span>, <span class="name">plural</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, <span class="name">n</span><span class="op">=</span><span class="nb nb-int">1</span>): - <span class="kw">if</span> <span class="name">plural</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">translator</span>.<span class="name">ugettext</span>(<span class="name">msg</span>) - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">translator</span>.<span class="name">ungettext</span>(<span class="name">msg</span>, <span class="name">plural</span>, <span class="name">n</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">%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">languages</span> - - ) - - -<span class="name">dummy_translate</span> <span class="op">=</span> <span class="name">Translator</span>({}, []) - - -<span class="kw">class </span><span class="cls">I18nWrapper</span>(<span class="name">RequestWrapper</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="bn">super</span>(<span class="name">I18nWrapper</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>) - <span class="bn bn-pseudo">self</span>.<span class="name">translations</span> <span class="op">=</span> {} - - <span class="kw">def </span><span class="fun">get_priority</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="nb nb-int">4</span> - - <span class="kw">def </span><span class="fun">process_request</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="st st-db">"""</span><span class="st">Attach a gettext and dummy translate method to the request.</span><span class="st st-db">"""</span> - <span class="name">languages</span> <span class="op">=</span> <span class="name">get_request_languages</span>(<span class="name">req</span>) - <span class="name">req</span>.<span class="name">accept_languages</span> <span class="op">=</span> <span class="name">languages</span> - - <span class="kw">for</span> <span class="name">lng</span> <span class="op op-word">in</span> <span class="name">languages</span>: - <span class="kw">if</span> <span class="name">lng</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">translations</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">translations</span>[<span class="name">lng</span>] <span class="op">=</span> <span class="name">load_translations</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">lng</span>) - <span class="name">req</span>.<span class="name">gettext</span> <span class="op">=</span> <span class="name">Translator</span>(<span class="bn bn-pseudo">self</span>.<span class="name">translations</span>, <span class="name">languages</span>) - <span class="name">req</span>.<span class="name">dummy_translate</span> <span class="op">=</span> <span class="name">dummy_translate</span> - - <span class="kw">def </span><span class="fun">process_response</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">resp</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 - ~~~~~~~~~~~~~~ - - The Pocoo core component. - - :copyright: 2006 by the Pocoo team. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.l10n - ~~~~~~~~~~~~~~~~~~~ - - Pocoo localisation module. - - :copyright: 2006 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.utils.text</span><span class="kw"> import</span> <span class="name">split_format</span> - -<span class="kw">from </span><span class="cls">datetime</span><span class="kw"> import</span> <span class="name">datetime</span> -<span class="kw">import </span><span class="cls">time</span> -<span class="kw">from </span><span class="cls">calendar</span><span class="kw"> import</span> <span class="name">monthrange</span> - -<span class="cm"># Dateformat Constants</span> -<span class="name">DEFAULT_DATE_FORMAT</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">%a, </span><span class="st st-int">%d</span><span class="st"> %b %Y</span><span class="st st-sg">'</span> -<span class="name">DEFAULT_TIME_FORMAT</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">%H:%M</span><span class="st st-sg">'</span> - -<span class="name">DEFAULT_DATETIME_FORMAT</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">%a, </span><span class="st st-int">%d</span><span class="st"> %b %Y %H:%M</span><span class="st st-sg">'</span> - -<span class="cm"># Timedelta Constants</span> -<span class="name">TIME_DELTA_UNITS</span> <span class="op">=</span> [ - (<span class="nb nb-int">3600</span> <span class="op">*</span> <span class="nb nb-int">24</span> <span class="op">*</span> <span class="nb nb-int">365</span>, <span class="st st-sg">'</span><span class="st">y</span><span class="st st-sg">'</span>), - (<span class="nb nb-int">3600</span> <span class="op">*</span> <span class="nb nb-int">24</span> <span class="op">*</span> <span class="nb nb-int">30</span>, <span class="st st-sg">'</span><span class="st">M</span><span class="st st-sg">'</span>), - (<span class="nb nb-int">3600</span> <span class="op">*</span> <span class="nb nb-int">24</span> <span class="op">*</span> <span class="nb nb-int">7</span>, <span class="st st-sg">'</span><span class="st">w</span><span class="st st-sg">'</span>), - (<span class="nb nb-int">3600</span> <span class="op">*</span> <span class="nb nb-int">24</span>, <span class="st st-sg">'</span><span class="st">d</span><span class="st st-sg">'</span>), - (<span class="nb nb-int">3600</span>, <span class="st st-sg">'</span><span class="st">h</span><span class="st st-sg">'</span>), - (<span class="nb nb-int">60</span>, <span class="st st-sg">'</span><span class="st">m</span><span class="st st-sg">'</span>) -] - - -<span class="cm"># Gettext Helper</span> -<span class="name">_</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">x</span>: <span class="name">x</span> - -<span class="kw">class </span><span class="cls">DateFormatter</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - - TODO: write documentation about the various format codes. - </span><span class="st st-db">"""</span> - <span class="cm"># XXX: use "caching" of lists with static strings (weekdays...)</span> - - <span class="cm"># allow format_X method names</span> - <span class="cm"># pylint: disable-msg=C0103</span> - - <span class="name">WEEKDAYS_ABBR</span> <span class="op">=</span> [<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Mon</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Tue</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Wed</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Thu</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Fri</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Sat</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Sun</span><span class="st st-sg">'</span>)] - <span class="name">WEEKDAYS_FULL</span> <span class="op">=</span> [<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Monday</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Tuesday</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Wednesday</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Thursday</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Friday</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Saturday</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Sunday</span><span class="st st-sg">'</span>)] - <span class="name">MONTHS_ABBR</span> <span class="op">=</span> [<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Jan</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Feb</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Mar</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Apr</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">May:abbr</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Jun</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Jul</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Aug</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Sep</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Oct</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Nov</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Dec</span><span class="st st-sg">'</span>)] - <span class="name">MONTHS_FULL</span> <span class="op">=</span> [<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">January</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">February</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">March</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">April</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">May:full</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">June</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">July</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">August</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">September</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">October</span><span class="st st-sg">'</span>), <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">November</span><span class="st st-sg">'</span>), - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">December</span><span class="st st-sg">'</span>)] - - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">dateobj</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">req</span> <span class="op">=</span> <span class="name">req</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">dateobj</span>, <span class="name">datetime</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">date</span> <span class="op">=</span> <span class="name">dateobj</span> - - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">dateobj</span>, <span class="bn">int</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">date</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcfromtimestamp</span>(<span class="name">dateobj</span>) - <span class="kw">elif</span> <span class="bn">isinstance</span>(<span class="name">dateobj</span>, <span class="name">time</span>.<span class="name">struct_time</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">date</span> <span class="op">=</span> <span class="name">datetime</span>(<span class="name">dateobj</span>[:<span class="nb nb-int">7</span>]) - <span class="kw">elif</span> <span class="name">dateobj</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">date</span> <span class="op">=</span> <span class="name">datetime</span>(<span class="nb nb-int">1</span>, <span class="nb nb-int">1</span>, <span class="nb nb-int">1</span>) - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="exc">TypeError</span>(<span class="st st-sg">'</span><span class="st st-int">%r</span><span class="st"> is not a valid time object</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">dateobj</span>) - - <span class="kw">def </span><span class="fun">format</span>(<span class="bn bn-pseudo">self</span>, <span class="name">formatstring</span>): - <span class="name">bits</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">bit</span> <span class="op op-word">in</span> <span class="name">split_format</span>(<span class="name">formatstring</span>): - <span class="kw">if</span> <span class="name">bit</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">%</span><span class="st st-sg">'</span>): - <span class="name">handler</span> <span class="op">=</span> <span class="bn">getattr</span>(<span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">format_</span><span class="st st-sg">'</span> <span class="op">+</span> <span class="name">bit</span>[<span class="nb nb-int">1</span>], <span class="bn bn-pseudo">None</span>) - <span class="kw">if</span> <span class="name">handler</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">bits</span>.<span class="name">append</span>(<span class="name">handler</span>()) - <span class="kw">else</span>: - <span class="name">bits</span>.<span class="name">append</span>(<span class="name">bit</span>) - <span class="kw">else</span>: - <span class="name">bits</span>.<span class="name">append</span>(<span class="name">bit</span>) - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">''</span>.<span class="name">join</span>(<span class="name">bits</span>) - - <span class="kw">def </span><span class="fun">format_a</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">abbreviated weekday name.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">WEEKDAYS_ABBR</span>[<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">weekday</span>()]) - - <span class="kw">def </span><span class="fun">format_A</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">full weekday name.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">WEEKDAYS_FULL</span>[<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">weekday</span>()]) - - <span class="kw">def </span><span class="fun">format_b</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">abbreviated month name.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">MONTHS_ABBR</span>[<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">month</span> <span class="op">-</span> <span class="nb nb-int">1</span>]) - - <span class="kw">def </span><span class="fun">format_B</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">full month name.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="bn bn-pseudo">self</span>.<span class="name">MONTHS_FULL</span>[<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">month</span> <span class="op">-</span> <span class="nb nb-int">1</span>]) - - <span class="kw">def </span><span class="fun">format_d</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Day of the month as a decimal number [01,31].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">day</span>) - - <span class="kw">def </span><span class="fun">format_H</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Hour (24-hour clock) as a decimal number [00,23].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">hour</span>) - - <span class="kw">def </span><span class="fun">format_I</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Hour (12-hour clock) as a decimal number [01,12].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">hour</span> <span class="op">%</span> <span class="nb nb-int">12</span>) - - <span class="kw">def </span><span class="fun">format_j</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Day of the year as a decimal number [001,366].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%j</span><span class="st st-sg">'</span>)) - - <span class="kw">def </span><span class="fun">format_J</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Day of the year as decimal number [1,366].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn">int</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%j</span><span class="st st-sg">'</span>))) - - <span class="kw">def </span><span class="fun">format_m</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Month as a decimal number [01,12].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st st-int">%02d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">month</span> - - <span class="kw">def </span><span class="fun">format_n</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Month as a decimal number [1,12].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">month</span>) - - <span class="kw">def </span><span class="fun">format_M</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Minute as a decimal number [00,59].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st st-int">%02d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">minute</span> - - <span class="kw">def </span><span class="fun">format_N</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Minute as a decimal number [0,59].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">minute</span>) - - <span class="kw">def </span><span class="fun">format_p</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Locale's equivalent of either AM or PM.</span><span class="st st-db">"""</span> - - <span class="name">_</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span> - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">hour</span> <span class="op">></span> <span class="nb nb-int">11</span>: - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">PM</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">AM</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">format_P</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Locale's equivalent of either a.m. or p.m.</span><span class="st st-db">"""</span> - - <span class="name">_</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span> - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">hour</span> <span class="op">></span> <span class="nb nb-int">11</span>: - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">p.m.</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">a.m.</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">format_s</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Second as a decimal number [0,61].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">second</span>) - - <span class="kw">def </span><span class="fun">format_S</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Second as a decimal number [00,61].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st st-int">%02d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">second</span> - - <span class="kw">def </span><span class="fun">format_U</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Week number of the year (Sunday as the first day of the week) - as a decimal number [00,53]. All days in a new year preceding the - first Sunday are considered to be in week 0.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%U</span><span class="st st-sg">'</span>)) - - <span class="kw">def </span><span class="fun">format_u</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Week number of the year (Sunday as the first day of the week) - as a decimal number [0,53]. All days in a new year preceding the - first Sunday are considered to be in week 0.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn">int</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%U</span><span class="st st-sg">'</span>))) - - <span class="kw">def </span><span class="fun">format_w</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Weekday as a decimal number [0(Sunday),6].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%w</span><span class="st st-sg">'</span>)) - - <span class="kw">def </span><span class="fun">format_z</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Weekday as a decimal number [0(Monday),6].</span><span class="st st-db">"""</span> - - <span class="cm">#XXX: anyone something better than z?</span> - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">weekday</span>) - - <span class="kw">def </span><span class="fun">format_W</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Week number of the year (Monday as the first day of the week) - as a decimal number [00,53]. All days in a new year preceding the - first Monday are considered to be in week 0.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%W</span><span class="st st-sg">'</span>)) - - <span class="kw">def </span><span class="fun">format_v</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Week number of the year (Monday as the first day of the week) - as a decimal number [0,53]. All days in a new year preceding the - first Monday are considered to be in week 0.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn">int</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%W</span><span class="st st-sg">'</span>))) - - <span class="kw">def </span><span class="fun">format_y</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Year without century as a decimal number [00,99].</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">strftime</span>(<span class="st st-sg">'</span><span class="st">%y</span><span class="st st-sg">'</span>)) - - <span class="kw">def </span><span class="fun">format_Y</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Year with century as a decimal number.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">unicode</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">year</span>) - - <span class="kw">def </span><span class="fun">format_r</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">English ordinal suffix for the day of the month, 2 characters; - i.e. 'st', 'nd', 'rd' or 'th'</span><span class="st st-db">"""</span> - - <span class="name">_</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">gettext</span> - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">day</span> <span class="op op-word">in</span> (<span class="nb nb-int">11</span>, <span class="nb nb-int">12</span>, <span class="nb nb-int">13</span>): - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">th</span><span class="st st-sg">'</span>) - <span class="name">last</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">day</span> <span class="op">%</span> <span class="nb nb-int">10</span> - - <span class="kw">if</span> <span class="name">last</span> <span class="op">==</span> <span class="nb nb-int">1</span>: - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">st</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">last</span> <span class="op">==</span> <span class="nb nb-int">2</span>: - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">nd</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">last</span> <span class="op">==</span> <span class="nb nb-int">3</span>: - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">rd</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">th</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">format_t</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Number of days in the given month; i.e. '28' to '31'</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st st-int">%02d</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">monthrange</span>(<span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">year</span>, <span class="bn bn-pseudo">self</span>.<span class="name">date</span>.<span class="name">month</span>)[<span class="nb nb-int">1</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">%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="st st-sg">'</span><span class="st">, </span><span class="st st-sg">'</span>.<span class="name">join</span>(<span class="bn">str</span>(<span class="name">i</span>[<span class="nb nb-int">7</span>:]) <span class="kw">for</span> <span class="name">i</span> <span class="op op-word">in</span> <span class="bn">dir</span>(<span class="bn bn-pseudo">self</span>) <span class="kw">if</span> <span class="name">i</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">format_</span><span class="st st-sg">'</span>)) - ) - - - -<span class="kw">def </span><span class="fun">format_timedelta</span>(<span class="name">req</span>, <span class="name">time1</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, <span class="name">time2</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st"> - Format the difference between two datetime or unix timestamp objects:: - - >>> from pocoo.pkg.core.l10n import timedeltaformat - >>> now = datetime.now() - >>> timedeltaformat(req, now) - u'6 seconds ago' - - </span><span class="st st-db">"""</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">time1</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">time1</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>() - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">time1</span>, <span class="name">datetime</span>): - <span class="name">time1</span> <span class="op">=</span> <span class="name">time</span>.<span class="name">mktime</span>(<span class="name">time1</span>.<span class="name">timetuple</span>()) <span class="op">+</span> <span class="name">time1</span>.<span class="name">microsecond</span> <span class="op">/</span> <span class="nb nb-int">1</span><span class="name">e6</span> - - <span class="kw">if</span> <span class="name">time2</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">time2</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>() - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">time2</span>, <span class="name">datetime</span>): - <span class="name">time2</span> <span class="op">=</span> <span class="name">time</span>.<span class="name">mktime</span>(<span class="name">time2</span>.<span class="name">timetuple</span>()) <span class="op">+</span> <span class="name">time2</span>.<span class="name">microsecond</span> <span class="op">/</span> <span class="nb nb-int">1</span><span class="name">e6</span> - - <span class="kw">if</span> <span class="name">time1</span> <span class="op">></span> <span class="name">time2</span>: - <span class="name">tmpl</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st st-int">%d</span><span class="st"> </span><span class="st st-int">%s</span><span class="st"> in the future</span><span class="st st-sg">'</span>) - <span class="kw">else</span>: - <span class="name">tmpl</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st st-int">%d</span><span class="st"> </span><span class="st st-int">%s</span><span class="st"> ago</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">trans</span>(<span class="name">s</span>, <span class="name">entity</span>): - <span class="kw">if</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">s</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">second</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">seconds</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">elif</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">m</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">minute</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">minutes</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">elif</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">h</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">hour</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">hours</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">elif</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">d</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">day</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">days</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">elif</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">w</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">week</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">weeks</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">elif</span> <span class="name">entity</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">M</span><span class="st st-sg">'</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">month</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">months</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">else</span>: - <span class="name">e</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">year</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">years</span><span class="st st-sg">'</span>, <span class="name">s</span>) - <span class="kw">return</span> <span class="name">tmpl</span> <span class="op">%</span> (<span class="name">s</span>, <span class="name">e</span>) - <span class="name">diff</span> <span class="op">=</span> <span class="bn">abs</span>(<span class="bn">int</span>(<span class="name">time2</span> <span class="op">-</span> <span class="name">time1</span>)) - <span class="kw">for</span> <span class="name">u</span>, <span class="name">e</span> <span class="op op-word">in</span> <span class="name">TIME_DELTA_UNITS</span>: - <span class="name">r</span> <span class="op">=</span> <span class="name">diff</span> <span class="op">/</span> <span class="bn">float</span>(<span class="name">u</span>) - <span class="kw">if</span> <span class="name">r</span> <span class="op">>=</span> <span class="nb nb-flt">0.9</span>: - <span class="name">s</span> <span class="op">=</span> <span class="bn">int</span>(<span class="bn">round</span>(<span class="name">r</span>)) - <span class="kw">return</span> <span class="name">trans</span>(<span class="name">s</span>, <span class="name">e</span>) - <span class="kw">return</span> <span class="name">trans</span>(<span class="name">diff</span>, <span class="st st-sg">'</span><span class="st">s</span><span class="st st-sg">'</span>) - - - -<span class="kw">def </span><span class="fun">dateformat</span>(<span class="name">date</span>, <span class="name">context</span>): - <span class="cm">#XXX: load default string from i10n language file</span> - <span class="name">req</span> <span class="op">=</span> <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">REQUEST</span><span class="st st-sg">'</span>] - <span class="name">formatstr</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">dateformat</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">formatstr</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">formatstr</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">general</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">dateformat</span><span class="st st-sg">'</span>, - <span class="name">DEFAULT_DATE_FORMAT</span>) - <span class="name">f</span> <span class="op">=</span> <span class="name">DateFormatter</span>(<span class="name">req</span>, <span class="name">date</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>) - <span class="kw">return</span> <span class="name">f</span>.<span class="name">format</span>(<span class="name">formatstr</span>) - - - -<span class="kw">def </span><span class="fun">timeformat</span>(<span class="name">date</span>, <span class="name">context</span>): - <span class="cm">#XXX: load default string from l10n language file</span> - <span class="name">req</span> <span class="op">=</span> <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">REQUEST</span><span class="st st-sg">'</span>] - <span class="name">formatstr</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">timeformat</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">formatstr</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">formatstr</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">general</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">timeformat</span><span class="st st-sg">'</span>, - <span class="name">DEFAULT_TIME_FORMAT</span>) - <span class="name">f</span> <span class="op">=</span> <span class="name">DateFormatter</span>(<span class="name">req</span>, <span class="name">date</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>) - <span class="kw">return</span> <span class="name">f</span>.<span class="name">format</span>(<span class="name">formatstr</span>) - - - -<span class="kw">def </span><span class="fun">datetimeformat</span>(<span class="name">date</span>, <span class="name">context</span>): - <span class="cm">#XXX: load default string from l10n language file</span> - <span class="name">req</span> <span class="op">=</span> <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">REQUEST</span><span class="st st-sg">'</span>] - <span class="name">formatstr</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">datetimeformat</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">formatstr</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">formatstr</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">general</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">datetimeformat</span><span class="st st-sg">'</span>, - <span class="name">DEFAULT_DATETIME_FORMAT</span>) - <span class="name">f</span> <span class="op">=</span> <span class="name">DateFormatter</span>(<span class="name">req</span>, <span class="name">date</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>) - <span class="kw">return</span> <span class="name">f</span>.<span class="name">format</span>(<span class="name">formatstr</span>) - - - -<span class="kw">def </span><span class="fun">timedeltaformat</span>(<span class="name">date</span>, <span class="name">context</span>, <span class="name">obj2</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="name">req</span> <span class="op">=</span> <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">REQUEST</span><span class="st st-sg">'</span>] - <span class="kw">return</span> <span class="name">format_timedelta</span>(<span class="name">req</span>, <span class="name">date</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>, <span class="name">obj2</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>) - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.pages - ~~~~~~~~~~~~~~~~~~~~ - - Pocoo core pages. - - :copyright: 2006 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">pocoo.http</span><span class="kw"> import</span> <span class="name">Response</span>, <span class="name">HttpRedirect</span>, <span class="name">TemplateResponse</span>, \ - <span class="name">AccessDeniedResponse</span>, <span class="name">PageNotFound</span> - -<span class="kw">from </span><span class="cls">pocoo.settings</span><span class="kw"> import</span> <span class="name">cfg</span> -<span class="kw">from </span><span class="cls">pocoo.template</span><span class="kw"> import</span> <span class="name">PagePublisher</span>, <span class="name">render_template</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.utils.mail</span><span class="kw"> import</span> <span class="name">Email</span> -<span class="kw">from </span><span class="cls">pocoo.utils.net</span><span class="kw"> import</span> <span class="name">make_url_context_external</span> -<span class="kw">from </span><span class="cls">pocoo.utils.form</span><span class="kw"> import</span> <span class="name">Form</span>, <span class="name">TextField</span>, <span class="name">TextArea</span>, <span class="name">SelectBox</span>, <span class="name">CheckBox</span> - -<span class="kw">from </span><span class="cls">pocoo.utils.validators</span><span class="kw"> import</span> <span class="name">isNotEmpty</span>, <span class="name">isSameValue</span>, <span class="name">isEmail</span>, \ - <span class="name">checkTextLength</span>, <span class="name">isOneLetter</span>, <span class="name">mayEmpty</span>, <span class="name">coppaIsChecked</span> - -<span class="kw">from </span><span class="cls">pocoo.utils.json</span><span class="kw"> import</span> <span class="name">parse_datetime</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.remotecall</span><span class="kw"> import</span> <span class="name">RemoteCallable</span>, <span class="name">export</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.validators</span><span class="kw"> import</span> <span class="name">isAvailableUsername</span>, <span class="name">isStrongPassword</span>, \ - <span class="name">isExistingUsername</span>, <span class="name">isAnonymousUsername</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.usersettings</span><span class="kw"> import</span> <span class="name">UserSettingsPage</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.db</span><span class="kw"> import</span> <span class="name">users</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.forum</span><span class="kw"> import</span> <span class="name">get_forum_index</span>, <span class="name">get_forum</span>, <span class="name">get_post_tree</span>, \ - <span class="name">get_forum_pathbar</span>, <span class="name">get_view_mode</span>, <span class="name">get_flat_view</span>, <span class="name">quote_post</span>, <span class="name">edit_post</span>, \ - <span class="name">get_post</span>, <span class="name">Thread</span>, <span class="name">get_last_posts</span>, <span class="name">get_last_thread_change</span>, <span class="name">get_post_pathbar</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="name">get_user_list</span>, \ - <span class="name">get_user</span>, <span class="name">get_user_avatar</span>, <span class="name">reset_password</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.session</span><span class="kw"> import</span> <span class="name">get_active_sessions</span>, <span class="name">get_sessions_by_action</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">get_editor</span> - -<span class="name">_</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">x</span>: <span class="name">x</span> - - -<span class="kw">class </span><span class="cls">IndexPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>, <span class="name">RemoteCallable</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">index</span><span class="st st-sg">'</span> - - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">''</span> - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="name">u</span><span class="st st-sg">'</span><span class="st">$</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">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">index.html</span><span class="st st-sg">'</span>, - <span class="name">categories</span><span class="op">=</span><span class="name">get_forum_index</span>(<span class="name">req</span>), - <span class="name">feed_url</span><span class="op">=</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/recent.xml</span><span class="st st-sg">'</span>) - ) - - - -<span class="kw">class </span><span class="cls">ForumPage</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">forum/(?P<forum_id>\d+)$</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">forum_id</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">try</span>: - <span class="name">page</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">req</span>.<span class="name">args</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">page</span><span class="st st-sg">'</span>)) - <span class="kw">except</span> (<span class="exc">TypeError</span>, <span class="exc">ValueError</span>): - <span class="name">page</span> <span class="op">=</span> <span class="nb nb-int">1</span> - - <span class="name">forum</span> <span class="op">=</span> <span class="name">get_forum</span>(<span class="name">req</span>, <span class="name">forum_id</span>, <span class="name">page</span>) - <span class="kw">if</span> <span class="name">forum</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="cm"># Redirect if the forum is a link</span> - - <span class="kw">if</span> <span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">is_external_url</span><span class="st st-sg">'</span>]: - <span class="kw">return</span> <span class="name">HttpRedirect</span>(<span class="name">forum</span>[<span class="st st-sg">'</span><span class="st">link</span><span class="st st-sg">'</span>], <span class="name">local</span><span class="op">=</span><span class="bn bn-pseudo">False</span>) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">viewforum.html</span><span class="st st-sg">'</span>, - <span class="name">forum</span><span class="op">=</span><span class="name">forum</span>, - <span class="name">pathbar</span><span class="op">=</span><span class="name">get_forum_pathbar</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">forum_id</span>), - <span class="name">feed_url</span><span class="op">=</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/forum/</span><span class="st st-int">%d</span><span class="st">.xml</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">forum_id</span>) - ) - - - -<span class="kw">class </span><span class="cls">PostPage</span>(<span class="name">RequestHandler</span>, <span class="name">RemoteCallable</span>): - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">r'</span><span class="st">post/(?P<post_id>\d+)$</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">post_id</span>): - <span class="name">view</span> <span class="op">=</span> <span class="name">get_view_mode</span>(<span class="name">req</span>) - <span class="kw">if</span> <span class="name">view</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">flat</span><span class="st st-sg">'</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">_flat_view</span>(<span class="name">req</span>, <span class="bn">int</span>(<span class="name">post_id</span>)) - <span class="kw">else</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">_threaded_view</span>(<span class="name">req</span>, <span class="bn">int</span>(<span class="name">post_id</span>)) - - <span class="kw">def </span><span class="fun">_flat_view</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>): - <span class="name">topic</span> <span class="op">=</span> <span class="name">get_flat_view</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">if</span> <span class="name">topic</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">viewtopic.html</span><span class="st st-sg">'</span>, - <span class="name">topic</span><span class="op">=</span><span class="name">topic</span>, - <span class="name">pathbar</span><span class="op">=</span><span class="name">get_post_pathbar</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">topic</span>[<span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>][<span class="nb nb-int">0</span>][<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]), - <span class="name">feed_url</span><span class="op">=</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/thread/</span><span class="st st-int">%d</span><span class="st">.xml</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post_id</span>) - ) - - <span class="kw">def </span><span class="fun">_threaded_view</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>): - <span class="name">thread</span> <span class="op">=</span> <span class="name">get_post_tree</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">if</span> <span class="name">thread</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">viewthread.html</span><span class="st st-sg">'</span>, - <span class="name">thread</span><span class="op">=</span><span class="name">thread</span>, - <span class="name">pathbar</span><span class="op">=</span><span class="name">get_post_pathbar</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">thread</span>[<span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>][<span class="nb nb-int">0</span>][<span class="st st-sg">'</span><span class="st">post_id</span><span class="st st-sg">'</span>]), - <span class="name">feed_url</span><span class="op">=</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/thread/</span><span class="st st-int">%d</span><span class="st">.xml</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">post_id</span>) - ) - - <span class="deco">@export</span>(<span class="st st-sg">'</span><span class="st">thread.get_post</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">_get_post</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>): - <span class="name">post</span> <span class="op">=</span> <span class="name">get_post</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">if</span> <span class="name">post</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">render_template</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">partial/post.html</span><span class="st st-sg">'</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="deco">@export</span>(<span class="st st-sg">'</span><span class="st">thread.tree_requires_update</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">_tree_requires_update</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>, <span class="name">last_update</span>): - <span class="name">last_update</span> <span class="op">=</span> <span class="name">parse_datetime</span>(<span class="name">last_update</span>) - <span class="name">last_thread_change</span> <span class="op">=</span> <span class="name">get_last_thread_change</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">print</span> <span class="name">last_thread_change</span>, <span class="name">last_update</span> - - <span class="kw">return</span> <span class="name">last_thread_change</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">last_thread_change</span> <span class="op">></span> <span class="name">last_update</span> - - <span class="deco">@export</span>(<span class="st st-sg">'</span><span class="st">thread.get_tree</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">_get_tree</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">post_id</span>): - <span class="kw">return</span> <span class="name">render_template</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">partial/tree.html</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">get_post_tree</span>(<span class="name">req</span>, <span class="name">post_id</span>)[<span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>] - }) - - - -<span class="kw">class </span><span class="cls">LoginPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">login</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">login</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">'</span><span class="st">^login$</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">next</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">values</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">next</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">None</span>) - <span class="kw">if</span> <span class="name">next</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">next</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">environ</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">HTTP_REFERER</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">next</span>: - <span class="name">next</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">''</span> - - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - <span class="name">msg</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">''</span> - <span class="kw">if</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>: - <span class="kw">return</span> <span class="name">HttpRedirect</span>(<span class="name">next</span>) - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isNotEmpty</span>()), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isNotEmpty</span>()) - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">login</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">auth</span>.<span class="name">do_login</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="name">d</span>[<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>]) - <span class="kw">if</span> <span class="name">login</span>: - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">login</span>, <span class="name">Response</span>): - <span class="kw">return</span> <span class="name">login</span> - - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/login.html</span><span class="st st-sg">'</span>, - <span class="name">username</span><span class="op">=</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="name">next</span><span class="op">=</span><span class="name">next</span> - - ) - <span class="kw">else</span>: - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Login failed. You may have entered an invalid </span><span class="st st-sg">'</span> - <span class="st st-sg">'</span><span class="st">username or password or your account is not </span><span class="st st-sg">'</span> - <span class="st st-sg">'</span><span class="st">activated yet.</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">login.html</span><span class="st st-sg">'</span>, - <span class="name">msg</span><span class="op">=</span><span class="name">msg</span>, - <span class="name">form</span><span class="op">=</span><span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="name">next</span><span class="op">=</span><span class="name">next</span> - - ) - - -<span class="kw">class </span><span class="cls">LogoutPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">logout</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">logout</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">r'</span><span class="st">logout$</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">back</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">environ</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">HTTP_REFERER</span><span class="st st-sg">'</span>, <span class="name">u</span><span class="st st-sg">''</span>) - <span class="kw">try</span>: - <span class="name">back</span> <span class="op">=</span> <span class="name">make_url_context_external</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">back</span>) - <span class="kw">except</span> <span class="exc">ValueError</span>: - <span class="name">back</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">username</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">username</span> - <span class="name">req</span>.<span class="name">auth</span>.<span class="name">do_logout</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/logout.html</span><span class="st st-sg">'</span>, - <span class="name">username</span><span class="op">=</span><span class="name">username</span>, - <span class="name">back</span><span class="op">=</span><span class="name">back</span> - - ) - - -<span class="kw">class </span><span class="cls">RegisterPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">register</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">register</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">'</span><span class="st">register$</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">coppa</span> <span class="op">=</span> <span class="name">req</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">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">enable_coppa</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>: - <span class="kw">return</span> <span class="name">HttpRedirect</span>(<span class="st st-sg">''</span>) - <span class="kw">if</span> <span class="st st-sg">'</span><span class="st">activate</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span> <span class="op op-word">and</span> <span class="st st-sg">'</span><span class="st">user</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">activation</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="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isAvailableUsername</span>()), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isStrongPassword</span>()), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">password2</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isSameValue</span>(<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>, - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The passwords don</span><span class="st st-esc">\'</span><span class="st">t match.</span><span class="st st-sg">'</span>))), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isEmail</span>()), - <span class="name">CheckBox</span>(<span class="st st-sg">'</span><span class="st">coppa</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">coppaIsChecked</span>(<span class="name">coppa</span>)), - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">requires_activation</span> <span class="op">=</span> <span class="name">req</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">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">email_verification</span><span class="st st-sg">'</span>) - <span class="name">user</span> <span class="op">=</span> <span class="name">User</span>.<span class="name">create</span>(<span class="name">req</span>.<span class="name">ctx</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="name">d</span>[<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>], - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>], - <span class="name">requires_activation</span> - - ) - <span class="kw">if</span> <span class="name">requires_activation</span>: - <span class="name">link</span> <span class="op">=</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="st">register?user=</span><span class="st st-int">%s</span><span class="st">&key</span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> - - (<span class="name">user</span>.<span class="name">user_id</span>, <span class="name">user</span>.<span class="name">act_key</span>)) - <span class="name">txt</span> <span class="op">=</span> <span class="name">render_template</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">mails/welcome_verification.txt</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="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>: <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">forum_name</span><span class="st st-sg">'</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">title</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">activate_link</span><span class="st st-sg">'</span>: <span class="name">link</span> - - }) - <span class="name">mail</span> <span class="op">=</span> <span class="name">Email</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Welcome to the </span><span class="st st-int">%s</span><span class="st st-sg">'</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">title</span><span class="st st-sg">'</span>), - <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>], <span class="name">txt</span>) - <span class="name">mail</span>.<span class="name">send</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/register.html</span><span class="st st-sg">'</span>, - <span class="name">requires_activation</span><span class="op">=</span><span class="name">requires_activation</span>, - <span class="name">username</span><span class="op">=</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="name">email</span><span class="op">=</span><span class="name">d</span>[<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>] - ) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">register.html</span><span class="st st-sg">'</span>, - <span class="name">form</span><span class="op">=</span><span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - ) - - <span class="kw">def </span><span class="fun">activation</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="name">uid</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">req</span>.<span class="name">args</span>[<span class="st st-sg">'</span><span class="st">user</span><span class="st st-sg">'</span>]) - <span class="name">activated</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="name">username</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">''</span> - <span class="kw">try</span>: - <span class="name">user</span> <span class="op">=</span> <span class="name">User</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">uid</span>) - <span class="name">key</span> <span class="op">=</span> <span class="name">user</span>.<span class="name">act_key</span> - - <span class="kw">except</span> <span class="exc">KeyError</span>: - <span class="kw">pass</span> - <span class="kw">else</span>: - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">user</span>.<span class="name">active</span> <span class="op op-word">and</span> <span class="name">req</span>.<span class="name">args</span>[<span class="st st-sg">'</span><span class="st">activate</span><span class="st st-sg">'</span>] <span class="op">==</span> <span class="name">key</span>: - <span class="name">user</span>.<span class="name">activate</span>() - <span class="name">activated</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="name">username</span> <span class="op">=</span> <span class="name">user</span>.<span class="name">username</span> - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/activation.html</span><span class="st st-sg">'</span>, - <span class="name">username</span><span class="op">=</span><span class="name">username</span>, - <span class="name">activated</span><span class="op">=</span><span class="name">activated</span> - - ) - - -<span class="kw">class </span><span class="cls">NewPostPage</span>(<span class="name">RequestHandler</span>, <span class="name">RemoteCallable</span>): - <span class="name">handler_regexes</span> <span class="op">=</span> [ - (<span class="st st-sg">r'</span><span class="st">post/(?P<post_id>\d+)/reply$</span><span class="st st-sg">'</span>, - {<span class="st st-sg">'</span><span class="st">action</span><span class="st st-sg">'</span>:<span class="st st-sg">'</span><span class="st">reply</span><span class="st st-sg">'</span>}), - (<span class="st st-sg">r'</span><span class="st">post/(?P<post_id>\d+)/quote$</span><span class="st st-sg">'</span>, - {<span class="st st-sg">'</span><span class="st">action</span><span class="st st-sg">'</span>:<span class="st st-sg">'</span><span class="st">quote</span><span class="st st-sg">'</span>}), - (<span class="st st-sg">r'</span><span class="st">post/(?P<post_id>\d+)/edit$</span><span class="st st-sg">'</span>, - {<span class="st st-sg">'</span><span class="st">action</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="kw">def </span><span class="fun">handle_request</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">action</span>, <span class="name">post_id</span>): - <span class="kw">try</span>: - <span class="name">thread</span> <span class="op">=</span> <span class="name">Thread</span>.<span class="name">by_child</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">post_id</span>) - <span class="kw">except</span> <span class="exc">ValueError</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="cm"># note: quote_post can raise a ValueError when a post does</span> - <span class="cm"># not exist. but since we check for that by calling</span> - <span class="cm"># Thread.by_child this shouldn't happen.</span> - <span class="name">username</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">anonymous</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">action</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">reply</span><span class="st st-sg">'</span>: - <span class="name">mode</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">reply</span><span class="st st-sg">'</span> - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">acl</span>.<span class="name">can_access</span>(<span class="st st-sg">'</span><span class="st">REPLY_POST</span><span class="st st-sg">'</span>, <span class="name">thread</span>): - <span class="kw">return</span> <span class="name">AccessDeniedResponse</span>() - <span class="name">text</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">''</span> - - <span class="name">_</span>, <span class="name">title</span> <span class="op">=</span> <span class="name">quote_post</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">elif</span> <span class="name">action</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">quote</span><span class="st st-sg">'</span>: - <span class="name">mode</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">reply</span><span class="st st-sg">'</span> - - <span class="cm">#XXX: maybe we could use REPLY_POST here too</span> - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">acl</span>.<span class="name">can_access</span>(<span class="st st-sg">'</span><span class="st">QUOTE_POST</span><span class="st st-sg">'</span>, <span class="name">thread</span>): - <span class="kw">return</span> <span class="name">AccessDeniedResponse</span>() - <span class="name">text</span>, <span class="name">title</span> <span class="op">=</span> <span class="name">quote_post</span>(<span class="name">req</span>, <span class="name">post_id</span>) - <span class="kw">else</span>: - <span class="name">mode</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">edit</span><span class="st st-sg">'</span> - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">acl</span>.<span class="name">can_access</span>(<span class="st st-sg">'</span><span class="st">EDIT_POST</span><span class="st st-sg">'</span>, <span class="name">thread</span>): - <span class="kw">return</span> <span class="name">AccessDeniedResponse</span>() - <span class="name">text</span>, <span class="name">title</span>, <span class="name">username</span> <span class="op">=</span> <span class="name">edit_post</span>(<span class="name">req</span>, <span class="name">post_id</span>) - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="name">req</span>.<span class="name">environ</span>[<span class="st st-sg">'</span><span class="st">APPLICATION_REQUEST</span><span class="st st-sg">'</span>], <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isAnonymousUsername</span>(), - <span class="name">default</span><span class="op">=</span><span class="name">username</span>), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">3</span>, <span class="nb nb-int">60</span>), - <span class="name">default</span><span class="op">=</span><span class="name">title</span>), - <span class="name">TextArea</span>(<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">3</span>, <span class="nb nb-int">10000</span>), - <span class="name">default</span><span class="op">=</span><span class="name">text</span>) - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="kw">if</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>: - <span class="name">author</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> - - <span class="kw">else</span>: - <span class="name">author</span> <span class="op">=</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="kw">if</span> <span class="name">action</span> <span class="op op-word">in</span> (<span class="st st-sg">'</span><span class="st">quote</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">reply</span><span class="st st-sg">'</span>): - <span class="name">new_post_id</span> <span class="op">=</span> <span class="name">thread</span>.<span class="name">reply</span>( - <span class="name">post_id</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">post_id</span>), - <span class="name">author</span> <span class="op">=</span> <span class="name">author</span>, - <span class="name">title</span> <span class="op">=</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="name">text</span> <span class="op">=</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">elif</span> <span class="name">action</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">edit</span><span class="st st-sg">'</span>: - <span class="name">new_post_id</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">post_id</span>) - <span class="name">thread</span>.<span class="name">edit_reply</span>( - <span class="name">post_id</span> <span class="op">=</span> <span class="name">new_post_id</span>, - <span class="name">author</span> <span class="op">=</span> <span class="name">author</span>, - <span class="name">title</span> <span class="op">=</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="name">text</span> <span class="op">=</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">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/post.html</span><span class="st st-sg">'</span>, - <span class="name">mode</span> <span class="op">=</span> <span class="name">mode</span>, - <span class="name">post</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">id</span><span class="st st-sg">'</span>: <span class="name">new_post_id</span>, - <span class="st st-sg">'</span><span class="st">title</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">url</span><span class="st st-sg">'</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">post</span><span class="st st-sg">'</span>, <span class="name">new_post_id</span>), - } - ) - <span class="name">js</span>, <span class="name">options</span> <span class="op">=</span> <span class="name">get_editor</span>(<span class="name">req</span>) - <span class="name">latest_posts</span> <span class="op">=</span> <span class="name">get_last_posts</span>(<span class="name">req</span>, <span class="name">thread</span>.<span class="name">root_post_id</span>, <span class="nb nb-int">5</span>) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">newpost.html</span><span class="st st-sg">'</span>, - <span class="name">mode</span> <span class="op">=</span> <span class="name">mode</span>, - <span class="name">form</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="name">show_username_entry</span> <span class="op">=</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>, - <span class="name">editor_options</span> <span class="op">=</span> <span class="name">options</span>, - <span class="name">editor_javascript</span> <span class="op">=</span> <span class="name">js</span>, - <span class="name">post_id</span> <span class="op">=</span> <span class="name">thread</span>.<span class="name">root_post_id</span>, - <span class="name">pathbar</span><span class="op">=</span><span class="name">get_post_pathbar</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">post_id</span>), - <span class="name">latest_posts</span> <span class="op">=</span> <span class="name">latest_posts</span> - - ) - - <span class="deco">@export</span>(<span class="st st-db">"</span><span class="st">newpost.preview</span><span class="st st-db">"</span>) - <span class="kw">def </span><span class="fun">preview</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">text</span>): - <span class="kw">return</span> <span class="name">parse_and_render</span>(<span class="name">req</span>, <span class="name">text</span>) - - <span class="deco">@export</span>(<span class="st st-db">"</span><span class="st">newpost.check</span><span class="st st-db">"</span>) - <span class="kw">def </span><span class="fun">check</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">root_post_id</span>, <span class="name">latest_post</span>, <span class="name">path</span>): - <span class="cm"># check for new posts</span> - - <span class="name">new_posts</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - <span class="name">post</span> <span class="op">=</span> <span class="name">get_last_posts</span>(<span class="name">req</span>, <span class="name">root_post_id</span>, <span class="nb nb-int">1</span>)[<span class="nb nb-int">0</span>] - <span class="name">post_list</span> <span class="op">=</span> [] - <span class="kw">if</span> <span class="name">latest_post</span> <span class="op">!=</span> <span class="name">post</span>[<span class="st st-db">"</span><span class="st">post_id</span><span class="st st-db">"</span>]: - <span class="name">z</span> <span class="op">=</span> <span class="nb nb-int">1</span> - - <span class="kw">while</span> <span class="name">post</span>[<span class="st st-db">"</span><span class="st">post_id</span><span class="st st-db">"</span>] <span class="op">!=</span> <span class="name">latest_post</span> <span class="op op-word">and</span> <span class="name">z</span> <span class="op"><</span> <span class="nb nb-int">5</span>: - <span class="name">post_list</span>.<span class="name">append</span>(<span class="name">post</span>) - <span class="name">post</span> <span class="op">=</span> <span class="name">get_last_posts</span>(<span class="name">req</span>, <span class="name">root_post_id</span>, <span class="nb nb-int">1</span>, <span class="name">z</span>)[<span class="nb nb-int">0</span>] - <span class="name">z</span> <span class="op">+=</span> <span class="nb nb-int">1</span> - - <span class="name">new_posts</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">html</span><span class="st st-sg">'</span>: <span class="name">render_template</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">latestposts.html</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">post_list</span>}), - <span class="st st-sg">'</span><span class="st">last_post</span><span class="st st-sg">'</span>: <span class="name">post_list</span>[<span class="nb nb-int">0</span>][<span class="st st-db">"</span><span class="st">post_id</span><span class="st st-db">"</span>] - } - - <span class="cm"># check for new editors</span> - - <span class="name">new_editors</span> <span class="op">=</span> <span class="name">get_sessions_by_action</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">path</span>) <span class="op op-word">or</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">return</span> (<span class="name">post_list</span> <span class="op op-word">or</span> <span class="name">new_editors</span>) <span class="op op-word">and</span> { - <span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>: <span class="name">new_posts</span>, - <span class="st st-sg">'</span><span class="st">editors</span><span class="st st-sg">'</span>: <span class="name">new_editors</span> - - } <span class="op op-word">or</span> <span class="bn bn-pseudo">False</span> - - -<span class="kw">class </span><span class="cls">NewThreadPage</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">forum/(?P<forum_id>\d+)/new$</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">forum_id</span>): - <span class="cm"># TODO: Check whether user is allowed to do this</span> - - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - <span class="name">forum_id</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">forum_id</span>) - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="name">req</span>.<span class="name">environ</span>[<span class="st st-sg">'</span><span class="st">APPLICATION_REQUEST</span><span class="st st-sg">'</span>], <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isAnonymousUsername</span>(), - <span class="name">default</span><span class="op">=</span><span class="name">_</span>(<span class="st st-sg">'</span><span class="st">anonymous</span><span class="st st-sg">'</span>)), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">3</span>, <span class="nb nb-int">60</span>)), - <span class="name">TextArea</span>(<span class="st st-sg">'</span><span class="st">text</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">3</span>, <span class="nb nb-int">10000</span>)) - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="kw">if</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>: - <span class="name">author</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> - - <span class="kw">else</span>: - <span class="name">author</span> <span class="op">=</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="name">thread</span> <span class="op">=</span> <span class="name">Thread</span>.<span class="name">create</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">forum_id</span>, <span class="name">author</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="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">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/thread.html</span><span class="st st-sg">'</span>, - <span class="name">thread</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>: <span class="name">thread</span>.<span class="name">title</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">post</span><span class="st st-sg">'</span>, <span class="name">thread</span>.<span class="name">root_post_id</span>), - } - ) - - <span class="name">js</span>, <span class="name">options</span> <span class="op">=</span> <span class="name">get_editor</span>(<span class="name">req</span>) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">newthread.html</span><span class="st st-sg">'</span>, - <span class="name">form</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="name">show_username_entry</span> <span class="op">=</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>, - <span class="name">editor_options</span> <span class="op">=</span> <span class="name">options</span>, - <span class="name">editor_javascript</span> <span class="op">=</span> <span class="name">js</span>, - <span class="name">pathbar</span> <span class="op">=</span> <span class="name">get_forum_pathbar</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">forum_id</span>) - ) - - - -<span class="kw">class </span><span class="cls">MemberListPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">memberlist</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">users/</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">r'</span><span class="st">users/$</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">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">generate</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">GET</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">letter</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isOneLetter</span>())), - <span class="name">SelectBox</span>(<span class="st st-sg">'</span><span class="st">order_by</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">_</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">_</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">register_date</span><span class="st st-sg">'</span>, <span class="name">_</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">post_count</span><span class="st st-sg">'</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Number of Posts</span><span class="st st-sg">'</span>)) - ], <span class="name">default</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">SelectBox</span>(<span class="st st-sg">'</span><span class="st">direction</span><span class="st st-sg">'</span>, [ - (<span class="st st-sg">'</span><span class="st">desc</span><span class="st st-sg">'</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Descending</span><span class="st st-sg">'</span>)), - (<span class="st st-sg">'</span><span class="st">asc</span><span class="st st-sg">'</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Ascending</span><span class="st st-sg">'</span>)) - ], <span class="name">default</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">asc</span><span class="st st-sg">'</span>) - ) - - <span class="kw">if</span> <span class="st st-sg">'</span><span class="st">letter</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span> <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">order_by</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span> \ - <span class="op op-word">or</span> <span class="st st-sg">'</span><span class="st">direction</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">args</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">generate</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">else</span>: - <span class="name">generate</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - <span class="kw">if</span> <span class="name">generate</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">userlist</span> <span class="op">=</span> <span class="name">get_user_list</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, - <span class="name">order_by</span><span class="op">=</span><span class="bn">getattr</span>(<span class="name">users</span>.<span class="name">c</span>, <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">order_by</span><span class="st st-sg">'</span>]), - <span class="name">order</span><span class="op">=</span><span class="name">d</span>[<span class="st st-sg">'</span><span class="st">direction</span><span class="st st-sg">'</span>], - <span class="name">letter</span><span class="op">=</span><span class="name">d</span>[<span class="st st-sg">'</span><span class="st">letter</span><span class="st st-sg">'</span>] <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span>, - <span class="name">hide_internal</span><span class="op">=</span><span class="bn bn-pseudo">True</span> - - ) - <span class="kw">else</span>: - <span class="name">userlist</span> <span class="op">=</span> [] - - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">memberlist.html</span><span class="st st-sg">'</span>, - <span class="bn">list</span><span class="op">=</span><span class="name">userlist</span>, - <span class="name">form</span><span class="op">=</span><span class="name">form</span>.<span class="name">generate</span>() - ) - - - -<span class="kw">class </span><span class="cls">UserPage</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">users/(?P<username>.+)$</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">username</span>): - <span class="cm"># TODO: add a permission CAN_VIEW_PROFILE</span> - - <span class="cm"># check avatar</span> - <span class="kw">if</span> <span class="name">req</span>.<span class="name">args</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">show</span><span class="st st-sg">'</span>) <span class="op">==</span> <span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>: - <span class="name">avatar</span> <span class="op">=</span> <span class="name">get_user_avatar</span>(<span class="name">req</span>, <span class="name">username</span>) - <span class="kw">if</span> <span class="name">avatar</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</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">avatar</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">image/png</span><span class="st st-sg">'</span> - - <span class="kw">return</span> <span class="name">resp</span> - <span class="cm"># display user</span> - <span class="name">user</span> <span class="op">=</span> <span class="name">get_user</span>(<span class="name">req</span>, <span class="name">username</span>) - <span class="kw">if</span> <span class="name">user</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">user.html</span><span class="st st-sg">'</span>, - <span class="name">person</span> <span class="op">=</span> <span class="name">user</span> - - ) - - -<span class="kw">class </span><span class="cls">GotoPage</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">goto$</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">if</span> <span class="st st-sg">'</span><span class="st">post</span><span class="st st-sg">'</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">args</span>: - <span class="name">post_id</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">args</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="op">=</span> <span class="name">get_post</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">post_id</span>) - <span class="kw">while</span> <span class="name">post</span>.<span class="name">parent</span>: <span class="cm">#get root_post</span> - - <span class="name">post</span> <span class="op">=</span> <span class="name">post</span>.<span class="name">parent</span> <span class="op op-word">or</span> <span class="name">post</span> - <span class="name">thread</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">db</span>.<span class="name">get</span>(<span class="name">Thread</span>, <span class="name">Thread</span>.<span class="name">c</span>.<span class="name">root_post_id</span> <span class="op">==</span> <span class="name">post</span>.<span class="name">post_id</span>) - <span class="kw">return</span> <span class="name">HttpRedirect</span>(<span class="name">thread</span>.<span class="name">url</span>) - <span class="kw">else</span>: - <span class="kw">return</span> <span class="name">HttpRedirect</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="st">/</span><span class="st st-sg">'</span>)) - - - -<span class="kw">class </span><span class="cls">SplitPage</span>(<span class="name">RequestHandler</span>, <span class="name">RemoteCallable</span>): - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">r'</span><span class="st">post/(?P<post_id>\d+)/split$</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">post_id</span>): - <span class="kw">try</span>: - <span class="name">thread</span> <span class="op">=</span> <span class="name">Thread</span>.<span class="name">by_child</span>(<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">post_id</span>) - <span class="kw">except</span> <span class="exc">ValueError</span>: - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">acl</span>.<span class="name">can_access</span>(<span class="st st-sg">'</span><span class="st">MODERATOR</span><span class="st st-sg">'</span>, <span class="name">thread</span>.<span class="name">forum_id</span>): - <span class="kw">return</span> <span class="name">AccessDeniedResponse</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">split.html</span><span class="st st-sg">'</span>, - <span class="name">thread</span> <span class="op">=</span> {<span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>:<span class="name">thread</span>.<span class="name">root_post_id</span>, <span class="st st-sg">'</span><span class="st">title</span><span class="st st-sg">'</span>:<span class="name">thread</span>.<span class="name">title</span>} - ) - - <span class="deco">@export</span>(<span class="st st-sg">'</span><span class="st">split.get_post_tree</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">split</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">root_post_id</span>): - <span class="kw">def </span><span class="fun">iterate_items</span>(<span class="name">post_list</span>): - <span class="name">tmp</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">post</span> <span class="op op-word">in</span> <span class="name">post_list</span>: - <span class="name">tmp</span>.<span class="name">append</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-db">"</span><span class="st">post_id</span><span class="st st-db">"</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-db">"</span><span class="st">title</span><span class="st st-db">"</span>], - <span class="st st-sg">'</span><span class="st">children</span><span class="st st-sg">'</span>: <span class="st st-db">"</span><span class="st">children</span><span class="st st-db">"</span> <span class="op op-word">in</span> <span class="name">post</span> <span class="op op-word">and</span> \ - <span class="name">iterate_items</span>(<span class="name">post</span>[<span class="st st-db">"</span><span class="st">children</span><span class="st st-db">"</span>]) <span class="op op-word">or</span> [], - <span class="st st-sg">'</span><span class="st">parent_id</span><span class="st st-sg">'</span>: <span class="name">post</span>[<span class="st st-db">"</span><span class="st">parent_id</span><span class="st st-db">"</span>] - }) - <span class="kw">return</span> <span class="name">tmp</span> - - <span class="name">post_tree</span> <span class="op">=</span> <span class="name">get_post_tree</span>(<span class="name">req</span>, <span class="name">root_post_id</span>) - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">acl</span>.<span class="name">can_access</span>(<span class="st st-sg">'</span><span class="st">MODERATOR</span><span class="st st-sg">'</span>, <span class="name">post_tree</span>[<span class="st st-db">"</span><span class="st">forum</span><span class="st st-db">"</span>][<span class="st st-db">"</span><span class="st">forum_id</span><span class="st st-db">"</span>]): - <span class="kw">return</span> <span class="name">AccessDeniedResponse</span>() - - <span class="kw">return</span> { - <span class="st st-sg">'</span><span class="st">posts</span><span class="st st-sg">'</span>:<span class="name">iterate_items</span>(<span class="name">post_tree</span>[<span class="st st-db">"</span><span class="st">posts</span><span class="st st-db">"</span>]), - <span class="st st-sg">'</span><span class="st">thread</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">post_tree</span>[<span class="st st-db">"</span><span class="st">forum</span><span class="st st-db">"</span>][<span class="st st-db">"</span><span class="st">forum_id</span><span class="st st-db">"</span>], - <span class="st st-sg">'</span><span class="st">root_post_id</span><span class="st st-sg">'</span>:<span class="name">post_tree</span>[<span class="st st-db">"</span><span class="st">post_id</span><span class="st st-db">"</span>] - } - } - - <span class="deco">@export</span>(<span class="st st-sg">'</span><span class="st">split.commit</span><span class="st st-sg">'</span>) - <span class="kw">def </span><span class="fun">commit</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">changes</span>): - <span class="cm"># TODO: Check whether operation is allowed at every subforum of a thread</span> - - <span class="cm"># the user changes</span> - <span class="kw">for</span> <span class="name">tmp</span> <span class="op op-word">in</span> <span class="name">changes</span>.<span class="name">iteritems</span>(): - <span class="name">change</span> <span class="op">=</span> <span class="name">tmp</span>[<span class="nb nb-int">1</span>] - <span class="bn">id</span> <span class="op">=</span> <span class="name">change</span>[<span class="st st-sg">'</span><span class="st">id</span><span class="st st-sg">'</span>] - <span class="name">new_pid</span> <span class="op">=</span> <span class="name">change</span>[<span class="st st-sg">'</span><span class="st">new_pid</span><span class="st st-sg">'</span>] - <span class="name">old_pid</span> <span class="op">=</span> <span class="name">change</span>[<span class="st st-sg">'</span><span class="st">old_pid</span><span class="st st-sg">'</span>] - <span class="name">act_tid</span> <span class="op">=</span> <span class="name">change</span>[<span class="st st-sg">'</span><span class="st">act_tid</span><span class="st st-sg">'</span>] - <span class="name">old_tid</span> <span class="op">=</span> <span class="name">change</span>[<span class="st st-sg">'</span><span class="st">old_tid</span><span class="st st-sg">'</span>] - <span class="name">post</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">db</span>.<span class="name">get</span>(<span class="name">Post</span>, <span class="name">Post</span>.<span class="name">c</span>.<span class="name">post_id</span> <span class="op">==</span> <span class="bn">id</span>) - <span class="kw">if</span> <span class="name">new_pid</span> <span class="op">!=</span> <span class="op">-</span><span class="nb nb-int">1</span>: - <span class="name">post</span>.<span class="name">parent_id</span> <span class="op">=</span> <span class="name">new_pid</span> - - <span class="kw">else</span>: - <span class="kw">if</span> <span class="name">act_tid</span> <span class="op">==</span> <span class="op">-</span><span class="nb nb-int">1</span>: - <span class="cm">#XXX: forum_id</span> - <span class="name">thread</span> <span class="op">=</span> <span class="name">Thread</span>( - <span class="name">name</span> <span class="op">=</span> <span class="name">post</span>.<span class="name">name</span>, - <span class="name">forum_id</span> <span class="op">=</span> <span class="nb nb-int">1</span>, - <span class="name">root_post_id</span> <span class="op">=</span> <span class="name">post</span>.<span class="name">post_id</span> - - ) - <span class="name">req</span>.<span class="name">db</span>.<span class="name">save</span>(<span class="name">thread</span>) - <span class="kw">else</span>: - <span class="name">thread</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">db</span>.<span class="name">get</span>(<span class="name">Thread</span>, <span class="name">Thread</span>.<span class="name">c</span>.<span class="name">thread_id</span> <span class="op">==</span> <span class="name">act_tid</span>) - <span class="name">thread</span>.<span class="name">name</span> <span class="op">=</span> <span class="name">post</span>.<span class="name">name</span> - - <span class="name">post</span>.<span class="name">parent_id</span> <span class="op">=</span> <span class="name">thread</span>.<span class="name">thread_id</span> - <span class="name">req</span>.<span class="name">db</span>.<span class="name">flush</span>() - <span class="kw">return</span> <span class="st st-db">""</span> - - -<span class="kw">class </span><span class="cls">WhoIsOnlinePage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">whoisonline</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">whoisonline</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">r'</span><span class="st">whoisonline$</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">sessions</span>, <span class="name">users</span>, <span class="name">guests</span>, <span class="name">total</span> <span class="op">=</span> <span class="name">get_active_sessions</span>(<span class="name">req</span>.<span class="name">ctx</span>) - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">whoisonline.html</span><span class="st st-sg">'</span>, - <span class="name">sessions</span><span class="op">=</span><span class="name">sessions</span>, - <span class="name">user_count</span><span class="op">=</span><span class="name">users</span>, - <span class="name">guest_count</span><span class="op">=</span><span class="name">guests</span>, - <span class="name">total_count</span><span class="op">=</span><span class="name">total</span> - - ) - - -<span class="kw">class </span><span class="cls">UserSettings</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">settings</span><span class="st st-sg">'</span> - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">settings/</span><span class="st st-sg">'</span> - - <span class="name">handler_regexes</span> <span class="op">=</span> [ - <span class="st st-sg">r'</span><span class="st">settings/$</span><span class="st st-sg">'</span>, - <span class="st st-sg">r'</span><span class="st">settings/(?P<page>.+?)$</span><span class="st st-sg">'</span> - ] - <span class="name">allow_username_change</span> <span class="op">=</span> <span class="name">cfg</span>.<span class="name">bool</span>(<span class="st st-sg">'</span><span class="st">security</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">username_change</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">False</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">page</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="name">req</span>.<span class="name">user</span>.<span class="name">assert_logged_in</span>() - <span class="name">sidebar</span> <span class="op">=</span> [] - <span class="name">missing</span> <span class="op">=</span> <span class="bn">object</span>() - <span class="name">page_result</span> <span class="op">=</span> <span class="name">missing</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">UserSettingsPage</span>): - <span class="name">caption</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">get_settings_link_title</span>(<span class="name">req</span>) - <span class="cm"># if the caption is None the plugin doesn't want to</span> - - <span class="cm"># be visible in the sidebar, skip</span> - <span class="kw">if</span> <span class="name">caption</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">continue</span> - <span class="name">active</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">settings_page_identifier</span> <span class="op">==</span> <span class="name">page</span> - - <span class="kw">if</span> <span class="name">active</span>: - <span class="name">page_result</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">get_settings_page</span>(<span class="name">req</span>) - <span class="cm"># the page really wants to output data on its own</span> - - <span class="cm"># we don't need to create a sidebar, stop here</span> - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">page_result</span>, <span class="name">Response</span>): - <span class="kw">return</span> <span class="name">page_result</span> - - <span class="name">sidebar</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">comp</span>.<span class="name">url</span>, - <span class="st st-sg">'</span><span class="st">caption</span><span class="st st-sg">'</span>: <span class="name">caption</span>, - <span class="st st-sg">'</span><span class="st">active</span><span class="st st-sg">'</span>: <span class="name">active</span>, - <span class="st st-sg">'</span><span class="st">identifier</span><span class="st st-sg">'</span>: <span class="name">comp</span>.<span class="name">settings_page_identifier</span> - - }) - <span class="cm"># display error page</span> - <span class="kw">if</span> <span class="name">page_result</span> <span class="op op-word">is</span> <span class="name">missing</span> <span class="op op-word">and</span> <span class="name">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">PageNotFound</span>() - <span class="cm"># we have found a page, display it, but first sort the sidebar</span> - - <span class="name">sidebar</span>.<span class="name">sort</span>(<span class="name">key</span><span class="op">=</span><span class="kw">lambda</span> <span class="name">x</span>: <span class="name">x</span>[<span class="st st-sg">'</span><span class="st">caption</span><span class="st st-sg">'</span>].<span class="name">lower</span>()) - <span class="kw">if</span> <span class="name">page</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">settings/index.html</span><span class="st st-sg">'</span>, - <span class="name">setting_pages</span> <span class="op">=</span> <span class="name">sidebar</span> - - ) - <span class="name">template</span>, <span class="name">context</span> <span class="op">=</span> <span class="name">page_result</span> - <span class="name">context</span>[<span class="st st-sg">'</span><span class="st">setting_pages</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="name">sidebar</span> - - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="name">template</span>, <span class="op">**</span><span class="name">context</span>) - - -<span class="kw">class </span><span class="cls">LostPasswordPage</span>(<span class="name">RequestHandler</span>, <span class="name">PagePublisher</span>): - <span class="name">page_name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">lostpassword</span><span class="st st-sg">'</span> - - <span class="name">relative_url</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">lostpassword</span><span class="st st-sg">'</span> - <span class="name">handler_regexes</span> <span class="op">=</span> [<span class="st st-sg">'</span><span class="st">lostpassword$</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="cm"># if the user is identified he has probably not lost has password ;)</span> - - <span class="kw">if</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">identified</span>: - <span class="kw">return</span> <span class="name">HttpRedirect</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="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">ctx</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ctx</span> - <span class="name">msg</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isExistingUsername</span>()), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>, <span class="name">validator</span><span class="op">=</span><span class="name">isEmail</span>()) - ) - - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">password</span> <span class="op">=</span> <span class="name">reset_password</span>(<span class="name">ctx</span>, <span class="op">**</span><span class="name">d</span>) - <span class="kw">if</span> <span class="name">password</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">text</span> <span class="op">=</span> <span class="name">render_template</span>(<span class="name">req</span>, <span class="st st-sg">'</span><span class="st">mails/new_password.txt</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="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">password</span><span class="st st-sg">'</span>: <span class="name">password</span> - - }) - <span class="name">mail</span> <span class="op">=</span> <span class="name">Email</span>(<span class="name">ctx</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">New password</span><span class="st st-sg">'</span>), <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>], <span class="name">text</span>) - <span class="name">mail</span>.<span class="name">send</span>() - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">messages/password.html</span><span class="st st-sg">'</span>, <span class="op">**</span><span class="name">d</span>) - <span class="kw">else</span>: - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Creation of a new password failed. Username </span><span class="st st-sg">'</span> - - <span class="st st-sg">'</span><span class="st">or email address is invalid.</span><span class="st st-sg">'</span>) - - <span class="kw">return</span> <span class="name">TemplateResponse</span>(<span class="st st-sg">'</span><span class="st">lostpassword.html</span><span class="st st-sg">'</span>, - <span class="name">form</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="name">msg</span> <span class="op">=</span> <span class="name">msg</span> - - ) -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.remotecall - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Pocoo remote call support. - - - Remote Call Implementation - ========================== - - The Pocoo XMLRPC/JSONRPC interface works like this:: - - import time - from pocoo.pkg.core.remotecall import RemoteCallable, export - - class MyClass(RemoteCallable): - - @export("test.hello_world") - def say(self, req, name='World'): - return 'Hello </span><span class="st st-int">%s</span><span class="st">!' % name - - @export("test.get_servertime") - def servertime(self, req): - return time.time() - - By now only jsonrpc is available. You can query the jsonrpc interface - under ``/!jsonrpc``. The exported names are ``packagename.<name>``. - So for the example above the method names are (assumed that the module - is in package ``core``):: - - core.test.hello_world - - and:: - - core.test.get_servertime - - - JavaScript Query - ================= - - You can query those functions using the following syntax:: - - var rpc = new pocoo.lib.async.RPC('!jsonrpc'); - var method = rpc.getMethod('methodname'); - method(arguments, kwarguments, callback); - - The query for the example above would be:: - - var rpc = new pocoo.lib.async.RPC('!jsonrpc'); - var method = rpc.getMethod('core.test.hello_world'); - method(["Benjamin"], {}, function (result) { - alert(result); - // alerts "Hello Benjamin!" - - }); - - - :copyright: 2006 by Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">new</span> -<span class="kw">from </span><span class="cls">types</span><span class="kw"> import</span> <span class="name">FunctionType</span> -<span class="kw">from </span><span class="cls">pocoo</span><span class="kw"> import</span> <span class="name">Component</span>, <span class="name">ComponentMeta</span> - -<span class="kw">from </span><span class="cls">pocoo.http</span><span class="kw"> import</span> <span class="name">DirectResponse</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">from </span><span class="cls">pocoo.utils</span><span class="kw"> import</span> <span class="name">json</span> - - -<span class="kw">class </span><span class="cls">_RemoteCallableMeta</span>(<span class="name">ComponentMeta</span>): - - <span class="kw">def </span><span class="fun">__new__</span>(<span class="name">cls</span>, <span class="name">name</span>, <span class="name">bases</span>, <span class="name">dct</span>): - <span class="name">rpc_exports</span> <span class="op">=</span> {} - <span class="name">result</span> <span class="op">=</span> <span class="name">ComponentMeta</span>.<span class="name">__new__</span>(<span class="name">cls</span>, <span class="name">name</span>, <span class="name">bases</span>, <span class="name">dct</span>) - <span class="kw">for</span> <span class="name">name</span>, <span class="name">ref</span> <span class="op op-word">in</span> <span class="name">dct</span>.<span class="name">iteritems</span>(): - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">ref</span>, <span class="name">FunctionType</span>) <span class="op op-word">and</span> \ - <span class="bn">getattr</span>(<span class="name">ref</span>, <span class="st st-sg">'</span><span class="st">rpc_exported</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">False</span>): - <span class="name">name</span> <span class="op">=</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">ref</span>.<span class="name">__module__</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">2</span>], - <span class="name">ref</span>.<span class="name">rpc_name</span>) - <span class="name">rpc_exports</span>[<span class="name">name</span>] <span class="op">=</span> <span class="name">ref</span> - - <span class="name">result</span>.<span class="name">rpc_exports</span> <span class="op">=</span> <span class="name">rpc_exports</span> - <span class="kw">return</span> <span class="name">result</span> - - -<span class="kw">class </span><span class="cls">RemoteCallable</span>(<span class="name">Component</span>): - <span class="st st-db">"""</span><span class="st"> - - Components inheriting from this base component can export methods - for jsonrpc if they are decorated using `export`. - - Example:: - - from pocoo.pkg.core.remotecall import RemoteCallable, export - - class MyExport(RemoteCallable): - </span><span class="st st-db">"""</span> - <span class="name">__metaclass__</span> <span class="op">=</span> <span class="name">_RemoteCallableMeta</span> - - -<span class="kw">class </span><span class="cls">RemoteCallManager</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">!jsonrpc$</span><span class="st st-sg">'</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="bn">super</span>(<span class="name">RemoteCallManager</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>) - <span class="bn bn-pseudo">self</span>.<span class="name">_mapping</span> <span class="op">=</span> <span class="bn bn-pseudo">None</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="cm"># TODO: once jsonrpc1.1 is finished: update error codes</span> - <span class="kw">if</span> <span class="bn bn-pseudo">self</span>.<span class="name">_mapping</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">_mapping</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">RemoteCallable</span>): - <span class="kw">for</span> <span class="name">name</span>, <span class="name">ref</span> <span class="op op-word">in</span> <span class="name">comp</span>.<span class="name">rpc_exports</span>.<span class="name">iteritems</span>(): - <span class="name">handler</span> <span class="op">=</span> <span class="name">new</span>.<span class="name">instancemethod</span>(<span class="name">ref</span>, <span class="name">comp</span>, <span class="name">comp</span>.<span class="name">__class__</span>) - <span class="bn bn-pseudo">self</span>.<span class="name">_mapping</span>[<span class="name">name</span>] <span class="op">=</span> <span class="name">handler</span> - - <span class="bn">id</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="kw">try</span>: - <span class="name">method</span>, <span class="name">args</span>, <span class="name">kwargs</span>, <span class="bn">id</span> <span class="op">=</span> <span class="name">json</span>.<span class="name">parse_jsonrpc_request</span>(<span class="name">req</span>.<span class="name">data</span>) - <span class="name">handler</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_mapping</span>[<span class="name">method</span>] - <span class="name">json_data</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">version</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">1.1</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">result</span><span class="st st-sg">'</span>: <span class="name">handler</span>(<span class="name">req</span>, <span class="op">*</span><span class="name">args</span>, <span class="op">**</span><span class="name">kwargs</span>) - } - <span class="kw">if</span> <span class="bn">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">json_data</span>[<span class="st st-sg">'</span><span class="st">id</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">id</span> - - <span class="kw">except</span> <span class="name">DirectResponse</span>, <span class="name">e</span>: - <span class="kw">return</span> <span class="name">e</span>.<span class="name">args</span>[<span class="nb nb-int">0</span>] - <span class="kw">except</span> <span class="exc">Exception</span>, <span class="name">e</span>: - <span class="name">error</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">msg</span><span class="st st-sg">'</span>: <span class="bn">str</span>(<span class="name">e</span>), - <span class="st st-sg">'</span><span class="st">type</span><span class="st st-sg">'</span>: <span class="name">e</span>.<span class="name">__class__</span>.<span class="name">__name__</span> - - } - <span class="kw">for</span> <span class="name">name</span>, <span class="name">ref</span> <span class="op op-word">in</span> <span class="name">e</span>.<span class="name">__dict__</span>.<span class="name">iteritems</span>(): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">name</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">_</span><span class="st st-sg">'</span>) <span class="op op-word">and</span>\ - <span class="bn">isinstance</span>(<span class="name">ref</span>, (<span class="bn">str</span>, <span class="bn">unicode</span>, <span class="bn">int</span>, <span class="bn">float</span>, <span class="bn">tuple</span>, - <span class="bn">list</span>, <span class="bn">dict</span>)): - <span class="name">error</span>[<span class="name">name</span>] <span class="op">=</span> <span class="name">ref</span> - - <span class="name">json_data</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">version</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">1.1</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">error</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="st st-sg">'</span><span class="st">JSONRPCError</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">code</span><span class="st st-sg">'</span>: <span class="nb nb-oct">000</span>, - <span class="st st-sg">'</span><span class="st">message</span><span class="st st-sg">'</span>: <span class="st st-sg">'</span><span class="st">An error occurred parsing the request object.</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">error</span><span class="st st-sg">'</span>: <span class="name">error</span> - - } - } - <span class="kw">if</span> <span class="bn">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">json_data</span>[<span class="st st-sg">'</span><span class="st">id</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn">id</span> - - <span class="kw">return</span> <span class="name">Response</span>(<span class="name">json</span>.<span class="name">dumps</span>(<span class="name">json_data</span>), - [(<span class="st st-sg">'</span><span class="st">Content-Type</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">text/javascript</span><span class="st st-sg">'</span>)]) - - -<span class="kw">def </span><span class="fun">export</span>(<span class="name">name</span>): - <span class="st st-db">"""</span><span class="st"> - - Exports a function in a RemoteCallable component. - </span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">wrapped</span>(<span class="name">f</span>): - <span class="name">f</span>.<span class="name">rpc_exported</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="name">f</span>.<span class="name">rpc_name</span> <span class="op">=</span> <span class="name">name</span> - <span class="kw">return</span> <span class="name">f</span> - <span class="kw">return</span> <span class="name">wrapped</span> - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.restformat - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Pocoo ReST Parser. - - A thin wrapper around the docutils ReST parser. - - :copyright: 2006 by 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.pkg.core.textfmt</span><span class="kw"> import</span> <span class="name">MarkupFormat</span> -<span class="kw">from </span><span class="cls">pocoo.utils.html</span><span class="kw"> import</span> <span class="name">escape_html</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.smilies</span><span class="kw"> import</span> <span class="name">replace_smilies</span> - - -<span class="kw">class </span><span class="cls">ReST</span>(<span class="name">MarkupFormat</span>): - <span class="st st-db">"""</span><span class="st"> - ReST markup format. - </span><span class="st st-db">"""</span> - - <span class="name">name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">rest</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">parse</span>(<span class="bn bn-pseudo">self</span>, <span class="name">text</span>, <span class="name">signature</span>): - <span class="kw">from </span><span class="cls">docutils.core</span><span class="kw"> import</span> <span class="name">publish_parts</span> - - <span class="kw">try</span>: - <span class="name">parts</span> <span class="op">=</span> <span class="name">publish_parts</span>(<span class="name">source</span><span class="op">=</span><span class="name">text</span>, <span class="name">writer_name</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">html4css1</span><span class="st st-sg">'</span>) - <span class="name">text</span> <span class="op">=</span> <span class="name">parts</span>[<span class="st st-sg">'</span><span class="st">fragment</span><span class="st st-sg">'</span>].<span class="name">strip</span>() - <span class="kw">except</span> <span class="exc">Exception</span>: - <span class="cm"># TODO: figure out which exceptions this can raise</span> - - <span class="name">text</span> <span class="op">=</span> <span class="name">escape_html</span>(<span class="name">text</span>).<span class="name">strip</span>() - <span class="cm">#XXX: render smilies just in text blocks</span> - <span class="kw">return</span> <span class="name">replace_smilies</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">text</span>) - - <span class="kw">def </span><span class="fun">quote_text</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">text</span>, <span class="name">username</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="name">lines</span> <span class="op">=</span> [<span class="name">u</span><span class="st st-sg">'</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">line</span> <span class="kw">for</span> <span class="name">line</span> <span class="op op-word">in</span> <span class="name">text</span>.<span class="name">splitlines</span>()] - <span class="kw">if</span> <span class="name">username</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">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">lines</span>.<span class="name">insert</span>(<span class="nb nb-int">0</span>, (<span class="name">u</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="name">_</span>(<span class="st st-sg">'</span><span class="st st-int">%s</span><span class="st"> wrote</span><span class="st st-sg">'</span>)) <span class="op">%</span> <span class="name">username</span>) - <span class="kw">return</span> <span class="name">u</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="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.search - ~~~~~~~~~~~~~~~~~~~~~ - - Pocoo Search System - - :copyright: 2006 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.application</span><span class="kw"> import</span> <span class="name">LinkableMixin</span> - -<span class="kw">from </span><span class="cls">shlex</span><span class="kw"> import</span> <span class="name">split</span> - - -<span class="cm">#XXX: some kind of early draft</span> -<span class="kw">class </span><span class="cls">Query</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - - Search Query Object - </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">rule</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">text</span> <span class="op">=</span> <span class="name">rule</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">required</span> <span class="op">=</span> [] - <span class="bn bn-pseudo">self</span>.<span class="name">unwanted</span> <span class="op">=</span> [] - <span class="bn bn-pseudo">self</span>.<span class="name">optional</span> <span class="op">=</span> [] - <span class="name">next</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">first</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - <span class="kw">for</span> <span class="name">token</span> <span class="op op-word">in</span> <span class="name">split</span>(<span class="name">rule</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">next</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="bn">getattr</span>(<span class="bn bn-pseudo">self</span>, <span class="name">next</span>).<span class="name">append</span>(<span class="name">token</span>) - <span class="name">next</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">token</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">NOT</span><span class="st st-sg">'</span>: - <span class="name">next</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">unwanted</span><span class="st st-sg">'</span> - <span class="kw">elif</span> <span class="name">token</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">AND</span><span class="st st-sg">'</span>: - <span class="name">next</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">required</span><span class="st st-sg">'</span> - - <span class="kw">elif</span> <span class="name">token</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">OR</span><span class="st st-sg">'</span>: - <span class="name">next</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">optional</span><span class="st st-sg">'</span> - <span class="kw">else</span>: - <span class="kw">if</span> <span class="name">token</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">+</span><span class="st st-sg">'</span>): - <span class="name">token</span> <span class="op">=</span> <span class="name">token</span>[<span class="nb nb-int">1</span>:] - <span class="bn bn-pseudo">self</span>.<span class="name">required</span>.<span class="name">append</span>(<span class="name">token</span>) - <span class="kw">elif</span> <span class="name">token</span>.<span class="name">startswith</span>(<span class="st st-sg">'</span><span class="st">-</span><span class="st st-sg">'</span>): - <span class="name">token</span> <span class="op">=</span> <span class="name">token</span>[<span class="nb nb-int">1</span>:] - <span class="bn bn-pseudo">self</span>.<span class="name">unwanted</span>.<span class="name">append</span>(<span class="name">token</span>) - <span class="kw">elif</span> <span class="name">first</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">required</span>.<span class="name">append</span>(<span class="name">token</span>) - <span class="name">first</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">else</span>: - <span class="bn bn-pseudo">self</span>.<span class="name">optional</span>.<span class="name">append</span>(<span class="name">token</span>) - <span class="name">first</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">words</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">required</span> <span class="op">+</span> <span class="bn bn-pseudo">self</span>.<span class="name">unwanted</span> <span class="op">+</span> <span class="bn bn-pseudo">self</span>.<span class="name">optional</span> - - <span class="kw">def </span><span class="fun">__iter__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn">iter</span>(<span class="bn bn-pseudo">self</span>.<span class="name">words</span>) - - <span class="kw">def </span><span class="fun">__len__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn">len</span>(<span class="bn bn-pseudo">self</span>.<span class="name">words</span>) - - <span class="kw">def </span><span class="fun">is_required</span>(<span class="bn bn-pseudo">self</span>, <span class="name">word</span>): - <span class="kw">return</span> <span class="name">word</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">required</span> - - <span class="kw">def </span><span class="fun">is_unwanted</span>(<span class="bn bn-pseudo">self</span>, <span class="name">word</span>): - <span class="kw">return</span> <span class="name">word</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">unwanted</span> - - <span class="kw">def </span><span class="fun">is_optional</span>(<span class="bn bn-pseudo">self</span>, <span class="name">word</span>): - <span class="kw">return</span> <span class="name">word</span> <span class="op op-word">in</span> <span class="bn bn-pseudo">self</span>.<span class="name">optional</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">%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">text</span> - - ) - - -<span class="cm">#XXX: early draft</span> -<span class="kw">class </span><span class="cls">Result</span>(<span class="bn">object</span>, <span class="name">LinkableMixin</span>): - <span class="st st-db">"""</span><span class="st"> - Search result object. - </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">title</span>, <span class="name">relative_url</span>, <span class="name">description</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">title</span> <span class="op">=</span> <span class="name">title</span> - <span class="bn bn-pseudo">self</span>.<span class="name">relative_url</span> <span class="op">=</span> <span class="name">relative_url</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">description</span> <span class="op">=</span> <span class="name">description</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">%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">title</span> - - ) - - -<span class="kw">class </span><span class="cls">SearchProvider</span>(<span class="name">Component</span>): - <span class="cm">#: name of the search provider</span> - <span class="name">name</span> <span class="op">=</span> <span class="bn bn-pseudo">None</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="st st-db">"""</span><span class="st">Return a translated version of the search provider name.</span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span> - - <span class="kw">def </span><span class="fun">can_search</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="st st-db">"""</span><span class="st">Return True if a user is allowed to use this search provider.</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">query</span>(<span class="bn bn-pseudo">self</span>, <span class="name">query</span>): - <span class="st st-db">"""</span><span class="st">Perform a query, has to return an iterable of result objects.</span><span class="st st-db">"""</span> - <span class="kw">return</span> () -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - - pocoo.pkg.core.session - ~~~~~~~~~~~~~~~~~~~~~~ - - Pocoo session handling. - - :copyright: 2006 by Georg Brandl, Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> - -<span class="kw">import </span><span class="cls">md5</span> -<span class="kw">import </span><span class="cls">time</span> -<span class="kw">import </span><span class="cls">random</span> - -<span class="kw">from </span><span class="cls">datetime</span><span class="kw"> import</span> <span class="name">datetime</span>, <span class="name">timedelta</span> - -<span class="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">RequestWrapper</span> -<span class="kw">from </span><span class="cls">pocoo.settings</span><span class="kw"> import</span> <span class="name">cfg</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.uri</span><span class="kw"> import</span> <span class="name">urlencode</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.db</span><span class="kw"> import</span> <span class="name">sessions</span>, <span class="name">users</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.auth</span><span class="kw"> import</span> <span class="name">get_auth_provider</span> - - -<span class="kw">def </span><span class="fun">get_active_sessions</span>(<span class="name">ctx</span>, <span class="name">delta</span><span class="op">=</span><span class="name">timedelta</span>(<span class="name">minutes</span><span class="op">=</span><span class="nb nb-int">5</span>)): - <span class="st st-db">"""</span><span class="st"> - Return a tuple in the following form:: - - (sessions, user_count, guest_count, total) - - sessions is a dict for the template with all relevant - information about the sessions, user_count is the - amount of all logged in users, guest_count is the - amount of all anonymous users and total is the total - number of all sessions being active. - </span><span class="st st-db">"""</span> - - <span class="name">provider</span> <span class="op">=</span> <span class="name">get_auth_provider</span>(<span class="name">ctx</span>) - <span class="name">now</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">session_list</span> <span class="op">=</span> [] - <span class="name">user_count</span> <span class="op">=</span> <span class="nb nb-int">0</span> - - <span class="name">guest_count</span> <span class="op">=</span> <span class="nb nb-int">0</span> - <span class="name">r</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">sessions</span>.<span class="name">select</span>( - <span class="name">sessions</span>.<span class="name">c</span>.<span class="name">last_reload</span> <span class="op">></span> <span class="name">now</span> <span class="op">-</span> <span class="name">delta</span> - - )) - <span class="kw">while</span> <span class="bn bn-pseudo">True</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">break</span> - - <span class="name">user</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">users</span>.<span class="name">c</span>.<span class="name">user_id</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">provider</span>.<span class="name">get_user_id</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">data</span><span class="st st-sg">'</span>]) - )).<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">user</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">user</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">1</span>: - <span class="name">guest_count</span> <span class="op">+=</span> <span class="nb nb-int">1</span> - - <span class="name">user_data</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="kw">else</span>: - <span class="name">user_data</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">user</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">user_id</span><span class="st st-sg">'</span>: <span class="name">user</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">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">user</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - } - <span class="name">user_count</span> <span class="op">+=</span> <span class="nb nb-int">1</span> - - <span class="name">session_list</span>.<span class="name">append</span>({ - <span class="st st-sg">'</span><span class="st">last_reload</span><span class="st st-sg">'</span>: <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">last_reload</span><span class="st st-sg">'</span>], - <span class="st st-sg">'</span><span class="st">user</span><span class="st st-sg">'</span>: <span class="name">user_data</span> - }) - <span class="name">session_list</span>.<span class="name">sort</span>(<span class="name">key</span><span class="op">=</span><span class="kw">lambda</span> <span class="name">x</span>: <span class="name">x</span>[<span class="st st-sg">'</span><span class="st">last_reload</span><span class="st st-sg">'</span>]) - <span class="kw">return</span> <span class="name">session_list</span>, <span class="name">user_count</span>, <span class="name">guest_count</span>, <span class="name">user_count</span> <span class="op">+</span> <span class="name">guest_count</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_sessions_by_action</span>(<span class="name">ctx</span>, <span class="name">url</span>): - <span class="name">provider</span> <span class="op">=</span> <span class="name">get_auth_provider</span>(<span class="name">ctx</span>) - <span class="kw">def </span><span class="fun">do</span>(<span class="name">con</span>): - <span class="name">session_list</span> <span class="op">=</span> [] - <span class="name">r</span> <span class="op">=</span> <span class="name">con</span>.<span class="name">execute</span>(<span class="name">sessions</span>.<span class="name">select</span>( - <span class="name">sessions</span>.<span class="name">c</span>.<span class="name">action</span> <span class="op">==</span> <span class="name">url</span> - - )) - <span class="kw">while</span> <span class="bn bn-pseudo">True</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">break</span> - - <span class="name">user</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">users</span>.<span class="name">c</span>.<span class="name">user_id</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">provider</span>.<span class="name">get_user_id</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">data</span><span class="st st-sg">'</span>]) - )).<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">user</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">user</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">1</span>: - <span class="name">user_data</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">else</span>: - <span class="name">user_data</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>: <span class="name">user</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">user</span>[<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>])), - } - <span class="name">session_list</span>.<span class="name">append</span>(<span class="name">user_data</span>) - <span class="kw">return</span> <span class="name">session_list</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">class </span><span class="cls">Session</span>(<span class="bn">dict</span>): - <span class="st st-db">"""</span><span class="st">Session Model</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">sid</span>, <span class="name">ip</span>, <span class="name">path</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">path</span> <span class="op">=</span> <span class="name">path</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">sessions</span>.<span class="name">select</span>( - (<span class="name">sessions</span>.<span class="name">c</span>.<span class="name">session_key</span> <span class="op">==</span> <span class="name">sid</span>) <span class="op">&</span> - - (<span class="name">sessions</span>.<span class="name">c</span>.<span class="name">ip_addr</span> <span class="op">==</span> <span class="name">ip</span>) <span class="op">&</span> - (<span class="name">sessions</span>.<span class="name">c</span>.<span class="name">expires</span> <span class="op">>=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>()) - )) - <span class="name">data</span> <span class="op">=</span> <span class="name">r</span>.<span class="name">fetchone</span>() - <span class="kw">if</span> <span class="name">data</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="bn">super</span>(<span class="name">Session</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>() - <span class="bn bn-pseudo">self</span>.<span class="name">sid</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">else</span>: - <span class="bn">super</span>(<span class="name">Session</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">data</span>[<span class="st st-sg">'</span><span class="st">data</span><span class="st st-sg">'</span>]) - <span class="bn bn-pseudo">self</span>.<span class="name">sid</span> <span class="op">=</span> <span class="name">sid</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">ip</span> <span class="op">=</span> <span class="name">ip</span> - - <span class="kw">def </span><span class="fun">__hash__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn">hash</span>(<span class="bn bn-pseudo">self</span>.<span class="name">sid</span>) - - <span class="kw">def </span><span class="fun">to_dict</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Return the session data as normal dict.</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn">dict</span>(<span class="bn bn-pseudo">self</span>) - - <span class="kw">def </span><span class="fun">save</span>(<span class="bn bn-pseudo">self</span>, <span class="name">cookie_expire</span>): - <span class="st st-db">"""</span><span class="st">Save changes back to the database and updates - expires and last_reload. Returns a datetime object - with the time of the session expire.</span><span class="st st-db">"""</span> - <span class="name">now</span> <span class="op">=</span> <span class="name">datetime</span>.<span class="name">utcnow</span>() - <span class="name">expires</span> <span class="op">=</span> <span class="name">now</span> <span class="op">+</span> <span class="name">timedelta</span>(<span class="name">seconds</span><span class="op">=</span><span class="name">cookie_expire</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">sid</span>: - <span class="kw">while</span> <span class="bn bn-pseudo">True</span>: - <span class="name">hashval</span> <span class="op">=</span> <span class="name">md5</span>.<span class="name">new</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">random</span>.<span class="name">random</span>(), <span class="name">time</span>.<span class="name">time</span>())) - <span class="name">sid</span> <span class="op">=</span> <span class="name">hashval</span>.<span class="name">hexdigest</span>() - <span class="name">r</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">sessions</span>.<span class="name">select</span>( - <span class="name">sessions</span>.<span class="name">c</span>.<span class="name">session_key</span> <span class="op">==</span> <span class="name">sid</span> - - )) - <span class="kw">if</span> <span class="name">r</span>.<span class="name">fetchone</span>() <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="kw">break</span> - <span class="bn bn-pseudo">self</span>.<span class="name">sid</span> <span class="op">=</span> <span class="name">sid</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">sessions</span>.<span class="name">insert</span>(), - <span class="name">session_key</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">sid</span>, - <span class="name">ip_addr</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">ip</span>, - <span class="name">expires</span> <span class="op">=</span> <span class="name">expires</span>, - <span class="name">last_reload</span> <span class="op">=</span> <span class="name">now</span>, - <span class="name">action</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">path</span>, - <span class="name">data</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">to_dict</span>() - ) - <span class="kw">else</span>: - <span class="name">q</span> <span class="op">=</span> <span class="name">sessions</span>.<span class="name">c</span>.<span class="name">session_key</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">sid</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">sessions</span>.<span class="name">update</span>(<span class="name">q</span>), - <span class="name">expires</span> <span class="op">=</span> <span class="name">expires</span>, - <span class="name">last_reload</span> <span class="op">=</span> <span class="name">now</span>, - <span class="name">action</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">path</span>, - <span class="name">data</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">to_dict</span>() - ) - <span class="kw">return</span> <span class="name">expires</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">%s</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">sid</span>, - <span class="bn">dict</span>.<span class="name">__repr__</span>(<span class="bn bn-pseudo">self</span>) - ) - - - -<span class="kw">class </span><span class="cls">SessionWrapper</span>(<span class="name">RequestWrapper</span>): - <span class="st st-db">"""</span><span class="st"> - SessionWrapper loads/stores request.session. - </span><span class="st st-db">"""</span> - <span class="name">cookie_name</span> <span class="op">=</span> <span class="name">cfg</span>.<span class="name">str</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">cookiename</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">SESSION</span><span class="st st-sg">'</span>) - <span class="name">cookie_expires</span> <span class="op">=</span> <span class="name">cfg</span>.<span class="name">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">cookieexpires</span><span class="st st-sg">'</span>, <span class="nb nb-int">7200</span>) - - <span class="kw">def </span><span class="fun">get_priority</span>(<span class="bn bn-pseudo">self</span>): - <span class="cm"># request.session should be set before anything else,</span> - - <span class="cm"># but after a possible caching system.</span> - <span class="kw">return</span> <span class="nb nb-int">2</span> - - <span class="kw">def </span><span class="fun">process_request</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="name">cookie</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">cookies</span>.<span class="name">get</span>(<span class="bn bn-pseudo">self</span>.<span class="name">cookie_name</span>, <span class="bn bn-pseudo">None</span>) - <span class="name">sid</span> <span class="op">=</span> <span class="name">cookie</span> <span class="op op-word">and</span> <span class="name">cookie</span>.<span class="name">value</span> <span class="op op-word">or</span> <span class="bn bn-pseudo">None</span> - - <span class="name">ip</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">environ</span>[<span class="st st-sg">'</span><span class="st">REMOTE_ADDR</span><span class="st st-sg">'</span>] - <span class="name">req</span>.<span class="name">session</span> <span class="op">=</span> <span class="name">Session</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">sid</span>, <span class="name">ip</span>, <span class="name">req</span>.<span class="name">path</span>) - - <span class="kw">def </span><span class="fun">process_response</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">resp</span>): - <span class="name">expires</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">session</span>.<span class="name">save</span>(<span class="bn bn-pseudo">self</span>.<span class="name">cookie_expires</span>) - <span class="name">resp</span>.<span class="name">set_cookie</span>(<span class="bn">str</span>(<span class="bn bn-pseudo">self</span>.<span class="name">cookie_name</span>), <span class="name">req</span>.<span class="name">session</span>.<span class="name">sid</span>, - <span class="name">max_age</span><span class="op">=</span><span class="bn bn-pseudo">self</span>.<span class="name">cookie_expires</span>, <span class="name">expires</span><span class="op">=</span><span class="name">expires</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.simplehtml - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module provides a MarkupFormat that allows the user to use - HTML as markup but strips dangerous tags like ``<script>`` and others. - - It uses the ``secure_html`` method from the ``html`` util. - - :copyright: 2006 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.utils.html</span><span class="kw"> import</span> <span class="name">secure_html</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.textfmt</span><span class="kw"> import</span> <span class="name">MarkupFormat</span> - - -<span class="kw">class </span><span class="cls">SimpleHTML</span>(<span class="name">MarkupFormat</span>): - <span class="name">name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">simplehtml</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">parse</span>(<span class="bn bn-pseudo">self</span>, <span class="name">text</span>): - <span class="kw">return</span> <span class="name">secure_html</span>(<span class="name">text</span>) - - <span class="kw">def </span><span class="fun">quote_text</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">text</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">username</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">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">text</span> <span class="op">=</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st"><em></span><span class="st st-int">%s</span><span class="st">:</em><br /></span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> ((<span class="name">_</span>(<span class="st st-sg">'</span><span class="st st-int">%s</span><span class="st"> wrote</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">username</span>), <span class="name">text</span>) - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st"><blockquote></span><span class="st st-int">%s</span><span class="st"></blockquote></span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">text</span> - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.smilies - ~~~~~~~~~~~~~~~~~~~~~~ - - Pocoo smilies parser. - - :copyright: 2006 by Benjamin Wiegand, 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</span><span class="kw"> import</span> <span class="name">Component</span> -<span class="kw">from </span><span class="cls">pocoo.utils.html</span><span class="kw"> import</span> <span class="name">escape_html</span> - - -<span class="kw">def </span><span class="fun">replace_smilies</span>(<span class="name">ctx</span>, <span class="name">text</span>): - <span class="st st-db">"""</span><span class="st"> - Replace smilies in ``text``, using all providers listed in the - board config. - </span><span class="st st-db">"""</span> - <span class="name">smiley_providers</span> <span class="op">=</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">smiley_providers</span><span class="st st-sg">'</span>, [<span class="st st-sg">'</span><span class="st">default</span><span class="st st-sg">'</span>]) - <span class="kw">for</span> <span class="name">provider</span> <span class="op op-word">in</span> <span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">SmileyProvider</span>): - <span class="kw">if</span> <span class="name">provider</span>.<span class="name">name</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="name">smiley_providers</span>: - <span class="kw">continue</span> - - <span class="kw">for</span> <span class="name">smiley</span> <span class="op op-word">in</span> <span class="name">provider</span>.<span class="name">smilies</span>: - <span class="name">text</span> <span class="op">=</span> <span class="name">text</span>.<span class="name">replace</span>(<span class="name">smiley</span>[<span class="nb nb-int">0</span>], <span class="name">provider</span>.<span class="name">render_smiley</span>(<span class="name">smiley</span>)) - <span class="kw">return</span> <span class="name">text</span> - - -<span class="kw">def </span><span class="fun">get_smiley_buttons</span>(<span class="name">ctx</span>): - <span class="st st-db">"""</span><span class="st"> - Return a list of button dictionaries usable for the BBCodeEditor - JavaScript app. - </span><span class="st st-db">"""</span> - <span class="name">res</span> <span class="op">=</span> [] - <span class="name">smiley_providers</span> <span class="op">=</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">smiley_providers</span><span class="st st-sg">'</span>, [<span class="st st-sg">'</span><span class="st">default</span><span class="st st-sg">'</span>]) - <span class="kw">for</span> <span class="name">provider</span> <span class="op op-word">in</span> <span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">SmileyProvider</span>): - <span class="kw">if</span> <span class="name">provider</span>.<span class="name">name</span> <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="name">smiley_providers</span>: - <span class="kw">continue</span> - - <span class="kw">for</span> <span class="name">smiley</span> <span class="op op-word">in</span> <span class="name">provider</span>.<span class="name">smilies</span>: - <span class="name">res</span>.<span class="name">append</span>(<span class="name">smiley</span> <span class="op">+</span> (<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">provider</span>.<span class="name">smiley_dir</span>),)) - <span class="kw">return</span> <span class="name">res</span> - - -<span class="kw">class </span><span class="cls">SmileyProvider</span>(<span class="name">Component</span>): - <span class="st st-db">"""</span><span class="st"> - A SmileyProvider maps small text strings to images. - </span><span class="st st-db">"""</span> - - <span class="cm">#: List of smilies this component provides, in the form</span> - <span class="cm">#: ``('textform', 'imagename')``.</span> - - <span class="cm">#: ``imagename`` is relative to the ``smiley_dir`` below.</span> - <span class="name">smilies</span> <span class="op">=</span> [] - - <span class="cm">#: Directory where smilies of this provider can be found.</span> - <span class="cm">#: Must be relative to the forum root, e.g.</span> - <span class="cm">#: ``!cobalt/pkgname/default/img/smilies/``.</span> - - <span class="name">smiley_dir</span> <span class="op">=</span> <span class="st st-db">""</span> - - <span class="cm">#: Name (can be overwritten, must be lowercase).</span> - <span class="cm">#: Used for the configuration setting.</span> - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">name</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span>.<span class="name">lower</span>() - - <span class="kw">def </span><span class="fun">render_smiley</span>(<span class="bn bn-pseudo">self</span>, <span class="name">smiley</span>): - <span class="st st-db">"""</span><span class="st"> - - Render a smiley. This doesn't need to be overridden in normal - cases. - - :return: HTML for the smiley image. - </span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st"><img src="</span><span class="st st-int">%s</span><span class="st">" alt="</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">ctx</span>.<span class="name">make_url</span>(<span class="bn bn-pseudo">self</span>.<span class="name">smiley_dir</span>, <span class="name">smiley</span>[<span class="nb nb-int">1</span>]), - <span class="name">escape_html</span>(<span class="name">smiley</span>[<span class="nb nb-int">0</span>]) - ) - - - -<span class="kw">class </span><span class="cls">Default</span>(<span class="name">SmileyProvider</span>): - <span class="st st-db">"""</span><span class="st"> - Default Pocoo smilies. - </span><span class="st st-db">"""</span> - <span class="name">smilies</span> <span class="op">=</span> [ - (<span class="st st-sg">'</span><span class="st">;-)</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">wink.png</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="st st-sg">'</span><span class="st">sad.png</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="st st-sg">'</span><span class="st">smile.png</span><span class="st st-sg">'</span>), - (<span class="st st-sg">'</span><span class="st">:D</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">grin.png</span><span class="st st-sg">'</span>), - ] - - <span class="name">smiley_dir</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">!cobalt/core/default/img/smilies/</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.template - ~~~~~~~~~~~~~~~~~~~~~~~ - - Templating helpers. - - :copyright: 2006 by Georg Brandl, Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">math</span> -<span class="kw">import </span><span class="cls">jinja.exceptions</span> -<span class="kw">from </span><span class="cls">jinja.nodes</span><span class="kw"> import</span> <span class="name">Node</span>, <span class="name">KeywordNode</span>, <span class="name">VariableNode</span>, <span class="name">CollectionNode</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">BaseThemeRequirements</span>(<span class="name">FileRequirements</span>): - - <span class="kw">def </span><span class="fun">get_javascript_imports</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> ( - <span class="st st-sg">'</span><span class="st">AJS/AJS.js</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">pocoo/lib/async.js</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">pocoo/lib/dom.js</span><span class="st st-sg">'</span>, - <span class="st st-sg">'</span><span class="st">pocoo/lib/effects.js</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">return</span> ( - <span class="st st-sg">'</span><span class="st">default/style/screen.css</span><span class="st st-sg">'</span>, - ) - - - -<span class="kw">class </span><span class="cls">Pagination</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - Pagination Controller. Push this into the template so that - the template designer has an object he can use for generating - an pagination. - - Normally you are looking for the ``LazyPagination`` class, this - one is just for posts or if you have many single items which - are combined to a thread etc. The idea is that you don't have - and offset information in the url. - </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">req</span>, <span class="name">idlist</span>, <span class="name">start</span>, <span class="name">per_page</span>, <span class="name">link</span>): - <span class="st st-db">"""</span><span class="st"> - - :param req: the request - :param idlist: a list of all ids for the pagination - :param start: the position of the first item on the page - :param per_page: number of items on each page - :param link: function which takes one id and returns a link for it - - Example:: - - p = Pagination(req, range(50), 20, 20, lambda x: 'post/</span><span class="st st-int">%d</span><span class="st">' </span><span class="st st-int">% x</span><span class="st">) - - In this example the first page would contain the posts 0-19, - the second 20-39 and the first 40-50. - </span><span class="st st-db">"""</span> - <span class="bn bn-pseudo">self</span>.<span class="name">req</span> <span class="op">=</span> <span class="name">req</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">idlist</span> <span class="op">=</span> <span class="name">idlist</span> - <span class="bn bn-pseudo">self</span>.<span class="name">start</span> <span class="op">=</span> <span class="name">start</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">per_page</span> <span class="op">=</span> <span class="name">per_page</span> - <span class="bn bn-pseudo">self</span>.<span class="name">link</span> <span class="op">=</span> <span class="name">link</span> - - <span class="kw">def </span><span class="fun">generate</span>(<span class="bn bn-pseudo">self</span>, <span class="name">normal</span>, <span class="name">active</span>, <span class="name">commata</span>, <span class="name">ellipsis</span>, <span class="name">threshold</span>): - <span class="st st-db">"""</span><span class="st"> - - Generate a Pagination of the data defined in the constructor. - - :param normal: inserted string when the page isn't active - :param active: inserted string when the page is active - :param commata: inserted between links - :param ellipsis: inserted as space indicator for skiped links - :param threshold: number of links around start/current page and - end before they will be replaced by an ellipsis - - ``normal`` and ``active`` can contain out of the following formatting - chars: - - ====================== ================================== - ``</span><span class="st st-int">%(page)s</span><span class="st">`` number of the current page - ``</span><span class="st st-int">%(url)s</span><span class="st">`` absolute url of the current page - ====================== ================================== - - Example:: - - p.generate('<a href="</span><span class="st st-int">%(url)s</span><span class="st">"></span><span class="st st-int">%(page)s</span><span class="st"></a>', - '<strong></span><span class="st st-int">%(page)s</span><span class="st"></strong>', - ', ', - ' ... ', - 3) - </span><span class="st st-db">"""</span> - - <span class="name">current_page_number</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">start</span> <span class="op">/</span> <span class="bn bn-pseudo">self</span>.<span class="name">per_page</span> <span class="op">+</span> <span class="nb nb-int">1</span> - - <span class="name">number_of_pages</span> <span class="op">=</span> <span class="bn">int</span>(<span class="name">math</span>.<span class="name">ceil</span>(<span class="bn">len</span>(<span class="bn bn-pseudo">self</span>.<span class="name">idlist</span>) <span class="op">/</span> (<span class="bn bn-pseudo">self</span>.<span class="name">per_page</span> <span class="op">*</span> <span class="nb nb-flt">1.0</span>))) - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="name">result</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">idx</span> <span class="op op-word">in</span> <span class="bn">range</span>(<span class="nb nb-int">1</span>, <span class="name">number_of_pages</span> <span class="op">+</span> <span class="nb nb-int">1</span>): - <span class="kw">if</span> <span class="name">idx</span> <span class="op"><=</span> <span class="name">threshold</span> <span class="op op-word">or</span> <span class="name">idx</span> <span class="op">></span> <span class="name">number_of_pages</span> <span class="op">-</span> <span class="name">threshold</span> <span class="op op-word">or</span>\ - <span class="bn">abs</span>(<span class="name">current_page_number</span> <span class="op">-</span> <span class="name">idx</span>) <span class="op"><</span> <span class="name">math</span>.<span class="name">ceil</span>(<span class="name">threshold</span> <span class="op">/</span> <span class="nb nb-flt">2.0</span>): - <span class="kw">if</span> <span class="name">result</span> <span class="op op-word">and</span> <span class="name">result</span>[<span class="op">-</span><span class="nb nb-int">1</span>] <span class="op">!=</span> <span class="name">ellipsis</span>: - <span class="name">result</span>.<span class="name">append</span>(<span class="name">commata</span>) - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">if</span> <span class="name">idx</span> <span class="op">==</span> <span class="name">current_page_number</span>: - <span class="name">schema</span> <span class="op">=</span> <span class="name">active</span> - <span class="kw">else</span>: - <span class="name">schema</span> <span class="op">=</span> <span class="name">normal</span> - - <span class="name">url</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">link</span>(<span class="bn bn-pseudo">self</span>.<span class="name">idlist</span>[(<span class="name">idx</span> <span class="op">-</span> <span class="nb nb-int">1</span>) <span class="op">*</span> <span class="bn bn-pseudo">self</span>.<span class="name">per_page</span>]) - <span class="name">result</span>.<span class="name">append</span>(<span class="name">schema</span> <span class="op">%</span> { - <span class="st st-sg">'</span><span class="st">page</span><span class="st st-sg">'</span>: <span class="name">idx</span>, - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">url</span>), - }) - <span class="kw">else</span>: - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">was_space</span>: - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="name">result</span>.<span class="name">append</span>(<span class="name">ellipsis</span>) - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">''</span>.<span class="name">join</span>(<span class="name">result</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">%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">str</span>(<span class="bn bn-pseudo">self</span>) - ) - - <span class="kw">def </span><span class="fun">__str__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">generate</span>(<span class="st st-sg">'</span><span class="st st-int">%(page)s</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">[</span><span class="st st-int">%(page)s</span><span class="st">]</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="st st-sg">'</span><span class="st"> ... </span><span class="st st-sg">'</span>, <span class="nb nb-int">3</span>) - - - -<span class="kw">class </span><span class="cls">LazyPagination</span>(<span class="bn">object</span>): - <span class="st st-db">"""</span><span class="st"> - A lazy pagination controller. Doesn't require a id list like - the ``Pagination`` controller. - - The ``LazyPagination`` is a cheep to calculate pagination based - on the current page, the total amount of pages and the information - about what a link looks like and how many items you have per page. - </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">req</span>, <span class="name">page</span>, <span class="name">per_page</span>, <span class="name">pages</span>, <span class="name">link</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">req</span> <span class="op">=</span> <span class="name">req</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">page</span> <span class="op">=</span> <span class="name">page</span> - <span class="bn bn-pseudo">self</span>.<span class="name">per_page</span> <span class="op">=</span> <span class="name">per_page</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">pages</span> <span class="op">=</span> <span class="name">pages</span> - <span class="bn bn-pseudo">self</span>.<span class="name">link</span> <span class="op">=</span> <span class="name">link</span> - - <span class="kw">def </span><span class="fun">generate</span>(<span class="bn bn-pseudo">self</span>, <span class="name">normal</span>, <span class="name">active</span>, <span class="name">commata</span>, <span class="name">ellipsis</span>, <span class="name">threshold</span>): - <span class="st st-db">"""</span><span class="st"> - - Generate a Pagination of the data defined in the constructor. - - :param normal: inserted string when the page isn't active - :param active: inserted string when the page is active - :param commata: inserted between links - :param ellipsis: inserted as space indicator for skiped links - :param threshold: number of links around start/current page and - end before they will be replaced by an ellipsis - - ``normal`` and ``active`` can contain out of the following formatting - chars: - - ====================== ================================== - ``</span><span class="st st-int">%(page)s</span><span class="st">`` number of the current page - ``</span><span class="st st-int">%(url)s</span><span class="st">`` absolute url of the current page - ====================== ================================== - - Example:: - - p.generate('<a href="</span><span class="st st-int">%(url)s</span><span class="st">"></span><span class="st st-int">%(page)s</span><span class="st"></a>', - '<strong></span><span class="st st-int">%(page)s</span><span class="st"></strong>', - ', ', - ' ... ', - 3) - </span><span class="st st-db">"""</span> - - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - <span class="name">result</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">idx</span> <span class="op op-word">in</span> <span class="bn">range</span>(<span class="nb nb-int">1</span>, <span class="bn bn-pseudo">self</span>.<span class="name">pages</span> <span class="op">+</span> <span class="nb nb-int">1</span>): - <span class="kw">if</span> <span class="name">idx</span> <span class="op"><=</span> <span class="name">threshold</span> <span class="op op-word">or</span> <span class="name">idx</span> <span class="op">></span> <span class="bn bn-pseudo">self</span>.<span class="name">pages</span> <span class="op">-</span> <span class="name">threshold</span> <span class="op op-word">or</span>\ - <span class="bn">abs</span>(<span class="bn bn-pseudo">self</span>.<span class="name">page</span> <span class="op">-</span> <span class="name">idx</span>) <span class="op"><</span> <span class="name">math</span>.<span class="name">ceil</span>(<span class="name">threshold</span> <span class="op">/</span> <span class="nb nb-flt">2.0</span>): - <span class="kw">if</span> <span class="name">result</span> <span class="op op-word">and</span> <span class="name">result</span>[<span class="op">-</span><span class="nb nb-int">1</span>] <span class="op">!=</span> <span class="name">ellipsis</span>: - <span class="name">result</span>.<span class="name">append</span>(<span class="name">commata</span>) - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">if</span> <span class="name">idx</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">page</span>: - <span class="name">schema</span> <span class="op">=</span> <span class="name">active</span> - - <span class="kw">else</span>: - <span class="name">schema</span> <span class="op">=</span> <span class="name">normal</span> - <span class="name">url</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">link</span>(<span class="name">idx</span>) - <span class="name">result</span>.<span class="name">append</span>(<span class="name">schema</span> <span class="op">%</span> { - <span class="st st-sg">'</span><span class="st">page</span><span class="st st-sg">'</span>: <span class="name">idx</span>, - <span class="st st-sg">'</span><span class="st">url</span><span class="st st-sg">'</span>: <span class="bn bn-pseudo">self</span>.<span class="name">req</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">url</span>), - }) - <span class="kw">else</span>: - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">was_space</span>: - <span class="name">was_space</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="name">result</span>.<span class="name">append</span>(<span class="name">ellipsis</span>) - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">''</span>.<span class="name">join</span>(<span class="name">result</span>) - - <span class="kw">def </span><span class="fun">__str__</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">generate</span>(<span class="st st-sg">'</span><span class="st st-int">%(page)s</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">[</span><span class="st st-int">%(page)s</span><span class="st">]</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="st st-sg">'</span><span class="st"> ... </span><span class="st st-sg">'</span>, <span class="nb nb-int">3</span>) - - - -<span class="kw">class </span><span class="cls">PaginationTag</span>(<span class="name">Node</span>): - <span class="st st-db">"""</span><span class="st"> - Generates a pagination. requires a Pagination object at first - argument:: - - {% paginate forum.pagination - '<a href="</span><span class="st st-int">%(link)s</span><span class="st">"></span><span class="st st-int">%(page)s</span><span class="st"></a>', - '<strong></span><span class="st st-int">%(page)s</span><span class="st"></strong>', - ', ', - '...' - - %} - </span><span class="st st-db">"""</span> - <span class="name">rules</span> <span class="op">=</span> { - <span class="st st-sg">'</span><span class="st">default</span><span class="st st-sg">'</span>: [<span class="name">KeywordNode</span>(<span class="st st-sg">'</span><span class="st">paginate</span><span class="st st-sg">'</span>), <span class="name">VariableNode</span>(), - <span class="name">CollectionNode</span>()] - } - <span class="kw">def </span><span class="fun">__init__</span>(<span class="bn bn-pseudo">self</span>, <span class="name">parser</span>, <span class="name">matched_tag</span>, <span class="name">handler_args</span>, <span class="name">stack</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">_variable</span> <span class="op">=</span> <span class="name">handler_args</span>[<span class="nb nb-int">1</span>] - <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span> <span class="op">=</span> <span class="name">handler_args</span>[<span class="nb nb-int">2</span>] - <span class="name">Node</span>.<span class="name">__init__</span>(<span class="bn bn-pseudo">self</span>) - - <span class="kw">def </span><span class="fun">render</span>(<span class="bn bn-pseudo">self</span>, <span class="name">context</span>): - <span class="name">pagination_controller</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_variable</span>.<span class="name">resolve</span>(<span class="name">context</span>) - <span class="kw">if</span> <span class="bn">len</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>) <span class="op"><</span> <span class="nb nb-int">4</span>: - <span class="kw">raise</span> <span class="name">jinja</span>.<span class="name">exceptions</span>.<span class="name">TemplateRuntimeError</span>(<span class="st st-sg">'</span><span class="st">invalid argument count </span><span class="st st-sg">'</span> - - <span class="st st-sg">'</span><span class="st">for {% paginate %}</span><span class="st st-sg">'</span>) - <span class="name">link_scheme</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>[<span class="nb nb-int">0</span>].<span class="name">resolve</span>(<span class="name">context</span>) - <span class="name">active_scheme</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>[<span class="nb nb-int">1</span>].<span class="name">resolve</span>(<span class="name">context</span>) - <span class="name">commata</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>[<span class="nb nb-int">2</span>].<span class="name">resolve</span>(<span class="name">context</span>) - <span class="name">ellipsis</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>[<span class="nb nb-int">3</span>].<span class="name">resolve</span>(<span class="name">context</span>) - <span class="kw">if</span> <span class="bn">len</span>(<span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>) <span class="op">==</span> <span class="nb nb-int">5</span>: - <span class="name">threshold</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">_arguments</span>[<span class="nb nb-int">4</span>].<span class="name">resolve</span>(<span class="name">context</span>) - <span class="kw">else</span>: - <span class="name">threshold</span> <span class="op">=</span> <span class="nb nb-int">3</span> - - <span class="kw">return</span> <span class="name">pagination_controller</span>.<span class="name">generate</span>(<span class="name">link_scheme</span>, <span class="name">active_scheme</span>, - <span class="name">commata</span>, <span class="name">ellipsis</span>, <span class="name">threshold</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="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.textfmt - ~~~~~~~~~~~~~~~~~~~~~~ - - Pocoo text processing interfaces. - - :copyright: 2006 by Georg Brandl, Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">re</span> -<span class="kw">from </span><span class="cls">xml.sax.saxutils</span><span class="kw"> import</span> <span class="name">quoteattr</span> - -<span class="kw">from </span><span class="cls">pocoo.http</span><span class="kw"> import</span> <span class="name">Request</span> -<span class="kw">from </span><span class="cls">pocoo.utils.html</span><span class="kw"> import</span> <span class="name">nl2br</span>, <span class="name">escape_html</span>, <span class="name">unescape_html</span>, <span class="name">urlize</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.pkg.core.smilies</span><span class="kw"> import</span> <span class="name">replace_smilies</span> -<span class="kw">from </span><span class="cls">pocoo.utils.activecache</span><span class="kw"> import</span> <span class="name">Node</span>, <span class="name">load_cache</span>, <span class="name">generate_cache</span> - -<span class="kw">from </span><span class="cls">pocoo.utils</span><span class="kw"> import</span> <span class="name">json</span> - - -<span class="name">frozen_translation_re</span> <span class="op">=</span> <span class="name">re</span>.<span class="name">compile</span>(<span class="st st-sg">r'</span><span class="st"><trans(?: value="(.*?)")?>(.*?)</trans></span><span class="st st-sg">'</span>) - - - -<span class="kw">class </span><span class="cls">MarkupFormat</span>(<span class="name">Component</span>): - <span class="st st-db">"""</span><span class="st"> - A text markup format, such as BBCode or HTML. - </span><span class="st st-db">"""</span> - - <span class="cm">#: The relative path to the javascript file for the editor.</span> - <span class="name">editor_javascript</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">!cobalt/core/PocooLib/BaseEditor.js</span><span class="st st-sg">'</span> - - <span class="cm">#: Name for this format. must be lowercase</span> - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">name</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span>.<span class="name">lower</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="st st-db">"""</span><span class="st"> - - Title of this formatter. - </span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">name</span>.<span class="name">title</span>() - - <span class="kw">def </span><span class="fun">parse</span>(<span class="bn bn-pseudo">self</span>, <span class="name">text</span>, <span class="name">signature</span>): - <span class="st st-db">"""</span><span class="st"> - - This method has to return either an activecache Node or an - string/Unicode object. - - :param signature: If this is ``True`` the pocoo wants to parse - a signature. For BBCode there could be special - rules like allowed and disallowed tags etc. - </span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">render_callback</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">callback</span>, <span class="name">data</span>): - <span class="st st-db">"""</span><span class="st"> - - If the ``parse`` method returns an activecache `CallbackNode` - this method will be called for the define callback. - </span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="name">u</span><span class="st st-sg">''</span> - - <span class="kw">def </span><span class="fun">quote_text</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">text</span>, <span class="name">username</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st"> - - This has to quote a given text. For example a BBCode - Markup Formatter should wrap the text in [quote]. - </span><span class="st st-db">"""</span> - <span class="kw">return</span> <span class="name">text</span> - - <span class="kw">def </span><span class="fun">get_editor_options</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">signature</span>): - <span class="st st-db">"""</span><span class="st"> - - This method has to return a dict of JSON - serializable values which get passed to the - function ``initEditor()`` which is defined - in the editor javascript file. - - If `signature` is ``True`` pocoo requested an editor for the - signature and wants just the editor definitions which are - relevant for an working signature editor. See the ``BBCode`` - text formatter for an example. - </span><span class="st st-db">"""</span> - <span class="kw">return</span> {} - - -<span class="kw">class </span><span class="cls">PlainText</span>(<span class="name">MarkupFormat</span>): - <span class="st st-db">"""</span><span class="st"> - This parser just breaks lines and creates links. - </span><span class="st st-db">"""</span> - <span class="name">name</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">plain</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">parse</span>(<span class="bn bn-pseudo">self</span>, <span class="name">text</span>, <span class="name">signature</span>): - <span class="name">text</span> <span class="op">=</span> <span class="name">escape_html</span>(<span class="name">text</span>) - <span class="name">text</span> <span class="op">=</span> <span class="name">nl2br</span>(<span class="name">text</span>) - <span class="name">text</span> <span class="op">=</span> <span class="name">replace_smilies</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">text</span>) - <span class="kw">return</span> <span class="name">urlize</span>(<span class="name">text</span>, <span class="nb nb-int">50</span>, <span class="bn bn-pseudo">True</span>) - - <span class="kw">def </span><span class="fun">quote_text</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>, <span class="name">text</span>, <span class="name">username</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="name">lines</span> <span class="op">=</span> [<span class="name">u</span><span class="st st-sg">'</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">line</span> <span class="kw">for</span> <span class="name">line</span> <span class="op op-word">in</span> <span class="name">text</span>.<span class="name">splitlines</span>()] - <span class="kw">if</span> <span class="name">username</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">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">lines</span>.<span class="name">insert</span>(<span class="nb nb-int">0</span>, (<span class="name">_</span>(<span class="st st-sg">'</span><span class="st st-int">%s</span><span class="st"> wrote</span><span class="st st-sg">'</span>) <span class="op">+</span> <span class="name">u</span><span class="st st-sg">'</span><span class="st">:</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">username</span>) - <span class="kw">return</span> <span class="name">u</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">def </span><span class="fun">parse</span>(<span class="name">ctx</span>, <span class="name">text</span>, <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">False</span>, <span class="name">syntax_parser</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st"> - Parses an text and returns a marshalled object. You then can - put such an string into the database or push it to the - render function. - </span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn">isinstance</span>(<span class="name">text</span>, <span class="bn">unicode</span>): - <span class="name">text</span> <span class="op">=</span> <span class="bn">unicode</span>(<span class="name">text</span>) - <span class="kw">if</span> <span class="name">syntax_parser</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">syntax_parser</span> <span class="op">=</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">syntax_parser</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">plain</span><span class="st st-sg">'</span>) - <span class="name">syntax_parser</span> <span class="op">=</span> <span class="name">syntax_parser</span>.<span class="name">lower</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">MarkupFormat</span>): - <span class="kw">if</span> <span class="name">comp</span>.<span class="name">name</span> <span class="op">==</span> <span class="name">syntax_parser</span>: - <span class="name">node</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">parse</span>(<span class="name">text</span>, <span class="name">signature</span>) - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">node</span>, <span class="bn">basestring</span>): - <span class="name">node</span> <span class="op">=</span> <span class="name">Node</span>(<span class="name">node</span>) - <span class="kw">return</span> <span class="name">generate_cache</span>(<span class="name">node</span>, <span class="name">syntax_parser</span>) - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">Parser "</span><span class="st st-int">%s</span><span class="st">" not found</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">syntax_parser</span>) - - - -<span class="kw">def </span><span class="fun">render</span>(<span class="name">req</span>, <span class="name">data</span>): - <span class="st st-db">"""</span><span class="st"> - Renders a parsed data - </span><span class="st st-db">"""</span> - <span class="name">node</span>, <span class="name">syntax_parser</span> <span class="op">=</span> <span class="name">load_cache</span>(<span class="name">data</span>) - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">MarkupFormat</span>): - <span class="kw">if</span> <span class="name">comp</span>.<span class="name">name</span> <span class="op">==</span> <span class="name">syntax_parser</span>: - <span class="kw">break</span> - - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">syntax parser </span><span class="st st-int">%r</span><span class="st"> not found</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">syntax_parser</span>) - <span class="kw">return</span> <span class="name">node</span>.<span class="name">render</span>(<span class="name">req</span>, <span class="name">comp</span>) - - - -<span class="kw">def </span><span class="fun">parse_and_render</span>(<span class="name">req</span>, <span class="name">text</span>, <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">False</span>, <span class="name">syntax_parser</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st"> - Parses and renders a text. - </span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn">isinstance</span>(<span class="name">text</span>, <span class="bn">unicode</span>): - <span class="name">text</span> <span class="op">=</span> <span class="bn">unicode</span>(<span class="name">text</span>) - <span class="kw">if</span> <span class="name">syntax_parser</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">syntax_parser</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">syntax_parser</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">plain</span><span class="st st-sg">'</span>) - <span class="name">syntax_parser</span> <span class="op">=</span> <span class="name">syntax_parser</span>.<span class="name">lower</span>() - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">MarkupFormat</span>): - <span class="kw">if</span> <span class="name">comp</span>.<span class="name">name</span> <span class="op">==</span> <span class="name">syntax_parser</span>: - <span class="name">node</span> <span class="op">=</span> <span class="name">comp</span>.<span class="name">parse</span>(<span class="name">text</span>, <span class="name">signature</span>) - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">node</span>, <span class="bn">basestring</span>): - <span class="name">node</span> <span class="op">=</span> <span class="name">Node</span>(<span class="name">node</span>) - <span class="kw">return</span> <span class="name">node</span>.<span class="name">render</span>(<span class="name">req</span>, <span class="name">comp</span>) - <span class="kw">else</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">Parser "</span><span class="st st-int">%s</span><span class="st">" not found</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">syntax_parser</span>) - - - -<span class="kw">def </span><span class="fun">get_editor</span>(<span class="name">req</span>, <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">False</span>, <span class="name">syntax_parser</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st"> - Return a tuple in the form (javascript_file, options) - for the template. Both of them are strings which can be - used directly in the template:: - - <script type="text/javascript" src="{{ editorjs }}"></script> - - <script type="text/javascript"> - initEditor('id_of_textarea', 'id_of_toolbar', {{ options }}); - </script> - - If you set `signature` to ``True`` it will just display the - buttons which are relevant for the signature editor. - </span><span class="st st-db">"""</span> - <span class="kw">if</span> <span class="name">syntax_parser</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">syntax_parser</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">syntax_parser</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">plain</span><span class="st st-sg">'</span>).<span class="name">lower</span>() - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">MarkupFormat</span>): - <span class="kw">if</span> <span class="name">comp</span>.<span class="name">name</span> <span class="op">==</span> <span class="name">syntax_parser</span>: - <span class="name">js</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">make_url</span>(<span class="name">comp</span>.<span class="name">editor_javascript</span>) - <span class="name">options</span> <span class="op">=</span> <span class="name">json</span>.<span class="name">dumps</span>(<span class="name">comp</span>.<span class="name">get_editor_options</span>(<span class="name">req</span>, <span class="name">signature</span>)) - <span class="kw">return</span> <span class="name">js</span>, <span class="name">options</span> - - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">Parser "</span><span class="st st-int">%s</span><span class="st">" not found</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">syntax_parser</span>) - - -<span class="kw">def </span><span class="fun">quote_text</span>(<span class="name">req</span>, <span class="name">text</span>, <span class="name">username</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, <span class="name">syntax_parser</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st">Quote ``text`` with the style defined in the markup parser.</span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="name">syntax_parser</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">syntax_parser</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">syntax_parser</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">plain</span><span class="st st-sg">'</span>).<span class="name">lower</span>() - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">MarkupFormat</span>): - <span class="kw">if</span> <span class="name">comp</span>.<span class="name">name</span> <span class="op">==</span> <span class="name">syntax_parser</span>: - <span class="kw">return</span> <span class="name">comp</span>.<span class="name">quote_text</span>(<span class="name">req</span>, <span class="name">text</span>, <span class="name">username</span>) - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">Parser "</span><span class="st st-int">%s</span><span class="st">" not found</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">syntax_parser</span>) - - - -<span class="kw">def </span><span class="fun">get_markup_formatters</span>(<span class="name">req</span>): - <span class="st st-db">"""</span><span class="st"> - Return a list of known formatters - </span><span class="st st-db">"""</span> - <span class="name">result</span> <span class="op">=</span> [] - <span class="kw">for</span> <span class="name">comp</span> <span class="op op-word">in</span> <span class="name">req</span>.<span class="name">ctx</span>.<span class="name">get_components</span>(<span class="name">MarkupFormat</span>): - <span class="name">result</span>.<span class="name">append</span>((<span class="name">comp</span>.<span class="name">name</span>, <span class="name">comp</span>.<span class="name">get_title</span>(<span class="name">req</span>))) - <span class="name">result</span>.<span class="name">sort</span>(<span class="name">key</span><span class="op">=</span><span class="kw">lambda</span> <span class="name">x</span>: <span class="name">x</span>[<span class="nb nb-int">1</span>].<span class="name">lower</span>()) - <span class="kw">return</span> <span class="name">result</span> - -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.user - ~~~~~~~~~~~~~~~~~~~ - - User model and utilities. - - :copyright: 2006 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">os</span><span class="kw"> import</span> <span class="name">path</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">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.http</span><span class="kw"> import</span> <span class="name">DirectResponse</span>, <span class="name">AccessDeniedResponse</span> - -<span class="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">LinkableMixin</span> -<span class="kw">from </span><span class="cls">pocoo.utils.text</span><span class="kw"> import</span> <span class="name">gen_password</span>, <span class="name">gen_activation_key</span>, <span class="name">gen_pwhash</span>, \ - <span class="name">check_pwhash</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.pkg.core.db</span><span class="kw"> import</span> <span class="name">users</span>, <span class="name">groups</span>, <span class="name">posts</span>, <span class="name">group_members</span> - - -<span class="kw">def </span><span class="fun">get_all_usernames</span>(<span class="name">ctx</span>): - <span class="st st-db">"""</span><span class="st">Return a list of all usernames.</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">users</span>.<span class="name">c</span>.<span class="name">username</span>])) - <span class="kw">return</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="kw">def </span><span class="fun">get_id_username_mapping</span>(<span class="name">ctx</span>): - <span class="st st-db">"""</span><span class="st">Return a ``user_id`` -> ``username`` mapping.</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">users</span>.<span class="name">c</span>.<span class="name">user_id</span>, <span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span>])) - <span class="kw">return</span> <span class="bn">dict</span>(<span class="bn">tuple</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">def </span><span class="fun">get_user_list</span>(<span class="name">ctx</span>, <span class="name">order_by</span><span class="op">=</span><span class="name">users</span>.<span class="name">c</span>.<span class="name">username</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="name">letter</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, - <span class="name">hide_internal</span><span class="op">=</span><span class="bn bn-pseudo">False</span>): - <span class="st st-db">"""</span><span class="st">Return a list of all users with public details.</span><span class="st st-db">"""</span> - - <span class="cm">#XXX: sorting with databases sucks :-/ if sorted by username, resort</span> - <span class="cm"># with python, and btw, this is ugly</span> - <span class="name">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - <span class="name">q</span> <span class="op">=</span> [] - <span class="kw">if</span> <span class="name">letter</span>: - <span class="name">q</span>.<span class="name">append</span>(<span class="name">u</span>.<span class="name">username</span>.<span class="name">startswith</span>(<span class="name">letter</span>)) - <span class="kw">if</span> <span class="name">hide_internal</span>: - <span class="name">q</span>.<span class="name">append</span>((<span class="name">u</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="op">&</span> (<span class="name">u</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="kw">try</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="name">meta</span>.<span class="name">desc</span>, - <span class="st st-sg">'</span><span class="st">asc</span><span class="st st-sg">'</span>: <span class="name">meta</span>.<span class="name">asc</span> - - }[<span class="name">order</span>] - <span class="kw">except</span> <span class="exc">KeyError</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">order must be either </span><span class="st st-esc">\'</span><span class="st">asc</span><span class="st st-esc">\'</span><span class="st"> or </span><span class="st st-esc">\'</span><span class="st">desc</span><span class="st st-esc">\'</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">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">email</span>, - <span class="name">u</span>.<span class="name">profile</span>, <span class="name">u</span>.<span class="name">last_login</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">meta</span>.<span class="name">and_</span>(<span class="op">*</span><span class="name">q</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">order</span>(<span class="name">order_by</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">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">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="kw">return</span> <span class="name">d</span> - - <span class="kw">return</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">def </span><span class="fun">get_all_groupnames</span>(<span class="name">ctx</span>): - <span class="st st-db">"""</span><span class="st">Return a list of groupnames.</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">groups</span>.<span class="name">c</span>.<span class="name">name</span>])) - <span class="kw">return</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="kw">def </span><span class="fun">get_id_groupname_mapping</span>(<span class="name">ctx</span>): - <span class="st st-db">"""</span><span class="st">Return a group_id -> groupname mapping.</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">groups</span>.<span class="name">c</span>.<span class="name">group_id</span>, <span class="name">groups</span>.<span class="name">c</span>.<span class="name">name</span>])) - <span class="kw">return</span> <span class="bn">dict</span>(<span class="bn">tuple</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">def </span><span class="fun">get_group_list</span>(<span class="name">ctx</span>, <span class="name">order_by</span><span class="op">=</span><span class="name">groups</span>.<span class="name">c</span>.<span class="name">name</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="name">letter</span><span class="op">=</span><span class="bn bn-pseudo">None</span>, - <span class="name">show_hidden</span><span class="op">=</span><span class="bn bn-pseudo">True</span>): - <span class="st st-db">"""</span><span class="st">Return a list of all groups with public details.</span><span class="st st-db">"""</span> - - <span class="name">g</span> <span class="op">=</span> <span class="name">groups</span>.<span class="name">c</span> - <span class="name">q</span> <span class="op">=</span> [] - <span class="kw">if</span> <span class="name">letter</span>: - <span class="name">q</span>.<span class="name">append</span>(<span class="name">g</span>.<span class="name">name</span>.<span class="name">startswith</span>(<span class="name">letter</span>)) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">show_hidden</span>: - <span class="name">q</span>.<span class="name">append</span>(<span class="name">g</span>.<span class="name">hidden</span> <span class="op">==</span> <span class="bn bn-pseudo">True</span>) - <span class="kw">try</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="name">meta</span>.<span class="name">desc</span>, - <span class="st st-sg">'</span><span class="st">asc</span><span class="st st-sg">'</span>: <span class="name">meta</span>.<span class="name">asc</span> - - }[<span class="name">order</span>] - <span class="kw">except</span> <span class="exc">KeyError</span>: - <span class="kw">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">order must be either </span><span class="st st-esc">\'</span><span class="st">asc</span><span class="st st-esc">\'</span><span class="st"> or </span><span class="st st-esc">\'</span><span class="st">desc</span><span class="st st-esc">\'</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">g</span>.<span class="name">group_id</span>, <span class="name">g</span>.<span class="name">name</span>, <span class="name">g</span>.<span class="name">public</span>, - <span class="name">g</span>.<span class="name">hidden</span>], <span class="name">meta</span>.<span class="name">and_</span>(<span class="op">*</span><span class="name">q</span>), - <span class="name">order_by</span><span class="op">=</span>[<span class="name">order</span>(<span class="name">order_by</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">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">groups</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">name</span><span class="st st-sg">'</span>])) - <span class="kw">return</span> <span class="name">d</span> - - <span class="kw">return</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">def </span><span class="fun">get_user</span>(<span class="name">req</span>, <span class="name">user_id_or_name</span>): - <span class="st st-db">"""</span><span class="st"> - - Return a dict of user information for the template. - </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">u</span> <span class="op">=</span> <span class="name">users</span>.<span class="name">c</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">user_id_or_name</span>, (<span class="bn">int</span>, <span class="bn">long</span>)): - <span class="name">q</span> <span class="op">=</span> (<span class="name">u</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id_or_name</span>) - <span class="kw">else</span>: - <span class="name">q</span> <span class="op">=</span> (<span class="name">u</span>.<span class="name">username</span> <span class="op">==</span> <span class="name">user_id_or_name</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">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">email</span>, - <span class="name">u</span>.<span class="name">profile</span>, <span class="name">u</span>.<span class="name">settings</span>, <span class="name">u</span>.<span class="name">last_login</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">q</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: error return needed</span> - - <span class="kw">return</span> - <span class="name">user</span> <span class="op">=</span> <span class="bn">dict</span>(<span class="name">row</span>) - <span class="name">user</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">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="kw">return</span> <span class="name">user</span> - - -<span class="kw">def </span><span class="fun">get_user_avatar</span>(<span class="name">req</span>, <span class="name">user_id_or_name</span>): - <span class="st st-db">"""</span><span class="st"> - Return the user avatar. - </span><span class="st st-db">"""</span> - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">user_id_or_name</span>, (<span class="bn">int</span>, <span class="bn">long</span>)): - <span class="name">q</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">user_id_or_name</span>) - <span class="kw">else</span>: - <span class="name">q</span> <span class="op">=</span> (<span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span> <span class="op">==</span> <span class="name">user_id_or_name</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">users</span>.<span class="name">c</span>.<span class="name">user_id</span>], <span class="name">q</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="op op-word">not</span> <span class="bn bn-pseudo">None</span>: - <span class="name">fn</span> <span class="op">=</span> <span class="name">path</span>.<span class="name">join</span>(<span class="name">req</span>.<span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">root</span>, <span class="st st-sg">'</span><span class="st">avatars</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st st-int">%d</span><span class="st">.png</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">row</span>[<span class="nb nb-int">0</span>]) - <span class="kw">if</span> <span class="name">path</span>.<span class="name">exists</span>(<span class="name">fn</span>): - <span class="name">f</span> <span class="op">=</span> <span class="bn">file</span>(<span class="name">fn</span>, <span class="st st-sg">'</span><span class="st">rb</span><span class="st st-sg">'</span>) - <span class="name">result</span> <span class="op">=</span> <span class="name">f</span>.<span class="name">read</span>() - <span class="name">f</span>.<span class="name">close</span>() - <span class="kw">return</span> <span class="name">result</span> - - -<span class="kw">def </span><span class="fun">get_id_by_name</span>(<span class="name">ctx</span>, <span class="name">name</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">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">u</span>.<span class="name">user_id</span>], - <span class="name">u</span>.<span class="name">username</span> <span class="op">==</span> <span class="name">name</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="op op-word">not</span> <span class="name">row</span>: - <span class="kw">raise</span> <span class="name">UserNotFound</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">check_login_data</span>(<span class="name">ctx</span>, <span class="name">username</span>, <span class="name">password</span>): - <span class="st st-db">"""</span><span class="st"> - - Check if a username and password was found in the - database. Returns None if the user does not exist - or the password is incorrect, otherwise it returns - the user id. - </span><span class="st st-db">"""</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">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">u</span>.<span class="name">user_id</span>, <span class="name">u</span>.<span class="name">pwhash</span>, <span class="name">u</span>.<span class="name">act_key</span>], - <span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span> <span class="op">==</span> <span class="name">username</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="op op-word">not</span> <span class="bn bn-pseudo">None</span> <span class="op op-word">and</span> <span class="op op-word">not</span> <span class="name">row</span>[<span class="st st-sg">'</span><span class="st">act_key</span><span class="st st-sg">'</span>] <span class="op op-word">and</span> \ - <span class="name">check_pwhash</span>(<span class="name">row</span>[<span class="st st-sg">'</span><span class="st">pwhash</span><span class="st st-sg">'</span>], <span class="name">password</span>): - <span class="kw">return</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="kw">def </span><span class="fun">sync_post_count</span>(<span class="name">ctx</span>, <span class="name">user_id</span>): - <span class="st st-db">"""</span><span class="st">Sync the user post count with the post tables.</span><span class="st st-db">"""</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">meta</span>.<span class="name">func</span>.<span class="name">count</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">author_id</span> <span class="op">==</span> <span class="name">user_id</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">user_id</span>), - <span class="name">post_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="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">reset_password</span>(<span class="name">ctx</span>, <span class="name">username</span>, <span class="name">email</span>): - <span class="st st-db">"""</span><span class="st"> - Reset the password and returns the new password - if the email matched the username. - If not it will return None. - </span><span class="st st-db">"""</span> - <span class="name">password</span> <span class="op">=</span> <span class="name">gen_password</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">users</span>.<span class="name">update</span>((<span class="name">users</span>.<span class="name">c</span>.<span class="name">username</span> <span class="op">==</span> <span class="name">username</span>) <span class="op">&</span> - - (<span class="name">users</span>.<span class="name">c</span>.<span class="name">email</span> <span class="op">==</span> <span class="name">email</span>)), - <span class="name">pwhash</span> <span class="op">=</span> <span class="name">gen_pwhash</span>(<span class="name">password</span>) - ) - <span class="kw">if</span> <span class="name">result</span>.<span class="name">rowcount</span>: - <span class="kw">return</span> <span class="name">password</span> - - -<span class="kw">class </span><span class="cls">UserNotFound</span>(<span class="exc">Exception</span>): - <span class="kw">pass</span> - - -<span class="kw">class </span><span class="cls">User</span>(<span class="name">DatabaseModel</span>, <span class="name">LinkableMixin</span>): - <span class="name">NotFound</span> <span class="op">=</span> <span class="name">UserNotFound</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">user_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">user_id</span> <span class="op">=</span> <span class="name">user_id</span> - <span class="bn">super</span>(<span class="name">User</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>, <span class="name">users</span>, <span class="st st-sg">'</span><span class="st">user_id</span><span class="st st-sg">'</span>) - - <span class="kw">from </span><span class="cls">pocoo.pkg.core.acl</span><span class="kw"> import</span> <span class="name">AclManager</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">acl</span> <span class="op">=</span> <span class="name">AclManager</span>(<span class="name">ctx</span>, <span class="bn bn-pseudo">self</span>) - - <span class="name">subject_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">subject_id</span><span class="st st-sg">'</span>) - <span class="name">username</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">username</span><span class="st st-sg">'</span>) - <span class="name">email</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>) - <span class="name">pwhash</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">pwhash</span><span class="st st-sg">'</span>) - <span class="name">act_key</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">act_key</span><span class="st st-sg">'</span>) - <span class="name">language</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">language</span><span class="st st-sg">'</span>) - <span class="name">profile</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span>) - <span class="name">settings</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">settings</span><span class="st st-sg">'</span>) - <span class="name">last_login</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">last_login</span><span class="st st-sg">'</span>) - <span class="name">register_date</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">register_date</span><span class="st st-sg">'</span>) - <span class="name">post_count</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">post_count</span><span class="st st-sg">'</span>) - <span class="name">read_threads</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">read_threads</span><span class="st st-sg">'</span>) - <span class="name">read_posts</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">read_posts</span><span class="st st-sg">'</span>) - - <span class="deco">@property</span> - - <span class="kw">def </span><span class="fun">relative_url</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">users/</span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">username</span> - - <span class="deco">@staticmethod</span> - <span class="kw">def </span><span class="fun">create</span>(<span class="name">ctx</span>, <span class="name">username</span>, <span class="name">password</span>, <span class="name">email</span>, <span class="name">activate</span><span class="op">=</span><span class="bn bn-pseudo">False</span>): - <span class="st st-db">"""</span><span class="st">Creates a new user.</span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="name">activate</span>: - <span class="name">act_key</span> <span class="op">=</span> <span class="name">gen_activation_key</span>() - <span class="kw">else</span>: - <span class="name">act_key</span> <span class="op">=</span> <span class="bn bn-pseudo">None</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">users</span>.<span class="name">insert</span>(), - <span class="name">username</span><span class="op">=</span><span class="name">username</span>, - <span class="name">email</span><span class="op">=</span><span class="name">email</span>, - <span class="name">act_key</span><span class="op">=</span><span class="name">act_key</span>, - <span class="name">pwhash</span><span class="op">=</span><span class="name">gen_pwhash</span>(<span class="name">password</span>), - <span class="name">register_date</span><span class="op">=</span><span class="name">datetime</span>.<span class="name">utcnow</span>(), - <span class="name">post_count</span><span class="op">=</span><span class="nb nb-int">0</span> - - ) - <span class="kw">return</span> <span class="name">User</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">check_password</span>(<span class="bn bn-pseudo">self</span>, <span class="name">password</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">exists</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">return</span> <span class="name">check_pwhash</span>(<span class="bn bn-pseudo">self</span>.<span class="name">pwhash</span>, <span class="name">password</span>) - - <span class="kw">def </span><span class="fun">set_password</span>(<span class="bn bn-pseudo">self</span>, <span class="name">password</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">pwhash</span> <span class="op">=</span> <span class="name">gen_pwhash</span>(<span class="name">password</span>) - - <span class="kw">def </span><span class="fun">assert_logged_in</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st"> - - Check if the user is logged in and raise a DirectResponse - exception with an AccessDeniedResponse to display the user a - login or "missing permission" page. - </span><span class="st st-db">"""</span> - <span class="kw">if</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">identified</span>: - <span class="kw">raise</span> <span class="name">DirectResponse</span>(<span class="name">AccessDeniedResponse</span>()) - - <span class="kw">def </span><span class="fun">iter_groups</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st"> - - Return a generator for all groups this user has joined. - </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">groups</span>.<span class="name">c</span>.<span class="name">group_id</span>], - (<span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">user_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="name">groups</span>.<span class="name">c</span>.<span class="name">group_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</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">yield</span> <span class="name">Group</span>(<span class="bn bn-pseudo">self</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">activate</span>(<span class="bn bn-pseudo">self</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">act_key</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">def </span><span class="fun">deactivate</span>(<span class="bn bn-pseudo">self</span>): - <span class="bn bn-pseudo">self</span>.<span class="name">act_key</span> <span class="op">=</span> <span class="name">gen_activation_key</span>() - - <span class="deco">@property</span> - - <span class="kw">def </span><span class="fun">identified</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">user_id</span> <span class="op">></span> <span class="nb nb-int">0</span> - - <span class="deco">@property</span> - - <span class="kw">def </span><span class="fun">active</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="op op-word">not</span> <span class="bn bn-pseudo">self</span>.<span class="name">act_key</span> - - <span class="deco">@property</span> - - <span class="kw">def </span><span class="fun">groups</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn">list</span>(<span class="bn bn-pseudo">self</span>.<span class="name">iter_groups</span>()) - - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">admin</span>(<span class="bn bn-pseudo">self</span>): - <span class="cm">#TODO: from ACL</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">True</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">user_id</span> <span class="op">==</span> <span class="name">other</span>.<span class="name">user_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">user_id</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">username</span> - - ) - - -<span class="kw">class </span><span class="cls">GroupNotFound</span>(<span class="exc">Exception</span>): - <span class="kw">pass</span> - - -<span class="kw">class </span><span class="cls">Group</span>(<span class="name">DatabaseModel</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">group_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">group_id</span> <span class="op">=</span> <span class="name">group_id</span> - <span class="bn">super</span>(<span class="name">Group</span>, <span class="bn bn-pseudo">self</span>).<span class="name">__init__</span>(<span class="name">ctx</span>, <span class="name">groups</span>, <span class="st st-sg">'</span><span class="st">group_id</span><span class="st st-sg">'</span>) - - <span class="kw">from </span><span class="cls">pocoo.pkg.core.acl</span><span class="kw"> import</span> <span class="name">AclManager</span> - - <span class="bn bn-pseudo">self</span>.<span class="name">acl</span> <span class="op">=</span> <span class="name">AclManager</span>(<span class="name">ctx</span>, <span class="bn bn-pseudo">self</span>) - - <span class="name">subject_id</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">subject_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">public</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">public</span><span class="st st-sg">'</span>) - <span class="name">hidden</span> <span class="op">=</span> <span class="name">lazy_column</span>(<span class="st st-sg">'</span><span class="st">hidden</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">public</span><span class="op">=</span><span class="bn bn-pseudo">True</span>, <span class="name">hidden</span><span class="op">=</span><span class="bn bn-pseudo">False</span>): - <span class="st st-db">"""</span><span class="st">Create a new usergroup.</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">groups</span>.<span class="name">insert</span>(), - <span class="name">name</span><span class="op">=</span><span class="name">name</span>, - <span class="name">public</span><span class="op">=</span><span class="name">public</span>, - <span class="name">hidden</span><span class="op">=</span><span class="name">hidden</span> - - ) - <span class="kw">return</span> <span class="name">Group</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="deco">@property</span> - <span class="kw">def </span><span class="fun">members</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="bn">list</span>(<span class="bn bn-pseudo">self</span>.<span class="name">iter_members</span>()) - - <span class="kw">def </span><span class="fun">iter_members</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">Return a generator for all group members.</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">users</span>.<span class="name">c</span>.<span class="name">user_id</span>], - (<span class="name">groups</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="name">groups</span>.<span class="name">c</span>.<span class="name">group_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">users</span>.<span class="name">c</span>.<span class="name">user_id</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">yield</span> <span class="name">User</span>(<span class="bn bn-pseudo">self</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">add_member</span>(<span class="bn bn-pseudo">self</span>, <span class="name">user</span>): - <span class="st st-db">"""</span><span class="st">Add a new member to the group.</span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">user</span>, <span class="name">User</span>): - <span class="name">user_id</span> <span class="op">=</span> <span class="name">user</span>.<span class="name">user_id</span> - - <span class="kw">else</span>: - <span class="name">user_id</span> <span class="op">=</span> <span class="name">User</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">user</span>).<span class="name">user_id</span> - - <span class="cm"># check if the user is already a member of the group</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">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span>], - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span>) - )) - <span class="kw">if</span> <span class="name">result</span>.<span class="name">fetchone</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">raise</span> <span class="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">The user </span><span class="st st-int">%d</span><span class="st"> is alreay a member of this group</span><span class="st st-sg">'</span> <span class="op">%</span> - - <span class="name">user_id</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">group_members</span>.<span class="name">insert</span>(), - <span class="name">user_id</span> <span class="op">=</span> <span class="name">user_id</span>, - <span class="name">group_id</span> <span class="op">=</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span> - - ) - - <span class="kw">def </span><span class="fun">remove_member</span>(<span class="bn bn-pseudo">self</span>, <span class="name">user</span>): - <span class="st st-db">"""</span><span class="st">Remove a member from the group.</span><span class="st st-db">"""</span> - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">user</span>, <span class="name">User</span>): - <span class="name">user_id</span> <span class="op">=</span> <span class="name">user</span>.<span class="name">user_id</span> - - <span class="kw">else</span>: - <span class="name">user_id</span> <span class="op">=</span> <span class="name">User</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">user</span>).<span class="name">user_id</span> - - <span class="cm"># check if the user is not in the group</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">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span>], - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span>) - )) - <span class="kw">if</span> <span class="name">result</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="exc">ValueError</span>(<span class="st st-sg">'</span><span class="st">The user </span><span class="st st-int">%d</span><span class="st"> is not a member of this group</span><span class="st st-sg">'</span> <span class="op">%</span> - - <span class="name">user_id</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">group_members</span>.<span class="name">delete</span>( - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>) - )) - - <span class="kw">def </span><span class="fun">is_member</span>(<span class="bn bn-pseudo">self</span>, <span class="name">user</span>): - <span class="st st-db">"""</span><span class="st">Check if a user is a member of this group.</span><span class="st st-db">"""</span> - - <span class="kw">if</span> <span class="bn">isinstance</span>(<span class="name">user</span>, <span class="name">User</span>): - <span class="name">user_id</span> <span class="op">=</span> <span class="name">user</span>.<span class="name">user_id</span> - - <span class="kw">else</span>: - <span class="name">user_id</span> <span class="op">=</span> <span class="name">User</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>, <span class="name">user</span>).<span class="name">user_id</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">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span>], - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">user_id</span> <span class="op">==</span> <span class="name">user_id</span>) <span class="op">&</span> - - (<span class="name">group_members</span>.<span class="name">c</span>.<span class="name">group_id</span> <span class="op">==</span> <span class="bn bn-pseudo">self</span>.<span class="name">group_id</span>) - )) - <span class="kw">return</span> <span class="name">result</span>.<span class="name">fetchone</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">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">group_id</span> <span class="op">==</span> <span class="name">other</span>.<span class="name">group_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">group_id</span>, - <span class="bn bn-pseudo">self</span>.<span class="name">name</span> - - ) -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.usersettings - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - User Settings support. - - :copyright: 2006 by Armin Ronacher, Lukas Meuser. - :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">from </span><span class="cls">os</span><span class="kw"> import</span> <span class="name">path</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="kw">from </span><span class="cls">pocoo.application</span><span class="kw"> import</span> <span class="name">LinkableMixin</span> - -<span class="kw">from </span><span class="cls">pocoo.utils.image</span><span class="kw"> import</span> <span class="name">resize_image</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.form</span><span class="kw"> import</span> <span class="name">Form</span>, <span class="name">TextField</span>, <span class="name">FileField</span>, <span class="name">TextArea</span>, <span class="name">CheckBox</span>, \ - <span class="name">SelectBox</span> - -<span class="kw">from </span><span class="cls">pocoo.utils.validators</span><span class="kw"> import</span> <span class="name">isSameValue</span>, <span class="name">isEmail</span>, <span class="name">isExistingUrl</span>, \ - <span class="name">checkTextLength</span>, <span class="name">mayEmpty</span>, <span class="name">checkIfOtherNotBlank</span>, <span class="name">isSupportedImage</span>, \ - <span class="name">doMultiCheck</span>, <span class="name">isInRange</span>, <span class="name">isInteger</span> - -<span class="kw">from </span><span class="cls">pocoo.pkg.core.validators</span><span class="kw"> import</span> <span class="name">isStrongPassword</span>, <span class="name">isIcqMessengerId</span>, \ - <span class="name">isMsnMessengerId</span>, <span class="name">isJabberMessengerId</span> -<span class="kw">from </span><span class="cls">pocoo.pkg.core.textfmt</span><span class="kw"> import</span> <span class="name">get_editor</span> - - -<span class="kw">class </span><span class="cls">UserSettingsPage</span>(<span class="name">Component</span>, <span class="name">LinkableMixin</span>): - - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">settings_page_identifier</span>(<span class="bn bn-pseudo">self</span>): - <span class="st st-db">"""</span><span class="st">The name of the page which is also the url - under which the page will be visible:: - - /settings/$SETTINGS_PAGE_IDENTIFIER$</span><span class="st st-db">"""</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">self</span>.<span class="name">__class__</span>.<span class="name">__name__</span> - - <span class="deco">@property</span> - <span class="kw">def </span><span class="fun">relative_url</span>(<span class="bn bn-pseudo">self</span>): - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">settings/</span><span class="st st-int">%s</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="bn bn-pseudo">self</span>.<span class="name">settings_page_identifier</span> - - <span class="kw">def </span><span class="fun">get_settings_link_title</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="st st-db">"""</span><span class="st">Has to return a text for the link title in the - settings sidebar (this musn't be a sidebar, in fact - it depends on the template. - - If the method returns ``None`` the template wont - render this link.</span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">get_settings_page</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="st st-db">"""</span><span class="st">This method automatically gets called when a - user requests this settings page. It must either - return a valid Response object or a tuple in the - form (template, context) where template is a string - with the template filename and context is a dict - which automatically gets updated with the generated - sidebar so that templates can access it.</span><span class="st st-db">"""</span> - - - -<span class="kw">class </span><span class="cls">UserSignatureSettings</span>(<span class="name">UserSettingsPage</span>): - <span class="st st-db">"""</span><span class="st"> - This page allows the user to create / edit his signature - using an editor. - </span><span class="st st-db">"""</span> - <span class="name">settings_page_identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_settings_link_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">Signature</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_settings_page</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="name">get_setting</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">x</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>.<span class="name">get</span>(<span class="name">x</span>, <span class="name">u</span><span class="st st-sg">''</span>) - <span class="name">msg</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextArea</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">signature</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">0</span>, <span class="nb nb-int">255</span>) <span class="cm"># from config!</span> - - ) - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>.<span class="name">update</span>(<span class="name">d</span>) - <span class="name">req</span>.<span class="name">user</span>.<span class="name">save</span>() - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Signature saved</span><span class="st st-sg">'</span>) - - <span class="name">js</span>, <span class="name">options</span> <span class="op">=</span> <span class="name">get_editor</span>(<span class="name">req</span>, <span class="name">signature</span><span class="op">=</span><span class="bn bn-pseudo">True</span>) - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">settings/signature.html</span><span class="st st-sg">'</span>, { - <span class="st st-sg">'</span><span class="st">form</span><span class="st st-sg">'</span>: <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">msg</span><span class="st st-sg">'</span>: <span class="name">msg</span>, - <span class="st st-sg">'</span><span class="st">editor_options</span><span class="st st-sg">'</span>: <span class="name">options</span>, - <span class="st st-sg">'</span><span class="st">editor_javascript</span><span class="st st-sg">'</span>:<span class="name">js</span> - - } - - -<span class="kw">class </span><span class="cls">UserProfileSettings</span>(<span class="name">UserSettingsPage</span>): - <span class="st st-db">"""</span><span class="st"> - This page allows the user to edit his public information. - - XXX: make this more flexible -- later (LATER!!!!) - </span><span class="st st-db">"""</span> - <span class="name">settings_page_identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">profile</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_settings_link_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">Profile</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_settings_page</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="name">get_setting</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">x</span>: <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>.<span class="name">get</span>(<span class="name">x</span>, <span class="name">u</span><span class="st st-sg">''</span>) - <span class="name">msg</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="cm"># general information</span> - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isStrongPassword</span>()) - ), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">new_password2</span><span class="st st-sg">'</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">checkIfOtherNotBlank</span>(<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>, - <span class="name">isSameValue</span>(<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>, - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The two passwords must match</span><span class="st st-sg">'</span>)) - ) - ), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">req</span>.<span class="name">user</span>.<span class="name">email</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">isEmail</span>() - ), - <span class="name">CheckBox</span>(<span class="st st-sg">'</span><span class="st">show_email</span><span class="st st-sg">'</span>, - <span class="name">default</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">show_email</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="bn bn-pseudo">False</span> - - ), - <span class="cm"># instant messengers</span> - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">aol</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">aol</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>() - ), <span class="cm"># need a validator</span> - - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">icq</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">icq</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isIcqMessengerId</span>()) - ), <span class="cm"># need a validator</span> - - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">jabber</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">jabber</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isJabberMessengerId</span>()) - ), <span class="cm"># need a validator</span> - - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">msn</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">msn</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isMsnMessengerId</span>()) - ), <span class="cm"># need a validator</span> - - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">yahoo</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">yahoo</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>() - ), <span class="cm"># need a validator</span> - - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">website</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">website</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isExistingUrl</span>()) - ), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">location</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">location</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">0</span>, <span class="nb nb-int">255</span>), - ), - <span class="name">TextArea</span>(<span class="st st-sg">'</span><span class="st">interests</span><span class="st st-sg">'</span>, - <span class="name">default</span><span class="op">=</span><span class="name">get_setting</span>(<span class="st st-sg">'</span><span class="st">interests</span><span class="st st-sg">'</span>), - <span class="name">validator</span><span class="op">=</span><span class="name">checkTextLength</span>(<span class="nb nb-int">0</span>, <span class="nb nb-int">512</span>) - ) - ) - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="cm"># set special setting values</span> - - <span class="kw">if</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>]: - <span class="name">req</span>.<span class="name">user</span>.<span class="name">set_password</span>(<span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>)) - <span class="kw">else</span>: - <span class="kw">del</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">new_password</span><span class="st st-sg">'</span>] - <span class="kw">del</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">new_password2</span><span class="st st-sg">'</span>] - <span class="name">req</span>.<span class="name">user</span>.<span class="name">email</span> <span class="op">=</span> <span class="name">d</span>.<span class="name">pop</span>(<span class="st st-sg">'</span><span class="st">email</span><span class="st st-sg">'</span>) - <span class="name">req</span>.<span class="name">user</span>.<span class="name">settings</span>.<span class="name">update</span>({<span class="st st-sg">'</span><span class="st">show_email</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">show_email</span><span class="st st-sg">'</span>)}) - <span class="cm"># update other profile fields</span> - - <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>.<span class="name">update</span>(<span class="name">d</span>) - <span class="name">req</span>.<span class="name">user</span>.<span class="name">save</span>() - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Settings saved</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">settings/profile.html</span><span class="st st-sg">'</span>, { - <span class="st st-sg">'</span><span class="st">form</span><span class="st st-sg">'</span>: <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">msg</span><span class="st st-sg">'</span>: <span class="name">msg</span> - - } - - -<span class="kw">class </span><span class="cls">AvatarSettings</span>(<span class="name">UserSettingsPage</span>): - <span class="st st-db">"""</span><span class="st"> - This page allows the user to update his avatar - </span><span class="st st-db">"""</span> - <span class="name">settings_page_identifier</span> <span class="op">=</span> <span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span> - - <span class="kw">def </span><span class="fun">get_settings_link_title</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="kw">if</span> <span class="name">req</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">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">allow_avatars</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">True</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">Avatar</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_settings_page</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">req</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">board</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">allow_avatars</span><span class="st st-sg">'</span>, <span class="bn bn-pseudo">True</span>): - <span class="kw">return</span> <span class="name">PageNotFound</span>() - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - - <span class="name">msg</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">def </span><span class="fun">make_small_thumbnail</span>(<span class="name">value</span>): - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">value</span>: - <span class="kw">return</span> - - <span class="name">dim</span> <span class="op">=</span> <span class="bn bn-pseudo">self</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">avatar_dimension</span><span class="st st-sg">'</span>, <span class="nb nb-int">80</span>) - <span class="kw">return</span> <span class="name">resize_image</span>(<span class="name">value</span>, <span class="name">dim</span>, <span class="name">dim</span>, <span class="st st-sg">'</span><span class="st">image/png</span><span class="st st-sg">'</span>) - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">FileField</span>(<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">isSupportedImage</span>()), - <span class="name">manipulator</span><span class="op">=</span><span class="name">make_small_thumbnail</span> - - ), - <span class="name">CheckBox</span>(<span class="st st-sg">'</span><span class="st">delete_avatar</span><span class="st st-sg">'</span>) - ) - <span class="name">avatar</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">files</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">uid</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> - - <span class="name">fn</span> <span class="op">=</span> <span class="name">path</span>.<span class="name">join</span>(<span class="bn bn-pseudo">self</span>.<span class="name">ctx</span>.<span class="name">cfg</span>.<span class="name">root</span>, <span class="st st-sg">'</span><span class="st">avatars</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st st-int">%d</span><span class="st">.png</span><span class="st st-sg">'</span> <span class="op">%</span> <span class="name">uid</span>) - <span class="kw">if</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">delete_avatar</span><span class="st st-sg">'</span>]: - <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>[<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>] <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="kw">if</span> <span class="name">path</span>.<span class="name">exists</span>(<span class="name">fn</span>): - <span class="name">os</span>.<span class="name">unlink</span>(<span class="name">fn</span>) - <span class="kw">elif</span> <span class="name">d</span>[<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>]: - <span class="name">uid</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">user_id</span> - - <span class="name">f</span> <span class="op">=</span> <span class="bn">file</span>(<span class="name">fn</span>, <span class="st st-sg">'</span><span class="st">wb</span><span class="st st-sg">'</span>) - <span class="name">f</span>.<span class="name">write</span>(<span class="name">d</span>[<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>]) - <span class="name">f</span>.<span class="name">close</span>() - <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>[<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>] <span class="op">=</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">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">req</span>.<span class="name">user</span>.<span class="name">username</span>), <span class="name">show</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>) - <span class="name">req</span>.<span class="name">user</span>.<span class="name">save</span>() - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Settings saved</span><span class="st st-sg">'</span>) - <span class="cm"># TODO: support for linked avatars and gravatars</span> - - <span class="kw">elif</span> <span class="name">req</span>.<span class="name">user</span>.<span class="name">profile</span>.<span class="name">get</span>(<span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>): - <span class="name">avatar</span> <span class="op">=</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">users</span><span class="st st-sg">'</span>, <span class="name">urlencode</span>(<span class="name">req</span>.<span class="name">user</span>.<span class="name">username</span>), - <span class="name">show</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>) - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">settings/avatar.html</span><span class="st st-sg">'</span>, { - <span class="st st-sg">'</span><span class="st">form</span><span class="st st-sg">'</span>: <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">avatar</span><span class="st st-sg">'</span>: <span class="name">avatar</span>, - <span class="st st-sg">'</span><span class="st">msg</span><span class="st st-sg">'</span>: <span class="name">msg</span> - - } - - -<span class="kw">class </span><span class="cls">UserForumSettings</span>(<span class="name">UserSettingsPage</span>): - <span class="st st-db">"""</span><span class="st"> - This page allows the user to update his forum view settings - (ie. view mode and posts and threads per page) - </span><span class="st st-db">"""</span> - - <span class="name">settings_page_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_settings_link_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">Forum Settings</span><span class="st st-sg">'</span>) - - <span class="kw">def </span><span class="fun">get_settings_page</span>(<span class="bn bn-pseudo">self</span>, <span class="name">req</span>): - <span class="kw">def </span><span class="fun">int_or_none</span>(<span class="name">x</span>): - <span class="st st-db">"</span><span class="st">manipulator which returns an int or None</span><span class="st st-db">"</span> - - <span class="kw">try</span>: - <span class="kw">return</span> <span class="bn">int</span>(<span class="name">x</span>) - <span class="kw">except</span> <span class="exc">ValueError</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">None</span> - - <span class="name">_</span> <span class="op">=</span> <span class="name">req</span>.<span class="name">gettext</span> - <span class="name">msg</span> <span class="op">=</span> <span class="bn bn-pseudo">None</span> - - <span class="name">form</span> <span class="op">=</span> <span class="name">Form</span>(<span class="name">req</span>, <span class="bn bn-pseudo">self</span>, <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>, - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">posts_per_page</span><span class="st st-sg">'</span>, - <span class="name">default</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">posts_per_page</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">u</span><span class="st st-sg">''</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">doMultiCheck</span>(<span class="name">isInteger</span>(), <span class="name">isInRange</span>(<span class="nb nb-int">5</span>, <span class="nb nb-int">50</span>))), - <span class="name">manipulator</span><span class="op">=</span><span class="name">int_or_none</span> - - ), - <span class="name">TextField</span>(<span class="st st-sg">'</span><span class="st">threads_per_page</span><span class="st st-sg">'</span>, - <span class="name">default</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">threads_per_page</span><span class="st st-sg">'</span>) <span class="op op-word">or</span> <span class="name">u</span><span class="st st-sg">''</span>, - <span class="name">validator</span><span class="op">=</span><span class="name">mayEmpty</span>(<span class="name">doMultiCheck</span>(<span class="name">isInteger</span>(), <span class="name">isInRange</span>(<span class="nb nb-int">10</span>, <span class="nb nb-int">80</span>))), - <span class="name">manipulator</span><span class="op">=</span><span class="name">int_or_none</span> - - ), - <span class="name">SelectBox</span>(<span class="st st-sg">'</span><span class="st">view_mode</span><span class="st st-sg">'</span>, [ - (<span class="st st-sg">''</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">default</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="name">_</span>(<span class="st st-sg">'</span><span class="st">threaded</span><span class="st st-sg">'</span>)), - (<span class="st st-sg">'</span><span class="st">flat</span><span class="st st-sg">'</span>, <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">flat</span><span class="st st-sg">'</span>)) - ], <span class="name">default</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="op op-word">or</span> <span class="name">u</span><span class="st st-sg">''</span> - - ) - ) - - <span class="kw">if</span> <span class="name">req</span>.<span class="name">method</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">POST</span><span class="st st-sg">'</span>: - <span class="name">form</span>.<span class="name">update</span>(<span class="name">req</span>.<span class="name">form</span>, <span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">form</span>.<span class="name">has_errors</span>: - <span class="name">d</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">to_dict</span>() - <span class="name">req</span>.<span class="name">user</span>.<span class="name">settings</span>.<span class="name">update</span>(<span class="name">d</span>) - <span class="name">req</span>.<span class="name">user</span>.<span class="name">save</span>() - <span class="name">msg</span> <span class="op">=</span> <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Forum settings saved</span><span class="st st-sg">'</span>) - - <span class="kw">return</span> <span class="st st-sg">'</span><span class="st">settings/forumsettings.html</span><span class="st st-sg">'</span>, { - <span class="st st-sg">'</span><span class="st">form</span><span class="st st-sg">'</span>: <span class="name">form</span>.<span class="name">generate</span>(<span class="name">prefix</span><span class="op">=</span><span class="st st-sg">'</span><span class="st">f_</span><span class="st st-sg">'</span>), - <span class="st st-sg">'</span><span class="st">msg</span><span class="st st-sg">'</span>: <span class="name">msg</span> - - } -<span class="cm"># -*- coding: utf-8 -*-</span> -<span class="st st-db">"""</span><span class="st"> - pocoo.pkg.core.validators - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Special validation, in addition to `pocoo.utils.validators`. - - For a general explanation of the validators system, please - see `pocoo.utils.form`. - - - :copyright: 2006 by Armin Ronacher. - :license: GNU GPL, see LICENSE for more details. -</span><span class="st st-db">"""</span> -<span class="kw">import </span><span class="cls">re</span> -<span class="kw">import </span><span class="cls">unicodedata</span> -<span class="kw">from </span><span class="cls">pocoo.utils.validators</span><span class="kw"> import</span> <span class="name">ValidationError</span>, <span class="name">_mail_re</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="name">get_id_by_name</span> - -<span class="name">_icq_re</span> <span class="op">=</span> <span class="name">re</span>.<span class="name">compile</span>(<span class="st st-sg">r'</span><span class="st">^\d{6,9}$</span><span class="st st-sg">'</span>) - - - -<span class="cm"># pylint: disable-msg=C0103</span> - -<span class="kw">def </span><span class="fun">isValidUsername</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the given string looks like a valid username.</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_valid_username</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="name">errors</span> <span class="op">=</span> [] - <span class="name">_</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">s</span>: <span class="name">errors</span>.<span class="name">append</span>(<span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="name">s</span>)) - <span class="name">value</span> <span class="op">=</span> <span class="name">field</span>.<span class="name">value</span>.<span class="name">strip</span>() - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">value</span>) <span class="op"><</span> <span class="nb nb-int">2</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a username that is at least 2 characters long.</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">value</span>) <span class="op">></span> <span class="nb nb-int">30</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a username that is no longer than 30 characters.</span><span class="st st-sg">'</span>) - <span class="kw">for</span> <span class="name">char</span> <span class="op op-word">in</span> <span class="name">value</span>: - <span class="kw">if</span> <span class="name">char</span> <span class="op op-word">in</span> <span class="st st-sg">'</span><span class="st">_-. </span><span class="st st-sg">'</span>: - <span class="kw">continue</span> - - <span class="kw">if</span> <span class="name">unicodedata</span>.<span class="name">category</span>(<span class="name">char</span>)[<span class="nb nb-int">0</span>] <span class="op op-word">not</span> <span class="op op-word">in</span> <span class="st st-sg">'</span><span class="st">LN</span><span class="st st-sg">'</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a username without special characters </span><span class="st st-sg">'</span> - - <span class="st st-sg">'</span><span class="st">except "_", "-", ".".</span><span class="st st-sg">'</span>) - <span class="kw">break</span> - <span class="kw">if</span> <span class="name">errors</span>: - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="op">*</span><span class="name">errors</span>) - <span class="kw">return</span> <span class="name">is_valid_username</span> - - -<span class="kw">def </span><span class="fun">isAvailableUsername</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the username is valid and available.</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_available_username</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="name">isValidUsername</span>()(<span class="name">field</span>, <span class="name">form</span>) - <span class="kw">try</span>: - <span class="name">get_id_by_name</span>(<span class="name">form</span>.<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">field</span>.<span class="name">value</span>) - <span class="kw">except</span> <span class="name">User</span>.<span class="name">NotFound</span>: - <span class="kw">return</span> - - <span class="name">_</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span> - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The username is already in use.</span><span class="st st-sg">'</span>)) - <span class="kw">return</span> <span class="name">is_available_username</span> - - -<span class="kw">def </span><span class="fun">isAnonymousUsername</span>(): - <span class="st st-db">"""</span><span class="st">Checks if this is a valid username for anonymous usage.</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_anonymous_username</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="kw">if</span> <span class="name">field</span>.<span class="name">value</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">isAvailableUsername</span>()(<span class="name">field</span>, <span class="name">form</span>) - <span class="kw">return</span> <span class="name">is_anonymous_username</span> - - -<span class="kw">def </span><span class="fun">isExistingUsername</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the username does exist.</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_existing_username</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="kw">try</span>: - <span class="name">get_id_by_name</span>(<span class="name">form</span>.<span class="name">req</span>.<span class="name">ctx</span>, <span class="name">field</span>.<span class="name">value</span>) - <span class="kw">return</span> - - <span class="kw">except</span> <span class="name">User</span>.<span class="name">NotFound</span>: - <span class="name">_</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">The user </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">field</span>.<span class="name">value</span>) - <span class="kw">return</span> <span class="name">is_existing_username</span> - - -<span class="kw">def </span><span class="fun">isStrongPassword</span>(<span class="name">strength</span><span class="op">=</span><span class="bn bn-pseudo">None</span>): - <span class="st st-db">"""</span><span class="st">Checks if the password is strong enough</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_strong_password</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="name">errors</span> <span class="op">=</span> [] - <span class="name">_</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">s</span>: <span class="name">errors</span>.<span class="name">append</span>(<span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="name">s</span>)) - <span class="kw">if</span> <span class="name">strength</span> <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">s</span> <span class="op">=</span> <span class="name">form</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">security</span><span class="st st-sg">'</span>, <span class="st st-sg">'</span><span class="st">password_strength</span><span class="st st-sg">'</span>, <span class="nb nb-int">3</span>) - <span class="kw">else</span>: - <span class="name">s</span> <span class="op">=</span> <span class="name">strength</span> - - <span class="name">s</span> <span class="op">=</span> <span class="bn">max</span>(<span class="nb nb-int">0</span>, <span class="bn">min</span>(<span class="nb nb-int">4</span>, <span class="name">s</span>)) - <span class="kw">if</span> <span class="op op-word">not</span> <span class="name">s</span> <span class="op op-word">and</span> <span class="op op-word">not</span> <span class="name">field</span>.<span class="name">value</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please fill out the password field.</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="name">s</span> <span class="op">==</span> <span class="nb nb-int">1</span>: - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op"><</span> <span class="nb nb-int">4</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a password with at least 4 characters.</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="name">s</span> <span class="op">==</span> <span class="nb nb-int">2</span>: - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op"><</span> <span class="nb nb-int">6</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a password with at least 6 characters.</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="name">s</span> <span class="op">==</span> <span class="nb nb-int">3</span>: - <span class="kw">def </span><span class="fun">test</span>(): - <span class="name">have_letter</span> <span class="op">=</span> <span class="name">have_number</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">for</span> <span class="name">char</span> <span class="op op-word">in</span> <span class="name">field</span>.<span class="name">value</span>: - <span class="name">c</span> <span class="op">=</span> <span class="name">unicodedata</span>.<span class="name">category</span>(<span class="name">char</span>)[<span class="nb nb-int">0</span>] - <span class="kw">if</span> <span class="name">c</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">L</span><span class="st st-sg">'</span>: - <span class="name">have_letter</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">elif</span> <span class="name">c</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">N</span><span class="st st-sg">'</span>: - <span class="name">have_number</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - <span class="kw">if</span> <span class="name">have_letter</span> <span class="op op-word">and</span> <span class="name">have_number</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">False</span> - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op"><</span> <span class="nb nb-int">6</span> <span class="op op-word">or</span> <span class="op op-word">not</span> <span class="name">test</span>(): - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a password with at least 6 characters which </span><span class="st st-sg">'</span> - - <span class="st st-sg">'</span><span class="st">contains both letters and numbers.</span><span class="st st-sg">'</span>) - <span class="kw">elif</span> <span class="name">s</span> <span class="op">==</span> <span class="nb nb-int">4</span>: - <span class="kw">def </span><span class="fun">test</span>(): - <span class="name">have_letter</span> <span class="op">=</span> <span class="name">have_number</span>, <span class="name">have_special</span> <span class="op">=</span> <span class="bn bn-pseudo">False</span> - - <span class="kw">for</span> <span class="name">char</span> <span class="op op-word">in</span> <span class="name">field</span>.<span class="name">value</span>: - <span class="name">c</span> <span class="op">=</span> <span class="name">unicodedata</span>.<span class="name">category</span>(<span class="name">char</span>)[<span class="nb nb-int">0</span>] - <span class="kw">if</span> <span class="name">c</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">L</span><span class="st st-sg">'</span>: - <span class="name">have_letter</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">elif</span> <span class="name">c</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">N</span><span class="st st-sg">'</span>: - <span class="name">have_number</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - <span class="kw">elif</span> <span class="name">c</span> <span class="op">==</span> <span class="st st-sg">'</span><span class="st">S</span><span class="st st-sg">'</span>: - <span class="name">have_special</span> <span class="op">=</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">if</span> <span class="name">have_letter</span> <span class="op op-word">and</span> <span class="name">have_number</span> <span class="op op-word">and</span> <span class="name">have_special</span>: - <span class="kw">return</span> <span class="bn bn-pseudo">True</span> - - <span class="kw">return</span> <span class="bn bn-pseudo">False</span> - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op"><</span> <span class="nb nb-int">6</span> <span class="op op-word">or</span> <span class="op op-word">not</span> <span class="name">test</span>(): - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a password with at least 6 characters with </span><span class="st st-sg">'</span> - - <span class="st st-sg">'</span><span class="st">contains of letters, numbers and at least one special </span><span class="st st-sg">'</span> - <span class="st st-sg">'</span><span class="st">character.</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="name">errors</span>: - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="op">*</span><span class="name">errors</span>) - <span class="kw">return</span> <span class="name">is_strong_password</span> - - - -<span class="kw">def </span><span class="fun">isValidSignature</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the signature is valid.</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_valid_signature</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="name">errors</span> <span class="op">=</span> [] - <span class="name">_</span> <span class="op">=</span> <span class="kw">lambda</span> <span class="name">s</span>: <span class="name">errors</span>.<span class="name">append</span>(<span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span>(<span class="name">s</span>)) - <span class="name">val</span> <span class="op">=</span> <span class="name">field</span>.<span class="name">value</span>.<span class="name">strip</span>() - <span class="name">max_len</span> <span class="op">=</span> <span class="name">form</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">signature_length</span><span class="st st-sg">'</span>) - <span class="name">max_lines</span> <span class="op">=</span> <span class="name">form</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">signature_lines</span><span class="st st-sg">'</span>) - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">val</span>) <span class="op">></span> <span class="name">max_len</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Your signature must not be longer than </span><span class="st st-int">%d</span><span class="st"> characters.</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">max_len</span> - - <span class="kw">if</span> <span class="bn">len</span>(<span class="name">val</span>.<span class="name">splitlines</span>()) <span class="op">></span> <span class="name">max_lines</span>: - <span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Your signature must not be longer than </span><span class="st st-int">%d</span><span class="st"> lines.</span><span class="st st-sg">'</span>) <span class="op">%</span> <span class="name">max_lines</span> - - <span class="kw">if</span> <span class="name">errors</span>: - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="op">*</span><span class="name">errors</span>) - <span class="kw">return</span> <span class="name">is_valid_signature</span> - -<span class="kw">def </span><span class="fun">isIcqMessengerId</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the value is a valid ICQ ID</span><span class="st st-db">"""</span> - <span class="kw">def </span><span class="fun">is_icq_messenger_id</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="kw">if</span> <span class="name">_icq_re</span>.<span class="name">search</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">_</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a valid ICQ ID</span><span class="st st-sg">'</span>)) - <span class="kw">return</span> <span class="name">is_icq_messenger_id</span> - - -<span class="kw">def </span><span class="fun">isJabberMessengerId</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the value is a valid jabber ID</span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">is_jabber_messenger_id</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="kw">if</span> <span class="name">_mail_re</span>.<span class="name">search</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">_</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a valid jabber ID</span><span class="st st-sg">'</span>)) - <span class="kw">return</span> <span class="name">is_jabber_messenger_id</span> - - -<span class="kw">def </span><span class="fun">isMsnMessengerId</span>(): - <span class="st st-db">"""</span><span class="st">Checks if the value is a valid MSN ID</span><span class="st st-db">"""</span> - - <span class="kw">def </span><span class="fun">is_msn_messenger_id</span>(<span class="name">field</span>, <span class="name">form</span>): - <span class="kw">if</span> <span class="name">_mail_re</span>.<span class="name">search</span>(<span class="name">field</span>.<span class="name">value</span>) <span class="op op-word">is</span> <span class="bn bn-pseudo">None</span>: - <span class="name">_</span> <span class="op">=</span> <span class="name">form</span>.<span class="name">req</span>.<span class="name">gettext</span> - - <span class="kw">raise</span> <span class="name">ValidationError</span>(<span class="name">_</span>(<span class="st st-sg">'</span><span class="st">Please enter a valid MSN ID.</span><span class="st st-sg">'</span>)) - <span class="kw">return</span> <span class="name">is_msn_messenger_id</span> - - -<span class="cm"># TODO: I don't know how valid AIM and Y!M IDs look, so I can't write validators</span> - -<span class="cm"># for them. It looks like they are simple strings, but I'm not sure...</span> </pre> <script type="text/javascript">initCodeBlock('code-block')</script> </body> |