~ubuntu-branches/debian/jessie/web2py/jessie

« back to all changes in this revision

Viewing changes to applications/examples/static/epydoc/web2py.gluon.fileutils-pysrc.html

  • Committer: Package Import Robot
  • Author(s): José L. Redrejo Rodríguez
  • Date: 2011-11-04 10:12:01 UTC
  • mfrom: (1.1.10)
  • Revision ID: package-import@ubuntu.com-20111104101201-ym8q3030ik8sc10u
Tags: 1.99.2.1-1
* Updated upstream sources with real 1.99.2 version
* Ensure python-gtk2 is not needed to run web2py, fixing 
  debian/patches/gtk_gui (Closes: #646931)
* Refreshed debian/patches/avoid_updating patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
77
77
<a name="L13"></a><tt class="py-lineno"> 13</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">tarfile</tt> </tt>
78
78
<a name="L14"></a><tt class="py-lineno"> 14</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">glob</tt> </tt>
79
79
<a name="L15"></a><tt class="py-lineno"> 15</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt id="link-1" class="py-name" targets="Class datetime.time=datetime.time-class.html"><a title="datetime.time" class="py-name" href="#" onclick="return doclink('link-1', 'time', 'link-1');">time</a></tt> </tt>
80
 
<a name="L16"></a><tt class="py-lineno"> 16</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt id="link-2" class="py-name" targets="Module web2py.gluon.http=web2py.gluon.http-module.html"><a title="web2py.gluon.http" class="py-name" href="#" onclick="return doclink('link-2', 'http', 'link-2');">http</a></tt> <tt class="py-keyword">import</tt> <tt id="link-3" class="py-name" targets="Class web2py.gluon.http.HTTP=web2py.gluon.http.HTTP-class.html"><a title="web2py.gluon.http.HTTP" class="py-name" href="#" onclick="return doclink('link-3', 'HTTP', 'link-3');">HTTP</a></tt> </tt>
81
 
<a name="L17"></a><tt class="py-lineno"> 17</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt class="py-name">gzip</tt> <tt class="py-keyword">import</tt> <tt class="py-name">open</tt> <tt class="py-keyword">as</tt> <tt class="py-name">gzopen</tt> </tt>
82
 
<a name="L18"></a><tt class="py-lineno"> 18</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt id="link-4" class="py-name" targets="Module web2py.gluon.settings=web2py.gluon.settings-module.html,Variable web2py.gluon.settings.settings=web2py.gluon.settings-module.html#settings"><a title="web2py.gluon.settings
83
 
web2py.gluon.settings.settings" class="py-name" href="#" onclick="return doclink('link-4', 'settings', 'link-4');">settings</a></tt> <tt class="py-keyword">import</tt> <tt id="link-5" class="py-name" targets="Variable web2py.gluon.settings.global_settings=web2py.gluon.settings-module.html#global_settings"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-5', 'global_settings', 'link-5');">global_settings</a></tt> </tt>
84
 
<a name="L19"></a><tt class="py-lineno"> 19</tt>  <tt class="py-line"> </tt>
 
80
<a name="L16"></a><tt class="py-lineno"> 16</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt id="link-2" class="py-name" targets="Class datetime.datetime=datetime.datetime-class.html"><a title="datetime.datetime" class="py-name" href="#" onclick="return doclink('link-2', 'datetime', 'link-2');">datetime</a></tt> </tt>
 
81
<a name="L17"></a><tt class="py-lineno"> 17</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt id="link-3" class="py-name" targets="Module web2py.gluon.http=web2py.gluon.http-module.html"><a title="web2py.gluon.http" class="py-name" href="#" onclick="return doclink('link-3', 'http', 'link-3');">http</a></tt> <tt class="py-keyword">import</tt> <tt id="link-4" class="py-name" targets="Class web2py.gluon.http.HTTP=web2py.gluon.http.HTTP-class.html"><a title="web2py.gluon.http.HTTP" class="py-name" href="#" onclick="return doclink('link-4', 'HTTP', 'link-4');">HTTP</a></tt> </tt>
 
82
<a name="L18"></a><tt class="py-lineno"> 18</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt class="py-name">gzip</tt> <tt class="py-keyword">import</tt> <tt class="py-name">open</tt> <tt class="py-keyword">as</tt> <tt class="py-name">gzopen</tt> </tt>
 
83
<a name="L19"></a><tt class="py-lineno"> 19</tt>  <tt class="py-line"><tt class="py-keyword">from</tt> <tt id="link-5" class="py-name" targets="Module web2py.gluon.settings=web2py.gluon.settings-module.html,Variable web2py.gluon.settings.settings=web2py.gluon.settings-module.html#settings"><a title="web2py.gluon.settings
 
84
web2py.gluon.settings.settings" class="py-name" href="#" onclick="return doclink('link-5', 'settings', 'link-5');">settings</a></tt> <tt class="py-keyword">import</tt> <tt id="link-6" class="py-name" targets="Variable web2py.gluon.settings.global_settings=web2py.gluon.settings-module.html#global_settings"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-6', 'global_settings', 'link-6');">global_settings</a></tt> </tt>
85
85
<a name="L20"></a><tt class="py-lineno"> 20</tt>  <tt class="py-line"> </tt>
86
 
<a name="L21"></a><tt class="py-lineno"> 21</tt>  <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt> </tt>
87
 
<a name="L22"></a><tt class="py-lineno"> 22</tt>  <tt class="py-line">    <tt class="py-string">'read_file'</tt><tt class="py-op">,</tt> </tt>
88
 
<a name="L23"></a><tt class="py-lineno"> 23</tt>  <tt class="py-line">    <tt class="py-string">'write_file'</tt><tt class="py-op">,</tt> </tt>
89
 
<a name="L24"></a><tt class="py-lineno"> 24</tt>  <tt class="py-line">    <tt class="py-string">'readlines_file'</tt><tt class="py-op">,</tt> </tt>
90
 
<a name="L25"></a><tt class="py-lineno"> 25</tt>  <tt class="py-line">    <tt class="py-string">'up'</tt><tt class="py-op">,</tt> </tt>
91
 
<a name="L26"></a><tt class="py-lineno"> 26</tt>  <tt class="py-line">    <tt class="py-string">'abspath'</tt><tt class="py-op">,</tt> </tt>
92
 
<a name="L27"></a><tt class="py-lineno"> 27</tt>  <tt class="py-line">    <tt class="py-string">'mktree'</tt><tt class="py-op">,</tt> </tt>
93
 
<a name="L28"></a><tt class="py-lineno"> 28</tt>  <tt class="py-line">    <tt class="py-string">'listdir'</tt><tt class="py-op">,</tt> </tt>
94
 
<a name="L29"></a><tt class="py-lineno"> 29</tt>  <tt class="py-line">    <tt class="py-string">'recursive_unlink'</tt><tt class="py-op">,</tt> </tt>
95
 
<a name="L30"></a><tt class="py-lineno"> 30</tt>  <tt class="py-line">    <tt class="py-string">'cleanpath'</tt><tt class="py-op">,</tt> </tt>
96
 
<a name="L31"></a><tt class="py-lineno"> 31</tt>  <tt class="py-line">    <tt class="py-string">'tar'</tt><tt class="py-op">,</tt> </tt>
97
 
<a name="L32"></a><tt class="py-lineno"> 32</tt>  <tt class="py-line">    <tt class="py-string">'untar'</tt><tt class="py-op">,</tt> </tt>
98
 
<a name="L33"></a><tt class="py-lineno"> 33</tt>  <tt class="py-line">    <tt class="py-string">'tar_compiled'</tt><tt class="py-op">,</tt> </tt>
99
 
<a name="L34"></a><tt class="py-lineno"> 34</tt>  <tt class="py-line">    <tt class="py-string">'get_session'</tt><tt class="py-op">,</tt> </tt>
100
 
<a name="L35"></a><tt class="py-lineno"> 35</tt>  <tt class="py-line">    <tt class="py-string">'check_credentials'</tt><tt class="py-op">,</tt> </tt>
101
 
<a name="L36"></a><tt class="py-lineno"> 36</tt>  <tt class="py-line">    <tt class="py-string">'w2p_pack'</tt><tt class="py-op">,</tt> </tt>
102
 
<a name="L37"></a><tt class="py-lineno"> 37</tt>  <tt class="py-line">    <tt class="py-string">'w2p_unpack'</tt><tt class="py-op">,</tt> </tt>
103
 
<a name="L38"></a><tt class="py-lineno"> 38</tt>  <tt class="py-line">    <tt class="py-string">'w2p_pack_plugin'</tt><tt class="py-op">,</tt> </tt>
104
 
<a name="L39"></a><tt class="py-lineno"> 39</tt>  <tt class="py-line">    <tt class="py-string">'w2p_unpack_plugin'</tt><tt class="py-op">,</tt> </tt>
105
 
<a name="L40"></a><tt class="py-lineno"> 40</tt>  <tt class="py-line">    <tt class="py-string">'fix_newlines'</tt><tt class="py-op">,</tt> </tt>
106
 
<a name="L41"></a><tt class="py-lineno"> 41</tt>  <tt class="py-line">    <tt class="py-string">'make_fake_file_like_object'</tt><tt class="py-op">,</tt> </tt>
107
 
<a name="L42"></a><tt class="py-lineno"> 42</tt>  <tt class="py-line">    <tt class="py-op">]</tt> </tt>
108
 
<a name="L43"></a><tt class="py-lineno"> 43</tt>  <tt class="py-line"> </tt>
109
 
<a name="read_file"></a><div id="read_file-def"><a name="L44"></a><tt class="py-lineno"> 44</tt> <a class="py-toggle" href="#" id="read_file-toggle" onclick="return toggle('read_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#read_file">read_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'r'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
110
 
</div><div id="read_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="read_file-expanded"><a name="L45"></a><tt class="py-lineno"> 45</tt>  <tt class="py-line">    <tt class="py-docstring">"returns content from filename, making sure to close the file explicitly on exit."</tt> </tt>
111
 
<a name="L46"></a><tt class="py-lineno"> 46</tt>  <tt class="py-line">    <tt class="py-name">f</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt> </tt>
112
 
<a name="L47"></a><tt class="py-lineno"> 47</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
113
 
<a name="L48"></a><tt class="py-lineno"> 48</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-6" class="py-name" targets="Method web2py.gluon.dal.DatabaseStoredFile.read()=web2py.gluon.dal.DatabaseStoredFile-class.html#read,Method web2py.gluon.debug.Pipe.read()=web2py.gluon.debug.Pipe-class.html#read,Method web2py.gluon.languages.lazyT.read()=web2py.gluon.languages.lazyT-class.html#read,Method web2py.gluon.rocket.ChunkedReader.read()=web2py.gluon.rocket.ChunkedReader-class.html#read,Method web2py.gluon.tools.Crud.read()=web2py.gluon.tools.Crud-class.html#read"><a title="web2py.gluon.dal.DatabaseStoredFile.read
 
86
<a name="L21"></a><tt class="py-lineno"> 21</tt>  <tt class="py-line"> </tt>
 
87
<a name="L22"></a><tt class="py-lineno"> 22</tt>  <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt> </tt>
 
88
<a name="L23"></a><tt class="py-lineno"> 23</tt>  <tt class="py-line">    <tt class="py-string">'parse_version'</tt><tt class="py-op">,</tt> </tt>
 
89
<a name="L24"></a><tt class="py-lineno"> 24</tt>  <tt class="py-line">    <tt class="py-string">'read_file'</tt><tt class="py-op">,</tt> </tt>
 
90
<a name="L25"></a><tt class="py-lineno"> 25</tt>  <tt class="py-line">    <tt class="py-string">'write_file'</tt><tt class="py-op">,</tt> </tt>
 
91
<a name="L26"></a><tt class="py-lineno"> 26</tt>  <tt class="py-line">    <tt class="py-string">'readlines_file'</tt><tt class="py-op">,</tt> </tt>
 
92
<a name="L27"></a><tt class="py-lineno"> 27</tt>  <tt class="py-line">    <tt class="py-string">'up'</tt><tt class="py-op">,</tt> </tt>
 
93
<a name="L28"></a><tt class="py-lineno"> 28</tt>  <tt class="py-line">    <tt class="py-string">'abspath'</tt><tt class="py-op">,</tt> </tt>
 
94
<a name="L29"></a><tt class="py-lineno"> 29</tt>  <tt class="py-line">    <tt class="py-string">'mktree'</tt><tt class="py-op">,</tt> </tt>
 
95
<a name="L30"></a><tt class="py-lineno"> 30</tt>  <tt class="py-line">    <tt class="py-string">'listdir'</tt><tt class="py-op">,</tt> </tt>
 
96
<a name="L31"></a><tt class="py-lineno"> 31</tt>  <tt class="py-line">    <tt class="py-string">'recursive_unlink'</tt><tt class="py-op">,</tt> </tt>
 
97
<a name="L32"></a><tt class="py-lineno"> 32</tt>  <tt class="py-line">    <tt class="py-string">'cleanpath'</tt><tt class="py-op">,</tt> </tt>
 
98
<a name="L33"></a><tt class="py-lineno"> 33</tt>  <tt class="py-line">    <tt class="py-string">'tar'</tt><tt class="py-op">,</tt> </tt>
 
99
<a name="L34"></a><tt class="py-lineno"> 34</tt>  <tt class="py-line">    <tt class="py-string">'untar'</tt><tt class="py-op">,</tt> </tt>
 
100
<a name="L35"></a><tt class="py-lineno"> 35</tt>  <tt class="py-line">    <tt class="py-string">'tar_compiled'</tt><tt class="py-op">,</tt> </tt>
 
101
<a name="L36"></a><tt class="py-lineno"> 36</tt>  <tt class="py-line">    <tt class="py-string">'get_session'</tt><tt class="py-op">,</tt> </tt>
 
102
<a name="L37"></a><tt class="py-lineno"> 37</tt>  <tt class="py-line">    <tt class="py-string">'check_credentials'</tt><tt class="py-op">,</tt> </tt>
 
103
<a name="L38"></a><tt class="py-lineno"> 38</tt>  <tt class="py-line">    <tt class="py-string">'w2p_pack'</tt><tt class="py-op">,</tt> </tt>
 
104
<a name="L39"></a><tt class="py-lineno"> 39</tt>  <tt class="py-line">    <tt class="py-string">'w2p_unpack'</tt><tt class="py-op">,</tt> </tt>
 
105
<a name="L40"></a><tt class="py-lineno"> 40</tt>  <tt class="py-line">    <tt class="py-string">'w2p_pack_plugin'</tt><tt class="py-op">,</tt> </tt>
 
106
<a name="L41"></a><tt class="py-lineno"> 41</tt>  <tt class="py-line">    <tt class="py-string">'w2p_unpack_plugin'</tt><tt class="py-op">,</tt> </tt>
 
107
<a name="L42"></a><tt class="py-lineno"> 42</tt>  <tt class="py-line">    <tt class="py-string">'fix_newlines'</tt><tt class="py-op">,</tt> </tt>
 
108
<a name="L43"></a><tt class="py-lineno"> 43</tt>  <tt class="py-line">    <tt class="py-string">'make_fake_file_like_object'</tt><tt class="py-op">,</tt> </tt>
 
109
<a name="L44"></a><tt class="py-lineno"> 44</tt>  <tt class="py-line">    <tt class="py-op">]</tt> </tt>
 
110
<a name="L45"></a><tt class="py-lineno"> 45</tt>  <tt class="py-line"> </tt>
 
111
<a name="parse_version"></a><div id="parse_version-def"><a name="L46"></a><tt class="py-lineno"> 46</tt> <a class="py-toggle" href="#" id="parse_version-toggle" onclick="return toggle('parse_version');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#parse_version">parse_version</a><tt class="py-op">(</tt><tt class="py-param">version</tt> <tt class="py-op">=</tt> <tt class="py-string">"Version 1.99.0 (2011-09-19 08:23:26)"</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
112
</div><div id="parse_version-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="parse_version-expanded"><a name="L47"></a><tt class="py-lineno"> 47</tt>  <tt class="py-line">    <tt class="py-name">re_version</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">'[^\d]+ (\d+)\.(\d+)\.(\d+)\s*\((?P&lt;datetime&gt;.+?)\)\s*(?P&lt;type&gt;[a-z]+)?'</tt><tt class="py-op">)</tt> </tt>
 
113
<a name="L48"></a><tt class="py-lineno"> 48</tt>  <tt class="py-line">    <tt id="link-7" class="py-name" targets="Variable web2py.gluon.languages.lazyT.m=web2py.gluon.languages.lazyT-class.html#m"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-7', 'm', 'link-7');">m</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re_version</tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt id="link-8" class="py-name" targets="Variable sqlite3.dbapi2.version=sqlite3.dbapi2-module.html#version"><a title="sqlite3.dbapi2.version" class="py-name" href="#" onclick="return doclink('link-8', 'version', 'link-8');">version</a></tt><tt class="py-op">)</tt> </tt>
 
114
<a name="L49"></a><tt class="py-lineno"> 49</tt>  <tt class="py-line">    <tt class="py-name">a</tt><tt class="py-op">,</tt><tt id="link-9" class="py-name" targets="Function web2py.gluon.rocket.b()=web2py.gluon.rocket-module.html#b"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-9', 'b', 'link-9');">b</a></tt><tt class="py-op">,</tt><tt class="py-name">c</tt> <tt class="py-op">=</tt> <tt class="py-name">int</tt><tt class="py-op">(</tt><tt id="link-10" class="py-name"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-10', 'm', 'link-7');">m</a></tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt id="link-11" class="py-name"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-11', 'm', 'link-7');">m</a></tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">2</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt><tt class="py-name">int</tt><tt class="py-op">(</tt><tt id="link-12" class="py-name"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-12', 'm', 'link-7');">m</a></tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">3</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
 
115
<a name="L50"></a><tt class="py-lineno"> 50</tt>  <tt class="py-line">    <tt id="link-13" class="py-name" targets="Variable web2py.gluon.languages.lazyT.s=web2py.gluon.languages.lazyT-class.html#s"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-13', 's', 'link-13');">s</a></tt> <tt class="py-op">=</tt> <tt id="link-14" class="py-name"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-14', 'm', 'link-7');">m</a></tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'type'</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'dev'</tt> </tt>
 
116
<a name="L51"></a><tt class="py-lineno"> 51</tt>  <tt class="py-line">    <tt class="py-name">d</tt> <tt class="py-op">=</tt> <tt id="link-15" class="py-name"><a title="datetime.datetime" class="py-name" href="#" onclick="return doclink('link-15', 'datetime', 'link-2');">datetime</a></tt><tt class="py-op">.</tt><tt id="link-16" class="py-name"><a title="datetime.datetime" class="py-name" href="#" onclick="return doclink('link-16', 'datetime', 'link-2');">datetime</a></tt><tt class="py-op">.</tt><tt class="py-name">strptime</tt><tt class="py-op">(</tt><tt id="link-17" class="py-name"><a title="web2py.gluon.languages.lazyT.m" class="py-name" href="#" onclick="return doclink('link-17', 'm', 'link-7');">m</a></tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-string">'datetime'</tt><tt class="py-op">)</tt><tt class="py-op">,</tt><tt class="py-string">'%Y-%m-%d %H:%M:%S'</tt><tt class="py-op">)</tt> </tt>
 
117
<a name="L52"></a><tt class="py-lineno"> 52</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt class="py-name">a</tt><tt class="py-op">,</tt><tt id="link-18" class="py-name"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-18', 'b', 'link-9');">b</a></tt><tt class="py-op">,</tt><tt class="py-name">c</tt><tt class="py-op">,</tt><tt class="py-name">d</tt><tt class="py-op">,</tt><tt id="link-19" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-19', 's', 'link-13');">s</a></tt><tt class="py-op">)</tt> </tt>
 
118
</div><a name="L53"></a><tt class="py-lineno"> 53</tt>  <tt class="py-line"> </tt>
 
119
<a name="read_file"></a><div id="read_file-def"><a name="L54"></a><tt class="py-lineno"> 54</tt> <a class="py-toggle" href="#" id="read_file-toggle" onclick="return toggle('read_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#read_file">read_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'r'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
120
</div><div id="read_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="read_file-expanded"><a name="L55"></a><tt class="py-lineno"> 55</tt>  <tt class="py-line">    <tt class="py-docstring">"returns content from filename, making sure to close the file explicitly on exit."</tt> </tt>
 
121
<a name="L56"></a><tt class="py-lineno"> 56</tt>  <tt class="py-line">    <tt class="py-name">f</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt> </tt>
 
122
<a name="L57"></a><tt class="py-lineno"> 57</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
123
<a name="L58"></a><tt class="py-lineno"> 58</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-20" class="py-name" targets="Method web2py.gluon.dal.DatabaseStoredFile.read()=web2py.gluon.dal.DatabaseStoredFile-class.html#read,Method web2py.gluon.debug.Pipe.read()=web2py.gluon.debug.Pipe-class.html#read,Method web2py.gluon.languages.lazyT.read()=web2py.gluon.languages.lazyT-class.html#read,Method web2py.gluon.rocket.ChunkedReader.read()=web2py.gluon.rocket.ChunkedReader-class.html#read,Variable web2py.gluon.rocket.Connection.read=web2py.gluon.rocket.Connection-class.html#read,Method web2py.gluon.rocket.LimitingFileWrapper.read()=web2py.gluon.rocket.LimitingFileWrapper-class.html#read,Method web2py.gluon.tools.Crud.read()=web2py.gluon.tools.Crud-class.html#read"><a title="web2py.gluon.dal.DatabaseStoredFile.read
114
124
web2py.gluon.debug.Pipe.read
115
125
web2py.gluon.languages.lazyT.read
116
126
web2py.gluon.rocket.ChunkedReader.read
117
 
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-6', 'read', 'link-6');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
118
 
<a name="L49"></a><tt class="py-lineno"> 49</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
119
 
<a name="L50"></a><tt class="py-lineno"> 50</tt>  <tt class="py-line">        <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-7" class="py-name" targets="Method web2py.gluon.dal.BaseAdapter.close()=web2py.gluon.dal.BaseAdapter-class.html#close,Method web2py.gluon.dal.DatabaseStoredFile.close()=web2py.gluon.dal.DatabaseStoredFile-class.html#close,Method web2py.gluon.dal.NoSQLAdapter.close()=web2py.gluon.dal.NoSQLAdapter-class.html#close,Method web2py.gluon.rocket.Connection.close()=web2py.gluon.rocket.Connection-class.html#close"><a title="web2py.gluon.dal.BaseAdapter.close
 
127
web2py.gluon.rocket.Connection.read
 
128
web2py.gluon.rocket.LimitingFileWrapper.read
 
129
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-20', 'read', 'link-20');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
130
<a name="L59"></a><tt class="py-lineno"> 59</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
 
131
<a name="L60"></a><tt class="py-lineno"> 60</tt>  <tt class="py-line">        <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-21" class="py-name" targets="Method web2py.gluon.dal.BaseAdapter.close()=web2py.gluon.dal.BaseAdapter-class.html#close,Method web2py.gluon.dal.DatabaseStoredFile.close()=web2py.gluon.dal.DatabaseStoredFile-class.html#close,Method web2py.gluon.dal.NoSQLAdapter.close()=web2py.gluon.dal.NoSQLAdapter-class.html#close,Method web2py.gluon.rocket.Connection.close()=web2py.gluon.rocket.Connection-class.html#close,Method web2py.gluon.rocket.FileLikeSocket.close()=web2py.gluon.rocket.FileLikeSocket-class.html#close"><a title="web2py.gluon.dal.BaseAdapter.close
120
132
web2py.gluon.dal.DatabaseStoredFile.close
121
133
web2py.gluon.dal.NoSQLAdapter.close
122
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-7', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
123
 
</div><a name="L51"></a><tt class="py-lineno"> 51</tt>  <tt class="py-line"> </tt>
124
 
<a name="write_file"></a><div id="write_file-def"><a name="L52"></a><tt class="py-lineno"> 52</tt> <a class="py-toggle" href="#" id="write_file-toggle" onclick="return toggle('write_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#write_file">write_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
125
 
</div><div id="write_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="write_file-expanded"><a name="L53"></a><tt class="py-lineno"> 53</tt>  <tt class="py-line">    <tt class="py-docstring">"writes &lt;value&gt; to filename, making sure to close the file explicitly on exit."</tt> </tt>
126
 
<a name="L54"></a><tt class="py-lineno"> 54</tt>  <tt class="py-line">    <tt class="py-name">f</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt> </tt>
127
 
<a name="L55"></a><tt class="py-lineno"> 55</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
128
 
<a name="L56"></a><tt class="py-lineno"> 56</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-8" class="py-name" targets="Method web2py.gluon.dal.DatabaseStoredFile.write()=web2py.gluon.dal.DatabaseStoredFile-class.html#write,Method web2py.gluon.debug.Pipe.write()=web2py.gluon.debug.Pipe-class.html#write,Method web2py.gluon.globals.Response.write()=web2py.gluon.globals.Response-class.html#write,Method web2py.gluon.rocket.WSGIWorker.write()=web2py.gluon.rocket.WSGIWorker-class.html#write,Method web2py.gluon.widget.IO.write()=web2py.gluon.widget.IO-class.html#write"><a title="web2py.gluon.dal.DatabaseStoredFile.write
 
134
web2py.gluon.rocket.Connection.close
 
135
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-21', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
136
</div><a name="L61"></a><tt class="py-lineno"> 61</tt>  <tt class="py-line"> </tt>
 
137
<a name="write_file"></a><div id="write_file-def"><a name="L62"></a><tt class="py-lineno"> 62</tt> <a class="py-toggle" href="#" id="write_file-toggle" onclick="return toggle('write_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#write_file">write_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'w'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
138
</div><div id="write_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="write_file-expanded"><a name="L63"></a><tt class="py-lineno"> 63</tt>  <tt class="py-line">    <tt class="py-docstring">"writes &lt;value&gt; to filename, making sure to close the file explicitly on exit."</tt> </tt>
 
139
<a name="L64"></a><tt class="py-lineno"> 64</tt>  <tt class="py-line">    <tt class="py-name">f</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt> </tt>
 
140
<a name="L65"></a><tt class="py-lineno"> 65</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
141
<a name="L66"></a><tt class="py-lineno"> 66</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-22" class="py-name" targets="Method web2py.gluon.dal.DatabaseStoredFile.write()=web2py.gluon.dal.DatabaseStoredFile-class.html#write,Method web2py.gluon.debug.Pipe.write()=web2py.gluon.debug.Pipe-class.html#write,Method web2py.gluon.globals.Response.write()=web2py.gluon.globals.Response-class.html#write,Variable web2py.gluon.rocket.Connection.write=web2py.gluon.rocket.Connection-class.html#write,Method web2py.gluon.rocket.WSGIWorker.write()=web2py.gluon.rocket.WSGIWorker-class.html#write,Method web2py.gluon.widget.IO.write()=web2py.gluon.widget.IO-class.html#write"><a title="web2py.gluon.dal.DatabaseStoredFile.write
129
142
web2py.gluon.debug.Pipe.write
130
143
web2py.gluon.globals.Response.write
 
144
web2py.gluon.rocket.Connection.write
131
145
web2py.gluon.rocket.WSGIWorker.write
132
 
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-8', 'write', 'link-8');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">value</tt><tt class="py-op">)</tt> </tt>
133
 
<a name="L57"></a><tt class="py-lineno"> 57</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
134
 
<a name="L58"></a><tt class="py-lineno"> 58</tt>  <tt class="py-line">        <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-9" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
146
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-22', 'write', 'link-22');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">value</tt><tt class="py-op">)</tt> </tt>
 
147
<a name="L67"></a><tt class="py-lineno"> 67</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
 
148
<a name="L68"></a><tt class="py-lineno"> 68</tt>  <tt class="py-line">        <tt class="py-name">f</tt><tt class="py-op">.</tt><tt id="link-23" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
135
149
web2py.gluon.dal.DatabaseStoredFile.close
136
150
web2py.gluon.dal.NoSQLAdapter.close
137
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-9', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
138
 
</div><a name="L59"></a><tt class="py-lineno"> 59</tt>  <tt class="py-line"> </tt>
139
 
<a name="readlines_file"></a><div id="readlines_file-def"><a name="L60"></a><tt class="py-lineno"> 60</tt> <a class="py-toggle" href="#" id="readlines_file-toggle" onclick="return toggle('readlines_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#readlines_file">readlines_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'r'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
140
 
</div><div id="readlines_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="readlines_file-expanded"><a name="L61"></a><tt class="py-lineno"> 61</tt>  <tt class="py-line">    <tt class="py-docstring">"applies .split('\n') to the output of read_file()"</tt> </tt>
141
 
<a name="L62"></a><tt class="py-lineno"> 62</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt id="link-10" class="py-name" targets="Function web2py.gluon.fileutils.read_file()=web2py.gluon.fileutils-module.html#read_file"><a title="web2py.gluon.fileutils.read_file" class="py-name" href="#" onclick="return doclink('link-10', 'read_file', 'link-10');">read_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt> </tt>
142
 
</div><a name="L63"></a><tt class="py-lineno"> 63</tt>  <tt class="py-line"> </tt>
143
 
<a name="abspath"></a><div id="abspath-def"><a name="L64"></a><tt class="py-lineno"> 64</tt> <a class="py-toggle" href="#" id="abspath-toggle" onclick="return toggle('abspath');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#abspath">abspath</a><tt class="py-op">(</tt><tt class="py-op">*</tt><tt class="py-param">relpath</tt><tt class="py-op">,</tt> <tt class="py-op">**</tt><tt class="py-param">base</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
144
 
</div><div id="abspath-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="abspath-expanded"><a name="L65"></a><tt class="py-lineno"> 65</tt>  <tt class="py-line">    <tt class="py-docstring">"convert relative path to absolute path based (by default) on applications_parent"</tt> </tt>
145
 
<a name="L66"></a><tt class="py-lineno"> 66</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-11" class="py-name" targets="Function web2py.gluon.html.join()=web2py.gluon.html-module.html#join"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-11', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-op">*</tt><tt class="py-name">relpath</tt><tt class="py-op">)</tt> </tt>
146
 
<a name="L67"></a><tt class="py-lineno"> 67</tt>  <tt class="py-line">    <tt id="link-12" class="py-name" targets="Package web2py.gluon=web2py.gluon-module.html"><a title="web2py.gluon" class="py-name" href="#" onclick="return doclink('link-12', 'gluon', 'link-12');">gluon</a></tt> <tt class="py-op">=</tt> <tt class="py-name">base</tt><tt class="py-op">.</tt><tt id="link-13" class="py-name" targets="Method web2py.gluon.rocket.Headers.get()=web2py.gluon.rocket.Headers-class.html#get"><a title="web2py.gluon.rocket.Headers.get" class="py-name" href="#" onclick="return doclink('link-13', 'get', 'link-13');">get</a></tt><tt class="py-op">(</tt><tt class="py-string">'gluon'</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
147
 
<a name="L68"></a><tt class="py-lineno"> 68</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
148
 
<a name="L69"></a><tt class="py-lineno"> 69</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">path</tt> </tt>
149
 
<a name="L70"></a><tt class="py-lineno"> 70</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-14" class="py-name"><a title="web2py.gluon" class="py-name" href="#" onclick="return doclink('link-14', 'gluon', 'link-12');">gluon</a></tt><tt class="py-op">:</tt> </tt>
150
 
<a name="L71"></a><tt class="py-lineno"> 71</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-15" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-15', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-16" class="py-name"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-16', 'global_settings', 'link-5');">global_settings</a></tt><tt class="py-op">.</tt><tt class="py-name">gluon_parent</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
151
 
<a name="L72"></a><tt class="py-lineno"> 72</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-17" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-17', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-18" class="py-name"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-18', 'global_settings', 'link-5');">global_settings</a></tt><tt class="py-op">.</tt><tt class="py-name">applications_parent</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
151
web2py.gluon.rocket.Connection.close
 
152
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-23', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
153
</div><a name="L69"></a><tt class="py-lineno"> 69</tt>  <tt class="py-line"> </tt>
 
154
<a name="readlines_file"></a><div id="readlines_file-def"><a name="L70"></a><tt class="py-lineno"> 70</tt> <a class="py-toggle" href="#" id="readlines_file-toggle" onclick="return toggle('readlines_file');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#readlines_file">readlines_file</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">mode</tt><tt class="py-op">=</tt><tt class="py-string">'r'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
155
</div><div id="readlines_file-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="readlines_file-expanded"><a name="L71"></a><tt class="py-lineno"> 71</tt>  <tt class="py-line">    <tt class="py-docstring">"applies .split('\n') to the output of read_file()"</tt> </tt>
 
156
<a name="L72"></a><tt class="py-lineno"> 72</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt id="link-24" class="py-name" targets="Function web2py.gluon.fileutils.read_file()=web2py.gluon.fileutils-module.html#read_file"><a title="web2py.gluon.fileutils.read_file" class="py-name" href="#" onclick="return doclink('link-24', 'read_file', 'link-24');">read_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">mode</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">)</tt> </tt>
152
157
</div><a name="L73"></a><tt class="py-lineno"> 73</tt>  <tt class="py-line"> </tt>
153
 
<a name="L74"></a><tt class="py-lineno"> 74</tt>  <tt class="py-line"> </tt>
154
 
<a name="mktree"></a><div id="mktree-def"><a name="L75"></a><tt class="py-lineno"> 75</tt> <a class="py-toggle" href="#" id="mktree-toggle" onclick="return toggle('mktree');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#mktree">mktree</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
155
 
</div><div id="mktree-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="mktree-expanded"><a name="L76"></a><tt class="py-lineno"> 76</tt>  <tt class="py-line">    <tt class="py-name">head</tt><tt class="py-op">,</tt><tt class="py-name">tail</tt> <tt class="py-op">=</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
156
 
<a name="L77"></a><tt class="py-lineno"> 77</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">head</tt><tt class="py-op">:</tt> </tt>
157
 
<a name="L78"></a><tt class="py-lineno"> 78</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">tail</tt><tt class="py-op">:</tt> <tt id="link-19" class="py-name" targets="Function web2py.gluon.fileutils.mktree()=web2py.gluon.fileutils-module.html#mktree"><a title="web2py.gluon.fileutils.mktree" class="py-name" href="#" onclick="return doclink('link-19', 'mktree', 'link-19');">mktree</a></tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt> </tt>
158
 
<a name="L79"></a><tt class="py-lineno"> 79</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-20" class="py-name" targets="Static Method web2py.gluon.dal.DatabaseStoredFile.exists()=web2py.gluon.dal.DatabaseStoredFile-class.html#exists"><a title="web2py.gluon.dal.DatabaseStoredFile.exists" class="py-name" href="#" onclick="return doclink('link-20', 'exists', 'link-20');">exists</a></tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
159
 
<a name="L80"></a><tt class="py-lineno"> 80</tt>  <tt class="py-line">            <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">mkdir</tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt> </tt>
160
 
</div><a name="L81"></a><tt class="py-lineno"> 81</tt>  <tt class="py-line"> </tt>
161
 
<a name="listdir"></a><div id="listdir-def"><a name="L82"></a><tt class="py-lineno"> 82</tt> <a class="py-toggle" href="#" id="listdir-toggle" onclick="return toggle('listdir');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#listdir">listdir</a><tt class="py-op">(</tt> </tt>
162
 
<a name="L83"></a><tt class="py-lineno"> 83</tt>  <tt class="py-line">    <tt class="py-param">path</tt><tt class="py-op">,</tt> </tt>
163
 
<a name="L84"></a><tt class="py-lineno"> 84</tt>  <tt class="py-line">    <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">,</tt> </tt>
164
 
<a name="L85"></a><tt class="py-lineno"> 85</tt>  <tt class="py-line">    <tt class="py-param">drop</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> </tt>
165
 
<a name="L86"></a><tt class="py-lineno"> 86</tt>  <tt class="py-line">    <tt class="py-param">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> </tt>
166
 
<a name="L87"></a><tt class="py-lineno"> 87</tt>  <tt class="py-line">    <tt class="py-param">sort</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> </tt>
167
 
<a name="L88"></a><tt class="py-lineno"> 88</tt>  <tt class="py-line">    <tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
168
 
</div><div id="listdir-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="listdir-expanded"><a name="L89"></a><tt class="py-lineno"> 89</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
169
 
<a name="L90"></a><tt class="py-lineno"> 90</tt>  <tt class="py-line"><tt class="py-docstring">    like os.listdir() but you can specify a regex pattern to filter files.</tt> </tt>
170
 
<a name="L91"></a><tt class="py-lineno"> 91</tt>  <tt class="py-line"><tt class="py-docstring">    if add_dirs is True, the returned items will have the full path.</tt> </tt>
171
 
<a name="L92"></a><tt class="py-lineno"> 92</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
172
 
<a name="L93"></a><tt class="py-lineno"> 93</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">path</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">!=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">sep</tt><tt class="py-op">:</tt> </tt>
173
 
<a name="L94"></a><tt class="py-lineno"> 94</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt> <tt class="py-op">+</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">sep</tt> </tt>
174
 
<a name="L95"></a><tt class="py-lineno"> 95</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-21" class="py-name" targets="Method web2py.gluon.dal.BaseAdapter.drop()=web2py.gluon.dal.BaseAdapter-class.html#drop,Method web2py.gluon.dal.NoSQLAdapter.drop()=web2py.gluon.dal.NoSQLAdapter-class.html#drop,Method web2py.gluon.dal.Table.drop()=web2py.gluon.dal.Table-class.html#drop"><a title="web2py.gluon.dal.BaseAdapter.drop
 
158
<a name="abspath"></a><div id="abspath-def"><a name="L74"></a><tt class="py-lineno"> 74</tt> <a class="py-toggle" href="#" id="abspath-toggle" onclick="return toggle('abspath');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#abspath">abspath</a><tt class="py-op">(</tt><tt class="py-op">*</tt><tt class="py-param">relpath</tt><tt class="py-op">,</tt> <tt class="py-op">**</tt><tt class="py-param">base</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
159
</div><div id="abspath-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="abspath-expanded"><a name="L75"></a><tt class="py-lineno"> 75</tt>  <tt class="py-line">    <tt class="py-docstring">"convert relative path to absolute path based (by default) on applications_parent"</tt> </tt>
 
160
<a name="L76"></a><tt class="py-lineno"> 76</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-25" class="py-name" targets="Function web2py.gluon.html.join()=web2py.gluon.html-module.html#join,Method web2py.gluon.rocket.Listener.join()=web2py.gluon.rocket.Listener-class.html#join"><a title="web2py.gluon.html.join
 
161
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-25', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-op">*</tt><tt class="py-name">relpath</tt><tt class="py-op">)</tt> </tt>
 
162
<a name="L77"></a><tt class="py-lineno"> 77</tt>  <tt class="py-line">    <tt id="link-26" class="py-name" targets="Package web2py.gluon=web2py.gluon-module.html"><a title="web2py.gluon" class="py-name" href="#" onclick="return doclink('link-26', 'gluon', 'link-26');">gluon</a></tt> <tt class="py-op">=</tt> <tt class="py-name">base</tt><tt class="py-op">.</tt><tt id="link-27" class="py-name" targets="Method web2py.gluon.dal.Reference.get()=web2py.gluon.dal.Reference-class.html#get"><a title="web2py.gluon.dal.Reference.get" class="py-name" href="#" onclick="return doclink('link-27', 'get', 'link-27');">get</a></tt><tt class="py-op">(</tt><tt class="py-string">'gluon'</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
 
163
<a name="L78"></a><tt class="py-lineno"> 78</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isabs</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
164
<a name="L79"></a><tt class="py-lineno"> 79</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">path</tt> </tt>
 
165
<a name="L80"></a><tt class="py-lineno"> 80</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-28" class="py-name"><a title="web2py.gluon" class="py-name" href="#" onclick="return doclink('link-28', 'gluon', 'link-26');">gluon</a></tt><tt class="py-op">:</tt> </tt>
 
166
<a name="L81"></a><tt class="py-lineno"> 81</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-29" class="py-name"><a title="web2py.gluon.html.join
 
167
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-29', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt id="link-30" class="py-name"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-30', 'global_settings', 'link-6');">global_settings</a></tt><tt class="py-op">.</tt><tt class="py-name">gluon_parent</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
168
<a name="L82"></a><tt class="py-lineno"> 82</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-31" class="py-name"><a title="web2py.gluon.html.join
 
169
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-31', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt id="link-32" class="py-name"><a title="web2py.gluon.settings.global_settings" class="py-name" href="#" onclick="return doclink('link-32', 'global_settings', 'link-6');">global_settings</a></tt><tt class="py-op">.</tt><tt class="py-name">applications_parent</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
170
</div><a name="L83"></a><tt class="py-lineno"> 83</tt>  <tt class="py-line"> </tt>
 
171
<a name="L84"></a><tt class="py-lineno"> 84</tt>  <tt class="py-line"> </tt>
 
172
<a name="mktree"></a><div id="mktree-def"><a name="L85"></a><tt class="py-lineno"> 85</tt> <a class="py-toggle" href="#" id="mktree-toggle" onclick="return toggle('mktree');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#mktree">mktree</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
173
</div><div id="mktree-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="mktree-expanded"><a name="L86"></a><tt class="py-lineno"> 86</tt>  <tt class="py-line">    <tt class="py-name">head</tt><tt class="py-op">,</tt><tt class="py-name">tail</tt> <tt class="py-op">=</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
174
<a name="L87"></a><tt class="py-lineno"> 87</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">head</tt><tt class="py-op">:</tt> </tt>
 
175
<a name="L88"></a><tt class="py-lineno"> 88</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">tail</tt><tt class="py-op">:</tt> <tt id="link-33" class="py-name" targets="Function web2py.gluon.fileutils.mktree()=web2py.gluon.fileutils-module.html#mktree"><a title="web2py.gluon.fileutils.mktree" class="py-name" href="#" onclick="return doclink('link-33', 'mktree', 'link-33');">mktree</a></tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt> </tt>
 
176
<a name="L89"></a><tt class="py-lineno"> 89</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-34" class="py-name" targets="Static Method web2py.gluon.dal.DatabaseStoredFile.exists()=web2py.gluon.dal.DatabaseStoredFile-class.html#exists"><a title="web2py.gluon.dal.DatabaseStoredFile.exists" class="py-name" href="#" onclick="return doclink('link-34', 'exists', 'link-34');">exists</a></tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
177
<a name="L90"></a><tt class="py-lineno"> 90</tt>  <tt class="py-line">            <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">mkdir</tt><tt class="py-op">(</tt><tt class="py-name">head</tt><tt class="py-op">)</tt> </tt>
 
178
</div><a name="L91"></a><tt class="py-lineno"> 91</tt>  <tt class="py-line"> </tt>
 
179
<a name="listdir"></a><div id="listdir-def"><a name="L92"></a><tt class="py-lineno"> 92</tt> <a class="py-toggle" href="#" id="listdir-toggle" onclick="return toggle('listdir');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#listdir">listdir</a><tt class="py-op">(</tt> </tt>
 
180
<a name="L93"></a><tt class="py-lineno"> 93</tt>  <tt class="py-line">    <tt class="py-param">path</tt><tt class="py-op">,</tt> </tt>
 
181
<a name="L94"></a><tt class="py-lineno"> 94</tt>  <tt class="py-line">    <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">,</tt> </tt>
 
182
<a name="L95"></a><tt class="py-lineno"> 95</tt>  <tt class="py-line">    <tt class="py-param">drop</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> </tt>
 
183
<a name="L96"></a><tt class="py-lineno"> 96</tt>  <tt class="py-line">    <tt class="py-param">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">,</tt> </tt>
 
184
<a name="L97"></a><tt class="py-lineno"> 97</tt>  <tt class="py-line">    <tt class="py-param">sort</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">,</tt> </tt>
 
185
<a name="L98"></a><tt class="py-lineno"> 98</tt>  <tt class="py-line">    <tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
186
</div><div id="listdir-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="listdir-expanded"><a name="L99"></a><tt class="py-lineno"> 99</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
187
<a name="L100"></a><tt class="py-lineno">100</tt>  <tt class="py-line"><tt class="py-docstring">    like os.listdir() but you can specify a regex pattern to filter files.</tt> </tt>
 
188
<a name="L101"></a><tt class="py-lineno">101</tt>  <tt class="py-line"><tt class="py-docstring">    if add_dirs is True, the returned items will have the full path.</tt> </tt>
 
189
<a name="L102"></a><tt class="py-lineno">102</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
190
<a name="L103"></a><tt class="py-lineno">103</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">path</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">!=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">sep</tt><tt class="py-op">:</tt> </tt>
 
191
<a name="L104"></a><tt class="py-lineno">104</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt> <tt class="py-op">+</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">sep</tt> </tt>
 
192
<a name="L105"></a><tt class="py-lineno">105</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-35" class="py-name" targets="Method web2py.gluon.dal.BaseAdapter.drop()=web2py.gluon.dal.BaseAdapter-class.html#drop,Method web2py.gluon.dal.NoSQLAdapter.drop()=web2py.gluon.dal.NoSQLAdapter-class.html#drop,Method web2py.gluon.dal.Table.drop()=web2py.gluon.dal.Table-class.html#drop"><a title="web2py.gluon.dal.BaseAdapter.drop
175
193
web2py.gluon.dal.NoSQLAdapter.drop
176
 
web2py.gluon.dal.Table.drop" class="py-name" href="#" onclick="return doclink('link-21', 'drop', 'link-21');">drop</a></tt><tt class="py-op">:</tt> </tt>
177
 
<a name="L96"></a><tt class="py-lineno"> 96</tt>  <tt class="py-line">        <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt id="link-22" class="py-name" targets="Method web2py.gluon.dal.Expression.len()=web2py.gluon.dal.Expression-class.html#len"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-22', 'len', 'link-22');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
178
 
<a name="L97"></a><tt class="py-lineno"> 97</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
179
 
<a name="L98"></a><tt class="py-lineno"> 98</tt>  <tt class="py-line">        <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
180
 
<a name="L99"></a><tt class="py-lineno"> 99</tt>  <tt class="py-line">    <tt id="link-23" class="py-name" targets="Variable web2py.gluon.validators.IS_EMAIL.regex=web2py.gluon.validators.IS_EMAIL-class.html#regex,Variable web2py.gluon.validators.IS_IPV4.regex=web2py.gluon.validators.IS_IPV4-class.html#regex"><a title="web2py.gluon.validators.IS_EMAIL.regex
181
 
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-23', 'regex', 'link-23');">regex</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">expression</tt><tt class="py-op">)</tt> </tt>
182
 
<a name="L100"></a><tt class="py-lineno">100</tt>  <tt class="py-line">    <tt id="link-24" class="py-name" targets="Method web2py.gluon.rocket.Headers.items()=web2py.gluon.rocket.Headers-class.html#items"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-24', 'items', 'link-24');">items</a></tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
183
 
<a name="L101"></a><tt class="py-lineno">101</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-op">(</tt><tt id="link-25" class="py-name" targets="Variable web2py.gluon.import_all.root=web2py.gluon.import_all-module.html#root"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-25', 'root', 'link-25');">root</a></tt><tt class="py-op">,</tt> <tt id="link-26" class="py-name" targets="Variable web2py.gluon.import_all.dirs=web2py.gluon.import_all-module.html#dirs"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-26', 'dirs', 'link-26');">dirs</a></tt><tt class="py-op">,</tt> <tt id="link-27" class="py-name" targets="Variable web2py.gluon.import_all.files=web2py.gluon.import_all-module.html#files"><a title="web2py.gluon.import_all.files" class="py-name" href="#" onclick="return doclink('link-27', 'files', 'link-27');">files</a></tt><tt class="py-op">)</tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">walk</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">topdown</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
184
 
<a name="L102"></a><tt class="py-lineno">102</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">dir</tt> <tt class="py-keyword">in</tt> <tt id="link-28" class="py-name"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-28', 'dirs', 'link-26');">dirs</a></tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
185
 
<a name="L103"></a><tt class="py-lineno">103</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">dir</tt><tt class="py-op">.</tt><tt id="link-29" class="py-name" targets="Method web2py.gluon.dal.Expression.startswith()=web2py.gluon.dal.Expression-class.html#startswith,Method web2py.gluon.dal.SQLCustomType.startswith()=web2py.gluon.dal.SQLCustomType-class.html#startswith"><a title="web2py.gluon.dal.Expression.startswith
186
 
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-29', 'startswith', 'link-29');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
187
 
<a name="L104"></a><tt class="py-lineno">104</tt>  <tt class="py-line">                <tt id="link-30" class="py-name"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-30', 'dirs', 'link-26');">dirs</a></tt><tt class="py-op">.</tt><tt class="py-name">remove</tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">)</tt> </tt>
188
 
<a name="L105"></a><tt class="py-lineno">105</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">:</tt> </tt>
189
 
<a name="L106"></a><tt class="py-lineno">106</tt>  <tt class="py-line">            <tt id="link-31" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-31', 'items', 'link-24');">items</a></tt><tt class="py-op">.</tt><tt id="link-32" class="py-name" targets="Method web2py.gluon.html.DIV.append()=web2py.gluon.html.DIV-class.html#append,Method web2py.gluon.template.BlockNode.append()=web2py.gluon.template.BlockNode-class.html#append,Method web2py.gluon.template.Content.append()=web2py.gluon.template.Content-class.html#append"><a title="web2py.gluon.html.DIV.append
190
 
web2py.gluon.template.BlockNode.append
191
 
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-32', 'append', 'link-32');">append</a></tt><tt class="py-op">(</tt><tt id="link-33" class="py-name"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-33', 'root', 'link-25');">root</a></tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
192
 
<a name="L107"></a><tt class="py-lineno">107</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt class="py-name">sorted</tt><tt class="py-op">(</tt><tt id="link-34" class="py-name"><a title="web2py.gluon.import_all.files" class="py-name" href="#" onclick="return doclink('link-34', 'files', 'link-27');">files</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
193
 
<a name="L108"></a><tt class="py-lineno">108</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt id="link-35" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
194
 
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-35', 'regex', 'link-23');">regex</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">file</tt><tt class="py-op">.</tt><tt id="link-36" class="py-name"><a title="web2py.gluon.dal.Expression.startswith
195
 
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-36', 'startswith', 'link-29');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
196
 
<a name="L109"></a><tt class="py-lineno">109</tt>  <tt class="py-line">                <tt id="link-37" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-37', 'items', 'link-24');">items</a></tt><tt class="py-op">.</tt><tt id="link-38" class="py-name"><a title="web2py.gluon.html.DIV.append
197
 
web2py.gluon.template.BlockNode.append
198
 
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-38', 'append', 'link-32');">append</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-39" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-39', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-40" class="py-name"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-40', 'root', 'link-25');">root</a></tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
199
 
<a name="L110"></a><tt class="py-lineno">110</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-41" class="py-name" targets="Method web2py.gluon.dal.Rows.sort()=web2py.gluon.dal.Rows-class.html#sort"><a title="web2py.gluon.dal.Rows.sort" class="py-name" href="#" onclick="return doclink('link-41', 'sort', 'link-41');">sort</a></tt><tt class="py-op">:</tt> </tt>
200
 
<a name="L111"></a><tt class="py-lineno">111</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">sorted</tt><tt class="py-op">(</tt><tt id="link-42" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-42', 'items', 'link-24');">items</a></tt><tt class="py-op">)</tt> </tt>
201
 
<a name="L112"></a><tt class="py-lineno">112</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
202
 
<a name="L113"></a><tt class="py-lineno">113</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt id="link-43" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-43', 'items', 'link-24');">items</a></tt> </tt>
203
 
</div><a name="L114"></a><tt class="py-lineno">114</tt>  <tt class="py-line"> </tt>
204
 
<a name="L115"></a><tt class="py-lineno">115</tt>  <tt class="py-line"> </tt>
205
 
<a name="recursive_unlink"></a><div id="recursive_unlink-def"><a name="L116"></a><tt class="py-lineno">116</tt> <a class="py-toggle" href="#" id="recursive_unlink-toggle" onclick="return toggle('recursive_unlink');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#recursive_unlink">recursive_unlink</a><tt class="py-op">(</tt><tt class="py-param">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
206
 
</div><div id="recursive_unlink-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="recursive_unlink-expanded"><a name="L117"></a><tt class="py-lineno">117</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
207
 
<a name="L118"></a><tt class="py-lineno">118</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt id="link-44" class="py-name" targets="Variable web2py.gluon.languages.lazyT.s=web2py.gluon.languages.lazyT-class.html#s"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-44', 's', 'link-44');">s</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt id="link-45" class="py-name" targets="Function web2py.gluon.fileutils.listdir()=web2py.gluon.fileutils-module.html#listdir"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-45', 'listdir', 'link-45');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
208
 
<a name="L119"></a><tt class="py-lineno">119</tt>  <tt class="py-line">            <tt id="link-46" class="py-name" targets="Function web2py.gluon.fileutils.recursive_unlink()=web2py.gluon.fileutils-module.html#recursive_unlink"><a title="web2py.gluon.fileutils.recursive_unlink" class="py-name" href="#" onclick="return doclink('link-46', 'recursive_unlink', 'link-46');">recursive_unlink</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-47" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-47', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">,</tt><tt id="link-48" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-48', 's', 'link-44');">s</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
209
 
<a name="L120"></a><tt class="py-lineno">120</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">rmdir</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt> </tt>
210
 
<a name="L121"></a><tt class="py-lineno">121</tt>  <tt class="py-line">    <tt class="py-keyword">elif</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isfile</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
211
 
<a name="L122"></a><tt class="py-lineno">122</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt> </tt>
212
 
</div><a name="L123"></a><tt class="py-lineno">123</tt>  <tt class="py-line"> </tt>
213
 
<a name="L124"></a><tt class="py-lineno">124</tt>  <tt class="py-line"> </tt>
214
 
<a name="cleanpath"></a><div id="cleanpath-def"><a name="L125"></a><tt class="py-lineno">125</tt> <a class="py-toggle" href="#" id="cleanpath-toggle" onclick="return toggle('cleanpath');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#cleanpath">cleanpath</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
215
 
</div><div id="cleanpath-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="cleanpath-expanded"><a name="L126"></a><tt class="py-lineno">126</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
216
 
<a name="L127"></a><tt class="py-lineno">127</tt>  <tt class="py-line"><tt class="py-docstring">    turns any expression/path into a valid filename. replaces / with _ and</tt> </tt>
217
 
<a name="L128"></a><tt class="py-lineno">128</tt>  <tt class="py-line"><tt class="py-docstring">    removes special characters.</tt> </tt>
218
 
<a name="L129"></a><tt class="py-lineno">129</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
219
 
<a name="L130"></a><tt class="py-lineno">130</tt>  <tt class="py-line"> </tt>
220
 
<a name="L131"></a><tt class="py-lineno">131</tt>  <tt class="py-line">    <tt id="link-49" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-49', 'items', 'link-24');">items</a></tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt> </tt>
221
 
<a name="L132"></a><tt class="py-lineno">132</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-50" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-50', 'len', 'link-22');">len</a></tt><tt class="py-op">(</tt><tt id="link-51" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-51', 'items', 'link-24');">items</a></tt><tt class="py-op">)</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
222
 
<a name="L133"></a><tt class="py-lineno">133</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'[^\w\.]+'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">.</tt><tt id="link-52" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-52', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-53" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-53', 'items', 'link-24');">items</a></tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> </tt>
223
 
<a name="L134"></a><tt class="py-lineno">134</tt>  <tt class="py-line">                       <tt class="py-op">+</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt id="link-54" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-54', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-55" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-55', 'items', 'link-24');">items</a></tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
224
 
<a name="L135"></a><tt class="py-lineno">135</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
225
 
<a name="L136"></a><tt class="py-lineno">136</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'[^\w\.]+'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt id="link-56" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-56', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt id="link-57" class="py-name"><a title="web2py.gluon.rocket.Headers.items" class="py-name" href="#" onclick="return doclink('link-57', 'items', 'link-24');">items</a></tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
226
 
<a name="L137"></a><tt class="py-lineno">137</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">path</tt> </tt>
227
 
</div><a name="L138"></a><tt class="py-lineno">138</tt>  <tt class="py-line"> </tt>
228
 
<a name="L139"></a><tt class="py-lineno">139</tt>  <tt class="py-line"> </tt>
229
 
<a name="_extractall"></a><div id="_extractall-def"><a name="L140"></a><tt class="py-lineno">140</tt> <a class="py-toggle" href="#" id="_extractall-toggle" onclick="return toggle('_extractall');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#_extractall">_extractall</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">=</tt><tt class="py-string">'.'</tt><tt class="py-op">,</tt> <tt class="py-param">members</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
230
 
</div><div id="_extractall-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_extractall-expanded"><a name="L141"></a><tt class="py-lineno">141</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">hasattr</tt><tt class="py-op">(</tt><tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">,</tt> <tt class="py-string">'extractall'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
231
 
<a name="L142"></a><tt class="py-lineno">142</tt>  <tt class="py-line">        <tt class="py-keyword">from</tt> <tt class="py-name">tarfile</tt> <tt class="py-keyword">import</tt> <tt class="py-name">ExtractError</tt> </tt>
232
 
<a name="L143"></a><tt class="py-lineno">143</tt>  <tt class="py-line"> </tt>
233
 
<a name="L144"></a><tt class="py-lineno">144</tt>  <tt class="py-line">        <tt class="py-keyword">class</tt> <tt class="py-def-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-base-class">tarfile</tt><tt class="py-op">.</tt><tt class="py-base-class">TarFile</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
234
 
<a name="L145"></a><tt class="py-lineno">145</tt>  <tt class="py-line"> </tt>
235
 
<a name="L146"></a><tt class="py-lineno">146</tt>  <tt class="py-line">            <tt class="py-keyword">def</tt> <tt class="py-def-name">extractall</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">=</tt><tt class="py-string">'.'</tt><tt class="py-op">,</tt> <tt class="py-param">members</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
236
 
<a name="L147"></a><tt class="py-lineno">147</tt>  <tt class="py-line">                <tt class="py-docstring">"""Extract all members from the archive to the current working</tt> </tt>
237
 
<a name="L148"></a><tt class="py-lineno">148</tt>  <tt class="py-line"><tt class="py-docstring">             directory and set owner, modification time and permissions on</tt> </tt>
238
 
<a name="L149"></a><tt class="py-lineno">149</tt>  <tt class="py-line"><tt class="py-docstring">             directories afterwards. `path' specifies a different directory</tt> </tt>
239
 
<a name="L150"></a><tt class="py-lineno">150</tt>  <tt class="py-line"><tt class="py-docstring">             to extract to. `members' is optional and must be a subset of the</tt> </tt>
240
 
<a name="L151"></a><tt class="py-lineno">151</tt>  <tt class="py-line"><tt class="py-docstring">             list returned by getmembers().</tt> </tt>
241
 
<a name="L152"></a><tt class="py-lineno">152</tt>  <tt class="py-line"><tt class="py-docstring">                """</tt> </tt>
 
194
web2py.gluon.dal.Table.drop" class="py-name" href="#" onclick="return doclink('link-35', 'drop', 'link-35');">drop</a></tt><tt class="py-op">:</tt> </tt>
 
195
<a name="L106"></a><tt class="py-lineno">106</tt>  <tt class="py-line">        <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt id="link-36" class="py-name" targets="Method web2py.gluon.dal.Expression.len()=web2py.gluon.dal.Expression-class.html#len"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-36', 'len', 'link-36');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
196
<a name="L107"></a><tt class="py-lineno">107</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
197
<a name="L108"></a><tt class="py-lineno">108</tt>  <tt class="py-line">        <tt class="py-name">n</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
 
198
<a name="L109"></a><tt class="py-lineno">109</tt>  <tt class="py-line">    <tt id="link-37" class="py-name" targets="Variable web2py.gluon.validators.IS_EMAIL.regex=web2py.gluon.validators.IS_EMAIL-class.html#regex,Variable web2py.gluon.validators.IS_IPV4.regex=web2py.gluon.validators.IS_IPV4-class.html#regex"><a title="web2py.gluon.validators.IS_EMAIL.regex
 
199
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-37', 'regex', 'link-37');">regex</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">expression</tt><tt class="py-op">)</tt> </tt>
 
200
<a name="L110"></a><tt class="py-lineno">110</tt>  <tt class="py-line">    <tt class="py-name">items</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
 
201
<a name="L111"></a><tt class="py-lineno">111</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-op">(</tt><tt id="link-38" class="py-name" targets="Variable web2py.gluon.import_all.root=web2py.gluon.import_all-module.html#root"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-38', 'root', 'link-38');">root</a></tt><tt class="py-op">,</tt> <tt id="link-39" class="py-name" targets="Variable web2py.gluon.import_all.dirs=web2py.gluon.import_all-module.html#dirs"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-39', 'dirs', 'link-39');">dirs</a></tt><tt class="py-op">,</tt> <tt id="link-40" class="py-name" targets="Variable web2py.gluon.import_all.files=web2py.gluon.import_all-module.html#files"><a title="web2py.gluon.import_all.files" class="py-name" href="#" onclick="return doclink('link-40', 'files', 'link-40');">files</a></tt><tt class="py-op">)</tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">walk</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">topdown</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
202
<a name="L112"></a><tt class="py-lineno">112</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">dir</tt> <tt class="py-keyword">in</tt> <tt id="link-41" class="py-name"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-41', 'dirs', 'link-39');">dirs</a></tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
 
203
<a name="L113"></a><tt class="py-lineno">113</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">dir</tt><tt class="py-op">.</tt><tt id="link-42" class="py-name" targets="Method web2py.gluon.dal.Expression.startswith()=web2py.gluon.dal.Expression-class.html#startswith,Method web2py.gluon.dal.SQLCustomType.startswith()=web2py.gluon.dal.SQLCustomType-class.html#startswith"><a title="web2py.gluon.dal.Expression.startswith
 
204
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-42', 'startswith', 'link-42');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
205
<a name="L114"></a><tt class="py-lineno">114</tt>  <tt class="py-line">                <tt id="link-43" class="py-name"><a title="web2py.gluon.import_all.dirs" class="py-name" href="#" onclick="return doclink('link-43', 'dirs', 'link-39');">dirs</a></tt><tt class="py-op">.</tt><tt class="py-name">remove</tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">)</tt> </tt>
 
206
<a name="L115"></a><tt class="py-lineno">115</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">:</tt> </tt>
 
207
<a name="L116"></a><tt class="py-lineno">116</tt>  <tt class="py-line">            <tt class="py-name">items</tt><tt class="py-op">.</tt><tt id="link-44" class="py-name" targets="Method web2py.gluon.html.DIV.append()=web2py.gluon.html.DIV-class.html#append,Method web2py.gluon.template.BlockNode.append()=web2py.gluon.template.BlockNode-class.html#append,Method web2py.gluon.template.Content.append()=web2py.gluon.template.Content-class.html#append"><a title="web2py.gluon.html.DIV.append
 
208
web2py.gluon.template.BlockNode.append
 
209
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-44', 'append', 'link-44');">append</a></tt><tt class="py-op">(</tt><tt id="link-45" class="py-name"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-45', 'root', 'link-38');">root</a></tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
 
210
<a name="L117"></a><tt class="py-lineno">117</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt class="py-name">sorted</tt><tt class="py-op">(</tt><tt id="link-46" class="py-name"><a title="web2py.gluon.import_all.files" class="py-name" href="#" onclick="return doclink('link-46', 'files', 'link-40');">files</a></tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
211
<a name="L118"></a><tt class="py-lineno">118</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt id="link-47" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
 
212
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-47', 'regex', 'link-37');">regex</a></tt><tt class="py-op">.</tt><tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">file</tt><tt class="py-op">.</tt><tt id="link-48" class="py-name"><a title="web2py.gluon.dal.Expression.startswith
 
213
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-48', 'startswith', 'link-42');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
214
<a name="L119"></a><tt class="py-lineno">119</tt>  <tt class="py-line">                <tt class="py-name">items</tt><tt class="py-op">.</tt><tt id="link-49" class="py-name"><a title="web2py.gluon.html.DIV.append
 
215
web2py.gluon.template.BlockNode.append
 
216
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-49', 'append', 'link-44');">append</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-50" class="py-name"><a title="web2py.gluon.html.join
 
217
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-50', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt id="link-51" class="py-name"><a title="web2py.gluon.import_all.root" class="py-name" href="#" onclick="return doclink('link-51', 'root', 'link-38');">root</a></tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-name">n</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
 
218
<a name="L120"></a><tt class="py-lineno">120</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-52" class="py-name" targets="Method web2py.gluon.dal.Rows.sort()=web2py.gluon.dal.Rows-class.html#sort"><a title="web2py.gluon.dal.Rows.sort" class="py-name" href="#" onclick="return doclink('link-52', 'sort', 'link-52');">sort</a></tt><tt class="py-op">:</tt> </tt>
 
219
<a name="L121"></a><tt class="py-lineno">121</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">sorted</tt><tt class="py-op">(</tt><tt class="py-name">items</tt><tt class="py-op">)</tt> </tt>
 
220
<a name="L122"></a><tt class="py-lineno">122</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
221
<a name="L123"></a><tt class="py-lineno">123</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">items</tt> </tt>
 
222
</div><a name="L124"></a><tt class="py-lineno">124</tt>  <tt class="py-line"> </tt>
 
223
<a name="L125"></a><tt class="py-lineno">125</tt>  <tt class="py-line"> </tt>
 
224
<a name="recursive_unlink"></a><div id="recursive_unlink-def"><a name="L126"></a><tt class="py-lineno">126</tt> <a class="py-toggle" href="#" id="recursive_unlink-toggle" onclick="return toggle('recursive_unlink');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#recursive_unlink">recursive_unlink</a><tt class="py-op">(</tt><tt class="py-param">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
225
</div><div id="recursive_unlink-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="recursive_unlink-expanded"><a name="L127"></a><tt class="py-lineno">127</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
226
<a name="L128"></a><tt class="py-lineno">128</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt id="link-53" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-53', 's', 'link-13');">s</a></tt> <tt class="py-keyword">in</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt id="link-54" class="py-name" targets="Function web2py.gluon.fileutils.listdir()=web2py.gluon.fileutils-module.html#listdir"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-54', 'listdir', 'link-54');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
227
<a name="L129"></a><tt class="py-lineno">129</tt>  <tt class="py-line">            <tt id="link-55" class="py-name" targets="Function web2py.gluon.fileutils.recursive_unlink()=web2py.gluon.fileutils-module.html#recursive_unlink"><a title="web2py.gluon.fileutils.recursive_unlink" class="py-name" href="#" onclick="return doclink('link-55', 'recursive_unlink', 'link-55');">recursive_unlink</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-56" class="py-name"><a title="web2py.gluon.html.join
 
228
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-56', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">,</tt><tt id="link-57" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-57', 's', 'link-13');">s</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
229
<a name="L130"></a><tt class="py-lineno">130</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">rmdir</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt> </tt>
 
230
<a name="L131"></a><tt class="py-lineno">131</tt>  <tt class="py-line">    <tt class="py-keyword">elif</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isfile</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
231
<a name="L132"></a><tt class="py-lineno">132</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">f</tt><tt class="py-op">)</tt> </tt>
 
232
</div><a name="L133"></a><tt class="py-lineno">133</tt>  <tt class="py-line"> </tt>
 
233
<a name="L134"></a><tt class="py-lineno">134</tt>  <tt class="py-line"> </tt>
 
234
<a name="cleanpath"></a><div id="cleanpath-def"><a name="L135"></a><tt class="py-lineno">135</tt> <a class="py-toggle" href="#" id="cleanpath-toggle" onclick="return toggle('cleanpath');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#cleanpath">cleanpath</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
235
</div><div id="cleanpath-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="cleanpath-expanded"><a name="L136"></a><tt class="py-lineno">136</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
236
<a name="L137"></a><tt class="py-lineno">137</tt>  <tt class="py-line"><tt class="py-docstring">    turns any expression/path into a valid filename. replaces / with _ and</tt> </tt>
 
237
<a name="L138"></a><tt class="py-lineno">138</tt>  <tt class="py-line"><tt class="py-docstring">    removes special characters.</tt> </tt>
 
238
<a name="L139"></a><tt class="py-lineno">139</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
239
<a name="L140"></a><tt class="py-lineno">140</tt>  <tt class="py-line"> </tt>
 
240
<a name="L141"></a><tt class="py-lineno">141</tt>  <tt class="py-line">    <tt class="py-name">items</tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">split</tt><tt class="py-op">(</tt><tt class="py-string">'.'</tt><tt class="py-op">)</tt> </tt>
 
241
<a name="L142"></a><tt class="py-lineno">142</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt id="link-58" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-58', 'len', 'link-36');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">items</tt><tt class="py-op">)</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
 
242
<a name="L143"></a><tt class="py-lineno">143</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'[^\w\.]+'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">.</tt><tt id="link-59" class="py-name"><a title="web2py.gluon.html.join
 
243
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-59', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">items</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'.'</tt> </tt>
 
244
<a name="L144"></a><tt class="py-lineno">144</tt>  <tt class="py-line">                       <tt class="py-op">+</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt id="link-60" class="py-name"><a title="web2py.gluon.html.join
 
245
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-60', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">items</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
246
<a name="L145"></a><tt class="py-lineno">145</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
247
<a name="L146"></a><tt class="py-lineno">146</tt>  <tt class="py-line">        <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'[^\w\.]+'</tt><tt class="py-op">,</tt> <tt class="py-string">'_'</tt><tt class="py-op">,</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt id="link-61" class="py-name"><a title="web2py.gluon.html.join
 
248
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-61', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">items</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
249
<a name="L147"></a><tt class="py-lineno">147</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">path</tt> </tt>
 
250
</div><a name="L148"></a><tt class="py-lineno">148</tt>  <tt class="py-line"> </tt>
 
251
<a name="L149"></a><tt class="py-lineno">149</tt>  <tt class="py-line"> </tt>
 
252
<a name="_extractall"></a><div id="_extractall-def"><a name="L150"></a><tt class="py-lineno">150</tt> <a class="py-toggle" href="#" id="_extractall-toggle" onclick="return toggle('_extractall');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#_extractall">_extractall</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">=</tt><tt class="py-string">'.'</tt><tt class="py-op">,</tt> <tt class="py-param">members</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
253
</div><div id="_extractall-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_extractall-expanded"><a name="L151"></a><tt class="py-lineno">151</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">hasattr</tt><tt class="py-op">(</tt><tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">,</tt> <tt class="py-string">'extractall'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
254
<a name="L152"></a><tt class="py-lineno">152</tt>  <tt class="py-line">        <tt class="py-keyword">from</tt> <tt class="py-name">tarfile</tt> <tt class="py-keyword">import</tt> <tt class="py-name">ExtractError</tt> </tt>
242
255
<a name="L153"></a><tt class="py-lineno">153</tt>  <tt class="py-line"> </tt>
243
 
<a name="L154"></a><tt class="py-lineno">154</tt>  <tt class="py-line">                <tt class="py-name">directories</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
244
 
<a name="L155"></a><tt class="py-lineno">155</tt>  <tt class="py-line">                <tt class="py-keyword">if</tt> <tt class="py-name">members</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
245
 
<a name="L156"></a><tt class="py-lineno">156</tt>  <tt class="py-line">                    <tt class="py-name">members</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt> </tt>
246
 
<a name="L157"></a><tt class="py-lineno">157</tt>  <tt class="py-line">                <tt class="py-keyword">for</tt> <tt class="py-name">tarinfo</tt> <tt class="py-keyword">in</tt> <tt class="py-name">members</tt><tt class="py-op">:</tt> </tt>
247
 
<a name="L158"></a><tt class="py-lineno">158</tt>  <tt class="py-line">                    <tt class="py-keyword">if</tt> <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
248
 
<a name="L159"></a><tt class="py-lineno">159</tt>  <tt class="py-line"> </tt>
249
 
<a name="L160"></a><tt class="py-lineno">160</tt>  <tt class="py-line">                        <tt class="py-comment"># Extract directory with a safe mode, so that</tt> </tt>
250
 
<a name="L161"></a><tt class="py-lineno">161</tt>  <tt class="py-line"><tt class="py-comment"></tt>                        <tt class="py-comment"># all files below can be extracted as well.</tt> </tt>
251
 
<a name="L162"></a><tt class="py-lineno">162</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
252
 
<a name="L163"></a><tt class="py-lineno">163</tt>  <tt class="py-line">                        <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
253
 
<a name="L164"></a><tt class="py-lineno">164</tt>  <tt class="py-line">                            <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">makedirs</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-58" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-58', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> </tt>
254
 
<a name="L165"></a><tt class="py-lineno">165</tt>  <tt class="py-line">                                    <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt id="link-59" class="py-name" targets="Variable web2py.gluon.import_all.name=web2py.gluon.import_all-module.html#name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-59', 'name', 'link-59');">name</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-number">0777</tt><tt class="py-op">)</tt> </tt>
255
 
<a name="L166"></a><tt class="py-lineno">166</tt>  <tt class="py-line">                        <tt class="py-keyword">except</tt> <tt class="py-name">EnvironmentError</tt><tt class="py-op">:</tt> </tt>
256
 
<a name="L167"></a><tt class="py-lineno">167</tt>  <tt class="py-line">                            <tt class="py-keyword">pass</tt> </tt>
257
 
<a name="L168"></a><tt class="py-lineno">168</tt>  <tt class="py-line">                        <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt id="link-60" class="py-name"><a title="web2py.gluon.html.DIV.append
 
256
<a name="L154"></a><tt class="py-lineno">154</tt>  <tt class="py-line">        <tt class="py-keyword">class</tt> <tt class="py-def-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-base-class">tarfile</tt><tt class="py-op">.</tt><tt class="py-base-class">TarFile</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
257
<a name="L155"></a><tt class="py-lineno">155</tt>  <tt class="py-line"> </tt>
 
258
<a name="L156"></a><tt class="py-lineno">156</tt>  <tt class="py-line">            <tt class="py-keyword">def</tt> <tt class="py-def-name">extractall</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">=</tt><tt class="py-string">'.'</tt><tt class="py-op">,</tt> <tt class="py-param">members</tt><tt class="py-op">=</tt><tt class="py-name">None</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
259
<a name="L157"></a><tt class="py-lineno">157</tt>  <tt class="py-line">                <tt class="py-docstring">"""Extract all members from the archive to the current working</tt> </tt>
 
260
<a name="L158"></a><tt class="py-lineno">158</tt>  <tt class="py-line"><tt class="py-docstring">             directory and set owner, modification time and permissions on</tt> </tt>
 
261
<a name="L159"></a><tt class="py-lineno">159</tt>  <tt class="py-line"><tt class="py-docstring">             directories afterwards. `path' specifies a different directory</tt> </tt>
 
262
<a name="L160"></a><tt class="py-lineno">160</tt>  <tt class="py-line"><tt class="py-docstring">             to extract to. `members' is optional and must be a subset of the</tt> </tt>
 
263
<a name="L161"></a><tt class="py-lineno">161</tt>  <tt class="py-line"><tt class="py-docstring">             list returned by getmembers().</tt> </tt>
 
264
<a name="L162"></a><tt class="py-lineno">162</tt>  <tt class="py-line"><tt class="py-docstring">                """</tt> </tt>
 
265
<a name="L163"></a><tt class="py-lineno">163</tt>  <tt class="py-line"> </tt>
 
266
<a name="L164"></a><tt class="py-lineno">164</tt>  <tt class="py-line">                <tt class="py-name">directories</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
 
267
<a name="L165"></a><tt class="py-lineno">165</tt>  <tt class="py-line">                <tt class="py-keyword">if</tt> <tt class="py-name">members</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
 
268
<a name="L166"></a><tt class="py-lineno">166</tt>  <tt class="py-line">                    <tt class="py-name">members</tt> <tt class="py-op">=</tt> <tt class="py-name">self</tt> </tt>
 
269
<a name="L167"></a><tt class="py-lineno">167</tt>  <tt class="py-line">                <tt class="py-keyword">for</tt> <tt class="py-name">tarinfo</tt> <tt class="py-keyword">in</tt> <tt class="py-name">members</tt><tt class="py-op">:</tt> </tt>
 
270
<a name="L168"></a><tt class="py-lineno">168</tt>  <tt class="py-line">                    <tt class="py-keyword">if</tt> <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt class="py-name">isdir</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
271
<a name="L169"></a><tt class="py-lineno">169</tt>  <tt class="py-line"> </tt>
 
272
<a name="L170"></a><tt class="py-lineno">170</tt>  <tt class="py-line">                        <tt class="py-comment"># Extract directory with a safe mode, so that</tt> </tt>
 
273
<a name="L171"></a><tt class="py-lineno">171</tt>  <tt class="py-line"><tt class="py-comment"></tt>                        <tt class="py-comment"># all files below can be extracted as well.</tt> </tt>
 
274
<a name="L172"></a><tt class="py-lineno">172</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
 
275
<a name="L173"></a><tt class="py-lineno">173</tt>  <tt class="py-line">                        <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
276
<a name="L174"></a><tt class="py-lineno">174</tt>  <tt class="py-line">                            <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">makedirs</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-62" class="py-name"><a title="web2py.gluon.html.join
 
277
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-62', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> </tt>
 
278
<a name="L175"></a><tt class="py-lineno">175</tt>  <tt class="py-line">                                    <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt id="link-63" class="py-name" targets="Variable web2py.gluon.import_all.name=web2py.gluon.import_all-module.html#name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-63', 'name', 'link-63');">name</a></tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-number">0777</tt><tt class="py-op">)</tt> </tt>
 
279
<a name="L176"></a><tt class="py-lineno">176</tt>  <tt class="py-line">                        <tt class="py-keyword">except</tt> <tt class="py-name">EnvironmentError</tt><tt class="py-op">:</tt> </tt>
 
280
<a name="L177"></a><tt class="py-lineno">177</tt>  <tt class="py-line">                            <tt class="py-keyword">pass</tt> </tt>
 
281
<a name="L178"></a><tt class="py-lineno">178</tt>  <tt class="py-line">                        <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt id="link-64" class="py-name"><a title="web2py.gluon.html.DIV.append
258
282
web2py.gluon.template.BlockNode.append
259
 
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-60', 'append', 'link-32');">append</a></tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">)</tt> </tt>
260
 
<a name="L169"></a><tt class="py-lineno">169</tt>  <tt class="py-line">                    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
261
 
<a name="L170"></a><tt class="py-lineno">170</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">extract</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
262
 
<a name="L171"></a><tt class="py-lineno">171</tt>  <tt class="py-line"> </tt>
263
 
<a name="L172"></a><tt class="py-lineno">172</tt>  <tt class="py-line">                <tt class="py-comment"># Reverse sort directories.</tt> </tt>
264
 
<a name="L173"></a><tt class="py-lineno">173</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
265
 
<a name="L174"></a><tt class="py-lineno">174</tt>  <tt class="py-line">                <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt id="link-61" class="py-name"><a title="web2py.gluon.dal.Rows.sort" class="py-name" href="#" onclick="return doclink('link-61', 'sort', 'link-41');">sort</a></tt><tt class="py-op">(</tt><tt class="py-keyword">lambda</tt> <tt class="py-name">a</tt><tt class="py-op">,</tt> <tt id="link-62" class="py-name" targets="Function web2py.gluon.rocket.b()=web2py.gluon.rocket-module.html#b"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-62', 'b', 'link-62');">b</a></tt><tt class="py-op">:</tt> <tt class="py-name">cmp</tt><tt class="py-op">(</tt><tt class="py-name">a</tt><tt class="py-op">.</tt><tt id="link-63" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-63', 'name', 'link-59');">name</a></tt><tt class="py-op">,</tt> <tt id="link-64" class="py-name"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-64', 'b', 'link-62');">b</a></tt><tt class="py-op">.</tt><tt id="link-65" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-65', 'name', 'link-59');">name</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
266
 
<a name="L175"></a><tt class="py-lineno">175</tt>  <tt class="py-line">                <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt class="py-name">reverse</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
267
 
<a name="L176"></a><tt class="py-lineno">176</tt>  <tt class="py-line"> </tt>
268
 
<a name="L177"></a><tt class="py-lineno">177</tt>  <tt class="py-line">                <tt class="py-comment"># Set correct owner, mtime and filemode on directories.</tt> </tt>
269
 
<a name="L178"></a><tt class="py-lineno">178</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
270
 
<a name="L179"></a><tt class="py-lineno">179</tt>  <tt class="py-line">                <tt class="py-keyword">for</tt> <tt class="py-name">tarinfo</tt> <tt class="py-keyword">in</tt> <tt class="py-name">directories</tt><tt class="py-op">:</tt> </tt>
271
 
<a name="L180"></a><tt class="py-lineno">180</tt>  <tt class="py-line">                    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-66" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-66', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt id="link-67" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-67', 'name', 'link-59');">name</a></tt><tt class="py-op">)</tt> </tt>
272
 
<a name="L181"></a><tt class="py-lineno">181</tt>  <tt class="py-line">                    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
273
 
<a name="L182"></a><tt class="py-lineno">182</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">chown</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
274
 
<a name="L183"></a><tt class="py-lineno">183</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">utime</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
275
 
<a name="L184"></a><tt class="py-lineno">184</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">chmod</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
276
 
<a name="L185"></a><tt class="py-lineno">185</tt>  <tt class="py-line">                    <tt class="py-keyword">except</tt> <tt class="py-name">ExtractError</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">:</tt> </tt>
277
 
<a name="L186"></a><tt class="py-lineno">186</tt>  <tt class="py-line">                        <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">errorlevel</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
278
 
<a name="L187"></a><tt class="py-lineno">187</tt>  <tt class="py-line">                            <tt class="py-keyword">raise</tt> </tt>
279
 
<a name="L188"></a><tt class="py-lineno">188</tt>  <tt class="py-line">                        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
280
 
<a name="L189"></a><tt class="py-lineno">189</tt>  <tt class="py-line">                            <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">_dbg</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-string">'tarfile: %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">e</tt><tt class="py-op">)</tt> </tt>
281
 
</div></div><a name="L190"></a><tt class="py-lineno">190</tt>  <tt class="py-line"> </tt>
282
 
<a name="L191"></a><tt class="py-lineno">191</tt>  <tt class="py-line"> </tt>
283
 
<a name="L192"></a><tt class="py-lineno">192</tt>  <tt class="py-line">        <tt class="py-name">_cls</tt> <tt class="py-op">=</tt> <tt class="py-name">TarFile</tt> </tt>
284
 
<a name="L193"></a><tt class="py-lineno">193</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
285
 
<a name="L194"></a><tt class="py-lineno">194</tt>  <tt class="py-line">        <tt class="py-name">_cls</tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt> </tt>
286
 
<a name="L195"></a><tt class="py-lineno">195</tt>  <tt class="py-line"> </tt>
287
 
<a name="L196"></a><tt class="py-lineno">196</tt>  <tt class="py-line">    <tt id="link-68" class="py-name" targets="Function web2py.gluon.fileutils.tar()=web2py.gluon.fileutils-module.html#tar"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-68', 'tar', 'link-68');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_cls</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'r'</tt><tt class="py-op">)</tt> </tt>
288
 
<a name="L197"></a><tt class="py-lineno">197</tt>  <tt class="py-line">    <tt class="py-name">ret</tt> <tt class="py-op">=</tt> <tt id="link-69" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-69', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">extractall</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">members</tt><tt class="py-op">)</tt> </tt>
289
 
<a name="L198"></a><tt class="py-lineno">198</tt>  <tt class="py-line">    <tt id="link-70" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-70', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt id="link-71" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
290
 
web2py.gluon.dal.DatabaseStoredFile.close
291
 
web2py.gluon.dal.NoSQLAdapter.close
292
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-71', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
293
 
<a name="L199"></a><tt class="py-lineno">199</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">ret</tt> </tt>
294
 
</div><a name="L200"></a><tt class="py-lineno">200</tt>  <tt class="py-line"> </tt>
295
 
<a name="tar"></a><div id="tar-def"><a name="L201"></a><tt class="py-lineno">201</tt> <a class="py-toggle" href="#" id="tar-toggle" onclick="return toggle('tar');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#tar">tar</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">,</tt> <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
296
 
</div><div id="tar-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="tar-expanded"><a name="L202"></a><tt class="py-lineno">202</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
297
 
<a name="L203"></a><tt class="py-lineno">203</tt>  <tt class="py-line"><tt class="py-docstring">    tars dir into file, only tars file that match expression</tt> </tt>
298
 
<a name="L204"></a><tt class="py-lineno">204</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
283
web2py.gluon.template.Content.append" class="py-name" href="#" onclick="return doclink('link-64', 'append', 'link-44');">append</a></tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">)</tt> </tt>
 
284
<a name="L179"></a><tt class="py-lineno">179</tt>  <tt class="py-line">                    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
285
<a name="L180"></a><tt class="py-lineno">180</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">extract</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
286
<a name="L181"></a><tt class="py-lineno">181</tt>  <tt class="py-line"> </tt>
 
287
<a name="L182"></a><tt class="py-lineno">182</tt>  <tt class="py-line">                <tt class="py-comment"># Reverse sort directories.</tt> </tt>
 
288
<a name="L183"></a><tt class="py-lineno">183</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
 
289
<a name="L184"></a><tt class="py-lineno">184</tt>  <tt class="py-line">                <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt id="link-65" class="py-name"><a title="web2py.gluon.dal.Rows.sort" class="py-name" href="#" onclick="return doclink('link-65', 'sort', 'link-52');">sort</a></tt><tt class="py-op">(</tt><tt class="py-keyword">lambda</tt> <tt class="py-name">a</tt><tt class="py-op">,</tt> <tt id="link-66" class="py-name"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-66', 'b', 'link-9');">b</a></tt><tt class="py-op">:</tt> <tt class="py-name">cmp</tt><tt class="py-op">(</tt><tt class="py-name">a</tt><tt class="py-op">.</tt><tt id="link-67" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-67', 'name', 'link-63');">name</a></tt><tt class="py-op">,</tt> <tt id="link-68" class="py-name"><a title="web2py.gluon.rocket.b" class="py-name" href="#" onclick="return doclink('link-68', 'b', 'link-9');">b</a></tt><tt class="py-op">.</tt><tt id="link-69" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-69', 'name', 'link-63');">name</a></tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
290
<a name="L185"></a><tt class="py-lineno">185</tt>  <tt class="py-line">                <tt class="py-name">directories</tt><tt class="py-op">.</tt><tt class="py-name">reverse</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
291
<a name="L186"></a><tt class="py-lineno">186</tt>  <tt class="py-line"> </tt>
 
292
<a name="L187"></a><tt class="py-lineno">187</tt>  <tt class="py-line">                <tt class="py-comment"># Set correct owner, mtime and filemode on directories.</tt> </tt>
 
293
<a name="L188"></a><tt class="py-lineno">188</tt>  <tt class="py-line"><tt class="py-comment"></tt> </tt>
 
294
<a name="L189"></a><tt class="py-lineno">189</tt>  <tt class="py-line">                <tt class="py-keyword">for</tt> <tt class="py-name">tarinfo</tt> <tt class="py-keyword">in</tt> <tt class="py-name">directories</tt><tt class="py-op">:</tt> </tt>
 
295
<a name="L190"></a><tt class="py-lineno">190</tt>  <tt class="py-line">                    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-70" class="py-name"><a title="web2py.gluon.html.join
 
296
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-70', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">tarinfo</tt><tt class="py-op">.</tt><tt id="link-71" class="py-name"><a title="web2py.gluon.import_all.name" class="py-name" href="#" onclick="return doclink('link-71', 'name', 'link-63');">name</a></tt><tt class="py-op">)</tt> </tt>
 
297
<a name="L191"></a><tt class="py-lineno">191</tt>  <tt class="py-line">                    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
298
<a name="L192"></a><tt class="py-lineno">192</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">chown</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
299
<a name="L193"></a><tt class="py-lineno">193</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">utime</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
300
<a name="L194"></a><tt class="py-lineno">194</tt>  <tt class="py-line">                        <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">chmod</tt><tt class="py-op">(</tt><tt class="py-name">tarinfo</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
301
<a name="L195"></a><tt class="py-lineno">195</tt>  <tt class="py-line">                    <tt class="py-keyword">except</tt> <tt class="py-name">ExtractError</tt><tt class="py-op">,</tt> <tt class="py-name">e</tt><tt class="py-op">:</tt> </tt>
 
302
<a name="L196"></a><tt class="py-lineno">196</tt>  <tt class="py-line">                        <tt class="py-keyword">if</tt> <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">errorlevel</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> </tt>
 
303
<a name="L197"></a><tt class="py-lineno">197</tt>  <tt class="py-line">                            <tt class="py-keyword">raise</tt> </tt>
 
304
<a name="L198"></a><tt class="py-lineno">198</tt>  <tt class="py-line">                        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
305
<a name="L199"></a><tt class="py-lineno">199</tt>  <tt class="py-line">                            <tt class="py-name">self</tt><tt class="py-op">.</tt><tt class="py-name">_dbg</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-string">'tarfile: %s'</tt> <tt class="py-op">%</tt> <tt class="py-name">e</tt><tt class="py-op">)</tt> </tt>
 
306
</div></div><a name="L200"></a><tt class="py-lineno">200</tt>  <tt class="py-line"> </tt>
 
307
<a name="L201"></a><tt class="py-lineno">201</tt>  <tt class="py-line"> </tt>
 
308
<a name="L202"></a><tt class="py-lineno">202</tt>  <tt class="py-line">        <tt class="py-name">_cls</tt> <tt class="py-op">=</tt> <tt class="py-name">TarFile</tt> </tt>
 
309
<a name="L203"></a><tt class="py-lineno">203</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
310
<a name="L204"></a><tt class="py-lineno">204</tt>  <tt class="py-line">        <tt class="py-name">_cls</tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt> </tt>
299
311
<a name="L205"></a><tt class="py-lineno">205</tt>  <tt class="py-line"> </tt>
300
 
<a name="L206"></a><tt class="py-lineno">206</tt>  <tt class="py-line">    <tt id="link-72" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-72', 'tar', 'link-68');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-string">'w'</tt><tt class="py-op">)</tt> </tt>
301
 
<a name="L207"></a><tt class="py-lineno">207</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
302
 
<a name="L208"></a><tt class="py-lineno">208</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt id="link-73" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-73', 'listdir', 'link-45');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">expression</tt><tt class="py-op">,</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
303
 
<a name="L209"></a><tt class="py-lineno">209</tt>  <tt class="py-line">            <tt id="link-74" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-74', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-75" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-75', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
304
 
<a name="L210"></a><tt class="py-lineno">210</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
305
 
<a name="L211"></a><tt class="py-lineno">211</tt>  <tt class="py-line">        <tt id="link-76" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-76', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt id="link-77" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
306
 
web2py.gluon.dal.DatabaseStoredFile.close
307
 
web2py.gluon.dal.NoSQLAdapter.close
308
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-77', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
309
 
</div><a name="L212"></a><tt class="py-lineno">212</tt>  <tt class="py-line"> </tt>
310
 
<a name="untar"></a><div id="untar-def"><a name="L213"></a><tt class="py-lineno">213</tt> <a class="py-toggle" href="#" id="untar-toggle" onclick="return toggle('untar');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#untar">untar</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
311
 
</div><div id="untar-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="untar-expanded"><a name="L214"></a><tt class="py-lineno">214</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
312
 
<a name="L215"></a><tt class="py-lineno">215</tt>  <tt class="py-line"><tt class="py-docstring">    untar file into dir</tt> </tt>
313
 
<a name="L216"></a><tt class="py-lineno">216</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
314
 
<a name="L217"></a><tt class="py-lineno">217</tt>  <tt class="py-line"> </tt>
315
 
<a name="L218"></a><tt class="py-lineno">218</tt>  <tt class="py-line">    <tt id="link-78" class="py-name" targets="Function web2py.gluon.fileutils._extractall()=web2py.gluon.fileutils-module.html#_extractall"><a title="web2py.gluon.fileutils._extractall" class="py-name" href="#" onclick="return doclink('link-78', '_extractall', 'link-78');">_extractall</a></tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">dir</tt><tt class="py-op">)</tt> </tt>
316
 
</div><a name="L219"></a><tt class="py-lineno">219</tt>  <tt class="py-line"> </tt>
317
 
<a name="L220"></a><tt class="py-lineno">220</tt>  <tt class="py-line"> </tt>
318
 
<a name="w2p_pack"></a><div id="w2p_pack-def"><a name="L221"></a><tt class="py-lineno">221</tt> <a class="py-toggle" href="#" id="w2p_pack-toggle" onclick="return toggle('w2p_pack');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_pack">w2p_pack</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">compiled</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
319
 
</div><div id="w2p_pack-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_pack-expanded"><a name="L222"></a><tt class="py-lineno">222</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-79" class="py-name" targets="Function web2py.gluon.fileutils.abspath()=web2py.gluon.fileutils-module.html#abspath"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-79', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
320
 
<a name="L223"></a><tt class="py-lineno">223</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-80" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-80', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
321
 
<a name="L224"></a><tt class="py-lineno">224</tt>  <tt class="py-line">    <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
322
 
<a name="L225"></a><tt class="py-lineno">225</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">compiled</tt><tt class="py-op">:</tt> </tt>
323
 
<a name="L226"></a><tt class="py-lineno">226</tt>  <tt class="py-line">        <tt id="link-81" class="py-name" targets="Function web2py.gluon.fileutils.tar_compiled()=web2py.gluon.fileutils-module.html#tar_compiled"><a title="web2py.gluon.fileutils.tar_compiled" class="py-name" href="#" onclick="return doclink('link-81', 'tar_compiled', 'link-81');">tar_compiled</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'^[\w\.\-]+$'</tt><tt class="py-op">)</tt> </tt>
324
 
<a name="L227"></a><tt class="py-lineno">227</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
325
 
<a name="L228"></a><tt class="py-lineno">228</tt>  <tt class="py-line">        <tt id="link-82" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-82', 'tar', 'link-68');">tar</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'^[\w\.\-]+$'</tt><tt class="py-op">)</tt> </tt>
326
 
<a name="L229"></a><tt class="py-lineno">229</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt> <tt class="py-op">=</tt> <tt class="py-name">gzopen</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
327
 
<a name="L230"></a><tt class="py-lineno">230</tt>  <tt class="py-line">    <tt class="py-name">tarfp</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
328
 
<a name="L231"></a><tt class="py-lineno">231</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt><tt class="py-op">.</tt><tt id="link-83" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
329
 
web2py.gluon.debug.Pipe.write
330
 
web2py.gluon.globals.Response.write
331
 
web2py.gluon.rocket.WSGIWorker.write
332
 
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-83', 'write', 'link-8');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">tarfp</tt><tt class="py-op">.</tt><tt id="link-84" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
333
 
web2py.gluon.debug.Pipe.read
334
 
web2py.gluon.languages.lazyT.read
335
 
web2py.gluon.rocket.ChunkedReader.read
336
 
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-84', 'read', 'link-6');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
337
 
<a name="L232"></a><tt class="py-lineno">232</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt><tt class="py-op">.</tt><tt id="link-85" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
338
 
web2py.gluon.dal.DatabaseStoredFile.close
339
 
web2py.gluon.dal.NoSQLAdapter.close
340
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-85', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
341
 
<a name="L233"></a><tt class="py-lineno">233</tt>  <tt class="py-line">    <tt class="py-name">tarfp</tt><tt class="py-op">.</tt><tt id="link-86" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
342
 
web2py.gluon.dal.DatabaseStoredFile.close
343
 
web2py.gluon.dal.NoSQLAdapter.close
344
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-86', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
345
 
<a name="L234"></a><tt class="py-lineno">234</tt>  <tt class="py-line">    <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">)</tt> </tt>
346
 
</div><a name="L235"></a><tt class="py-lineno">235</tt>  <tt class="py-line"> </tt>
347
 
<a name="w2p_unpack"></a><div id="w2p_unpack-def"><a name="L236"></a><tt class="py-lineno">236</tt> <a class="py-toggle" href="#" id="w2p_unpack-toggle" onclick="return toggle('w2p_unpack');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_unpack">w2p_unpack</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">delete_tar</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
348
 
</div><div id="w2p_unpack-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_unpack-expanded"><a name="L237"></a><tt class="py-lineno">237</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-87" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-87', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
349
 
<a name="L238"></a><tt class="py-lineno">238</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-88" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-88', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
350
 
<a name="L239"></a><tt class="py-lineno">239</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.w2p'</tt> <tt class="py-keyword">or</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">3</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.gz'</tt><tt class="py-op">:</tt> </tt>
351
 
<a name="L240"></a><tt class="py-lineno">240</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.w2p'</tt><tt class="py-op">:</tt> </tt>
352
 
<a name="L241"></a><tt class="py-lineno">241</tt>  <tt class="py-line">            <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
353
 
<a name="L242"></a><tt class="py-lineno">242</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
354
 
<a name="L243"></a><tt class="py-lineno">243</tt>  <tt class="py-line">            <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">3</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
355
 
<a name="L244"></a><tt class="py-lineno">244</tt>  <tt class="py-line">        <tt class="py-name">fgzipped</tt> <tt class="py-op">=</tt> <tt class="py-name">gzopen</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
356
 
<a name="L245"></a><tt class="py-lineno">245</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
357
 
<a name="L246"></a><tt class="py-lineno">246</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt id="link-89" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
358
 
web2py.gluon.debug.Pipe.write
359
 
web2py.gluon.globals.Response.write
360
 
web2py.gluon.rocket.WSGIWorker.write
361
 
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-89', 'write', 'link-8');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">fgzipped</tt><tt class="py-op">.</tt><tt id="link-90" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
362
 
web2py.gluon.debug.Pipe.read
363
 
web2py.gluon.languages.lazyT.read
364
 
web2py.gluon.rocket.ChunkedReader.read
365
 
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-90', 'read', 'link-6');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
366
 
<a name="L247"></a><tt class="py-lineno">247</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt id="link-91" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
367
 
web2py.gluon.dal.DatabaseStoredFile.close
368
 
web2py.gluon.dal.NoSQLAdapter.close
369
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-91', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
370
 
<a name="L248"></a><tt class="py-lineno">248</tt>  <tt class="py-line">        <tt class="py-name">fgzipped</tt><tt class="py-op">.</tt><tt id="link-92" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
371
 
web2py.gluon.dal.DatabaseStoredFile.close
372
 
web2py.gluon.dal.NoSQLAdapter.close
373
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-92', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
374
 
<a name="L249"></a><tt class="py-lineno">249</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
375
 
<a name="L250"></a><tt class="py-lineno">250</tt>  <tt class="py-line">        <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt> </tt>
376
 
<a name="L251"></a><tt class="py-lineno">251</tt>  <tt class="py-line">    <tt id="link-93" class="py-name" targets="Function web2py.gluon.fileutils.untar()=web2py.gluon.fileutils-module.html#untar"><a title="web2py.gluon.fileutils.untar" class="py-name" href="#" onclick="return doclink('link-93', 'untar', 'link-93');">untar</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
377
 
<a name="L252"></a><tt class="py-lineno">252</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">delete_tar</tt><tt class="py-op">:</tt> </tt>
378
 
<a name="L253"></a><tt class="py-lineno">253</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">)</tt> </tt>
379
 
</div><a name="L254"></a><tt class="py-lineno">254</tt>  <tt class="py-line"> </tt>
380
 
<a name="L255"></a><tt class="py-lineno">255</tt>  <tt class="py-line"> </tt>
381
 
<a name="w2p_pack_plugin"></a><div id="w2p_pack_plugin-def"><a name="L256"></a><tt class="py-lineno">256</tt> <a class="py-toggle" href="#" id="w2p_pack_plugin-toggle" onclick="return toggle('w2p_pack_plugin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_pack_plugin">w2p_pack_plugin</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
382
 
</div><div id="w2p_pack_plugin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_pack_plugin-expanded"><a name="L257"></a><tt class="py-lineno">257</tt>  <tt class="py-line">    <tt class="py-docstring">"""Pack the given plugin into a w2p file.</tt> </tt>
383
 
<a name="L258"></a><tt class="py-lineno">258</tt>  <tt class="py-line"><tt class="py-docstring">    Will match files at:</tt> </tt>
384
 
<a name="L259"></a><tt class="py-lineno">259</tt>  <tt class="py-line"><tt class="py-docstring">        &lt;path&gt;/*/plugin_[name].*</tt> </tt>
385
 
<a name="L260"></a><tt class="py-lineno">260</tt>  <tt class="py-line"><tt class="py-docstring">        &lt;path&gt;/*/plugin_[name]/*</tt> </tt>
386
 
<a name="L261"></a><tt class="py-lineno">261</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
387
 
<a name="L262"></a><tt class="py-lineno">262</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-94" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-94', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
388
 
<a name="L263"></a><tt class="py-lineno">263</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-95" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-95', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
389
 
<a name="L264"></a><tt class="py-lineno">264</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">filename</tt><tt class="py-op">.</tt><tt id="link-96" class="py-name" targets="Method web2py.gluon.dal.Expression.endswith()=web2py.gluon.dal.Expression-class.html#endswith"><a title="web2py.gluon.dal.Expression.endswith" class="py-name" href="#" onclick="return doclink('link-96', 'endswith', 'link-96');">endswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'web2py.plugin.%s.w2p'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
390
 
<a name="L265"></a><tt class="py-lineno">265</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt id="link-97" class="py-name" targets="Class exceptions.Exception=exceptions.Exception-class.html"><a title="exceptions.Exception" class="py-name" href="#" onclick="return doclink('link-97', 'Exception', 'link-97');">Exception</a></tt><tt class="py-op">,</tt> <tt class="py-string">"Not a web2py plugin name"</tt> </tt>
391
 
<a name="L266"></a><tt class="py-lineno">266</tt>  <tt class="py-line">    <tt class="py-name">plugin_tarball</tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'w:gz'</tt><tt class="py-op">)</tt> </tt>
392
 
<a name="L267"></a><tt class="py-lineno">267</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
393
 
<a name="L268"></a><tt class="py-lineno">268</tt>  <tt class="py-line">        <tt class="py-name">app_dir</tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt> </tt>
394
 
<a name="L269"></a><tt class="py-lineno">269</tt>  <tt class="py-line">        <tt class="py-keyword">while</tt> <tt class="py-name">app_dir</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">==</tt><tt class="py-string">'/'</tt><tt class="py-op">:</tt> </tt>
395
 
<a name="L270"></a><tt class="py-lineno">270</tt>  <tt class="py-line">            <tt class="py-name">app_dir</tt> <tt class="py-op">=</tt> <tt class="py-name">app_dir</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
396
 
<a name="L271"></a><tt class="py-lineno">271</tt>  <tt class="py-line">        <tt class="py-name">files1</tt><tt class="py-op">=</tt><tt class="py-name">glob</tt><tt class="py-op">.</tt><tt class="py-name">glob</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-98" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-98', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">,</tt><tt class="py-string">'*/plugin_%s.*'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
397
 
<a name="L272"></a><tt class="py-lineno">272</tt>  <tt class="py-line">        <tt class="py-name">files2</tt><tt class="py-op">=</tt><tt class="py-name">glob</tt><tt class="py-op">.</tt><tt class="py-name">glob</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-99" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-99', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">,</tt><tt class="py-string">'*/plugin_%s/*'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
398
 
<a name="L273"></a><tt class="py-lineno">273</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt class="py-name">files1</tt><tt class="py-op">+</tt><tt class="py-name">files2</tt><tt class="py-op">:</tt> </tt>
399
 
<a name="L274"></a><tt class="py-lineno">274</tt>  <tt class="py-line">            <tt class="py-name">plugin_tarball</tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">arcname</tt><tt class="py-op">=</tt><tt class="py-name">file</tt><tt class="py-op">[</tt><tt id="link-100" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-100', 'len', 'link-22');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">)</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
400
 
<a name="L275"></a><tt class="py-lineno">275</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
401
 
<a name="L276"></a><tt class="py-lineno">276</tt>  <tt class="py-line">        <tt class="py-name">plugin_tarball</tt><tt class="py-op">.</tt><tt id="link-101" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
402
 
web2py.gluon.dal.DatabaseStoredFile.close
403
 
web2py.gluon.dal.NoSQLAdapter.close
404
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-101', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
405
 
</div><a name="L277"></a><tt class="py-lineno">277</tt>  <tt class="py-line"> </tt>
406
 
<a name="L278"></a><tt class="py-lineno">278</tt>  <tt class="py-line"> </tt>
407
 
<a name="w2p_unpack_plugin"></a><div id="w2p_unpack_plugin-def"><a name="L279"></a><tt class="py-lineno">279</tt> <a class="py-toggle" href="#" id="w2p_unpack_plugin-toggle" onclick="return toggle('w2p_unpack_plugin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_unpack_plugin">w2p_unpack_plugin</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">delete_tar</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
408
 
</div><div id="w2p_unpack_plugin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_unpack_plugin-expanded"><a name="L280"></a><tt class="py-lineno">280</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-102" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-102', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
409
 
<a name="L281"></a><tt class="py-lineno">281</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-103" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-103', 'abspath', 'link-79');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
410
 
<a name="L282"></a><tt class="py-lineno">282</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">basename</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-104" class="py-name"><a title="web2py.gluon.dal.Expression.startswith
411
 
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-104', 'startswith', 'link-29');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'web2py.plugin.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
412
 
<a name="L283"></a><tt class="py-lineno">283</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt id="link-105" class="py-name"><a title="exceptions.Exception" class="py-name" href="#" onclick="return doclink('link-105', 'Exception', 'link-97');">Exception</a></tt><tt class="py-op">,</tt> <tt class="py-string">"Not a web2py plugin"</tt> </tt>
413
 
<a name="L284"></a><tt class="py-lineno">284</tt>  <tt class="py-line">    <tt id="link-106" class="py-name" targets="Function web2py.gluon.fileutils.w2p_unpack()=web2py.gluon.fileutils-module.html#w2p_unpack"><a title="web2py.gluon.fileutils.w2p_unpack" class="py-name" href="#" onclick="return doclink('link-106', 'w2p_unpack', 'link-106');">w2p_unpack</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt><tt class="py-name">path</tt><tt class="py-op">,</tt><tt class="py-name">delete_tar</tt><tt class="py-op">)</tt> </tt>
414
 
</div><a name="L285"></a><tt class="py-lineno">285</tt>  <tt class="py-line"> </tt>
415
 
<a name="L286"></a><tt class="py-lineno">286</tt>  <tt class="py-line"> </tt>
416
 
<a name="tar_compiled"></a><div id="tar_compiled-def"><a name="L287"></a><tt class="py-lineno">287</tt> <a class="py-toggle" href="#" id="tar_compiled-toggle" onclick="return toggle('tar_compiled');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#tar_compiled">tar_compiled</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">,</tt> <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
417
 
</div><div id="tar_compiled-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="tar_compiled-expanded"><a name="L288"></a><tt class="py-lineno">288</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
418
 
<a name="L289"></a><tt class="py-lineno">289</tt>  <tt class="py-line"><tt class="py-docstring">    used to tar a compiled application.</tt> </tt>
419
 
<a name="L290"></a><tt class="py-lineno">290</tt>  <tt class="py-line"><tt class="py-docstring">    the content of models, views, controllers is not stored in the tar file.</tt> </tt>
420
 
<a name="L291"></a><tt class="py-lineno">291</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
421
 
<a name="L292"></a><tt class="py-lineno">292</tt>  <tt class="py-line"> </tt>
422
 
<a name="L293"></a><tt class="py-lineno">293</tt>  <tt class="py-line">    <tt id="link-107" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-107', 'tar', 'link-68');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-string">'w'</tt><tt class="py-op">)</tt> </tt>
423
 
<a name="L294"></a><tt class="py-lineno">294</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt id="link-108" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-108', 'listdir', 'link-45');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">expression</tt><tt class="py-op">,</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
424
 
<a name="L295"></a><tt class="py-lineno">295</tt>  <tt class="py-line">        <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-109" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-109', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt> </tt>
425
 
<a name="L296"></a><tt class="py-lineno">296</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">islink</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
426
 
<a name="L297"></a><tt class="py-lineno">297</tt>  <tt class="py-line">            <tt class="py-keyword">continue</tt> </tt>
427
 
<a name="L298"></a><tt class="py-lineno">298</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isfile</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">!=</tt> <tt class="py-string">'.pyc'</tt><tt class="py-op">:</tt> </tt>
428
 
<a name="L299"></a><tt class="py-lineno">299</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'models'</tt><tt class="py-op">:</tt> </tt>
429
 
<a name="L300"></a><tt class="py-lineno">300</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
430
 
<a name="L301"></a><tt class="py-lineno">301</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">5</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'views'</tt><tt class="py-op">:</tt> </tt>
431
 
<a name="L302"></a><tt class="py-lineno">302</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
432
 
<a name="L303"></a><tt class="py-lineno">303</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">11</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'controllers'</tt><tt class="py-op">:</tt> </tt>
433
 
<a name="L304"></a><tt class="py-lineno">304</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
434
 
<a name="L305"></a><tt class="py-lineno">305</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">7</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'modules'</tt><tt class="py-op">:</tt> </tt>
435
 
<a name="L306"></a><tt class="py-lineno">306</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
436
 
<a name="L307"></a><tt class="py-lineno">307</tt>  <tt class="py-line">        <tt id="link-110" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-110', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
437
 
<a name="L308"></a><tt class="py-lineno">308</tt>  <tt class="py-line">    <tt id="link-111" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-111', 'tar', 'link-68');">tar</a></tt><tt class="py-op">.</tt><tt id="link-112" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
438
 
web2py.gluon.dal.DatabaseStoredFile.close
439
 
web2py.gluon.dal.NoSQLAdapter.close
440
 
web2py.gluon.rocket.Connection.close" class="py-name" href="#" onclick="return doclink('link-112', 'close', 'link-7');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
441
 
</div><a name="L309"></a><tt class="py-lineno">309</tt>  <tt class="py-line"> </tt>
442
 
<a name="up"></a><div id="up-def"><a name="L310"></a><tt class="py-lineno">310</tt> <a class="py-toggle" href="#" id="up-toggle" onclick="return toggle('up');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#up">up</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
443
 
</div><div id="up-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="up-expanded"><a name="L311"></a><tt class="py-lineno">311</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">dirname</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">normpath</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
444
 
</div><a name="L312"></a><tt class="py-lineno">312</tt>  <tt class="py-line"> </tt>
445
 
<a name="L313"></a><tt class="py-lineno">313</tt>  <tt class="py-line"> </tt>
446
 
<a name="get_session"></a><div id="get_session-def"><a name="L314"></a><tt class="py-lineno">314</tt> <a class="py-toggle" href="#" id="get_session-toggle" onclick="return toggle('get_session');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#get_session">get_session</a><tt class="py-op">(</tt><tt class="py-param">request</tt><tt class="py-op">,</tt> <tt class="py-param">other_application</tt><tt class="py-op">=</tt><tt class="py-string">'admin'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
447
 
</div><div id="get_session-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="get_session-expanded"><a name="L315"></a><tt class="py-lineno">315</tt>  <tt class="py-line">    <tt class="py-docstring">""" checks that user is authorized to access other_application"""</tt> </tt>
448
 
<a name="L316"></a><tt class="py-lineno">316</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">application</tt> <tt class="py-op">==</tt> <tt class="py-name">other_application</tt><tt class="py-op">:</tt> </tt>
449
 
<a name="L317"></a><tt class="py-lineno">317</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt class="py-name">KeyError</tt> </tt>
450
 
<a name="L318"></a><tt class="py-lineno">318</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
451
 
<a name="L319"></a><tt class="py-lineno">319</tt>  <tt class="py-line">        <tt class="py-name">session_id</tt> <tt class="py-op">=</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">cookies</tt><tt class="py-op">[</tt><tt class="py-string">'session_id_'</tt> <tt class="py-op">+</tt> <tt class="py-name">other_application</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">value</tt> </tt>
452
 
<a name="L320"></a><tt class="py-lineno">320</tt>  <tt class="py-line">        <tt class="py-name">osession</tt> <tt class="py-op">=</tt> <tt id="link-113" class="py-name"><a title="web2py.gluon.storage" class="py-name" href="#" onclick="return doclink('link-113', 'storage', 'link-0');">storage</a></tt><tt class="py-op">.</tt><tt id="link-114" class="py-name" targets="Function web2py.gluon.storage.load_storage()=web2py.gluon.storage-module.html#load_storage"><a title="web2py.gluon.storage.load_storage" class="py-name" href="#" onclick="return doclink('link-114', 'load_storage', 'link-114');">load_storage</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-115" class="py-name"><a title="web2py.gluon.html.join" class="py-name" href="#" onclick="return doclink('link-115', 'join', 'link-11');">join</a></tt><tt class="py-op">(</tt> </tt>
453
 
<a name="L321"></a><tt class="py-lineno">321</tt>  <tt class="py-line">                <tt id="link-116" class="py-name" targets="Function web2py.gluon.fileutils.up()=web2py.gluon.fileutils-module.html#up"><a title="web2py.gluon.fileutils.up" class="py-name" href="#" onclick="return doclink('link-116', 'up', 'link-116');">up</a></tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">folder</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">other_application</tt><tt class="py-op">,</tt> <tt class="py-string">'sessions'</tt><tt class="py-op">,</tt> <tt class="py-name">session_id</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
454
 
<a name="L322"></a><tt class="py-lineno">322</tt>  <tt class="py-line">    <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
455
 
<a name="L323"></a><tt class="py-lineno">323</tt>  <tt class="py-line">        <tt class="py-name">osession</tt> <tt class="py-op">=</tt> <tt id="link-117" class="py-name"><a title="web2py.gluon.storage" class="py-name" href="#" onclick="return doclink('link-117', 'storage', 'link-0');">storage</a></tt><tt class="py-op">.</tt><tt id="link-118" class="py-name" targets="Class web2py.gluon.storage.Storage=web2py.gluon.storage.Storage-class.html"><a title="web2py.gluon.storage.Storage" class="py-name" href="#" onclick="return doclink('link-118', 'Storage', 'link-118');">Storage</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
456
 
<a name="L324"></a><tt class="py-lineno">324</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">osession</tt> </tt>
457
 
</div><a name="L325"></a><tt class="py-lineno">325</tt>  <tt class="py-line"> </tt>
458
 
<a name="L326"></a><tt class="py-lineno">326</tt>  <tt class="py-line"> </tt>
459
 
<a name="check_credentials"></a><div id="check_credentials-def"><a name="L327"></a><tt class="py-lineno">327</tt> <a class="py-toggle" href="#" id="check_credentials-toggle" onclick="return toggle('check_credentials');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#check_credentials">check_credentials</a><tt class="py-op">(</tt><tt class="py-param">request</tt><tt class="py-op">,</tt> <tt class="py-param">other_application</tt><tt class="py-op">=</tt><tt class="py-string">'admin'</tt><tt class="py-op">,</tt> <tt class="py-param">expiration</tt> <tt class="py-op">=</tt> <tt class="py-number">60</tt><tt class="py-op">*</tt><tt class="py-number">60</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
460
 
</div><div id="check_credentials-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="check_credentials-expanded"><a name="L328"></a><tt class="py-lineno">328</tt>  <tt class="py-line">    <tt class="py-docstring">""" checks that user is authorized to access other_application"""</tt> </tt>
461
 
<a name="L329"></a><tt class="py-lineno">329</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt id="link-119" class="py-name" targets="Function web2py.gluon.shell.env()=web2py.gluon.shell-module.html#env"><a title="web2py.gluon.shell.env" class="py-name" href="#" onclick="return doclink('link-119', 'env', 'link-119');">env</a></tt><tt class="py-op">.</tt><tt class="py-name">web2py_runtime_gae</tt><tt class="py-op">:</tt> </tt>
462
 
<a name="L330"></a><tt class="py-lineno">330</tt>  <tt class="py-line">        <tt class="py-keyword">from</tt> <tt class="py-name">google</tt><tt class="py-op">.</tt><tt class="py-name">appengine</tt><tt class="py-op">.</tt><tt class="py-name">api</tt> <tt class="py-keyword">import</tt> <tt class="py-name">users</tt> </tt>
463
 
<a name="L331"></a><tt class="py-lineno">331</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">users</tt><tt class="py-op">.</tt><tt class="py-name">is_current_user_admin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
464
 
<a name="L332"></a><tt class="py-lineno">332</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">True</tt> </tt>
465
 
<a name="L333"></a><tt class="py-lineno">333</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
466
 
<a name="L334"></a><tt class="py-lineno">334</tt>  <tt class="py-line">            <tt class="py-name">login_html</tt> <tt class="py-op">=</tt> <tt class="py-string">'&lt;a href="%s"&gt;Sign in with your google account&lt;/a&gt;.'</tt> \ </tt>
467
 
<a name="L335"></a><tt class="py-lineno">335</tt>  <tt class="py-line">                <tt class="py-op">%</tt> <tt class="py-name">users</tt><tt class="py-op">.</tt><tt class="py-name">create_login_url</tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">.</tt><tt id="link-120" class="py-name"><a title="web2py.gluon.shell.env" class="py-name" href="#" onclick="return doclink('link-120', 'env', 'link-119');">env</a></tt><tt class="py-op">.</tt><tt class="py-name">path_info</tt><tt class="py-op">)</tt> </tt>
468
 
<a name="L336"></a><tt class="py-lineno">336</tt>  <tt class="py-line">            <tt class="py-keyword">raise</tt> <tt id="link-121" class="py-name"><a title="web2py.gluon.http.HTTP" class="py-name" href="#" onclick="return doclink('link-121', 'HTTP', 'link-3');">HTTP</a></tt><tt class="py-op">(</tt><tt class="py-number">200</tt><tt class="py-op">,</tt> <tt class="py-string">'&lt;html&gt;&lt;body&gt;%s&lt;/body&gt;&lt;/html&gt;'</tt> <tt class="py-op">%</tt> <tt class="py-name">login_html</tt><tt class="py-op">)</tt> </tt>
469
 
<a name="L337"></a><tt class="py-lineno">337</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
470
 
<a name="L338"></a><tt class="py-lineno">338</tt>  <tt class="py-line">        <tt class="py-name">dt</tt> <tt class="py-op">=</tt> <tt id="link-122" class="py-name"><a title="datetime.time" class="py-name" href="#" onclick="return doclink('link-122', 'time', 'link-1');">time</a></tt><tt class="py-op">.</tt><tt id="link-123" class="py-name"><a title="datetime.time" class="py-name" href="#" onclick="return doclink('link-123', 'time', 'link-1');">time</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">-</tt> <tt class="py-name">expiration</tt> </tt>
471
 
<a name="L339"></a><tt class="py-lineno">339</tt>  <tt class="py-line">        <tt id="link-124" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-124', 's', 'link-44');">s</a></tt> <tt class="py-op">=</tt> <tt id="link-125" class="py-name" targets="Function web2py.gluon.fileutils.get_session()=web2py.gluon.fileutils-module.html#get_session"><a title="web2py.gluon.fileutils.get_session" class="py-name" href="#" onclick="return doclink('link-125', 'get_session', 'link-125');">get_session</a></tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">,</tt> <tt class="py-name">other_application</tt><tt class="py-op">)</tt> </tt>
472
 
<a name="L340"></a><tt class="py-lineno">340</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt id="link-126" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-126', 's', 'link-44');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">authorized</tt> <tt class="py-keyword">and</tt> <tt id="link-127" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-127', 's', 'link-44');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">last_time</tt> <tt class="py-keyword">and</tt> <tt id="link-128" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-128', 's', 'link-44');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">last_time</tt> <tt class="py-op">&gt;</tt> <tt class="py-name">dt</tt><tt class="py-op">)</tt> </tt>
473
 
</div><a name="L341"></a><tt class="py-lineno">341</tt>  <tt class="py-line"> </tt>
474
 
<a name="L342"></a><tt class="py-lineno">342</tt>  <tt class="py-line"> </tt>
475
 
<a name="fix_newlines"></a><div id="fix_newlines-def"><a name="L343"></a><tt class="py-lineno">343</tt> <a class="py-toggle" href="#" id="fix_newlines-toggle" onclick="return toggle('fix_newlines');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#fix_newlines">fix_newlines</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
476
 
</div><div id="fix_newlines-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="fix_newlines-expanded"><a name="L344"></a><tt class="py-lineno">344</tt>  <tt class="py-line">    <tt id="link-129" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
477
 
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-129', 'regex', 'link-23');">regex</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">r'''(\r</tt> </tt>
478
 
<a name="L345"></a><tt class="py-lineno">345</tt>  <tt class="py-line"><tt class="py-string">|\r|</tt> </tt>
479
 
<a name="L346"></a><tt class="py-lineno">346</tt>  <tt class="py-line"><tt class="py-string">)'''</tt><tt class="py-op">)</tt> </tt>
480
 
<a name="L347"></a><tt class="py-lineno">347</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-name">filename</tt> <tt class="py-keyword">in</tt> <tt id="link-130" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-130', 'listdir', 'link-45');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'.*\.(py|html)$'</tt><tt class="py-op">,</tt> <tt id="link-131" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.drop
 
312
<a name="L206"></a><tt class="py-lineno">206</tt>  <tt class="py-line">    <tt id="link-72" class="py-name" targets="Function web2py.gluon.fileutils.tar()=web2py.gluon.fileutils-module.html#tar"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-72', 'tar', 'link-72');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_cls</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'r'</tt><tt class="py-op">)</tt> </tt>
 
313
<a name="L207"></a><tt class="py-lineno">207</tt>  <tt class="py-line">    <tt class="py-name">ret</tt> <tt class="py-op">=</tt> <tt id="link-73" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-73', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">extractall</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-name">members</tt><tt class="py-op">)</tt> </tt>
 
314
<a name="L208"></a><tt class="py-lineno">208</tt>  <tt class="py-line">    <tt id="link-74" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-74', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt id="link-75" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
315
web2py.gluon.dal.DatabaseStoredFile.close
 
316
web2py.gluon.dal.NoSQLAdapter.close
 
317
web2py.gluon.rocket.Connection.close
 
318
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-75', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
319
<a name="L209"></a><tt class="py-lineno">209</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">ret</tt> </tt>
 
320
</div><a name="L210"></a><tt class="py-lineno">210</tt>  <tt class="py-line"> </tt>
 
321
<a name="tar"></a><div id="tar-def"><a name="L211"></a><tt class="py-lineno">211</tt> <a class="py-toggle" href="#" id="tar-toggle" onclick="return toggle('tar');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#tar">tar</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">,</tt> <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
322
</div><div id="tar-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="tar-expanded"><a name="L212"></a><tt class="py-lineno">212</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
323
<a name="L213"></a><tt class="py-lineno">213</tt>  <tt class="py-line"><tt class="py-docstring">    tars dir into file, only tars file that match expression</tt> </tt>
 
324
<a name="L214"></a><tt class="py-lineno">214</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
325
<a name="L215"></a><tt class="py-lineno">215</tt>  <tt class="py-line"> </tt>
 
326
<a name="L216"></a><tt class="py-lineno">216</tt>  <tt class="py-line">    <tt id="link-76" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-76', 'tar', 'link-72');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-string">'w'</tt><tt class="py-op">)</tt> </tt>
 
327
<a name="L217"></a><tt class="py-lineno">217</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
328
<a name="L218"></a><tt class="py-lineno">218</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt id="link-77" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-77', 'listdir', 'link-54');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">expression</tt><tt class="py-op">,</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
329
<a name="L219"></a><tt class="py-lineno">219</tt>  <tt class="py-line">            <tt id="link-78" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-78', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-79" class="py-name"><a title="web2py.gluon.html.join
 
330
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-79', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
 
331
<a name="L220"></a><tt class="py-lineno">220</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
 
332
<a name="L221"></a><tt class="py-lineno">221</tt>  <tt class="py-line">        <tt id="link-80" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-80', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt id="link-81" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
333
web2py.gluon.dal.DatabaseStoredFile.close
 
334
web2py.gluon.dal.NoSQLAdapter.close
 
335
web2py.gluon.rocket.Connection.close
 
336
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-81', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
337
</div><a name="L222"></a><tt class="py-lineno">222</tt>  <tt class="py-line"> </tt>
 
338
<a name="untar"></a><div id="untar-def"><a name="L223"></a><tt class="py-lineno">223</tt> <a class="py-toggle" href="#" id="untar-toggle" onclick="return toggle('untar');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#untar">untar</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
339
</div><div id="untar-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="untar-expanded"><a name="L224"></a><tt class="py-lineno">224</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
340
<a name="L225"></a><tt class="py-lineno">225</tt>  <tt class="py-line"><tt class="py-docstring">    untar file into dir</tt> </tt>
 
341
<a name="L226"></a><tt class="py-lineno">226</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
342
<a name="L227"></a><tt class="py-lineno">227</tt>  <tt class="py-line"> </tt>
 
343
<a name="L228"></a><tt class="py-lineno">228</tt>  <tt class="py-line">    <tt id="link-82" class="py-name" targets="Function web2py.gluon.fileutils._extractall()=web2py.gluon.fileutils-module.html#_extractall"><a title="web2py.gluon.fileutils._extractall" class="py-name" href="#" onclick="return doclink('link-82', '_extractall', 'link-82');">_extractall</a></tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">dir</tt><tt class="py-op">)</tt> </tt>
 
344
</div><a name="L229"></a><tt class="py-lineno">229</tt>  <tt class="py-line"> </tt>
 
345
<a name="L230"></a><tt class="py-lineno">230</tt>  <tt class="py-line"> </tt>
 
346
<a name="w2p_pack"></a><div id="w2p_pack-def"><a name="L231"></a><tt class="py-lineno">231</tt> <a class="py-toggle" href="#" id="w2p_pack-toggle" onclick="return toggle('w2p_pack');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_pack">w2p_pack</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">compiled</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
347
</div><div id="w2p_pack-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_pack-expanded"><a name="L232"></a><tt class="py-lineno">232</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-83" class="py-name" targets="Function web2py.gluon.fileutils.abspath()=web2py.gluon.fileutils-module.html#abspath"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-83', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
 
348
<a name="L233"></a><tt class="py-lineno">233</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-84" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-84', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
349
<a name="L234"></a><tt class="py-lineno">234</tt>  <tt class="py-line">    <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
 
350
<a name="L235"></a><tt class="py-lineno">235</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">compiled</tt><tt class="py-op">:</tt> </tt>
 
351
<a name="L236"></a><tt class="py-lineno">236</tt>  <tt class="py-line">        <tt id="link-85" class="py-name" targets="Function web2py.gluon.fileutils.tar_compiled()=web2py.gluon.fileutils-module.html#tar_compiled"><a title="web2py.gluon.fileutils.tar_compiled" class="py-name" href="#" onclick="return doclink('link-85', 'tar_compiled', 'link-85');">tar_compiled</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'^[\w\.\-]+$'</tt><tt class="py-op">)</tt> </tt>
 
352
<a name="L237"></a><tt class="py-lineno">237</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
353
<a name="L238"></a><tt class="py-lineno">238</tt>  <tt class="py-line">        <tt id="link-86" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-86', 'tar', 'link-72');">tar</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'^[\w\.\-]+$'</tt><tt class="py-op">)</tt> </tt>
 
354
<a name="L239"></a><tt class="py-lineno">239</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt> <tt class="py-op">=</tt> <tt class="py-name">gzopen</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
 
355
<a name="L240"></a><tt class="py-lineno">240</tt>  <tt class="py-line">    <tt class="py-name">tarfp</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
 
356
<a name="L241"></a><tt class="py-lineno">241</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt><tt class="py-op">.</tt><tt id="link-87" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
 
357
web2py.gluon.debug.Pipe.write
 
358
web2py.gluon.globals.Response.write
 
359
web2py.gluon.rocket.Connection.write
 
360
web2py.gluon.rocket.WSGIWorker.write
 
361
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-87', 'write', 'link-22');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">tarfp</tt><tt class="py-op">.</tt><tt id="link-88" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
 
362
web2py.gluon.debug.Pipe.read
 
363
web2py.gluon.languages.lazyT.read
 
364
web2py.gluon.rocket.ChunkedReader.read
 
365
web2py.gluon.rocket.Connection.read
 
366
web2py.gluon.rocket.LimitingFileWrapper.read
 
367
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-88', 'read', 'link-20');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
368
<a name="L242"></a><tt class="py-lineno">242</tt>  <tt class="py-line">    <tt class="py-name">w2pfp</tt><tt class="py-op">.</tt><tt id="link-89" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
369
web2py.gluon.dal.DatabaseStoredFile.close
 
370
web2py.gluon.dal.NoSQLAdapter.close
 
371
web2py.gluon.rocket.Connection.close
 
372
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-89', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
373
<a name="L243"></a><tt class="py-lineno">243</tt>  <tt class="py-line">    <tt class="py-name">tarfp</tt><tt class="py-op">.</tt><tt id="link-90" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
374
web2py.gluon.dal.DatabaseStoredFile.close
 
375
web2py.gluon.dal.NoSQLAdapter.close
 
376
web2py.gluon.rocket.Connection.close
 
377
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-90', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
378
<a name="L244"></a><tt class="py-lineno">244</tt>  <tt class="py-line">    <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">)</tt> </tt>
 
379
</div><a name="L245"></a><tt class="py-lineno">245</tt>  <tt class="py-line"> </tt>
 
380
<a name="w2p_unpack"></a><div id="w2p_unpack-def"><a name="L246"></a><tt class="py-lineno">246</tt> <a class="py-toggle" href="#" id="w2p_unpack-toggle" onclick="return toggle('w2p_unpack');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_unpack">w2p_unpack</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">delete_tar</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
381
</div><div id="w2p_unpack-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_unpack-expanded"><a name="L247"></a><tt class="py-lineno">247</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-91" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-91', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
 
382
<a name="L248"></a><tt class="py-lineno">248</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-92" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-92', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
383
<a name="L249"></a><tt class="py-lineno">249</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.w2p'</tt> <tt class="py-keyword">or</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">3</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.gz'</tt><tt class="py-op">:</tt> </tt>
 
384
<a name="L250"></a><tt class="py-lineno">250</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'.w2p'</tt><tt class="py-op">:</tt> </tt>
 
385
<a name="L251"></a><tt class="py-lineno">251</tt>  <tt class="py-line">            <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
 
386
<a name="L252"></a><tt class="py-lineno">252</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
387
<a name="L253"></a><tt class="py-lineno">253</tt>  <tt class="py-line">            <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">3</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'.tar'</tt> </tt>
 
388
<a name="L254"></a><tt class="py-lineno">254</tt>  <tt class="py-line">        <tt class="py-name">fgzipped</tt> <tt class="py-op">=</tt> <tt class="py-name">gzopen</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
 
389
<a name="L255"></a><tt class="py-lineno">255</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt> <tt class="py-op">=</tt> <tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
 
390
<a name="L256"></a><tt class="py-lineno">256</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt id="link-93" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
 
391
web2py.gluon.debug.Pipe.write
 
392
web2py.gluon.globals.Response.write
 
393
web2py.gluon.rocket.Connection.write
 
394
web2py.gluon.rocket.WSGIWorker.write
 
395
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-93', 'write', 'link-22');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">fgzipped</tt><tt class="py-op">.</tt><tt id="link-94" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
 
396
web2py.gluon.debug.Pipe.read
 
397
web2py.gluon.languages.lazyT.read
 
398
web2py.gluon.rocket.ChunkedReader.read
 
399
web2py.gluon.rocket.Connection.read
 
400
web2py.gluon.rocket.LimitingFileWrapper.read
 
401
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-94', 'read', 'link-20');">read</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
402
<a name="L257"></a><tt class="py-lineno">257</tt>  <tt class="py-line">        <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt id="link-95" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
403
web2py.gluon.dal.DatabaseStoredFile.close
 
404
web2py.gluon.dal.NoSQLAdapter.close
 
405
web2py.gluon.rocket.Connection.close
 
406
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-95', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
407
<a name="L258"></a><tt class="py-lineno">258</tt>  <tt class="py-line">        <tt class="py-name">fgzipped</tt><tt class="py-op">.</tt><tt id="link-96" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
408
web2py.gluon.dal.DatabaseStoredFile.close
 
409
web2py.gluon.dal.NoSQLAdapter.close
 
410
web2py.gluon.rocket.Connection.close
 
411
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-96', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
412
<a name="L259"></a><tt class="py-lineno">259</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
413
<a name="L260"></a><tt class="py-lineno">260</tt>  <tt class="py-line">        <tt class="py-name">tarname</tt> <tt class="py-op">=</tt> <tt class="py-name">filename</tt> </tt>
 
414
<a name="L261"></a><tt class="py-lineno">261</tt>  <tt class="py-line">    <tt id="link-97" class="py-name" targets="Function web2py.gluon.fileutils.untar()=web2py.gluon.fileutils-module.html#untar"><a title="web2py.gluon.fileutils.untar" class="py-name" href="#" onclick="return doclink('link-97', 'untar', 'link-97');">untar</a></tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">,</tt> <tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
415
<a name="L262"></a><tt class="py-lineno">262</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">delete_tar</tt><tt class="py-op">:</tt> </tt>
 
416
<a name="L263"></a><tt class="py-lineno">263</tt>  <tt class="py-line">        <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">unlink</tt><tt class="py-op">(</tt><tt class="py-name">tarname</tt><tt class="py-op">)</tt> </tt>
 
417
</div><a name="L264"></a><tt class="py-lineno">264</tt>  <tt class="py-line"> </tt>
 
418
<a name="L265"></a><tt class="py-lineno">265</tt>  <tt class="py-line"> </tt>
 
419
<a name="w2p_pack_plugin"></a><div id="w2p_pack_plugin-def"><a name="L266"></a><tt class="py-lineno">266</tt> <a class="py-toggle" href="#" id="w2p_pack_plugin-toggle" onclick="return toggle('w2p_pack_plugin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_pack_plugin">w2p_pack_plugin</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
420
</div><div id="w2p_pack_plugin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_pack_plugin-expanded"><a name="L267"></a><tt class="py-lineno">267</tt>  <tt class="py-line">    <tt class="py-docstring">"""Pack the given plugin into a w2p file.</tt> </tt>
 
421
<a name="L268"></a><tt class="py-lineno">268</tt>  <tt class="py-line"><tt class="py-docstring">    Will match files at:</tt> </tt>
 
422
<a name="L269"></a><tt class="py-lineno">269</tt>  <tt class="py-line"><tt class="py-docstring">        &lt;path&gt;/*/plugin_[name].*</tt> </tt>
 
423
<a name="L270"></a><tt class="py-lineno">270</tt>  <tt class="py-line"><tt class="py-docstring">        &lt;path&gt;/*/plugin_[name]/*</tt> </tt>
 
424
<a name="L271"></a><tt class="py-lineno">271</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
425
<a name="L272"></a><tt class="py-lineno">272</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-98" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-98', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
 
426
<a name="L273"></a><tt class="py-lineno">273</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-99" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-99', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
427
<a name="L274"></a><tt class="py-lineno">274</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">filename</tt><tt class="py-op">.</tt><tt id="link-100" class="py-name" targets="Method web2py.gluon.dal.Expression.endswith()=web2py.gluon.dal.Expression-class.html#endswith"><a title="web2py.gluon.dal.Expression.endswith" class="py-name" href="#" onclick="return doclink('link-100', 'endswith', 'link-100');">endswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'web2py.plugin.%s.w2p'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
428
<a name="L275"></a><tt class="py-lineno">275</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt id="link-101" class="py-name" targets="Class exceptions.Exception=exceptions.Exception-class.html"><a title="exceptions.Exception" class="py-name" href="#" onclick="return doclink('link-101', 'Exception', 'link-101');">Exception</a></tt><tt class="py-op">,</tt> <tt class="py-string">"Not a web2py plugin name"</tt> </tt>
 
429
<a name="L276"></a><tt class="py-lineno">276</tt>  <tt class="py-line">    <tt class="py-name">plugin_tarball</tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">open</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'w:gz'</tt><tt class="py-op">)</tt> </tt>
 
430
<a name="L277"></a><tt class="py-lineno">277</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
431
<a name="L278"></a><tt class="py-lineno">278</tt>  <tt class="py-line">        <tt class="py-name">app_dir</tt> <tt class="py-op">=</tt> <tt class="py-name">path</tt> </tt>
 
432
<a name="L279"></a><tt class="py-lineno">279</tt>  <tt class="py-line">        <tt class="py-keyword">while</tt> <tt class="py-name">app_dir</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">==</tt><tt class="py-string">'/'</tt><tt class="py-op">:</tt> </tt>
 
433
<a name="L280"></a><tt class="py-lineno">280</tt>  <tt class="py-line">            <tt class="py-name">app_dir</tt> <tt class="py-op">=</tt> <tt class="py-name">app_dir</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-op">-</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
 
434
<a name="L281"></a><tt class="py-lineno">281</tt>  <tt class="py-line">        <tt class="py-name">files1</tt><tt class="py-op">=</tt><tt class="py-name">glob</tt><tt class="py-op">.</tt><tt class="py-name">glob</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-102" class="py-name"><a title="web2py.gluon.html.join
 
435
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-102', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">,</tt><tt class="py-string">'*/plugin_%s.*'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
436
<a name="L282"></a><tt class="py-lineno">282</tt>  <tt class="py-line">        <tt class="py-name">files2</tt><tt class="py-op">=</tt><tt class="py-name">glob</tt><tt class="py-op">.</tt><tt class="py-name">glob</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-103" class="py-name"><a title="web2py.gluon.html.join
 
437
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-103', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">,</tt><tt class="py-string">'*/plugin_%s/*'</tt> <tt class="py-op">%</tt> <tt class="py-name">plugin_name</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
438
<a name="L283"></a><tt class="py-lineno">283</tt>  <tt class="py-line">        <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt class="py-name">files1</tt><tt class="py-op">+</tt><tt class="py-name">files2</tt><tt class="py-op">:</tt> </tt>
 
439
<a name="L284"></a><tt class="py-lineno">284</tt>  <tt class="py-line">            <tt class="py-name">plugin_tarball</tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">arcname</tt><tt class="py-op">=</tt><tt class="py-name">file</tt><tt class="py-op">[</tt><tt id="link-104" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-104', 'len', 'link-36');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">app_dir</tt><tt class="py-op">)</tt><tt class="py-op">+</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
 
440
<a name="L285"></a><tt class="py-lineno">285</tt>  <tt class="py-line">    <tt class="py-keyword">finally</tt><tt class="py-op">:</tt> </tt>
 
441
<a name="L286"></a><tt class="py-lineno">286</tt>  <tt class="py-line">        <tt class="py-name">plugin_tarball</tt><tt class="py-op">.</tt><tt id="link-105" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
442
web2py.gluon.dal.DatabaseStoredFile.close
 
443
web2py.gluon.dal.NoSQLAdapter.close
 
444
web2py.gluon.rocket.Connection.close
 
445
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-105', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
446
</div><a name="L287"></a><tt class="py-lineno">287</tt>  <tt class="py-line"> </tt>
 
447
<a name="L288"></a><tt class="py-lineno">288</tt>  <tt class="py-line"> </tt>
 
448
<a name="w2p_unpack_plugin"></a><div id="w2p_unpack_plugin-def"><a name="L289"></a><tt class="py-lineno">289</tt> <a class="py-toggle" href="#" id="w2p_unpack_plugin-toggle" onclick="return toggle('w2p_unpack_plugin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#w2p_unpack_plugin">w2p_unpack_plugin</a><tt class="py-op">(</tt><tt class="py-param">filename</tt><tt class="py-op">,</tt> <tt class="py-param">path</tt><tt class="py-op">,</tt> <tt class="py-param">delete_tar</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
449
</div><div id="w2p_unpack_plugin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="w2p_unpack_plugin-expanded"><a name="L290"></a><tt class="py-lineno">290</tt>  <tt class="py-line">    <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt id="link-106" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-106', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> </tt>
 
450
<a name="L291"></a><tt class="py-lineno">291</tt>  <tt class="py-line">    <tt class="py-name">path</tt> <tt class="py-op">=</tt> <tt id="link-107" class="py-name"><a title="web2py.gluon.fileutils.abspath" class="py-name" href="#" onclick="return doclink('link-107', 'abspath', 'link-83');">abspath</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt> </tt>
 
451
<a name="L292"></a><tt class="py-lineno">292</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">basename</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt id="link-108" class="py-name"><a title="web2py.gluon.dal.Expression.startswith
 
452
web2py.gluon.dal.SQLCustomType.startswith" class="py-name" href="#" onclick="return doclink('link-108', 'startswith', 'link-42');">startswith</a></tt><tt class="py-op">(</tt><tt class="py-string">'web2py.plugin.'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
453
<a name="L293"></a><tt class="py-lineno">293</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt id="link-109" class="py-name"><a title="exceptions.Exception" class="py-name" href="#" onclick="return doclink('link-109', 'Exception', 'link-101');">Exception</a></tt><tt class="py-op">,</tt> <tt class="py-string">"Not a web2py plugin"</tt> </tt>
 
454
<a name="L294"></a><tt class="py-lineno">294</tt>  <tt class="py-line">    <tt id="link-110" class="py-name" targets="Function web2py.gluon.fileutils.w2p_unpack()=web2py.gluon.fileutils-module.html#w2p_unpack"><a title="web2py.gluon.fileutils.w2p_unpack" class="py-name" href="#" onclick="return doclink('link-110', 'w2p_unpack', 'link-110');">w2p_unpack</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt><tt class="py-name">path</tt><tt class="py-op">,</tt><tt class="py-name">delete_tar</tt><tt class="py-op">)</tt> </tt>
 
455
</div><a name="L295"></a><tt class="py-lineno">295</tt>  <tt class="py-line"> </tt>
 
456
<a name="L296"></a><tt class="py-lineno">296</tt>  <tt class="py-line"> </tt>
 
457
<a name="tar_compiled"></a><div id="tar_compiled-def"><a name="L297"></a><tt class="py-lineno">297</tt> <a class="py-toggle" href="#" id="tar_compiled-toggle" onclick="return toggle('tar_compiled');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#tar_compiled">tar_compiled</a><tt class="py-op">(</tt><tt class="py-param">file</tt><tt class="py-op">,</tt> <tt class="py-param">dir</tt><tt class="py-op">,</tt> <tt class="py-param">expression</tt><tt class="py-op">=</tt><tt class="py-string">'^.+$'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
458
</div><div id="tar_compiled-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="tar_compiled-expanded"><a name="L298"></a><tt class="py-lineno">298</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
459
<a name="L299"></a><tt class="py-lineno">299</tt>  <tt class="py-line"><tt class="py-docstring">    used to tar a compiled application.</tt> </tt>
 
460
<a name="L300"></a><tt class="py-lineno">300</tt>  <tt class="py-line"><tt class="py-docstring">    the content of models, views, controllers is not stored in the tar file.</tt> </tt>
 
461
<a name="L301"></a><tt class="py-lineno">301</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
462
<a name="L302"></a><tt class="py-lineno">302</tt>  <tt class="py-line"> </tt>
 
463
<a name="L303"></a><tt class="py-lineno">303</tt>  <tt class="py-line">    <tt id="link-111" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-111', 'tar', 'link-72');">tar</a></tt> <tt class="py-op">=</tt> <tt class="py-name">tarfile</tt><tt class="py-op">.</tt><tt class="py-name">TarFile</tt><tt class="py-op">(</tt><tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-string">'w'</tt><tt class="py-op">)</tt> </tt>
 
464
<a name="L304"></a><tt class="py-lineno">304</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-name">file</tt> <tt class="py-keyword">in</tt> <tt id="link-112" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-112', 'listdir', 'link-54');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">expression</tt><tt class="py-op">,</tt> <tt class="py-name">add_dirs</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
465
<a name="L305"></a><tt class="py-lineno">305</tt>  <tt class="py-line">        <tt class="py-name">filename</tt> <tt class="py-op">=</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-113" class="py-name"><a title="web2py.gluon.html.join
 
466
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-113', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt><tt class="py-name">dir</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">)</tt> </tt>
 
467
<a name="L306"></a><tt class="py-lineno">306</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">islink</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
468
<a name="L307"></a><tt class="py-lineno">307</tt>  <tt class="py-line">            <tt class="py-keyword">continue</tt> </tt>
 
469
<a name="L308"></a><tt class="py-lineno">308</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">isfile</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">)</tt> <tt class="py-keyword">and</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">-</tt><tt class="py-number">4</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-op">!=</tt> <tt class="py-string">'.pyc'</tt><tt class="py-op">:</tt> </tt>
 
470
<a name="L309"></a><tt class="py-lineno">309</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'models'</tt><tt class="py-op">:</tt> </tt>
 
471
<a name="L310"></a><tt class="py-lineno">310</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
 
472
<a name="L311"></a><tt class="py-lineno">311</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">5</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'views'</tt><tt class="py-op">:</tt> </tt>
 
473
<a name="L312"></a><tt class="py-lineno">312</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
 
474
<a name="L313"></a><tt class="py-lineno">313</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">11</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'controllers'</tt><tt class="py-op">:</tt> </tt>
 
475
<a name="L314"></a><tt class="py-lineno">314</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
 
476
<a name="L315"></a><tt class="py-lineno">315</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">file</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-number">7</tt><tt class="py-op">]</tt> <tt class="py-op">==</tt> <tt class="py-string">'modules'</tt><tt class="py-op">:</tt> </tt>
 
477
<a name="L316"></a><tt class="py-lineno">316</tt>  <tt class="py-line">                <tt class="py-keyword">continue</tt> </tt>
 
478
<a name="L317"></a><tt class="py-lineno">317</tt>  <tt class="py-line">        <tt id="link-114" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-114', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt class="py-name">add</tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">file</tt><tt class="py-op">,</tt> <tt class="py-name">False</tt><tt class="py-op">)</tt> </tt>
 
479
<a name="L318"></a><tt class="py-lineno">318</tt>  <tt class="py-line">    <tt id="link-115" class="py-name"><a title="web2py.gluon.fileutils.tar" class="py-name" href="#" onclick="return doclink('link-115', 'tar', 'link-72');">tar</a></tt><tt class="py-op">.</tt><tt id="link-116" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.close
 
480
web2py.gluon.dal.DatabaseStoredFile.close
 
481
web2py.gluon.dal.NoSQLAdapter.close
 
482
web2py.gluon.rocket.Connection.close
 
483
web2py.gluon.rocket.FileLikeSocket.close" class="py-name" href="#" onclick="return doclink('link-116', 'close', 'link-21');">close</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
484
</div><a name="L319"></a><tt class="py-lineno">319</tt>  <tt class="py-line"> </tt>
 
485
<a name="up"></a><div id="up-def"><a name="L320"></a><tt class="py-lineno">320</tt> <a class="py-toggle" href="#" id="up-toggle" onclick="return toggle('up');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#up">up</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
486
</div><div id="up-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="up-expanded"><a name="L321"></a><tt class="py-lineno">321</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">dirname</tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt class="py-name">normpath</tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
487
</div><a name="L322"></a><tt class="py-lineno">322</tt>  <tt class="py-line"> </tt>
 
488
<a name="L323"></a><tt class="py-lineno">323</tt>  <tt class="py-line"> </tt>
 
489
<a name="get_session"></a><div id="get_session-def"><a name="L324"></a><tt class="py-lineno">324</tt> <a class="py-toggle" href="#" id="get_session-toggle" onclick="return toggle('get_session');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#get_session">get_session</a><tt class="py-op">(</tt><tt class="py-param">request</tt><tt class="py-op">,</tt> <tt class="py-param">other_application</tt><tt class="py-op">=</tt><tt class="py-string">'admin'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
490
</div><div id="get_session-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="get_session-expanded"><a name="L325"></a><tt class="py-lineno">325</tt>  <tt class="py-line">    <tt class="py-docstring">""" checks that user is authorized to access other_application"""</tt> </tt>
 
491
<a name="L326"></a><tt class="py-lineno">326</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">application</tt> <tt class="py-op">==</tt> <tt class="py-name">other_application</tt><tt class="py-op">:</tt> </tt>
 
492
<a name="L327"></a><tt class="py-lineno">327</tt>  <tt class="py-line">        <tt class="py-keyword">raise</tt> <tt class="py-name">KeyError</tt> </tt>
 
493
<a name="L328"></a><tt class="py-lineno">328</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
 
494
<a name="L329"></a><tt class="py-lineno">329</tt>  <tt class="py-line">        <tt class="py-name">session_id</tt> <tt class="py-op">=</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">cookies</tt><tt class="py-op">[</tt><tt class="py-string">'session_id_'</tt> <tt class="py-op">+</tt> <tt class="py-name">other_application</tt><tt class="py-op">]</tt><tt class="py-op">.</tt><tt class="py-name">value</tt> </tt>
 
495
<a name="L330"></a><tt class="py-lineno">330</tt>  <tt class="py-line">        <tt class="py-name">osession</tt> <tt class="py-op">=</tt> <tt id="link-117" class="py-name"><a title="web2py.gluon.storage" class="py-name" href="#" onclick="return doclink('link-117', 'storage', 'link-0');">storage</a></tt><tt class="py-op">.</tt><tt id="link-118" class="py-name" targets="Function web2py.gluon.storage.load_storage()=web2py.gluon.storage-module.html#load_storage"><a title="web2py.gluon.storage.load_storage" class="py-name" href="#" onclick="return doclink('link-118', 'load_storage', 'link-118');">load_storage</a></tt><tt class="py-op">(</tt><tt class="py-name">os</tt><tt class="py-op">.</tt><tt class="py-name">path</tt><tt class="py-op">.</tt><tt id="link-119" class="py-name"><a title="web2py.gluon.html.join
 
496
web2py.gluon.rocket.Listener.join" class="py-name" href="#" onclick="return doclink('link-119', 'join', 'link-25');">join</a></tt><tt class="py-op">(</tt> </tt>
 
497
<a name="L331"></a><tt class="py-lineno">331</tt>  <tt class="py-line">                <tt id="link-120" class="py-name" targets="Function web2py.gluon.fileutils.up()=web2py.gluon.fileutils-module.html#up"><a title="web2py.gluon.fileutils.up" class="py-name" href="#" onclick="return doclink('link-120', 'up', 'link-120');">up</a></tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">.</tt><tt class="py-name">folder</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">other_application</tt><tt class="py-op">,</tt> <tt class="py-string">'sessions'</tt><tt class="py-op">,</tt> <tt class="py-name">session_id</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
 
498
<a name="L332"></a><tt class="py-lineno">332</tt>  <tt class="py-line">    <tt class="py-keyword">except</tt><tt class="py-op">:</tt> </tt>
 
499
<a name="L333"></a><tt class="py-lineno">333</tt>  <tt class="py-line">        <tt class="py-name">osession</tt> <tt class="py-op">=</tt> <tt id="link-121" class="py-name"><a title="web2py.gluon.storage" class="py-name" href="#" onclick="return doclink('link-121', 'storage', 'link-0');">storage</a></tt><tt class="py-op">.</tt><tt id="link-122" class="py-name" targets="Class web2py.gluon.storage.Storage=web2py.gluon.storage.Storage-class.html"><a title="web2py.gluon.storage.Storage" class="py-name" href="#" onclick="return doclink('link-122', 'Storage', 'link-122');">Storage</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
500
<a name="L334"></a><tt class="py-lineno">334</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">osession</tt> </tt>
 
501
</div><a name="L335"></a><tt class="py-lineno">335</tt>  <tt class="py-line"> </tt>
 
502
<a name="L336"></a><tt class="py-lineno">336</tt>  <tt class="py-line"> </tt>
 
503
<a name="check_credentials"></a><div id="check_credentials-def"><a name="L337"></a><tt class="py-lineno">337</tt> <a class="py-toggle" href="#" id="check_credentials-toggle" onclick="return toggle('check_credentials');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#check_credentials">check_credentials</a><tt class="py-op">(</tt><tt class="py-param">request</tt><tt class="py-op">,</tt> <tt class="py-param">other_application</tt><tt class="py-op">=</tt><tt class="py-string">'admin'</tt><tt class="py-op">,</tt> <tt class="py-param">expiration</tt> <tt class="py-op">=</tt> <tt class="py-number">60</tt><tt class="py-op">*</tt><tt class="py-number">60</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
504
</div><div id="check_credentials-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="check_credentials-expanded"><a name="L338"></a><tt class="py-lineno">338</tt>  <tt class="py-line">    <tt class="py-docstring">""" checks that user is authorized to access other_application"""</tt> </tt>
 
505
<a name="L339"></a><tt class="py-lineno">339</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-name">request</tt><tt class="py-op">.</tt><tt id="link-123" class="py-name" targets="Function web2py.gluon.shell.env()=web2py.gluon.shell-module.html#env"><a title="web2py.gluon.shell.env" class="py-name" href="#" onclick="return doclink('link-123', 'env', 'link-123');">env</a></tt><tt class="py-op">.</tt><tt class="py-name">web2py_runtime_gae</tt><tt class="py-op">:</tt> </tt>
 
506
<a name="L340"></a><tt class="py-lineno">340</tt>  <tt class="py-line">        <tt class="py-keyword">from</tt> <tt class="py-name">google</tt><tt class="py-op">.</tt><tt class="py-name">appengine</tt><tt class="py-op">.</tt><tt class="py-name">api</tt> <tt class="py-keyword">import</tt> <tt class="py-name">users</tt> </tt>
 
507
<a name="L341"></a><tt class="py-lineno">341</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">users</tt><tt class="py-op">.</tt><tt class="py-name">is_current_user_admin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
508
<a name="L342"></a><tt class="py-lineno">342</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">True</tt> </tt>
 
509
<a name="L343"></a><tt class="py-lineno">343</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
510
<a name="L344"></a><tt class="py-lineno">344</tt>  <tt class="py-line">            <tt class="py-name">login_html</tt> <tt class="py-op">=</tt> <tt class="py-string">'&lt;a href="%s"&gt;Sign in with your google account&lt;/a&gt;.'</tt> \ </tt>
 
511
<a name="L345"></a><tt class="py-lineno">345</tt>  <tt class="py-line">                <tt class="py-op">%</tt> <tt class="py-name">users</tt><tt class="py-op">.</tt><tt class="py-name">create_login_url</tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">.</tt><tt id="link-124" class="py-name"><a title="web2py.gluon.shell.env" class="py-name" href="#" onclick="return doclink('link-124', 'env', 'link-123');">env</a></tt><tt class="py-op">.</tt><tt class="py-name">path_info</tt><tt class="py-op">)</tt> </tt>
 
512
<a name="L346"></a><tt class="py-lineno">346</tt>  <tt class="py-line">            <tt class="py-keyword">raise</tt> <tt id="link-125" class="py-name"><a title="web2py.gluon.http.HTTP" class="py-name" href="#" onclick="return doclink('link-125', 'HTTP', 'link-4');">HTTP</a></tt><tt class="py-op">(</tt><tt class="py-number">200</tt><tt class="py-op">,</tt> <tt class="py-string">'&lt;html&gt;&lt;body&gt;%s&lt;/body&gt;&lt;/html&gt;'</tt> <tt class="py-op">%</tt> <tt class="py-name">login_html</tt><tt class="py-op">)</tt> </tt>
 
513
<a name="L347"></a><tt class="py-lineno">347</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
514
<a name="L348"></a><tt class="py-lineno">348</tt>  <tt class="py-line">        <tt class="py-name">dt</tt> <tt class="py-op">=</tt> <tt id="link-126" class="py-name"><a title="datetime.time" class="py-name" href="#" onclick="return doclink('link-126', 'time', 'link-1');">time</a></tt><tt class="py-op">.</tt><tt id="link-127" class="py-name"><a title="datetime.time" class="py-name" href="#" onclick="return doclink('link-127', 'time', 'link-1');">time</a></tt><tt class="py-op">(</tt><tt class="py-op">)</tt> <tt class="py-op">-</tt> <tt class="py-name">expiration</tt> </tt>
 
515
<a name="L349"></a><tt class="py-lineno">349</tt>  <tt class="py-line">        <tt id="link-128" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-128', 's', 'link-13');">s</a></tt> <tt class="py-op">=</tt> <tt id="link-129" class="py-name" targets="Function web2py.gluon.fileutils.get_session()=web2py.gluon.fileutils-module.html#get_session"><a title="web2py.gluon.fileutils.get_session" class="py-name" href="#" onclick="return doclink('link-129', 'get_session', 'link-129');">get_session</a></tt><tt class="py-op">(</tt><tt class="py-name">request</tt><tt class="py-op">,</tt> <tt class="py-name">other_application</tt><tt class="py-op">)</tt> </tt>
 
516
<a name="L350"></a><tt class="py-lineno">350</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-op">(</tt><tt id="link-130" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-130', 's', 'link-13');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">authorized</tt> <tt class="py-keyword">and</tt> <tt id="link-131" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-131', 's', 'link-13');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">last_time</tt> <tt class="py-keyword">and</tt> <tt id="link-132" class="py-name"><a title="web2py.gluon.languages.lazyT.s" class="py-name" href="#" onclick="return doclink('link-132', 's', 'link-13');">s</a></tt><tt class="py-op">.</tt><tt class="py-name">last_time</tt> <tt class="py-op">&gt;</tt> <tt class="py-name">dt</tt><tt class="py-op">)</tt> </tt>
 
517
</div><a name="L351"></a><tt class="py-lineno">351</tt>  <tt class="py-line"> </tt>
 
518
<a name="L352"></a><tt class="py-lineno">352</tt>  <tt class="py-line"> </tt>
 
519
<a name="fix_newlines"></a><div id="fix_newlines-def"><a name="L353"></a><tt class="py-lineno">353</tt> <a class="py-toggle" href="#" id="fix_newlines-toggle" onclick="return toggle('fix_newlines');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#fix_newlines">fix_newlines</a><tt class="py-op">(</tt><tt class="py-param">path</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
520
</div><div id="fix_newlines-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="fix_newlines-expanded"><a name="L354"></a><tt class="py-lineno">354</tt>  <tt class="py-line">    <tt id="link-133" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
 
521
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-133', 'regex', 'link-37');">regex</a></tt> <tt class="py-op">=</tt> <tt class="py-name">re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">r'''(\r</tt> </tt>
 
522
<a name="L355"></a><tt class="py-lineno">355</tt>  <tt class="py-line"><tt class="py-string">|\r|</tt> </tt>
 
523
<a name="L356"></a><tt class="py-lineno">356</tt>  <tt class="py-line"><tt class="py-string">)'''</tt><tt class="py-op">)</tt> </tt>
 
524
<a name="L357"></a><tt class="py-lineno">357</tt>  <tt class="py-line">    <tt class="py-keyword">for</tt> <tt class="py-name">filename</tt> <tt class="py-keyword">in</tt> <tt id="link-134" class="py-name"><a title="web2py.gluon.fileutils.listdir" class="py-name" href="#" onclick="return doclink('link-134', 'listdir', 'link-54');">listdir</a></tt><tt class="py-op">(</tt><tt class="py-name">path</tt><tt class="py-op">,</tt> <tt class="py-string">'.*\.(py|html)$'</tt><tt class="py-op">,</tt> <tt id="link-135" class="py-name"><a title="web2py.gluon.dal.BaseAdapter.drop
481
525
web2py.gluon.dal.NoSQLAdapter.drop
482
 
web2py.gluon.dal.Table.drop" class="py-name" href="#" onclick="return doclink('link-131', 'drop', 'link-21');">drop</a></tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
483
 
<a name="L348"></a><tt class="py-lineno">348</tt>  <tt class="py-line">        <tt class="py-name">rdata</tt> <tt class="py-op">=</tt> <tt id="link-132" class="py-name"><a title="web2py.gluon.fileutils.read_file" class="py-name" href="#" onclick="return doclink('link-132', 'read_file', 'link-10');">read_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
484
 
<a name="L349"></a><tt class="py-lineno">349</tt>  <tt class="py-line">        <tt class="py-name">wdata</tt> <tt class="py-op">=</tt> <tt id="link-133" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
485
 
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-133', 'regex', 'link-23');">regex</a></tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">,</tt> <tt class="py-name">rdata</tt><tt class="py-op">)</tt> </tt>
486
 
<a name="L350"></a><tt class="py-lineno">350</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">wdata</tt> <tt class="py-op">!=</tt> <tt class="py-name">rdata</tt><tt class="py-op">:</tt> </tt>
487
 
<a name="L351"></a><tt class="py-lineno">351</tt>  <tt class="py-line">            <tt id="link-134" class="py-name" targets="Function web2py.gluon.fileutils.write_file()=web2py.gluon.fileutils-module.html#write_file"><a title="web2py.gluon.fileutils.write_file" class="py-name" href="#" onclick="return doclink('link-134', 'write_file', 'link-134');">write_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">wdata</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
488
 
</div><a name="L352"></a><tt class="py-lineno">352</tt>  <tt class="py-line"> </tt>
489
 
<a name="copystream"></a><div id="copystream-def"><a name="L353"></a><tt class="py-lineno">353</tt> <a class="py-toggle" href="#" id="copystream-toggle" onclick="return toggle('copystream');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#copystream">copystream</a><tt class="py-op">(</tt> </tt>
490
 
<a name="L354"></a><tt class="py-lineno">354</tt>  <tt class="py-line">    <tt class="py-param">src</tt><tt class="py-op">,</tt> </tt>
491
 
<a name="L355"></a><tt class="py-lineno">355</tt>  <tt class="py-line">    <tt class="py-param">dest</tt><tt class="py-op">,</tt> </tt>
492
 
<a name="L356"></a><tt class="py-lineno">356</tt>  <tt class="py-line">    <tt class="py-param">size</tt><tt class="py-op">,</tt> </tt>
493
 
<a name="L357"></a><tt class="py-lineno">357</tt>  <tt class="py-line">    <tt class="py-param">chunk_size</tt><tt class="py-op">=</tt><tt class="py-number">10</tt> <tt class="py-op">**</tt> <tt class="py-number">5</tt><tt class="py-op">,</tt> </tt>
494
 
<a name="L358"></a><tt class="py-lineno">358</tt>  <tt class="py-line">    <tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
495
 
</div><div id="copystream-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="copystream-expanded"><a name="L359"></a><tt class="py-lineno">359</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
496
 
<a name="L360"></a><tt class="py-lineno">360</tt>  <tt class="py-line"><tt class="py-docstring">    this is here because I think there is a bug in shutil.copyfileobj</tt> </tt>
497
 
<a name="L361"></a><tt class="py-lineno">361</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
498
 
<a name="L362"></a><tt class="py-lineno">362</tt>  <tt class="py-line">    <tt class="py-keyword">while</tt> <tt class="py-name">size</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
499
 
<a name="L363"></a><tt class="py-lineno">363</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">size</tt> <tt class="py-op">&lt;</tt> <tt class="py-name">chunk_size</tt><tt class="py-op">:</tt> </tt>
500
 
<a name="L364"></a><tt class="py-lineno">364</tt>  <tt class="py-line">            <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">src</tt><tt class="py-op">.</tt><tt id="link-135" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
501
 
web2py.gluon.debug.Pipe.read
502
 
web2py.gluon.languages.lazyT.read
503
 
web2py.gluon.rocket.ChunkedReader.read
504
 
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-135', 'read', 'link-6');">read</a></tt><tt class="py-op">(</tt><tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
505
 
<a name="L365"></a><tt class="py-lineno">365</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
506
 
<a name="L366"></a><tt class="py-lineno">366</tt>  <tt class="py-line">            <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">src</tt><tt class="py-op">.</tt><tt id="link-136" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
507
 
web2py.gluon.debug.Pipe.read
508
 
web2py.gluon.languages.lazyT.read
509
 
web2py.gluon.rocket.ChunkedReader.read
510
 
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-136', 'read', 'link-6');">read</a></tt><tt class="py-op">(</tt><tt class="py-name">chunk_size</tt><tt class="py-op">)</tt> </tt>
511
 
<a name="L367"></a><tt class="py-lineno">367</tt>  <tt class="py-line">        <tt class="py-name">length</tt> <tt class="py-op">=</tt> <tt id="link-137" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-137', 'len', 'link-22');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">)</tt> </tt>
512
 
<a name="L368"></a><tt class="py-lineno">368</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">&gt;</tt> <tt class="py-name">size</tt><tt class="py-op">:</tt> </tt>
513
 
<a name="L369"></a><tt class="py-lineno">369</tt>  <tt class="py-line">            <tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">,</tt> <tt class="py-name">length</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-name">size</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
514
 
<a name="L370"></a><tt class="py-lineno">370</tt>  <tt class="py-line">        <tt class="py-name">size</tt> <tt class="py-op">-=</tt> <tt class="py-name">length</tt> </tt>
515
 
<a name="L371"></a><tt class="py-lineno">371</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
516
 
<a name="L372"></a><tt class="py-lineno">372</tt>  <tt class="py-line">            <tt class="py-keyword">break</tt> </tt>
517
 
<a name="L373"></a><tt class="py-lineno">373</tt>  <tt class="py-line">        <tt class="py-name">dest</tt><tt class="py-op">.</tt><tt id="link-138" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
 
526
web2py.gluon.dal.Table.drop" class="py-name" href="#" onclick="return doclink('link-135', 'drop', 'link-35');">drop</a></tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
527
<a name="L358"></a><tt class="py-lineno">358</tt>  <tt class="py-line">        <tt class="py-name">rdata</tt> <tt class="py-op">=</tt> <tt id="link-136" class="py-name"><a title="web2py.gluon.fileutils.read_file" class="py-name" href="#" onclick="return doclink('link-136', 'read_file', 'link-24');">read_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-string">'rb'</tt><tt class="py-op">)</tt> </tt>
 
528
<a name="L359"></a><tt class="py-lineno">359</tt>  <tt class="py-line">        <tt class="py-name">wdata</tt> <tt class="py-op">=</tt> <tt id="link-137" class="py-name"><a title="web2py.gluon.validators.IS_EMAIL.regex
 
529
web2py.gluon.validators.IS_IPV4.regex" class="py-name" href="#" onclick="return doclink('link-137', 'regex', 'link-37');">regex</a></tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-string">'\n'</tt><tt class="py-op">,</tt> <tt class="py-name">rdata</tt><tt class="py-op">)</tt> </tt>
 
530
<a name="L360"></a><tt class="py-lineno">360</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">wdata</tt> <tt class="py-op">!=</tt> <tt class="py-name">rdata</tt><tt class="py-op">:</tt> </tt>
 
531
<a name="L361"></a><tt class="py-lineno">361</tt>  <tt class="py-line">            <tt id="link-138" class="py-name" targets="Function web2py.gluon.fileutils.write_file()=web2py.gluon.fileutils-module.html#write_file"><a title="web2py.gluon.fileutils.write_file" class="py-name" href="#" onclick="return doclink('link-138', 'write_file', 'link-138');">write_file</a></tt><tt class="py-op">(</tt><tt class="py-name">filename</tt><tt class="py-op">,</tt> <tt class="py-name">wdata</tt><tt class="py-op">,</tt> <tt class="py-string">'wb'</tt><tt class="py-op">)</tt> </tt>
 
532
</div><a name="L362"></a><tt class="py-lineno">362</tt>  <tt class="py-line"> </tt>
 
533
<a name="copystream"></a><div id="copystream-def"><a name="L363"></a><tt class="py-lineno">363</tt> <a class="py-toggle" href="#" id="copystream-toggle" onclick="return toggle('copystream');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#copystream">copystream</a><tt class="py-op">(</tt> </tt>
 
534
<a name="L364"></a><tt class="py-lineno">364</tt>  <tt class="py-line">    <tt class="py-param">src</tt><tt class="py-op">,</tt> </tt>
 
535
<a name="L365"></a><tt class="py-lineno">365</tt>  <tt class="py-line">    <tt class="py-param">dest</tt><tt class="py-op">,</tt> </tt>
 
536
<a name="L366"></a><tt class="py-lineno">366</tt>  <tt class="py-line">    <tt class="py-param">size</tt><tt class="py-op">,</tt> </tt>
 
537
<a name="L367"></a><tt class="py-lineno">367</tt>  <tt class="py-line">    <tt class="py-param">chunk_size</tt><tt class="py-op">=</tt><tt class="py-number">10</tt> <tt class="py-op">**</tt> <tt class="py-number">5</tt><tt class="py-op">,</tt> </tt>
 
538
<a name="L368"></a><tt class="py-lineno">368</tt>  <tt class="py-line">    <tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
539
</div><div id="copystream-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="copystream-expanded"><a name="L369"></a><tt class="py-lineno">369</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
 
540
<a name="L370"></a><tt class="py-lineno">370</tt>  <tt class="py-line"><tt class="py-docstring">    this is here because I think there is a bug in shutil.copyfileobj</tt> </tt>
 
541
<a name="L371"></a><tt class="py-lineno">371</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
 
542
<a name="L372"></a><tt class="py-lineno">372</tt>  <tt class="py-line">    <tt class="py-keyword">while</tt> <tt class="py-name">size</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
 
543
<a name="L373"></a><tt class="py-lineno">373</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">size</tt> <tt class="py-op">&lt;</tt> <tt class="py-name">chunk_size</tt><tt class="py-op">:</tt> </tt>
 
544
<a name="L374"></a><tt class="py-lineno">374</tt>  <tt class="py-line">            <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">src</tt><tt class="py-op">.</tt><tt id="link-139" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
 
545
web2py.gluon.debug.Pipe.read
 
546
web2py.gluon.languages.lazyT.read
 
547
web2py.gluon.rocket.ChunkedReader.read
 
548
web2py.gluon.rocket.Connection.read
 
549
web2py.gluon.rocket.LimitingFileWrapper.read
 
550
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-139', 'read', 'link-20');">read</a></tt><tt class="py-op">(</tt><tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
 
551
<a name="L375"></a><tt class="py-lineno">375</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
 
552
<a name="L376"></a><tt class="py-lineno">376</tt>  <tt class="py-line">            <tt class="py-name">data</tt> <tt class="py-op">=</tt> <tt class="py-name">src</tt><tt class="py-op">.</tt><tt id="link-140" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.read
 
553
web2py.gluon.debug.Pipe.read
 
554
web2py.gluon.languages.lazyT.read
 
555
web2py.gluon.rocket.ChunkedReader.read
 
556
web2py.gluon.rocket.Connection.read
 
557
web2py.gluon.rocket.LimitingFileWrapper.read
 
558
web2py.gluon.tools.Crud.read" class="py-name" href="#" onclick="return doclink('link-140', 'read', 'link-20');">read</a></tt><tt class="py-op">(</tt><tt class="py-name">chunk_size</tt><tt class="py-op">)</tt> </tt>
 
559
<a name="L377"></a><tt class="py-lineno">377</tt>  <tt class="py-line">        <tt class="py-name">length</tt> <tt class="py-op">=</tt> <tt id="link-141" class="py-name"><a title="web2py.gluon.dal.Expression.len" class="py-name" href="#" onclick="return doclink('link-141', 'len', 'link-36');">len</a></tt><tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">)</tt> </tt>
 
560
<a name="L378"></a><tt class="py-lineno">378</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">&gt;</tt> <tt class="py-name">size</tt><tt class="py-op">:</tt> </tt>
 
561
<a name="L379"></a><tt class="py-lineno">379</tt>  <tt class="py-line">            <tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">,</tt> <tt class="py-name">length</tt><tt class="py-op">)</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-name">size</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">size</tt><tt class="py-op">)</tt> </tt>
 
562
<a name="L380"></a><tt class="py-lineno">380</tt>  <tt class="py-line">        <tt class="py-name">size</tt> <tt class="py-op">-=</tt> <tt class="py-name">length</tt> </tt>
 
563
<a name="L381"></a><tt class="py-lineno">381</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">==</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
 
564
<a name="L382"></a><tt class="py-lineno">382</tt>  <tt class="py-line">            <tt class="py-keyword">break</tt> </tt>
 
565
<a name="L383"></a><tt class="py-lineno">383</tt>  <tt class="py-line">        <tt class="py-name">dest</tt><tt class="py-op">.</tt><tt id="link-142" class="py-name"><a title="web2py.gluon.dal.DatabaseStoredFile.write
518
566
web2py.gluon.debug.Pipe.write
519
567
web2py.gluon.globals.Response.write
 
568
web2py.gluon.rocket.Connection.write
520
569
web2py.gluon.rocket.WSGIWorker.write
521
 
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-138', 'write', 'link-8');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">)</tt> </tt>
522
 
<a name="L374"></a><tt class="py-lineno">374</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">&lt;</tt> <tt class="py-name">chunk_size</tt><tt class="py-op">:</tt> </tt>
523
 
<a name="L375"></a><tt class="py-lineno">375</tt>  <tt class="py-line">            <tt class="py-keyword">break</tt> </tt>
524
 
<a name="L376"></a><tt class="py-lineno">376</tt>  <tt class="py-line">    <tt class="py-name">dest</tt><tt class="py-op">.</tt><tt class="py-name">seek</tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
525
 
<a name="L377"></a><tt class="py-lineno">377</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> </tt>
526
 
</div><a name="L378"></a><tt class="py-lineno">378</tt>  <tt class="py-line"> </tt>
527
 
<a name="L379"></a><tt class="py-lineno">379</tt>  <tt class="py-line"> </tt>
528
 
<a name="make_fake_file_like_object"></a><div id="make_fake_file_like_object-def"><a name="L380"></a><tt class="py-lineno">380</tt> <a class="py-toggle" href="#" id="make_fake_file_like_object-toggle" onclick="return toggle('make_fake_file_like_object');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#make_fake_file_like_object">make_fake_file_like_object</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
529
 
</div><div id="make_fake_file_like_object-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="make_fake_file_like_object-expanded"><a name="L381"></a><tt class="py-lineno">381</tt>  <tt class="py-line">    <tt class="py-keyword">class</tt> <tt class="py-def-name">LogFile</tt><tt class="py-op">(</tt><tt class="py-base-class">object</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
530
 
<a name="L382"></a><tt class="py-lineno">382</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">write</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
531
 
<a name="L383"></a><tt class="py-lineno">383</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
532
 
</div><a name="L384"></a><tt class="py-lineno">384</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">close</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
533
 
<a name="L385"></a><tt class="py-lineno">385</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
534
 
</div></div><a name="L386"></a><tt class="py-lineno">386</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">LogFile</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
535
 
</div><a name="L387"></a><tt class="py-lineno">387</tt>  <tt class="py-line"> </tt><script type="text/javascript">
 
570
web2py.gluon.widget.IO.write" class="py-name" href="#" onclick="return doclink('link-142', 'write', 'link-22');">write</a></tt><tt class="py-op">(</tt><tt class="py-name">data</tt><tt class="py-op">)</tt> </tt>
 
571
<a name="L384"></a><tt class="py-lineno">384</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">length</tt> <tt class="py-op">&lt;</tt> <tt class="py-name">chunk_size</tt><tt class="py-op">:</tt> </tt>
 
572
<a name="L385"></a><tt class="py-lineno">385</tt>  <tt class="py-line">            <tt class="py-keyword">break</tt> </tt>
 
573
<a name="L386"></a><tt class="py-lineno">386</tt>  <tt class="py-line">    <tt class="py-name">dest</tt><tt class="py-op">.</tt><tt class="py-name">seek</tt><tt class="py-op">(</tt><tt class="py-number">0</tt><tt class="py-op">)</tt> </tt>
 
574
<a name="L387"></a><tt class="py-lineno">387</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> </tt>
 
575
</div><a name="L388"></a><tt class="py-lineno">388</tt>  <tt class="py-line"> </tt>
 
576
<a name="L389"></a><tt class="py-lineno">389</tt>  <tt class="py-line"> </tt>
 
577
<a name="make_fake_file_like_object"></a><div id="make_fake_file_like_object-def"><a name="L390"></a><tt class="py-lineno">390</tt> <a class="py-toggle" href="#" id="make_fake_file_like_object-toggle" onclick="return toggle('make_fake_file_like_object');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="web2py.gluon.fileutils-module.html#make_fake_file_like_object">make_fake_file_like_object</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
578
</div><div id="make_fake_file_like_object-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="make_fake_file_like_object-expanded"><a name="L391"></a><tt class="py-lineno">391</tt>  <tt class="py-line">    <tt class="py-keyword">class</tt> <tt class="py-def-name">LogFile</tt><tt class="py-op">(</tt><tt class="py-base-class">object</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
579
<a name="L392"></a><tt class="py-lineno">392</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">write</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">,</tt> <tt class="py-param">value</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
580
<a name="L393"></a><tt class="py-lineno">393</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
 
581
</div><a name="L394"></a><tt class="py-lineno">394</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">close</tt><tt class="py-op">(</tt><tt class="py-param">self</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
 
582
<a name="L395"></a><tt class="py-lineno">395</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
 
583
</div></div><a name="L396"></a><tt class="py-lineno">396</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">LogFile</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
 
584
</div><a name="L397"></a><tt class="py-lineno">397</tt>  <tt class="py-line"> </tt><script type="text/javascript">
536
585
<!--
537
586
expandto(location.href);
538
587
// -->
570
619
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
571
620
  <tr>
572
621
    <td align="left" class="footer">
573
 
    Generated by Epydoc 3.0beta1 on Thu Aug  4 00:47:04 2011
 
622
    Generated by Epydoc 3.0beta1 on Mon Sep 26 06:55:28 2011
574
623
    </td>
575
624
    <td align="right" class="footer">
576
625
      <a href="http://epydoc.sourceforge.net">http://epydoc.sourceforge.net</a>