ADDED ABOUT Index: ABOUT ================================================================== --- /dev/null +++ ABOUT @@ -0,0 +1,6 @@ +web2py is an open source full-stack framework for agile development +of secure database-driven web-based applications, written and programmable in +Python. + +Created by Massimo Di Pierro + ADDED LICENSE Index: LICENSE ================================================================== --- /dev/null +++ LICENSE @@ -0,0 +1,137 @@ +## Web2py License + +Web2py is Licensed under the LGPL license version 3 +(http://www.gnu.org/licenses/lgpl.html) + +Copyrighted (c) by Massimo Di Pierro (2007-2011) + +### On Commercial Redistribution + +In accordance with LGPL you may: +- redistribute web2py with your apps (including official web2py binary versions) +- release your applications which use official web2py libraries under any license you wish +But you must: +- make clear in the documentation that your application uses web2py +- release any modification of the web2py libraries under the LGPLv3 license + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, +BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +(Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a +commercial exception which, for practical purposes, was very similar to the current LPGLv3) + +### Licenses for third party contributed software + +web2py contains third party software under the gluon/contrib/ folder. +Each file/module in contrib is distributed with web2py under its original license. +Here we list some of them. + +#### gluon.contrib.simplejson LICENSE + +Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +#### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE + +This is copyright (c) by Dalke Scientific Software, LLC and released under the +BSD license. See the file LICENSE in the distribution or + for details. + +#### gluon.contrib.markdown (markdown2) LICENSE + +MIT License from from + +#### gluon.contrib.feedparser LICENSE + +Copyright (c) 2002-2005, Mark Pilgrim + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +#### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) + +Copyright (c) 2004, CherryPy Team (team@cherrypy.org) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the CherryPy Team nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### gluon.contrib.pam LICENSE + +Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license + +#### gluon.contrib.shell LICENSE + +Copyright (C) by Google inc. Apache 2.0 Lincense + +#### The javascript licenses are in the code itself + ADDED Makefile Index: Makefile ================================================================== --- /dev/null +++ Makefile @@ -0,0 +1,114 @@ +clean: + rm -f httpserver.log + rm -f parameters*.py + rm -f -r applications/*/compiled + find ./ -name '*~' -exec rm -f {} \; + find ./ -name '#*' -exec rm -f {} \; + find ./ -name 'Thumbs.db' -exec rm -f {} \; + find ./gluon/ -name '.*' -exec rm -f {} \; + find ./gluon/ -name '*class' -exec rm -f {} \; + find ./applications/admin/ -name '.*' -exec rm -f {} \; + find ./applications/examples/ -name '.*' -exec rm -f {} \; + find ./applications/welcome/ -name '.*' -exec rm -f {} \; + find ./ -name '*.pyc' -exec rm -f {} \; +all: + echo "The Makefile is used to build the distribution." + echo "In order to run web2py you do not need to make anything." + echo "just run web2py.py" +epydoc: + ### build epydoc + rm -f -r applications/examples/static/epydoc/ + epydoc --config epydoc.conf + cp applications/examples/static/title.png applications/examples/static/epydoc +tests: + cd gluon/tests; ./test.sh 1>tests.log 2>&1 +src: + echo 'Version 1.98.2 ('`date +%Y-%m-%d\ %H:%M:%S`')' > VERSION + ### rm -f all junk files + make clean + ### clean up baisc apps + rm -f routes.py + rm -f applications/*/sessions/* + rm -f applications/*/errors/* | echo 'too many files' + rm -f applications/*/cache/* + rm -f applications/admin/databases/* + rm -f applications/welcome/databases/* + rm -f applications/examples/databases/* + rm -f applications/admin/uploads/* + rm -f applications/welcome/uploads/* + rm -f applications/examples/uploads/* + ### make admin layout and appadmin the default + cp applications/admin/views/appadmin.html applications/welcome/views + cp applications/admin/views/appadmin.html applications/examples/views + cp applications/admin/controllers/appadmin.py applications/welcome/controllers + cp applications/admin/controllers/appadmin.py applications/examples/controllers + ### update the license + cp ABOUT applications/admin/ + cp ABOUT applications/examples/ + cp LICENSE applications/admin/ + cp LICENSE applications/examples/ + ### build web2py_src.zip + echo '' > NEWINSTALL + mv web2py_src.zip web2py_src_old.zip | echo 'no old' + cd ..; zip -r web2py/web2py_src.zip web2py/gluon/*.py web2py/gluon/contrib/* web2py/splashlogo.gif web2py/*.py web2py/ABOUT web2py/LICENSE web2py/README web2py/NEWINSTALL web2py/VERSION web2py/Makefile web2py/epydoc.css web2py/epydoc.conf web2py/app.example.yaml web2py/logging.example.conf web2py_exe.conf web2py/queue.example.yaml MANIFEST.in mkweb2pyenv startweb2py web2py/scripts/*.sh web2py/scripts/*.py web2py/applications/admin web2py/applications/examples/ web2py/applications/welcome web2py/applications/__init__.py web2py/site-packages/__init__.py web2py/gluon/tests/*.sh web2py/gluon/tests/*.py + +mdp: + make epydoc + make src + make app + make win +app: + echo 'did you uncomment import_all in gluon/main.py?' + python2.5 -c 'import compileall; compileall.compile_dir("gluon/")' + #python web2py.py -S welcome -R __exit__.py + find gluon -path '*.pyc' -exec cp {} ../web2py_osx/site-packages/{} \; + cd ../web2py_osx/site-packages/; zip -r ../site-packages.zip * + mv ../web2py_osx/site-packages.zip ../web2py_osx/web2py/web2py.app/Contents/Resources/lib/python2.5 + cp ABOUT ../web2py_osx/web2py/web2py.app/Contents/Resources + cp NEWINSTALL ../web2py_osx/web2py/web2py.app/Contents/Resources + cp LICENSE ../web2py_osx/web2py/web2py.app/Contents/Resources + cp VERSION ../web2py_osx/web2py/web2py.app/Contents/Resources + cp README ../web2py_osx/web2py/web2py.app/Contents/Resources + cp splashlogo.gif ../web2py_osx/web2py/web2py.app/Contents/Resources + cp options_std.py ../web2py_osx/web2py/web2py.app/Contents/Resources + cp routes.example.py ../web2py_osx/web2py/web2py.app/Contents/Resources + cp router.example.py ../web2py_osx/web2py/web2py.app/Contents/Resources + cp app.example.yaml ../web2py_osx/web2py/web2py.app/Contents/Resources + cp queue.example.yaml ../web2py_osx/web2py/web2py.app/Contents/Resources + cp -r applications/admin ../web2py_osx/web2py/web2py.app/Contents/Resources/applications + cp -r applications/welcome ../web2py_osx/web2py/web2py.app/Contents/Resources/applications + cp -r applications/examples ../web2py_osx/web2py/web2py.app/Contents/Resources/applications + cp applications/__init__.py ../web2py_osx/web2py/web2py.app/Contents/Resources/applications + cd ../web2py_osx; zip -r web2py_osx.zip web2py + mv ../web2py_osx/web2py_osx.zip . +win: + echo 'did you uncomment import_all in gluon/main.py?' + python2.5 -c 'import compileall; compileall.compile_dir("gluon/")' + find gluon -path '*.pyc' -exec cp {} ../web2py_win/library/{} \; + cd ../web2py_win/library/; zip -r ../library.zip * + mv ../web2py_win/library.zip ../web2py_win/web2py + cp ABOUT ../web2py_win/web2py/ + cp NEWINSTALL ../web2py_win/web2py/ + cp LICENSE ../web2py_win/web2py/ + cp VERSION ../web2py_win/web2py/ + cp README ../web2py_win/web2py/ + cp splashlogo.gif ../web2py_win/web2py/ + cp options_std.py ../web2py_win/web2py/ + cp routes.example.py ../web2py_win/web2py/ + cp router.example.py ../web2py_win/web2py/ + cp app.example.yaml ../web2py_win/web2py/ + cp queue.example.yaml ../web2py_win/web2py/ + cp -r applications/admin ../web2py_win/web2py/applications + cp -r applications/welcome ../web2py_win/web2py/applications + cp -r applications/examples ../web2py_win/web2py/applications + cp applications/__init__.py ../web2py_win/web2py/applications + cd ../web2py_win; zip -r web2py_win.zip web2py + mv ../web2py_win/web2py_win.zip . +run: + python2.5 web2py.py -a hello +push: + make src + echo '' > NEWINSTALL + hg push + bzr push bzr+ssh://mdipierro@bazaar.launchpad.net/~mdipierro/web2py/devel --use-existing-dir + ADDED README Index: README ================================================================== --- /dev/null +++ README @@ -0,0 +1,1144 @@ +## INSTALLATION INSTRUCTION - IMPORTANT + +To start web2py there is NO NEED to install it. Just unzip and do: + +> python web2py.py + +Thats is it!!! + +## web2py file structure + +start web2py with: + + python web2py.py + +`` + \project + README + LICENSE + TODO + Makefile ## make all and make app + web2py.py ## the startup script (*) + parameters.py ## created at startup + admin.tar ## the admin app (*) + examples.tar ## examples and documentation app (*) + welcome.tar ## the welcome app (entry point) (*) + \gluon ## the core libraries (*) + \deposit ## used for zip and install apps + setup_app.py ## used by py2app to make OSX executable + setup_exe.py ## used by py2app to make Winows executble + wsgihandler.py ## to use Gluon with mod_wsgi + \dist ## used by py2app, py2exe + \build ## used by py2app, py2exe + \tests ## under development stuff + \docs ## in progress documentation + \applications ## are the apps + \welcome ## application welcome, for example + \models + \views + \controllers + \sessions + \errors + \cache + \static + \uploads + \modules +`` + +## EWF v1.5 -> v1.6 +- load and save .py in ascii, avoids problem with LF+CR on windows +- added path.join in compileapp, fixed problem with Windows compileapp + +## EWF v1.6 -> v1.7 +- in paths replace '\' with '/' to fix problem with windows paths +- using limitby in database administration +- replaced mime/miltupart with multipart/form-data to fix a windows problem + +## EWF v1.7 -> Gluon v1.0 +- Name change +- Improved layout.html + +## Gluon v1.0 -> v1.1 +- bug in sqlhtml with JOINS queries + +## Gluon v1.1 -> v1.2 +- fixed some typos in examples +- IS_IN_SET now supports labels +- cleanup in sql.py does not cleanup, just checks valid field and table names + +## Gluon v1.3 +- added IS_IN_DB, IS_NOT_IN_DB and updated examples accordingly + +## Gluon v1.4 +- fixed problem with IS_INT_IN_RANGE and IS_FLOAT_IN_RANGE. Now an error in a validator is reported as a ticket. Good validators should not raise Exceptions. +- IS_IN_DB displays "label (id)" +- it can upload files without extension +- migration is now optional (define_table has migrate=False option) + +## Gluon v1.5 +-
-> in errors.html +- replace('//','////') in sub in template.py + +## Gluon v1.8 +- no more chdir (thread unsafe) +- no more sys.stdout (thread unsafe) +- response.body is StringIO() +- admin/default/site informs about upgrade +- response.locker (optional) + +## Gluon v1.9 +- allow "count(*)" in select +- db.execute() +- fixed problem with continue and return in template +- removed try: ... except in sql.py +- fixed '\t' + +## Gluon v1.10 +- fixed concurrency problems with SQLDB._instances and SQLDB._folders, now use lock +- now, by default, edit SQLFORMs retain uploaded files + +## Gluon v1.11 +- appadmin allows to keep or delete uploaded files + +## Gluon v1.12 +- in sql.py +- handles NULL values properly +- unicode support (data always stored in utf-8) +- 'date' -> datetime.date ,'time' -> datetime.time, 'datetime' -> datetime.datetime, 'boolean' -> True/False +- most types have default validators +- SQLField(...,required=True) option. +- SQLRows has __str__ that serializes in CSV and xml() that serializes in HTML +- SQLTable has import_from_csv_file(...) +- gluon.simplejson for AJAX +- in validators.py +- IS_IN_DB(db,..) - db can be an SQLSet or an SQLDB +- better error messages +- in admin +- new import/export in csv, update and delete interface. +- in appadmin +- edit form allows to keep stored encrypted password +- in main.py +- http://host not defaults to http://host/init/default/index +- New third party modules +- gluon.simplejson(.dumps, .loads) +- gluon.pyrtf(.dumps) +- gluon.rss2(.dumps) + +## Gluon v1.13 +- (this is one of the biggest revisions ever) +- Improved sql.py has support MySQL, cxOracle (experimental), extract, like and better testing +- SQLDB.tables and SQLTable.fields are now SQLCalableList objects +- Fixed bug with editing integer fields storing zero +- Admin interface now says "insert new [tablename]" and display insert, select or update properly in the title. +- Added a cache mechamism. Works for data, controllers, views and SQLRows. +- main.py now uses a request.folder absolute path when not os.name in ['nt','posix']. Seems to work on windowsce devices, except no file locking has consequences. +- Now you can put modules in applications/[anyapp]/modules and import them with +- import applications.[anyapp].modules.[module] as [module] +- Fixed problem with init +- New applications/examples/controller/global.py controller for docs. + +## Gluon v1.14 +- Fixed a bug fix in URLs + +## Gluon v1.15 +- New try:... except. in gluon/main.py for when sessions cannot be saved +- Now validator/formatter method allows IS_DATE('%d/%m/%Y') + +## web2py v1.16 +- yes we changed the name! Turns out Gluon was trademarked by somebody else. +- Although we are not infringing the trademark since this is a non-commercial +- product we could have run into some issues. So we have been professional +- and changed the name to web2py. +- Now SQLFORMs and FORM can have a formname and multiple forms are allowed +- per page. +- A new examples/default/index page. +- web2py.py instead of runme.py +- mysql sets utf8 encoding. +- input integer field values are automatically converted int(). + +## web2py v1.17 +- I posted v1.16 too soon. v1.17 was released after 1h to fix some bugs. + +## web2py v1.18 +- removed vulnerability in accept_languages and session_id +- Minor bug fixes. Typos and cleanup cache. Textarea now clears. +- Support for PyAMF. +- T returns a class, not a string +- new template parser (faster?) +- got rid of sintaxhighlighter in favor of server side CODE +- fix problem with cacheondisk locking +- fix 'None' instead of NULL in IS_NOT_IN_DB (I think) +- gluon.contrib.markdown +- notnull and unique in SQLField now supported (tested on sqlite mysql and postgresql) +- Storage now has __getstate__ and __setstate__ needed for pickling. +- session files are now locked to make it work better with asynchronous requests +- cxoracle should work, apart for limitby +- .../examples is now mapped to .../examples/default/index etc. +- .../init is now mapped to .../welcome if init is not present + +## web2py 1.19 +- minor typos + +## web2py 1.20 +- new IFRAME, LABEL, FIELDSET validators +- P(..cr2br=True) option +- FORM and SQLFORM have hidden=dict(...) option for REST +- testing framework. +- improved examples pages + +## web2py 1.21 +- replaced paste.httpserver with cherrypy.wsgi server +- temporary sessions are no longer saved +- widget has [stop] button and graph +- logging is done by main by appfactory +- fixed a bug in sql belongs + +## web2py 1.22-1.25 +- fixed minor bugs, added IS_NULL_OR + +## web2py 1.26 +- added shell.py (thanks Limodou!) +- added memcache support + +## web2py 1.27 +- IS_NULL_OR now works will all fields +- admin creates paths to static files +- wsgiserver options are passed to HttpServer +- faking limitby for oracle to make appadmin work +- all objects inherit from object +- fixed bug in app names with . +- fixed bug in created RestrictedError object on windows +- shell is now in gluon and accessible via web2py.py + +## web2py 1.28 +- fixed bug with belongs, faster sql.py +- included jquery.js +- minor aestetical fixes +- sortable.js is gone + +## web2py 1.29 +- Now selet mutliple works with get, so does is IS_LENGTH +- Added IS_LIST_OF +- fixed problem with admin from windows and localhost + +## web2py 1.30 +- added flv to contenttype +- added support for appengine + +## web2py 1.31-1.41 +- some bug fixes, mostly better appengine support +- mssql support +- firebird support +- widgets support +- connection pools + +## 1.42 +- fixed security issue by removing slash escape in mysql +- removed random everywhere +- use uuid for session and tickets +- use http_x_forward_for to figure out the client causing a ticket +- use longtext and longblob for mysql +- main now really catches all exceptions +- no more warnings on GAE + +## 1.43-1.48 +- html.py rewrite (better support for custom forms) (Bill Ferrett) +- new stickers in examples (thanks Mateusz) +- on windows can run in taskbar (Mark Larsen) +- in admin|edit page link to edit|controller (Nathan Freeze) +- better error codes and routes_onerror (Timothy Farrell) +- DAL support for groupy and having +- DAL support for expressions instead of values +- DAL has experimental Informix support +- fixed bug with non-printable chars in DAL +- 'text' fields limited to 2**16 (to avoid mysql problems) +- widget has -quiet and -debug (Attila Csipa) +- web2py_session uses BLOB instead of TEXT +- improved IS_URL +- Runs with python 2.6 (Tim) +- On GAE uses GAE for static files (Robin) + + +## 1.49 +- fixed a bug with taskbar widget, thanks Mark +- fixed a bug with form.latest +- made many DIV methods private (_) + + +## 1.50 +- Fixed some bugs introduced in 1.49 + +## 1.51 +- Fixed more bugs introduced in 1.49 (sql _extra and html select) +- support for sqlite:memory: + +## 1.52 +- Fixed a minor bug with _extra[key] and key not str. +- check for upgrade via ajax + +## 1.53 +- On GAE upload data goes automatically in datastore (blob created automatically) +- New appadmin runs on GAE (most of it, not all) +- Martin Hufsky patch allow slicing of fields in DAL expressions + +## 1.54 +- fixed minor bugs + +## 1.55? +- rowcount +- fixed bug when IS_IN_DB involved multiple fields on GAE +- T.set_current_languages +- better unittests +- response.custom_commit and response.custom_rollback +- you can next cache calls (like cache a controller that caches a select). Thanks Iceberg +- db(....id==None).select() no longer returns an error but an empty SQLRows on GAE +- db(...).delete(delete_uploads=True) and SQLFORM.accepts(....delete_uploads=True) will delete all referenced uploaded files +- DIV.element and DIV.update +- sqlrows.json() +- SQLFORM.widgets +- URL(r=request,args=0) +- IS_IN_DB(...,multiple=True) for Many2Many (sort of) +- In URL(...,f) f is url encoded +- In routes_in=[['a/b/c/','a/b/c/?var=value']] +- simplejson 2.0.7 + + +## 1.56 +- Consider the following table: + +- db.define_table('cirlce', +- db.Field('radius','double'), +- db.Field('area','double'), +- db.Field('modified_on','datetime')) + +- now you can do: + +## add a comment in the forms +- db.circle.area.comment="(this is a comment)" + +## do not show area in create/edit forms +- db.circle.area.writable=False + +- ## do not show now in display forms +- db.circle.modified_on.readable=False + +## automatically timestamp when record cretaed +- db.circle.modified_on.default=request.now + +## automatically timestamp when record is modified +- db.circle.modified_on.update=request.now + +## make the radius appear in bold in display and table +- db.circle.radius.represent=lambda value: B(value) + +## make a form that automatically computes area +- pi=3.1415 +- form=SQLFOM(db.circle) +- if form.accepts(request.vars, +- onvalidation=lambda form: form.vars.area=pi*form.vars.radius**2): ... + +## make a create form in two possible ways: +- form=SQLFORM(db.circle) +- form=SQLFORM(db.circle,0) + +## make an update form in two possible ways: +- form=SQLFORM(db.circle,record) +- form=SQLFORM(db.circle,record_id) + +## make a display form in two possible ways: +- form=SQLFORM(db.circle,record,readonly=True) +- form=SQLFORM(db.circle,record_id,readonly=True) + +## so now you can do... + +- form=SQLFORM(db.circle,request.args[-1]) + +- and you get a create form if the URL ends in /0, you get an update +- form if the URL ends in /[valid_record_id] + +## you can also define once for all + +- timestamp=SQLTable(None,'timestamp', +- SQLField('created_on','datetime', +- writable=False, +- default=request.now), +- SQLField('modified_on','datetime', +- writable=False, +- default=request.now,update=request.now)) + +## and use it in all your tables + +- db.define_table('mytable',db.Field('somefield'),timestamp) + +## ## ## + +- One more feature in trunk.... + +- db.define_table('image',SQLField('file','upload')) + +- db.image.file.authorize=lambda row: True or False + +- then controller +- def download(): return response.download(request,db) +- id' is now a hidden field sqlform +- gql references converted to long +- admin login has autofocus +- new notation proposed by Robin, db.table[id] +- new UploadWidget shows images +- new generic.html shows request, response, session +- new LEGEND helper (thanks Marcus) +- fixed doctests in sql (thanks Robin) +- new notation for DB + +- record=db.table[id] +- db.table[id]=dict(...) +- del db.table[id] + +- request.env.web2py_version +- new class gluon.storage.Settings has lock_keys, lock_values +- jquery 1.3.1 +- PEP8 compliance +- new examples application +- runs on jython (no database drivers yet, thanks Phyo) +- fixed bugs in tests +- passes all unittest but test_rewite (not sure it should pass that one) + +- Lots of patches from Fran Boone (about tools) and Dougla Soares de Andarde (Python 2.6 compliance, user use of hashlib instead of md5, new markdown2.py) + +## 1.56.1-1.56.4 +- fixing lots of small bugs with tool and languages +- jquery.1.3.2 + +## 1.57 +- New ajax edit with keepalive (no longer logged out when editing code) +- Fixed conflict resolution page. +- Removed /user/bin/python from models/controllers + +## 1.58 +- Fixed some CRON bugs +- Fixed a bug with new ajax edit +- Experimental DB2 support in DAL +- Customizable font size in admin edit page +- New welcome/models/db.py shows how to memcache sessions on GAE with MEMDB +- More expressive titles in admin +- DB2 support. Thanks Denes! + +## 1.59-1.60 +- fixed lots of small bugs +- routes_in can filter by http_host + +## 1.61 +- fixed some typos +- auth.add_permissions(0,....) 0 indicates group of current user +- crud.update has deletable=True or False +- fixed issue with GAE detection -> gluon.settings.web2py_runtime -> request + +## 1.62 +- SQLFORMS and crud now show readble fields +- Better WingIDE support +- Languages are automatically translated +- T.force and lazyT works better, optional T.lazy=False +- gluon.storage.Messages are now translated without T +- if routes.py then request.env.web2py_original_uri +- db.table.field.isattachment = True +- internationalizaiton of admin by Yair +- admin.py by Alvaro +- new MENU helper +- new w2p file format +- new welcome app with auth, service and crud turned on + +## 1.63-1.63.4 +- no more import gluon. +- support for generic.xxx +- simplejson can handle datetime date and time + +## 1.63.5 +- You can do jQuery.noConflict() without breaking web2py_ajax +- Wigets can have attributes (thanks Hans) +- Lots of internal cleanup and better code reusage (thanks Hans) + +## 1.64 +- Models 2-3 times faster (thanks Alexey) +- Better LDAP support +- Works with Jython (including sqlite and postgresql with zxJDBC): + +- download jython-2.5rc3.jar +- download qlite-jdbc-3.6.14.2.jar +- java -jar jython-xxx.jar +- export CLASSPATH=$CLASSPATH:/Users/mdipierro/jython2.5rc3/sqlite-jdbc-3.6.14.2.jar +- cd web2py +- ../jython2.5rc3/jython web2py.py + +## 1.64.2 +- New IS_COMPLEX validator, thank Mr. Freeze +- Experimental Informix support +- Autologin on registration + +## 1.64.3 +- Some bug fixes + +## 1.64.4 +- Som bug fixes +- Informix Support +- response.render(stream) +- SQLFORM.factory +- SQLFORM.widgets.radio and SQLFORM.widgets.checkboxes + +## 1.65 +- reST docstrings for Sphinx, thanks Hans +- gluon/conrtib/login_methods/gae_google_account.py for google CAS login on GAE, thanks Hans +- fixed problem with Auth and Firebird 'password' issue +- new auth.settings.create_user_groups +- tickets stored on datastore on GAE and also logged, thanks Hans +- imporved IS_LENGTH with max and min, thanks Mateusz +- improved IS_EMAIL with filters, thanks Mateusz +- new IS_IMAGE checks for format and size, thanks Mateusz +- new IS_IPV4, thanks Mateusz + +## 1.65.1 +- spreadsheet +- shell history, thanks sherdim +- crontab editor, thanks Angelo +- gluon/contrib/login_methods/cas_auth.py (thanks Hans) +- DAL(...) instead of SQLDB(...) +- DAL('gae') instead of GQLDB() +- Field instead of SQLField +- (the old syntax still works) + +## 1.65.2 +- Fixed some small auth bugs +- Field.store(...) + +## 1.65.3-10 +- Fixed some small bugs and typos in the docstrings +- Fixed AMF3 support + +## 1.65.11 +- Fixed a sqlhtml bug with image upload + +## 1.65.12 +- lables in auth auto-translate (thanks Alvaro) +- better ldap_auth (thanks Fran) +- auth chacks locally for blocked accounts even for alternate login methods (thanks Fran) + +## 1.65.13 +- request.url (thanks Jonathan) +- restored uploadfield_newfilename +- new examples layout nad logo (thanks Mateusz) + +## 1.66 +- new doctypes +- form.vars.newfilename +- new HTML and XHTML helpers +- better IS_LENGTH + +## 1.67.0 +- Python 2.4 support (again) +- New layout for welcome +- changed defauld field sizes to 512 +- Field(uploadfolder="...") +- appadmin works on GAE (again, somehting got broken at some point) +- new wsgiserver 3.2.0 should fix recurrent broken download problems + +## 1.67.1 +- Bux fixed + +## 1.67.2 +- Security fix in markdown + +## 1.68.1 +- New official markdown with security fix +- rows.first() +- rows.last() +- New cron +- New hindi and spanish translation +- cached uploads allow for progress bars (thanks AndCycle) +- ingres support (thanks Chris) +- legacy database support for db2, mssql with non-int primary keys (thanks Denes) +- default setting of content-type (this may cause strange behavior in old apps when downloading images) +- IS_UPPER and IS_LOWER works with unicode +- CLENUP not takes regex of allowed/now allowed chartares +- New rewrite.py allows dynamic routes +- Better error messages for IS_INT_* and IS_FLOAT_* + +## 1.68.2 +- Fixing bug with admin and missing crontab +- Fixing bug with rewrite.load on GAE (thanks Willian Wang) + +## 1.69.1 +- Fixed a bug introduced in 1.68 about inserting unicode in DAL +- Fixed other small bugs +- Better support for legacy databases (thank Denes) +- response.meta replaces response.author, response.keywords, response.description +- response.files stets dependes in plugins +- better admin for packing/unpacking plugins +- reference fiels nor evaluate to DALRef with lazy evaluation (cool, thanks Mr Freeze) +- can insert a record in place of a reference +- record[e] instead of record._extra[e] (tentatively!) +- record.update_record() with no args +- rows.find() (thanks Mr Freeze) +- rows.exclude() +- rows.sort() +- rows[:] + +## 1.70.1 +- Fixed bug with Rows.as_list and DALRef +- Added Rows.as_dict (thanks Mr Freeze and Thedeus) +- Added request.wsgi (thanks hcvst) allows running wsgi apps under web2py and applying wegi middleware to regular web2py actions that return strings. +- Experimental distributed transactions between postgresql, mysql and firebird +- Finally local_import is here! + +## 1.71.1 +- Complete rewrite of Rows +- renamed DALStorage->Rows, DALRef->Reference +- Experimental serializarion of Row and Rows (get serialized to dict and list of dict) +- DAL(...,folder) and template.render(content=, context=) make it more modular + +## 1.72.1 - 1.72.3 +- Better support for legacy databases + +## 1.73.1 +- Fixed problem with storage and comparison of Row objects +- Fixed problem with mail on GAE +- Fixed problem with T in IS_DATE(TIME) error_message and format +- Rows[i].delete_record() +- Even better support for legacy databases +- Experimantal support for non UTF8 encoding in DB +- Better IPV4 (thanks Thandeus) +- T.current_languages default to 'en' and new T.set_current_languages(...) (thanks Yarko) +- INPUT(...,hideerror=False) used to fix rare chechbox widget problem +- Admin allows change of admin password +- New gluon/contrib/populate.py +- Size of input/textarea set by CSS no more by jQuery (thanks Iceberg) +- Customizable CSV (thanks Thandeus) +- More bug fixed (thanks Thandeus) +- Better regex for template fixed Jython problem (thank Jonathan) + +## 1.74.1 +- Moved to mercurial +- Default validators use the new define_table(....,format='...') +- New get_vars and post_vars compatible in 2.5 and 2.6 (thanks Tim) +- Major rewrite of gql.py extends DAL syntax on GAE +- No more *.w2p, welcome.w2p is create automatically, base apps are always upgraded +- export_to_csv(delimiter = ',', quotechar = '"', quoting = csv.QUOTE_MINIMAL), thanks Thadeus + +## 1.74.2-4 +- Fix bugs including including unicode in emails and blobs on GAE + +## 1.74.5 +- bug fixes +- restored python 2.4 support,thanks ont.rif +- support for native types on Google App Engine +- cache.ram usage statictics, thanks Thadus +- no more auth manu in scaffolding +- no more spash screen with -Q +- fixed doctest in html.py, thanks Anand Vaidya +- export_to_csv_file has represent, thanks Thadeus + +## 1.74.6 +- bug fixes +- IS_IN_DB(...,_and=IS_NOT_IN_DB) +- Smaller populate, thanks Piotr +- better slicing of fields, thanks Michael Fig +- Cache stats, thanks Thadeus +- Better gql.py +- IS_IN_DB and IS_IN_SET default to zero='', no longer zero=None + +## 1.74.7 +- request_password_reset and password reset verification +- python web2py.py -S app -M -R script.py -A arg1 arg2 arg3 +- T("%(a)s") % dict(a="hello") + +## 1.74.8 +- IS_SLUG, thanks Gustavo and Jonathan +- web2py.py -nogui, thanks Jeff Bauer +- solved a problem with jython, thanks Tim Farrel +- login has "remember be option", thanks Piotr Banasziewicz +- fixed problem with keepvalue in update forms, thanks Miguel Lopez + +## 1.74.9 +- IS_IN_SET(((0,'label0'),(1,'label1'))), thanks Falko Krause +- SQLFORM(...).accpets stores True or False in boolean types no None, thanks Frederik Wagner +- SQLFORM.factory(...,table_name='no_table'), thanks Thedeus +- jQuery 1.4.1 +- Fixed major problem with internationalization of multiple languages. +- Fixed a serius security issue with login +- Possibly fixed some issues with cron + +## 1.75.1 +- better cron +- better fetch +- logging of email failures +- new web2py.fedora.sh +- new setup-web2py-ubuntu.sh +- experimental autocomplete +- menus work on IE6 + +## 1.75.2 +- fetch supports cache +- curd.update(....,onaccept=crud.archive) magic +- new UUID mechnism fixes session conflicts with cloned machine in cloud +- allow to upload app and overwrite existing old ones, thanks Jonathan +- print gluon.tools.prettydate(request.now,T), thanks Richard + +## 1.75.3 +- added support for PAM authentican for apps and for admin +- INTRODUCED MAJOR BUG IN BEAUTIFY (upgrade to 1.75.4) IMMEDIATELY + +## 1.75.4 +- customizable BEAUTIFY, thanks John + +## 1.75.5 +- fixed behaviour with languages.py, thanks Iceberg +- added chinese (thanks Iceberg) and Hungarian (thanks Gyuris) +- fixed problem with GAE deleted by id (thanks what_ho) +- fixed bug in LOAD with custom views, thanks vhang +- improved IS_IN_SET takes iterator, dict, list and list of tuples, thanks Iceberg +- Auth(...,controller='default') +- Fixed major bug in parsing repeated request.vars, thanks Ben +- IS_DATE and IS_DATETIME can now handle any 00).select(),headers='fieldname:capitalize') +- Oracle limitby improved (thanks Sergey) +- fixed migrations in Firebird, thanks Jose Jachuf +- gluon/contrib/login_methods/linkedin_account.py (to be tested) + +## 1.76.5 +- Fixed a typo in auth that created some registration problems + +## 1.77.1 +- Replaced CherryPy with Rocket web server, thanks Tim +- CacheOnDisk allows to specify a folder +- IS_DATE/DATETIME can handle any year since 0 +- SQLTABLE(...,headers='fieldname:capitalize') +- Field().with_alias, thanks Nathan and Mengu +- has_membership(group=...,role=...), thank Jonathan +- db.define_table(username=True), thanks Jonathan +- gluon.tools.prettydate +- can specify hostname in routes_out (same syntax as routes in), thanks Martin +- db.table.bulk_insert([...records...]) now works on GAE, thanks Jon +- IS_EMAIL validates on 'localhost', thanks Jonathan +- welcome/views/layout.html uses ez.css, thanks Yarko +- mail attachments support utf8, thanks szimszon +- works with PyPy, thanks Joe +- better Firebird support, thanks Jose +- better Oracle support, thanks Gabriele +- cron supports days of week +- SQLFORM(...,formstyle="table3cols") or "table2cols" or "divs" or "ul" +- crud.settings.formstyle +- web2py.py -f folder allows to specify locations of applications, thanks Iceberg +- better/faster regex in template works in Jython +- fixed lots of small bugs + +## 1.77.2 +- fixed x-index in calendar +## 1.77.3 +- some cleanup of code in compileapp + +## 1.78.1 +- new template system allows {{block name}}{{end}}, thanks Thadeus +- fixed mime headers in emails, included PGP in emails, thanks Gyuris +- automatic database retry connect when pooling and lost connections +- OPTGROUP helper, thanks Iceberg +- web2py_ajax_trap captures all form submissions, thank you Skiros +- multicolumn checkwidget and arbitrary chars in multiple is_in_set, thanks hy +- Québécois for welcome, thanks Chris +- crud.search(), thanks Mr Freeze +- DAL(...migrate,fake_migrate), thanks Thadeus + +## 1.78.3 +- reverted temporarily to old template system because of backward compatibility issues + +## 1.79.1 +- x509 emails, thanks Gyuris +- attachment and html in Mail on GAE, thanks PanosJee +- fixed docstring in SQLTABLE, thanks aabelyakov +- TAG(html) parese html into helpers (experimental, still some problems with unicode, , thanks RobertVa for unicode help) +- DIV.elements(find=re.compile(....)) +- DIV.flatten() +- DIV.elements('....') supports jQuery syntax in '....' +- better it-it.py and it.py, thanks Marcello Della Longa +- Many Bug fixes: +- improved support for DAL and joins in postgresql/oracle, thanks Nico de Groot +- bux fixex in html.py, thanks Ian +- fixed an issue with registration_key==None, thanks Jay Kelkar +- fixed bug in gql.py, thanks NoNoNo +- fixed problem with multiple and checkboxes, thanks MIchael Howden +- fixed bug in gae, thanks NoNoNo +- restored 2.4 compatibility, thanks Paolo Gasparello +- auth.update() when pictures in profile +- formstyle can be a function, thanks Howden +- escape in sanitizer, thanks Howes +- add missing settings, thanks Hamdy +- find and exclude return empty Rows instead of [], thanks iceberg +- simplejson 2.1.1 should fix compatibility problems +- added sms_utils and Authorize.net in contrib + +## 1.79.2 +- solved simplejson imcompatibility problem + +## 1.80.1 +- MARKMIN helper (no backward compatibility promise yet) +- self._last_reference, thanks Dave (no backward compatibility promise yet) +- IS_EQUAL_TO +- zh-tw and better internationalization page, thanks Daniel Lin and Iceberg +- better crud.search, thanks MrFreeze +- Rocket interfaces, thanks Nik Klever +- db.table.field.uploadseparate=True, thanks Gyuris +- SCOPE_IDENITY for MSSQL, thanks Jose +- fixed email attachment issue, thanks Bob_in_Comox +- fixed problem with groupby and IS_IN_DB +- other bug fixes +- new implementation for local_import +- ajax(..,...,null) +- fixed Chrome bug in calendar.js, thanks Iceberg +- experimental scrips/web2py-setup-fedora.sh +- generic.load, thanks Iceberg + +## 1.81.1 +- rpx (janrain) support out of the box, allows login with Facebook, MySpace, etc. Thanks Mr Freeze +- Increased security (escape single and double quotes, thanks Craig" +- Fixed a bug with db.table.field.uploadseparate=True and autodelete +- New welcome app with superfish and jQuery 1.4.2 +- Deleted openwysiwyg from admin +- In XML and xmlescape quote defaults to True. Both ' and " are escaped. Thanks Craig Younkins + +## 1.81.2 +- fixed bug in Auth + +## 1.81.3 +- fixed bug in label names in formstyle +- fixed id names in admin test.html page + +## 1.81.4 +- Fixed gluon.tools to work work with load and base.css to nowrap labels + +## 1.81.5 +- Fixed a few bugs. The most important bugs we fixed are in memcache (thanks Scott) and in a process starvation issue with Rocket (thanks Mike Ellis and Tim). + +## 1.82.1 +- request.ajax to detect if action is called via ajax, tahnks Jonathan and David Mako +- more captcha options, thanks Vidul +- openid and oauth2 thanks Michele and Keith +- better PluginManager and load components +- new template system, thanks Thadeus +- new db.table(id,[field=value]) and db.table(query) syntax +- URL('index') (no more r=request), thanks Thadeus +- mail.send(message='...', ....) +- DAL([....]) for load balancing +- @service.soap(...) with mysimplesoap, thanks Mariano +- hideerror + +## 1.83.1 +- New error reporting mechanism (thanks Mariano) +- New routing system with app level routing (thanks Jonathan) +- Integrated GAE appstat and GAE precompilation (thanks Scott) +- New Field types "list:string", "list:integer", "list:reference" +- request.cid, request.ajax, A(cid=request.cid), response.js + +## 1.83.2 +- mostly cleanup + +## 1.84.1-4 +- flash now stays put in the top right corner +- improved behavior for URL and T objects +- new app level logging with logging.conf (thanks Jonathan) +- improved OpenID (thanks Michele) +- web2py_ajax handles prepend, append, hide (thanks Juris) +- web2py_ajax also handels pre-validation of decimal fields +- ru-ru translation (thanks Michele) +- sk-sk translation (thanks Julius) +- migrations save .table only if changed and after each ALTER TABLE (no more mysql inconsistencies) +- fixed bugs in SQLCustomField, Field(default=...), IS_IMAGE, IS_DECIMAL_IN_RANGE and a few more. +- Better validators (IS_DECIMAL_IN_RANGE, IS_INT_IN_RANGE, etc) thanks Jonatham +- Polymmodel support on GAE +- Experimental ListWidget +- moved DAL and routes to thread.local (thanks Jonathan, again) +- scripts/extract_mysql_models.py, thanks Falko Krause and Ron McOuat +- scripts/dbsessions2trash.py, thanks Scott + +## 1.85.1-3 +- fixed some bugs +- added pyfpdf, thank Mariano + +## 1.86.1-1.86.3 +- markmin2latex +- markmin2pdf +- fixed some bugs +- Storage getfirst, getlast, getall by Kevin and Nathan +- db(db.table), db(db.table.id) both suported and equivalent to db(db.table.id>0) +- postresql ssl support +- less un-necessary logging and warnings on GAE +- IS_DECIMAL_IN_RANGE and IS_FLOAT_IN_RANGE support dot="," (dot="." is default) +- on_failed_authorization can be a function, thanks Niphold +- gluon/contrib/login_methods/cas_auth.py for integration between CAS and Auth. + +## 1.86.3 +- Error reporting on save, thanks Mariano +recalled + +## 1.87.1-2 +- new layout for examples, thanks Bruno and Martin +- admin allow ``DEMO_MODE=True`` and ``FILTER_APPS=['welcome']`` +- fixed a possible problem with CRON and paths + + +## 1.87.3 +- fixed a major bug introduced in 1.87.1 that prevents appadmin from working for new apps created with 1.87.1-2. +- upgraded to clockpick 1.28, thanks villas + +## 1.88.1-2 +- better list: string support, thanks Bob +- jquery 1.4.3 +- scripts/autoroutes.py +- new admin wizard +- added retrieve_username to navbar (if username) +- internal rewrite for arbitrary paths (abspath), thanks Jonathan +- populate support for list: and decimal, thanks Chirstian +- markmin2latex has extra attribute +- better mercual admin allows list of files, versions and retrieve +- new error report system, thanks Thadeus and Selecta +- SQLFORM.accepts(detect_record_change).record_changed +- fixed cron for bytecode compiled apps, thanks Álvaro J. Iradier Muro +- other bugs fixes and pep8 compliant fixes + +## 1.89.1-.5 +- new admin layout (thanks Branko Vukelic) +- new admin search +- new admin language selector (thanks Yair) +- new Welcome app (thanks Martin Mulone) +- better wizard +- admin support for DEMO_MODE=True +- admin exposes GAE deployment button (always) +- MENU support None links (thanks Michael Wolfe) +- web2py.py -J for running cron (thanks Jonathan Lundell) +- fixed ~db.table.id on GAE (thanks MicLee) +- service.jsonrpc supports service.JsonRpcException (thanks Matt) +- bug fixes + +## 1.90.1 +- new DAL (complete rewrite of the web2py DAL is more modular) +- rewrite has fail safe reload, thanks Jonathan +- better CAS with v2 support, thanks Olivier ROCH VILATO +- better markmin2latex +- session.connect(separate=True) to handle many session files, thanks huaiyu wang +- changed bahvior of impersonate (more secure, can generate form or used as API) +- new rocket, thanks Tim +- new pyfpdf +- no more old style classes +- experimental couchdb support in new dal (only insert, select, update by id) +- mysql support out of the box via pymysql +- SQLITABLE(...,headers='labels') thanks Bruno +- optional: digitally signed URLs, thanks Brian Meredyk +- minor bug fixes + +## 1.90.2-4 +- pymysql no longer requires ssl (if not used) +- fixed bug with virtualfields +- fixed bug in truncate (new dal) +- fixed bug in select with alternate primary key (new dal) +- fixed bug with IS_IN_DB and self refences (also new dal) + +## 1.90.5 +- set poll = False in rocket because of poll python thread bug often unfixed, thanks Jonathan +- fixes issue with crud and reCaptcha + +## 1.90.6 +- fix issue with pickling new dal Row and Rows. + +## 1.91.1 +- LICENSE CHANGE FROM GPLv2 to LGPLv3 +- URL(...,hash_vars=...) allows to specify which vars need to be signed +- fixed bug with aliasing in new DAL + +## 1.91.2-1.91.5 +- fixed a problem with deplyment on GAE +- other new dal bug fixes + +## 1.91.6 +- web2py comet via gluon/contrib/comet_messaging.py (html5 websockets) experimental +- fixed problem with services (broken in 1.91.5), thanks Vollrath +- customizable uploadwidget, thanks Fran +- fixed problem with mail unicode support, thanks Richard +- fixed problem with linkto=None and references fields in SQLTABLE, thanks villas +- no more upgrade button on windows since does not work +- better remember-me login, thanks Martin Weissenboeck +- support for recatcha options +- support for GAE namespaces via DAL('gae://namespace') +- new rocket (1.2.2), thanks Tim +- many other bug fixes and improvements (thanks Jonathan) + +## 1.92.1 +- much improved routing (thanks Jonathan) +- Expression.__mod__ (thanks Denes) +- admin has MULTI_USER_MODE (admin/models/0.py) +- support for count(distinct=...) +- has_permissions(...,group_id) +- IS_MATCH(...,strict=True) +- URL(...,scheme=,host=,port=), thanks Jonathan +- admin in Afrikaans, thanks Caleb +- auth.signature (experimental) +- many other bug fixes + +## 1.93.1-2 +- support for multiple interfaces, thanks Jonathan +- jquery 1.5.1 +- simplejson 2.1.3 +- customizable simplejson +- leaner app.yaml +- css3 buttons in welcome +- android support (experimental) +- Field(':hidden'), Field('.readonly'), Field('name=value') +- combined expressions print db.data.body.len().sum() +- wizard can download plugins +- better json serilization (object.custom_json) +- better xml serialization (object.custom_xml) +- better formstyle support +- better comet_messaging.py (needs more testing) +- many bug fixes + +## 1.94.1 +- moderniz 1.17 +- web2py no longer saves session if no change, this makes it up up to 10x faster for simple actions +- experimental REST API +- better support for MSSQL NOT NULL +- small bug fixes + +## 1.94.2 +- reverted wrong behavior of auth.requires(condition) in 1.94.1 + +## 1.94.3 +- fixed major bug in auth redirection + +## 1.94.4 +- removed debug print statement that caused problems on GAE and mod_wsgi + +## 1.94.5 +- fixed a major bug with session introdued in 1.94.1 + +## 1.94.6 +- fixed a number of minor bugs including adding some missing files +- better session handling on session._unlock(..), thanks Jonathan +- added experimental pip support, thanks Lifeeth +- added experimental SAP DB support + +## 1.95.1 +- Google MySQL support (experimental) +- pip support, thanks lifeeth +- better setup_exe.py, thanks meredyk +- importved pyfpdf +- domain check in email_auth.py, thanks Gyuris +- added change_password_onvalidation and change_password_onaccept +- DAL(...,migrate_enabled=True) +- login_methods/loginza.py, thanks Vladimir +- bpython shell support, thanks Arun +- request.uuid and response.uuid (for a future toolbar) +- db._timings contains database query timing info +- efficient db(...).isempty() +- setup-web2py-nginx-uwsgi-ubuntu.sh +- Many bug fixes, thanks Jonathan + +## 1.96.1 + +- "from gluon import *" imports in every python module a web2py environment (A, DIV,..SQLFORM, DAL, Field,...) including current.request, current.response, current.session, current.T, current.cache, thanks Jonathan. +- conditional models in + models//a.py and models///a.py +- from mymodule import *, looks for mymodule in applications/thisapp/modules first and then in sys.path. No more need for local_import. Thanks Pierre. +- usage of generic.* views is - by default - restricted to localhost for security. This can be changed in a granular way with: response.generic_patterns=['*']. This is a slight change of behavior for new app but a major security fix. + +- all applications have cas 2.0 provider at http://.../user/cas/login +- all applications can delegate to login to external provider Auth(...,cas_provider='http://.../other_app/default/user/cas') +- A(...,callback=URL(...),larget='id') does Ajax +- URL(...,user_signature=True), LOAD(...,user_signature=True) can sign urls and @auth.requires_signature() will check the signature for any decorated action. + +- DAL(...,migrate_enabled=False) to disable all migrations +- DAL(...,fake_migrate_all=True) to rebuild all corrupted metadata +- new DAL metadata format (databases/*.table) +- DAL(...,adapter_arg={}) allows support for alternate drivers +- DAL now allows circular table defintions +- DAL(..,auto_import=True) automatically imports tables from metadata without need to db.define_table(...)s. +- new alterante syntax for inner joins: db(...).select(join=...) +- experimental cubrid database support +- DAL 'request_tenant' fields are special, the altomatically filer all records based on their default value. +- db._common_fields.append(Field('owner')) allows to add fields to ALL tables +- DAL ignores repeated fields with same names + +- web2py_ajax.html is more modular, thanks Anthony +- request.is_local +- request.is_http +- new sessions2trash.py thanks Jim Karsten +- corrupted cache files are automatically deleted +- new simpler API gluon.contrib.AuthorizeNet.procss(...) +- fixed recaptcha (as they released new API) +- messages in validators have default internationalization +- No more Auth(globals(),db), just Auth(db). Same for Crud and Service. +- scripts/access.wsgi allows apache+mod_wsgi to delegate authentication of any URL to any web2py app +- json now supports T(...) +- scripts/setup-web2py-nginx-uwsgi-ubuntu.sh +- web2py HTTP responses now set: "X-Powered-By: web2py", thanks Bruno +- mostly fixed generic.pdf. You can view any page in PDF if you have pdflatex installed or if your html follows the pyfpdf convention. +- auth.settings.extra_fields['auth_user'].append(Field('country')) allows to extend auth_* tables without need of definiting a custom auth_* table. Must be placed before auth.define_tables() +- {{=response.toolbar()}} to help you debug applications +- web based shell now supports object modifications (but no redefinitions of non-serializable types) +- jQuery 1.6.1 +- Lots of bug fixes + +# 1.96.2-1.96.4 +- bug fixes + +# 1.97.1 +- validate_and_update, thanks Bruno +- fixed problem with new custom import, thanks Mart +- fixed pyamf 0.6, thanks Alexei and Nickd +- fixed "+ =" bug in wizard +- fixed problem with allowed_patterns +- fixed problems with LOAD and vars and ajax +- closed lots of google code tickets +- checkboxes should now work with list:string +- web2py works on Android, thanks Corne Dickens +- new cpdb.py, thanks Mart +- improved translation (frech in particuler), thanks Pierre +- improved cas_auth.py, thanks Sergio +- IS_DATE and IS_DATETIME validators now work with native types +- better description of --shell, thanks Anthony +- extra SQLTABLE columns, thanks Martin +- fixed toolbar conflics, thanks Simon +- GAE password shows with **** + +# 1.98.1 +- fixed some problems with LOAD(ajax=False), thanks Anthony +- jquery 1.6.2 +- gevent.pywsgi adds ssl support, thanks Vasile +- import/export of blobs are base64 encoded +- max number of login attemts in admin, thanks Ross +- fixed joins with alias tables +- new field.custom_delete attribute +- removed resctions on large 'text fields, thanks Martin +- field.represent = lambda value,record: .... (record is optional) +- FORM.validate() and FORM.process(), thanks Bruno +- faster visrtualfields, thanks Howsec +- mail has ssl support separate from tls, thanks Eric +- TAG objects are now pickable +- new CAT tag for no tags +- request.user_agent(), thanks Ross +- fixed fawps support +- SQLFORM(...,separator=': ') now customizable +- many small bug fixes ADDED VERSION Index: VERSION ================================================================== --- /dev/null +++ VERSION @@ -0,0 +1,1 @@ +Version 1.98.2 (2011-08-04 00:47:09) ADDED __init__.py Index: __init__.py ================================================================== --- /dev/null +++ __init__.py @@ -0,0 +1,1 @@ + ADDED anyserver.py Index: anyserver.py ================================================================== --- /dev/null +++ anyserver.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +This file is part of the web2py Web Framework +Copyrighted by Massimo Di Pierro +License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) + +This file is based, althought a rewrite, on MIT code from the Bottle web framework. +""" + +import os, sys, optparse +path = os.path.dirname(os.path.abspath(__file__)) +os.chdir(path) +sys.path = [path]+[p for p in sys.path if not p==path] +import gluon.main +from gluon.fileutils import read_file, write_file + +class Servers: + @staticmethod + def cgi(app, address=None, **options): + from wsgiref.handlers import CGIHandler + CGIHandler().run(app) # Just ignore host and port here + + @staticmethod + def flup(app,address, **options): + import flup.server.fcgi + flup.server.fcgi.WSGIServer(app, bindAddress=address).run() + + @staticmethod + def wsgiref(app,address,**options): # pragma: no cover + from wsgiref.simple_server import make_server, WSGIRequestHandler + class QuietHandler(WSGIRequestHandler): + def log_request(*args, **kw): pass + options['handler_class'] = QuietHandler + srv = make_server(address[0],address[1],app,**options) + srv.serve_forever() + + @staticmethod + def cherrypy(app,address, **options): + from cherrypy import wsgiserver + server = wsgiserver.CherryPyWSGIServer(address, app) + server.start() + + @staticmethod + def rocket(app,address, **options): + from gluon.rocket import CherryPyWSGIServer + server = CherryPyWSGIServer(address, app) + server.start() + + @staticmethod + def rocket_with_repoze_profiler(app,address, **options): + from gluon.rocket import CherryPyWSGIServer + from repoze.profile.profiler import AccumulatingProfileMiddleware + from gluon.settings import global_settings + global_settings.web2py_crontype = 'none' + wrapped = AccumulatingProfileMiddleware( + app, + log_filename='wsgi.prof', + discard_first_request=True, + flush_at_shutdown=True, + path = '/__profile__' + ) + server = CherryPyWSGIServer(address, wrapped) + server.start() + + @staticmethod + def paste(app,address,**options): + from paste import httpserver + from paste.translogger import TransLogger + httpserver.serve(app, host=address[0], port=address[1], **options) + + @staticmethod + def fapws(app,address, **options): + import fapws._evwsgi as evwsgi + from fapws import base + evwsgi.start(address[0],str(address[1])) + evwsgi.set_base_module(base) + def app(environ, start_response): + environ['wsgi.multiprocess'] = False + return app(environ, start_response) + evwsgi.wsgi_cb(('',app)) + evwsgi.run() + + + @staticmethod + def gevent(app,address, **options): + from gevent import monkey; monkey.patch_all() + from gevent import pywsgi + from gevent.pool import Pool + pywsgi.WSGIServer(address, app, spawn = 'workers' in options and Pool(int(option.workers)) or 'default').serve_forever() + + @staticmethod + def bjoern(app,address, **options): + import bjoern + bjoern.run(app, *address) + + @staticmethod + def tornado(app,address, **options): + import tornado.wsgi + import tornado.httpserver + import tornado.ioloop + container = tornado.wsgi.WSGIContainer(app) + server = tornado.httpserver.HTTPServer(container) + server.listen(address=address[0], port=address[1]) + tornado.ioloop.IOLoop.instance().start() + + @staticmethod + def twisted(app,address, **options): + from twisted.web import server, wsgi + from twisted.python.threadpool import ThreadPool + from twisted.internet import reactor + thread_pool = ThreadPool() + thread_pool.start() + reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) + factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, app)) + reactor.listenTCP(address[1], factory, interface=address[0]) + reactor.run() + + @staticmethod + def diesel(app,address, **options): + from diesel.protocols.wsgi import WSGIApplication + app = WSGIApplication(app, port=address[1]) + app.run() + + @staticmethod + def gnuicorn(app,address, **options): + import gunicorn.arbiter + gunicorn.arbiter.Arbiter(address, 4, app).run() + + @staticmethod + def eventlet(app,address, **options): + from eventlet import wsgi, listen + wsgi.server(listen(address), app) + + +def run(servername,ip,port,softcron=True,logging=False,profiler=None): + if logging: + application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase, + logfilename='httpserver.log', + profilerfilename=profiler) + else: + application = gluon.main.wsgibase + if softcron: + from gluon.settings import global_settings + global_settings.web2py_crontype = 'soft' + getattr(Servers,servername)(application,(ip,int(port))) + +def main(): + usage = "python anyserver.py -s tornado -i 127.0.0.1 -p 8000 -l -P" + try: + version = read_file('VERSION') + except IOError: + version = '' + parser = optparse.OptionParser(usage, None, optparse.Option, version) + parser.add_option('-l', + '--logging', + action='store_true', + default=False, + dest='logging', + help='log into httpserver.log') + parser.add_option('-P', + '--profiler', + default=False, + dest='profiler', + help='profiler filename') + servers = ', '.join(x for x in dir(Servers) if not x[0]=='_') + parser.add_option('-s', + '--server', + default='rocket', + dest='server', + help='server name (%s)' % servers) + parser.add_option('-i', + '--ip', + default='127.0.0.1', + dest='ip', + help='ip address') + parser.add_option('-p', + '--port', + default='8000', + dest='port', + help='port number') + parser.add_option('-w', + '--workers', + default='', + dest='workers', + help='number of workers number') + (options, args) = parser.parse_args() + print 'starting %s on %s:%s...' % (options.server,options.ip,options.port) + run(options.server,options.ip,options.port,logging=options.logging,profiler=options.profiler) + +if __name__=='__main__': + main() ADDED app.example.yaml Index: app.example.yaml ================================================================== --- /dev/null +++ app.example.yaml @@ -0,0 +1,88 @@ +# For Google App Engine deployment, copy this file to app.yaml +# and edit as required +# See http://code.google.com/appengine/docs/python/config/appconfig.html +# and http://web2py.com/book/default/chapter/11?search=app.yaml + +application: web2py +version: 1 +api_version: 1 +runtime: python + +default_expiration: "24h" + +derived_file_type: +- python_precompiled + +handlers: + +- url: /_ah/stats.* + script: $PYTHON_LIB/google/appengine/ext/appstats/ui.py + login: admin + +- url: /(?P.+?)/static/(?P.+) + static_files: applications/\1/static/\2 + upload: applications/(.+?)/static/(.+) + secure: optional + +- url: /favicon.ico + static_files: applications/welcome/static/favicon.ico + upload: applications/welcome/static/favicon.ico + +- url: /robots.txt + static_files: applications/welcome/static/robots.txt + upload: applications/welcome/static/robots.txt + +- url: /_ah/admin/.* + script: $PYTHON_LIB/google/appengine/ext/admin + login: admin + +- url: /_ah/queue/default + script: gaehandler.py + login: admin + +- url: .* + script: gaehandler.py + secure: optional + +admin_console: + pages: + - name: Appstats + url: /_ah/stats + +skip_files: | + ^(.*/)?( + (app\.yaml)| + (app\.yml)| + (index\.yaml)| + (index\.yml)| + (#.*#)| + (.*~)| + (.*\.py[co])| + (.*/RCS/.*)| + (\..*)| + (applications/(admin|examples)/.*)| + ((admin|examples|welcome)\.(w2p|tar))| + (applications/.*?/(cron|databases|errors|cache|sessions)/.*)| + ((logs|scripts)/.*)| + (anyserver\.py)| + (web2py\.py)| + ((cgi|fcgi|modpython|wsgi)handler\.py)| + (epydoc\.(conf|css))| + (httpserver\.log)| + (logging\.example\.conf)| + (route[rs]\.example\.py)| + (setup_(app|exe)\.py)| + (splashlogo\.gif)| + (parameters_\d+\.py)| + (options_std.py)| + (gluon/tests/.*)| + (gluon/(rocket|winservice)\.py)| + (contrib/(gateways|markdown|memcache|pymysql)/.*)| + (contrib/(populate|taskbar_widget)\.py)| + (google_appengine/.*)| + (.*\.(bak|orig))| + )$ + +builtins: +- remote_api: on +- datastore_admin: on ADDED appengine_config.py Index: appengine_config.py ================================================================== --- /dev/null +++ appengine_config.py @@ -0,0 +1,4 @@ +def webapp_add_wsgi_middleware(app): + from google.appengine.ext.appstats import recording + app = recording.appstats_wsgi_middleware(app) + return app ADDED applications/__init__.py Index: applications/__init__.py ================================================================== --- /dev/null +++ applications/__init__.py ADDED applications/admin/ABOUT Index: applications/admin/ABOUT ================================================================== --- /dev/null +++ applications/admin/ABOUT @@ -0,0 +1,6 @@ +web2py is an open source full-stack framework for agile development +of secure database-driven web-based applications, written and programmable in +Python. + +Created by Massimo Di Pierro + ADDED applications/admin/LICENSE Index: applications/admin/LICENSE ================================================================== --- /dev/null +++ applications/admin/LICENSE @@ -0,0 +1,137 @@ +## Web2py License + +Web2py is Licensed under the LGPL license version 3 +(http://www.gnu.org/licenses/lgpl.html) + +Copyrighted (c) by Massimo Di Pierro (2007-2011) + +### On Commercial Redistribution + +In accordance with LGPL you may: +- redistribute web2py with your apps (including official web2py binary versions) +- release your applications which use official web2py libraries under any license you wish +But you must: +- make clear in the documentation that your application uses web2py +- release any modification of the web2py libraries under the LGPLv3 license + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, +BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +(Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a +commercial exception which, for practical purposes, was very similar to the current LPGLv3) + +### Licenses for third party contributed software + +web2py contains third party software under the gluon/contrib/ folder. +Each file/module in contrib is distributed with web2py under its original license. +Here we list some of them. + +#### gluon.contrib.simplejson LICENSE + +Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +#### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE + +This is copyright (c) by Dalke Scientific Software, LLC and released under the +BSD license. See the file LICENSE in the distribution or + for details. + +#### gluon.contrib.markdown (markdown2) LICENSE + +MIT License from from + +#### gluon.contrib.feedparser LICENSE + +Copyright (c) 2002-2005, Mark Pilgrim + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +#### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) + +Copyright (c) 2004, CherryPy Team (team@cherrypy.org) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the CherryPy Team nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### gluon.contrib.pam LICENSE + +Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license + +#### gluon.contrib.shell LICENSE + +Copyright (C) by Google inc. Apache 2.0 Lincense + +#### The javascript licenses are in the code itself + ADDED applications/admin/__init__.py Index: applications/admin/__init__.py ================================================================== --- /dev/null +++ applications/admin/__init__.py ADDED applications/admin/controllers/appadmin.py Index: applications/admin/controllers/appadmin.py ================================================================== --- /dev/null +++ applications/admin/controllers/appadmin.py @@ -0,0 +1,408 @@ +# -*- coding: utf-8 -*- + +# ########################################################## +# ## make sure administrator is on localhost +# ########################################################### + +import os +import socket +import datetime +import copy +import gluon.contenttype +import gluon.fileutils + +# ## critical --- make a copy of the environment + +global_env = copy.copy(globals()) +global_env['datetime'] = datetime + +http_host = request.env.http_host.split(':')[0] +remote_addr = request.env.remote_addr +try: + hosts = (http_host, socket.gethostname(), + socket.gethostbyname(http_host), + '::1','127.0.0.1','::ffff:127.0.0.1') +except: + hosts = (http_host, ) + +if request.env.http_x_forwarded_for or request.env.wsgi_url_scheme\ + in ['https', 'HTTPS']: + session.secure() +elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"): + raise HTTP(200, T('appadmin is disabled because insecure channel')) + +if (request.application=='admin' and not session.authorized) or \ + (request.application!='admin' and not gluon.fileutils.check_credentials(request)): + redirect(URL('admin', 'default', 'index')) + +ignore_rw = True +response.view = 'appadmin.html' +response.menu = [[T('design'), False, URL('admin', 'default', 'design', + args=[request.application])], [T('db'), False, + URL('index')], [T('state'), False, + URL('state')], [T('cache'), False, + URL('ccache')]] + +# ########################################################## +# ## auxiliary functions +# ########################################################### + + +def get_databases(request): + dbs = {} + for (key, value) in global_env.items(): + cond = False + try: + cond = isinstance(value, GQLDB) + except: + cond = isinstance(value, SQLDB) + if cond: + dbs[key] = value + return dbs + + +databases = get_databases(None) + + +def eval_in_global_env(text): + exec ('_ret=%s' % text, {}, global_env) + return global_env['_ret'] + + +def get_database(request): + if request.args and request.args[0] in databases: + return eval_in_global_env(request.args[0]) + else: + session.flash = T('invalid request') + redirect(URL('index')) + + +def get_table(request): + db = get_database(request) + if len(request.args) > 1 and request.args[1] in db.tables: + return (db, request.args[1]) + else: + session.flash = T('invalid request') + redirect(URL('index')) + + +def get_query(request): + try: + return eval_in_global_env(request.vars.query) + except Exception: + return None + + +def query_by_table_type(tablename,db,request=request): + keyed = hasattr(db[tablename],'_primarykey') + if keyed: + firstkey = db[tablename][db[tablename]._primarykey[0]] + cond = '>0' + if firstkey.type in ['string', 'text']: + cond = '!=""' + qry = '%s.%s.%s%s' % (request.args[0], request.args[1], firstkey.name, cond) + else: + qry = '%s.%s.id>0' % tuple(request.args[:2]) + return qry + + + +# ########################################################## +# ## list all databases and tables +# ########################################################### + + +def index(): + return dict(databases=databases) + + +# ########################################################## +# ## insert a new record +# ########################################################### + + +def insert(): + (db, table) = get_table(request) + form = SQLFORM(db[table], ignore_rw=ignore_rw) + if form.accepts(request.vars, session): + response.flash = T('new record inserted') + return dict(form=form,table=db[table]) + + +# ########################################################## +# ## list all records in table and insert new record +# ########################################################### + + +def download(): + import os + db = get_database(request) + return response.download(request,db) + +def csv(): + import gluon.contenttype + response.headers['Content-Type'] = \ + gluon.contenttype.contenttype('.csv') + db = get_database(request) + query = get_query(request) + if not query: + return None + response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\ + % tuple(request.vars.query.split('.')[:2]) + return str(db(query).select()) + + +def import_csv(table, file): + table.import_from_csv_file(file) + +def select(): + import re + db = get_database(request) + dbname = request.args[0] + regex = re.compile('(?P\w+)\.(?P\w+)=(?P\d+)') + if len(request.args)>1 and hasattr(db[request.args[1]],'_primarykey'): + regex = re.compile('(?P
\w+)\.(?P\w+)=(?P.+)') + if request.vars.query: + match = regex.match(request.vars.query) + if match: + request.vars.query = '%s.%s.%s==%s' % (request.args[0], + match.group('table'), match.group('field'), + match.group('value')) + else: + request.vars.query = session.last_query + query = get_query(request) + if request.vars.start: + start = int(request.vars.start) + else: + start = 0 + nrows = 0 + stop = start + 100 + table = None + rows = [] + orderby = request.vars.orderby + if orderby: + orderby = dbname + '.' + orderby + if orderby == session.last_orderby: + if orderby[0] == '~': + orderby = orderby[1:] + else: + orderby = '~' + orderby + session.last_orderby = orderby + session.last_query = request.vars.query + form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px', + _name='query', _value=request.vars.query or '', + requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR(T('Update:'), + INPUT(_name='update_check', _type='checkbox', + value=False), INPUT(_style='width:400px', + _name='update_fields', _value=request.vars.update_fields + or '')), TR(T('Delete:'), INPUT(_name='delete_check', + _class='delete', _type='checkbox', value=False), ''), + TR('', '', INPUT(_type='submit', _value='submit'))), + _action=URL(r=request,args=request.args)) + if request.vars.csvfile != None: + try: + import_csv(db[request.vars.table], + request.vars.csvfile.file) + response.flash = T('data uploaded') + except Exception, e: + response.flash = DIV(T('unable to parse csv file'),PRE(str(e))) + if form.accepts(request.vars, formname=None): +# regex = re.compile(request.args[0] + '\.(?P
\w+)\.id\>0') + regex = re.compile(request.args[0] + '\.(?P
\w+)\..+') + + match = regex.match(form.vars.query.strip()) + if match: + table = match.group('table') + try: + nrows = db(query).count() + if form.vars.update_check and form.vars.update_fields: + db(query).update(**eval_in_global_env('dict(%s)' + % form.vars.update_fields)) + response.flash = T('%s rows updated', nrows) + elif form.vars.delete_check: + db(query).delete() + response.flash = T('%s rows deleted', nrows) + nrows = db(query).count() + if orderby: + rows = db(query).select(limitby=(start, stop), + orderby=eval_in_global_env(orderby)) + else: + rows = db(query).select(limitby=(start, stop)) + except Exception, e: + (rows, nrows) = ([], 0) + response.flash = DIV(T('Invalid Query'),PRE(str(e))) + return dict( + form=form, + table=table, + start=start, + stop=stop, + nrows=nrows, + rows=rows, + query=request.vars.query, + ) + + +# ########################################################## +# ## edit delete one record +# ########################################################### + + +def update(): + (db, table) = get_table(request) + keyed = hasattr(db[table],'_primarykey') + record = None + if keyed: + key = [f for f in request.vars if f in db[table]._primarykey] + if key: + record = db(db[table][key[0]] == request.vars[key[0]]).select().first() + else: + record = db(db[table].id == request.args(2)).select().first() + + if not record: + qry = query_by_table_type(table, db) + session.flash = T('record does not exist') + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + + if keyed: + for k in db[table]._primarykey: + db[table][k].writable=False + + form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'), + ignore_rw=ignore_rw and not keyed, + linkto=URL('select', + args=request.args[:1]), upload=URL(r=request, + f='download', args=request.args[:1])) + + if form.accepts(request.vars, session): + session.flash = T('done!') + qry = query_by_table_type(table, db) + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + return dict(form=form,table=db[table]) + + +# ########################################################## +# ## get global variables +# ########################################################### + + +def state(): + return dict() + +def ccache(): + form = FORM( + P(TAG.BUTTON("Clear CACHE?", _type="submit", _name="yes", _value="yes")), + P(TAG.BUTTON("Clear RAM", _type="submit", _name="ram", _value="ram")), + P(TAG.BUTTON("Clear DISK", _type="submit", _name="disk", _value="disk")), + ) + + if form.accepts(request.vars, session): + clear_ram = False + clear_disk = False + session.flash = "" + if request.vars.yes: + clear_ram = clear_disk = True + if request.vars.ram: + clear_ram = True + if request.vars.disk: + clear_disk = True + + if clear_ram: + cache.ram.clear() + session.flash += "Ram Cleared " + if clear_disk: + cache.disk.clear() + session.flash += "Disk Cleared" + + redirect(URL(r=request)) + + try: + from guppy import hpy; hp=hpy() + except ImportError: + hp = False + + import shelve, os, copy, time, math + from gluon import portalocker + + ram = { + 'bytes': 0, + 'objects': 0, + 'hits': 0, + 'misses': 0, + 'ratio': 0, + 'oldest': time.time() + } + disk = copy.copy(ram) + total = copy.copy(ram) + + for key, value in cache.ram.storage.items(): + if isinstance(value, dict): + ram['hits'] = value['hit_total'] - value['misses'] + ram['misses'] = value['misses'] + try: + ram['ratio'] = ram['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + ram['ratio'] = 0 + else: + if hp: + ram['bytes'] += hp.iso(value[1]).size + ram['objects'] += hp.iso(value[1]).count + + if value[0] < ram['oldest']: + ram['oldest'] = value[0] + + locker = open(os.path.join(request.folder, + 'cache/cache.lock'), 'a') + portalocker.lock(locker, portalocker.LOCK_EX) + disk_storage = shelve.open(os.path.join(request.folder, 'cache/cache.shelve')) + try: + for key, value in disk_storage.items(): + if isinstance(value, dict): + disk['hits'] = value['hit_total'] - value['misses'] + disk['misses'] = value['misses'] + try: + disk['ratio'] = disk['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + disk['ratio'] = 0 + else: + if hp: + disk['bytes'] += hp.iso(value[1]).size + disk['objects'] += hp.iso(value[1]).count + if value[0] < disk['oldest']: + disk['oldest'] = value[0] + finally: + portalocker.unlock(locker) + locker.close() + disk_storage.close() + + total['bytes'] = ram['bytes'] + disk['bytes'] + total['objects'] = ram['objects'] + disk['objects'] + total['hits'] = ram['hits'] + disk['hits'] + total['misses'] = ram['misses'] + disk['misses'] + try: + total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses']) + except (KeyError, ZeroDivisionError): + total['ratio'] = 0 + + if disk['oldest'] < ram['oldest']: + total['oldest'] = disk['oldest'] + else: + total['oldest'] = ram['oldest'] + + def GetInHMS(seconds): + hours = math.floor(seconds / 3600) + seconds -= hours * 3600 + minutes = math.floor(seconds / 60) + seconds -= minutes * 60 + seconds = math.floor(seconds) + + return (hours, minutes, seconds) + + ram['oldest'] = GetInHMS(time.time() - ram['oldest']) + disk['oldest'] = GetInHMS(time.time() - disk['oldest']) + total['oldest'] = GetInHMS(time.time() - total['oldest']) + + return dict(form=form, total=total, + ram=ram, disk=disk) + ADDED applications/admin/controllers/default.py Index: applications/admin/controllers/default.py ================================================================== --- /dev/null +++ applications/admin/controllers/default.py @@ -0,0 +1,1222 @@ +# coding: utf8 + +from gluon.admin import * +from gluon.fileutils import abspath, read_file, write_file +from glob import glob +import shutil +import platform + +if DEMO_MODE and request.function in ['change_password','pack','pack_plugin','upgrade_web2py','uninstall','cleanup','compile_app','remove_compiled_app','delete','delete_plugin','create_file','upload_file','update_languages','reload_routes']: + session.flash = T('disabled in demo mode') + redirect(URL('site')) + +if not is_manager() and request.function in ['change_password','upgrade_web2py']: + session.flash = T('disabled in multi user mode') + redirect(URL('site')) + +if FILTER_APPS and request.args(0) and not request.args(0) in FILTER_APPS: + session.flash = T('disabled in demo mode') + redirect(URL('site')) + +def safe_open(a,b): + if DEMO_MODE and 'w' in b: + class tmp: + def write(self,data): pass + return tmp() + return open(a,b) + +def safe_read(a, b='r'): + safe_file = safe_open(a, b) + try: + return safe_file.read() + finally: + safe_file.close() + +def safe_write(a, value, b='w'): + safe_file = safe_open(a, b) + try: + safe_file.write(value) + finally: + safe_file.close() + +def get_app(name=None): + app = name or request.args(0) + if app and (not MULTI_USER_MODE or db(db.app.name==app)(db.app.owner==auth.user.id).count()): + return app + session.flash = 'App does not exist or your are not authorized' + redirect(URL('site')) + +def index(): + """ Index handler """ + + send = request.vars.send + if DEMO_MODE: + session.authorized = True + session.last_time = t0 + if not send: + send = URL('site') + if session.authorized: + redirect(send) + elif request.vars.password: + if verify_password(request.vars.password): + session.authorized = True + login_record(True) + + if CHECK_VERSION: + session.check_version = True + else: + session.check_version = False + + session.last_time = t0 + if isinstance(send, list): # ## why does this happen? + send = str(send[0]) + + redirect(send) + else: + times_denied = login_record(False) + if times_denied >= allowed_number_of_attempts: + response.flash = \ + T('admin disabled because too many invalid login attempts') + elif times_denied == allowed_number_of_attempts - 1: + response.flash = \ + T('You have one more login attempt before you are locked out') + else: + response.flash = T('invalid password.') + return dict(send=send) + + +def check_version(): + """ Checks if web2py is up to date """ + + session.forget() + session._unlock(response) + + new_version, version_number = check_new_version(request.env.web2py_version, + WEB2PY_VERSION_URL) + + if new_version == -1: + return A(T('Unable to check for upgrades'), _href=WEB2PY_URL) + elif new_version != True: + return A(T('web2py is up to date'), _href=WEB2PY_URL) + elif platform.system().lower() in ('windows','win32','win64') and os.path.exists("web2py.exe"): + return SPAN('You should upgrade to version %s' % version_number) + else: + return sp_button(URL('upgrade_web2py'), T('upgrade now')) \ + + XML(' %s' % version_number) + + +def logout(): + """ Logout handler """ + session.authorized = None + if MULTI_USER_MODE: + redirect(URL('user/logout')) + redirect(URL('index')) + + +def change_password(): + + if session.pam_user: + session.flash = T('PAM authenticated user, cannot change password here') + redirect(URL('site')) + form=SQLFORM.factory(Field('current_admin_password','password'), + Field('new_admin_password','password',requires=IS_STRONG()), + Field('new_admin_password_again','password')) + if form.accepts(request.vars): + if not verify_password(request.vars.current_admin_password): + form.errors.current_admin_password = T('invalid password') + elif form.vars.new_admin_password != form.vars.new_admin_password_again: + form.errors.new_admin_password_again = T('no match') + else: + path = abspath('parameters_%s.py' % request.env.server_port) + safe_write(path, 'password="%s"' % CRYPT()(request.vars.new_admin_password)[0]) + session.flash = T('password changed') + redirect(URL('site')) + return dict(form=form) + +def site(): + """ Site handler """ + + myversion = request.env.web2py_version + + # Shortcut to make the elif statements more legible + file_or_appurl = 'file' in request.vars or 'appurl' in request.vars + + if DEMO_MODE: + pass + + elif request.vars.filename and not 'file' in request.vars: + # create a new application + appname = cleanpath(request.vars.filename).replace('.', '_') + if app_create(appname, request): + if MULTI_USER_MODE: + db.app.insert(name=appname,owner=auth.user.id) + session.flash = T('new application "%s" created', appname) + redirect(URL('design',args=appname)) + else: + session.flash = \ + T('unable to create application "%s" (it may exist already)', request.vars.filename) + redirect(URL(r=request)) + + elif file_or_appurl and not request.vars.filename: + # can't do anything without an app name + msg = 'you must specify a name for the uploaded application' + response.flash = T(msg) + + elif file_or_appurl and request.vars.filename: + # fetch an application via URL or file upload + f = None + if request.vars.appurl is not '': + try: + f = urllib.urlopen(request.vars.appurl) + except Exception, e: + session.flash = DIV(T('Unable to download app because:'),PRE(str(e))) + redirect(URL(r=request)) + fname = request.vars.appurl + elif request.vars.file is not '': + f = request.vars.file.file + fname = request.vars.file.filename + + if f: + appname = cleanpath(request.vars.filename).replace('.', '_') + installed = app_install(appname, f, request, fname, + overwrite=request.vars.overwrite_check) + if f and installed: + msg = 'application %(appname)s installed with md5sum: %(digest)s' + session.flash = T(msg, dict(appname=appname, + digest=md5_hash(installed))) + elif f and request.vars.overwrite_check: + msg = 'unable to install application "%(appname)s"' + session.flash = T(msg, dict(appname=request.vars.filename)) + + else: + msg = 'unable to install application "%(appname)s"' + session.flash = T(msg, dict(appname=request.vars.filename)) + + redirect(URL(r=request)) + + regex = re.compile('^\w+$') + + if is_manager(): + apps = [f for f in os.listdir(apath(r=request)) if regex.match(f)] + else: + apps = [f.name for f in db(db.app.owner==auth.user_id).select()] + + if FILTER_APPS: + apps = [f for f in apps if f in FILTER_APPS] + + apps = sorted(apps,lambda a,b:cmp(a.upper(),b.upper())) + + return dict(app=None, apps=apps, myversion=myversion) + + +def pack(): + app = get_app() + + if len(request.args) == 1: + fname = 'web2py.app.%s.w2p' % app + filename = app_pack(app, request) + else: + fname = 'web2py.app.%s.compiled.w2p' % app + filename = app_pack_compiled(app, request) + + if filename: + response.headers['Content-Type'] = 'application/w2p' + disposition = 'attachment; filename=%s' % fname + response.headers['Content-Disposition'] = disposition + return safe_read(filename, 'rb') + else: + session.flash = T('internal error') + redirect(URL('site')) + +def pack_plugin(): + app = get_app() + if len(request.args) == 2: + fname = 'web2py.plugin.%s.w2p' % request.args[1] + filename = plugin_pack(app, request.args[1], request) + if filename: + response.headers['Content-Type'] = 'application/w2p' + disposition = 'attachment; filename=%s' % fname + response.headers['Content-Disposition'] = disposition + return safe_read(filename, 'rb') + else: + session.flash = T('internal error') + redirect(URL('plugin',args=request.args)) + +def upgrade_web2py(): + if 'upgrade' in request.vars: + (success, error) = upgrade(request) + if success: + session.flash = T('web2py upgraded; please restart it') + else: + session.flash = T('unable to upgrade because "%s"', error) + redirect(URL('site')) + elif 'noupgrade' in request.vars: + redirect(URL('site')) + return dict() + +def uninstall(): + app = get_app() + if 'delete' in request.vars: + if MULTI_USER_MODE: + if is_manager() and db(db.app.name==app).delete(): + pass + elif db(db.app.name==app)(db.app.owner==auth.user.id).delete(): + pass + else: + session.flash = T('no permission to uninstall "%s"', app) + redirect(URL('site')) + if app_uninstall(app, request): + session.flash = T('application "%s" uninstalled', app) + else: + session.flash = T('unable to uninstall "%s"', app) + redirect(URL('site')) + elif 'nodelete' in request.vars: + redirect(URL('site')) + return dict(app=app) + + +def cleanup(): + app = get_app() + clean = app_cleanup(app, request) + if not clean: + session.flash = T("some files could not be removed") + else: + session.flash = T('cache, errors and sessions cleaned') + + redirect(URL('site')) + + +def compile_app(): + app = get_app() + c = app_compile(app, request) + if not c: + session.flash = T('application compiled') + else: + session.flash = DIV(T('Cannot compile: there are errors in your app:'), + CODE(c)) + redirect(URL('site')) + + +def remove_compiled_app(): + """ Remove the compiled application """ + app = get_app() + remove_compiled_application(apath(app, r=request)) + session.flash = T('compiled application removed') + redirect(URL('site')) + +def delete(): + """ Object delete handler """ + app = get_app() + filename = '/'.join(request.args) + sender = request.vars.sender + + if isinstance(sender, list): # ## fix a problem with Vista + sender = sender[0] + + if 'nodelete' in request.vars: + redirect(URL(sender)) + elif 'delete' in request.vars: + try: + os.unlink(apath(filename, r=request)) + session.flash = T('file "%(filename)s" deleted', + dict(filename=filename)) + except Exception: + session.flash = T('unable to delete file "%(filename)s"', + dict(filename=filename)) + redirect(URL(sender)) + return dict(filename=filename, sender=sender) + +def peek(): + """ Visualize object code """ + app = get_app() + filename = '/'.join(request.args) + try: + data = safe_read(apath(filename, r=request)).replace('\r','') + except IOError: + session.flash = T('file does not exist') + redirect(URL('site')) + + extension = filename[filename.rfind('.') + 1:].lower() + + return dict(app=request.args[0], + filename=filename, + data=data, + extension=extension) + + +def test(): + """ Execute controller tests """ + app = get_app() + if len(request.args) > 1: + file = request.args[1] + else: + file = '.*\.py' + + controllers = listdir(apath('%s/controllers/' % app, r=request), file + '$') + + return dict(app=app, controllers=controllers) + +def keepalive(): + return '' + +def search(): + keywords=request.vars.keywords or '' + app = get_app() + def match(filename,keywords): + filename=os.path.join(apath(app, r=request),filename) + if keywords in read_file(filename,'rb'): + return True + return False + path = apath(request.args[0], r=request) + files1 = glob(os.path.join(path,'*/*.py')) + files2 = glob(os.path.join(path,'*/*.html')) + files3 = glob(os.path.join(path,'*/*/*.html')) + files=[x[len(path)+1:].replace('\\','/') for x in files1+files2+files3 if match(x,keywords)] + return response.json({'files':files}) + +def edit(): + """ File edit handler """ + # Load json only if it is ajax edited... + app = get_app() + filename = '/'.join(request.args) + # Try to discover the file type + if filename[-3:] == '.py': + filetype = 'python' + elif filename[-5:] == '.html': + filetype = 'html' + elif filename[-5:] == '.load': + filetype = 'html' + elif filename[-4:] == '.css': + filetype = 'css' + elif filename[-3:] == '.js': + filetype = 'js' + else: + filetype = 'html' + + # ## check if file is not there + + path = apath(filename, r=request) + + if request.vars.revert and os.path.exists(path + '.bak'): + try: + data = safe_read(path + '.bak') + data1 = safe_read(path) + except IOError: + session.flash = T('Invalid action') + if 'from_ajax' in request.vars: + return response.json({'error': str(T('Invalid action'))}) + else: + redirect(URL('site')) + + safe_write(path, data) + file_hash = md5_hash(data) + saved_on = time.ctime(os.stat(path)[stat.ST_MTIME]) + safe_write(path + '.bak', data1) + response.flash = T('file "%s" of %s restored', (filename, saved_on)) + else: + try: + data = safe_read(path) + except IOError: + session.flash = T('Invalid action') + if 'from_ajax' in request.vars: + return response.json({'error': str(T('Invalid action'))}) + else: + redirect(URL('site')) + + file_hash = md5_hash(data) + saved_on = time.ctime(os.stat(path)[stat.ST_MTIME]) + + if request.vars.file_hash and request.vars.file_hash != file_hash: + session.flash = T('file changed on disk') + data = request.vars.data.replace('\r\n', '\n').strip() + '\n' + safe_write(path + '.1', data) + if 'from_ajax' in request.vars: + return response.json({'error': str(T('file changed on disk')), + 'redirect': URL('resolve', + args=request.args)}) + else: + redirect(URL('resolve', args=request.args)) + elif request.vars.data: + safe_write(path + '.bak', data) + data = request.vars.data.replace('\r\n', '\n').strip() + '\n' + safe_write(path, data) + file_hash = md5_hash(data) + saved_on = time.ctime(os.stat(path)[stat.ST_MTIME]) + response.flash = T('file saved on %s', saved_on) + + data_or_revert = (request.vars.data or request.vars.revert) + + # Check compile errors + highlight = None + if filetype == 'python' and request.vars.data: + import _ast + try: + code = request.vars.data.rstrip().replace('\r\n','\n')+'\n' + compile(code, path, "exec", _ast.PyCF_ONLY_AST) + except Exception, e: + start = sum([len(line)+1 for l, line + in enumerate(request.vars.data.split("\n")) + if l < e.lineno-1]) + if e.text and e.offset: + offset = e.offset - (len(e.text) - len(e.text.splitlines()[-1])) + else: + offset = 0 + highlight = {'start': start, 'end': start + offset + 1} + try: + ex_name = e.__class__.__name__ + except: + ex_name = 'unknown exception!' + response.flash = DIV(T('failed to compile file because:'), BR(), + B(ex_name), T(' at line %s') % e.lineno, + offset and T(' at char %s') % offset or '', + PRE(str(e))) + + if data_or_revert and request.args[1] == 'modules': + # Lets try to reload the modules + try: + mopath = '.'.join(request.args[2:])[:-3] + exec 'import applications.%s.modules.%s' % (request.args[0], mopath) + reload(sys.modules['applications.%s.modules.%s' + % (request.args[0], mopath)]) + except Exception, e: + response.flash = DIV(T('failed to reload module because:'),PRE(str(e))) + + edit_controller = None + editviewlinks = None + view_link = None + if filetype == 'html' and len(request.args) >= 3: + cfilename = os.path.join(request.args[0], 'controllers', + request.args[2] + '.py') + if os.path.exists(apath(cfilename, r=request)): + edit_controller = URL('edit', args=[cfilename]) + view = request.args[3].replace('.html','') + view_link = URL(request.args[0],request.args[2],view) + elif filetype == 'python' and request.args[1] == 'controllers': + ## it's a controller file. + ## Create links to all of the associated view files. + app = get_app() + viewname = os.path.splitext(request.args[2])[0] + viewpath = os.path.join(app,'views',viewname) + aviewpath = apath(viewpath, r=request) + viewlist = [] + if os.path.exists(aviewpath): + if os.path.isdir(aviewpath): + viewlist = glob(os.path.join(aviewpath,'*.html')) + elif os.path.exists(aviewpath+'.html'): + viewlist.append(aviewpath+'.html') + if len(viewlist): + editviewlinks = [] + for v in viewlist: + vf = os.path.split(v)[-1] + vargs = "/".join([viewpath.replace(os.sep,"/"),vf]) + editviewlinks.append(A(T(vf.split(".")[0]),\ + _href=URL('edit',args=[vargs]))) + + if len(request.args) > 2 and request.args[1] == 'controllers': + controller = (request.args[2])[:-3] + functions = regex_expose.findall(data) + else: + (controller, functions) = (None, None) + + if 'from_ajax' in request.vars: + return response.json({'file_hash': file_hash, 'saved_on': saved_on, 'functions':functions, 'controller': controller, 'application': request.args[0], 'highlight': highlight }) + else: + + editarea_preferences = {} + editarea_preferences['FONT_SIZE'] = '10' + editarea_preferences['FULL_SCREEN'] = 'false' + editarea_preferences['ALLOW_TOGGLE'] = 'true' + editarea_preferences['REPLACE_TAB_BY_SPACES'] = '4' + editarea_preferences['DISPLAY'] = 'onload' + for key in editarea_preferences: + if globals().has_key(key): + editarea_preferences[key]=globals()[key] + return dict(app=request.args[0], + filename=filename, + filetype=filetype, + data=data, + edit_controller=edit_controller, + file_hash=file_hash, + saved_on=saved_on, + controller=controller, + functions=functions, + view_link=view_link, + editarea_preferences=editarea_preferences, + editviewlinks=editviewlinks) + +def resolve(): + """ + """ + + filename = '/'.join(request.args) + # ## check if file is not there + path = apath(filename, r=request) + a = safe_read(path).split('\n') + try: + b = safe_read(path + '.1').split('\n') + except IOError: + session.flash = 'Other file, no longer there' + redirect(URL('edit', args=request.args)) + + d = difflib.ndiff(a, b) + + def leading(line): + """ """ + + # TODO: we really need to comment this + z = '' + for (k, c) in enumerate(line): + if c == ' ': + z += ' ' + elif c == ' \t': + z += ' ' + elif k == 0 and c == '?': + pass + else: + break + + return XML(z) + + def getclass(item): + """ Determine item class """ + + if item[0] == ' ': + return 'normal' + if item[0] == '+': + return 'plus' + if item[0] == '-': + return 'minus' + + if request.vars: + c = ''.join([item[2:] for (i, item) in enumerate(d) if item[0] \ + == ' ' or 'line%i' % i in request.vars]) + safe_write(path, c) + session.flash = 'files merged' + redirect(URL('edit', args=request.args)) + else: + # Making the short circuit compatible with <= python2.4 + gen_data = lambda index,item: not item[:1] in ['+','-'] and "" \ + or INPUT(_type='checkbox', + _name='line%i' % index, + value=item[0] == '+') + + diff = TABLE(*[TR(TD(gen_data(i,item)), + TD(item[0]), + TD(leading(item[2:]), + TT(item[2:].rstrip())), _class=getclass(item)) + for (i, item) in enumerate(d) if item[0] != '?']) + + return dict(diff=diff, filename=filename) + + +def edit_language(): + """ Edit language file """ + app = get_app() + filename = '/'.join(request.args) + from gluon.languages import read_dict, write_dict + strings = read_dict(apath(filename, r=request)) + keys = sorted(strings.keys(),lambda x,y: cmp(x.lower(), y.lower())) + rows = [] + rows.append(H2(T('Original/Translation'))) + + for key in keys: + name = md5_hash(key) + if key==strings[key]: + _class='untranslated' + else: + _class='translated' + if len(key) <= 40: + elem = INPUT(_type='text', _name=name,value=strings[key], + _size=70,_class=_class) + else: + elem = TEXTAREA(_name=name, value=strings[key], _cols=70, + _rows=5, _class=_class) + + # Making the short circuit compatible with <= python2.4 + k = (strings[key] != key) and key or B(key) + + rows.append(P(k, BR(), elem, TAG.BUTTON(T('delete'), + _onclick='return delkey("%s")' % name), _id=name)) + + rows.append(INPUT(_type='submit', _value=T('update'))) + form = FORM(*rows) + if form.accepts(request.vars, keepvalues=True): + strs = dict() + for key in keys: + name = md5_hash(key) + if form.vars[name]==chr(127): continue + strs[key] = form.vars[name] + write_dict(apath(filename, r=request), strs) + session.flash = T('file saved on %(time)s', dict(time=time.ctime())) + redirect(URL(r=request,args=request.args)) + return dict(app=request.args[0], filename=filename, form=form) + + +def about(): + """ Read about info """ + app = get_app() + # ## check if file is not there + about = safe_read(apath('%s/ABOUT' % app, r=request)) + license = safe_read(apath('%s/LICENSE' % app, r=request)) + return dict(app=app, about=MARKMIN(about), license=MARKMIN(license)) + + +def design(): + """ Application design handler """ + app = get_app() + + if not response.flash and app == request.application: + msg = T('ATTENTION: you cannot edit the running application!') + response.flash = msg + + if request.vars.pluginfile!=None and not isinstance(request.vars.pluginfile,str): + filename=os.path.basename(request.vars.pluginfile.filename) + if plugin_install(app, request.vars.pluginfile.file, + request, filename): + session.flash = T('new plugin installed') + redirect(URL('design',args=app)) + else: + session.flash = \ + T('unable to create application "%s"', request.vars.filename) + redirect(URL(r=request)) + elif isinstance(request.vars.pluginfile,str): + session.flash = T('plugin not specified') + redirect(URL(r=request)) + + + # If we have only pyc files it means that + # we cannot design + if os.path.exists(apath('%s/compiled' % app, r=request)): + session.flash = \ + T('application is compiled and cannot be designed') + redirect(URL('site')) + + # Get all models + models = listdir(apath('%s/models/' % app, r=request), '.*\.py$') + models=[x.replace('\\','/') for x in models] + defines = {} + for m in models: + data = safe_read(apath('%s/models/%s' % (app, m), r=request)) + defines[m] = regex_tables.findall(data) + defines[m].sort() + + # Get all controllers + controllers = sorted(listdir(apath('%s/controllers/' % app, r=request), '.*\.py$')) + controllers = [x.replace('\\','/') for x in controllers] + functions = {} + for c in controllers: + data = safe_read(apath('%s/controllers/%s' % (app, c), r=request)) + items = regex_expose.findall(data) + functions[c] = items + + # Get all views + views = sorted(listdir(apath('%s/views/' % app, r=request), '[\w/\-]+\.\w+$')) + views = [x.replace('\\','/') for x in views] + extend = {} + include = {} + for c in views: + data = safe_read(apath('%s/views/%s' % (app, c), r=request)) + items = regex_extend.findall(data) + + if items: + extend[c] = items[0][1] + + items = regex_include.findall(data) + include[c] = [i[1] for i in items] + + # Get all modules + modules = listdir(apath('%s/modules/' % app, r=request), '.*\.py$') + modules = modules=[x.replace('\\','/') for x in modules] + modules.sort() + + # Get all static files + statics = listdir(apath('%s/static/' % app, r=request), '[^\.#].*') + statics = [x.replace('\\','/') for x in statics] + statics.sort() + + # Get all languages + languages = listdir(apath('%s/languages/' % app, r=request), '[\w-]*\.py') + + #Get crontab + cronfolder = apath('%s/cron' % app, r=request) + if not os.path.exists(cronfolder): os.mkdir(cronfolder) + crontab = apath('%s/cron/crontab' % app, r=request) + if not os.path.exists(crontab): + safe_write(crontab, '#crontab') + + plugins=[] + def filter_plugins(items,plugins): + plugins+=[item[7:].split('/')[0].split('.')[0] for item in items if item.startswith('plugin_')] + plugins[:]=list(set(plugins)) + plugins.sort() + return [item for item in items if not item.startswith('plugin_')] + + return dict(app=app, + models=filter_plugins(models,plugins), + defines=defines, + controllers=filter_plugins(controllers,plugins), + functions=functions, + views=filter_plugins(views,plugins), + modules=filter_plugins(modules,plugins), + extend=extend, + include=include, + statics=filter_plugins(statics,plugins), + languages=languages, + crontab=crontab, + plugins=plugins) + +def delete_plugin(): + """ Object delete handler """ + app=request.args(0) + plugin = request.args(1) + plugin_name='plugin_'+plugin + if 'nodelete' in request.vars: + redirect(URL('design',args=app)) + elif 'delete' in request.vars: + try: + for folder in ['models','views','controllers','static','modules']: + path=os.path.join(apath(app,r=request),folder) + for item in os.listdir(path): + if item.startswith(plugin_name): + filename=os.path.join(path,item) + if os.path.isdir(filename): + shutil.rmtree(filename) + else: + os.unlink(filename) + session.flash = T('plugin "%(plugin)s" deleted', + dict(plugin=plugin)) + except Exception: + session.flash = T('unable to delete file plugin "%(plugin)s"', + dict(plugin=plugin)) + redirect(URL('design',args=request.args(0))) + return dict(plugin=plugin) + +def plugin(): + """ Application design handler """ + app = get_app() + plugin = request.args(1) + + if not response.flash and app == request.application: + msg = T('ATTENTION: you cannot edit the running application!') + response.flash = msg + + # If we have only pyc files it means that + # we cannot design + if os.path.exists(apath('%s/compiled' % app, r=request)): + session.flash = \ + T('application is compiled and cannot be designed') + redirect(URL('site')) + + # Get all models + models = listdir(apath('%s/models/' % app, r=request), '.*\.py$') + models=[x.replace('\\','/') for x in models] + defines = {} + for m in models: + data = safe_read(apath('%s/models/%s' % (app, m), r=request)) + defines[m] = regex_tables.findall(data) + defines[m].sort() + + # Get all controllers + controllers = sorted(listdir(apath('%s/controllers/' % app, r=request), '.*\.py$')) + controllers = [x.replace('\\','/') for x in controllers] + functions = {} + for c in controllers: + data = safe_read(apath('%s/controllers/%s' % (app, c), r=request)) + items = regex_expose.findall(data) + functions[c] = items + + # Get all views + views = sorted(listdir(apath('%s/views/' % app, r=request), '[\w/\-]+\.\w+$')) + views = [x.replace('\\','/') for x in views] + extend = {} + include = {} + for c in views: + data = safe_read(apath('%s/views/%s' % (app, c), r=request)) + items = regex_extend.findall(data) + if items: + extend[c] = items[0][1] + + items = regex_include.findall(data) + include[c] = [i[1] for i in items] + + # Get all modules + modules = listdir(apath('%s/modules/' % app, r=request), '.*\.py$') + modules = modules=[x.replace('\\','/') for x in modules] + modules.sort() + + # Get all static files + statics = listdir(apath('%s/static/' % app, r=request), '[^\.#].*') + statics = [x.replace('\\','/') for x in statics] + statics.sort() + + # Get all languages + languages = listdir(apath('%s/languages/' % app, r=request), '[\w-]*\.py') + + #Get crontab + crontab = apath('%s/cron/crontab' % app, r=request) + if not os.path.exists(crontab): + safe_write(crontab, '#crontab') + + def filter_plugins(items): + regex=re.compile('^plugin_'+plugin+'(/.*|\..*)?$') + return [item for item in items if regex.match(item)] + + return dict(app=app, + models=filter_plugins(models), + defines=defines, + controllers=filter_plugins(controllers), + functions=functions, + views=filter_plugins(views), + modules=filter_plugins(modules), + extend=extend, + include=include, + statics=filter_plugins(statics), + languages=languages, + crontab=crontab) + + +def create_file(): + """ Create files handler """ + try: + app = get_app(name=request.vars.location.split('/')[0]) + path = apath(request.vars.location, r=request) + filename = re.sub('[^\w./-]+', '_', request.vars.filename) + + if path[-11:] == '/languages/': + # Handle language files + if len(filename) == 0: + raise SyntaxError + if not filename[-3:] == '.py': + filename += '.py' + app = path.split('/')[-3] + path=os.path.join(apath(app, r=request),'languages',filename) + if not os.path.exists(path): + safe_write(path, '') + findT(apath(app, r=request), filename[:-3]) + session.flash = T('language file "%(filename)s" created/updated', + dict(filename=filename)) + redirect(request.vars.sender) + + elif path[-8:] == '/models/': + # Handle python models + if not filename[-3:] == '.py': + filename += '.py' + + if len(filename) == 3: + raise SyntaxError + + text = '# coding: utf8\n' + + elif path[-13:] == '/controllers/': + # Handle python controllers + if not filename[-3:] == '.py': + filename += '.py' + + if len(filename) == 3: + raise SyntaxError + + text = '# coding: utf8\n# %s\ndef index(): return dict(message="hello from %s")' + text = text % (T('try something like'), filename) + + elif path[-7:] == '/views/': + if request.vars.plugin and not filename.startswith('plugin_%s/' % request.vars.plugin): + filename = 'plugin_%s/%s' % (request.vars.plugin, filename) + # Handle template (html) views + if filename.find('.')<0: + filename += '.html' + extension = filename.split('.')[-1].lower() + + if len(filename) == 5: + raise SyntaxError + + msg = T('This is the %(filename)s template', + dict(filename=filename)) + if extension == 'html': + text = dedent(""" + {{extend 'layout.html'}} +

%s

+ {{=BEAUTIFY(response._vars)}}""" % msg) + else: + generic = os.path.join(path,'generic.'+extension) + if os.path.exists(generic): + text = read_file(generic) + else: + text = '' + + elif path[-9:] == '/modules/': + if request.vars.plugin and not filename.startswith('plugin_%s/' % request.vars.plugin): + filename = 'plugin_%s/%s' % (request.vars.plugin, filename) + # Handle python module files + if not filename[-3:] == '.py': + filename += '.py' + + if len(filename) == 3: + raise SyntaxError + + text = dedent(""" + #!/usr/bin/env python + # coding: utf8 + from gluon import *\n""") + + elif path[-8:] == '/static/': + if request.vars.plugin and not filename.startswith('plugin_%s/' % request.vars.plugin): + filename = 'plugin_%s/%s' % (request.vars.plugin, filename) + text = '' + else: + redirect(request.vars.sender) + + full_filename = os.path.join(path, filename) + dirpath = os.path.dirname(full_filename) + + if not os.path.exists(dirpath): + os.makedirs(dirpath) + + if os.path.exists(full_filename): + raise SyntaxError + + safe_write(full_filename, text) + session.flash = T('file "%(filename)s" created', + dict(filename=full_filename[len(path):])) + redirect(URL('edit', + args=[os.path.join(request.vars.location, filename)])) + except Exception, e: + if not isinstance(e,HTTP): + session.flash = T('cannot create file') + + redirect(request.vars.sender) + + +def upload_file(): + """ File uploading handler """ + + try: + filename = None + app = get_app(name=request.vars.location.split('/')[0]) + path = apath(request.vars.location, r=request) + + if request.vars.filename: + filename = re.sub('[^\w\./]+', '_', request.vars.filename) + else: + filename = os.path.split(request.vars.file.filename)[-1] + + if path[-8:] == '/models/' and not filename[-3:] == '.py': + filename += '.py' + + if path[-9:] == '/modules/' and not filename[-3:] == '.py': + filename += '.py' + + if path[-13:] == '/controllers/' and not filename[-3:] == '.py': + filename += '.py' + + if path[-7:] == '/views/' and not filename[-5:] == '.html': + filename += '.html' + + if path[-11:] == '/languages/' and not filename[-3:] == '.py': + filename += '.py' + + filename = os.path.join(path, filename) + dirpath = os.path.dirname(filename) + + if not os.path.exists(dirpath): + os.makedirs(dirpath) + + safe_write(filename, request.vars.file.file.read(), 'wb') + session.flash = T('file "%(filename)s" uploaded', + dict(filename=filename[len(path):])) + except Exception: + if filename: + d = dict(filename = filename[len(path):]) + else: + d = dict(filename = 'unkown') + session.flash = T('cannot upload file "%(filename)s"', d) + + redirect(request.vars.sender) + + +def errors(): + """ Error handler """ + import operator + import os + import pickle + import hashlib + + app = get_app() + + method = request.args(1) or 'new' + + + if method == 'new': + errors_path = apath('%s/errors' % app, r=request) + + delete_hashes = [] + for item in request.vars: + if item[:7] == 'delete_': + delete_hashes.append(item[7:]) + + hash2error = dict() + + for fn in listdir(errors_path, '^\w.*'): + fullpath = os.path.join(errors_path, fn) + if not os.path.isfile(fullpath): continue + try: + fullpath_file = open(fullpath, 'r') + try: + error = pickle.load(fullpath_file) + finally: + fullpath_file.close() + except IOError: + continue + + hash = hashlib.md5(error['traceback']).hexdigest() + + if hash in delete_hashes: + os.unlink(fullpath) + else: + try: + hash2error[hash]['count'] += 1 + except KeyError: + error_lines = error['traceback'].split("\n") + last_line = error_lines[-2] + error_causer = os.path.split(error['layer'])[1] + hash2error[hash] = dict(count=1, pickel=error, + causer=error_causer, + last_line=last_line, + hash=hash,ticket=fn) + + decorated = [(x['count'], x) for x in hash2error.values()] + decorated.sort(key=operator.itemgetter(0), reverse=True) + + return dict(errors = [x[1] for x in decorated], app=app, method=method) + else: + for item in request.vars: + if item[:7] == 'delete_': + os.unlink(apath('%s/errors/%s' % (app, item[7:]), r=request)) + func = lambda p: os.stat(apath('%s/errors/%s' % \ + (app, p), r=request)).st_mtime + tickets = sorted(listdir(apath('%s/errors/' % app, r=request), '^\w.*'), + key=func, + reverse=True) + + return dict(app=app, tickets=tickets, method=method) + + +def make_link(path): + """ Create a link from a path """ + tryFile = path.replace('\\', '/') + + if os.path.isabs(tryFile) and os.path.isfile(tryFile): + (folder, filename) = os.path.split(tryFile) + (base, ext) = os.path.splitext(filename) + app = get_app() + + editable = {'controllers': '.py', 'models': '.py', 'views': '.html'} + for key in editable.keys(): + check_extension = folder.endswith("%s/%s" % (app,key)) + if ext.lower() == editable[key] and check_extension: + return A('"' + tryFile + '"', + _href=URL(r=request, + f='edit/%s/%s/%s' % (app, key, filename))).xml() + return '' + + +def make_links(traceback): + """ Make links using the given traceback """ + + lwords = traceback.split('"') + + # Making the short circuit compatible with <= python2.4 + result = (len(lwords) != 0) and lwords[0] or '' + + i = 1 + + while i < len(lwords): + link = make_link(lwords[i]) + + if link == '': + result += '"' + lwords[i] + else: + result += link + + if i + 1 < len(lwords): + result += lwords[i + 1] + i = i + 1 + + i = i + 1 + + return result + + +class TRACEBACK(object): + """ Generate the traceback """ + + def __init__(self, text): + """ TRACEBACK constructor """ + + self.s = make_links(CODE(text).xml()) + + def xml(self): + """ Returns the xml """ + + return self.s + + +def ticket(): + """ Ticket handler """ + + if len(request.args) != 2: + session.flash = T('invalid ticket') + redirect(URL('site')) + + app = get_app() + myversion = request.env.web2py_version + ticket = request.args[1] + e = RestrictedError() + e.load(request, app, ticket) + + return dict(app=app, + ticket=ticket, + output=e.output, + traceback=(e.traceback and TRACEBACK(e.traceback)), + snapshot=e.snapshot, + code=e.code, + layer=e.layer, + myversion=myversion) + +def error(): + """ Generate a ticket (for testing) """ + raise RuntimeError('admin ticket generator at your service') + +def update_languages(): + """ Update available languages """ + + app = get_app() + update_all_languages(apath(app, r=request)) + session.flash = T('Language files (static strings) updated') + redirect(URL('design',args=app)) + +def twitter(): + session.forget() + session._unlock(response) + import gluon.tools + import gluon.contrib.simplejson as sj + try: + if TWITTER_HASH: + page = gluon.tools.fetch('http://twitter.com/%s?format=json'%TWITTER_HASH) + return sj.loads(page)['#timeline'] + else: + return 'disabled' + except Exception, e: + return DIV(T('Unable to download because:'),BR(),str(e)) + +def user(): + if MULTI_USER_MODE: + if not db(db.auth_user).count(): + auth.settings.registration_requires_approval = False + return dict(form=auth()) + else: + return dict(form=T("Disabled")) + +def reload_routes(): + """ Reload routes.py """ + gluon.rewrite.load() + redirect(URL('site')) ADDED applications/admin/controllers/gae.py Index: applications/admin/controllers/gae.py ================================================================== --- /dev/null +++ applications/admin/controllers/gae.py @@ -0,0 +1,87 @@ +### this works on linux only + +import re +try: + import fcntl + import subprocess + import signal + import os + import shutil + from gluon.fileutils import read_file, write_file +except: + session.flash='sorry, only on Unix systems' + redirect(URL(request.application,'default','site')) + +forever=10**8 + +def kill(): + p = cache.ram('gae_upload',lambda:None,forever) + if not p or p.poll()!=None: + return 'oops' + os.kill(p.pid, signal.SIGKILL) + cache.ram('gae_upload',lambda:None,-1) + +class EXISTS(object): + def __init__(self, error_message='file not found'): + self.error_message = error_message + def __call__(self, value): + if os.path.exists(value): + return (value,None) + return (value,self.error_message) + +def deploy(): + regex = re.compile('^\w+$') + apps = sorted(file for file in os.listdir(apath(r=request)) if regex.match(file)) + form = SQLFORM.factory( + Field('appcfg',default=GAE_APPCFG,label='Path to appcfg.py', + requires=EXISTS(error_message=T('file not found'))), + Field('google_application_id',requires=IS_ALPHANUMERIC()), + Field('applications','list:string', + requires=IS_IN_SET(apps,multiple=True), + label=T('web2py apps to deploy')), + Field('email',requires=IS_EMAIL(),label=T('GAE Email')), + Field('password','password',requires=IS_NOT_EMPTY(),label=T('GAE Password'))) + cmd = output = errors= "" + if form.accepts(request,session): + try: + kill() + except: + pass + ignore_apps = [item for item in apps \ + if not item in form.vars.applications] + regex = re.compile('\(applications/\(.*') + yaml = apath('../app.yaml', r=request) + if not os.path.exists(yaml): + example = apath('../app.example.yaml', r=request) + shutil.copyfile(example,yaml) + data = read_file(yaml) + data = re.sub('application:.*','application: %s' % form.vars.google_application_id,data) + data = regex.sub('(applications/(%s)/.*)|' % '|'.join(ignore_apps),data) + write_file(yaml, data) + + path = request.env.applications_parent + cmd = '%s --email=%s --passin update %s' % \ + (form.vars.appcfg, form.vars.email, path) + p = cache.ram('gae_upload', + lambda s=subprocess,c=cmd:s.Popen(c, shell=True, + stdin=s.PIPE, + stdout=s.PIPE, + stderr=s.PIPE, close_fds=True),-1) + p.stdin.write(form.vars.password+'\n') + fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) + fcntl.fcntl(p.stderr.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) + return dict(form=form,command=cmd) + +def callback(): + p = cache.ram('gae_upload',lambda:None,forever) + if not p or p.poll()!=None: + return '' + try: + output = p.stdout.read() + except: + output='' + try: + errors = p.stderr.read() + except: + errors='' + return (output+errors).replace('\n','
') ADDED applications/admin/controllers/mercurial.py Index: applications/admin/controllers/mercurial.py ================================================================== --- /dev/null +++ applications/admin/controllers/mercurial.py @@ -0,0 +1,82 @@ +from gluon.fileutils import read_file, write_file + +if DEMO_MODE or MULTI_USER_MODE: + session.flash = T('disabled in demo mode') + redirect(URL('default','site')) +if not have_mercurial: + session.flash=T("Sorry, could not find mercurial installed") + redirect(URL('default','design',args=request.args(0))) + +_hgignore_content = """\ +syntax: glob +*~ +*.pyc +*.pyo +*.bak +*.bak2 +cache/* +private/* +uploads/* +databases/* +sessions/* +errors/* +""" + +def hg_repo(path): + import os + uio = ui.ui() + uio.quiet = True + if not os.environ.get('HGUSER') and not uio.config("ui", "username"): + os.environ['HGUSER'] = 'web2py@localhost' + try: + repo = hg.repository(ui=uio, path=path) + except: + repo = hg.repository(ui=uio, path=path, create=True) + hgignore = os.path.join(path, '.hgignore') + if not os.path.exists(hgignore): + write_file(hgignore, _hgignore_content) + return repo + +def commit(): + app = request.args(0) + path = apath(app, r=request) + repo = hg_repo(path) + form = FORM('Comment:',INPUT(_name='comment',requires=IS_NOT_EMPTY()), + INPUT(_type='submit',_value='Commit')) + if form.accepts(request.vars,session): + oldid = repo[repo.lookup('.')] + cmdutil.addremove(repo) + repo.commit(text=form.vars.comment) + if repo[repo.lookup('.')] == oldid: + response.flash = 'no changes' + try: + files = TABLE(*[TR(file) for file in repo[repo.lookup('.')].files()]) + changes = TABLE(TR(TH('revision'),TH('description'))) + for change in repo.changelog: + ctx=repo.changectx(change) + revision, description = ctx.rev(), ctx.description() + changes.append(TR(A(revision,_href=URL('revision', + args=(app,revision))), + description)) + except: + files = [] + changes = [] + return dict(form=form,files=files,changes=changes,repo=repo) + +def revision(): + app = request.args(0) + path = apath(app, r=request) + repo = hg_repo(path) + revision = request.args(1) + ctx=repo.changectx(revision) + form=FORM(INPUT(_type='submit',_value='revert')) + if form.accepts(request.vars): + hg.update(repo, revision) + session.flash = "reverted to revision %s" % ctx.rev() + redirect(URL('default','design',args=app)) + return dict( + files=ctx.files(), + rev=str(ctx.rev()), + desc=ctx.description(), + form=form + ) ADDED applications/admin/controllers/shell.py Index: applications/admin/controllers/shell.py ================================================================== --- /dev/null +++ applications/admin/controllers/shell.py @@ -0,0 +1,45 @@ +import sys +import cStringIO +import gluon.contrib.shell +import code, thread +from gluon.shell import env + +if DEMO_MODE or MULTI_USER_MODE: + session.flash = T('disabled in demo mode') + redirect(URL('default','site')) + +FE=10**9 + +def index(): + app = request.args(0) or 'admin' + reset() + return dict(app=app) + +def callback(): + app = request.args[0] + command = request.vars.statement + escape = command[:1]!='!' + history = session['history:'+app] = session.get('history:'+app,gluon.contrib.shell.History()) + if not escape: + command = command[1:] + if command == '%reset': + reset() + return '*** reset ***' + elif command[0] == '%': + try: + command=session['commands:'+app][int(command[1:])] + except ValueError: + return '' + session['commands:'+app].append(command) + environ=env(app,True) + output = gluon.contrib.shell.run(history,command,environ) + k = len(session['commands:'+app]) - 1 + #output = PRE(output) + #return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output)) + return 'In [%i] : %s%s\n' % (k + 1, command, output) + +def reset(): + app = request.args(0) or 'admin' + session['commands:'+app] = [] + session['history:'+app] = gluon.contrib.shell.History() + return 'done' ADDED applications/admin/controllers/toolbar.py Index: applications/admin/controllers/toolbar.py ================================================================== --- /dev/null +++ applications/admin/controllers/toolbar.py @@ -0,0 +1,29 @@ +import os +from gluon.settings import global_settings, read_file +# + +def index(): + app = request.args(0) + return dict(app=app) + +def profiler(): + """ + to use the profiler start web2py with -F profiler.log + """ + KEY = 'web2py_profiler_size' + filename = global_settings.cmd_options.profiler_filename + data = 'profiler disabled' + if filename: + if KEY in request.cookies: + size = int(request.cookies[KEY].value) + else: + size = 0 + if os.path.exists(filename): + data = read_file('profiler.log','rb') + if size=m: redirect(URL('step2')) + table=session.app['tables'][n] + form=SQLFORM.factory(Field('field_names','list:string', + default=session.app.get('table_'+table,[]))) + if form.accepts(request.vars) and form.vars.field_names: + fields=listify(form.vars.field_names) + if table=='auth_user': + for field in ['first_name','last_name','username','email','password']: + if not field in fields: + fields.append(field) + session.app['table_'+table]=[t.strip().lower() + for t in listify(form.vars.field_names) + if t.strip()] + try: + tables=sort_tables(session.app['tables']) + except RuntimeError: + response.flash=T('invalid circual reference') + else: + if n=m: redirect(URL('step4')) + page=session.app['pages'][n] + markmin_url='http://web2py.com/examples/static/markmin.html' + form=SQLFORM.factory(Field('content','text', + default=session.app.get('page_'+page,[]), + comment=A('use markmin',_href=markmin_url,_target='_blank')), + formstyle='table2cols') + if form.accepts(request.vars): + session.app['page_'+page]=form.vars.content + if n 0 +FONT_SIZE = 10 + +# Displays the editor in full screen mode. The value must be 'true' or 'false' +FULL_SCREEN = 'false' + +# Display a check box under the editor to allow the user to switch +# between the editor and a simple +# HTML text area. The value must be 'true' or 'false' +ALLOW_TOGGLE = 'true' + +# Replaces tab characters with space characters. +# The value can be 'false' (meaning that tabs are not replaced), +# or an integer > 0 that specifies the number of spaces to replace a tab with. +REPLACE_TAB_BY_SPACES = 4 + +# Toggle on/off the code editor instead of textarea on startup +DISPLAY = "onload" or "later" + +# if demo mode is True then admin works readonly and does not require login +DEMO_MODE = False + +# if visible_apps is not empty only listed apps will be accessible +FILTER_APPS = [] + +# To upload on google app engine this has to point to the proper appengine +# config file +import os +# extract google_appengine_x.x.x.zip to web2py root directory +#GAE_APPCFG = os.path.abspath(os.path.join('appcfg.py')) +# extract google_appengine_x.x.x.zip to applications/admin/private/ +GAE_APPCFG = os.path.abspath(os.path.join('/usr/local/bin/appcfg.py')) + +# To use web2py as a teaching tool, set MULTI_USER_MODE to True +MULTI_USER_MODE = False + +# configurable twitterbox, set to None/False to suppress +TWITTER_HASH = "web2py" + +# parameter for downloading LAYOUTS +LAYOUTS_APP = 'http://web2py.com/layouts' +#LAYOUTS_APP = 'http://127.0.0.1:8000/layouts' + + +# parameter for downloading PLUGINS +PLUGINS_APP = 'http://web2py.com/plugins' +#PLUGINS_APP = 'http://127.0.0.1:8000/plugins' + +# set the language +if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage'] is None): + T.force(request.cookies['adminLanguage'].value) ADDED applications/admin/models/0_imports.py Index: applications/admin/models/0_imports.py ================================================================== --- /dev/null +++ applications/admin/models/0_imports.py @@ -0,0 +1,26 @@ +import time +import os +import sys +import re +import urllib +import cgi +import difflib +import shutil +import stat +import socket + +from textwrap import dedent + +try: + from mercurial import ui, hg, cmdutil + have_mercurial = True +except ImportError: + have_mercurial = False + +from gluon.utils import md5_hash +from gluon.fileutils import listdir, cleanpath, up +from gluon.fileutils import tar, tar_compiled, untar, fix_newlines +from gluon.languages import findT, update_all_languages +from gluon.myregex import * +from gluon.restricted import * +from gluon.compileapp import compile_application, remove_compiled_application ADDED applications/admin/models/access.py Index: applications/admin/models/access.py ================================================================== --- /dev/null +++ applications/admin/models/access.py @@ -0,0 +1,146 @@ +import os, time +from gluon import portalocker +from gluon.admin import apath +from gluon.fileutils import read_file +# ########################################################### +# ## make sure administrator is on localhost or https +# ########################################################### + +http_host = request.env.http_host.split(':')[0] + +if request.env.web2py_runtime_gae: + session_db = DAL('gae') + session.connect(request, response, db=session_db) + hosts = (http_host, ) + +if request.env.http_x_forwarded_for or request.is_https: + session.secure() +elif not request.is_local and not DEMO_MODE: + raise HTTP(200, T('Admin is disabled because insecure channel')) + +try: + _config = {} + port = int(request.env.server_port or 0) + restricted(read_file(apath('../parameters_%i.py' % port, request)), _config) + + if not 'password' in _config or not _config['password']: + raise HTTP(200, T('admin disabled because no admin password')) +except IOError: + import gluon.fileutils + if request.env.web2py_runtime_gae: + if gluon.fileutils.check_credentials(request): + session.authorized = True + session.last_time = time.time() + else: + raise HTTP(200, + T('admin disabled because not supported on google app engine')) + else: + raise HTTP(200, T('admin disabled because unable to access password file')) + + +def verify_password(password): + session.pam_user = None + if DEMO_MODE: + return True + elif not 'password' in _config: + return False + elif _config['password'].startswith('pam_user:'): + session.pam_user = _config['password'][9:].strip() + import gluon.contrib.pam + return gluon.contrib.pam.authenticate(session.pam_user,password) + else: + return _config['password'] == CRYPT()(password)[0] + + +# ########################################################### +# ## handle brute-force login attacks +# ########################################################### + +deny_file = os.path.join(request.folder, 'private', 'hosts.deny') +allowed_number_of_attempts = 5 +expiration_failed_logins = 3600 + +def read_hosts_deny(): + import datetime + hosts = {} + if os.path.exists(deny_file): + hosts = {} + f = open(deny_file, 'r') + portalocker.lock(f, portalocker.LOCK_SH) + for line in f.readlines(): + if not line.strip() or line.startswith('#'): + continue + fields = line.strip().split() + if len(fields) > 2: + hosts[fields[0].strip()] = ( # ip + int(fields[1].strip()), # n attemps + int(fields[2].strip()) # last attempts + ) + portalocker.unlock(f) + f.close() + return hosts + +def write_hosts_deny(denied_hosts): + f = open(deny_file, 'w') + portalocker.lock(f, portalocker.LOCK_EX) + for key, val in denied_hosts.items(): + if time.time()-val[1] < expiration_failed_logins: + line = '%s %s %s\n' % (key, val[0], val[1]) + f.write(line) + portalocker.unlock(f) + f.close() + +def login_record(success=True): + denied_hosts = read_hosts_deny() + val = (0,0) + if success and request.client in denied_hosts: + del denied_hosts[request.client] + elif not success and not request.is_local: + val = denied_hosts.get(request.client,(0,0)) + if time.time()-val[1]= allowed_number_of_attempts: + return val[0] # locked out + time.sleep(2**val[0]) + val = (val[0]+1,int(time.time())) + denied_hosts[request.client] = val + write_hosts_deny(denied_hosts) + return val[0] + + +# ########################################################### +# ## session expiration +# ########################################################### + +t0 = time.time() +if session.authorized: + + if session.last_time and session.last_time < t0 - EXPIRATION: + session.flash = T('session expired') + session.authorized = False + else: + session.last_time = t0 + +if not session.authorized and not \ + (request.controller == 'default' and \ + request.function in ('index','user')): + + if request.env.query_string: + query_string = '?' + request.env.query_string + else: + query_string = '' + + if request.env.web2py_original_uri: + url = request.env.web2py_original_uri + else: + url = request.env.path_info + query_string + redirect(URL(request.application, 'default', 'index', vars=dict(send=url))) +elif session.authorized and \ + request.controller == 'default' and \ + request.function == 'index': + redirect(URL(request.application, 'default', 'site')) + + +if request.controller=='appadmin' and DEMO_MODE: + session.flash = 'Appadmin disabled in demo mode' + redirect(URL('default','sites')) + ADDED applications/admin/models/buttons.py Index: applications/admin/models/buttons.py ================================================================== --- /dev/null +++ applications/admin/models/buttons.py @@ -0,0 +1,15 @@ +# Template helpers + +import os + +def button(href, label): + return A(SPAN(label),_class='button',_href=href) + +def sp_button(href, label): + return A(SPAN(label),_class='button special',_href=href) + +def helpicon(): + return IMG(_src=URL('static', 'images/help.png'), _alt='help') + +def searchbox(elementid): + return TAG[''](LABEL(IMG(_src=URL('static', 'images/search.png'), _alt=T('filter')), _class='icon', _for=elementid), ' ', INPUT(_id=elementid, _type='text', _size=12)) ADDED applications/admin/models/db.py Index: applications/admin/models/db.py ================================================================== --- /dev/null +++ applications/admin/models/db.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# this file is released under public domain and you can use without limitations + +if MULTI_USER_MODE: + db = DAL('sqlite://storage.sqlite') # if not, use SQLite or other DB + from gluon.tools import * + mail = Mail() # mailer + auth = Auth(globals(),db) # authentication/authorization + crud = Crud(globals(),db) # for CRUD helpers using auth + service = Service(globals()) # for json, xml, jsonrpc, xmlrpc, amfrpc + plugins = PluginManager() + + mail.settings.server = 'logging' or 'smtp.gmail.com:587' # your SMTP server + mail.settings.sender = 'you@gmail.com' # your email + mail.settings.login = 'username:password' # your credentials or None + + auth.settings.hmac_key = '' # before define_tables() + auth.define_tables() # creates all needed tables + auth.settings.mailer = mail # for user email verification + auth.settings.registration_requires_verification = False + auth.settings.registration_requires_approval = True + auth.messages.verify_email = 'Click on the link http://'+request.env.http_host+URL('default','user',args=['verify_email'])+'/%(key)s to verify your email' + auth.settings.reset_password_requires_verification = True + auth.messages.reset_password = 'Click on the link http://'+request.env.http_host+URL('default','user',args=['reset_password'])+'/%(key)s to reset your password' + + db.define_table('app',Field('name'),Field('owner',db.auth_user)) + +if not session.authorized and MULTI_USER_MODE: + if auth.user and not request.function=='user': + session.authorized = True + elif not request.function=='user': + redirect(URL('default','user/login')) + +def is_manager(): + if not MULTI_USER_MODE: + return True + elif auth.user and auth.user.id==1: + return True + else: + return False ADDED applications/admin/models/menu.py Index: applications/admin/models/menu.py ================================================================== --- /dev/null +++ applications/admin/models/menu.py @@ -0,0 +1,32 @@ +# ########################################################### +# ## generate menu +# ########################################################### + +_a = request.application +_c = request.controller +_f = request.function +response.title = '%s %s' % (_f, '/'.join(request.args)) +response.subtitle = 'admin' +response.menu = [(T('site'), _f == 'site', URL(_a,'default','site'))] + +if request.args: + _t = request.args[0] + response.menu.append((T('edit'), _c == 'default' and _f == 'design', + URL(_a,'default','design',args=_t))) + response.menu.append((T('about'), _c == 'default' and _f == 'about', + URL(_a,'default','about',args=_t))) + response.menu.append((T('errors'), _c == 'default' and _f == 'errors', + URL(_a,'default','errors',args=_t))) + + response.menu.append((T('versioning'), + _c == 'mercurial' and _f == 'commit', + URL(_a,'mercurial','commit',args=_t))) + +if not session.authorized: + response.menu = [(T('login'), True, '')] +else: + response.menu.append((T('logout'), False, + URL(_a,'default',f='logout'))) + +response.menu.append((T('help'), False, URL('examples','default','index'))) + ADDED applications/admin/models/plugin_multiselect.py Index: applications/admin/models/plugin_multiselect.py ================================================================== --- /dev/null +++ applications/admin/models/plugin_multiselect.py @@ -0,0 +1,4 @@ +response.files.append(URL('static','plugin_multiselect/jquery.dimensions.js')) +response.files.append(URL('static','plugin_multiselect/jquery.multiselect.js')) +response.files.append(URL('static','plugin_multiselect/jquery.multiselect.css')) +response.files.append(URL('static','plugin_multiselect/start.js')) ADDED applications/admin/modules/__init__.py Index: applications/admin/modules/__init__.py ================================================================== --- /dev/null +++ applications/admin/modules/__init__.py ADDED applications/admin/static/css/calendar.css Index: applications/admin/static/css/calendar.css ================================================================== --- /dev/null +++ applications/admin/static/css/calendar.css @@ -0,0 +1,4 @@ +.calendar{z-index:99;position:relative;display:none;border-top:2px solid #fff;border-right:2px solid #000;border-bottom:2px solid #000;border-left:2px solid #fff;font-size:11px;color:#000;cursor:default;background:#d4d0c8;font-family:tahoma,verdana,sans-serif;}.calendar table{border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;font-size:11px;color:#000;cursor:default;background:#d4d0c8;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;}.calendar .nav{background:transparent}.calendar thead .title{font-weight:bold;padding:1px;border:1px solid #000;background:#848078;color:#fff;text-align:center;}.calendar thead .name{border-bottom:1px solid #000;padding:2px;text-align:center;background:#f4f0e8;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite{border-top:2px solid #fff;border-right:2px solid #000;border-bottom:2px solid #000;border-left:2px solid #fff;padding:0;background-color:#e4e0d8;}.calendar thead .active{padding:2px 0 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{font-size:80%;color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;border-right:1px solid #000;background:#f4f0e8;}.calendar tbody .rowhilite td{background:#e4e0d8;}.calendar tbody .rowhilite td.wn{background:#d4d0c8;}.calendar tbody td.hilite{padding:1px 3px 1px 1px;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;}.calendar tbody td.active{padding:2px 2px 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar tbody td.selected{font-weight:bold;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;padding:2px 2px 0 2px;background:#e4e0d8;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#f4f0e8;padding:1px;border:1px solid #000;background:#848078;color:#fff;text-align:center;}.calendar tfoot .hilite{border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;padding:1px;background:#e4e0d8;}.calendar tfoot .active{padding:2px 0 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;background:#e4e0d8;font-size:90%;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;padding:0;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{border-top:1px solid #000;padding:1px 0;text-align:center;background-color:#f4f0e8;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;border:1px solid #889;font-weight:bold;background-color:#fff;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{border-color:#000;background-color:#766;color:#fff;}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;} + +#CP_hourcont {z-index:99;padding: 0px;position:absolute;border:1px dashed #bbbbbb;background-color:#dddddd;display:none;} #CP_minutecont {z-index:99;background-color:#dddddd;padding: 0px;position:absolute;width:45px;border: 1px dashed #cccccc;display:none;} .floatleft {float:left;} .CP_hour {z-index:99;padding:1px;font-family: Arial, Helvetica, sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;margin:1px;background-color:#eeeeee;} .CP_minute {z-index:99;padding:1px;background-color:#eeeeee;font-family: Arial, Helvetica, sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;margin:1px;} .CP_over {z-index:99;background-color:#ffffff;} + ADDED applications/admin/static/css/jqueryMultiSelect.css Index: applications/admin/static/css/jqueryMultiSelect.css ================================================================== --- /dev/null +++ applications/admin/static/css/jqueryMultiSelect.css @@ -0,0 +1,47 @@ +.multiSelect { + width: 200px; + border: solid 1px #BBB; + background: #FFF right center no-repeat; + padding: 2px 4px; + padding-right: 20px; + display: inline; +} + +.multiSelect.hover { + background: right center no-repeat; +} + +.multiSelect.active, +.multiSelect.focus { + border: inset 1px #000; +} + +.multiSelect.active { + background: right center no-repeat; +} + +.multiSelectOptions { + width: 500px; + max-height: 150px; + margin-top: -1px; + overflow: auto; + border: solid 1px #B2B2B2; + background: #FFF; +} + +.multiSelectOptions LABEL { + padding: 2px 5px; + display: block; +} + +.multiSelectOptions LABEL.checked { + background: #E6E6E6; +} + +.multiSelectOptions LABEL.selectAll { + border-bottom: dotted 1px #CCC; +} + +.multiSelectOptions LABEL.hover { + background: #CFCFCF; +} ADDED applications/admin/static/css/styles.css Index: applications/admin/static/css/styles.css ================================================================== --- /dev/null +++ applications/admin/static/css/styles.css @@ -0,0 +1,1065 @@ +/** +* cSans v0.6.3 +* 2009 Copyright A navalla suíza http://anavallasuiza.com +* cSans is released under the GNU Affero GPL version 3 - more information at http://www.fsf.org/licensing/licenses/agpl-3.0.html +*/ + +/* 1. RESET */ +html,body,div,span,object,iframe, +h1,h2,h3,h4,h5,h6,p,blockquote,pre, +a,abbr,acronym,address,code, +del,dfn,em,img,q,dl,dt,dd,ol,ul,li, +fieldset,form,label,legend,textarea, +table,caption,tbody,tfoot,thead,tr,th,td { + margin:0; + padding:0; + border:0; +} +textarea,select,input { font-size:1em; } +html,body { height:100%; } +body { + font-family:Arial,Helvetica,"Liberation Sans",Sans,sans-serif; + font-size: 12pt; + line-height:1.25em; + text-align:center; + background:#fff; + color:#000; +} +.page,.expanded-page { text-align:left; } + +/* 2. DEBUG: Show borders to stress an element */ +.omg-red,.omg-yellow,.omg-blue,.omg-green,.omg-black,.omg-white { + border-top:dotted 3px; + border-bottom:dotted 3px; +} +.omg-red { border-color:red; } +.omg-yellow { border-color:yellow; } +.omg-blue { border-color:blue; } +.omg-green { border-color:green; } +.omg-black { border-color:black; } +.omg-white { border-color:white; } + +/* 3. BASIC STYLES */ +/* 3.1. Titles */ +h1,h2,h3,h4,h5,h6 { + font-weight:bold; + line-height:1em; + margin:1em 0 0.5em 0; +} +h1 { font-size:2em; } +h2 { font-size:1.75em; } +h3 { font-size:1.5em; } +h4 { font-size:1.125em; } +h5 { font-size:1em; } +h6 { font-size:1em; font-weight:normal; } + +/* 3.2. Lists */ +ul,dd { margin-left:1em; } +ol { list-style-type:decimal; margin-left:1.5em; } +dl dt { font-weight:bold; } + +/* 3.3. Tables */ +table { border-collapse:collapse; border-spacing:0; } +caption,th { font-weight:bold; } +th,td { text-align:left; padding:0; border:1px solid #ccc; } +tfoot { font-style:italic; } + +/* 3.4. Images */ +a img { border:none; } +img.right { margin-left:1em; } +img.left { margin-right:1em; } + +/* 3.5. Forms */ +fieldset { border:1px solid #ccc; } +legend { font-weight:bold; font-size:1.2em; } +input { margin:0; } +input.text,input.password { overflow-y:visible; } +textarea { width:400px; height:100px; border:1px solid #ccc; overflow-y: auto; } +select { margin:0; font-size:1em; } +input,textarea,select { font-family:Arial,sans-serif; font-size: 1em; } + +/* 3.6. Monospace elements */ +pre,code,tt { font-family:"Courier New", Courier, monospace; line-height:1.5; } +pre,code { white-space:pre; } +tt { display:block; line-height:1.5; } + +/* 3.7. Block elements */ +p,form,table,address,blockquote,pre,code,tt,ul,ol,dl { margin-bottom:1em; } + +/* 3.8. Inline elements */ +em,dfn { font-style:italic; } + +/* 3.9. HR element */ +hr { + background:none; + visibility:hidden; + clear:both; + float:none; + width:100%; + height:1px; + border:none; + margin:-1px 0; +} + +/* 3.10. Flash objects */ +object { outline:none; } + +/* 4. UTILS */ +/* 4.1. Images with link and without link must overwrite background, width and height properties in your css */ +.image a,.image li,.image { + background-repeat:no-repeat; + background-color:transparent; + margin:0; + padding:0; + outline:none; + font-size:0px !important; + line-height:0em !important; + letter-spacing:-20px; + text-indent: -2px; + display:block; + overflow:hidden; + text-align:left; + border: none; +} +.image a { + display:block; + width:100%; + height:100%; + height:inherit; +} +ol.image,ul.image { + background:none; + width:100%; + height:auto; + float:left; +} +.image li { + float:left; +} +span.image,strong.image,em.image,a.image { + display:inline-block; + vertical-align:bottom; +} +input.image { cursor:pointer; } + +/* 4.2. Simple tabs system. You can overwrite background and text styles */ +.tabs { + list-style:none; + padding:0; + margin:0; + float:left; + width:100%; +} +.tabs li { + float:left; + margin:0 1px 0 0; +} +.tabs li span, +.tabs li a { + float: left; + padding:2px 5px; + white-space:nowrap; + text-align:center; + cursor:pointer; + outline:0; + text-decoration:none; +} +.tabs li span { cursor:default; } +.tabs .select a,.tabs a:hover { + background:#ddd; +} + +/* 4.3. Convert a block element (like a fieldset) into a inline element */ +.inline { + border:none; + margin:0; + padding:0; + display:inline; +} +fieldset.inline { + display:block; + float:left; + width: 100%; +} + +/* 4.4. Inline-block element must content any element inside (div, p, etc) for the correct visualization in FF<3 */ +.inline-block-top,.inline-block-middle,.inline-block-bottom { + float:none !important; + display:inline-block; +} +.inline-block-top { vertical-align:top !important; } +.inline-block-middle { vertical-align:middle !important; } +.inline-block-bottom { vertical-align:bottom !important; } + +/* 4.5. Float elements */ +.left { float:left !important; } +.right,.right-right { float:right !important; } +.right-right { text-align:right !important; } +.right-full { width:100%; text-align:right !important; } + +/* 4.6. Clear */ +.clear,.content,.page,.expanded-page { display:block; } +.clear:after,.tabs:after,.content:after,.page:after,.expanded-page:after { + content:" "; + display:block; + height:0; + clear:both; + visibility:hidden; + font-size:0; +} + +/* 4.7. Destroy margin collapse */ +.no-collapse { padding-top:1px; } + +/* 4.8. Hide an element */ +.hide { display:none; } + +/* 5. LAYOUT */ +/* 5.1. Row */ +.row { + float:left; + width:100%; + margin:0; + padding:0; + border:none; +} + +/* 5.2. Last column in a row */ +.last { margin-right:0 !important; } + +/* 5.3. Content */ +.content { + padding:0; + margin:0; +} + +/* 6. HACKS */ +img { -ms-interpolation-mode:bicubic; } /* IE */ +.clear,.tabs,.content,.page,.expanded-page { + *overflow-y:auto; /* IE7 */ + *overflow-x:hidden; /* IE7 */ + _height:1%; /* IE6 */ + _overflow-y:visible; /* IE6 */ + _overflow-x:visible; /* IE6 */ +} +a.image,span.image,strong.image,em.image,.inline-block-top,.inline-block-middle,.inline-block-bottom { + display:-moz-inline-box; /* FF<3 */ + -moz-box-orient:vertical; /* FF<3 */ + *display:inline; /* IE */ +} + +/** +* cSans Button plugin v0.3.1 +* 2009 Copyright A navalla suíza http://anavallasuiza.com +* cSans is released under the GNU Affero GPL version 3 - more information at http://www.fsf.org/licensing/licenses/agpl-3.0.html +*/ + +/* 1. BASIC STYLES */ + +ul.button { + list-style: none; + padding: 0; + margin: 0; + display:block; + } +ul.button { + overflow-y: auto; + overflow-x: hidden; + } +ul.button li { + float: left; + margin: 0; + } +ul.button li a { + display: block; + z-index: 2; + } +a.button { + display: inline-block; + vertical-align: middle; + } + +/* 1.1. Normal status */ +a.button, +ul.button li a { + background-position: 100% 0; + background-repeat: no-repeat; + white-space: nowrap; + text-align: center; + cursor: pointer; + outline: 0; + } +a.button span, +ul.button li a span { + display: block; + background-position: 0 0; + background-repeat: no-repeat; + } + +/* 1.2. Hover/selected status */ +a.button:hover, +a.button.select, +ul.button li a:hover, +ul.button li.select a { + background-position: 100% -70px !important; + } +a.button:hover span, +a.button.select span, +ul.button li a:hover span, +ul.button li.select a span { + background-position: 0 -70px !important; + } + +/* 2. EDITABLE STYLES */ + +/* 2.1. Image background used */ +a.button, +.button a, +.button span { + background-image: url(../images/button.png); + } + +/* 2.2. Normal status (Example for padding 10px) */ +a.button, +.button a { + padding: 0 10px 0 0; /* Padding-right: 10px */ + margin: 0 1px 0 10px; /* Margin-left: 10px */ + text-decoration: none; + } +.button span { + padding: 4px 0 6px 10px; /*Padding-left: 10px */ + margin: 0 0 0 -10px; /* Margin-left: -10px */ + } + +/* 3. HACKS */ + +ul.button { + _height: 1%; /* IE6 */ + _overflow-y: visible; /* IE6 */ + _overflow-x: visible; /* IE6 */ + } +a.button span { + _float: left; /* Only IE6 */ + _position: relative; /* Only IE6 */ + } +a.button { + display: -moz-inline-box; /* FF<3 */ + display: inline-block; /* FF<3 */ + -moz-box-orient: vertical; /* FF<3 */ + *display: inline; /* IE */ + } + +/** +* cSans Tooltip pluging v0.1 +* 2009 Copyright A navalla suíza http://anavallasuiza.com +* cSans is released under the GNU Affero GPL version 3 - more information at http://www.fsf.org/licensing/licenses/agpl-3.0.html +*/ + +/* BASIC STYLES */ + +.tooltip:hover { + background:transparent; + text-decoration:none; + } +.tooltip span { + display:none; + padding:5px; + margin-left:10px; + width:150px; + } +.tooltip:hover span { + cursor: default; + display:inline; + position:absolute; + } + +/** +* cSans Flexible v0.1 +* 2009 Copyright A navalla suíza http://anavallasuiza.com +* cSans is released under the GNU Affero GPL version 3 - more information at http://www.fsf.org/licensing/licenses/agpl-3.0.html +*/ + +/* 1. BASIC STYLES */ +/* 1.1 Widths */ +.f10 { width:10%; } +.f20 { width:20%; } +.f25 { width:25%; } +.f30 { width:30%; } +.f33 { width:33.33%; } +.f40 { width:40%; } +.f50 { width:50%; } +.f60 { width:60%; } +.f66 { width:66.66%; } +.f70 { width:70%; } +.f75 { width:75%; } +.f80 { width:80%; } +.f90 { width:90%; } +.f100 { width:100%; } + +.f10,.f20,.f25,.f30,.f33,.f40,.f50,.f60,.f66,.f70,.f75,.f80,.f90,.f100 { + float:left; + overflow:hidden; +} + +/* 1.2 Margin-left */ +.fl10 { margin-left:10%; } +.fl20 { margin-left:20%; } +.fl25 { margin-left:25%; } +.fl30 { margin-left:30%; } +.fl33 { margin-left:33.33%; } +.fl40 { margin-left:40%; } +.fl50 { margin-left:50%; } +.fl60 { margin-left:60%; } +.fl66 { margin-left:66.66%; } +.fl70 { margin-left:70%; } +.fl75 { margin-left:75%; } +.fl80 { margin-left:80%; } +.fl90 { margin-left:90%; } +.fl100 { margin-left:100%; } + +/* 1.3 Margin-right */ +.fr10 { margin-right:10%; } +.fr20 { margin-right:20%; } +.fr25 { margin-right:25%; } +.fr30 { margin-right:30%; } +.fr33 { margin-right:33.33%; } +.fr40 { margin-right:40%; } +.fr50 { margin-right:50%; } +.fr60 { margin-right:60%; } +.fr66 { margin-right:66.66%; } +.fr70 { margin-right:70%; } +.fr75 { margin-right:75%; } +.fr80 { margin-right:80%; } +.fr90 { margin-right:90%; } +.fr100 { margin-right:100%; } + +/* 2. HACKS */ +.f10,.f20,.f25,.f30,.f33,.f40,.f50,.f60,.f66,.f70,.f75,.f80,.f90,.f100 { + _display:inline; /* IE5-6 */ + *margin-left:-1px; /* IE5-7 */ +} + +/** +* web2py Nuovo Theme +* ------------------ +**/ + +/* Basics */ + +html, body { + font-size: 13px; + text-align: left; + color: #333; + padding: 0; + margin: 0; + background: #fff url(../images/header_shadow.png) repeat-x left 33px; +} + +a { + color: #e8953c; + text-decoration: none; +} + +label { + color: #777; + font-weight: bold; + font-size: 100%; +} + +img { + vertical-align: baseline; +} + +td, th { + border: none; +} + +.center { + text-align: center; +} + +.centerblock { + margin: 0 auto; +} + +.clear { + clear: both; +} + +.att { + color: #d22; +} + +/* General */ + +h3 { + padding-left: 18px; + background: url(../images/sidebar_bullet.gif) no-repeat; + color: #555; + font-weight: normal; + font-size: 130%; +} + +.formfield { + padding: 0.7em 0.5em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; + margin: 1em 0; + border: 1px solid #ddd; +} + +.buttongroup { + padding: 0.7em 0.5em; +} + +.formfield { + background: #eee; +} + +.flash { + position: fixed; + top: 2em; + right: 2em; + background: #e8953c; + color: #fff; + border: 2px solid #fff; + -moz-border-radius: 0.7em; + border-radius: 0.7em; + padding: 0.5em 1em; +} + +.tooltip span { + background: #9fb364; + color: #eef1d9; + border: 1px solid #eef1d9; + font-style: italic; + width: 20%; + padding: 0.3em; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + font-size: 13px; + text-transform: none; +} + +.help { + width: 60%; + font-size: 1em; + padding: 0.3em; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + background: #eef1d9; + color: #9fb364; + font-style: italic; + text-transform: none; +} + +.help h3 { + color: #9fb364; + font-size: 1.2em; + background: transparent; + font-weight: bold; +} + +.icon img { + vertical-align: middle; + cursor: pointer; +} + +.form td { + padding: 0.2em 1em 0.2em 0; +} + +/* Buttons */ + +.controls a.button, +.controls a.button span { + background-image: url(../images/small_button.png); +} + +.controls a.button span { + padding-top: 2px; +} + +.controls a.button { + color: #333; +} + +.controls a.special, +.controls a.special span { + background-image: url(../images/small_special_button.png); +} + +.controls a.special { + color: #ddd; +} + +/* Header */ + +#header { + background: #292929 url(../images/header_bg.png) repeat-x; + height: 33px; + overflow: hidden; +} + +/* Home button */ + +#start { + position: absolute; + top: 2px; + left: 13px; + margin: 0; +} + +#start a.button { + display: block; +} + +#start a.button, +#start a.button span { + background-image: url(../images/start.png); +} + +#start a { + text-indent: -999px; + overflow: hidden; + padding: 0; + margin: 0; +} + +#start a.button span { + width: 112px; + height: 36px; + padding: 0; + margin: 0; +} + +/* Menu */ + +#menu { + float: right; + margin: 3px 13px 0 0; +} + +#menu li { + float: left; + list-style: none; + margin-right: 0.4em; +} + +#menu a.button, +#menu a.button span { + background-image: url(../images/menu.png); +} + +#menu a.button { + padding-right: 1em; +} + +#menu a.button span { + padding-left: 1em; +} + +#menu a { + color: #333; +} + +/* Main area */ + +#main { + padding: 2em 1em 5em; + position: relative; +} + +#main h2 { + margin-top: 0; + font-weight: normal; + text-transform: uppercase; + border-bottom: 1px dotted #aaa; + padding-left: 18px; + background: transparent url(../images/section_bullet.png) no-repeat left 3px; + color: #aaa; +} + +/* Applist */ + +.applist h3 { + color: #aaa; + font-weight: normal; +} + +.applist ul { + margin: 0; +} + +.applist li { + list-style: none; + padding: 0; +} + +h3.editableapp, +h3.currentapp { + padding: 5px 0 5px 54px; +} + +h3.editableapp { + background: #fff url(../images/folder.png) no-repeat; +} + +h3.currentapp { + background: #fff url(../images/folder_locked.png) no-repeat; +} + +.applist .controls { + margin-left: 1.5em; +} + + +/* Site sidebar */ + +.sidebar_inner { + margin: 0 1em 0; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + border: 1px solid #ddd; + min-width:400px; +} + +.sidebar h4 { + color: #888; +} + +.pwdchange { + padding: 1em; + float: right !important; +} + +.sidebar .box { + clear: right; + margin-top: 2em; + border-top: 1px solid #eee; + padding: 0 1em; +} + +.sidebar .box { + background: url(../images/sidebar_background.jpg) no-repeat; +} + +.sidebar .upgrade_version { + color: #71c837; +} + +/* Tweets */ + +#tweets ol { + margin: 1em 0; +} + +#tweets ol li { + background: #ebe8d0; + list-style: none; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + padding: 0.5em; + margin: 1em 0; + border: 1px solid #aaa; +} + +#tweets .entry-date { + font-weight: bold; + display: block; +} + +/* Design/Plugin page */ + +.component { + cursor: pointer; +} + +.component_contents { + padding-left: 20px; +} + +.component_contents li { + list-style: none; +} + +.component_contents div.comptools { + margin-bottom: 1em; + padding-bottom: 0.5em; +} + +.component_contents div.formfield form { + margin-bottom: 0.2em; + margin-top: 0.2em; +} + +.file { + font-weight: bold; +} + +.folder { + display: block; + padding: 4px 0 4px 40px; + background: url(../images/folder_sm.png) no-repeat; + margin: 0.5em 0; +} + +.folder .file { + font-weight: bold; +} + +.sublist { + margin-left: 0; + border-left: 1px dotted #aaa; + padding-left: 0.5em; + margin-top: 0.5em; + margin-bottom: 0.0em; +} + +/* About */ + +.legalese { + background: #eee url(../images/embossed.png) repeat-y; + padding: 1em 1em 1em 2em; +} + +/* Wizard */ + +.step li { + list-style: none; + margin-left: 1em; + margin-top: 0.5em; +} + +.step #wizard_nav .box { + border-bottom: 1px dotted #aaa; + padding: 0.5em; +} + +.step #wizard_form { + padding: 0.5em 0 2em 2em; +} + +/* Editor */ + +.edit #body { + height: auto; + width: 100%; +} + +.edit .help li { + list-style: none; + padding: 0.5em 0; +} + +.edit .help tt { + font-weight: bold; + font-style: normal; + display: inline; /* Rest cSans base style */ + border: 1px solid #999; + background: #333; + color: #ddd; + padding: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; +} + +/* Ticket */ + +ul#snapshot > li { + list-style: none; +} + +.inspect td, +.versions td, +.inspect th, +.versions th { + padding: 0.3em; + // border: 1px solid #aaa; +} + +.inspect th, +.versions th { + background: #ddd; + color: #777; +} + +.ticket h3 { + margin-top: 0.5em; + background: url(../images/ticket_section.png) no-repeat; + padding: 30px; + text-transform: uppercase; +} + + +.ticket .inspect li { + list-style: none; +} + +#frames ul { + margin: 0; +} + +#frames li { + margin: 0.5em 0; + padding: 0; + list-style: none; +} + +/* Errors */ + +.errors table.sortable th { + background: url(../images/header_bg.png) repeat-x; + color: #eee; + // border-right: 1px solid #eee; + padding-top: 0.5em; +} + +.errors table.sortable td { + border-bottom: 1px dotted #ddd; + padding: 0.4em 0.2em; +} + +/* Tests */ + +.test h3.failed { + background-image: url(../images/red_bullet.gif); +} + +.test h3.nodoctests { + background-image: url(../images/dim_bullet.gif); +} + +/* Footer */ + +#footer { + padding: 1em 0 0; + color: #eee; + text-align: center; + background: #292929 url(../images/header_bg.png) repeat-x; + height: 45px; + overflow: hidden; + clear: both; +} + +/* Shell */ + +.shell #wrapper { + margin: 0 auto; +} + +.shell #output { + width: 75%; + height:30em; +} + +.shell #output, +.shell #output pre { + color: #e8953c; + background: white; + border: 1px solid #333; +} + +.shell .prompt, +.shell #output, +.shell pre, +.shell #caret { + font-family: monospace; +} + +.shell .prompt, +.shell #output, +.shell #caret { + font-size: 10pt; + padding: 6px; + padding-right: 0em; +} + +.shell #shellwrapper { + background: white; + border: 1px solid #333; + color: #e8953c; + width: 75%; + // padding: 6px; + // -moz-border-radius: 1em; + // border-radius: 1em; + margin: 1em 0 +} + +.shell #caret { + border: 0; + float: left; +} + +.shell .prompt { + color: #e8953c; + width: 85%; + height: 4em; + border: 0; +} + +.shell .prompt, .shell #output { + overflow: auto; +} + +.shell table, tr, td { + text-align: left; + vertical-align: top; +} + +.shell pre { + border: 0; + padding: 0; + margin: 0; + color: #333333; +} + +.shell .message { + width: 100%; + color: #8AD; + font-weight: bold; + font-style: italic; +} + +.shell .error { + color: #F44; +} + +.shell .username { + font-weight: bold; +} + +.shell dd{ + color: #000033; +} + +.shell dt{ + color: #333333; +} + +.shell #ajax-status { + font-weight: bold; +} + +.shell .processing { + background-image: url('../images/spinner.gif'); +} + +.shell #caret { + width: 2.5em; + margin-right: 0px; + padding-right: 0px; + border-right: 0px; +} + + +/* ie7 hacks */ + +.sublist { + zoom: 1; +} + +.untranslated { background-color: #FFCC00; } +.translated { background-color: white; } +.ui-multiselect { border: 1px solid #ccc; width:400px;} +#editor_area textarea { height: 400px; width: 100% } ADDED applications/admin/static/eamy/bundle_markup.js Index: applications/admin/static/eamy/bundle_markup.js ================================================================== --- /dev/null +++ applications/admin/static/eamy/bundle_markup.js @@ -0,0 +1,389 @@ +/* + * eAmy.Offline - Amy Editor embedded for offline use. + * http://www.april-child.com/amy + * + * Published under MIT License. + * Copyright (c) 2007-2008 Petr Krontorád, April-Child.com + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + * + * + * This file is auto-generated from original Fry Framework and Amy Editor sources.. + */ + + +// Generated from theme definition file. +$class('ac.chap.theme.EAmy < ac.chap.Theme'); + + ac.chap.theme.EAmy.prototype.initDefinition = function() + { +// $call(this, 'ac.chap.Theme.initDefinition');this.cssId = 'black'; +//this.background = '#072240'; +//this.textColor = '#DFEFFF'; +//this.caretColor = 'lime'; +//this.caretRowStyleActive = '#041629'; +//this.selectionStyle = '#86553b'; +//this.colorScheme[ac.chap.TOKEN_MULTIROW_COMMENT] = 'color:#0084FF;font-style:italic'; +//this.colorScheme[ac.chap.TOKEN_SINGLEROW_COMMENT] = 'color:#0084FF;font-style:italic'; +//this.colorScheme[ac.chap.TOKEN_SINGLE_QUOTED] = 'color:#00DF00'; +//this.colorScheme[ac.chap.TOKEN_DOUBLE_QUOTED] = 'color:#00DF00'; +//this.colorScheme[ac.chap.CHUNK_KEYWORD] = 'color:#FF9D00'; +//this.colorScheme[ac.chap.CHUNK_NUMBER] = 'color:#FF5B8C'; +//this.colorScheme[ac.chap.CHUNK_OPERATOR] = 'color:#FF9D00;'; +//this.colorScheme[ac.chap.CHUNK_PARENTHESIS] = 'color:#FFF177'; +//this.colorScheme[ac.chap.CHUNK_KEYWORD_CUSTOM] = 'color:#54FFB8'; +//this.colorScheme[ac.chap.CHUNK_FUNCTION_NAME] = 'color:#FFE000'; +//this.colorScheme[ac.chap.CHUNK_LIBRARY] = 'color:#71E5B6'; +//this.colorScheme[ac.chap.CHUNK_LIBRARY_CUSTOM] = 'color:#FF78E5'; + + $call(this, 'ac.chap.Theme.initDefinition');this.cssId = 'twilight'; +this.background = '#141414'; +this.textColor = '#F8F8F8'; +this.caretColor = '#A7A7A7'; +this.caretRowStyleActive = '#1B1B1B'; +this.selectionStyle = '#3C4043'; +this.colorScheme[ac.chap.TOKEN_MULTIROW_COMMENT] = 'color:#605A60;font-style:italic'; +this.colorScheme[ac.chap.TOKEN_SINGLEROW_COMMENT] = 'color:#605A60;font-style:italic'; +this.colorScheme[ac.chap.TOKEN_SINGLE_QUOTED] = 'color:#8B9F67'; +this.colorScheme[ac.chap.TOKEN_DOUBLE_QUOTED] = 'color:#D4F29E'; +this.colorScheme[ac.chap.CHUNK_KEYWORD] = 'color:#D2A964'; +this.colorScheme[ac.chap.CHUNK_NUMBER] = 'color:#DE6848'; +this.colorScheme[ac.chap.CHUNK_OPERATOR] = 'color:#EFC25A;'; +this.colorScheme[ac.chap.CHUNK_PARENTHESIS] = 'color:#ABC4DC'; +this.colorScheme[ac.chap.CHUNK_KEYWORD_CUSTOM] = 'color:#A0849E'; +this.colorScheme[ac.chap.CHUNK_FUNCTION_NAME] = 'color:#DAD280'; +this.colorScheme[ac.chap.CHUNK_LIBRARY] = 'color:#7286A8'; +this.colorScheme[ac.chap.CHUNK_LIBRARY_CUSTOM] = 'color:#A55C29'; +} + + +// Generated from bundle keymap definition file. +ac.chap.KeyMap.prototype.initDefinition = function() + { + var _ = '\n'; + this.compile + (""+_+ "KEY: 0" ++_+ " insert(character:true)" ++_+ "KEY: -37" ++_+ " caret(move:'left')" ++_+ "KEY: -37+shift" ++_+ " caret(move:'left')" ++_+ " selection(add:true)" ++_+ "KEY: -37+ctrl" ++_+ " caret(move:'prev_regexp', re:'[^|._A-Z ,|(|);]*$')" ++_+ "KEY: -37+alt" ++_+ " caret(move:'prev_word')" ++_+ "KEY: -37+ctrl+shift" ++_+ " caret(move:'prev_regexp', re:'[^|._A-Z ,|(|);]*$')" ++_+ " selection(add:true)" ++_+ "KEY: -37+alt+shift" ++_+ " caret(move:'prev_word')" ++_+ " selection(add:true)" ++_+ "KEY: -37+meta" ++_+ " caret(move:'row_start')" ++_+ "KEY: -37+meta+shift" ++_+ " caret(move:'row_start')" ++_+ " selection(add:true)" ++_+ "KEY: -39" ++_+ " caret(move:'right')" ++_+ "KEY: -39+shift" ++_+ " caret(move:'right')" ++_+ " selection(add:true)" ++_+ "KEY: -39+ctrl" ++_+ " caret(move:'next_regexp', re:'^[^|._A-Z ,|(|);]*')" ++_+ "KEY: -39+alt" ++_+ " caret(move:'next_word')" ++_+ "KEY: -39+ctrl+shift" ++_+ " caret(move:'next_regexp', re:'^[^|._A-Z ,|(|);]*')" ++_+ " selection(add:true)" ++_+ "KEY: -39+alt+shift" ++_+ " caret(move:'next_word')" ++_+ " selection(add:true)" ++_+ "KEY: -39+meta" ++_+ " caret(move:'row_end')" ++_+ "KEY: -39+meta+shift" ++_+ " caret(move:'row_end')" ++_+ " selection(add:true)" ++_+ "KEY: -38" ++_+ " caret(move:'up')" ++_+ "KEY: -38+shift" ++_+ " caret(move:'up')" ++_+ " selection(add:true)" ++_+ "KEY: -40" ++_+ " caret(move:'down')" ++_+ "KEY: -40+shift" ++_+ " caret(move:'down')" ++_+ " selection(add:true)" ++_+ "KEY: -13" ++_+ " insert(row:true)" ++_+ "KEY: -8" ++_+ " delete(character:true)" ++_+ "KEY: -46" ++_+ " delete(character:false)" ++_+ "KEY: 75+ctrl+shift" ++_+ " delete(row:true)" ++_+ "KEY: -27" ++_+ " custom(action:'WordComplete', direction:true)" ++_+ "KEY: -27+shift" ++_+ " custom(action:'WordComplete', direction:false)" ++_+ "KEY: -9" ++_+ " custom(action:'SnippetComplete')" ++_+ "KEY: 123" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'}')" ++_+ "KEY: 34" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'\"')" ++_+ "KEY: 91" ++_+ " custom(action:'AutoComplete', use_selection:true, text:']')" ++_+ "KEY: 40" ++_+ " custom(action:'AutoComplete', use_selection:true, text:')')" ++_+ "KEY: -36" ++_+ " caret(move:'doc_start')" ++_+ "KEY: -36+shift" ++_+ " caret(move:'doc_start')" ++_+ " selection(add:true)" ++_+ "KEY: -35" ++_+ " caret(move:'doc_end')" ++_+ "KEY: -35+shift" ++_+ " caret(move:'doc_end')" ++_+ " selection(add:true)" ++_+ "KEY: -34+meta" ++_+ " caret(move:'page_down')" ++_+ "KEY: -34+meta+shift" ++_+ " caret(move:'page_down')" ++_+ " selection(add:true)" ++_+ "KEY: -33+meta" ++_+ " caret(move:'page_up')" ++_+ "KEY: -33+meta+shift" ++_+ " caret(move:'page_down')" ++_+ " selection(add:true)" ++_+ "KEY: 99+meta" ++_+ " clipboard(copy:true)" ++_+ "KEY: 120+meta" ++_+ " clipboard(cut:true)" ++_+ "KEY: 122+meta" ++_+ " undo()" ++_+ "KEY: 90+meta+shift" ++_+ " redo()" ++_+ "KEY: 97+meta" ++_+ " selection(all:true)" ++_+ "KEY: 97+ctrl" ++_+ " selection(all:true)" ++_+ "KEY: -113" ++_+ " custom(action:'GoToBookmark', direction:1)" ++_+ "KEY: -113+shift" ++_+ " custom(action:'GoToBookmark', direction:-1)" ++_+ "KEY: -113+meta" ++_+ " custom(action:'ToggleBookmark')" ++_+ "KEY: 91+meta" ++_+ " custom(action:'Indent', direction:'left')" ++_+ "KEY: 93+meta" ++_+ " custom(action:'Indent', direction:'right')" ++_+ "KEY: 47+meta" ++_+ " custom(action:'Comment')" ++_+ "KEY: 43+meta" ++_+ " custom(action:'RuntimeOption', key:'font.size', value:'bigger')" ++_+ "KEY: 45+meta" ++_+ " custom(action:'RuntimeOption', key:'font.size', value:'smaller')" ++_+ "KEY: 101+meta" ++_+ " custom(action:'SetSearchKeyword')" ++_+ "KEY: 103+meta" ++_+ " custom(action:'SearchKeyword', direction:'down')" ++_+ "KEY: 71+shift+meta" ++_+ " custom(action:'SearchKeyword', direction:'up')" ++_+ "KEY: 102+ctrl" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: 83+ctrl+shift" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: 102+meta" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: -13" ++_+ " custom(action:'SmartIndent', split_line:true, indent_tab_when_starts:'class module def if else unless rescue ensure while do __class__')" ++_+ "KEY: -13+meta" ++_+ " custom(action:'SmartIndent', split_line:false, indent_tab_when_starts:'class module def if else unless rescue ensure while do __class__')" ++_+ "KEY: 39" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'\\'')" +)}; + +$class('ac.chap.lang.EAmy < ac.chap.Language'); + + ac.chap.lang.EAmy.prototype.initDefinition = function() + { + $call(this, 'ac.chap.Language.initDefinition'); +this.singleQuoteStringMarker = "'"; +this.singleQuoteStringMarkerException = "\\"; +this.doubleQuoteStringMarker = "\""; +this.doubleQuoteStringMarkerException = "\\" +this.wordDelimiter = /[\w\.\d]/; +this.indentIgnoreMarker = /[\.]/; +this.foldingStartMarkers = [/^\s*<(div)\b.*>/i, /^\s*<(ul)\b.*>/i]; +this.foldingParityMarkers = [/^\s*<(div)\b.*>/i, /^\s*<(ul)\b.*>/i]; +this.foldingStopMarkers = [/^\s*<\/(div)>/i, /^\s*<\/(ul)>/i]; +this.singleRowCommentStartMarkers = []; +this.multiRowCommentStartMarker = ""; +this.chunkRules.push([/(([^\w]|^)(\d{1,}[\d\.Ee]*)([^w]|$))/i, 3, ac.chap.CHUNK_NUMBER]) +this.chunkRules.push([/(\+|\-|\*|\/|\=|\!|\^|\%|\||\&|\<|\>)/i, 0, ac.chap.CHUNK_OPERATOR]) +this.chunkRules.push([/(\(|\)|\[|\]|\{|\})/i, 0, ac.chap.CHUNK_PARENTHESIS]) +this.chunkRules.push([/((<|<\/)([\w-_\:]*)([ >]))/i, 3, ac.chap.CHUNK_KEYWORD]) +this.chunkRules.push([/(([ \t])([\w-_\:]*)(=$))/i, 3, ac.chap.CHUNK_KEYWORD_CUSTOM]) +this.chunkRules.push([/(([^\w]|^)(!DOCTYPE)([^\w]|$))/i, 3, ac.chap.CHUNK_LIBRARY]) +this.chunkRules.push([/(([^\w]|^)(\d{1,}[\d\.Ee]*)([^w]|$))/i, 3, ac.chap.CHUNK_NUMBER]) +this.chunkRules.push([/(\+|\-|\*|\/|\=|\!|\^|\%|\||\&|\<|\>)/i, 0, ac.chap.CHUNK_OPERATOR]) +this.chunkRules.push([/(\(|\)|\[|\]|\{|\})/i, 0, ac.chap.CHUNK_PARENTHESIS]) +this.chunkRules.push([/((<|<\/)([\w-_\:]*)([ >]))/i, 3, ac.chap.CHUNK_KEYWORD]) +this.chunkRules.push([/(([ \t])([\w-_\:]*)(=$))/i, 3, ac.chap.CHUNK_KEYWORD_CUSTOM]) +this.chunkRules.push([/(([^\w]|^)(!DOCTYPE)([^\w]|$))/i, 3, ac.chap.CHUNK_LIBRARY]) +} +var snippet = {}; +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ie6', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'iegte7', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ie5', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ie', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ienot', code: '${1:${AMY_SELECTED_TEXT: IE Conditional Comment: NOT Internet Explorer }}$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ielte6', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ielt6', code: '$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: '${0:${AMY_SELECTED_TEXT/\A(.*)<\/em>\z|.*/(?1:$1:$0<\/em>)/m}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: '${0:${AMY_SELECTED_TEXT/\A(.*)<\/strong>\z|.*/(?1:$1:$0<\/strong>)/m}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'left', code: '←'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'backtab', code: '⇤'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'enter', code: '⌅'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'arrow', code: '→'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'option', code: '⌥'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'shift', code: '⇧'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ' '}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'delete', code: '⌦'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'backspace', code: '⌫'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'escape', code: '⎋'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'tab', code: '⇥'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'up', code: '↑'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'control', code: '⌃'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'return', code: '↩'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'down', code: '↓'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'command', code: '⌘'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctype', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctype', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctypexf', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctypext', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctypex', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'doctypexs', code: '\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 't', code: '<{${1:tag_name}}>$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'body', code: '\n $0\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'textarea', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'div', code: '\n ${0:$AMY_SELECTED_TEXT}\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: '
'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'title', code: '${1:${AMY_FILENAME/((.+)\..*)?/(?2:$2:Page Title)/}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'movie', code: '\n \n \n \n \n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'input', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'head', code: '\n \n ${1:${AMY_FILENAME/((.+)\..*)?/(?2:$2:Page Title)/}}\n $0\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'meta', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'h1', code: '

${1:$AMY_SELECTED_TEXT}

'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'form', code: '\n $0\n\n

\n'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'link', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'style', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'table', code: '
\n \n \n
${5:Header}
${0:Data}
'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'base', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'scriptsrc', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'mailto', code: '
${3:email me}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'script', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'c', code: 'class="$1"'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'i', code: 'id="$1"'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'p', code: '{{pass}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ex', code: '{{extend \'${1:layout.html}\'}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'for', code: '{{for ${1:bar} in ${2:foo}:}}\n $0\n{{pass}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'if', code: '{{if ${1:foo} ${2:==/!=/=>/=/<} ${3:bar}:}}\n $0\n{{pass}}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '=', code: '{{=$0}}'}; +eamy.snippets.push(snippet); + + ADDED applications/admin/static/eamy/bundle_python.js Index: applications/admin/static/eamy/bundle_python.js ================================================================== --- /dev/null +++ applications/admin/static/eamy/bundle_python.js @@ -0,0 +1,296 @@ +/* + * eAmy.Offline - Amy Editor embedded for offline use. + * http://www.april-child.com/amy + * + * Published under MIT License. + * Copyright (c) 2007-2008 Petr Krontorád, April-Child.com + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + * + * + * This file is auto-generated from original Fry Framework and Amy Editor sources.. + */ + + +// Generated from theme definition file. +$class('ac.chap.theme.EAmy < ac.chap.Theme'); + + ac.chap.theme.EAmy.prototype.initDefinition = function() + { +// $call(this, 'ac.chap.Theme.initDefinition');this.cssId = 'black'; +//this.background = '#072240'; +//this.textColor = '#DFEFFF'; +//this.caretColor = 'lime'; +//this.caretRowStyleActive = '#041629'; +//this.selectionStyle = '#86553b'; +//this.colorScheme[ac.chap.TOKEN_MULTIROW_COMMENT] = 'color:#0084FF;font-style:italic'; +//this.colorScheme[ac.chap.TOKEN_SINGLEROW_COMMENT] = 'color:#0084FF;font-style:italic'; +//this.colorScheme[ac.chap.TOKEN_SINGLE_QUOTED] = 'color:#00DF00'; +//this.colorScheme[ac.chap.TOKEN_DOUBLE_QUOTED] = 'color:#00DF00'; +//this.colorScheme[ac.chap.CHUNK_KEYWORD] = 'color:#FF9D00'; +//this.colorScheme[ac.chap.CHUNK_NUMBER] = 'color:#FF5B8C'; +//this.colorScheme[ac.chap.CHUNK_OPERATOR] = 'color:#FF9D00;'; +//this.colorScheme[ac.chap.CHUNK_PARENTHESIS] = 'color:#FFF177'; +//this.colorScheme[ac.chap.CHUNK_KEYWORD_CUSTOM] = 'color:#54FFB8'; +//this.colorScheme[ac.chap.CHUNK_FUNCTION_NAME] = 'color:#FFE000'; +//this.colorScheme[ac.chap.CHUNK_LIBRARY] = 'color:#71E5B6'; +//this.colorScheme[ac.chap.CHUNK_LIBRARY_CUSTOM] = 'color:#FF78E5'; +// + $call(this, 'ac.chap.Theme.initDefinition'); +this.cssId = 'twilight'; +this.background = '#141414'; +this.textColor = '#F8F8F8'; +this.caretColor = '#A7A7A7'; +this.caretRowStyleActive = '#1B1B1B'; +this.selectionStyle = '#3C4043'; +this.colorScheme[ac.chap.TOKEN_MULTIROW_COMMENT] = 'color:#605A60;font-style:italic'; +this.colorScheme[ac.chap.TOKEN_SINGLEROW_COMMENT] = 'color:#605A60;font-style:italic'; +this.colorScheme[ac.chap.TOKEN_SINGLE_QUOTED] = 'color:#8B9F67'; +this.colorScheme[ac.chap.TOKEN_DOUBLE_QUOTED] = 'color:#D4F29E'; +this.colorScheme[ac.chap.CHUNK_KEYWORD] = 'color:#D2A964'; +this.colorScheme[ac.chap.CHUNK_NUMBER] = 'color:#DE6848'; +this.colorScheme[ac.chap.CHUNK_OPERATOR] = 'color:#EFC25A;'; +this.colorScheme[ac.chap.CHUNK_PARENTHESIS] = 'color:#ABC4DC'; +this.colorScheme[ac.chap.CHUNK_KEYWORD_CUSTOM] = 'color:#A0849E'; +this.colorScheme[ac.chap.CHUNK_FUNCTION_NAME] = 'color:#DAD280'; +this.colorScheme[ac.chap.CHUNK_LIBRARY] = 'color:#7286A8'; +this.colorScheme[ac.chap.CHUNK_LIBRARY_CUSTOM] = 'color:#A55C29'; +} + + + +// Generated from bundle keymap definition file. +ac.chap.KeyMap.prototype.initDefinition = function() + { + var _ = '\n'; + this.compile + (""+_+ "KEY: 0" ++_+ " insert(character:true)" ++_+ "KEY: -37" ++_+ " caret(move:'left')" ++_+ "KEY: -37+shift" ++_+ " caret(move:'left')" ++_+ " selection(add:true)" ++_+ "KEY: -37+ctrl" ++_+ " caret(move:'prev_regexp', re:'[^|._A-Z ,|(|);]*$')" ++_+ "KEY: -37+alt" ++_+ " caret(move:'prev_word')" ++_+ "KEY: -37+ctrl+shift" ++_+ " caret(move:'prev_regexp', re:'[^|._A-Z ,|(|);]*$')" ++_+ " selection(add:true)" ++_+ "KEY: -37+alt+shift" ++_+ " caret(move:'prev_word')" ++_+ " selection(add:true)" ++_+ "KEY: -37+meta" ++_+ " caret(move:'row_start')" ++_+ "KEY: -37+meta+shift" ++_+ " caret(move:'row_start')" ++_+ " selection(add:true)" ++_+ "KEY: -39" ++_+ " caret(move:'right')" ++_+ "KEY: -39+shift" ++_+ " caret(move:'right')" ++_+ " selection(add:true)" ++_+ "KEY: -39+ctrl" ++_+ " caret(move:'next_regexp', re:'^[^|._A-Z ,|(|);]*')" ++_+ "KEY: -39+alt" ++_+ " caret(move:'next_word')" ++_+ "KEY: -39+ctrl+shift" ++_+ " caret(move:'next_regexp', re:'^[^|._A-Z ,|(|);]*')" ++_+ " selection(add:true)" ++_+ "KEY: -39+alt+shift" ++_+ " caret(move:'next_word')" ++_+ " selection(add:true)" ++_+ "KEY: -39+meta" ++_+ " caret(move:'row_end')" ++_+ "KEY: -39+meta+shift" ++_+ " caret(move:'row_end')" ++_+ " selection(add:true)" ++_+ "KEY: -38" ++_+ " caret(move:'up')" ++_+ "KEY: -38+shift" ++_+ " caret(move:'up')" ++_+ " selection(add:true)" ++_+ "KEY: -40" ++_+ " caret(move:'down')" ++_+ "KEY: -40+shift" ++_+ " caret(move:'down')" ++_+ " selection(add:true)" ++_+ "KEY: -13" ++_+ " insert(row:true)" ++_+ "KEY: -8" ++_+ " delete(character:true)" ++_+ "KEY: -46" ++_+ " delete(character:false)" ++_+ "KEY: 75+ctrl+shift" ++_+ " delete(row:true)" ++_+ "KEY: -27" ++_+ " custom(action:'WordComplete', direction:true)" ++_+ "KEY: -27+shift" ++_+ " custom(action:'WordComplete', direction:false)" ++_+ "KEY: -9" ++_+ " custom(action:'SnippetComplete')" ++_+ "KEY: 123" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'}')" ++_+ "KEY: 34" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'\"')" ++_+ "KEY: 91" ++_+ " custom(action:'AutoComplete', use_selection:true, text:']')" ++_+ "KEY: 40" ++_+ " custom(action:'AutoComplete', use_selection:true, text:')')" ++_+ "KEY: -36" ++_+ " caret(move:'doc_start')" ++_+ "KEY: -36+shift" ++_+ " caret(move:'doc_start')" ++_+ " selection(add:true)" ++_+ "KEY: -35" ++_+ " caret(move:'doc_end')" ++_+ "KEY: -35+shift" ++_+ " caret(move:'doc_end')" ++_+ " selection(add:true)" ++_+ "KEY: -34+meta" ++_+ " caret(move:'page_down')" ++_+ "KEY: -34+meta+shift" ++_+ " caret(move:'page_down')" ++_+ " selection(add:true)" ++_+ "KEY: -33+meta" ++_+ " caret(move:'page_up')" ++_+ "KEY: -33+meta+shift" ++_+ " caret(move:'page_down')" ++_+ " selection(add:true)" ++_+ "KEY: 99+meta" ++_+ " clipboard(copy:true)" ++_+ "KEY: 120+meta" ++_+ " clipboard(cut:true)" ++_+ "KEY: 122+meta" ++_+ " undo()" ++_+ "KEY: 90+meta+shift" ++_+ " redo()" ++_+ "KEY: 97+meta" ++_+ " selection(all:true)" ++_+ "KEY: 97+ctrl" ++_+ " selection(all:true)" ++_+ "KEY: -113" ++_+ " custom(action:'GoToBookmark', direction:1)" ++_+ "KEY: -113+shift" ++_+ " custom(action:'GoToBookmark', direction:-1)" ++_+ "KEY: -113+meta" ++_+ " custom(action:'ToggleBookmark')" ++_+ "KEY: 91+meta" ++_+ " custom(action:'Indent', direction:'left')" ++_+ "KEY: 93+meta" ++_+ " custom(action:'Indent', direction:'right')" ++_+ "KEY: 47+meta" ++_+ " custom(action:'Comment')" ++_+ "KEY: 43+meta" ++_+ " custom(action:'RuntimeOption', key:'font.size', value:'bigger')" ++_+ "KEY: 45+meta" ++_+ " custom(action:'RuntimeOption', key:'font.size', value:'smaller')" ++_+ "KEY: 101+meta" ++_+ " custom(action:'SetSearchKeyword')" ++_+ "KEY: 103+meta" ++_+ " custom(action:'SearchKeyword', direction:'down')" ++_+ "KEY: 71+shift+meta" ++_+ " custom(action:'SearchKeyword', direction:'up')" ++_+ "KEY: 102+ctrl" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: 83+ctrl+shift" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: 102+meta" ++_+ " custom(action:'SearchInteractive')" ++_+ "KEY: -13" ++_+ " custom(action:'SmartIndent', split_line:true, indent_tab_when_starts:'class module def if else unless rescue ensure while do __class__')" ++_+ "KEY: -13+meta" ++_+ " custom(action:'SmartIndent', split_line:false, indent_tab_when_starts:'class module def if else unless rescue ensure while do __class__')" ++_+ "KEY: 39" ++_+ " custom(action:'AutoComplete', use_selection:true, text:'\\'')" +)}; + +$class('ac.chap.lang.EAmy < ac.chap.Language'); + + ac.chap.lang.EAmy.prototype.initDefinition = function() + { + $call(this, 'ac.chap.Language.initDefinition'); +this.singleQuoteStringMarker = "'"; +this.singleQuoteStringMarkerException = "\\"; +this.doubleQuoteStringMarker = "\""; +this.doubleQuoteStringMarkerException = "\\"; +this.wordDelimiter = /[\w\d]/; +this.indentIgnoreMarker = /[\t \s]/; +this.foldingStartMarkers = [/^\s*def|class/i]; +this.foldingParityMarkers = [/do|(^\s*if)|(^\s*def)|(^\s*class)/i]; +this.foldingStopMarkers = [/^\s{0,1}$/i]; +this.singleRowCommentStartMarkers = ['#']; +this.multiRowCommentStartMarker = "\"\"\""; +this.multiRowCommentEndMarker = "\"\"\""; +this.stringInterpolation = ['(#\{[^\}]*\})', 1]; +this.chunkRules.push([/(([^\w]|^)(\d{1,}[\d\.Ee]*)([^w]|$))/i, 3, ac.chap.CHUNK_NUMBER]) +this.chunkRules.push([/(\+|\-|\*|\/|\=|\!|\^|\%|\||\&|\<|\>)/i, 0, ac.chap.CHUNK_OPERATOR]) +this.chunkRules.push([/(\(|\)|\[|\]|\{|\})/i, 0, ac.chap.CHUNK_PARENTHESIS]) +this.chunkRules.push([/(([^\w]|^)(elif|else|except|finally|for|if|try|while|with)([^\w]|$))/i, 3, ac.chap.CHUNK_KEYWORD]) +this.chunkRules.push([/(([^\w]|^)(@[\w]*|break|continue|pass|raise|return|yield|and|in|is|not|or|as|assert|del|exec|print)([^\w]|$))/i, 3, ac.chap.CHUNK_KEYWORD_CUSTOM]) +this.chunkRules.push([/((def[ ]{1,})([\w]{1,}))/i, 3, ac.chap.CHUNK_FUNCTION_NAME]) +this.chunkRules.push([/(([^\w]|^)(__import__|all|abs|any|apply|callable|chr|cmp|coerce|compile|delattr|dir|divmod|eval|execfile|filter|getattr|globals|hasattr|hash|hex|id|input|intern|isinstance|issubclass|iter|len|locals|map|max|min|oct|ord|pow|range|raw_input|reduce|reload|repr|round|setattr|sorted|sum|unichr|vars|zip|basestring|bool|buffer|classmethod|complex|dict|enumerate|file|float|frozenset|int|list|long|object|open|property|reversed|set|slice|staticmethod|str|super|tuple|type|unicode|xrange)([^\w]|$))/i, 3, ac.chap.CHUNK_LIBRARY]) +this.chunkRules.push([/(([^\w]|^)((__(all|bases|class|debug|dict|doc|file|members|metaclass|methods|name|slots|weakref)__)|(import|from| abs|add|and|call|cmp|coerce|complex|contains|del|delattr|delete|delitem|delslice|div|divmod|enter|eq|exit|float|floordiv|ge|get|getattr|getattribute|getitem|getslice|gt|hash|hex|iadd|iand|idiv|ifloordiv|ilshift|imod|imul|init|int|invert|ior|ipow|irshift|isub|iter|itruediv|ixor|le|len|long|lshift|lt|mod|mul|ne|neg|new|nonzero|oct|or|pos|pow|radd|rand|rdiv|rdivmod|repr|rfloordiv|rlshift|rmod|rmul|ror|rpow|rrshift|rshift|rsub|rtruediv|rxor|set|setattr|setitem|setslice|str|sub|truediv|unicode|xor))([^\w]|$))/i, 3, ac.chap.CHUNK_LIBRARY_CUSTOM]) +} +var snippet = {}; +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ifmain', code: 'if __name__ == '+"'"+'__main__'+"'"+':\n ${1:main()}$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'try', code: 'try:\n ${1:pass}\nexcept ${2:Exception}, ${3:e}:\n ${4:raise e}\nelse:\n ${5:pass}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'property', code: 'def ${1:foo}():\n doc = "${2:The $1 property.}"\n def fget(self):\n ${3:return self._$1}\n def fset(self, value):\n ${4:self._$1 = value}\n def fdel(self):\n ${5:del self._$1}\n return locals()\n$1 = property(**$1())$0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '__', code: '__${1:init}__'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '.', code: 'self.'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: '', code: ''}; +eamy.snippets.push(snippet); +//snippet = {tab_activation: 'def', code: 'def ${1:fname}(${2:`if [ "$TM_CURRENT_LINE" != "" ]\n # poor man'+"'"+'s way ... check if there is an indent or not\n # (cuz we would have lost the class scope by this point)\n then\n echo "self"\n fi`}):\n ${3/.+/"""/}${3:docstring for $1}${3/.+/"""\n/}${3/.+/\t/}${0:pass}'}; +//eamy.snippets.push(snippet); +snippet = {tab_activation: 'def', code: 'def ${1:fname}(${2:`if [ "$TM_CURRENT_LINE" != "" ]\n # poor man'+"'"+'s way ... check if there is an indent or not\n # (cuz we would have lost the class scope by this point)\n then\n echo "self"\n fi`}):\n ${3:}\n ${0:return dict()}'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'class', code: 'class ${1:ClassName}(${2:object}):\n ${3/.+/"""/}${3:docstring for $1}${3/.+/"""\n/}${3/.+/\t/}def __init__(self${4/([^,])?(.*)/(?1:, )/}${4:arg}):\n ${5:super($1, self).__init__()}\n${4/(\A\s*,\s*\Z)|,?\s*([A-Za-z_][a-zA-Z0-9_]*)\s*(=[^,]*)?(,\s*|$)/(?2:\t\tself.$2 = $2\n)/g} $0'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'aurm', code: '@auth.requires_membership(\'$0\'):'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'dbt', code: '${1:db_name}.define_table("${2:table_name}",\n SQLField("${3:field_name}", "${4:string/text/password/blob/upload/boolean/integer/double/time/date/datetime/db.reference_table}", ${5:length=$6}, ${7:default="$8"}),$9\n)'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'dbf', code: 'SQLField("${1:field_name}", "${2:string/text/password/blob/upload/boolean/integer/double/time/date/datetime/db.reference_table}", ${3:length=$4}, ${5:default="$6"}),$7'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'dbi', code: '${1:db_name}.${2:table_name}.insert(\n ${3:field_name}="$4" $5\n)'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 't', code: 'T("$0")'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'rev', code: 'response.view=\'$0\''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'ref', code: 'response.flash=\'$0\''}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 're', code: 'redirect(\'$0\')'}; +eamy.snippets.push(snippet); +snippet = {tab_activation: 'rej', code: 'response.json=\'$0\''}; +eamy.snippets.push(snippet); ADDED applications/admin/static/eamy/chap-bg-sidebar.gif Index: applications/admin/static/eamy/chap-bg-sidebar.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-bg-sidebar.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-bookmark-default.gif Index: applications/admin/static/eamy/chap-bookmark-default.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-bookmark-default.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-folding-expand-inner.gif Index: applications/admin/static/eamy/chap-folding-expand-inner.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-folding-expand-inner.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-folding-expand.gif Index: applications/admin/static/eamy/chap-folding-expand.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-folding-expand.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-folding-start.gif Index: applications/admin/static/eamy/chap-folding-start.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-folding-start.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-folding-stop.gif Index: applications/admin/static/eamy/chap-folding-stop.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-folding-stop.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/chap-wrapped-row.gif Index: applications/admin/static/eamy/chap-wrapped-row.gif ================================================================== --- /dev/null +++ applications/admin/static/eamy/chap-wrapped-row.gif cannot compute difference between binary files ADDED applications/admin/static/eamy/eamy.js Index: applications/admin/static/eamy/eamy.js ================================================================== --- /dev/null +++ applications/admin/static/eamy/eamy.js @@ -0,0 +1,8143 @@ +/* + * eAmy.Offline - Amy Editor embedded for offline use. + * http://www.april-child.com/amy + * + * Published under MIT License. + * Copyright (c) 2007-2008 Petr Krontorád, April-Child.com + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + * + * + * This file is auto-generated from original Fry Framework and Amy Editor sources.. + */ + + + + + +/* + * AC Fry - JavaScript Framework v1.0 + * (c)2006 Petr Krontorad, April-Child.com + * Portions of code based on WHOA Bender Framework, (c)2002-2005 Petr Krontorad, WHOA Group. + * http://www.april-child.com. All rights reserved. + * See the license/license.txt for additional details regarding the license. + * Special thanks to Matt Groening and David X. Cohen for all the robots. + */ + +/* Reserving global `fry` object */ +var fry = +{ + version:1.0, + __production_mode:false +}; + +// String prototype enhancements +String.prototype.camelize = function() +{ + return this.replace( /([-_].)/g, function(){ return arguments[0].substr(1).toUpperCase();} ); +} + +String.prototype.decamelize = function() +{ + return this.replace( /([A-Z])/g, function(){ return '-'+arguments[0].toLowerCase();} ); +} + +String.prototype.trim = function() +{ + return this.replace(/(^\s*)|(\s*$)/g, '' ); +} + +String.prototype.stripLines = function() +{ + return this.replace( /\n/g, '' ); +} + +String.prototype.stripMarkup = function() +{ + return this.replace( /<(.|\n)+?>/g, '' ); +} + +String.prototype.replaceMarkup = function( charRep ) +{ + return this.replace( /(<(.|\n)+?>)/g, function() + { + var t = ''; + for ( var i=0; i/g, '>' ).replace( /' ).replace( /&/g, '&' ); +} + +String.prototype.surround = function(t, side) +{ + side = side || 3; + return (1==1&side?t:'')+this+(2==2&side?t:''); +} + +String.prototype.surroundTag = function(t) +{ + return '<'+t+'>'+this+''; +} + +// example of use: var pattern = '? is ?; alert(pattern.embed('Decin', 'sunny')); pattern = '@city is @weather'; alert(pattern.embed({weather:'cloudy', city:'Decin'})) +String.prototype.embed = function() +{ + var t = this; + if ( 1 == arguments.length && 'object' == typeof arguments[0] ) + { + // named placeholders + for ( var i in arguments[0] ) + { + eval('var re=/@'+i+'/g;'); + t = t.replace(re, arguments[0][i]); + } + } + else + { + // anonymous placeholders `?` + for ( var i=0; i opacity ) + { + opacity = 0; + } + if ( 1 < opacity ) + { + opacity = 1; + } + if ( $__tune.isIE ) + { + node.style.filter = 'alpha(opacity='+(100*opacity)+')'; + } + else + { + node.style.opacity = opacity; + node.style.MozOpacity = opacity; + } + }, + getPageScrollPosition:function() + { + var d = document.documentElement; + if ( d && d.scrollTop) + { + return [d.scrollLeft, d.scrollTop]; + } + else if (document.body) + { + return [document.body.scrollLeft, document.body.scrollTop]; + } + else + { + return [0, 0]; + } + } + }, + event: + { + get:function(evt, type) + { + if ( $notset(evt.target) ) + { + evt.target = evt.srcElement; + evt.stopPropagation = function() + { + window.event.cancelBubble = true; + }; + } + evt.stop = function() + { + evt.stopPropagation(); + evt.stopped = true; + } + evt.$ = $(evt.target); + if ( $notset(evt.pageX) ) + { + evt.pageX = evt.clientX + document.body.scrollLeft; + evt.pageY = evt.clientY + document.body.scrollTop; + } + evt.getOffsetX = function() + { + if ( $notset(evt.offsetX) ) + { + var pos = evt.$.abspos(); + evt.offsetX = evt.pageX - pos.x; + evt.offsetY = evt.pageY - pos.y; + } + return evt.offsetX; + } + evt.getOffsetY = function() + { + if ( $notset(evt.offsetY) ) + { + var pos = evt.$.abspos(); + evt.offsetX = evt.pageX - pos.x; + evt.offsetY = evt.pageY - pos.y; + } + return evt.offsetY; + } + evt.isAnyControlKeyPressed = function() + { + return evt.metaKey||evt.ctrlKey||evt.altKey||evt.shiftKey; + } + evt.KEY_ESCAPE = 27; + evt.KEY_ENTER = 13; + evt.KEY_ARR_RIGHT = 39; + evt.KEY_ARR_LEFT = 37; + evt.KEY_ARR_UP = 38; + evt.KEY_ARR_DOWN = 40; + return evt; + }, + addListener:function(node, type, listener) + { + if ( $__tune.isIE && node.attachEvent ) + { + node.attachEvent('on'+type, listener); + } + else + { + node.addEventListener(type, listener, false); + } + }, + removeListener:function(node, type, listener) + { + if ( node.detachEvent ) + { + node.detachEvent('on'+type, listener); + node['on'+type] = null; + } + else if ( node.removeEventListener ) + { + node.removeEventListener(type, listener, false); + } + } + }, + behavior: + { + disablePageScroll:function() + { + if ( $notset($__tune.__prop.page_scroll) ) + { + $__tune.__prop.page_scroll = [$().s().overflow, $().ga('scroll')]; + } + $().s('overflow:hidden').sa('scroll', 'no'); + }, + enablePageScroll:function() + { + $().s('overflow:auto').sa('scroll', 'yes'); + }, + disableCombos:function() + { + $().g('select', function(node) + { + node.sa('__dis_combo', node.s().visibility); + $(node).v(false); + }); + }, + enableCombos:function() + { + $().g('select', function(node) + { + node.s({visibility:node.ga('__dis_combo') || 'visible'}); + }); + }, + clearSelection:function() + { + try + { + if ( window.getSelection ) + { + if ( $__tune.isSafari ) + { + window.getSelection().collapse(); + } + else + { + window.getSelection().removeAllRanges(); + } + } + else + { + if ( document.selection ) + { + if ( document.selection.empty ) + { + document.selection.empty(); + } + else + { + if ( document.selection.clear ) + { + document.selection.clear(); + } + } + } + } + } + catch (e) {} + }, + makeBodyUnscrollable:function() + { + $().s('position:fixed').w(fry.ui.info.page.width); + } + }, + ui: + { + scrollbarWidth:-1!=navigator.appVersion.indexOf('intosh')?15:17 + }, + selection: + { + setRange:function(el, selectionStart, selectionEnd) + { + if (el.setSelectionRange) + { + el.focus(); + el.setSelectionRange(selectionStart, selectionEnd); + } + else if (el.createTextRange) + { + var range = el.createTextRange(); + range.collapse(true); + range.moveEnd('character', selectionEnd); + range.moveStart('character', selectionStart); + range.select(); + } + } + } +} +// some browsers masks its presence having Gecko string somewhere inside its userAgent field... +$__tune.isGecko = !$__tune.isSafari&&!$__tune.isIE&&-1!=navigator.userAgent.indexOf('ecko'); +$__tune.isSafari2 = $__tune.isSafari && -1 != navigator.appVersion.indexOf('Kit/4'); +$__tune.isSafari3 = $__tune.isSafari && -1 != navigator.appVersion.indexOf('Kit/5'); + + +// Node manipulations + +function ACNode(node) +{ + this.$ = node; + if ( node ) + { + node.setAttribute('fryis', '1'); + } +} +// `$$` creates new node +ACNode.prototype.$$ = function(tagName) +{ + return $$(tagName); +} +// *is* - tells whether node is a part of the active DOM tree (that is displayed on page). Node may exist only in memory before appending or after removing when references, in which case node.is() will return false. +ACNode.prototype.is = function() +{ + return this.$ && null != this.$.parentNode; +} +// *i*d +ACNode.prototype.i = function(id) +{ + if ( 'undefined' == typeof id ) + { + return this.$.id||''; + } + this.$.id = id; + return this; +} +// class *n*ame +ACNode.prototype.n = function(n) +{ + if ( 'undefined' == typeof n) + { + return this.$.className||''; + } + this.$.className = n; + return this; +} +// *e*vent listener, if called with one argument only, previously registered listeners are removed +ACNode.prototype.e = function(t, c, oneUseOnly) +{ + var ser_type_id = 'fryse-'+t; + if ( !c ) + { + if ( null != this.$.getAttribute(ser_type_id) ) + { + var ser_listeners = this.$.getAttribute(ser_type_id).split(','); + // console.log('*E* removing listeners for %s, listeners: %s', t, ser_listeners); + for ( var i=0; i h ) + { + this.$.style.fontSize = '1px'; + } + return this; +} +// *s*tyle information - argument can be either "{color:'red', backgroundColor:'blue'}" or "'color:red;background-color:blue'" +ACNode.prototype.s = function(s) +{ + if ( 'undefined' == typeof s ) + { + return this.$.style; + } + if ( 'object' == typeof s ) + { + for ( var n in s ) + { + this.$.style[n] = s[n]; + } + } + else if ( 'string' == typeof s ) + { + if ( '' != s ) + { + var styles = s.split(';'); + for ( var i=0; idiv>table>tbody>tr>td>` and node at `td` +// to return second div you would call `gp('tr/tbody/table/div')` or `tr/table/div:1`, first div could be acquired using `table/div:2` etc. you can use `*` for any node. +ACNode.prototype.gp = function(q) +{ + if ( 'string' == typeof q ) + { + q = q.split('/'); + } + var fq = []; + for ( var i=0; i to && to>=from ) + { + self.clearInterval(t); + } + else + { + c(i, control); + if ( control.stopped ) + { + self.clearInterval(t); + } + } + i++; + }, interval); +} +// $dotimes +// ======== +// Repeats embedded code n times. +/* Usage: + $dotimes(20, function(i) + { + // your code, i is the counter parameter + }) +*/ +var $dotimes = function(n, c) +{ + for ( var i=0; i i ) + { + control.skip(); + return; + } + tr.n(0==i%2 ? 'even' : 'odd'); + if ( 20 < i ) + { + control.stop(); + } + }) +*/ +var $foreach = function(o, c) +{ + if ( !o ) + { + c = null; + return; + } + if ( 'undefined' == typeof o.length && 'function' != typeof o.__length ) + { + c = null; + return; + } + var n = 'function' == typeof o.__length ? o.__length() : o.length; + var control = + { + stopped:false, + stop:function() + { + this.stopped = true; + }, + skipped:false, + skip:function() + { + this.skipped = true; + }, + removed:false, + remove:function(stopAfterwards) + { + this.removed = true; + this.stopped = true == stopAfterwards; + } + } + // cannot just extend Array.prototype for `item()` method due bug in IE6 iteration mechanism. Some day (>2010 :) this might get fixed and will become obsolete + for ( var i=0; i= evt.keyCode) + { + fry.keyboard.pushKey(evt.keyCode + 32, fry.keyboard.META_KEY); + evt.preventDefault(); + return true; + } + } + } + fry.keyboard.initialized = true; + fry.keyboard.start(); +} + +fry.keyboard.start = function() +{ + fry.keyboard.stopped = false; +} + +fry.keyboard.stop = function() +{ + fry.keyboard.stopped = true; +} + +fry.keyboard.disableTextfieldsEditation = function() +{ + fry.keyboard.allowTextfieldsEditation(true); +} + +fry.keyboard.allowTextfieldsEditation = function(disable) +{ + var lst = document.getElementsByTagName('input'); + var n = lst.length; + for (var i=0; i evt.keyCode)) + { + // control code + mask++; + } + if (!fry.keyboard.pushKey(code, mask)) + { + return true; + } + } + evt.preventDefault(); + evt.stopPropagation(); + return false; +} + +fry.keyboard.paste.ff_mac = function(evt) +{ + fry.keyboard.last_down_evt = null; + // catching Command+C, Command+X, it's a FF.mac hack + if (evt.metaKey && ((67 == evt.keyCode && 0 == evt.charCode && 67 == evt.which) || (88 == evt.keyCode && 0 == evt.charCode && 88 == evt.which))) + { + return fry.keyboard.shared.copy(evt); + } + else + { + return 86 == evt.keyCode && 0 == evt.charCode && 86 == evt.which && evt.metaKey; + } +} + +fry.keyboard.down.ff_mac = function(evt) +{ + return false; +} + +fry.keyboard.press.ff_mac = function(evt) +{ + if (null != fry.keyboard.last_down_evt) + { + return; + } + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + if (!evt.charCode || (evt.charCode == evt.keyCode)) + { + // control code + fry.keyboard.pushKey(evt.keyCode, 1 + mask); + } + else + { + if (!fry.keyboard.pushKey(evt.charCode, mask)) + { + return true; + } + } + evt.preventDefault(); + evt.stopPropagation(); + return false; +} + +fry.keyboard.paste.webkit = function(evt) +{ + if ($__tune.isMac) + { + return (86 == evt.keyCode && (0 == evt.charCode || 118 == evt.charCode) && evt.metaKey); + } + else + { + return (86 == evt.keyCode && (0 == evt.charCode || 118 == evt.charCode) && evt.ctrlKey); + } +} + +fry.keyboard.down.webkit = function(evt) +{ + if (0 != evt.keyCode && (48 > evt.keyCode || (111 < evt.keyCode && 128 > evt.keyCode) || 60000 < evt.charCode)) + { + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + if (!evt.charCode || 111 < evt.keyCode || 32 > evt.charCode || 60000 < evt.charCode) + { + // control code + fry.keyboard.pushKey(evt.keyCode, 1 + mask); + } + else + { + if (!fry.keyboard.pushKey(evt.charCode, mask)) + { + return true; + } + } + evt.preventDefault(); + evt.stopPropagation(); + fry.keyboard.last_down_evt = null; + return false; + } + fry.keyboard.last_down_evt = evt; + return true; +} + +fry.keyboard.press.webkit = function(evt) +{ + if (null != fry.keyboard.last_down_evt) + { + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + var code = !evt.keyCode ? evt.charCode : evt.keyCode; + if (evt.keyCode == evt.charCode && evt.keyCode == fry.keyboard.last_down_evt.charCode && evt.keyCode > 60000) + { + code = fry.keyboard.last_down_evt.keyCode; + } + if (evt.keyCode == fry.keyboard.last_down_evt.keyCode && 48 > evt.keyCode) + { + // control code + mask++; + } + else + { + var r_mask = fry.keyboard.SHIFT_KEY + fry.keyboard.META_KEY; + if (r_mask == (mask & r_mask) && 97 <= code && 122 >= code) + { + code -= 32; + } + } + if (!fry.keyboard.pushKey(code, mask)) + { + return true; + } + } + evt.preventDefault(); + evt.stopPropagation(); + return false; +} + +fry.keyboard.paste.ie = function(evt) +{ + if (evt.ctrlKey && (67 == evt.keyCode || 88 == evt.keyCode)) + { + // ctrl+c, ctrl+x + return fry.keyboard.shared.copy(evt); + } + else + { + return false; + } +} + +fry.keyboard.down.ie = function(evt) +{ + fry.keyboard.last_down_evt = evt; + if (48 > evt.keyCode || (111 < evt.keyCode && 128 > evt.keyCode)) + { + // control code for IE + var mask = 1 + (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + return !fry.keyboard.pushKey(evt.keyCode, mask) + } + else + { + var code = evt.keyCode; + // disabling some other keys (A, F, N, R, S, T) + if (82 == evt.keyCode || 65 == evt.keyCode || 83 == evt.keyCode || 70 == evt.keyCode || 78 == evt.keyCode || 84 == evt.keyCode) + { + if (!evt.shiftKey) + { + code += 32; + } + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + return !fry.keyboard.pushKey(code, mask); + } + } + return true; +} + +fry.keyboard.press.ie = function(evt) +{ + if (null != fry.keyboard.last_down_evt) + { + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + return !fry.keyboard.pushKey(evt.keyCode, mask); + } + return false; +} + + +fry.keyboard.paste.opera = function(evt) +{ + return 86 == evt.keyCode && 86 == evt.which && evt.ctrlKey; +} + +fry.keyboard.down.opera = function(evt) +{ + fry.keyboard.last_down_evt = evt; + return false; +} + +fry.keyboard.press.opera = function(evt) +{ + var e = fry.keyboard.last_down_evt; + var mask = (evt.altKey ? 2 : 0) + (evt.ctrlKey ? 4 : 0) + (evt.shiftKey ? 8 : 0) + (evt.metaKey ? 16 : 0); + var prev_mask = (e.altKey ? 2 : 0) + (e.ctrlKey ? 4 : 0) + (e.shiftKey ? 8 : 0) + (e.metaKey ? 16 : 0); + if ((evt.keyCode == fry.keyboard.last_down_evt.keyCode || 0 == e.keyCode) && (0 == evt.which || 48 > e.keyCode || 111 < e.keyCode)) + { + mask++; + } + if (!fry.keyboard.pushKey(evt.keyCode, mask)) + { + return true; + } + evt.preventDefault(); + evt.stopPropagation(); + return false; +} + +fry.keyboard.addListener = function(listener) +{ + fry.keyboard.listener = listener; +} + +fry.keyboard.removeListener = function(listener) +{ + fry.keyboard.listener = null; +} + + +fry.keyboard.pushKey = function(code, mask) +{ + if (32 == code) + { + mask = mask & 65534; + } + var was_clipboard_copy = false; + var was_clipboard_cut = false; + if ($__tune.isMac) + { + was_clipboard_copy = (99 == code) && (fry.keyboard.META_KEY == (mask & fry.keyboard.META_KEY)); + was_clipboard_cut = (120 == code) && (fry.keyboard.META_KEY == (mask & fry.keyboard.META_KEY)); + } + else + { + was_clipboard_copy = (1 == code || 99 == code) && (fry.keyboard.CTRL_KEY == (mask & fry.keyboard.CTRL_KEY)); + was_clipboard_cut = (24 == code || 120 == code) && (fry.keyboard.CTRL_KEY == (mask & fry.keyboard.CTRL_KEY)); + } + if (was_clipboard_copy || was_clipboard_cut) + { + fry.keyboard.prepareClipboard(); + fry.keyboard.clipboard.copiedContent = ''; + var was_custom_content = false; + if (fry.keyboard.listener) + { + var content = fry.keyboard.listener(0, fry.keyboard.CONTROL_CODE | fry.keyboard.SIG_CLIPBOARD_GET); + if ('string' == typeof content) + { + was_custom_content = true; + fry.keyboard.clipboard.copiedContent = content; + } + } + if (was_custom_content) + { + fry.keyboard.clipboard.node.value = fry.keyboard.clipboard.copiedContent; + fry.keyboard.clipboard.node.select(); + fry.keyboard.clipboard.node.focus(); + } + fry.keyboard.pushKey(0, fry.keyboard.CONTROL_CODE | (was_clipboard_cut ? fry.keyboard.CUT : fry.keyboard.COPY)); + fry.keyboard.clipboard.content = fry.keyboard.clipboard.copiedContent; + // returning false will enforce propagation + return !was_custom_content; + } + if (fry.keyboard.PASTE == (mask & fry.keyboard.PASTE)) + { + fry.keyboard.clipboard.pastedContent = code; + fry.keyboard.clipboard.content = fry.keyboard.clipboard.pastedContent; + code = 0; + } + // filtering out solo-keys Ctrl, Shift, Alt that are triggered by some browsers. + if ((17 == code && 5 == (mask & 5)) || (16 == code && 9 == (mask & 9)) || (18 == code && 3 == (mask & 3))) + { + return true; + } + // filtering out Command+V on FF.mac + if (118 == code && 16 == mask) + { + return true; + } + if (fry.keyboard.listener) + { + // console.info(code); + if (13 != code && 0 != (mask & (fry.keyboard.CONTROL_CODE + fry.keyboard.META_KEY + fry.keyboard.CTRL_KEY))) + { + // some keystroke occured that we really want to know about the listener result, we have to call it immediatelly + return fry.keyboard.listener(code, mask); + } + else + { + // let's ease the pain of the browser + setTimeout('fry.keyboard.listener('+code+','+mask+')', 10); + } + } + else + { + fry.keyboard.buffer.unshift([code, mask]); + } + return true; +} + +fry.keyboard.popKey = function() +{ + return fry.keyboard.buffer.pop(); +} + +fry.keyboard.getClipboardContent = function() +{ + return fry.keyboard.clipboard.content; +} + + +/*--------*/ +var client = {conf:{fry:{backendURL:''}}}; +var eamy = +{ + snippets:[], + instances:[] +}; + +/* + * ac.Chap - Text Editing Component - Core + */ + +if ( 'undefined' == typeof ac ) +{ + var ac = {chap:{}}; +} + +ac.chap = +{ + state: + { + active:null + }, + + TOKEN_MULTIROW_COMMENT:0, + TOKEN_SINGLEROW_COMMENT:1, + TOKEN_SINGLE_QUOTED:2, + TOKEN_DOUBLE_QUOTED:3, + TOKEN_NEWROW:4, + TOKEN_WHITESPACE:5, + + ROWSTATE_NONE:0, + ROWSTATE_FOLD_START:1, + ROWSTATE_FOLD_STOP:2, + ROWSTATE_FOLD_EXPAND:4, + ROWSTATE_FOLD_COLLAPSED:8, + ROWSTATE_SELECTION:16, + ROWSTATE_BOOKMARK:32, + + CHUNK_KEYWORD:4, + CHUNK_NUMBER:5, + CHUNK_OPERATOR:6, + CHUNK_PARENTHESIS:7, + CHUNK_KEYWORD_CUSTOM:8, + CHUNK_FUNCTION_NAME:9, + CHUNK_LIBRARY:10, + CHUNK_LIBRARY_CUSTOM:11, + + ACTION_CARET:1, + ACTION_SELECTION:2, + ACTION_INSERT:3, + ACTION_UPDATE:4, + ACTION_DELETE:5, + ACTION_CLIPBOARD:6, + ACTION_UNDO:7, + ACTION_REDO:8, + ACTION_CUSTOM:9, + + ACTION_RES_REDRAWCARET:1, + ACTION_RES_REDRAWTEXT:2, + ACTION_RES_SELECTIONCHANGED:4, + ACTION_RES_SCROLLTOCARET:8, + + CKEY_NONE:0, + CKEY_ALT:2, + CKEY_CTRL:4, + CKEY_SHIFT:8, + CKEY_META:16, + + TRANSLOG_TYPE_INSERT:1, + TRANSLOG_TYPE_REMOVE:2, + + ACTION_LISTENER_BEFORE:1, + ACTION_LISTENER_AFTER:2, + ACTION_LISTENER_BOTH:3 + +} + + + +ac.chap.activeComponent = null; +ac.chap.instanceId = 1; + +ac.chap.getActiveComponent = function() +{ + return ac.chap.activeComponent; +} + +ac.chap.setActiveComponent = function(component) +{ + fry.keyboard.initialize(); + if (null != ac.chap.activeComponent) + { + ac.chap.activeComponent.blur(); + } + ac.chap.activeComponent = component; + if (null != component) + { + if (ac.widget) + { + ac.widget.focus(component); + } + ac.chap.activeComponent.focus(); + } + else + { + if (!ac.widget) + { + fry.keyboard.stop(); + } + } +} + +ac.chap.route = function(type, windowId, viewIndex, pars) +{ + if ( null == ac.chap.activeComponent ) + { + return; + } + if ( 'undefined' == typeof ac.chap.activeComponent.views[viewIndex] ) + { + return; + } + switch ( type ) + { + case 'expand-folding': + { + ac.chap.activeComponent.expandFolding(pars); + } + } +} + +ac.chap.caretThread = setInterval(function() +{ + if (null != ac.chap.activeComponent) + { + ac.chap.activeComponent.showCaret(true, true); + } +}, 600); + +$(document.documentElement).e($__tune.isSafari2?'mousedown':'click', function(evt) +{ + var elem = evt.$.$; + while ( null != elem && document.documentElement != elem ) + { + if ( 'true' == elem.getAttribute('chap-view') ) + { + evt.stop(); + return; + } + elem = elem.parentNode; + } + ac.chap.setActiveComponent(null); +}); + + +ac.chap.keyboardListener = function(code, mask) +{ + if (null == ac.chap.activeComponent) + { + return; + } + return ac.chap.activeComponent.standaloneKeyboardListener(code, mask); +} +if ('undefined' == typeof ac['widget']) +{ + // chap is not a part of Fry MVC, must handle keyboardListener itself + fry.keyboard.addListener(ac.chap.keyboardListener); +} + +$class('ac.chap.Window', +{ + construct:function(options, userId) + { + this.instanceId = ac.chap.instanceId++; + this.ident = 'ac-chap-' + this.instanceId; + this.userId = userId | 0; + this.caret = null; + this.options = null; + this.state = null; + + this.views = []; + this.activeView = null; + this.viewLayoutNodes = []; + + this.char_map = []; + this.row_id_map = []; + this.syntax_map = []; + this.style_map = []; + + this.row_id_sequence = 1; + + this.language = null; + this.keymap = null; + this.snippets = []; + this.commands = []; + + this.selection = null; + this.transaction_log = []; + this.redo_log = []; + + this.setOptions(options||{}); + this.setState(); + }, + destruct:function() + { + $delete(this.state); + $delete(this.options); + $delete(this.char_map); + $delete(this.row_id_map); + $delete(this.syntax_map); + $delete(this.style_map); + this.hide(); + $delete(this.activeView); + } +}); + +ac.chap.Window.prototype.focus = function() +{ + this.showCaret(); +} + +ac.chap.Window.prototype.blur = function() +{ + this.hideCaret(); +} + +// compatibility layer with AC Fry Widget library +ac.chap.Window.prototype.onFocus = function() +{ + ac.chap.setActiveComponent(this); + this.focus(); +} + +ac.chap.Window.prototype.onBlur = function() +{ + ac.chap.setActiveComponent(null); + this.blur(); +} + +ac.chap.Window.prototype.onResize = function(width, height) +{ +} + +ac.chap.Window.prototype.onSystemClipboardCopy = function() +{ + return this.getSelection(); +} + +ac.chap.Window.prototype.onSystemClipboardCut = function() +{ + this.runAction(ac.chap.ACTION_CLIPBOARD, {cut:true}); + return this.processActionResult(true, true); +} + +ac.chap.Window.prototype.onSystemClipboardPaste = function(content) +{ + this.runAction(ac.chap.ACTION_CLIPBOARD, {paste:true, content:content}); + return this.processActionResult(true, true); +} + +ac.chap.Window.prototype.hasKeyboardListenerActive = function() +{ + return true; +} +ac.chap.Window.prototype.onCut = function(selection, callbackOk) +{ +} + +ac.chap.Window.prototype.onPaste = function(selection, wasCut) +{ +} + +ac.chap.Window.prototype.setOptions = function(options) +{ + this.options = + { + initialCaretPosition:[0,0], + tokenizerLazyLaunch:900, + syntaxHighlightingEnabled:true, + remoteBackendURL:'', + font:{ + size:11, + family: $__tune.isMac ? "Consolas, 'Bitstream Vera Sans mono', 'Courier', 'Monaco', monospaced" : "Consolas, 'Courier New', 'Courier', monospaced", + allowedSizes: [8, 9, 10, 11, 12, 13, 14, 17, 21, 24, 27, 30, 34, 38, 42] + } + }; + if ( $isset(options.initial_caret_position) ) + { + this.options.initialCaretPosition = [options.initial_caret_position[0], options.initial_caret_position[1]]; + } + if ( $isset(options.language) ) + { + this.language = $new(options.language); + } + else + { + this.language = $new(ac.chap.Language); + } + if ( $isset(options.keymap) ) + { + this.keymap = $new(options.keymap); + } + else + { + this.keymap = $new(ac.chap.KeyMap); + } + if ( $isset(options.syntaxHighlightingEnabled) ) + { + this.options.syntaxHighlightingEnabled = options.syntaxHighlightingEnabled; + } + if ( $isset(options.remoteBackendURL) ) + { + this.options.remoteBackendURL = options.remoteBackendURL; + } + else + { + if ( client && client.conf && client.conf.fry ) + { + this.options.remoteBackendURL = client.conf.fry.backendURL; + } + } + if ($isset(options.font)) + { + if ($isset(options.font['size'])) + { + this.options.font.size = options.font.size; + } + if ($isset(options.font['family'])) + { + this.options.font.family = options.font.family; + } + } +} + +ac.chap.Window.prototype.setState = function() +{ + this.state = + { + lastKeyTimePressed:0, + caretPhase:1, + lastKeyCode:0, + lastControlKey:0, + lastCaretPosition:[], + tokenizerTimer:null, + scheduledTokenizerTime:0, + transactionLogStopped:false, + actionListeners:[], + actionListenersStopped:false, + caretListener:null, + commandListener:null, + transactionListener:[null,800], + passThroughKeysListener:null + } + this.caret = + { + position:[this.options.initialCaretPosition[0], this.options.initialCaretPosition[1]], + mode:1 // 1 normal, 2 overwrite + } +} + +ac.chap.Window.prototype.addView = function(layoutNode, options, renderAfter) +{ + var view_index = this.views.length; + this.viewLayoutNodes.push(layoutNode); + this.views.push($new(ac.chap.View, this, view_index, options||{})); + this.row_id_map[view_index] = []; + if ( 0 < view_index ) + { +// console.log(view_index); + // creating duplicate + var n = this.row_id_map[0].length; + for ( var i=0; i= 0; i--) + { + if (font_size > font_sizes[i]) + { + font_size = font_sizes[i]; + break; + } + } + } + else + { + if (font_sizes[0] <= value && value <= font_sizes[font_sizes.length-1]) + { + font_size = value; + } + } + this.options.font.size = font_size; + redraw = true; + } + else if ('font.family' == key) + { + this.options.font.family = value; + redraw = true; + } + else if ('word.wrap' == key) + { + if (this.activeView) + { + this.hideCaret(); + this.activeView.options.wordWrap = value; + this.activeView.reloadOptions(); + this.showCaret(); + } + } + if (redraw) + { + this.hideCaret(); + var num_views = this.views.length; + for (var i=0; i caret_col ) + { + caret_col++; + } + else + { + if ( 'undefined' != typeof this.char_map[caret_row+1] ) + { + caret_row++; + caret_col = 0; + } + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'up' == direction ) + { + if ( 0 < caret_row ) + { + var move_end = this.char_map[caret_row].length == caret_col; + if ( move_end ) + { + caret_col = this.char_map[caret_row-1].length; + } + else + { + caret_col = Math.min(this.char_map[caret_row-1].length, caret_col); + } + this.setCaretPosition(caret_row-1, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + } + else if ( 'down' == direction ) + { + if ( 'undefined' != typeof this.char_map[caret_row+1] ) + { + var move_end = this.char_map[caret_row].length == caret_col; + if ( move_end ) + { + caret_col = this.char_map[caret_row+1].length; + } + else + { + caret_col = Math.min(this.char_map[caret_row+1].length, caret_col); + } + this.setCaretPosition(caret_row+1, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + } + else if ( 'prev_word' == direction ) + { + if ( 0 < caret_col ) + { + var ch = this.char_map[caret_row].charAt(caret_col-1); + var re = this.language.wordDelimiter; + var look_for_wch = re.test(ch); + while ( 0 != caret_col ) + { + ch = this.char_map[caret_row].charAt(caret_col-1); + if ( look_for_wch != re.test(ch) ) + { + break; + } + caret_col--; + } + } + else + { + if ( 0 < caret_row ) + { + caret_row--; + caret_col = this.char_map[caret_row].length; + } + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'next_word' == direction ) + { + if ( this.char_map[caret_row].length > caret_col ) + { + var ch = this.char_map[caret_row].charAt(caret_col); + var re = this.language.wordDelimiter; + var look_for_wch = re.test(ch); + while ( this.char_map[caret_row].length > caret_col ) + { + ch = this.char_map[caret_row].charAt(caret_col); + if ( look_for_wch != re.test(ch) ) + { + break; + } + caret_col++; + } + } + else + { + if ( 'undefined' != typeof this.char_map[caret_row+1] ) + { + caret_row++; + caret_col = 0; + } + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'prev_regexp' == direction ) + { + if ( 0 < caret_col ) + { + var row = this.char_map[caret_row].substring(0, caret_col); + var re = new RegExp(params['re'].replace('|', '\\')); + var matches = re.exec(row); + if (0 == matches.length) + { + console.warning('Invalid RE definition for `prev_regexp\' direction in ACTION_CARET.move action in keymap.'); + caret_col--; + } + else + { + caret_col -= matches[0].length + 1; + } + } + else + { + if ( 0 < caret_row ) + { + caret_row--; + caret_col = this.char_map[caret_row].length; + } + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'next_regexp' == direction ) + { + if ( this.char_map[caret_row].length > caret_col ) + { + var row = this.char_map[caret_row].substr(caret_col + 1); + var re = new RegExp(params['re'].replace('|', '\\')); + var matches = re.exec(row); + if (0 == matches.length) + { + console.warning('Invalid RE definition for `next_regexp\' direction in ACTION_CARET.move action in keymap.'); + caret_col++; + } + else + { + caret_col += matches[0].length + 1; + } + } + else + { + if ( 'undefined' != typeof this.char_map[caret_row+1] ) + { + caret_row++; + caret_col = 0; + } + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'row_start' == direction ) + { + if ( 0 < caret_col ) + { + caret_col = 0; + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + } + else if ( 'row_end' == direction ) + { + if ( this.char_map[caret_row].length > caret_col ) + { + caret_col = this.char_map[caret_row].length; + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + } + else if ( 'page_up' == direction ) + { + if (this.activeView) + { + var row = caret_row - this.activeView.numRows; + if (0 > row) + { + row = 0; + } + this.setCaretPosition(row, 0 != caret_col ? this.char_map[row].length : 0); + return ac.chap.ACTION_RES_REDRAWCARET; + } + return 0; + } + else if ( 'page_down' == direction ) + { + if (this.activeView) + { + var row = caret_row + this.activeView.numRows; + if (this.char_map.length <= row) + { + row = this.char_map.length-1; + } + this.setCaretPosition(row, 0 != caret_col ? this.char_map[row].length : 0); + return ac.chap.ACTION_RES_REDRAWCARET; + } + return 0; + } + else if ( 'doc_start' == direction ) + { + this.setCaretPosition(0,0); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'doc_end' == direction ) + { + var last_index = this.char_map.length-1 + this.setCaretPosition(last_index, this.char_map[last_index].length-1); + return ac.chap.ACTION_RES_REDRAWCARET; + } + } + else if ( $isset(params.moveBy) ) + { + var offset = params.moveBy; + if ( 'column' == offset ) + { + //move by params.value columns, newlines are counted as column, params.value may be negative indication caret moving to the left + if ( 0 < params.value ) + { + var range_source = (this.char_map[caret_row].substr(caret_col)+'\n'+this.char_map.slice(caret_row+1).join('\n')).substr(0, params.value); + range_source = range_source.split('\n'); + caret_row += range_source.length-1; + caret_col = range_source[range_source.length-1].length + (1==range_source.length ? caret_col : 0); + } + else + { + var range_source = (this.char_map.slice(0, caret_row).join('\n')+'\n'+this.char_map[caret_row].substr(0, caret_col)); + range_source = range_source.substr(range_source.length+params.value); + range_source = range_source.split('\n'); + caret_row -= (range_source.length-1); + caret_col = (1==range_source.length ? caret_col : this.char_map[caret_row].length) - range_source[0].length; + } + this.setCaretPosition(caret_row, caret_col); + return ac.chap.ACTION_RES_REDRAWCARET; + } + else if ( 'row' == offset ) + { + // move by params.value rows + } + else if ( 'page' == offset ) + { + // move by params.value pages + } + } + else if ( $isset(params.moveTo) ) + { + // move to params.moveTo[0], params.moveTo[1] + this.setCaretPosition(params.moveTo[0], params.moveTo[1]); + return ac.chap.ACTION_RES_REDRAWCARET; + } + };break; + case ac.chap.ACTION_SELECTION: + { + if ( $isset(params.remove) ) + { + var changed = this.removeSelection(); + return ac.chap.ACTION_RES_REDRAWCARET | (changed ? ac.chap.ACTION_RES_REDRAWTEXT : 0); + } + else if ( $isset(params.add) ) + { + this.addSelection([caret_row, caret_col], this.state.lastCaretPosition); + this.renderSelection(); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_SELECTIONCHANGED; + } + else if ( $isset(params.all) ) + { + $__tune.behavior.clearSelection(); + this.addAllSelection(); + this.renderSelection(); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_SELECTIONCHANGED; + } + };break; + case ac.chap.ACTION_INSERT: + { + var str = null; + if ( $isset(params.row) ) + { + var ins_content = '\n'; + caret_col = 0; + // if ( 0 < caret_row ) + // { + // // indenting by previous row + // var t = this.char_map[caret_row]; + // var n = t.length; + // var re = this.language.indentIgnoreMarker; + // while ( caret_col width ) + { + // will go before [row,column] + source = this.char_map.slice(0, row).join('\n')+'\n'+this.char_map[row].substr(0, column); + return source.substr(source.length+width); + } + else + { + // will go after [row,column] + source = this.char_map.slice(row).join('\n').substr(column); + return source.substr(0, width); + } +} + +ac.chap.Window.prototype.getWordAt = function(row, column, numWords) +{ + // if numWords <0 returns words before otherwise after position. if omitted, default value is -1 that is word before caret + // also, if more than one word is required, returns array of words as result + row = $getdef(row, this.caret.position[0]); + column = $getdef(column, this.caret.position[1]); + numWords = $getdef(numWords, -1); + var words = []; + var re = this.language.wordDelimiter; + var required_words = numWords; + var direction_after = 0 < numWords; + var next_word = true; + required_words = Math.abs(-numWords); + if ( !direction_after ) + { + column--; + if ( -1 == column ) + { + row--; + if ( -1 == row ) + { + return words; + } + column = this.char_map[row].length-1; + } + } + while (true) + { + var ch = this.char_map[row].charAt(column) + if ( re.test(ch) ) + { + if ( next_word ) + { + words.push(''); + next_word = false; + } + // word character found + if ( direction_after ) + { + words[words.length-1] += ch; + } + else + { + words[words.length-1] = ch + words[words.length-1]; + } + } + else + { + if ( required_words == words.length ) + { + break; + } + next_word = true; + } + + column += (direction_after ? 1 : -1); + if ( 0 > column ) + { + row--; + if ( -1 == row ) + { + break; + } + next_word = true; + column = this.char_map[row].length-1; + } + else if ( this.char_map[row].length <= column ) + { + row++; + if ( this.char_map.length == row ) + { + break; + } + next_word = true; + column = 0; + } + } + if ( 1 == required_words ) + { + return words[0] ? words[0] : false; + } + return words; +} + +ac.chap.Window.prototype.getLineAt = function(row) +{ + return this.char_map[row]; +} + +ac.chap.Window.prototype.getText = function() +{ + return this.char_map.join('\n'); +} + +ac.chap.Window.prototype.getNumRows = function() +{ + return this.char_map.length; +} + +ac.chap.Window.prototype.getSyntaxHighlightingSource = function() +{ + if (null != this.activeView) + { + return this.activeView.getSyntaxHighlightingSource(); + } + return 'ni'; +} + +ac.chap.Window.prototype.getCaretAbsolutePosition = function() +{ + if ( null != this.activeView ) + { + var pos = this.activeView.getRenderedCharPosition(this.caret.position[0], this.caret.position[1]); + if ( null != pos ) + { + var root_pos = this.activeView.nodeScrollArea.abspos(); + return [pos[0]+root_pos.x+this.activeView.options.colWidth, pos[1]+root_pos.y+this.activeView.options.rowHeight]; + } + } + return null; +} + +ac.chap.Window.prototype.stopTransactionLog = function() +{ + this.state.transactionLogStopped = true; +} + +ac.chap.Window.prototype.startTransactionLog = function() +{ + this.state.transactionLogStopped = false; +} + +ac.chap.Window.prototype.addAllSelection = function() +{ + var num_rows = this.char_map.length; + var num_views = this.views.length; + for ( var i=0; i offset_x - mid_char_w ) + { + col_index = i; + break; + } + else if ( w - mid_char_w < offset_x && (dim[0] % w + 2*mid_char_w >= offset_x)) + { + // last char + col_index = i+1; + break; + } + } + i++; + } +// console.log('%s, %s', row_index, col_index); + if ( i == num_chars ) + { + col_index = i; + } +// console.log('CHANGE CARET to: %s', col_index); + this.hideCaret(); + if ( evt.shiftKey ) + { + this.addSelection([row_index, col_index], this.state.lastCaretPosition); + this.renderText(); + } + else + { + this.setCaretPosition(row_index, col_index); + this.state.caretPhase = 1; + view.showCaret(); + this.state.lastCaretPosition = [this.caret.position[0], this.caret.position[1]]; + if ( this.removeSelection() ) + { + this.renderText(); + } + } + ac.chap.setActiveComponent(this); +} + +ac.chap.Window.prototype.foldingize = function() +{ + var startRowIndex = 0; + + var source_rows = this.char_map.slice(startRowIndex); + + // creating folding info + var n = source_rows.length; + var foldings = []; + var foldings_index = -1; + for ( var i=0; i ixs[i][1] ) + { + found_marker_index = i; + lowest = ixs[i][1]; + } + } + } + if ( -1 == found_marker_index ) + { + break; + } + var start_index = ixs[found_marker_index][1]; + var skipped_source = source.substr(0, start_index); + var num_skipped_rows = skipped_source.split('\n').length; + cursor.row += num_skipped_rows - 1; + cursor.col = (1 == num_skipped_rows ? col_offset : 0) + skipped_source.length - ('\n'+skipped_source).lastIndexOf('\n'); + + if ( 'undefined' == typeof syntax_map[cursor.row] ) + { + syntax_map[cursor.row] = []; + } + + var start_marker_len = ixs[found_marker_index][2].length; + var end_marker_len = ixs[found_marker_index][3].length; + source = source.substr(start_index+start_marker_len); + + var token_type = ixs[found_marker_index][0]; + + var end_index = source.indexOf(ixs[found_marker_index][3]); + var sub_source = source; + var end_index_offset = 0; + var except = false; + while ( 0 < end_index && '' != ixs[found_marker_index][4] && ixs[found_marker_index][4] == sub_source.charAt(end_index-end_marker_len) ) + { + except = true; + end_index_offset += end_index + end_marker_len; + sub_source = sub_source.substr(end_index+end_marker_len); + end_index = sub_source.indexOf(ixs[found_marker_index][3]); + } + if ( except && -1 != end_index ) + { + end_index += end_index_offset; + } + if ( -1 == end_index ) + { + syntax_map[cursor.row].push([token_type, cursor.col, -1, '']); + fillRowTokens(token_type, cursor.row+1, -1); + break; + } + else + { + var block_source = source.substr(0, end_index); + var num_block_rows = '\n' == ixs[found_marker_index][3] ? 1 : block_source.split('\n').length; + var cursor_col_end = block_source.length - ('\n'+block_source).lastIndexOf('\n'); + + syntax_map[cursor.row].push([token_type, cursor.col, 1 == num_block_rows ? (cursor.col+end_index+start_marker_len+end_marker_len) : -1, ixs[found_marker_index][2]]); + fillRowTokens(token_type, cursor.row+1, cursor.row+num_block_rows-1); + if ( 1 == num_block_rows ) + { + col_offset = cursor.col + end_index + start_marker_len + end_marker_len; + if ( '\n' == ixs[found_marker_index][3] ) + { + cursor.row++; + col_offset = 0; + } + } + else + { + if ( 'undefined' == typeof syntax_map[cursor.row+num_block_rows] ) + { + syntax_map[cursor.row+num_block_rows-1] = []; + } + syntax_map[cursor.row+num_block_rows-1].push([token_type, -1, cursor_col_end + end_marker_len, '']); +// var a = block_source.split('\n'); + col_offset = cursor_col_end + end_marker_len; + cursor.row += num_block_rows -1; + } +// console.log(num_block_rows); + source = source.substr(end_index+end_marker_len); + } + } + delete ixs; + delete source; + + var n = Math.max(syntax_map.length, this.syntax_map.length); + for ( i=0; i'; + } + } + return ht; + } + var nodes = this.nodeEditArea.childNodes; + var ht = ''; + for (var i=0; i') ) + { + str = str.replace(/>/g, '>'); + } + if ( -1 != str.indexOf('<') ) + { + str = str.replace( / 1 2 3 =  1 2 3 +function ch_encode_markup_spaces(str) +{ + var n = str.length - str.replace(/ /g, '').length; + for ( var i=0; i/g, '').length); + return arguments[1]+(is_inside?'~`~`~`~`':' '); + }); + } + return str.replace(/~`~`~`~`/g, ' '); +} + + +ac.chap.View.prototype.getRenderedCharDimension = function(rowIndex, colIndex) +{ + return [this.options.colWidth, this.options.rowHeight]; +} + +ac.chap.View.prototype.getRenderedStringDimension = function(rowIndex, colIndex, width) +{ + if ( 'undefined' != typeof this.window.char_map[rowIndex] ) + { + if ( colIndex < this.window.char_map[rowIndex].length ) + { + var str = this.window.char_map[rowIndex].substr(colIndex, width); + var ix = 0; + var tab = this.options.tabelator; + while ( -1 != ix ) + { + ix = str.indexOf('\t'); + if ( -1 != ix ) + { + str = str.substr(0,ix)+tab.substr(0, tab.length-(ix % tab.length))+str.substr(ix+1); + } + } +// console.log('(getrenderedstringdimension) = [%s], ix:%s w:%s %s', this.options.colWidth*str.length, colIndex, width, str); + return [this.options.colWidth*str.length, this.options.rowHeight]; + } + } + return [0,0]; +} + +ac.chap.View.prototype.getVirtualStringDimension = function(row, colIndex, width) +{ + if ( colIndex < row.length ) + { + var str = row.substr(colIndex, width); + var ix = 0; + var tab = this.options.tabelator; + while ( -1 != ix ) + { + ix = str.indexOf('\t'); + if ( -1 != ix ) + { + str = str.substr(0,ix)+tab.substr(0, tab.length-(ix % tab.length))+str.substr(ix+1); + } + } +// console.log('(getrenderedstringdimension) = [%s], ix:%s w:%s %s', this.options.colWidth*str.length, colIndex, width, str); + return [this.options.colWidth*str.length, this.options.rowHeight]; + } + return [0,0]; +} + +ac.chap.View.prototype.getRenderedCharPosition = function(rowIndex, colIndex) +{ + var node_row = this.getRowNode(rowIndex); + if ( null != node_row && null != node_row.parentNode ) + { + var offset_x = this.getRenderedStringDimension(rowIndex, 0, colIndex)[0]; + var offset_y = 0; + var dim = this.getRenderedCharDimension(rowIndex, colIndex); + offset_x -= dim[0]; + if ( this.options.wordWrap ) + { + if ( 0 < colIndex ) + { + var w = this.options.colWidth * (this.numCols); + offset_y = this.options.rowHeight * (Math.floor(offset_x/w)); + offset_x = (offset_x) % w; + } + } + return [offset_x, node_row.offsetTop+offset_y, node_row]; + } + return null; +} + +ac.chap.View.prototype.getRowNode = function(rowIndex) +{ + return document.getElementById('row-'+this.window.instanceId+'-'+this.index+'-'+rowIndex); +} + +ac.chap.View.prototype.getVirtualCharPosition = function(nodeRow, row, colIndex) +{ + var offset_x = this.getVirtualStringDimension(row, 0, colIndex)[0]; + var offset_y = 0; + var dim = this.getRenderedCharDimension(0, colIndex); + offset_x -= dim[0]; + if ( this.options.wordWrap ) + { + if ( 0 < colIndex ) + { + var w = this.options.colWidth * (this.numCols); + offset_y = this.options.rowHeight * (Math.floor(offset_x/w)); + offset_x = (offset_x) % w; + } + } + return [offset_x, nodeRow.offsetTop+offset_y]; +} + +ac.chap.View.prototype.showCaret = function(skipScroll) +{ + var caret_row = this.window.caret.position[0]; + var caret_col = this.window.caret.position[1]; + + pos = this.getRenderedCharPosition(caret_row, caret_col); + if ( null != pos ) + { + // caret is visible + var node_row = pos[2]; + var node = document.getElementById('ac-chap-caret-'+this.window.instanceId); + if ( null != node ) + { + node.parentNode.removeChild(node); + } + if ( 1 == this.window.state.caretPhase ) + { + // displaying caret + node = document.createElement('div'); + node.id = 'ac-chap-caret-'+this.window.instanceId; + node.style.position = 'absolute'; + node.style.font = '1px arial'; // IE + node.style.width = this.options.colWidth + 'px'; + node.style.height = this.options.rowHeight + 'px'; + pos[2] = this.options.colWidth; + pos[3] = this.options.rowHeight; + pos = this.theme.adjustCaretPosition(this.window.caret.mode, pos); + node.style.left = pos[0]+'px'; + node.style.top = pos[1]+'px'; + this.theme.renderCaret(this.window.caret.mode, node); + this.nodeCaret = node_row.appendChild(node); + node_row.style.background = this.theme.caretRowStyleActive; + + if ( !skipScroll ) + { + // might be out of borders, at least partially + if ( 0 > node_row.offsetTop - (this.nodeScrollArea.$.scrollTop % this.options.rowHeight) ) + { + // top margin overlay, first rendered row is partially hidden + this.scrollToRow(caret_row); + } + else if ( node_row.offsetTop > this.options.rowHeight*(this.numRows-1)-$__tune.ui.scrollbarWidth ) + { + // bottom margin overlay + this.scrollToRow(caret_row-Math.floor(this.numRows/2)); + } + } + this.nodeCaretRow = node_row; + } + if ('undefined' != typeof this.state.lastCaretRowIndex && this.state.lastCaretRowIndex != caret_row) + { + var last_node_row = this.getRowNode(this.state.lastCaretRowIndex); + if (last_node_row) + { + last_node_row.style.background = 'transparent'; + } + } + this.state.lastCaretRowIndex = caret_row; + } + else + { + if ( !skipScroll ) + { + // scrolling into view + this.scrollToRow(caret_row - Math.floor(this.numRows/2)); + } + } +} + +ac.chap.View.prototype.hideCaret = function(skipCaretRow) +{ + if ( null != this.nodeCaret && null != this.nodeCaret.parentNode ) + { + this.nodeCaret.parentNode.removeChild(this.nodeCaret); + this.nodeCaret = null; + } + if ( !skipCaretRow && null != this.nodeCaretRow ) + { +// console.log('off(hide) caret line background for %s', this.nodeCaretRow.id); + this.nodeCaretRow.style.background = 'transparent'; + } +// console.log('hide caret'); +} + +ac.chap.View.prototype.scrollToRow = function(rowIndex, setCaretToo, dontRefreshCaret) +{ + this.nodeScrollArea.$.scrollTop = this.options.rowHeight * rowIndex - Math.floor(this.nodeRoot.$.offsetHeight/3); + if (setCaretToo) + { + this.window.runAction(ac.chap.ACTION_CARET, {moveTo:[rowIndex, 0]}); + this.window.runAction(ac.chap.ACTION_CARET, {move:'row_end'}); + } + if (!dontRefreshCaret) + { + this.window.state.caretPhase = 1; + this.showCaret(true); + } +} + +ac.chap.View.prototype.expandFolding = function(rowIndex) +{ + if ( 'undefined' == typeof this.window.row_id_map[this.index][rowIndex] ) + { + return; + } + var row_state = this.window.row_id_map[this.index][rowIndex][2]; + if (0 == (ac.chap.ROWSTATE_FOLD_EXPAND & row_state)) + { + return; + } + var end_row_index = this.window.row_id_map[this.index][rowIndex][3][1]; + this.window.row_id_map[this.index][rowIndex][2] &= (65535 - ac.chap.ROWSTATE_FOLD_EXPAND); + this.window.row_id_map[this.index][rowIndex][1] = false; + for ( var i=rowIndex+1; i<=end_row_index; i++ ) + { + this.window.row_id_map[this.index][i][1] = false; + this.window.row_id_map[this.index][i][2] &= (65535 - ac.chap.ROWSTATE_FOLD_COLLAPSED); + } + this.recalculateVisibleRows(); + var me = this; + // console.log('expanding: %i, start: %i', rowIndex, end_row_index); + $runafter(40, function(){me.renderText(true)}); +} + +ac.chap.View.prototype.resize = function() +{ + var h = this.nodeRoot.p().h(); + this.nodeRoot.h(h); + $(this.nodeSidebar).h(h); + this.nodeScrollArea.h(h); + this.nodeFillArea.h(h-$__tune.ui.scrollbarWidth); + $(this.nodeSelectionArea).h(h-$__tune.ui.scrollbarWidth+this.options.rowHeight); + this.recalculateNumRows(); + this.recalculateVisibleRows(); + this.renderText(true); +} + +ac.chap.View.prototype.reloadOptions = function() +{ + this.calculateColRowDim(); + this.recalculateNumCols(false, true); + this.recalculateNumRows(); + this.recalculateVisibleRows(); + this.renderSidebarStub(); + this.renderText(true); +} + +ac.chap.View.prototype.recalculateNumCols = function(node, withoutScrollbar) +{ + node = node || this.nodeRoot; + var w = node.$.offsetWidth; + if (withoutScrollbar) + { + w -= $__tune.ui.scrollbarWidth+61; + } + this.numCols = Math.floor(w/this.options.colWidth); +} + +ac.chap.View.prototype.recalculateNumRows = function(node) +{ + node = node || this.nodeRoot; + this.numRows = Math.floor(node.$.offsetHeight/this.options.rowHeight); +} + +ac.chap.View.prototype.showInteractiveSearch = function() +{ + this.hideInteractiveSearch(); + var pos = this.nodeRoot.abspos(); + var node = $().a($$()).pos(true).x(pos.x+58).y(pos.y).z(2000).w(this.nodeRoot.w()-$__tune.ui.scrollbarWidth-61).h(24).o(0.8); + node.s('background:#000;border:1px solid #777;border-top:0;'); + var search_key_id = 'is_key_?'.embed(this.window.ident); + var ht = '
'; + node.t(ht); + var me = this; + var status_node = node.g('td:0'); + var search_key_node = node.g('input:0'); + var original_caret_pos = [me.window.caret.position[0], me.window.caret.position[1]]; + var last_keyword = ''; + var selection = me.window.getSelection(); + search_key_node.e('keydown', function(evt) + { + evt.stopPropagation(); + if (40 == evt.keyCode) + { + me.window.runAction(ac.chap.ACTION_CUSTOM, {action:'SearchKeyword', direction:'down'}); + me.scrollToRow(me.window.caret.position[0], false, true); + me.window.processActionResult(true, true); + evt.preventDefault(); + return true; + } + else if (38 == evt.keyCode) + { + me.window.runAction(ac.chap.ACTION_CUSTOM, {action:'SearchKeyword', direction:'up'}); + me.scrollToRow(me.window.caret.position[0], false, true); + me.window.processActionResult(true, true); + evt.preventDefault(); + return true; + } + else if (27 == evt.keyCode) + { + finish(true); + evt.preventDefault(); + return true; + } + else if (13 == evt.keyCode) + { + finish(); + evt.preventDefault(); + return true; + } + }).e('keyup', function(evt) + { + evt.stopPropagation(); + search(); + + }).$.focus(); + node.g('img:0').e('click', function(evt) + { + evt.stopPropagation(); + finish(true); + }); + + function finish(canceled) + { + if (canceled) + { + me.window.removeSelection(); + me.window.runAction(ac.chap.ACTION_CARET, {moveTo:[original_caret_pos[0], original_caret_pos[1]]}); + me.scrollToRow(me.window.caret.position[0], false, true); + me.window.processActionResult(true, true); + } + ac.chap.setActiveComponent(me.window); + me.hideInteractiveSearch(); + } + + function update_status(numFound) + { + status_node.t('Found ? results.'.embed(numFound)); + } + + function search() + { + var keyword = search_key_node.$.value.trim(); + if ('' == keyword || last_keyword == keyword) + { + if ('' == keyword) + { + update_status(0); + } + return; + } + update_status(me.window.getText().split(keyword).length - 1); + last_keyword = keyword; + me.window.removeSelection(); + me.window.runAction(ac.chap.ACTION_CARET, {moveTo:[original_caret_pos[0], original_caret_pos[1]]}); + me.window.runAction(ac.chap.ACTION_CUSTOM, {action:'SetSearchKeyword', keyword:keyword}); + me.window.runAction(ac.chap.ACTION_CUSTOM, {action:'SearchKeyword', direction:'down'}); + me.scrollToRow(me.window.caret.position[0], false, true); + me.window.processActionResult(true, true); + } + + if (null != selection) + { + search_key_node.$.value = selection; + search_key_node.$.select(); + search_key_node.$.focus(); + search(); + } + + + + this.interactiveSearchNode = node; +} + +ac.chap.View.prototype.hideInteractiveSearch = function() +{ + if (this.interactiveSearchNode && this.interactiveSearchNode.is()) + { + this.interactiveSearchNode.rs(); + } +} + +ac.chap.View.prototype.render = function(node) +{ + var w = node.$.offsetWidth; + var h = node.$.offsetHeight; + this.recalculateNumRows(node); + this.recalculateNumCols(node); + node.sa('chap-view', 'true'); + var me = this; + this.nodeRoot = node.a($$()).pos(true).w(w).h(h).n('acw-chap').s('background:?'.embed(this.theme.background)); + this.interactiveSearchNode = null; + + var w_rows = 58; + w -= w_rows; + this.nodeSidebar = this.nodeRoot.a($$()).pos(true).x(0).y(0).w(w_rows).h(h).s('overflow:hidden').n('sidebar'); + + // rendering sidebar stub + this.renderSidebarStub(); + + + this.nodeScrollArea = this.nodeRoot.a($$()).pos(true).x(w_rows).y(0).w(w).h(h).n('scroll-area').s('overflow:auto'); + this.nodeScrollArea.e('scroll', function(evt) + { + var offset = Math.floor(me.nodeScrollArea.$.scrollTop/me.options.rowHeight); + var map = me.window.row_id_map[me.index]; + var row_index = 0; + for ( var i=0; i' + ch_encode_markup(token[1]) + ''; + } + else + { + rend_chunk += ch_encode_markup(token[1]); + } + i += token[1].length - 1; + // offset = i + token[1].length; + offset = i + 1; + // console.log(token, offset, rend_chunk); + } + rend_chunk += ch_encode_markup(chunk.substr(offset)); + chunk = rend_chunk; + } + else + { + chunk = ch_encode_markup(chunk); + } + return chunk; +} + +ac.chap.View.prototype.renderTextRow = function(node, rowIndex, renderedPreviously) +{ + var row = this.window.char_map[rowIndex]; + var rendered_row = ''; + var offset = 0; + var font_style = ';font:' + this.window.options.font.size + 'px ' + this.window.options.font.family; + var interpolation = this.window.language.stringInterpolation; + + var row_state = this.window.row_id_map[this.index][rowIndex][2]; + + if ( 'undefined' != typeof this.window.syntax_map[rowIndex] && 0 < this.window.syntax_map[rowIndex].length ) + { + // console.log(this.window.syntax_map[rowIndex]); + var n = this.window.syntax_map[rowIndex].length; + for ( var i=0; i' + ch_encode_markup(chunk.substring(0, m.index)) + ''; + new_chunk += this.renderChunk(chunk.substr(m.index, m[interpolation[1]].length)); + chunk = chunk.substr(m.index + m[interpolation[1]].length); + // console.warn(chunk); + } + new_chunk += '' + ch_encode_markup(chunk) + ''; + // console.info(new_chunk); + rendered_row += new_chunk; + } + else + { + rendered_row += ''+ch_encode_markup(chunk)+''; + // console.log(rendered_row); + } + } + else + { + rendered_row += ch_encode_markup(chunk); + } + offset = -1 == end_offset ? row.length : end_offset; + } + } + rendered_row += this.renderChunk(row.substr(offset)); + // console.log(rendered_row); + // rendering custom selection (search results, errors and such) + // !!!!!!!!!! + // NOT USED NOW !!!!! + // !!!!!!!!!! + // !!!!!!!!!! + // !!!!!!!!!! + // !!!!!!!!!! + if ( false && ac.chap.ROWSTATE_SELECTION == (row_state & ac.chap.ROWSTATE_SELECTION) ) + { + var range = this.window.row_id_map[this.index][rowIndex][5]; + if ( 0 == range[0] && this.window.char_map[rowIndex].length == range[1] ) + { + rendered_row = ''+rendered_row+''; + } + else + { + // console.log(range); + var raw = rendered_row; + var n = raw.length; + var col_index = 0; + var selection_started = false; + var offset = 0; + // console.log('before: %s', raw); + for ( var i=0; i'); + i += ix; + // console.log('ix: %s', ix); + + if ( selection_started ) + { + var c = ''; + rendered_row = rendered_row.substr(0, i+offset+1)+c+rendered_row.substr(i+offset+1); + offset += c.length; + } + continue; + } + if ( range[0] == col_index ) + { + selection_started = true; + var c = ''; + rendered_row = rendered_row.substr(0, i+offset)+c+rendered_row.substr(i+offset); + offset += c.length; + } + if ( selection_started && range[1]-1 < col_index ) + { + selection_started = false; + var c = ''; + rendered_row = rendered_row.substr(0, i+offset)+c+rendered_row.substr(i+offset); + break; + } + if ( '&' == ch ) + { + if ( '<' == raw.substr(i, 4) || '>' == raw.substr(i, 4) ) + { + i += 3; + } + else if ( '&' == raw.substr(i, 5) ) + { + i += 4; + } + } + col_index++; + } + if ( selection_started ) + { + rendered_row += ''; + } + } + } +// console.log(rendered_row); + // making intelligent tabelators - note, using simple replace of \t doesn't work + var ix = 0; + var tab = this.options.tabelator; + var raw = this.window.char_map[rowIndex]; + var tab_stack = []; + while ( -1 != ix ) + { + ix = raw.indexOf('\t'); + if ( -1 != ix ) + { + var tab_length = tab.length - (ix % tab.length); + raw = raw.substr(0,ix)+tab.substr(0, tab_length)+raw.substr(ix+1); + tab_stack.push(tab_length); + } + } + for ( var i=0; i'); + if ( -1 == ix ) + { + break; + } + i += ix; + continue; + } + var n_ch = 0; + if ( '&' == ch ) + { + if ( '<' == rendered_row.substr(i,4) || '>' == rendered_row.substr(i,4) ) + { + n_ch = 3; + } + else if ( '&' == rendered_row.substr(i,5) ) + { + n_ch = 4; + } + } + printable += ch.charAt(0); + if ( this.numCols == printable.length ) + { + raw = raw.substr(0, i+offset+n_ch)+'
'+raw.substr(i+offset+n_ch); + num_subrows++; + offset += 4; + printable = ''; + } + i += n_ch; + } + rendered_row = raw; + } + if ( ac.chap.ROWSTATE_FOLD_EXPAND == (row_state & ac.chap.ROWSTATE_FOLD_EXPAND) ) + { + var end_index = this.window.row_id_map[this.index][rowIndex][3][1]; + var content = ch_encode_markup(this.window.char_map.slice(rowIndex, end_index+1).join('\n').replace(/"/ig, "''")); + rendered_row += '
'.embed(content); + } + node.setAttribute('num-subrows', num_subrows); + + if ( $__tune.isIE ) + { + // IE trims input source in innerHTML + rendered_row = ch_encode_markup_spaces(rendered_row); + } + node.innerHTML = rendered_row; +} + +ac.chap.View.prototype.recalculateVisibleRows = function() +{ + var map = this.window.row_id_map[this.index]; + var n = map.length; + var i = 0; + var num_visibles = 0; + while ( i < n ) + { + var state = map[i][2]; + if ( 0 == (ac.chap.ROWSTATE_FOLD_COLLAPSED & state) ) + { + num_visibles++; + } + i++; + } + this.numVisibleRows = num_visibles; +} + +ac.chap.View.prototype.getVisibleRowIndices = function() +{ + var map = this.window.row_id_map[this.index]; + var i = 0; + var index = this.startRow; + var indices = []; + while ( i++ <= this.numRows ) + { + if ( 'undefined' == typeof this.window.row_id_map[this.index][index] ) + { + break; + } + var state = this.window.row_id_map[this.index][index][2]; + if ( ac.chap.ROWSTATE_FOLD_COLLAPSED == (ac.chap.ROWSTATE_FOLD_COLLAPSED & state) ) + { + // collapsed + i--; + index++; + continue; + } + indices.push(index); + if ( ac.chap.ROWSTATE_FOLD_EXPAND == (state & ac.chap.ROWSTATE_FOLD_EXPAND) ) + { + // collapsed folding + var refered_row_index = this.window.row_id_map[this.index][index][3][1]; + index = refered_row_index + 1; + } + else + { + index++; + } + } + return indices; +} + +ac.chap.View.prototype.renderRowSidebar = function(position, rowIndex, rowNode, forceCompleteRedraw) +{ + if (!this.nodeSidebar.firstChild.childNodes.item(position)) + { + return; + } + var bar_node = this.nodeSidebar.firstChild.childNodes.item(position).firstChild; + if ( 0 == rowNode.offsetHeight ) + { + rowNode.style.height = this.options.rowHeight; + } + var num_subrows = parseInt(rowNode.getAttribute('num-subrows')); + var cache_id = forceCompleteRedraw ? 'none' : (num_subrows+':'+this.window.row_id_map[this.index][rowIndex].join('-')); + if (bar_node.getAttribute('sidebar-cache-id') == cache_id && 'none' != cache_id) + { + return; + } + if ('none' != cache_id) + { + bar_node.setAttribute('sidebar-cache-id', cache_id); + bar_node.firstChild.style.fontSize = (this.window.options.font.size-2) + 'px'; + } + // console.log(cache_id); + + var row_height = num_subrows * this.options.rowHeight; + bar_node.parentNode.style.height = row_height + 'px'; + if (forceCompleteRedraw) + { + bar_node.firstChild.style.fontSize = (this.window.options.font.size-2) + 'px'; + } + var ht = rowIndex+1; + if ( this.options.wordWrap ) + { + var htt = '
'; + for ( var i=1; i this.numCols ) + { + ix_r++; + ix_c -= this.numCols; + } + if ( ii == range[1] ) + { + offset[2] = ix_r; + offset[3] = ix_c; + break; + } + } + if ( -1 == offset[3] ) + { + offset[2] = ix_r+1;//offset[0]+1; + } + node_row_selection.style.top = (node_row.offsetTop + this.options.rowHeight*offset[0]) + 'px'; +// console.log('%o', offset); + if ( offset[0] == offset[2] ) + { + // selection stays non-wrapped + node_row_selection.style.left = offset[1]*this.options.colWidth + 'px'; + node_row_selection.style.width = ((offset[3]-offset[1])*this.options.colWidth) + 'px'; +// console.log(node_row_selection.style.width); + } + else + { + // finishing current node + if ( -1 == offset[1] ) + { + // caret stays on the end of the row + node_row_selection.style.left = (ix_c*this.options.colWidth) + 'px'; + node_row_selection.style.width = (node_row.offsetWidth - (ix_c*this.options.colWidth)) + 'px'; + } + else + { + node_row_selection.style.left = (offset[1]*this.options.colWidth) + 'px'; + node_row_selection.style.width = (node_row.offsetWidth - (offset[1]*this.options.colWidth)) + 'px'; + } + // marking as non-cacheable + node_row_selection.removeAttribute('cachid'); + // creating additional ones + for ( ii=offset[0]+1; ii<=offset[2]; ii++ ) + { + node_row_selection = node_cache.appendChild(document.createElement('div')); + node_row_selection.style.background = this.theme.selectionStyle; + node_row_selection.style.position = 'absolute'; + node_row_selection.style.left = '0px'; + node_row_selection.style.top = (node_row.offsetTop+ii*this.options.rowHeight) + 'px'; + node_row_selection.style.height = this.options.rowHeight + 'px'; + if ( ii != offset[2] ) + { + node_row_selection.style.width = node_row.offsetWidth + 'px'; + } + else + { + node_row_selection.style.width = ((offset[3])*this.options.colWidth) + 'px'; + } + } + } + + } + else + { + var offset_x1 = this.getRenderedStringDimension(row_index, 0, range[0])[0]; + var offset_x2 = this.getRenderedStringDimension(row_index, 0, range[1]+1)[0]; + node_row_selection.style.left = offset_x1 + 'px'; + node_row_selection.style.width = (offset_x2 - offset_x1) + 'px'; + } + } + } + // console.log('selection after range: %o', this.window.row_id_map[this.index][row_index][3]); + + } + } + // console.log('%o', this.window.row_id_map[this.index][0]); + var ht = node_cache.innerHTML; + this.nodeSelectionArea.innerHTML = ht; +} + +ac.chap.View.prototype.renderText = function(forceCompleteRedraw) +{ + var row_indices = this.getVisibleRowIndices(); + var num_rows = row_indices.length; +// console.log('view: %s - row indices: %o', this.index, row_indices); + +// console.log('view: %s - num rows x cols [%s x %s]', this.index, this.numRows, this.numCols); + // checking to see if only one row changed - the most usual case + var changed_row_index = -1; + var changed_row_position = -1; + for ( var i=0; i fill_area_h ) + { + fill_area_h = this.nodeRoot.h()-$__tune.ui.scrollbarWidth; + } + this.nodeFillArea.h(fill_area_h); + + } + else + { + this.nodeEditAreaCache.innerHTML = ''; + } + if ( parseInt(this.nodeSidebar.firstChild.style.top) != top_offset ) + { + this.nodeSidebar.firstChild.style.top = (top_offset)+'px'; + this.nodeSidebar.firstChild.style.height = (this.nodeSidebar.offsetHeight - $__tune.ui.scrollbarWidth - top_offset)+'px'; + } + this.renderSelection(); +} + + + +/* + * ac.Chap - Text Editing Component widget - Settings file + */ + +if ( 'undefined' == typeof ac ) +{ + var ac = {chap:{}}; +} + + +$class('ac.chap.KeyMap', +{ + construct:function() + { + this.definition = {}; + this.isMac = true; + this.wordCompleteCache = null; + this.snippetCompleteCache = null; + this.searchKeyword = ''; + this.initDefinition(); + } +}); + +ac.chap.KeyMap.prototype.initDefinition = function() +{ +} + +ac.chap.KeyMap.prototype.importCommands = function(commands) +{ + var n = commands.length; + for ( var i=0; i looking_for_len && words_prev[i+1].substr(0, looking_for_len) == looking_for ) + { + if ( -1 == found_words_index.indexOf(' '+words_prev[i+1]) ) + { + found_words.push(words_prev[i+1]); + found_words_index += ' '+words_prev[i+1]; + } + } + if ( words_next[i] && words_next[i].length > looking_for_len && words_next[i].substr(0, looking_for_len) == looking_for ) + { + if ( -1 == found_words_index.indexOf(' '+words_next[i]) ) + { + found_words.push(words_next[i]); + found_words_index += ' '+words_next[i]; + } + } + } + if ( 1 < found_words.length ) + { +// console.log('results found: %o', found_words); + wcc.results = found_words; + wcc.index = 0; + proceed_complete = true; + } + } + else + { + proceed_complete = true; + } + var num_results = wcc.results.length; + if ( proceed_complete && 0 < num_results ) + { + var index = wcc.index; + index += params.direction ? 1 : -1; + if ( num_results <= index ) + { + index = 0; + } + else if ( 0 > index ) + { + index = num_results-1; + } +// console.log('n:%s i:%s', num_results, index); + // let's not add the following operation to the transaction/undo log + component.stopTransactionLog(); + component.runAction(ac.chap.ACTION_CARET, {move:'prev_word'}); + component.runAction(ac.chap.ACTION_SELECTION, {add:true}); + component.runAction(ac.chap.ACTION_DELETE, {character:false}); + component.runAction(ac.chap.ACTION_INSERT, {string:wcc.results[index]}); + component.startTransactionLog(); + wcc.index = index; + wcc.position = [component.caret.position[0], component.caret.position[1]]; + } + else + { + wcc.results = []; + } + this.wordCompleteCache = wcc; + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT; +} + +ac.chap.KeyMap.prototype.getAffectedRows = function(component, caretRow) +{ + var from_row = caretRow; + var to_row = caretRow; + if (null != component.selection) + { + var start_pos = component.selection.startPosition[0]; + var end_pos = component.selection.endPosition[0]; + if (-1 == component.selection.endPosition[1]) + { + end_pos--; + } + from_row = Math.min(start_pos, end_pos); + to_row = Math.max(start_pos, end_pos); + } + return [from_row, to_row]; +} + +ac.chap.KeyMap.prototype.action_Indent = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + var affected_rows = this.getAffectedRows(component, caretRow); + var tab = component.getTabelator(); + for (var i=affected_rows[0]; i<=affected_rows[1]; i++) + { + if ('right' == params.direction) + { + component.insertIntoCharacterMap(tab, i, 0); + } + else + { + var row = component.char_map[i]; + var index = 0; + while (('\t' == row.charAt(index) || ' ' == row.charAt(index)) && (row.length > index) && (tab.length > index)) index++; + if (0 < index) + { + component.removeFromCharacterMap(i, 0, i, index); + } + } + } + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT | ac.chap.ACTION_RES_SELECTIONCHANGED; +} + +ac.chap.KeyMap.prototype.action_Comment = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + if (!component.language) + { + return 0; + } + var markers = component.language.singleRowCommentStartMarkers; + if (0 == markers.length) + { + return 0; + } + var marker = markers[0]; + var tab = component.getTabelator(); + var affected_rows = this.getAffectedRows(component, caretRow); + var tab = component.getTabelator(); + var prepend_text = marker + ' '; + for (var i=affected_rows[0]; i<=affected_rows[1]; i++) + { + var row = component.char_map[i]; + var index = row.indexOf(marker); + if (-1 != index && 0 == row.substring(0, index).replace(tab, '').replace(' ', '')) + { + // was commented + component.removeFromCharacterMap(i, 0, i, index+marker.length); + } + else + { + // will be commented + component.insertIntoCharacterMap(marker, i, 0); + } + } + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT | ac.chap.ACTION_RES_SELECTIONCHANGED; +} + +ac.chap.KeyMap.prototype.action_RuntimeOption = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + component.setRuntimeOption(params['key'], params['value']); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT | ac.chap.ACTION_RES_SELECTIONCHANGED; +} + +ac.chap.KeyMap.prototype.action_SearchInteractive = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + component.showInteractiveSearch(); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_SELECTIONCHANGED; +} + +ac.chap.KeyMap.prototype.action_SetSearchKeyword = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + if (params['keyword']) + { + this.searchKeyword = params['keyword']; + return 0; + } + if (component.selection && component.selection.startPosition[0] == component.selection.endPosition[0]) + { + this.searchKeyword = component.getSelection(); + return ac.chap.ACTION_RES_SELECTIONCHANGED; + } + return 0; +} + +ac.chap.KeyMap.prototype.action_SearchKeyword = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + if ('' == this.searchKeyword) + { + return 0; + } + row_index = caretRow; + var index = 0; + var search_down = 'down' == params['direction']; + do + { + var row = component.char_map[row_index]; + var offset = 0; + console.log(ac.chap.activeComponent.activeView); + if (row_index == caretRow) + { + if (search_down) + { + // if (row.substring(caretCol, this.searchKeyword.length) == this.searchKeyword) + // { + // // offset = this.searchKeyword.length; + // } + row = row.substr(caretCol) + offset += caretCol; + } + else + { + if (row.substring(caretCol-this.searchKeyword.length, caretCol)) + { + offset = this.searchKeyword.length; + } + row = row.substring(0, caretCol - offset); + offset = 0; + } + } + index = search_down ? row.indexOf(this.searchKeyword) : row.lastIndexOf(this.searchKeyword); + if (-1 != index) + { + index += offset; + component.runAction(ac.chap.ACTION_SELECTION, {remove:true}); + component.runAction(ac.chap.ACTION_CARET, {moveTo:[row_index, index]}); + component.runAction(ac.chap.ACTION_CARET, {store:true}); + component.runAction(ac.chap.ACTION_CARET, {moveTo:[row_index, index+this.searchKeyword.length]}); + component.runAction(ac.chap.ACTION_SELECTION, {add:true}); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_SELECTIONCHANGED | ac.chap.ACTION_RES_SCROLLTOCARET; + } + row_index += search_down ? 1 : -1; + if (search_down && row_index == component.char_map.length) + { + row_index = 0; + } + else if (!search_down && -1 == row_index) + { + row_index = component.char_map.length-1; + } + } + while (caretRow != row_index); + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_SELECTIONCHANGED; +} + +ac.chap.KeyMap.prototype.action_SmartIndent = function(keyCode, controlKeysMask, caretRow, caretCol, component, params) +{ + // console.log(params); + var line = component.getLineAt(caretRow); + var m = params['indent_tab_when_ends'] ? line.match(/^([ \t]*)(.*)$/) : line.match(/^([ \t]*)([^ \t]*)/); + // console.log(m); + var prepend_text = m[1]; + if (params['indent_tab_when_ends'] || params['indent_tab_when_starts']) + { + m[2] = m[2].trim(); + var indent_when_values = params['indent_tab_when_ends'] ? params['indent_tab_when_ends'].split(' ') : params['indent_tab_when_starts'].split(' '); + for (var i=0; i#'); + code = code.substr(start_ix+4, m[3].length)+'##'+code.substr(start_ix+m[0].length-m[1].length); + any_change = true; + } + else + { + break; + } + } + code_chunks.push(code); + code = code_chunks.join(''); + } + re = /##/; + while ( true ) + { + m = re.exec(code) + if ( null == m ) + { + break; + } + tabstops[m[1]][1] = tabstops[m[1]][1].replace(/##/g, ''); + tabstops[m[1]][2] = m.index; + tabstops[m[1]][3] = tabstops[m[1]][1].length; + code = code.substr(0, m.index)+code.substr(m.index+m[0].length).replace('##', ''); + } + + // [getting mirrors] + re = /\{\$\{(\d)\:([^\}]*)\}\}/; + while ( true ) + { + m = re.exec(code) + if ( null == m ) + { + break; + } + code = code.substr(0, m.index)+m[2]+code.substr(m.index+m[0].length); + var ix_end = code.indexOf('{$'+m[1]+'}'); + if ( -1 == ix_end ) + { + console.error('Invalid snippet definition. Mirror `?` does not have `{$?}` mirrored location specified.'.embed(m[1], m[1])); + break; + } + tabstops[m[1]] = ['mi', m[2], m.index, m[2].length, ix_end]; + if ( m.index > ix_end ) + { + console.error('Unsupported feature. Mirror `?` should have mirrored location positioned AFTER itself.'.embed(m[1])); + } + code = code.substr(0, ix_end)+code.substr(ix_end+4); + } + + // [getting tabstops] + re = /(^|[^\\])\$(\d)/; + while (true) + { + m = re.exec(code); + if ( null == m ) + { + break; + } + tab_id = m[2]; + if ( tabstops[tab_id] ) + { + console.error('Invalid snippet definition. Tabstop `?` already defined as placeholder at position `?`. Snippet source: `?`.'.embed(tab_id, m.index, code)); + break; + } + var start_ix = m.index+m[1].length; + tabstops[tab_id] = ['ts', '', start_ix, 0]; + code = code.substr(0, start_ix)+code.substr(start_ix+2); + var offset = m[1].length + 2; + for ( var tab_id in tabstops ) + { + // console.log('adjusting: %s, %s < %s', tab_id, start_ix, tabstops[tab_id][2]); + if ( 'mi' == tabstops[tab_id][0] ) + { + if ( start_ix < tabstops[tab_id][2] ) + { + tabstops[tab_id][2] -= offset; + } + if ( start_ix < tabstops[tab_id][4] ) + { + tabstops[tab_id][4] -= offset; + } + } + else if ( 'ph' == tabstops[tab_id][0] && start_ix < tabstops[tab_id][2] ) + { + tabstops[tab_id][2] -= offset; + } + } + } + // $0 not defined, will be at the end of the snippet by default + if ( !tabstops[0] ) + { + tabstops[0] = ['ts', '', code.length, 0]; + } + + // [postprocessing - unescape] + code = code.replace(/\0/g, '$'); + + + for ( var tab_id in tabstops ) + { + var placeholder = tabstops[tab_id]; +// console.log('#%s : %o', tab_id, placeholder); + } + var scc = + { + firstInitialized:true, + insertCaretPosition:[caretRow, caretCol], + tabstops: tabstops, + callbackIndex: -1, + activeTabStopIndex:tabstops[1] ? 1 : 0, + activeTabStopRange:[], + activeTabStopContent:'', + activeTabStopNested:[], + wasSelection:wasSelection, + tabActivation:tabActivation + } + + if ( !scc.wasSelection ) + { + component.runAction(ac.chap.ACTION_CARET, {move:'prev_word'}); + component.runAction(ac.chap.ACTION_SELECTION, {add:true}); + component.runAction(ac.chap.ACTION_DELETE, {character:true}); + } + + var tabstop = tabstops[scc.activeTabStopIndex]; + + + component.runAction(ac.chap.ACTION_INSERT, {string:code.substr(0, tabstop[2])}); + component.runAction(ac.chap.ACTION_INSERT, {string:code.substr(tabstop[2]), skipCaretChange:true}); + + // selecting default value + var selection_changed = false; + if ( '' != tabstop[1] ) + { + component.runAction(ac.chap.ACTION_CARET, {store:true}); + component.runAction(ac.chap.ACTION_CARET, {moveBy:'column', value:tabstop[1].length}); + component.runAction(ac.chap.ACTION_SELECTION, {add:true}); + selection_changed = true; + } + + if ( 0 != scc.activeTabStopIndex ) + { + // starting action listener + this.snippetCompleteCache = scc; + this.snippetCompleteCache.callbackIndex = component.addActionListener(ac.chap.ACTION_LISTENER_BOTH, this, this.snippetCompleteActionListener); + } + } + return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT | (selection_changed ? ac.chap.ACTION_RES_SELECTIONCHANGED : 0); +// return ac.chap.ACTION_RES_REDRAWCARET | ac.chap.ACTION_RES_REDRAWTEXT; +} + +ac.chap.KeyMap.prototype.snippetCompleteActionListener = function(component, action, type, actionResult, actionType, params, caretRow, caretCol) +{ + var scc = action.snippetCompleteCache; + + if ( ac.chap.ACTION_LISTENER_BEFORE == type && !scc.firstInitialized ) + { + // before action listener + // check if we are still in the tabstop range +// var offset = component.char_map[caretRow].substr() + // console.log('activeTabStopRange: %o', scc.activeTabStopRange); + if ( caretRow < scc.activeTabStopRange[0] || caretRow > scc.activeTabStopRange[2] || caretCol < scc.activeTabStopRange[1] || caretCol > scc.activeTabStopRange[3] ) + { + // out of range, canceling whole snippet logic + component.removeActionListener(scc.callbackIndex); + component.removeSelection(); + delete action.snippetCompleteCache; + // console.log('CANCELED'); + return; + } +// console.log('before: %s - [%s,%s]', actionType, caretRow, caretCol); + } + else + { + // after action listener + if ( scc.firstInitialized ) + { + scc.firstInitialized = false; + var tabstop = scc.tabstops[scc.activeTabStopIndex]; + caretCol -= tabstop[1].length; + var code_rows = tabstop[1].split('\n'); + var num_code_rows = code_rows.length; + var to_caret_row = caretRow + num_code_rows - 1; + var to_caret_col = (to_caret_row == caretRow ? caretCol : 0) + code_rows[num_code_rows-1].length; + scc.activeTabStopRange = [caretRow, caretCol, to_caret_row, to_caret_col]; + scc.stopMarker = component.char_map[to_caret_row].substr(to_caret_col); + // creating list of nested tabstops + for ( var i in scc.tabstops ) + { + if ( i == scc.activeTabStopIndex ) + { + continue; + } + var c_tabstop = scc.tabstops[i]; + if ( c_tabstop[2] >= tabstop[2] && (c_tabstop[2] + c_tabstop[3] <= tabstop[2] + tabstop[3]) ) + { + scc.activeTabStopNested[i] = true; + } + } + if ( 'mi' != tabstop[0] ) + { + scc.activeTabStopContent = tabstop[1]; + } + scc.firstRealRun = false; + +// action.snippetCompletePostInit(component, caretRow, caretCol); + // console.log('firstRealRun: %o', scc.activeTabStopRange); + } + else + { + // console.log('next: %o', scc.activeTabStopRange); + // adjust the range by finding the stop marker + var n = component.char_map.length; + var i = scc.activeTabStopRange[0]; + var found = false; + var max_iter = 50; +// var offset_range = [scc.activeTabStopRange[2], scc.activeTabStopRange[3]]; + var new_content = ''; + var old_content = scc.activeTabStopContent; + while ( i active_offset ) + { + if ( scc.activeTabStopNested[i] ) + { + // nested + delete scc.tabstops[i]; + } + else + { + tabstop[2] += offset; + // console.log('ADJUSTING: #%s by %s, new: %s', i, offset, tabstop[2]); + } + } + } + } + } + // console.log('after %s(%s, %s) : %o', actionType, caretRow, caretCol, scc.activeTabStopRange); + } +} + + +ac.chap.KeyMap.prototype.compile = function(source) +{ + /* example: + + KEY: -13+shift + selection(add:true) + caret(move:'up') + + KEY: -27 + caret(move:'row_end') + + ... + .. + . + */ + var rows = source.split('\n'); + var n = rows.length; + var re_definition = /^KEY\:\s*[-\d]*[\+\w\s]*$/; + var re_chain = /^[^\(]*\(.*\)\s*$/; + var src = ''; + var chain = []; + var last_key_code = null; + for ( var i=0; i)/i, 0, ac.chap.CHUNK_OPERATOR], + [/(\(|\)|\[|\]|\{|\})/i, 0, ac.chap.CHUNK_PARENTHESIS] + ]; + this.wordDelimiter = /[\w\.\d]/; + this.indentIgnoreMarker = /[\.]/; +} + + +ac.chap.lang = {}; + + + + + + +/* loader stuff - you are free to modify as needed */ + + +// !! Make sure, bundle_*.js is loaded prior launching this function - the bundle defines ac.chap.langEAmy, EAmyJavaScript etc. +function showEditor(templateNode) +{ + var source = templateNode.value; + templateNode = $(templateNode); + var w = templateNode.w(); + var h = templateNode.h(); + + var node = templateNode.p().ib($$(), templateNode).w(w).h(h); + templateNode.d(false); + + var language = ac.chap.lang.JavaScript; + var keymap = ac.chap.keymap.EAmyJavaScript; + + var instance = $new(ac.chap.Window, {language:ac.chap.lang.EAmy, keymap:ac.chap.Keymap}); + instance.addView(node, {theme:ac.chap.theme.EAmy, rowHeight:11, colWidth:7, wordWrap:true, tabelator:' '}); + + instance.show(); + instance.setSnippets(eamy.snippets); + instance.keymap.importSnippets(eamy.snippets); + instance.edit(source); + eamy.instances.push(instance); + +} + +// !! Remove from here and include in your section if you want. +// document.write(''); + + +// Performed upon loading the page. You are free to remove it and call the showEditor() (or modified version of it) in order to launch the editing component. Code of the showEditor should give you enough clue. +$__tune.event.addListener(self, 'load', function(evt) +{ + // this is basically a search for any
"; + html= t.translate(html, editAreas[id]["settings"]["language"]); + span.innerHTML= html; + father= d.getElementById(id).parentNode; + next= d.getElementById(id).nextSibling; + if(next==null) + father.appendChild(span); + else + father.insertBefore(span, next); + } + + if(!editAreas[id]["initialized"]) + { + t.execCommand(id, "EA_init"); // ini callback + if(editAreas[id]["settings"]["display"]=="later"){ + editAreas[id]["initialized"]= true; + return; + } + } + + if(t.isIE){ // launch IE selection checkup + t.init_ie_textarea(id); + } + + // get toolbar content + var area=editAreas[id]; + + for(i=0; i'; + } + + // add plugins scripts if not already loaded by the compressor (but need to load language in all the case) + for(i=0; i'; + t.iframe_script+=''; + } + + + // create css link for the iframe if the whole css text has not been already loaded by the compressor + if(!t.iframe_css){ + t.iframe_css=""; + } + + + // create template + template= t.template.replace(/\[__BASEURL__\]/g, t.baseURL); + template= template.replace("[__TOOLBAR__]",html_toolbar_content); + + + // fill template with good language sentences + template= t.translate(template, area["settings"]["language"], "template"); + + // add css_code + template= template.replace("[__CSSRULES__]", t.iframe_css); + // add js_code + template= template.replace("[__JSCODE__]", t.iframe_script); + + // add version_code + template= template.replace("[__EA_VERSION__]", t.version); + //template=template.replace(/\{\$([^\}]+)\}/gm, this.traduc_template); + + //editAreas[area["settings"]["id"]]["template"]= template; + + area.textarea=d.getElementById(area["settings"]["id"]); + editAreas[area["settings"]["id"]]["textarea"]=area.textarea; + + // if removing previous instances from DOM before (fix from Marcin) + if(typeof(window.frames["frame_"+area["settings"]["id"]])!='undefined') + delete window.frames["frame_"+area["settings"]["id"]]; + + // insert template in the document after the textarea + father= area.textarea.parentNode; + /* var container= document.createElement("div"); + container.id= "EditArea_frame_container_"+area["settings"]["id"]; + */ + content= d.createElement("iframe"); + content.name= "frame_"+area["settings"]["id"]; + content.id= "frame_"+area["settings"]["id"]; + content.style.borderWidth= "0px"; + setAttribute(content, "frameBorder", "0"); // IE + content.style.overflow="hidden"; + content.style.display="none"; + + + next= area.textarea.nextSibling; + if(next==null) + father.appendChild(content); + else + father.insertBefore(content, next) ; + f=window.frames["frame_"+area["settings"]["id"]]; + f.document.open(); + f.editAreas=editAreas; + f.area_id= area["settings"]["id"]; + f.document.area_id= area["settings"]["id"]; + f.document.write(template); + f.document.close(); + + // frame.editAreaLoader=this; + //editAreas[area["settings"]["id"]]["displayed"]=true; + + }, + + toggle : function(id, toggle_to){ + + /* if((editAreas[id]["displayed"]==true && toggle_to!="on") || toggle_to=="off"){ + this.toggle_off(id); + }else if((editAreas[id]["displayed"]==false && toggle_to!="off") || toggle_to=="on"){ + this.toggle_on(id); + }*/ + if(!toggle_to) + toggle_to= (editAreas[id]["displayed"]==true)?"off":"on"; + if(editAreas[id]["displayed"]==true && toggle_to=="off"){ + this.toggle_off(id); + }else if(editAreas[id]["displayed"]==false && toggle_to=="on"){ + this.toggle_on(id); + } + + return false; + }, + + // static function + toggle_off : function(id){ + var fs=window.frames,f,t,parNod,nxtSib,selStart,selEnd,scrollTop,scrollLeft; + if(fs["frame_"+id]) + { + f = fs["frame_"+id]; + t = editAreas[id]["textarea"]; + if(f.editArea.fullscreen['isFull']) + f.editArea.toggle_full_screen(false); + editAreas[id]["displayed"]=false; + + // set wrap to off to keep same display mode (some browser get problem with this, so it need more complex operation + t.wrap = "off"; // for IE + setAttribute(t, "wrap", "off"); // for Firefox + parNod = t.parentNode; + nxtSib = t.nextSibling; + parNod.removeChild(t); + parNod.insertBefore(t, nxtSib); + + // restore values + t.value= f.editArea.textarea.value; + selStart = f.editArea.last_selection["selectionStart"]; + selEnd = f.editArea.last_selection["selectionEnd"]; + scrollTop = f.document.getElementById("result").scrollTop; + scrollLeft = f.document.getElementById("result").scrollLeft; + + + document.getElementById("frame_"+id).style.display='none'; + + t.style.display="inline"; + + try{ // IE will give an error when trying to focus an invisible or disabled textarea + t.focus(); + } catch(e){}; + if(this.isIE){ + t.selectionStart= selStart; + t.selectionEnd = selEnd; + t.focused = true; + set_IE_selection(t); + }else{ + if(this.isOpera && this.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end + t.setSelectionRange(0, 0); + } + try{ + t.setSelectionRange(selStart, selEnd); + } catch(e) {}; + } + t.scrollTop= scrollTop; + t.scrollLeft= scrollLeft; + f.editArea.execCommand("toggle_off"); + + } + }, + + // static function + toggle_on : function(id){ + var fs=window.frames,f,t,selStart=0,selEnd=0,scrollTop=0,scrollLeft=0,curPos,elem; + + if(fs["frame_"+id]) + { + f = fs["frame_"+id]; + t = editAreas[id]["textarea"]; + area= f.editArea; + area.textarea.value= t.value; + + // store display values; + curPos = editAreas[id]["settings"]["cursor_position"]; + + if(t.use_last==true) + { + selStart = t.last_selectionStart; + selEnd = t.last_selectionEnd; + scrollTop = t.last_scrollTop; + scrollLeft = t.last_scrollLeft; + t.use_last=false; + } + else if( curPos == "auto" ) + { + try{ + selStart = t.selectionStart; + selEnd = t.selectionEnd; + scrollTop = t.scrollTop; + scrollLeft = t.scrollLeft; + //alert(scrollTop); + }catch(ex){} + } + + // set to good size + this.set_editarea_size_from_textarea(id, document.getElementById("frame_"+id)); + t.style.display="none"; + document.getElementById("frame_"+id).style.display="inline"; + area.execCommand("focus"); // without this focus opera doesn't manage well the iframe body height + + + // restore display values + editAreas[id]["displayed"]=true; + area.execCommand("update_size"); + + f.document.getElementById("result").scrollTop= scrollTop; + f.document.getElementById("result").scrollLeft= scrollLeft; + area.area_select(selStart, selEnd-selStart); + area.execCommand("toggle_on"); + + + } + else + { + /* if(this.isIE) + get_IE_selection(document.getElementById(id)); */ + elem= document.getElementById(id); + elem.last_selectionStart= elem.selectionStart; + elem.last_selectionEnd= elem.selectionEnd; + elem.last_scrollTop= elem.scrollTop; + elem.last_scrollLeft= elem.scrollLeft; + elem.use_last=true; + editAreaLoader.start(id); + } + }, + + set_editarea_size_from_textarea : function(id, frame){ + var elem,width,height; + elem = document.getElementById(id); + + width = Math.max(editAreas[id]["settings"]["min_width"], elem.offsetWidth)+"px"; + height = Math.max(editAreas[id]["settings"]["min_height"], elem.offsetHeight)+"px"; + if(elem.style.width.indexOf("%")!=-1) + width = elem.style.width; + if(elem.style.height.indexOf("%")!=-1) + height = elem.style.height; + //alert("h: "+height+" w: "+width); + + frame.style.width= width; + frame.style.height= height; + }, + + set_base_url : function(){ + var t=this,elems,i,docBasePath; + + if( !this.baseURL ){ + elems = document.getElementsByTagName('script'); + + for( i=0; i'; + html += ''; + return html; + }, + + get_control_html : function(button_name, lang) { + var t=this,i,but,html,si; + for (i=0; i"; + case "|": + case "separator": + return ''; + case "select_font": + html= ""; + return html; + case "syntax_selection": + html= ""; + return html; + } + + return "["+button_name+"]"; + }, + + + get_template : function(){ + if(this.template=="") + { + var xhr_object = null; + if(window.XMLHttpRequest) // Firefox + xhr_object = new XMLHttpRequest(); + else if(window.ActiveXObject) // Internet Explorer + xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); + else { // XMLHttpRequest not supported + alert("XMLHTTPRequest not supported. EditArea not loaded"); + return; + } + + xhr_object.open("GET", this.baseURL+"template.html", false); + xhr_object.send(null); + if(xhr_object.readyState == 4) + this.template=xhr_object.responseText; + else + this.has_error(); + } + }, + + // translate text + translate : function(text, lang, mode){ + if(mode=="word") + text=editAreaLoader.get_word_translation(text, lang); + else if(mode="template"){ + editAreaLoader.current_language= lang; + text=text.replace(/\{\$([^\}]+)\}/gm, editAreaLoader.translate_template); + } + return text; + }, + + translate_template : function(){ + return editAreaLoader.get_word_translation(EditAreaLoader.prototype.translate_template.arguments[1], editAreaLoader.current_language); + }, + + get_word_translation : function(val, lang){ + var i; + + for( i in editAreaLoader.lang[lang]){ + if(i == val) + return editAreaLoader.lang[lang][i]; + } + return "_"+val; + }, + + load_script : function(url){ + var t=this,d=document,script,head; + + if( t.loadedFiles[url] ) + return; + //alert("load: "+url); + try{ + script= d.createElement("script"); + script.type= "text/javascript"; + script.src= url; + script.charset= "UTF-8"; + d.getElementsByTagName("head")[0].appendChild(script); + }catch(e){ + d.write(''); + } + + t.loadedFiles[url] = true; + }, + + add_event : function(obj, name, handler) { + try{ + if (obj.attachEvent) { + obj.attachEvent("on" + name, handler); + } else{ + obj.addEventListener(name, handler, false); + } + }catch(e){} + }, + + remove_event : function(obj, name, handler){ + try{ + if (obj.detachEvent) + obj.detachEvent("on" + name, handler); + else + obj.removeEventListener(name, handler, false); + }catch(e){} + }, + + + // reset all the editareas in the form that have been reseted + reset : function(e){ + var formObj,is_child,i,x; + + formObj = editAreaLoader.isIE ? window.event.srcElement : e.target; + if(formObj.tagName!='FORM') + formObj= formObj.form; + + for( i in editAreas ){ + is_child= false; + for( x=0;x old_sel["start"]) // if text was selected, cursor at the end + this.setSelectionRange(id, new_sel["end"], new_sel["end"]); + else // cursor in the middle + this.setSelectionRange(id, old_sel["start"]+open_tag.length, old_sel["start"]+open_tag.length); + }, + + // hide both EditArea and normal textarea + hide : function(id){ + var fs= window.frames,d=document,t=this,scrollTop,scrollLeft,span; + if(d.getElementById(id) && !t.hidden[id]) + { + t.hidden[id]= {}; + t.hidden[id]["selectionRange"]= t.getSelectionRange(id); + if(d.getElementById(id).style.display!="none") + { + t.hidden[id]["scrollTop"]= d.getElementById(id).scrollTop; + t.hidden[id]["scrollLeft"]= d.getElementById(id).scrollLeft; + } + + if(fs["frame_"+id]) + { + t.hidden[id]["toggle"]= editAreas[id]["displayed"]; + + if(fs["frame_"+id] && editAreas[id]["displayed"]==true){ + scrollTop = fs["frame_"+ id].document.getElementById("result").scrollTop; + scrollLeft = fs["frame_"+ id].document.getElementById("result").scrollLeft; + }else{ + scrollTop = d.getElementById(id).scrollTop; + scrollLeft = d.getElementById(id).scrollLeft; + } + t.hidden[id]["scrollTop"]= scrollTop; + t.hidden[id]["scrollLeft"]= scrollLeft; + + if(editAreas[id]["displayed"]==true) + editAreaLoader.toggle_off(id); + } + + // hide toggle button and debug box + span= d.getElementById("EditAreaArroundInfos_"+id); + if(span){ + span.style.display='none'; + } + + // hide textarea + d.getElementById(id).style.display= "none"; + } + }, + + // restore hidden EditArea and normal textarea + show : function(id){ + var fs= window.frames,d=document,t=this,span; + if((elem=d.getElementById(id)) && t.hidden[id]) + { + elem.style.display= "inline"; + elem.scrollTop= t.hidden[id]["scrollTop"]; + elem.scrollLeft= t.hidden[id]["scrollLeft"]; + span= d.getElementById("EditAreaArroundInfos_"+id); + if(span){ + span.style.display='inline'; + } + + if(fs["frame_"+id]) + { + + // restore toggle button and debug box + + + // restore textarea + elem.style.display= "inline"; + + // restore EditArea + if(t.hidden[id]["toggle"]==true) + editAreaLoader.toggle_on(id); + + scrollTop = t.hidden[id]["scrollTop"]; + scrollLeft = t.hidden[id]["scrollLeft"]; + + if(fs["frame_"+id] && editAreas[id]["displayed"]==true){ + fs["frame_"+ id].document.getElementById("result").scrollTop = scrollTop; + fs["frame_"+ id].document.getElementById("result").scrollLeft = scrollLeft; + }else{ + elem.scrollTop = scrollTop; + elem.scrollLeft = scrollLeft; + } + + } + // restore selection + sel = t.hidden[id]["selectionRange"]; + t.setSelectionRange(id, sel["start"], sel["end"]); + delete t.hidden[id]; + } + }, + + // get the current file datas (for multi file editing mode) + getCurrentFile : function(id){ + return this.execCommand(id, 'get_file', this.execCommand(id, 'curr_file')); + }, + + // get the given file datas (for multi file editing mode) + getFile : function(id, file_id){ + return this.execCommand(id, 'get_file', file_id); + }, + + // get all the openned files datas (for multi file editing mode) + getAllFiles : function(id){ + return this.execCommand(id, 'get_all_files()'); + }, + + // open a file (for multi file editing mode) + openFile : function(id, file_infos){ + return this.execCommand(id, 'open_file', file_infos); + }, + + // close the given file (for multi file editing mode) + closeFile : function(id, file_id){ + return this.execCommand(id, 'close_file', file_id); + }, + + // close the given file (for multi file editing mode) + setFileEditedMode : function(id, file_id, to){ + var reg1,reg2; + reg1 = new RegExp('\\\\', 'g'); + reg2 = new RegExp('"', 'g'); + return this.execCommand(id, 'set_file_edited_mode("'+ file_id.replace(reg1, '\\\\').replace(reg2, '\\"') +'", '+ to +')'); + }, + + + // allow to access to editarea functions and datas (for advanced users only) + execCommand : function(id, cmd, fct_param){ + switch(cmd){ + case "EA_init": + if(editAreas[id]['settings']["EA_init_callback"].length>0) + eval(editAreas[id]['settings']["EA_init_callback"]+"('"+ id +"');"); + break; + case "EA_delete": + if(editAreas[id]['settings']["EA_delete_callback"].length>0) + eval(editAreas[id]['settings']["EA_delete_callback"]+"('"+ id +"');"); + break; + case "EA_submit": + if(editAreas[id]['settings']["submit_callback"].length>0) + eval(editAreas[id]['settings']["submit_callback"]+"('"+ id +"');"); + break; + } + if(window.frames["frame_"+id] && window.frames["frame_"+ id].editArea){ + if(fct_param!=undefined) + return eval('window.frames["frame_'+ id +'"].editArea.'+ cmd +'(fct_param);'); + else + return eval('window.frames["frame_'+ id +'"].editArea.'+ cmd +';'); + } + return false; + } +}; + + var editAreaLoader= new EditAreaLoader(); + var editAreas= {}; + ADDED applications/admin/static/edit_area/elements_functions.js Index: applications/admin/static/edit_area/elements_functions.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/elements_functions.js @@ -0,0 +1,336 @@ +/**** + * This page contains some general usefull functions for javascript + * + ****/ + + + // need to redefine this functiondue to IE problem + function getAttribute( elm, aName ) { + var aValue,taName,i; + try{ + aValue = elm.getAttribute( aName ); + }catch(exept){} + + if( ! aValue ){ + for( i = 0; i < elm.attributes.length; i ++ ) { + taName = elm.attributes[i] .name.toLowerCase(); + if( taName == aName ) { + aValue = elm.attributes[i] .value; + return aValue; + } + } + } + return aValue; + }; + + // need to redefine this function due to IE problem + function setAttribute( elm, attr, val ) { + if(attr=="class"){ + elm.setAttribute("className", val); + elm.setAttribute("class", val); + }else{ + elm.setAttribute(attr, val); + } + }; + + /* return a child element + elem: element we are searching in + elem_type: type of the eleemnt we are searching (DIV, A, etc...) + elem_attribute: attribute of the searched element that must match + elem_attribute_match: value that elem_attribute must match + option: "all" if must return an array of all children, otherwise return the first match element + depth: depth of search (-1 or no set => unlimited) + */ + function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth) + { + if(!option) + var option="single"; + if(!depth) + var depth=-1; + if(elem){ + var children= elem.childNodes; + var result=null; + var results= []; + for (var x=0;x0){ + results= results.concat(result); + } + }else if(result!=null){ + return result; + } + } + } + } + if(option=="all") + return results; + } + return null; + }; + + function isChildOf(elem, parent){ + if(elem){ + if(elem==parent) + return true; + while(elem.parentNode != 'undefined'){ + return isChildOf(elem.parentNode, parent); + } + } + return false; + }; + + function getMouseX(e){ + + if(e!=null && typeof(e.pageX)!="undefined"){ + return e.pageX; + }else{ + return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft; + } + }; + + function getMouseY(e){ + if(e!=null && typeof(e.pageY)!="undefined"){ + return e.pageY; + }else{ + return (e!=null?e.y:event.y)+ document.documentElement.scrollTop; + } + }; + + function calculeOffsetLeft(r){ + return calculeOffset(r,"offsetLeft") + }; + + function calculeOffsetTop(r){ + return calculeOffset(r,"offsetTop") + }; + + function calculeOffset(element,attr){ + var offset=0; + while(element){ + offset+=element[attr]; + element=element.offsetParent + } + return offset; + }; + + /** return the computed style + * @param: elem: the reference to the element + * @param: prop: the name of the css property + */ + function get_css_property(elem, prop) + { + if(document.defaultView) + { + return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop); + } + else if(elem.currentStyle) + { + var prop = prop.replace(/-\D/gi, function(sMatch) + { + return sMatch.charAt(sMatch.length - 1).toUpperCase(); + }); + return elem.currentStyle[prop]; + } + else return null; + } + +/**** + * Moving an element + ***/ + + var _mCE; // currently moving element + + /* allow to move an element in a window + e: the event + id: the id of the element + frame: the frame of the element + ex of use: + in html: + or + in javascript: document.getElementById("my_div").onmousedown= start_move_element + */ + function start_move_element(e, id, frame){ + var elem_id=(e.target || e.srcElement).id; + if(id) + elem_id=id; + if(!frame) + frame=window; + if(frame.event) + e=frame.event; + + _mCE= frame.document.getElementById(elem_id); + _mCE.frame=frame; + frame.document.onmousemove= move_element; + frame.document.onmouseup= end_move_element; + /*_mCE.onmousemove= move_element; + _mCE.onmouseup= end_move_element;*/ + + //alert(_mCE.frame.document.body.offsetHeight); + + mouse_x= getMouseX(e); + mouse_y= getMouseY(e); + //window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x; + _mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE)); + _mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE)); + return false; + }; + + function end_move_element(e){ + _mCE.frame.document.onmousemove= ""; + _mCE.frame.document.onmouseup= ""; + _mCE=null; + }; + + function move_element(e){ + var newTop,newLeft,maxLeft; + + if( _mCE.frame && _mCE.frame.event ) + e=_mCE.frame.event; + newTop = getMouseY(e) - _mCE.start_pos_y; + newLeft = getMouseX(e) - _mCE.start_pos_x; + + maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth; + max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight; + newTop = Math.min(Math.max(0, newTop), max_top); + newLeft = Math.min(Math.max(0, newLeft), maxLeft); + + _mCE.style.top = newTop+"px"; + _mCE.style.left = newLeft+"px"; + return false; + }; + +/*** + * Managing a textarea (this part need the navigator infos from editAreaLoader + ***/ + + var nav= editAreaLoader.nav; + + // allow to get infos on the selection: array(start, end) + function getSelectionRange(textarea){ + return {"start": textarea.selectionStart, "end": textarea.selectionEnd}; + }; + + // allow to set the selection + function setSelectionRange(t, start, end){ + t.focus(); + + start = Math.max(0, Math.min(t.value.length, start)); + end = Math.max(start, Math.min(t.value.length, end)); + + if( nav.isOpera && nav.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end + t.selectionEnd = 1; + t.selectionStart = 0; + t.selectionEnd = 1; + t.selectionStart = 0; + } + t.selectionStart = start; + t.selectionEnd = end; + //textarea.setSelectionRange(start, end); + + if(nav.isIE) + set_IE_selection(t); + }; + + + // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task + function get_IE_selection(t){ + var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab; + if(t && t.focused) + { + if(!t.ea_line_height) + { // calculate the lineHeight + div= d.createElement("div"); + div.style.fontFamily= get_css_property(t, "font-family"); + div.style.fontSize= get_css_property(t, "font-size"); + div.style.visibility= "hidden"; + div.innerHTML="0"; + d.body.appendChild(div); + t.ea_line_height= div.offsetHeight; + d.body.removeChild(div); + } + //t.focus(); + range = d.selection.createRange(); + try + { + stored_range = range.duplicate(); + stored_range.moveToElementText( t ); + stored_range.setEndPoint( 'EndToEnd', range ); + if(stored_range.parentElement() == t){ + // the range don't take care of empty lines in the end of the selection + elem = t; + scrollTop = 0; + while(elem.parentNode){ + scrollTop+= elem.scrollTop; + elem = elem.parentNode; + } + + // var scrollTop= t.scrollTop + document.body.scrollTop; + + // var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop; + relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop; + // alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top); + line_start = Math.round((relative_top / t.ea_line_height) +1); + + line_nb = Math.round(range.boundingHeight / t.ea_line_height); + + range_start = stored_range.text.length - range.text.length; + tab = t.value.substr(0, range_start).split("\n"); + range_start += (line_start - tab.length)*2; // add missing empty lines to the selection + t.selectionStart = range_start; + + range_end = t.selectionStart + range.text.length; + tab = t.value.substr(0, range_start + range.text.length).split("\n"); + range_end += (line_start + line_nb - 1 - tab.length)*2; + t.selectionEnd = range_end; + } + } + catch(e){} + } + if( t && t.id ) + { + setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50); + } + }; + + function IE_textarea_focus(){ + event.srcElement.focused= true; + } + + function IE_textarea_blur(){ + event.srcElement.focused= false; + } + + // select the text for IE (take into account the \r difference) + function set_IE_selection( t ){ + var nbLineStart,nbLineStart,nbLineEnd,range; + if(!window.closed){ + nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1; + nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1; + try + { + range = document.selection.createRange(); + range.moveToElementText( t ); + range.setEndPoint( 'EndToStart', range ); + range.moveStart('character', t.selectionStart - nbLineStart); + range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) ); + range.select(); + } + catch(e){} + } + }; + + + editAreaLoader.waiting_loading["elements_functions.js"]= "loaded"; ADDED applications/admin/static/edit_area/highlight.js Index: applications/admin/static/edit_area/highlight.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/highlight.js @@ -0,0 +1,407 @@ + // change_to: "on" or "off" + EditArea.prototype.change_highlight= function(change_to){ + if(this.settings["syntax"].length==0 && change_to==false){ + this.switchClassSticky(_$("highlight"), 'editAreaButtonDisabled', true); + this.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true); + return false; + } + + if(this.do_highlight==change_to) + return false; + + + this.getIESelection(); + var pos_start= this.textarea.selectionStart; + var pos_end= this.textarea.selectionEnd; + + if(this.do_highlight===true || change_to==false) + this.disable_highlight(); + else + this.enable_highlight(); + this.textarea.focus(); + this.textarea.selectionStart = pos_start; + this.textarea.selectionEnd = pos_end; + this.setIESelection(); + + }; + + EditArea.prototype.disable_highlight= function(displayOnly){ + var t= this, a=t.textarea, new_Obj, old_class, new_class; + + t.selection_field.innerHTML=""; + t.selection_field_text.innerHTML=""; + t.content_highlight.style.visibility="hidden"; + // replacing the node is far more faster than deleting it's content in firefox + new_Obj= t.content_highlight.cloneNode(false); + new_Obj.innerHTML= ""; + t.content_highlight.parentNode.insertBefore(new_Obj, t.content_highlight); + t.content_highlight.parentNode.removeChild(t.content_highlight); + t.content_highlight= new_Obj; + old_class= parent.getAttribute( a,"class" ); + if(old_class){ + new_class= old_class.replace( "hidden","" ); + parent.setAttribute( a, "class", new_class ); + } + + a.style.backgroundColor="transparent"; // needed in order to see the bracket finders + + //var icon= document.getElementById("highlight"); + //setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") ); + //t.restoreClass(icon); + //t.switchClass(icon,'editAreaButtonNormal'); + t.switchClassSticky(_$("highlight"), 'editAreaButtonNormal', true); + t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonDisabled', true); + + t.do_highlight=false; + + t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonSelected', true); + if(typeof(t.smooth_selection_before_highlight)!="undefined" && t.smooth_selection_before_highlight===false){ + t.change_smooth_selection_mode(false); + } + + // this.textarea.style.backgroundColor="#FFFFFF"; + }; + + EditArea.prototype.enable_highlight= function(){ + var t=this, a=t.textarea, new_class; + t.show_waiting_screen(); + + t.content_highlight.style.visibility="visible"; + new_class =parent.getAttribute(a,"class")+" hidden"; + parent.setAttribute( a, "class", new_class ); + + // IE can't manage mouse click outside text range without this + if( t.isIE ) + a.style.backgroundColor="#FFFFFF"; + + t.switchClassSticky(_$("highlight"), 'editAreaButtonSelected', false); + t.switchClassSticky(_$("reset_highlight"), 'editAreaButtonNormal', false); + + t.smooth_selection_before_highlight=t.smooth_selection; + if(!t.smooth_selection) + t.change_smooth_selection_mode(true); + t.switchClassSticky(_$("change_smooth_selection"), 'editAreaButtonDisabled', true); + + + t.do_highlight=true; + t.resync_highlight(); + + t.hide_waiting_screen(); + }; + + /** + * Ask to update highlighted text + * @param Array infos - Array of datas returned by EditArea.get_selection_infos() + */ + EditArea.prototype.maj_highlight= function(infos){ + // for speed mesure + var debug_opti="",tps_start= new Date().getTime(), tps_middle_opti=new Date().getTime(); + var t=this, hightlighted_text, updated_highlight; + var textToHighlight=infos["full_text"], doSyntaxOpti = false, doHtmlOpti = false, stay_begin="", stay_end="", trace_new , trace_last; + + if(t.last_text_to_highlight==infos["full_text"] && t.resync_highlight!==true) + return; + + // OPTIMISATION: will search to update only changed lines + if(t.reload_highlight===true){ + t.reload_highlight=false; + }else if(textToHighlight.length==0){ + textToHighlight="\n "; + }else{ + // get text change datas + changes = t.checkTextEvolution(t.last_text_to_highlight,textToHighlight); + + // check if it can only reparse the changed text + trace_new = t.get_syntax_trace(changes.newTextLine).replace(/\r/g, ''); + trace_last = t.get_syntax_trace(changes.lastTextLine).replace(/\r/g, ''); + doSyntaxOpti = ( trace_new == trace_last ); + + // check if the difference comes only from a new line created + // => we have to remember that the editor can automaticaly add tabulation or space after the new line) + if( !doSyntaxOpti && trace_new == "\n"+trace_last && /^[ \t\s]*\n[ \t\s]*$/.test( changes.newText.replace(/\r/g, '') ) && changes.lastText =="" ) + { + doSyntaxOpti = true; + } + + // we do the syntax optimisation + if( doSyntaxOpti ){ + + tps_middle_opti=new Date().getTime(); + + stay_begin= t.last_hightlighted_text.split("\n").slice(0, changes.lineStart).join("\n"); + if(changes.lineStart>0) + stay_begin+= "\n"; + stay_end= t.last_hightlighted_text.split("\n").slice(changes.lineLastEnd+1).join("\n"); + if(stay_end.length>0) + stay_end= "\n"+stay_end; + + // Final check to see that we're not in the middle of span tags + if( stay_begin.split(' trace: "+trace_new + +"\nchanged_last_text: "+ch.lastText+" => trace: "+trace_last + //debug_opti+= "\nchanged: "+ infos["full_text"].substring(ch.posStart, ch.posNewEnd); + + "\nchanged_line: "+ch.newTextLine + + "\nlast_changed_line: "+ch.lastTextLine + +"\nstay_begin: "+ stay_begin.slice(-100) + +"\nstay_end: "+ stay_end.substr( 0, 100 ); + //debug_opti="start: "+stay_begin_len+ "("+nb_line_start_unchanged+") end: "+ (stay_end_len)+ "("+(splited.length-nb_line_end_unchanged)+") "; + //debug_opti+="changed: "+ textToHighlight.substring(stay_begin_len, textToHighlight.length-stay_end_len)+" \n"; + + //debug_opti+="changed: "+ stay_begin.substr(stay_begin.length-200)+ "----------"+ textToHighlight+"------------------"+ stay_end.substr(0,200) +"\n"; + +"\n"; + } + + + // END OPTIMISATION + } + + tps_end_opti = new Date().getTime(); + + // apply highlight + updated_highlight = t.colorize_text(textToHighlight); + tpsAfterReg = new Date().getTime(); + + /*** + * see if we can optimize for updating only the required part of the HTML code + * + * The goal here will be to find the text node concerned by the modification and to update it + */ + //------------------------------------------- + + // disable latest optimization tricks (introduced in 0.8.1 and removed in 0.8.2), TODO: check for another try later + doSyntaxOpti = doHtmlOpti = false; + if( doSyntaxOpti ) + { + try + { + var replacedBloc, i, nbStart = '', nbEnd = '', newHtml, lengthOld, lengthNew; + replacedBloc = t.last_hightlighted_text.substring( stay_begin.length, t.last_hightlighted_text.length - stay_end.length ); + + lengthOld = replacedBloc.length; + lengthNew = updated_highlight.length; + + // find the identical caracters at the beginning + for( i=0; i < lengthOld && i < lengthNew && replacedBloc.charAt(i) == updated_highlight.charAt(i) ; i++ ) + { + } + nbStart = i; + // find the identical caracters at the end + for( i=0; i + nbStart < lengthOld && i + nbStart < lengthNew && replacedBloc.charAt(lengthOld-i-1) == updated_highlight.charAt(lengthNew-i-1) ; i++ ) + { + } + nbEnd = i; + //console.log( nbStart, nbEnd, replacedBloc, updated_highlight ); + // get the changes + lastHtml = replacedBloc.substring( nbStart, lengthOld - nbEnd ); + newHtml = updated_highlight.substring( nbStart, lengthNew - nbEnd ); + + // We can do the optimisation only if we havn't touch to span elements + if( newHtml.indexOf('').replace( /&/g, '&'); + + nbOpendedSpan = beginStr.split(' 0 ) + { + nbClosed--; + parentSpan = parentSpan.parentNode; + } + + // find the position of the last opended tag + while( parentSpan.parentNode != t.content_highlight && parentSpan.parentNode.tagName != 'PRE' && ( tmpMaxStartOffset = Math.max( 0, beginStr.lastIndexOf( '', maxStartOffset ) ); + + // count the number of sub spans + nbSubSpanBefore = beginStr.substr( lastEndPos ).split('' ) ) == -1 ? beginStr.length : beginStr.length - ( lastIndex + 1 ); + //nbUnchangedChars = ? beginStr.length : beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length; + + if( ( lastIndex = beginStr.lastIndexOf( '>' ) ) == -1 ) + { + nbUnchangedChars = beginStr.length; + } + else + { + nbUnchangedChars = beginStr.substr( lastIndex + 1 ).replace( /</g, '<').replace( />/g, '>').replace( /&/g, '&').length; + //nbUnchangedChars += beginStr.substr( ).replace( /&/g, '&').replace( //g, '>').length - beginStr.length; + } + //alert( nbUnchangedChars ); + // console.log( span, textNode, nbOpendedSpan,nbClosedSpan, span.nextSibling, textNode.length, nbUnchangedChars, lastHtml, lastHtml.length, newHtml, newHtml.length ); + // alert( textNode.parentNode.className +'-'+ textNode.parentNode.tagName+"\n"+ textNode.data +"\n"+ nbUnchangedChars +"\n"+ lastHtml.length +"\n"+ newHtml +"\n"+ newHtml.length ); + // console.log( nbUnchangedChars, lastIndex, beginStr.length, beginStr.replace(/&/g, '&'), lastHtml.length, '|', newHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/g, 'r'), lastHtml.replace( /\t/g, 't').replace( /\n/g, 'n').replace( /\r/, 'r') ); + // console.log( textNode.data.replace(/&/g, '&') ); + // IE only manage \r for cariage return in textNode and not \n or \r\n + if( t.isIE ) + { + nbUnchangedChars -= ( beginStr.substr( beginStr.length - nbUnchangedChars ).split("\n").length - 1 ); + //alert( textNode.data.replace(/\r/g, '_r').replace(/\n/g, '_n')); + textNode.replaceData( nbUnchangedChars, lastHtml.replace(/\n/g, '').length, newHtml.replace(/\n/g, '') ); + } + else + { + textNode.replaceData( nbUnchangedChars, lastHtml.length, newHtml ); + } + //--------] + } + } + // an exception shouldn't occured but if replaceData failed at least it won't break everything + catch( e ) + { + // throw e; + // console.log( e ); + doHtmlOpti = false; + } + + } + + /*** END HTML update's optimisation ***/ + // end test + + // console.log( (TPS6-TPS5), (TPS5-TPS4), (TPS4-TPS3), (TPS3-TPS2), (TPS2-TPS1), _CPT ); + // get the new highlight content + tpsAfterOpti2 = new Date().getTime(); + hightlighted_text = stay_begin + updated_highlight + stay_end; + if( !doHtmlOpti ) + { + // update the content of the highlight div by first updating a clone node (as there is no display in the same time for t node it's quite faster (5*)) + var new_Obj= t.content_highlight.cloneNode(false); + if( ( t.isIE && t.isIE < 8 ) || ( t.isOpera && t.isOpera < 9.6 ) ) + new_Obj.innerHTML= "
" + hightlighted_text + "
"; + else + new_Obj.innerHTML= ""+ hightlighted_text +""; + + t.content_highlight.parentNode.replaceChild(new_Obj, t.content_highlight); + + t.content_highlight= new_Obj; + } + + t.last_text_to_highlight= infos["full_text"]; + t.last_hightlighted_text= hightlighted_text; + + tps3=new Date().getTime(); + + if(t.settings["debug"]){ + //lineNumber=tab_text.length; + //t.debug.value+=" \nNB char: "+_$("src").value.length+" Nb line: "+ lineNumber; + + t.debug.value= "Tps optimisation "+(tps_end_opti-tps_start) + +" | tps reg exp: "+ (tpsAfterReg-tps_end_opti) + +" | tps opti HTML : "+ (tpsAfterOpti2-tpsAfterReg) + ' '+ ( doHtmlOpti ? 'yes' : 'no' ) + +" | tps update highlight content: "+ (tps3-tpsAfterOpti2) + +" | tpsTotal: "+ (tps3-tps_start) + + "("+tps3+")\n"+ debug_opti; + // t.debug.value+= "highlight\n"+hightlighted_text;*/ + } + + }; + + EditArea.prototype.resync_highlight= function(reload_now){ + this.reload_highlight=true; + this.last_text_to_highlight=""; + this.focus(); + if(reload_now) + this.check_line_selection(false); + }; ADDED applications/admin/static/edit_area/images/autocompletion.gif Index: applications/admin/static/edit_area/images/autocompletion.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/autocompletion.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/close.gif Index: applications/admin/static/edit_area/images/close.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/close.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/fullscreen.gif Index: applications/admin/static/edit_area/images/fullscreen.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/fullscreen.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/go_to_line.gif Index: applications/admin/static/edit_area/images/go_to_line.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/go_to_line.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/help.gif Index: applications/admin/static/edit_area/images/help.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/help.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/highlight.gif Index: applications/admin/static/edit_area/images/highlight.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/highlight.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/load.gif Index: applications/admin/static/edit_area/images/load.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/load.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/move.gif Index: applications/admin/static/edit_area/images/move.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/move.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/newdocument.gif Index: applications/admin/static/edit_area/images/newdocument.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/newdocument.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/opacity.png Index: applications/admin/static/edit_area/images/opacity.png ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/opacity.png cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/processing.gif Index: applications/admin/static/edit_area/images/processing.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/processing.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/redo.gif Index: applications/admin/static/edit_area/images/redo.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/redo.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/reset_highlight.gif Index: applications/admin/static/edit_area/images/reset_highlight.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/reset_highlight.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/save.gif Index: applications/admin/static/edit_area/images/save.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/save.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/search.gif Index: applications/admin/static/edit_area/images/search.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/search.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/smooth_selection.gif Index: applications/admin/static/edit_area/images/smooth_selection.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/smooth_selection.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/spacer.gif Index: applications/admin/static/edit_area/images/spacer.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/spacer.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/statusbar_resize.gif Index: applications/admin/static/edit_area/images/statusbar_resize.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/statusbar_resize.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/undo.gif Index: applications/admin/static/edit_area/images/undo.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/undo.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/images/word_wrap.gif Index: applications/admin/static/edit_area/images/word_wrap.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/images/word_wrap.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/keyboard.js Index: applications/admin/static/edit_area/keyboard.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/keyboard.js @@ -0,0 +1,145 @@ +var EA_keys = {8:"Retour arriere",9:"Tabulation",12:"Milieu (pave numerique)",13:"Entrer",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"Verr Maj",27:"Esc",32:"Space",33:"Page up",34:"Page down",35:"End",36:"Begin",37:"Left",38:"Up",39:"Right",40:"Down",44:"Impr ecran",45:"Inser",46:"Suppr",91:"Menu Demarrer Windows / touche pomme Mac",92:"Menu Demarrer Windows",93:"Menu contextuel Windows",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Verr Num",145:"Arret defil"}; + + + +function keyDown(e){ + if(!e){ // if IE + e=event; + } + + // send the event to the plugins + for(var i in editArea.plugins){ + if(typeof(editArea.plugins[i].onkeydown)=="function"){ + if(editArea.plugins[i].onkeydown(e)===false){ // stop propaging + if(editArea.isIE) + e.keyCode=0; + return false; + } + } + } + + var target_id=(e.target || e.srcElement).id; + var use=false; + if (EA_keys[e.keyCode]) + letter=EA_keys[e.keyCode]; + else + letter=String.fromCharCode(e.keyCode); + + var low_letter= letter.toLowerCase(); + + if(letter=="Page up" && !AltPressed(e) && !editArea.isOpera){ + editArea.execCommand("scroll_page", {"dir": "up", "shift": ShiftPressed(e)}); + use=true; + }else if(letter=="Page down" && !AltPressed(e) && !editArea.isOpera){ + editArea.execCommand("scroll_page", {"dir": "down", "shift": ShiftPressed(e)}); + use=true; + }else if(editArea.is_editable==false){ + // do nothing but also do nothing else (allow to navigate with page up and page down) + return true; + }else if(letter=="Tabulation" && target_id=="textarea" && !CtrlPressed(e) && !AltPressed(e)){ + if(ShiftPressed(e)) + editArea.execCommand("invert_tab_selection"); + else + editArea.execCommand("tab_selection"); + + use=true; + if(editArea.isOpera || (editArea.isFirefox && editArea.isMac) ) // opera && firefox mac can't cancel tabulation events... + setTimeout("editArea.execCommand('focus');", 1); + }else if(letter=="Entrer" && target_id=="textarea"){ + if(editArea.press_enter()) + use=true; + }else if(letter=="Entrer" && target_id=="area_search"){ + editArea.execCommand("area_search"); + use=true; + }else if(letter=="Esc"){ + editArea.execCommand("close_all_inline_popup", e); + use=true; + }else if(CtrlPressed(e) && !AltPressed(e) && !ShiftPressed(e)){ + switch(low_letter){ + case "f": + editArea.execCommand("area_search"); + use=true; + break; + case "r": + editArea.execCommand("area_replace"); + use=true; + break; + case "q": + editArea.execCommand("close_all_inline_popup", e); + use=true; + break; + case "h": + editArea.execCommand("change_highlight"); + use=true; + break; + case "g": + setTimeout("editArea.execCommand('go_to_line');", 5); // the prompt stop the return false otherwise + use=true; + break; + case "e": + editArea.execCommand("show_help"); + use=true; + break; + case "z": + use=true; + editArea.execCommand("undo"); + break; + case "y": + use=true; + editArea.execCommand("redo"); + break; + default: + break; + } + } + + // check to disable the redo possibility if the textarea content change + if(editArea.next.length > 0){ + setTimeout("editArea.check_redo();", 10); + } + + setTimeout("editArea.check_file_changes();", 10); + + + if(use){ + // in case of a control that sould'nt be used by IE but that is used => THROW a javascript error that will stop key action + if(editArea.isIE) + e.keyCode=0; + return false; + } + //alert("Test: "+ letter + " ("+e.keyCode+") ALT: "+ AltPressed(e) + " CTRL "+ CtrlPressed(e) + " SHIFT "+ ShiftPressed(e)); + + return true; + +}; + + +// return true if Alt key is pressed +function AltPressed(e) { + if (window.event) { + return (window.event.altKey); + } else { + if(e.modifiers) + return (e.altKey || (e.modifiers % 2)); + else + return e.altKey; + } +}; + +// return true if Ctrl key is pressed +function CtrlPressed(e) { + if (window.event) { + return (window.event.ctrlKey); + } else { + return (e.ctrlKey || (e.modifiers==2) || (e.modifiers==3) || (e.modifiers>5)); + } +}; + +// return true if Shift key is pressed +function ShiftPressed(e) { + if (window.event) { + return (window.event.shiftKey); + } else { + return (e.shiftKey || (e.modifiers>3)); + } +}; ADDED applications/admin/static/edit_area/langs/bg.js Index: applications/admin/static/edit_area/langs/bg.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/bg.js @@ -0,0 +1,54 @@ +/* + * Bulgarian translation + * Author: Valentin Hristov + * Company: SOFTKIT Bulgarian + * Site: http://www.softkit-bg.com + */ +editAreaLoader.lang["bg"]={ +new_document: "нов документ", +search_button: "търсене и замяна", +search_command: "търси следващия / отвори прозорец с търсачка", +search: "търсене", +replace: "замяна", +replace_command: "замяна / отвори прозорец с търсачка", +find_next: "намери следващия", +replace_all: "замени всички", +reg_exp: "реголярни изрази", +match_case: "чуствителен към регистъра", +not_found: "няма резултат.", +occurrence_replaced: "замяната е осъществена.", +search_field_empty: "Полето за търсене е празно", +restart_search_at_begin: "До края на документа. Почни с началото.", +move_popup: "премести прозореца с търсачката", +font_size: "--Размер на шрифта--", +go_to_line: "премени към реда", +go_to_line_prompt: "премени към номера на реда:", +undo: "отмени", +redo: "върни", +change_smooth_selection: "включи/изключи някой от функциите за преглед (по красиво, но повече натоварва)", +highlight: "превключване на оцветяване на синтаксиса включена/изключена", +reset_highlight: "въстанови оцветяване на синтаксиса (ако не е синхронизиран с текста)", +word_wrap: "режим на пренасяне на дълги редове", +help: "за програмата", +save: "съхрани", +load: "зареди", +line_abbr: "Стр", +char_abbr: "Стлб", +position: "Позиция", +total: "Всичко", +close_popup: "затвори прозореца", +shortcuts: "Бързи клавиши", +add_tab: "добави табулация в текста", +remove_tab: "премахни табулацията в текста", +about_notice: "Внимание: използвайте функцията оцветяване на синтаксиса само за малки текстове", +toggle: "Превключи редактор", +accesskey: "Бърз клавиш", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Зареждане...", +fullscreen: "на цял екран", +syntax_selection: "--Синтаксис--", +close_tab: "Затвори файла" +}; ADDED applications/admin/static/edit_area/langs/cs.js Index: applications/admin/static/edit_area/langs/cs.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/cs.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["cs"]={ +new_document: "Nový dokument", +search_button: "Najdi a nahraď", +search_command: "Hledej další / otevři vyhledávací pole", +search: "Hledej", +replace: "Nahraď", +replace_command: "Nahraď / otevři vyhledávací pole", +find_next: "Najdi další", +replace_all: "Nahraď vše", +reg_exp: "platné výrazy", +match_case: "vyhodnocené výrazy", +not_found: "nenalezené.", +occurrence_replaced: "výskyty nahrazené.", +search_field_empty: "Pole vyhledávání je prázdné", +restart_search_at_begin: "Dosažen konec souboru, začínám od začátku.", +move_popup: "Přesuň vyhledávací okno", +font_size: "--Velikost textu--", +go_to_line: "Přejdi na řádek", +go_to_line_prompt: "Přejdi na řádek:", +undo: "krok zpět", +redo: "znovu", +change_smooth_selection: "Povolit nebo zakázat některé ze zobrazených funkcí (účelnější zobrazení požaduje větší zatížení procesoru)", +highlight: "Zvýrazňování syntaxe zap./vyp.", +reset_highlight: "Obnovit zvýraznění (v případě nesrovnalostí)", +word_wrap: "toggle word wrapping mode", +help: "O programu", +save: "Uložit", +load: "Otevřít", +line_abbr: "Ř.", +char_abbr: "S.", +position: "Pozice", +total: "Celkem", +close_popup: "Zavřít okno", +shortcuts: "Zkratky", +add_tab: "Přidat tabulování textu", +remove_tab: "Odtsranit tabulování textu", +about_notice: "Upozornění! Funkce zvýrazňování textu je k dispozici pouze pro malý text", +toggle: "Přepnout editor", +accesskey: "Přístupová klávesa", +tab: "Záložka", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Zpracovávám ...", +fullscreen: "Celá obrazovka", +syntax_selection: "--vyber zvýrazňovač--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/de.js Index: applications/admin/static/edit_area/langs/de.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/de.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["de"]={ +new_document: "Neues Dokument", +search_button: "Suchen und Ersetzen", +search_command: "Weitersuchen / öffne Suchfeld", +search: "Suchen", +replace: "Ersetzen", +replace_command: "Ersetzen / öffne Suchfeld", +find_next: "Weitersuchen", +replace_all: "Ersetze alle Treffer", +reg_exp: "reguläre Ausdrücke", +match_case: "passt auf den Begriff
", +not_found: "Nicht gefunden.", +occurrence_replaced: "Die Vorkommen wurden ersetzt.", +search_field_empty: "Leeres Suchfeld", +restart_search_at_begin: "Ende des zu durchsuchenden Bereiches erreicht. Es wird die Suche von Anfang an fortgesetzt.", //find a shorter translation +move_popup: "Suchfenster bewegen", +font_size: "--Schriftgröße--", +go_to_line: "Gehe zu Zeile", +go_to_line_prompt: "Gehe zu Zeilennummmer:", +undo: "Rückgängig", +redo: "Wiederherstellen", +change_smooth_selection: "Aktiviere/Deaktiviere einige Features (weniger Bildschirmnutzung aber mehr CPU-Belastung)", +highlight: "Syntax Highlighting an- und ausschalten", +reset_highlight: "Highlighting zurücksetzen (falls mit Text nicht konform)", +word_wrap: "Toggle word wrapping mode", +help: "Info", +save: "Speichern", +load: "Öffnen", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Gesamt", +close_popup: "Popup schließen", +shortcuts: "Shortcuts", +add_tab: "Tab zum Text hinzufügen", +remove_tab: "Tab aus Text entfernen", +about_notice: "Bemerkung: Syntax Highlighting ist nur für kurze Texte", +toggle: "Editor an- und ausschalten", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In Bearbeitung...", +fullscreen: "Full-Screen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/dk.js Index: applications/admin/static/edit_area/langs/dk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/dk.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["dk"]={ +new_document: "nyt tomt dokument", +search_button: "søg og erstat", +search_command: "find næste / åben søgefelt", +search: "søg", +replace: "erstat", +replace_command: "erstat / åben søgefelt", +find_next: "find næste", +replace_all: "erstat alle", +reg_exp: "regular expressions", +match_case: "forskel på store/små bogstaver
", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "flyt søgepopup", +font_size: "--Skriftstørrelse--", +go_to_line: "gå til linie", +go_to_line_prompt: "gå til linienummer:", +undo: "fortryd", +redo: "gentag", +change_smooth_selection: "slå display funktioner til/fra (smartere display men mere CPU krævende)", +highlight: "slå syntax highlight til/fra", +reset_highlight: "nulstil highlight (hvis den er desynkroniseret fra teksten)", +word_wrap: "toggle word wrapping mode", +help: "om", +save: "gem", +load: "hent", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "luk popup", +shortcuts: "Genveje", +add_tab: "tilføj tabulation til tekst", +remove_tab: "fjern tabulation fra tekst", +about_notice: "Husk: syntax highlight funktionen bør kun bruge til små tekster", +toggle: "Slå editor til / fra", +accesskey: "Accesskey", +tab: "Tab", +shift: "Skift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/en.js Index: applications/admin/static/edit_area/langs/en.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/en.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["en"]={ +new_document: "new empty document", +search_button: "search and replace", +search_command: "search next / open search area", +search: "search", +replace: "replace", +replace_command: "replace / open search area", +find_next: "find next", +replace_all: "replace all", +reg_exp: "regular expressions", +match_case: "match case", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "move search popup", +font_size: "--Font size--", +go_to_line: "go to line", +go_to_line_prompt: "go to line number:", +undo: "undo", +redo: "redo", +change_smooth_selection: "enable/disable some display features (smarter display but more CPU charge)", +highlight: "toggle syntax highlight on/off", +reset_highlight: "reset highlight (if desyncronized from text)", +word_wrap: "toggle word wrapping mode", +help: "about", +save: "save", +load: "load", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "close popup", +shortcuts: "Shortcuts", +add_tab: "add tabulation to text", +remove_tab: "remove tabulation to text", +about_notice: "Notice: syntax highlight function is only for small text", +toggle: "Toggle editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/eo.js Index: applications/admin/static/edit_area/langs/eo.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/eo.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["eo"]={ +new_document: "nova dokumento (vakigas la enhavon)", +search_button: "serĉi / anstataŭigi", +search_command: "pluserĉi / malfermi la serĉo-fenestron", +search: "serĉi", +replace: "anstataŭigi", +replace_command: "anstataŭigi / malfermi la serĉo-fenestron", +find_next: "serĉi", +replace_all: "anstataŭigi ĉion", +reg_exp: "regula esprimo", +match_case: "respekti la usklecon", +not_found: "ne trovita.", +occurrence_replaced: "anstataŭigoj plenumitaj.", +search_field_empty: "La kampo estas malplena.", +restart_search_at_begin: "Fino de teksto ĝisrirata, ĉu daŭrigi el la komenco?", +move_popup: "movi la serĉo-fenestron", +font_size: "--Tipara grando--", +go_to_line: "iri al la linio", +go_to_line_prompt: "iri al la linio numero:", +undo: "rezigni", +redo: "refari", +change_smooth_selection: "ebligi/malebligi la funkcioj de vidigo (pli bona vidigo, sed pli da ŝarĝo de la ĉeforgano)", +highlight: "ebligi/malebligi la sintaksan kolorigon", +reset_highlight: "repravalorizi la sintaksan kolorigon (se malsinkronigon de la teksto)", +word_wrap: "toggle word wrapping mode", +help: "pri", +save: "registri", +load: "ŝarĝi", +line_abbr: "Ln", +char_abbr: "Sg", +position: "Pozicio", +total: "Sumo", +close_popup: "fermi la ŝprucfenestron", +shortcuts: "Fulmoklavo", +add_tab: "aldoni tabon en la tekston", +remove_tab: "forigi tablon el la teksto", +about_notice: "Noto: la sintaksa kolorigo estas nur prikalkulita por mallongaj tekstoj.", +toggle: "baskuligi la redaktilon", +accesskey: "Fulmoklavo", +tab: "Tab", +shift: "Maj", +ctrl: "Ktrl", +esc: "Esk", +processing: "ŝargante...", +fullscreen: "plenekrane", +syntax_selection: "--Sintakso--", +close_tab: "Fermi la dosieron" +}; ADDED applications/admin/static/edit_area/langs/es.js Index: applications/admin/static/edit_area/langs/es.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/es.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["es"]={ +new_document: "nuevo documento vacío", +search_button: "buscar y reemplazar", +search_command: "buscar siguiente / abrir área de búsqueda", +search: "buscar", +replace: "reemplazar", +replace_command: "reemplazar / abrir área de búsqueda", +find_next: "encontrar siguiente", +replace_all: "reemplazar todos", +reg_exp: "expresiones regulares", +match_case: "coincidir capitalización", +not_found: "no encontrado.", +occurrence_replaced: "ocurrencias reemplazadas.", +search_field_empty: "Campo de búsqueda vacío", +restart_search_at_begin: "Se ha llegado al final del área. Se va a seguir desde el principio.", +move_popup: "mover la ventana de búsqueda", +font_size: "--Tamaño de la fuente--", +go_to_line: "ir a la línea", +go_to_line_prompt: "ir a la línea número:", +undo: "deshacer", +redo: "rehacer", +change_smooth_selection: "activar/desactivar algunas características de visualización (visualización más inteligente pero más carga de CPU)", +highlight: "intercambiar resaltado de sintaxis", +reset_highlight: "reinicializar resaltado (si no esta sincronizado con el texto)", +word_wrap: "toggle word wrapping mode", +help: "acerca", +save: "guardar", +load: "cargar", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posición", +total: "Total", +close_popup: "recuadro de cierre", +shortcuts: "Atajos", +add_tab: "añadir tabulado al texto", +remove_tab: "borrar tabulado del texto", +about_notice: "Aviso: el resaltado de sintaxis sólo funciona para texto pequeño", +toggle: "Cambiar editor", +accesskey: "Tecla de acceso", +tab: "Tab", +shift: "Mayúsc", +ctrl: "Ctrl", +esc: "Esc", +processing: "Procesando...", +fullscreen: "pantalla completa", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/fi.js Index: applications/admin/static/edit_area/langs/fi.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/fi.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["fi"]={ +new_document: "uusi tyhjä dokumentti", +search_button: "etsi ja korvaa", +search_command: "etsi seuraava / avaa etsintävalikko", +search: "etsi", +replace: "korvaa", +replace_command: "korvaa / avaa etsintävalikko", +find_next: "etsi seuraava", +replace_all: "korvaa kaikki", +reg_exp: "säännölliset lausekkeet", +match_case: "täsmää kirjainkokoon", +not_found: "ei löytynyt.", +occurrence_replaced: "esiintymää korvattu.", +search_field_empty: "Haettava merkkijono on tyhjä", +restart_search_at_begin: "Alueen loppu saavutettiin. Aloitetaan alusta.", +move_popup: "siirrä etsintävalikkoa", +font_size: "--Fontin koko--", +go_to_line: "siirry riville", +go_to_line_prompt: "mene riville:", +undo: "peruuta", +redo: "tee uudelleen", +change_smooth_selection: "kytke/sammuta joitakin näyttötoimintoja (Älykkäämpi toiminta, mutta suurempi CPU kuormitus)", +highlight: "kytke syntaksikorostus päälle/pois", +reset_highlight: "resetoi syntaksikorostus (jos teksti ei ole synkassa korostuksen kanssa)", +word_wrap: "toggle word wrapping mode", +help: "tietoja", +save: "tallenna", +load: "lataa", +line_abbr: "Rv", +char_abbr: "Pos", +position: "Paikka", +total: "Yhteensä", +close_popup: "sulje valikko", +shortcuts: "Pikatoiminnot", +add_tab: "lisää sisennys tekstiin", +remove_tab: "poista sisennys tekstistä", +about_notice: "Huomautus: syntaksinkorostus toimii vain pienelle tekstille", +toggle: "Kytke editori", +accesskey: "Pikanäppäin", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Odota...", +fullscreen: "koko ruutu", +syntax_selection: "--Syntaksi--", +close_tab: "Sulje tiedosto" +}; ADDED applications/admin/static/edit_area/langs/fr.js Index: applications/admin/static/edit_area/langs/fr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/fr.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["fr"]={ +new_document: "nouveau document (efface le contenu)", +search_button: "rechercher / remplacer", +search_command: "rechercher suivant / ouvrir la fenêtre de recherche", +search: "rechercher", +replace: "remplacer", +replace_command: "remplacer / ouvrir la fenêtre de recherche", +find_next: "rechercher", +replace_all: "tout remplacer", +reg_exp: "expr. régulière", +match_case: "respecter la casse", +not_found: "pas trouvé.", +occurrence_replaced: "remplacements éffectués.", +search_field_empty: "Le champ de recherche est vide.", +restart_search_at_begin: "Fin du texte atteint, poursuite au début.", +move_popup: "déplacer la fenêtre de recherche", +font_size: "--Taille police--", +go_to_line: "aller à la ligne", +go_to_line_prompt: "aller a la ligne numero:", +undo: "annuler", +redo: "refaire", +change_smooth_selection: "activer/désactiver des fonctions d'affichage (meilleur affichage mais plus de charge processeur)", +highlight: "activer/désactiver la coloration syntaxique", +reset_highlight: "réinitialiser la coloration syntaxique (si désyncronisée du texte)", +word_wrap: "activer/désactiver les retours à la ligne automatiques", +help: "à propos", +save: "sauvegarder", +load: "charger", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "fermer le popup", +shortcuts: "Racourcis clavier", +add_tab: "ajouter une tabulation dans le texte", +remove_tab: "retirer une tabulation dans le texte", +about_notice: "Note: la coloration syntaxique n'est prévue que pour de courts textes.", +toggle: "basculer l'éditeur", +accesskey: "Accesskey", +tab: "Tab", +shift: "Maj", +ctrl: "Ctrl", +esc: "Esc", +processing: "chargement...", +fullscreen: "plein écran", +syntax_selection: "--Syntaxe--", +close_tab: "Fermer le fichier" +}; ADDED applications/admin/static/edit_area/langs/hr.js Index: applications/admin/static/edit_area/langs/hr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/hr.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["hr"]={ +new_document: "Novi dokument", +search_button: "Traži i izmijeni", +search_command: "Traži dalje / Otvori prozor za traženje", +search: "Traži", +replace: "Izmijeni", +replace_command: "Izmijeni / Otvori prozor za traženje", +find_next: "Traži dalje", +replace_all: "Izmjeni sve", +reg_exp: "Regularni izrazi", +match_case: "Bitna vel. slova", +not_found: "nije naðeno.", +occurrence_replaced: "izmjenjenih.", +search_field_empty: "Prazno polje za traženje!", +restart_search_at_begin: "Došao do kraja. Poèeo od poèetka.", +move_popup: "Pomakni prozor", +font_size: "--Velièina teksta--", +go_to_line: "Odi na redak", +go_to_line_prompt: "Odi na redak:", +undo: "Vrati natrag", +redo: "Napravi ponovo", +change_smooth_selection: "Ukljuèi/iskljuèi neke moguænosti prikaza (pametniji prikaz, ali zagušeniji CPU)", +highlight: "Ukljuèi/iskljuèi bojanje sintakse", +reset_highlight: "Ponovi kolorizaciju (ako je nesinkronizirana s tekstom)", +word_wrap: "toggle word wrapping mode", +help: "O edit_area", +save: "Spremi", +load: "Uèitaj", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozicija", +total: "Ukupno", +close_popup: "Zatvori prozor", +shortcuts: "Kratice", +add_tab: "Dodaj tabulaciju", +remove_tab: "Makni tabulaciju", +about_notice: "Napomena: koloriziranje sintakse je samo za kratke kodove", +toggle: "Prebaci naèin ureðivanja", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Procesiram...", +fullscreen: "Cijeli prozor", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/it.js Index: applications/admin/static/edit_area/langs/it.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/it.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["it"]={ +new_document: "nuovo documento vuoto", +search_button: "cerca e sostituisci", +search_command: "trova successivo / apri finestra di ricerca", +search: "cerca", +replace: "sostituisci", +replace_command: "sostituisci / apri finestra di ricerca", +find_next: "trova successivo", +replace_all: "sostituisci tutti", +reg_exp: "espressioni regolari", +match_case: "confronta maiuscole/minuscole
", +not_found: "non trovato.", +occurrence_replaced: "occorrenze sostituite.", +search_field_empty: "Campo ricerca vuoto", +restart_search_at_begin: "Fine del testo raggiunta. Ricomincio dall'inizio.", +move_popup: "sposta popup di ricerca", +font_size: "-- Dimensione --", +go_to_line: "vai alla linea", +go_to_line_prompt: "vai alla linea numero:", +undo: "annulla", +redo: "ripeti", +change_smooth_selection: "abilita/disabilita alcune caratteristiche della visualizzazione", +highlight: "abilita/disabilita colorazione della sintassi", +reset_highlight: "aggiorna colorazione (se non sincronizzata)", +word_wrap: "toggle word wrapping mode", +help: "informazioni su...", +save: "salva", +load: "carica", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posizione", +total: "Totale", +close_popup: "chiudi popup", +shortcuts: "Scorciatoie", +add_tab: "aggiungi tabulazione", +remove_tab: "rimuovi tabulazione", +about_notice: "Avviso: la colorazione della sintassi vale solo con testo piccolo", +toggle: "Abilita/disabilita editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In corso...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/ja.js Index: applications/admin/static/edit_area/langs/ja.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/ja.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["ja"]={ +new_document: "新規作成", +search_button: "検索・置換", +search_command: "次を検索 / 検索窓を表示", +search: "検索", +replace: "置換", +replace_command: "置換 / 置換窓を表示", +find_next: "次を検索", +replace_all: "全置換", +reg_exp: "正規表現", +match_case: "大文字小文字の区別", +not_found: "見つかりません。", +occurrence_replaced: "置換しました。", +search_field_empty: "検索対象文字列が空です。", +restart_search_at_begin: "終端に達しました、始めに戻ります", +move_popup: "検索窓を移動", +font_size: "--フォントサイズ--", +go_to_line: "指定行へ移動", +go_to_line_prompt: "指定行へ移動します:", +undo: "元に戻す", +redo: "やり直し", +change_smooth_selection: "スムース表示の切り替え(CPUを使います)", +highlight: "構文強調表示の切り替え", +reset_highlight: "構文強調表示のリセット", +word_wrap: "toggle word wrapping mode", +help: "ヘルプを表示", +save: "保存", +load: "読み込み", +line_abbr: "行", +char_abbr: "文字", +position: "位置", +total: "合計", +close_popup: "ポップアップを閉じる", +shortcuts: "ショートカット", +add_tab: "タブを挿入する", +remove_tab: "タブを削除する", +about_notice: "注意:構文強調表示は短いテキストでしか有効に機能しません。", +toggle: "テキストエリアとeditAreaの切り替え", +accesskey: "アクセスキー", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "処理中です...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/mk.js Index: applications/admin/static/edit_area/langs/mk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/mk.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["mk"]={ +new_document: "Нов документ", +search_button: "Најди и замени", +search_command: "Барај следно / Отвори нов прозорец за пребарување", +search: "Барај", +replace: "Замени", +replace_command: "Замени / Отвори прозорец за пребарување", +find_next: "најди следно", +replace_all: "Замени ги сите", +reg_exp: "Регуларни изрази", +match_case: "Битна е големината на буквите", +not_found: "не е пронајдено.", +occurrence_replaced: "замени.", +search_field_empty: "Полето за пребарување е празно", +restart_search_at_begin: "Крај на областа. Стартувај од почеток.", +move_popup: "Помести го прозорецот", +font_size: "--Големина на текстот--", +go_to_line: "Оди на линија", +go_to_line_prompt: "Оди на линија со број:", +undo: "Врати", +redo: "Повтори", +change_smooth_selection: "Вклучи/исклучи некои карактеристики за приказ (попаметен приказ, но поголемо оптеретување за процесорот)", +highlight: "Вклучи/исклучи осветлување на синтакса", +reset_highlight: "Ресетирај го осветлувањето на синтакса (доколку е десинхронизиранo со текстот)", +word_wrap: "toggle word wrapping mode", +help: "За", +save: "Зачувај", +load: "Вчитај", +line_abbr: "Лн", +char_abbr: "Зн", +position: "Позиција", +total: "Вкупно", +close_popup: "Затвори го прозорецот", +shortcuts: "Кратенки", +add_tab: "Додај табулација на текстот", +remove_tab: "Отстрани ја табулацијата", +about_notice: "Напомена: Осветлувањето на синтанса е само за краток текст", +toggle: "Смени начин на уредување", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Обработувам...", +fullscreen: "Цел прозорец", +syntax_selection: "--Синтакса--", +close_tab: "Избери датотека" +}; ADDED applications/admin/static/edit_area/langs/nl.js Index: applications/admin/static/edit_area/langs/nl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/nl.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["nl"]={ +new_document: "nieuw leeg document", +search_button: "zoek en vervang", +search_command: "zoek volgende / zoekscherm openen", +search: "zoek", +replace: "vervang", +replace_command: "vervang / zoekscherm openen", +find_next: "volgende vinden", +replace_all: "alles vervangen", +reg_exp: "reguliere expressies", +match_case: "hoofdletter gevoelig", +not_found: "niet gevonden.", +occurrence_replaced: "object vervangen.", +search_field_empty: "Zoek veld leeg", +restart_search_at_begin: "Niet meer instanties gevonden, begin opnieuw", +move_popup: "versleep zoek scherm", +font_size: "--Letter grootte--", +go_to_line: "Ga naar regel", +go_to_line_prompt: "Ga naar regel nummer:", +undo: "Ongedaan maken", +redo: "Opnieuw doen", +change_smooth_selection: "zet wat schermopties aan/uit (kan langzamer zijn)", +highlight: "zet syntax highlight aan/uit", +reset_highlight: "reset highlight (indien gedesynchronizeerd)", +word_wrap: "toggle word wrapping mode", +help: "informatie", +save: "opslaan", +load: "laden", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Positie", +total: "Totaal", +close_popup: "Popup sluiten", +shortcuts: "Snelkoppelingen", +add_tab: "voeg tabs toe in tekst", +remove_tab: "verwijder tabs uit tekst", +about_notice: "Notitie: syntax highlight functie is alleen voor kleine tekst", +toggle: "geavanceerde bewerkingsopties", +accesskey: "Accessknop", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Verwerken...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/pl.js Index: applications/admin/static/edit_area/langs/pl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/pl.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["pl"]={ +new_document: "nowy dokument", +search_button: "znajdź i zamień", +search_command: "znajdź następny", +search: "znajdź", +replace: "zamień", +replace_command: "zamień", +find_next: "następny", +replace_all: "zamień wszystko", +reg_exp: "wyrażenie regularne", +match_case: "uwzględnij wielkość liter
", +not_found: "nie znaleziono.", +occurrence_replaced: "wystąpień zamieniono.", +search_field_empty: "Nie wprowadzono tekstu", +restart_search_at_begin: "Koniec dokumentu. Wyszukiwanie od początku.", +move_popup: "przesuń okienko wyszukiwania", +font_size: "Rozmiar", +go_to_line: "idź do linii", +go_to_line_prompt: "numer linii:", +undo: "cofnij", +redo: "przywróć", +change_smooth_selection: "włącz/wyłącz niektóre opcje wyglądu (zaawansowane opcje wyglądu obciążają procesor)", +highlight: "włącz/wyłącz podświetlanie składni", +reset_highlight: "odśwież podświetlanie składni (jeśli rozsynchronizowało się z tekstem)", +word_wrap: "toggle word wrapping mode", +help: "o programie", +save: "zapisz", +load: "otwórz", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozycja", +total: "W sumie", +close_popup: "zamknij okienko", +shortcuts: "Skróty klawiaturowe", +add_tab: "dodaj wcięcie do zaznaczonego tekstu", +remove_tab: "usuń wcięcie", +about_notice: "Uwaga: podświetlanie składni nie jest zalecane dla długich tekstów", +toggle: "Włącz/wyłącz edytor", +accesskey: "Alt+", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Przetwarzanie...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/pt.js Index: applications/admin/static/edit_area/langs/pt.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/pt.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["pt"]={ +new_document: "Novo documento", +search_button: "Localizar e substituir", +search_command: "Localizar próximo", +search: "Localizar", +replace: "Substituir", +replace_command: "Substituir", +find_next: "Localizar", +replace_all: "Subst. tudo", +reg_exp: "Expressões regulares", +match_case: "Diferenciar maiúsculas e minúsculas", +not_found: "Não encontrado.", +occurrence_replaced: "Ocorrências substituidas", +search_field_empty: "Campo localizar vazio.", +restart_search_at_begin: "Fim das ocorrências. Recomeçar do inicio.", +move_popup: "Mover janela", +font_size: "--Tamanho da fonte--", +go_to_line: "Ir para linha", +go_to_line_prompt: "Ir para a linha:", +undo: "Desfazer", +redo: "Refazer", +change_smooth_selection: "Opções visuais", +highlight: "Cores de sintaxe", +reset_highlight: "Resetar cores (se não sincronizado)", +word_wrap: "toggle word wrapping mode", +help: "Sobre", +save: "Salvar", +load: "Carregar", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posição", +total: "Total", +close_popup: "Fechar", +shortcuts: "Shortcuts", +add_tab: "Adicionar tabulação", +remove_tab: "Remover tabulação", +about_notice: "Atenção: Cores de sintaxe são indicados somente para textos pequenos", +toggle: "Exibir editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processando...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/ru.js Index: applications/admin/static/edit_area/langs/ru.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/ru.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["ru"]={ +new_document: "новый пустой документ", +search_button: "поиск и замена", +search_command: "искать следующий / открыть панель поиска", +search: "поиск", +replace: "замена", +replace_command: "заменить / открыть панель поиска", +find_next: "найти следующее", +replace_all: "заменить все", +reg_exp: "регулярное выражение", +match_case: "учитывать регистр", +not_found: "не найдено.", +occurrence_replaced: "вхождение заменено.", +search_field_empty: "Поле поиска пустое", +restart_search_at_begin: "Достигнут конец документа. Начинаю с начала.", +move_popup: "переместить окно поиска", +font_size: "--Размер шрифта--", +go_to_line: "перейти к строке", +go_to_line_prompt: "перейти к строке номер:", +undo: "отменить", +redo: "вернуть", +change_smooth_selection: "включить/отключить некоторые функции просмотра (более красиво, но больше использует процессор)", +highlight: "переключить подсветку синтаксиса включена/выключена", +reset_highlight: "восстановить подсветку (если разсинхронизирована от текста)", +word_wrap: "toggle word wrapping mode", +help: "о программе", +save: "сохранить", +load: "загрузить", +line_abbr: "Стр", +char_abbr: "Стлб", +position: "Позиция", +total: "Всего", +close_popup: "закрыть всплывающее окно", +shortcuts: "Горячие клавиши", +add_tab: "добавить табуляцию в текст", +remove_tab: "убрать табуляцию из текста", +about_notice: "Внимание: функция подсветки синтаксиса только для небольших текстов", +toggle: "Переключить редактор", +accesskey: "Горячая клавиша", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Обработка...", +fullscreen: "полный экран", +syntax_selection: "--Синтакс--", +close_tab: "Закрыть файл" +}; ADDED applications/admin/static/edit_area/langs/sk.js Index: applications/admin/static/edit_area/langs/sk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/sk.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["sk"]={ +new_document: "nový prázdy dokument", +search_button: "vyhľadaj a nahraď", +search_command: "hľadaj ďalsšie / otvor vyhľadávacie pole", +search: "hľadaj", +replace: "nahraď", +replace_command: "nahraď / otvor vyhľadávacie pole", +find_next: "nájdi ďalšie", +replace_all: "nahraď všetko", +reg_exp: "platné výrazy", +match_case: "zhodujúce sa výrazy", +not_found: "nenájdené.", +occurrence_replaced: "výskyty nahradené.", +search_field_empty: "Pole vyhľadávanie je prádzne", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "presuň vyhľadávacie okno", +font_size: "--Veľkosť textu--", +go_to_line: "prejdi na riadok", +go_to_line_prompt: "prejdi na riadok:", +undo: "krok späť", +redo: "prepracovať", +change_smooth_selection: "povoliť/zamietnúť niektoré zo zobrazených funkcií (účelnejšie zobrazenie vyžaduje väčšie zaťaženie procesora CPU)", +highlight: "prepnúť zvýrazňovanie syntaxe zap/vyp", +reset_highlight: "zrušiť zvýrazňovanie (ak je nesynchronizované s textom)", +word_wrap: "toggle word wrapping mode", +help: "o programe", +save: "uložiť", +load: "načítať", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Pozícia", +total: "Spolu", +close_popup: "zavrieť okno", +shortcuts: "Skratky", +add_tab: "pridať tabulovanie textu", +remove_tab: "odstrániť tabulovanie textu", +about_notice: "Upozornenie: funkcia zvýrazňovania syntaxe je dostupná iba pre malý text", +toggle: "Prepnúť editor", +accesskey: "Accesskey", +tab: "Záložka", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Spracúvam...", +fullscreen: "cel=a obrazovka", +syntax_selection: "--Vyber Syntax--", +close_tab: "Close file" +}; ADDED applications/admin/static/edit_area/langs/zh.js Index: applications/admin/static/edit_area/langs/zh.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/langs/zh.js @@ -0,0 +1,48 @@ +editAreaLoader.lang["zh"]={ +new_document: "新建空白文档", +search_button: "查找与替换", +search_command: "查找下一个 / 打开查找框", +search: "查找", +replace: "替换", +replace_command: "替换 / 打开查找框", +find_next: "查找下一个", +replace_all: "全部替换", +reg_exp: "正则表达式", +match_case: "匹配大小写", +not_found: "未找到.", +occurrence_replaced: "处被替换.", +search_field_empty: "查找框没有内容", +restart_search_at_begin: "已到到文档末尾. 从头重新查找.", +move_popup: "移动查找对话框", +font_size: "--字体大小--", +go_to_line: "转到行", +go_to_line_prompt: "转到行:", +undo: "恢复", +redo: "重做", +change_smooth_selection: "启用/禁止一些显示特性(更好看但更耗费资源)", +highlight: "启用/禁止语法高亮", +reset_highlight: "重置语法高亮(当文本显示不同步时)", +word_wrap: "toggle word wrapping mode", +help: "关于", +save: "保存", +load: "加载", +line_abbr: "行", +char_abbr: "字符", +position: "位置", +total: "总计", +close_popup: "关闭对话框", +shortcuts: "快捷键", +add_tab: "添加制表符(Tab)", +remove_tab: "移除制表符(Tab)", +about_notice: "注意:语法高亮功能仅用于较少内容的文本(文件内容太大会导致浏览器反应慢)", +toggle: "切换编辑器", +accesskey: "快捷键", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "正在处理中...", +fullscreen: "全屏编辑", +syntax_selection: "--语法--", +close_tab: "关闭文件" +}; ADDED applications/admin/static/edit_area/license.txt Index: applications/admin/static/edit_area/license.txt ================================================================== --- /dev/null +++ applications/admin/static/edit_area/license.txt ADDED applications/admin/static/edit_area/license_apache.txt Index: applications/admin/static/edit_area/license_apache.txt ================================================================== --- /dev/null +++ applications/admin/static/edit_area/license_apache.txt @@ -0,0 +1,7 @@ +Copyright 2008 Christophe Dolivet + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ADDED applications/admin/static/edit_area/license_bsd.txt Index: applications/admin/static/edit_area/license_bsd.txt ================================================================== --- /dev/null +++ applications/admin/static/edit_area/license_bsd.txt @@ -0,0 +1,10 @@ +Copyright (c) 2008, Christophe Dolivet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of EditArea nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ADDED applications/admin/static/edit_area/license_lgpl.txt Index: applications/admin/static/edit_area/license_lgpl.txt ================================================================== --- /dev/null +++ applications/admin/static/edit_area/license_lgpl.txt @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS ADDED applications/admin/static/edit_area/manage_area.js Index: applications/admin/static/edit_area/manage_area.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/manage_area.js @@ -0,0 +1,623 @@ + EditArea.prototype.focus = function() { + this.textarea.focus(); + this.textareaFocused=true; + }; + + + EditArea.prototype.check_line_selection= function(timer_checkup){ + var changes, infos, new_top, new_width,i; + + var t1=t2=t2_1=t3=tLines=tend= new Date().getTime(); + // l'editeur n'existe plus => on quitte + if(!editAreas[this.id]) + return false; + + if(!this.smooth_selection && !this.do_highlight) + { + //do nothing + } + else if(this.textareaFocused && editAreas[this.id]["displayed"]==true && this.isResizing==false) + { + infos = this.get_selection_infos(); + changes = this.checkTextEvolution( typeof( this.last_selection['full_text'] ) == 'undefined' ? '' : this.last_selection['full_text'], infos['full_text'] ); + + t2= new Date().getTime(); + + // if selection change + if(this.last_selection["line_start"] != infos["line_start"] || this.last_selection["line_nb"] != infos["line_nb"] || infos["full_text"] != this.last_selection["full_text"] || this.reload_highlight || this.last_selection["selectionStart"] != infos["selectionStart"] || this.last_selection["selectionEnd"] != infos["selectionEnd"] || !timer_checkup ) + { + // move and adjust text selection elements + new_top = this.getLinePosTop( infos["line_start"] ); + new_width = Math.max(this.textarea.scrollWidth, this.container.clientWidth -50); + this.selection_field.style.top=this.selection_field_text.style.top=new_top+"px"; + if(!this.settings['word_wrap']){ + this.selection_field.style.width=this.selection_field_text.style.width=this.test_font_size.style.width=new_width+"px"; + } + + // usefull? => _$("cursor_pos").style.top=new_top+"px"; + + if(this.do_highlight==true) + { + // fill selection elements + var curr_text = infos["full_text"].split("\n"); + var content = ""; + //alert("length: "+curr_text.length+ " i: "+ Math.max(0,infos["line_start"]-1)+ " end: "+Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1)+ " line: "+infos["line_start"]+" [0]: "+curr_text[0]+" [1]: "+curr_text[1]); + var start = Math.max(0,infos["line_start"]-1); + var end = Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1); + + //curr_text[start]= curr_text[start].substr(0,infos["curr_pos"]-1) +"¤_overline_¤"+ curr_text[start].substr(infos["curr_pos"]-1); + for(i=start; i< end; i++){ + content+= curr_text[i]+"\n"; + } + + // add special chars arround selected characters + selLength = infos['selectionEnd'] - infos['selectionStart']; + content = content.substr( 0, infos["curr_pos"] - 1 ) + "\r\r" + content.substr( infos["curr_pos"] - 1, selLength ) + "\r\r" + content.substr( infos["curr_pos"] - 1 + selLength ); + content = ''+ content.replace(/&/g,"&").replace(//g,">").replace("\r\r", '').replace("\r\r", '') +''; + + if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) { + this.selection_field.innerHTML= "
" + content.replace(/^\r?\n/, "
") + "
"; + } else { + this.selection_field.innerHTML= content; + } + this.selection_field_text.innerHTML = this.selection_field.innerHTML; + t2_1 = new Date().getTime(); + // check if we need to update the highlighted background + if(this.reload_highlight || (infos["full_text"] != this.last_text_to_highlight && (this.last_selection["line_start"]!=infos["line_start"] || this.show_line_colors || this.settings['word_wrap'] || this.last_selection["line_nb"]!=infos["line_nb"] || this.last_selection["nb_line"]!=infos["nb_line"]) ) ) + { + this.maj_highlight(infos); + } + } + } + t3= new Date().getTime(); + + // manage line heights + if( this.settings['word_wrap'] && infos["full_text"] != this.last_selection["full_text"]) + { + // refresh only 1 line if text change concern only one line and that the total line number has not changed + if( changes.newText.split("\n").length == 1 && this.last_selection['nb_line'] && infos['nb_line'] == this.last_selection['nb_line'] ) + { + this.fixLinesHeight( infos['full_text'], changes.lineStart, changes.lineStart ); + } + else + { + this.fixLinesHeight( infos['full_text'], changes.lineStart, -1 ); + } + } + + tLines= new Date().getTime(); + // manage bracket finding + if( infos["line_start"] != this.last_selection["line_start"] || infos["curr_pos"] != this.last_selection["curr_pos"] || infos["full_text"].length!=this.last_selection["full_text"].length || this.reload_highlight || !timer_checkup ) + { + // move _cursor_pos + var selec_char= infos["curr_line"].charAt(infos["curr_pos"]-1); + var no_real_move=true; + if(infos["line_nb"]==1 && (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]) ){ + + no_real_move=false; + //findEndBracket(infos["line_start"], infos["curr_pos"], selec_char); + if(this.findEndBracket(infos, selec_char) === true){ + _$("end_bracket").style.visibility ="visible"; + _$("cursor_pos").style.visibility ="visible"; + _$("cursor_pos").innerHTML = selec_char; + _$("end_bracket").innerHTML = (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]); + }else{ + _$("end_bracket").style.visibility ="hidden"; + _$("cursor_pos").style.visibility ="hidden"; + } + }else{ + _$("cursor_pos").style.visibility ="hidden"; + _$("end_bracket").style.visibility ="hidden"; + } + //alert("move cursor"); + this.displayToCursorPosition("cursor_pos", infos["line_start"], infos["curr_pos"]-1, infos["curr_line"], no_real_move); + if(infos["line_nb"]==1 && infos["line_start"]!=this.last_selection["line_start"]) + this.scroll_to_view(); + } + this.last_selection=infos; + } + + tend= new Date().getTime(); + //if( (tend-t1) > 7 ) + // console.log( "tps total: "+ (tend-t1) + " tps get_infos: "+ (t2-t1)+ " tps selec: "+ (t2_1-t2)+ " tps highlight: "+ (t3-t2_1) +" tps lines: "+ (tLines-t3) +" tps cursor+lines: "+ (tend-tLines)+" \n" ); + + + if(timer_checkup){ + setTimeout("editArea.check_line_selection(true)", this.check_line_selection_timer); + } + }; + + + EditArea.prototype.get_selection_infos= function(){ + var sel={}, start, end, len, str; + + this.getIESelection(); + start = this.textarea.selectionStart; + end = this.textarea.selectionEnd; + + if( this.last_selection["selectionStart"] == start && this.last_selection["selectionEnd"] == end && this.last_selection["full_text"] == this.textarea.value ) + { + return this.last_selection; + } + + if(this.tabulation!="\t" && this.textarea.value.indexOf("\t")!=-1) + { // can append only after copy/paste + len = this.textarea.value.length; + this.textarea.value = this.replace_tab(this.textarea.value); + start = end = start+(this.textarea.value.length-len); + this.area_select( start, 0 ); + } + + sel["selectionStart"] = start; + sel["selectionEnd"] = end; + sel["full_text"] = this.textarea.value; + sel["line_start"] = 1; + sel["line_nb"] = 1; + sel["curr_pos"] = 0; + sel["curr_line"] = ""; + sel["indexOfCursor"] = 0; + sel["selec_direction"] = this.last_selection["selec_direction"]; + + //return sel; + var splitTab= sel["full_text"].split("\n"); + var nbLine = Math.max(0, splitTab.length); + var nbChar = Math.max(0, sel["full_text"].length - (nbLine - 1)); // (remove \n caracters from the count) + if( sel["full_text"].indexOf("\r") != -1 ) + nbChar = nbChar - ( nbLine - 1 ); // (remove \r caracters from the count) + sel["nb_line"] = nbLine; + sel["nb_char"] = nbChar; + + if(start>0){ + str = sel["full_text"].substr(0,start); + sel["curr_pos"] = start - str.lastIndexOf("\n"); + sel["line_start"] = Math.max(1, str.split("\n").length); + }else{ + sel["curr_pos"]=1; + } + if(end>start){ + sel["line_nb"]=sel["full_text"].substring(start,end).split("\n").length; + } + sel["indexOfCursor"]=start; + sel["curr_line"]=splitTab[Math.max(0,sel["line_start"]-1)]; + + // determine in which direction the selection grow + if(sel["selectionStart"] == this.last_selection["selectionStart"]){ + if(sel["selectionEnd"]>this.last_selection["selectionEnd"]) + sel["selec_direction"]= "down"; + else if(sel["selectionEnd"] == this.last_selection["selectionStart"]) + sel["selec_direction"]= this.last_selection["selec_direction"]; + }else if(sel["selectionStart"] == this.last_selection["selectionEnd"] && sel["selectionEnd"]>this.last_selection["selectionEnd"]){ + sel["selec_direction"]= "down"; + }else{ + sel["selec_direction"]= "up"; + } + + _$("nbLine").innerHTML = nbLine; + _$("nbChar").innerHTML = nbChar; + _$("linePos").innerHTML = sel["line_start"]; + _$("currPos").innerHTML = sel["curr_pos"]; + + return sel; + }; + + // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd) + EditArea.prototype.getIESelection= function(){ + var selectionStart, selectionEnd, range, stored_range; + + if( !this.isIE ) + return false; + + // make it work as nowrap mode (easier for range manipulation with lineHeight) + if( this.settings['word_wrap'] ) + this.textarea.wrap='off'; + + try{ + range = document.selection.createRange(); + stored_range = range.duplicate(); + stored_range.moveToElementText( this.textarea ); + stored_range.setEndPoint( 'EndToEnd', range ); + if( stored_range.parentElement() != this.textarea ) + throw "invalid focus"; + + // the range don't take care of empty lines in the end of the selection + var scrollTop = this.result.scrollTop + document.body.scrollTop; + var relative_top= range.offsetTop - parent.calculeOffsetTop(this.textarea) + scrollTop; + var line_start = Math.round((relative_top / this.lineHeight) +1); + var line_nb = Math.round( range.boundingHeight / this.lineHeight ); + + selectionStart = stored_range.text.length - range.text.length; + selectionStart += ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length)*2; // count missing empty \r to the selection + selectionStart -= ( line_start - this.textarea.value.substr(0, selectionStart).split("\n").length ) * 2; + + selectionEnd = selectionStart + range.text.length; + selectionEnd += (line_start + line_nb - 1 - this.textarea.value.substr(0, selectionEnd ).split("\n").length)*2; + + this.textarea.selectionStart = selectionStart; + this.textarea.selectionEnd = selectionEnd; + } + catch(e){} + + // restore wrap mode + if( this.settings['word_wrap'] ) + this.textarea.wrap='soft'; + }; + + // select the text for IE (and take care of \r caracters) + EditArea.prototype.setIESelection= function(){ + var a = this.textarea, nbLineStart, nbLineEnd, range; + + if( !this.isIE ) + return false; + + nbLineStart = a.value.substr(0, a.selectionStart).split("\n").length - 1; + nbLineEnd = a.value.substr(0, a.selectionEnd).split("\n").length - 1; + range = document.selection.createRange(); + range.moveToElementText( a ); + range.setEndPoint( 'EndToStart', range ); + + range.moveStart('character', a.selectionStart - nbLineStart); + range.moveEnd('character', a.selectionEnd - nbLineEnd - (a.selectionStart - nbLineStart) ); + range.select(); + }; + + + + EditArea.prototype.checkTextEvolution=function(lastText,newText){ + // ch will contain changes datas + var ch={},baseStep=200, cpt=0, end, step,tStart=new Date().getTime(); + + end = Math.min(newText.length, lastText.length); + step = baseStep; + // find how many chars are similar at the begin of the text + while( cpt=1 ){ + if(lastText.substr(cpt, step) == newText.substr(cpt, step)){ + cpt+= step; + }else{ + step= Math.floor(step/2); + } + } + + ch.posStart = cpt; + ch.lineStart= newText.substr(0, ch.posStart).split("\n").length -1; + + cpt_last = lastText.length; + cpt = newText.length; + step = baseStep; + // find how many chars are similar at the end of the text + while( cpt>=0 && cpt_last>=0 && step>=1 ){ + if(lastText.substr(cpt_last-step, step) == newText.substr(cpt-step, step)){ + cpt-= step; + cpt_last-= step; + }else{ + step= Math.floor(step/2); + } + } + + ch.posNewEnd = cpt; + ch.posLastEnd = cpt_last; + if(ch.posNewEnd<=ch.posStart){ + if(lastText.length < newText.length){ + ch.posNewEnd= ch.posStart + newText.length - lastText.length; + ch.posLastEnd= ch.posStart; + }else{ + ch.posLastEnd= ch.posStart + lastText.length - newText.length; + ch.posNewEnd= ch.posStart; + } + } + ch.newText = newText.substring(ch.posStart, ch.posNewEnd); + ch.lastText = lastText.substring(ch.posStart, ch.posLastEnd); + + ch.lineNewEnd = newText.substr(0, ch.posNewEnd).split("\n").length -1; + ch.lineLastEnd = lastText.substr(0, ch.posLastEnd).split("\n").length -1; + + ch.newTextLine = newText.split("\n").slice(ch.lineStart, ch.lineNewEnd+1).join("\n"); + ch.lastTextLine = lastText.split("\n").slice(ch.lineStart, ch.lineLastEnd+1).join("\n"); + //console.log( ch ); + return ch; + }; + + EditArea.prototype.tab_selection= function(){ + if(this.is_tabbing) + return; + this.is_tabbing=true; + //infos=getSelectionInfos(); + //if( document.selection ){ + this.getIESelection(); + /* Insertion du code de formatage */ + var start = this.textarea.selectionStart; + var end = this.textarea.selectionEnd; + var insText = this.textarea.value.substring(start, end); + + /* Insert tabulation and ajust cursor position */ + var pos_start=start; + var pos_end=end; + if (insText.length == 0) { + // if only one line selected + this.textarea.value = this.textarea.value.substr(0, start) + this.tabulation + this.textarea.value.substr(end); + pos_start = start + this.tabulation.length; + pos_end=pos_start; + } else { + start= Math.max(0, this.textarea.value.substr(0, start).lastIndexOf("\n")+1); + endText=this.textarea.value.substr(end); + startText=this.textarea.value.substr(0, start); + tmp= this.textarea.value.substring(start, end).split("\n"); + insText= this.tabulation+tmp.join("\n"+this.tabulation); + this.textarea.value = startText + insText + endText; + pos_start = start; + pos_end= this.textarea.value.indexOf("\n", startText.length + insText.length); + if(pos_end==-1) + pos_end=this.textarea.value.length; + //pos = start + repdeb.length + insText.length + ; + } + this.textarea.selectionStart = pos_start; + this.textarea.selectionEnd = pos_end; + + //if( document.selection ){ + if(this.isIE) + { + this.setIESelection(); + setTimeout("editArea.is_tabbing=false;", 100); // IE can't accept to make 2 tabulation without a little break between both + } + else + { + this.is_tabbing=false; + } + + }; + + EditArea.prototype.invert_tab_selection= function(){ + var t=this, a=this.textarea; + if(t.is_tabbing) + return; + t.is_tabbing=true; + //infos=getSelectionInfos(); + //if( document.selection ){ + t.getIESelection(); + + var start = a.selectionStart; + var end = a.selectionEnd; + var insText = a.value.substring(start, end); + + /* Tab remove and cursor seleciton adjust */ + var pos_start=start; + var pos_end=end; + if (insText.length == 0) { + if(a.value.substring(start-t.tabulation.length, start)==t.tabulation) + { + a.value = a.value.substr(0, start-t.tabulation.length) + a.value.substr(end); + pos_start = Math.max(0, start-t.tabulation.length); + pos_end = pos_start; + } + /* + a.value = a.value.substr(0, start) + t.tabulation + insText + a.value.substr(end); + pos_start = start + t.tabulation.length; + pos_end=pos_start;*/ + } else { + start = a.value.substr(0, start).lastIndexOf("\n")+1; + endText = a.value.substr(end); + startText = a.value.substr(0, start); + tmp = a.value.substring(start, end).split("\n"); + insText = ""; + for(i=0; i=0; ){ + if(infos["full_text"].charAt(i)==endBracket){ + nbBracketOpen--; + if(nbBracketOpen<=0){ + //i=infos["full_text"].length; + end=i; + break; + } + }else if(infos["full_text"].charAt(i)==bracket) + nbBracketOpen++; + if(normal_order) + i++; + else + i--; + } + + //end=infos["full_text"].indexOf("}", start); + if(end==-1) + return false; + var endLastLine=infos["full_text"].substr(0, end).lastIndexOf("\n"); + if(endLastLine==-1) + line=1; + else + line= infos["full_text"].substr(0, endLastLine).split("\n").length + 1; + + var curPos= end - endLastLine - 1; + var endLineLength = infos["full_text"].substring(end).split("\n")[0].length; + this.displayToCursorPosition("end_bracket", line, curPos, infos["full_text"].substring(endLastLine +1, end + endLineLength)); + return true; + }; + + EditArea.prototype.displayToCursorPosition= function(id, start_line, cur_pos, lineContent, no_real_move){ + var elem,dest,content,posLeft=0,posTop,fixPadding,topOffset,endElem; + + elem = this.test_font_size; + dest = _$(id); + content = ""+lineContent.substr(0, cur_pos).replace(/&/g,"&").replace(/"+lineContent.substr(cur_pos).replace(/&/g,"&").replace(/"; + if( this.isIE || ( this.isOpera && this.isOpera < 9.6 ) ) { + elem.innerHTML= "
" + content.replace(/^\r?\n/, "
") + "
"; + } else { + elem.innerHTML= content; + } + + + endElem = _$('endTestFont'); + topOffset = endElem.offsetTop; + fixPadding = parseInt( this.content_highlight.style.paddingLeft.replace("px", "") ); + posLeft = 45 + endElem.offsetLeft + ( !isNaN( fixPadding ) && topOffset > 0 ? fixPadding : 0 ); + posTop = this.getLinePosTop( start_line ) + topOffset;// + Math.floor( ( endElem.offsetHeight - 1 ) / this.lineHeight ) * this.lineHeight; + + // detect the case where the span start on a line but has no display on it + if( this.isIE && cur_pos > 0 && endElem.offsetLeft == 0 ) + { + posTop += this.lineHeight; + } + if(no_real_move!=true){ // when the cursor is hidden no need to move him + dest.style.top=posTop+"px"; + dest.style.left=posLeft+"px"; + } + // usefull for smarter scroll + dest.cursor_top=posTop; + dest.cursor_left=posLeft; + // _$(id).style.marginLeft=posLeft+"px"; + }; + + EditArea.prototype.getLinePosTop= function(start_line){ + var elem= _$('line_'+ start_line), posTop=0; + if( elem ) + posTop = elem.offsetTop; + else + posTop = this.lineHeight * (start_line-1); + return posTop; + }; + + + // return the dislpayed height of a text (take word-wrap into account) + EditArea.prototype.getTextHeight= function(text){ + var t=this,elem,height; + elem = t.test_font_size; + content = text.replace(/&/g,"&").replace(/") + ""; + } else { + elem.innerHTML= content; + } + height = elem.offsetHeight; + height = Math.max( 1, Math.floor( elem.offsetHeight / this.lineHeight ) ) * this.lineHeight; + return height; + }; + + /** + * Fix line height for the given lines + * @param Integer linestart + * @param Integer lineEnd End line or -1 to cover all lines + */ + EditArea.prototype.fixLinesHeight= function( textValue, lineStart,lineEnd ){ + var aText = textValue.split("\n"); + if( lineEnd == -1 ) + lineEnd = aText.length-1; + for( var i = Math.max(0, lineStart); i <= lineEnd; i++ ) + { + if( elem = _$('line_'+ ( i+1 ) ) ) + { + elem.style.height= typeof( aText[i] ) != "undefined" ? this.getTextHeight( aText[i] )+"px" : this.lineHeight; + } + } + }; + + EditArea.prototype.area_select= function(start, length){ + this.textarea.focus(); + + start = Math.max(0, Math.min(this.textarea.value.length, start)); + end = Math.max(start, Math.min(this.textarea.value.length, start+length)); + + if(this.isIE) + { + this.textarea.selectionStart = start; + this.textarea.selectionEnd = end; + this.setIESelection(); + } + else + { + // Opera bug when moving selection start and selection end + if(this.isOpera && this.isOpera < 9.6 ) + { + this.textarea.setSelectionRange(0, 0); + } + this.textarea.setSelectionRange(start, end); + } + this.check_line_selection(); + }; + + + EditArea.prototype.area_get_selection= function(){ + var text=""; + if( document.selection ){ + var range = document.selection.createRange(); + text=range.text; + }else{ + text= this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd); + } + return text; + }; ADDED applications/admin/static/edit_area/plugins/charmap/charmap.js Index: applications/admin/static/edit_area/plugins/charmap/charmap.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/charmap.js @@ -0,0 +1,90 @@ +/** + * Charmap plugin + * by Christophe Dolivet + * v0.1 (2006/09/22) + * + * + * This plugin allow to use a visual keyboard allowing to insert any UTF-8 characters in the text. + * + * - plugin name to add to the plugin list: "charmap" + * - plugin name to add to the toolbar list: "charmap" + * - possible parameters to add to EditAreaLoader.init(): + * "charmap_default": (String) define the name of the default character range displayed on popup display + * (default: "arrows") + * + * + */ + +var EditArea_charmap= { + /** + * Get called once this file is loaded (editArea still not initialized) + * + * @return nothing + */ + init: function(){ + this.default_language="Arrows"; + } + + /** + * Returns the HTML code for a specific control string or false if this plugin doesn't have that control. + * A control can be a button, select list or any other HTML item to present in the EditArea user interface. + * Language variables such as {$lang_somekey} will also be replaced with contents from + * the language packs. + * + * @param {string} ctrl_name: the name of the control to add + * @return HTML code for a specific control or false. + * @type string or boolean + */ + ,get_control_html: function(ctrl_name){ + switch(ctrl_name){ + case "charmap": + // Control id, button img, command + return parent.editAreaLoader.get_button_html('charmap_but', 'charmap.gif', 'charmap_press', false, this.baseURL); + } + return false; + } + /** + * Get called once EditArea is fully loaded and initialised + * + * @return nothing + */ + ,onload: function(){ + if(editArea.settings["charmap_default"] && editArea.settings["charmap_default"].length>0) + this.default_language= editArea.settings["charmap_default"]; + } + + /** + * Is called each time the user touch a keyboard key. + * + * @param (event) e: the keydown event + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,onkeydown: function(e){ + + } + + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} cmd: the name of the command being executed + * @param {unknown} param: the parameter of the command + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,execCommand: function(cmd, param){ + // Handle commands + switch(cmd){ + case "charmap_press": + win= window.open(this.baseURL+"popup.html", "charmap", "width=500,height=270,scrollbars=yes,resizable=yes"); + win.focus(); + return false; + } + // Pass to next handler in chain + return true; + } + +}; + +// Adds the plugin class to the list of available EditArea plugins +editArea.add_plugin("charmap", EditArea_charmap); ADDED applications/admin/static/edit_area/plugins/charmap/css/charmap.css Index: applications/admin/static/edit_area/plugins/charmap/css/charmap.css ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/css/charmap.css @@ -0,0 +1,64 @@ +body{ + background-color: #F0F0EE; + font: 12px monospace, sans-serif; +} + +select{ + background-color: #F9F9F9; + border: solid 1px #888888; +} + +h1, h2, h3, h4, h5, h6{ + margin: 0; + padding: 0; + color: #2B6FB6; +} + +h1{ + font-size: 1.5em; +} + +div#char_list{ + height: 200px; + overflow: auto; + padding: 1px; + border: 1px solid #0A246A; + background-color: #F9F9F9; + clear: both; + margin-top: 5px; +} + +a.char{ + display: block; + float: left; + width: 20px; + height: 20px; + line-height: 20px; + margin: 1px; + border: solid 1px #888888; + text-align: center; + cursor: pointer; +} + +a.char:hover{ + background-color: #CCCCCC; +} + +.preview{ + border: solid 1px #888888; + width: 50px; + padding: 2px 5px; + height: 35px; + line-height: 35px; + text-align:center; + background-color: #CCCCCC; + font-size: 2em; + float: right; + font-weight: bold; + margin: 0 0 5px 5px; +} + +#preview_code{ + font-size: 1.1em; + width: 70px; +} ADDED applications/admin/static/edit_area/plugins/charmap/images/charmap.gif Index: applications/admin/static/edit_area/plugins/charmap/images/charmap.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/images/charmap.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/plugins/charmap/jscripts/map.js Index: applications/admin/static/edit_area/plugins/charmap/jscripts/map.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/jscripts/map.js @@ -0,0 +1,373 @@ +var editArea; + + +/** + * UTF-8 list taken from http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec + */ + + +/* +var char_range_list={ +"Basic Latin":"0021,007F", +"Latin-1 Supplement":"0080,00FF", +"Latin Extended-A":"0100,017F", +"Latin Extended-B":"0180,024F", +"IPA Extensions":"0250,02AF", +"Spacing Modifier Letters":"02B0,02FF", + +"Combining Diacritical Marks":"0300,036F", +"Greek and Coptic":"0370,03FF", +"Cyrillic":"0400,04FF", +"Cyrillic Supplement":"0500,052F", +"Armenian":"0530,058F", +"Hebrew":"0590,05FF", +"Arabic":"0600,06FF", +"Syriac":"0700,074F", +"Arabic Supplement":"0750,077F", + +"Thaana":"0780,07BF", +"Devanagari":"0900,097F", +"Bengali":"0980,09FF", +"Gurmukhi":"0A00,0A7F", +"Gujarati":"0A80,0AFF", +"Oriya":"0B00,0B7F", +"Tamil":"0B80,0BFF", +"Telugu":"0C00,0C7F", +"Kannada":"0C80,0CFF", + +"Malayalam":"0D00,0D7F", +"Sinhala":"0D80,0DFF", +"Thai":"0E00,0E7F", +"Lao":"0E80,0EFF", +"Tibetan":"0F00,0FFF", +"Myanmar":"1000,109F", +"Georgian":"10A0,10FF", +"Hangul Jamo":"1100,11FF", +"Ethiopic":"1200,137F", + +"Ethiopic Supplement":"1380,139F", +"Cherokee":"13A0,13FF", +"Unified Canadian Aboriginal Syllabics":"1400,167F", +"Ogham":"1680,169F", +"Runic":"16A0,16FF", +"Tagalog":"1700,171F", +"Hanunoo":"1720,173F", +"Buhid":"1740,175F", +"Tagbanwa":"1760,177F", + +"Khmer":"1780,17FF", +"Mongolian":"1800,18AF", +"Limbu":"1900,194F", +"Tai Le":"1950,197F", +"New Tai Lue":"1980,19DF", +"Khmer Symbols":"19E0,19FF", +"Buginese":"1A00,1A1F", +"Phonetic Extensions":"1D00,1D7F", +"Phonetic Extensions Supplement":"1D80,1DBF", + +"Combining Diacritical Marks Supplement":"1DC0,1DFF", +"Latin Extended Additional":"1E00,1EFF", +"Greek Extended":"1F00,1FFF", +"General Punctuation":"2000,206F", +"Superscripts and Subscripts":"2070,209F", +"Currency Symbols":"20A0,20CF", +"Combining Diacritical Marks for Symbols":"20D0,20FF", +"Letterlike Symbols":"2100,214F", +"Number Forms":"2150,218F", + +"Arrows":"2190,21FF", +"Mathematical Operators":"2200,22FF", +"Miscellaneous Technical":"2300,23FF", +"Control Pictures":"2400,243F", +"Optical Character Recognition":"2440,245F", +"Enclosed Alphanumerics":"2460,24FF", +"Box Drawing":"2500,257F", +"Block Elements":"2580,259F", +"Geometric Shapes":"25A0,25FF", + +"Miscellaneous Symbols":"2600,26FF", +"Dingbats":"2700,27BF", +"Miscellaneous Mathematical Symbols-A":"27C0,27EF", +"Supplemental Arrows-A":"27F0,27FF", +"Braille Patterns":"2800,28FF", +"Supplemental Arrows-B":"2900,297F", +"Miscellaneous Mathematical Symbols-B":"2980,29FF", +"Supplemental Mathematical Operators":"2A00,2AFF", +"Miscellaneous Symbols and Arrows":"2B00,2BFF", + +"Glagolitic":"2C00,2C5F", +"Coptic":"2C80,2CFF", +"Georgian Supplement":"2D00,2D2F", +"Tifinagh":"2D30,2D7F", +"Ethiopic Extended":"2D80,2DDF", +"Supplemental Punctuation":"2E00,2E7F", +"CJK Radicals Supplement":"2E80,2EFF", +"Kangxi Radicals":"2F00,2FDF", +"Ideographic Description Characters":"2FF0,2FFF", + +"CJK Symbols and Punctuation":"3000,303F", +"Hiragana":"3040,309F", +"Katakana":"30A0,30FF", +"Bopomofo":"3100,312F", +"Hangul Compatibility Jamo":"3130,318F", +"Kanbun":"3190,319F", +"Bopomofo Extended":"31A0,31BF", +"CJK Strokes":"31C0,31EF", +"Katakana Phonetic Extensions":"31F0,31FF", + +"Enclosed CJK Letters and Months":"3200,32FF", +"CJK Compatibility":"3300,33FF", +"CJK Unified Ideographs Extension A":"3400,4DBF", +"Yijing Hexagram Symbols":"4DC0,4DFF", +"CJK Unified Ideographs":"4E00,9FFF", +"Yi Syllables":"A000,A48F", +"Yi Radicals":"A490,A4CF", +"Modifier Tone Letters":"A700,A71F", +"Syloti Nagri":"A800,A82F", + +"Hangul Syllables":"AC00,D7AF", +"High Surrogates":"D800,DB7F", +"High Private Use Surrogates":"DB80,DBFF", +"Low Surrogates":"DC00,DFFF", +"Private Use Area":"E000,F8FF", +"CJK Compatibility Ideographs":"F900,FAFF", +"Alphabetic Presentation Forms":"FB00,FB4F", +"Arabic Presentation Forms-A":"FB50,FDFF", +"Variation Selectors":"FE00,FE0F", + +"Vertical Forms":"FE10,FE1F", +"Combining Half Marks":"FE20,FE2F", +"CJK Compatibility Forms":"FE30,FE4F", +"Small Form Variants":"FE50,FE6F", +"Arabic Presentation Forms-B":"FE70,FEFF", +"Halfwidth and Fullwidth Forms":"FF00,FFEF", +"Specials":"FFF0,FFFF", +"Linear B Syllabary":"10000,1007F", +"Linear B Ideograms":"10080,100FF", + +"Aegean Numbers":"10100,1013F", +"Ancient Greek Numbers":"10140,1018F", +"Old Italic":"10300,1032F", +"Gothic":"10330,1034F", +"Ugaritic":"10380,1039F", +"Old Persian":"103A0,103DF", +"Deseret":"10400,1044F", +"Shavian":"10450,1047F", +"Osmanya":"10480,104AF", + +"Cypriot Syllabary":"10800,1083F", +"Kharoshthi":"10A00,10A5F", +"Byzantine Musical Symbols":"1D000,1D0FF", +"Musical Symbols":"1D100,1D1FF", +"Ancient Greek Musical Notation":"1D200,1D24F", +"Tai Xuan Jing Symbols":"1D300,1D35F", +"Mathematical Alphanumeric Symbols":"1D400,1D7FF", +"CJK Unified Ideographs Extension B":"20000,2A6DF", +"CJK Compatibility Ideographs Supplement":"2F800,2FA1F", +"Tags":"E0000,E007F", +"Variation Selectors Supplement":"E0100,E01EF" +}; +*/ +var char_range_list={ +"Aegean Numbers":"10100,1013F", +"Alphabetic Presentation Forms":"FB00,FB4F", +"Ancient Greek Musical Notation":"1D200,1D24F", +"Ancient Greek Numbers":"10140,1018F", +"Arabic":"0600,06FF", +"Arabic Presentation Forms-A":"FB50,FDFF", +"Arabic Presentation Forms-B":"FE70,FEFF", +"Arabic Supplement":"0750,077F", +"Armenian":"0530,058F", +"Arrows":"2190,21FF", +"Basic Latin":"0020,007F", +"Bengali":"0980,09FF", +"Block Elements":"2580,259F", +"Bopomofo Extended":"31A0,31BF", +"Bopomofo":"3100,312F", +"Box Drawing":"2500,257F", +"Braille Patterns":"2800,28FF", +"Buginese":"1A00,1A1F", +"Buhid":"1740,175F", +"Byzantine Musical Symbols":"1D000,1D0FF", +"CJK Compatibility Forms":"FE30,FE4F", +"CJK Compatibility Ideographs Supplement":"2F800,2FA1F", +"CJK Compatibility Ideographs":"F900,FAFF", +"CJK Compatibility":"3300,33FF", +"CJK Radicals Supplement":"2E80,2EFF", +"CJK Strokes":"31C0,31EF", +"CJK Symbols and Punctuation":"3000,303F", +"CJK Unified Ideographs Extension A":"3400,4DBF", +"CJK Unified Ideographs Extension B":"20000,2A6DF", +"CJK Unified Ideographs":"4E00,9FFF", +"Cherokee":"13A0,13FF", +"Combining Diacritical Marks Supplement":"1DC0,1DFF", +"Combining Diacritical Marks for Symbols":"20D0,20FF", +"Combining Diacritical Marks":"0300,036F", +"Combining Half Marks":"FE20,FE2F", +"Control Pictures":"2400,243F", +"Coptic":"2C80,2CFF", +"Currency Symbols":"20A0,20CF", +"Cypriot Syllabary":"10800,1083F", +"Cyrillic Supplement":"0500,052F", +"Cyrillic":"0400,04FF", +"Deseret":"10400,1044F", +"Devanagari":"0900,097F", +"Dingbats":"2700,27BF", +"Enclosed Alphanumerics":"2460,24FF", +"Enclosed CJK Letters and Months":"3200,32FF", +"Ethiopic Extended":"2D80,2DDF", +"Ethiopic Supplement":"1380,139F", +"Ethiopic":"1200,137F", +"General Punctuation":"2000,206F", +"Geometric Shapes":"25A0,25FF", +"Georgian Supplement":"2D00,2D2F", +"Georgian":"10A0,10FF", +"Glagolitic":"2C00,2C5F", +"Gothic":"10330,1034F", +"Greek Extended":"1F00,1FFF", +"Greek and Coptic":"0370,03FF", +"Gujarati":"0A80,0AFF", +"Gurmukhi":"0A00,0A7F", +"Halfwidth and Fullwidth Forms":"FF00,FFEF", +"Hangul Compatibility Jamo":"3130,318F", +"Hangul Jamo":"1100,11FF", +"Hangul Syllables":"AC00,D7AF", +"Hanunoo":"1720,173F", +"Hebrew":"0590,05FF", +"High Private Use Surrogates":"DB80,DBFF", +"High Surrogates":"D800,DB7F", +"Hiragana":"3040,309F", +"IPA Extensions":"0250,02AF", +"Ideographic Description Characters":"2FF0,2FFF", +"Kanbun":"3190,319F", +"Kangxi Radicals":"2F00,2FDF", +"Kannada":"0C80,0CFF", +"Katakana Phonetic Extensions":"31F0,31FF", +"Katakana":"30A0,30FF", +"Kharoshthi":"10A00,10A5F", +"Khmer Symbols":"19E0,19FF", +"Khmer":"1780,17FF", +"Lao":"0E80,0EFF", +"Latin Extended Additional":"1E00,1EFF", +"Latin Extended-A":"0100,017F", +"Latin Extended-B":"0180,024F", +"Latin-1 Supplement":"0080,00FF", +"Letterlike Symbols":"2100,214F", +"Limbu":"1900,194F", +"Linear B Ideograms":"10080,100FF", +"Linear B Syllabary":"10000,1007F", +"Low Surrogates":"DC00,DFFF", +"Malayalam":"0D00,0D7F", +"Mathematical Alphanumeric Symbols":"1D400,1D7FF", +"Mathematical Operators":"2200,22FF", +"Miscellaneous Mathematical Symbols-A":"27C0,27EF", +"Miscellaneous Mathematical Symbols-B":"2980,29FF", +"Miscellaneous Symbols and Arrows":"2B00,2BFF", +"Miscellaneous Symbols":"2600,26FF", +"Miscellaneous Technical":"2300,23FF", +"Modifier Tone Letters":"A700,A71F", +"Mongolian":"1800,18AF", +"Musical Symbols":"1D100,1D1FF", +"Myanmar":"1000,109F", +"New Tai Lue":"1980,19DF", +"Number Forms":"2150,218F", +"Ogham":"1680,169F", +"Old Italic":"10300,1032F", +"Old Persian":"103A0,103DF", +"Optical Character Recognition":"2440,245F", +"Oriya":"0B00,0B7F", +"Osmanya":"10480,104AF", +"Phonetic Extensions Supplement":"1D80,1DBF", +"Phonetic Extensions":"1D00,1D7F", +"Private Use Area":"E000,F8FF", +"Runic":"16A0,16FF", +"Shavian":"10450,1047F", +"Sinhala":"0D80,0DFF", +"Small Form Variants":"FE50,FE6F", +"Spacing Modifier Letters":"02B0,02FF", +"Specials":"FFF0,FFFF", +"Superscripts and Subscripts":"2070,209F", +"Supplemental Arrows-A":"27F0,27FF", +"Supplemental Arrows-B":"2900,297F", +"Supplemental Mathematical Operators":"2A00,2AFF", +"Supplemental Punctuation":"2E00,2E7F", +"Syloti Nagri":"A800,A82F", +"Syriac":"0700,074F", +"Tagalog":"1700,171F", +"Tagbanwa":"1760,177F", +"Tags":"E0000,E007F", +"Tai Le":"1950,197F", +"Tai Xuan Jing Symbols":"1D300,1D35F", +"Tamil":"0B80,0BFF", +"Telugu":"0C00,0C7F", +"Thaana":"0780,07BF", +"Thai":"0E00,0E7F", +"Tibetan":"0F00,0FFF", +"Tifinagh":"2D30,2D7F", +"Ugaritic":"10380,1039F", +"Unified Canadian Aboriginal Syllabics":"1400,167F", +"Variation Selectors Supplement":"E0100,E01EF", +"Variation Selectors":"FE00,FE0F", +"Vertical Forms":"FE10,FE1F", +"Yi Radicals":"A490,A4CF", +"Yi Syllables":"A000,A48F", +"Yijing Hexagram Symbols":"4DC0,4DFF" +}; + +var insert="charmap_insert"; + +function map_load(){ + editArea=opener.editArea; + // translate the document + insert= editArea.get_translation(insert, "word"); + //alert(document.title); + document.title= editArea.get_translation(document.title, "template"); + document.body.innerHTML= editArea.get_translation(document.body.innerHTML, "template"); + //document.title= editArea.get_translation(document.getElementBytitle, "template"); + + var selected_lang=opener.EditArea_charmap.default_language.toLowerCase(); + var selected=0; + + var select= document.getElementById("select_range") + for(var i in char_range_list){ + if(i.toLowerCase()==selected_lang) + selected=select.options.length; + select.options[select.options.length]=new Option(i, char_range_list[i]); + } + select.options[selected].selected=true; +/* start=0; + end=127; + content=""; + for(var i=start; i"+ String.fromCharCode(i) +""; + } + document.getElementById("char_list").innerHTML= html; + document.getElementById("preview_char").innerHTML=""; +} + +function previewChar(i){ + document.getElementById("preview_char").innerHTML= String.fromCharCode(i); + document.getElementById("preview_code").innerHTML= "&#"+ i +";"; +} + +function insertChar(i){ + opener.parent.editAreaLoader.setSelectedText(editArea.id, String.fromCharCode( i)); + range= opener.parent.editAreaLoader.getSelectionRange(editArea.id); + opener.parent.editAreaLoader.setSelectionRange(editArea.id, range["end"], range["end"]); + window.focus(); +} ADDED applications/admin/static/edit_area/plugins/charmap/langs/bg.js Index: applications/admin/static/edit_area/plugins/charmap/langs/bg.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/bg.js @@ -0,0 +1,12 @@ +/* + * Bulgarian translation + * Author: Valentin Hristov + * Company: SOFTKIT Bulgarian + * Site: http://www.softkit-bg.com + */ +editArea.add_lang("bg",{ +charmap_but: "Виртуална клавиатура", +charmap_title: "Виртуална клавиатура", +charmap_choose_block: "избери езиков блок", +charmap_insert:"постави този символ" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/cs.js Index: applications/admin/static/edit_area/plugins/charmap/langs/cs.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/cs.js @@ -0,0 +1,6 @@ +editArea.add_lang("cs",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/de.js Index: applications/admin/static/edit_area/plugins/charmap/langs/de.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/de.js @@ -0,0 +1,6 @@ +editArea.add_lang("de",{ +charmap_but: "Sonderzeichen", +charmap_title: "Sonderzeichen", +charmap_choose_block: "Bereich auswählen", +charmap_insert: "dieses Zeichen einfügen" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/dk.js Index: applications/admin/static/edit_area/plugins/charmap/langs/dk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/dk.js @@ -0,0 +1,6 @@ +editArea.add_lang("dk",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/en.js Index: applications/admin/static/edit_area/plugins/charmap/langs/en.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/en.js @@ -0,0 +1,6 @@ +editArea.add_lang("en",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/eo.js Index: applications/admin/static/edit_area/plugins/charmap/langs/eo.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/eo.js @@ -0,0 +1,6 @@ +editArea.add_lang("eo",{ +charmap_but: "Ekranklavaro", +charmap_title: "Ekranklavaro", +charmap_choose_block: "Elekto de lingvo", +charmap_insert:"enmeti tiun signaron" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/es.js Index: applications/admin/static/edit_area/plugins/charmap/langs/es.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/es.js @@ -0,0 +1,6 @@ +editArea.add_lang("es",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/fr.js Index: applications/admin/static/edit_area/plugins/charmap/langs/fr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/fr.js @@ -0,0 +1,6 @@ +editArea.add_lang("fr",{ +charmap_but: "Clavier visuel", +charmap_title: "Clavier visuel", +charmap_choose_block: "choix du language", +charmap_insert:"insérer ce caractère" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/hr.js Index: applications/admin/static/edit_area/plugins/charmap/langs/hr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/hr.js @@ -0,0 +1,6 @@ +editArea.add_lang("hr",{ +charmap_but: "Virtualna tipkovnica", +charmap_title: "Virtualna tipkovnica", +charmap_choose_block: "Odaberi blok s jezikom", +charmap_insert:"Ubaci taj znak" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/it.js Index: applications/admin/static/edit_area/plugins/charmap/langs/it.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/it.js @@ -0,0 +1,6 @@ +editArea.add_lang("it",{ +charmap_but: "Tastiera visuale", +charmap_title: "Tastiera visuale", +charmap_choose_block: "seleziona blocco", +charmap_insert:"inserisci questo carattere" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/ja.js Index: applications/admin/static/edit_area/plugins/charmap/langs/ja.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/ja.js @@ -0,0 +1,6 @@ +editArea.add_lang("ja",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/mk.js Index: applications/admin/static/edit_area/plugins/charmap/langs/mk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/mk.js @@ -0,0 +1,6 @@ +editArea.add_lang("mkn",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/nl.js Index: applications/admin/static/edit_area/plugins/charmap/langs/nl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/nl.js @@ -0,0 +1,6 @@ +editArea.add_lang("nl",{ +charmap_but: "Visueel toetsenbord", +charmap_title: "Visueel toetsenbord", +charmap_choose_block: "Kies een taal blok", +charmap_insert:"Voeg dit symbool in" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/pl.js Index: applications/admin/static/edit_area/plugins/charmap/langs/pl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/pl.js @@ -0,0 +1,6 @@ +editArea.add_lang("pl",{ +charmap_but: "Klawiatura ekranowa", +charmap_title: "Klawiatura ekranowa", +charmap_choose_block: "wybierz grupę znaków", +charmap_insert:"wstaw ten znak" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/pt.js Index: applications/admin/static/edit_area/plugins/charmap/langs/pt.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/pt.js @@ -0,0 +1,6 @@ +editArea.add_lang("pt",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/ru.js Index: applications/admin/static/edit_area/plugins/charmap/langs/ru.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/ru.js @@ -0,0 +1,6 @@ +editArea.add_lang("ru",{ +charmap_but: "Визуальная клавиатура", +charmap_title: "Визуальная клавиатура", +charmap_choose_block: "выбрать языковой блок", +charmap_insert:"вставить этот символ" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/sk.js Index: applications/admin/static/edit_area/plugins/charmap/langs/sk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/sk.js @@ -0,0 +1,6 @@ +editArea.add_lang("sk",{ +charmap_but: "Vizuálna klávesnica", +charmap_title: "Vizuálna klávesnica", +charmap_choose_block: "vyber jazykový blok", +charmap_insert: "vlož tento znak" +}); ADDED applications/admin/static/edit_area/plugins/charmap/langs/zh.js Index: applications/admin/static/edit_area/plugins/charmap/langs/zh.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/langs/zh.js @@ -0,0 +1,6 @@ +editArea.add_lang("zh",{ +charmap_but: "软键盘", +charmap_title: "软键盘", +charmap_choose_block: "选择一个语言块", +charmap_insert:"插入此字符" +}); ADDED applications/admin/static/edit_area/plugins/charmap/popup.html Index: applications/admin/static/edit_area/plugins/charmap/popup.html ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/charmap/popup.html @@ -0,0 +1,24 @@ + + + + +{$charmap_title} + + + + + +
+
+

{$charmap_title}:

+ +
+ +
+ + + + + ADDED applications/admin/static/edit_area/plugins/test/css/test.css Index: applications/admin/static/edit_area/plugins/test/css/test.css ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/css/test.css @@ -0,0 +1,3 @@ +select#test_select{ + background-color: #FF0000; +} ADDED applications/admin/static/edit_area/plugins/test/images/test.gif Index: applications/admin/static/edit_area/plugins/test/images/test.gif ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/images/test.gif cannot compute difference between binary files ADDED applications/admin/static/edit_area/plugins/test/langs/bg.js Index: applications/admin/static/edit_area/plugins/test/langs/bg.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/bg.js @@ -0,0 +1,10 @@ +/* + * Bulgarian translation + * Author: Valentin Hristov + * Company: SOFTKIT Bulgarian + * Site: http://www.softkit-bg.com + */ +editArea.add_lang("bg",{ +test_select: "избери таг", +test_but: "тествай копието" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/cs.js Index: applications/admin/static/edit_area/plugins/test/langs/cs.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/cs.js @@ -0,0 +1,4 @@ +editArea.add_lang("cs",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/de.js Index: applications/admin/static/edit_area/plugins/test/langs/de.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/de.js @@ -0,0 +1,4 @@ +editArea.add_lang("de",{ +test_select: "Tag auswählen", +test_but: "Test Button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/dk.js Index: applications/admin/static/edit_area/plugins/test/langs/dk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/dk.js @@ -0,0 +1,4 @@ +editArea.add_lang("dk",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/en.js Index: applications/admin/static/edit_area/plugins/test/langs/en.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/en.js @@ -0,0 +1,4 @@ +editArea.add_lang("en",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/eo.js Index: applications/admin/static/edit_area/plugins/test/langs/eo.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/eo.js @@ -0,0 +1,4 @@ +editArea.add_lang("eo",{ +test_select:"elekto de marko", +test_but: "provo-butono" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/es.js Index: applications/admin/static/edit_area/plugins/test/langs/es.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/es.js @@ -0,0 +1,4 @@ +editArea.add_lang("es",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/fr.js Index: applications/admin/static/edit_area/plugins/test/langs/fr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/fr.js @@ -0,0 +1,4 @@ +editArea.add_lang("fr",{ +test_select:"choix balise", +test_but: "bouton de test" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/hr.js Index: applications/admin/static/edit_area/plugins/test/langs/hr.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/hr.js @@ -0,0 +1,4 @@ +editArea.add_lang("hr",{ +test_select: "Odaberi tag", +test_but: "Probna tipka" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/it.js Index: applications/admin/static/edit_area/plugins/test/langs/it.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/it.js @@ -0,0 +1,4 @@ +editArea.add_lang("it",{ +test_select: "seleziona tag", +test_but: "pulsante di test" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/ja.js Index: applications/admin/static/edit_area/plugins/test/langs/ja.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/ja.js @@ -0,0 +1,4 @@ +editArea.add_lang("ja",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/mk.js Index: applications/admin/static/edit_area/plugins/test/langs/mk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/mk.js @@ -0,0 +1,4 @@ +editArea.add_lang("mk",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/nl.js Index: applications/admin/static/edit_area/plugins/test/langs/nl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/nl.js @@ -0,0 +1,4 @@ +editArea.add_lang("nl",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/pl.js Index: applications/admin/static/edit_area/plugins/test/langs/pl.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/pl.js @@ -0,0 +1,4 @@ +editArea.add_lang("pl",{ +test_select: "wybierz tag", +test_but: "test" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/pt.js Index: applications/admin/static/edit_area/plugins/test/langs/pt.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/pt.js @@ -0,0 +1,4 @@ +editArea.add_lang("pt",{ +test_select: "select tag", +test_but: "test button" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/ru.js Index: applications/admin/static/edit_area/plugins/test/langs/ru.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/ru.js @@ -0,0 +1,4 @@ +editArea.add_lang("ru",{ +test_select: "выбрать тэг", +test_but: "тестировать кнопку" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/sk.js Index: applications/admin/static/edit_area/plugins/test/langs/sk.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/sk.js @@ -0,0 +1,4 @@ +editArea.add_lang("sk",{ +test_select: "vyber tag", +test_but: "testovacie tlačidlo" +}); ADDED applications/admin/static/edit_area/plugins/test/langs/zh.js Index: applications/admin/static/edit_area/plugins/test/langs/zh.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/langs/zh.js @@ -0,0 +1,4 @@ +editArea.add_lang("zh",{ +test_select: "选择标签", +test_but: "测试按钮" +}); ADDED applications/admin/static/edit_area/plugins/test/test.js Index: applications/admin/static/edit_area/plugins/test/test.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/test.js @@ -0,0 +1,110 @@ +/** + * Plugin designed for test prupose. It add a button (that manage an alert) and a select (that allow to insert tags) in the toolbar. + * This plugin also disable the "f" key in the editarea, and load a CSS and a JS file + */ +var EditArea_test= { + /** + * Get called once this file is loaded (editArea still not initialized) + * + * @return nothing + */ + init: function(){ + // alert("test init: "+ this._someInternalFunction(2, 3)); + editArea.load_css(this.baseURL+"css/test.css"); + editArea.load_script(this.baseURL+"test2.js"); + } + /** + * Returns the HTML code for a specific control string or false if this plugin doesn't have that control. + * A control can be a button, select list or any other HTML item to present in the EditArea user interface. + * Language variables such as {$lang_somekey} will also be replaced with contents from + * the language packs. + * + * @param {string} ctrl_name: the name of the control to add + * @return HTML code for a specific control or false. + * @type string or boolean + */ + ,get_control_html: function(ctrl_name){ + switch(ctrl_name){ + case "test_but": + // Control id, button img, command + return parent.editAreaLoader.get_button_html('test_but', 'test.gif', 'test_cmd', false, this.baseURL); + case "test_select": + html= ""; + return html; + } + return false; + } + /** + * Get called once EditArea is fully loaded and initialised + * + * @return nothing + */ + ,onload: function(){ + alert("test load"); + } + + /** + * Is called each time the user touch a keyboard key. + * + * @param (event) e: the keydown event + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,onkeydown: function(e){ + var str= String.fromCharCode(e.keyCode); + // desactivate the "f" character + if(str.toLowerCase()=="f"){ + return true; + } + return false; + } + + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} cmd: the name of the command being executed + * @param {unknown} param: the parameter of the command + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,execCommand: function(cmd, param){ + // Handle commands + switch(cmd){ + case "test_select_change": + var val= document.getElementById("test_select").value; + if(val!=-1) + parent.editAreaLoader.insertTags(editArea.id, "<"+val+">", ""); + document.getElementById("test_select").options[0].selected=true; + return false; + case "test_cmd": + alert("user clicked on test_cmd"); + return false; + } + // Pass to next handler in chain + return true; + } + + /** + * This is just an internal plugin method, prefix all internal methods with a _ character. + * The prefix is needed so they doesn't collide with future EditArea callback functions. + * + * @param {string} a Some arg1. + * @param {string} b Some arg2. + * @return Some return. + * @type unknown + */ + ,_someInternalFunction : function(a, b) { + return a+b; + } +}; + +// Adds the plugin class to the list of available EditArea plugins +editArea.add_plugin("test", EditArea_test); ADDED applications/admin/static/edit_area/plugins/test/test2.js Index: applications/admin/static/edit_area/plugins/test/test2.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/test/test2.js @@ -0,0 +1,1 @@ +alert("test2.js is loaded from test plugin"); ADDED applications/admin/static/edit_area/plugins/zencoding/core.js Index: applications/admin/static/edit_area/plugins/zencoding/core.js ================================================================== --- /dev/null +++ applications/admin/static/edit_area/plugins/zencoding/core.js @@ -0,0 +1,4 @@ +var zen_settings={"variables":{"lang":"en","locale":"en-US","charset":"UTF-8","profile":"xhtml","indentation":"\t"},"css":{"snippets":{"@i":"@import url(|);","@m":"@media print {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","!":"!important","pos":"position:|;","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;","t":"top:|;","t:a":"top:auto;","r":"right:|;","r:a":"right:auto;","b":"bottom:|;","b:a":"bottom:auto;","l":"left:|;","l:a":"left:auto;","z":"z-index:|;","z:a":"z-index:auto;","fl":"float:|;","fl:n":"float:none;","fl:l":"float:left;","fl:r":"float:right;","cl":"clear:|;","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;","d":"display:|;","d:n":"display:none;","d:b":"display:block;","d:ib":"display:inline;","d:li":"display:list-item;","d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;","d:rb":"display:ruby;","d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;","d:rbtg":"display:ruby-text-group;","v":"visibility:|;","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;","ov":"overflow:|;","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;","ovx":"overflow-x:|;","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;","ovy":"overflow-y:|;","ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;","ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;","ovs":"overflow-style:|;","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;","zoo":"zoom:1;","cp":"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(|);","bxz":"box-sizing:|;","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;","bxsh":"box-shadow:|;","bxsh:n":"box-shadow:none;","bxsh:w":"-webkit-box-shadow:0 0 0 #000;","bxsh:m":"-moz-box-shadow:0 0 0 0 #000;","m":"margin:|;","m:a":"margin:auto;","m:0":"margin:0;","m:2":"margin:0 0;","m:3":"margin:0 0 0;","m:4":"margin:0 0 0 0;","mt":"margin-top:|;","mt:a":"margin-top:auto;","mr":"margin-right:|;","mr:a":"margin-right:auto;","mb":"margin-bottom:|;","mb:a":"margin-bottom:auto;","ml":"margin-left:|;","ml:a":"margin-left:auto;","p":"padding:|;","p:0":"padding:0;","p:2":"padding:0 0;","p:3":"padding:0 0 0;","p:4":"padding:0 0 0 0;","pt":"padding-top:|;","pr":"padding-right:|;","pb":"padding-bottom:|;","pl":"padding-left:|;","w":"width:|;","w:a":"width:auto;","h":"height:|;","h:a":"height:auto;","maw":"max-width:|;","maw:n":"max-width:none;","mah":"max-height:|;","mah:n":"max-height:none;","miw":"min-width:|;","mih":"min-height:|;","o":"outline:|;","o:n":"outline:none;","oo":"outline-offset:|;","ow":"outline-width:|;","os":"outline-style:|;","oc":"outline-color:#000;","oc:i":"outline-color:invert;","bd":"border:|;","bd+":"border:1px solid #000;","bd:n":"border:none;","bdbk":"border-break:|;","bdbk:c":"border-break:close;","bdcl":"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;","bdc":"border-color:#000;","bdi":"border-image:url(|);","bdi:n":"border-image:none;","bdi:w":"-webkit-border-image:url(|) 0 0 0 0 stretch stretch;","bdi:m":"-moz-border-image:url(|) 0 0 0 0 stretch stretch;","bdti":"border-top-image:url(|);","bdti:n":"border-top-image:none;","bdri":"border-right-image:url(|);","bdri:n":"border-right-image:none;","bdbi":"border-bottom-image:url(|);","bdbi:n":"border-bottom-image:none;","bdli":"border-left-image:url(|);","bdli:n":"border-left-image:none;","bdci":"border-corner-image:url(|);","bdci:n":"border-corner-image:none;","bdci:c":"border-corner-image:continue;","bdtli":"border-top-left-image:url(|);","bdtli:n":"border-top-left-image:none;","bdtli:c":"border-top-left-image:continue;","bdtri":"border-top-right-image:url(|);","bdtri:n":"border-top-right-image:none;","bdtri:c":"border-top-right-image:continue;","bdbri":"border-bottom-right-image:url(|);","bdbri:n":"border-bottom-right-image:none;","bdbri:c":"border-bottom-right-image:continue;","bdbli":"border-bottom-left-image:url(|);","bdbli:n":"border-bottom-left-image:none;","bdbli:c":"border-bottom-left-image:continue;","bdf":"border-fit:|;","bdf:c":"border-fit:clip;","bdf:r":"border-fit:repeat;","bdf:sc":"border-fit:scale;","bdf:st":"border-fit:stretch;","bdf:ow":"border-fit:overwrite;","bdf:of":"border-fit:overflow;","bdf:sp":"border-fit:space;","bdl":"border-length:|;","bdl:a":"border-length:auto;","bdsp":"border-spacing:|;","bds":"border-style:|;","bds:n":"border-style:none;","bds:h":"border-style:hidden;","bds:dt":"border-style:dotted;","bds:ds":"border-style:dashed;","bds:s":"border-style:solid;","bds:db":"border-style:double;","bds:dtds":"border-style:dot-dash;","bds:dtdtds":"border-style:dot-dot-dash;","bds:w":"border-style:wave;","bds:g":"border-style:groove;","bds:r":"border-style:ridge;","bds:i":"border-style:inset;","bds:o":"border-style:outset;","bdw":"border-width:|;","bdt":"border-top:|;","bdt+":"border-top:1px solid #000;","bdt:n":"border-top:none;","bdtw":"border-top-width:|;","bdts":"border-top-style:|;","bdts:n":"border-top-style:none;","bdtc":"border-top-color:#000;","bdr":"border-right:|;","bdr+":"border-right:1px solid #000;","bdr:n":"border-right:none;","bdrw":"border-right-width:|;","bdrs":"border-right-style:|;","bdrs:n":"border-right-style:none;","bdrc":"border-right-color:#000;","bdb":"border-bottom:|;","bdb+":"border-bottom:1px solid #000;","bdb:n":"border-bottom:none;","bdbw":"border-bottom-width:|;","bdbs":"border-bottom-style:|;","bdbs:n":"border-bottom-style:none;","bdbc":"border-bottom-color:#000;","bdl":"border-left:|;","bdl+":"border-left:1px solid #000;","bdl:n":"border-left:none;","bdlw":"border-left-width:|;","bdls":"border-left-style:|;","bdls:n":"border-left-style:none;","bdlc":"border-left-color:#000;","bdrs":"border-radius:|;","bdtrrs":"border-top-right-radius:|;","bdtlrs":"border-top-left-radius:|;","bdbrrs":"border-bottom-right-radius:|;","bdblrs":"border-bottom-left-radius:|;","bg":"background:|;","bg+":"background:#FFF url(|) 0 0 no-repeat;","bg:n":"background:none;","bg:ie":"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='|x.png');","bgc":"background-color:#FFF;","bgi":"background-image:url(|);","bgi:n":"background-image:none;","bgr":"background-repeat:|;","bgr:n":"background-repeat:no-repeat;","bgr:x":"background-repeat:repeat-x;","bgr:y":"background-repeat:repeat-y;","bga":"background-attachment:|;","bga:f":"background-attachment:fixed;","bga:s":"background-attachment:scroll;","bgp":"background-position:0 0;","bgpx":"background-position-x:|;","bgpy":"background-position-y:|;","bgbk":"background-break:|;","bgbk:bb":"background-break:bounding-box;","bgbk:eb":"background-break:each-box;","bgbk:c":"background-break:continuous;","bgcp":"background-clip:|;","bgcp:bb":"background-clip:border-box;","bgcp:pb":"background-clip:padding-box;","bgcp:cb":"background-clip:content-box;","bgcp:nc":"background-clip:no-clip;","bgo":"background-origin:|;","bgo:pb":"background-origin:padding-box;","bgo:bb":"background-origin:border-box;","bgo:cb":"background-origin:content-box;","bgz":"background-size:|;","bgz:a":"background-size:auto;","bgz:ct":"background-size:contain;","bgz:cv":"background-size:cover;","c":"color:#000;","tbl":"table-layout:|;","tbl:a":"table-layout:auto;","tbl:f":"table-layout:fixed;","cps":"caption-side:|;","cps:t":"caption-side:top;","cps:b":"caption-side:bottom;","ec":"empty-cells:|;","ec:s":"empty-cells:show;","ec:h":"empty-cells:hide;","lis":"list-style:|;","lis:n":"list-style:none;","lisp":"list-style-position:|;","lisp:i":"list-style-position:inside;","lisp:o":"list-style-position:outside;","list":"list-style-type:|;","list:n":"list-style-type:none;","list:d":"list-style-type:disc;","list:c":"list-style-type:circle;","list:s":"list-style-type:square;","list:dc":"list-style-type:decimal;","list:dclz":"list-style-type:decimal-leading-zero;","list:lr":"list-style-type:lower-roman;","list:ur":"list-style-type:upper-roman;","lisi":"list-style-image:|;","lisi:n":"list-style-image:none;","q":"quotes:|;","q:n":"quotes:none;","q:ru":"quotes:'\00AB' '\00BB' '\201E' '\201C';","q:en":"quotes:'\201C' '\201D' '\2018' '\2019';","ct":"content:|;","ct:n":"content:normal;","ct:oq":"content:open-quote;","ct:noq":"content:no-open-quote;","ct:cq":"content:close-quote;","ct:ncq":"content:no-close-quote;","ct:a":"content:attr(|);","ct:c":"content:counter(|);","ct:cs":"content:counters(|);","coi":"counter-increment:|;","cor":"counter-reset:|;","va":"vertical-align:|;","va:sup":"vertical-align:super;","va:t":"vertical-align:top;","va:tt":"vertical-align:text-top;","va:m":"vertical-align:middle;","va:bl":"vertical-align:baseline;","va:b":"vertical-align:bottom;","va:tb":"vertical-align:text-bottom;","va:sub":"vertical-align:sub;","ta":"text-align:|;","ta:l":"text-align:left;","ta:c":"text-align:center;","ta:r":"text-align:right;","tal":"text-align-last:|;","tal:a":"text-align-last:auto;","tal:l":"text-align-last:left;","tal:c":"text-align-last:center;","tal:r":"text-align-last:right;","td":"text-decoration:|;","td:n":"text-decoration:none;","td:u":"text-decoration:underline;","td:o":"text-decoration:overline;","td:l":"text-decoration:line-through;","te":"text-emphasis:|;","te:n":"text-emphasis:none;","te:ac":"text-emphasis:accent;","te:dt":"text-emphasis:dot;","te:c":"text-emphasis:circle;","te:ds":"text-emphasis:disc;","te:b":"text-emphasis:before;","te:a":"text-emphasis:after;","th":"text-height:|;","th:a":"text-height:auto;","th:f":"text-height:font-size;","th:t":"text-height:text-size;","th:m":"text-height:max-size;","ti":"text-indent:|;","ti:-":"text-indent:-9999px;","tj":"text-justify:|;","tj:a":"text-justify:auto;","tj:iw":"text-justify:inter-word;","tj:ii":"text-justify:inter-ideograph;","tj:ic":"text-justify:inter-cluster;","tj:d":"text-justify:distribute;","tj:k":"text-justify:kashida;","tj:t":"text-justify:tibetan;","to":"text-outline:|;","to+":"text-outline:0 0 #000;","to:n":"text-outline:none;","tr":"text-replace:|;","tr:n":"text-replace:none;","tt":"text-transform:|;","tt:n":"text-transform:none;","tt:c":"text-transform:capitalize;","tt:u":"text-transform:uppercase;","tt:l":"text-transform:lowercase;","tw":"text-wrap:|;","tw:n":"text-wrap:normal;","tw:no":"text-wrap:none;","tw:u":"text-wrap:unrestricted;","tw:s":"text-wrap:suppress;","tsh":"text-shadow:|;","tsh+":"text-shadow:0 0 0 #000;","tsh:n":"text-shadow:none;","lh":"line-height:|;","whs":"white-space:|;","whs:n":"white-space:normal;","whs:p":"white-space:pre;","whs:nw":"white-space:nowrap;","whs:pw":"white-space:pre-wrap;","whs:pl":"white-space:pre-line;","whsc":"white-space-collapse:|;","whsc:n":"white-space-collapse:normal;","whsc:k":"white-space-collapse:keep-all;","whsc:l":"white-space-collapse:loose;","whsc:bs":"white-space-collapse:break-strict;","whsc:ba":"white-space-collapse:break-all;","wob":"word-break:|;","wob:n":"word-break:normal;","wob:k":"word-break:keep-all;","wob:l":"word-break:loose;","wob:bs":"word-break:break-strict;","wob:ba":"word-break:break-all;","wos":"word-spacing:|;","wow":"word-wrap:|;","wow:nm":"word-wrap:normal;","wow:n":"word-wrap:none;","wow:u":"word-wrap:unrestricted;","wow:s":"word-wrap:suppress;","lts":"letter-spacing:|;","f":"font:|;","f+":"font:1em Arial,sans-serif;","fw":"font-weight:|;","fw:n":"font-weight:normal;","fw:b":"font-weight:bold;","fw:br":"font-weight:bolder;","fw:lr":"font-weight:lighter;","fs":"font-style:|;","fs:n":"font-style:normal;","fs:i":"font-style:italic;","fs:o":"font-style:oblique;","fv":"font-variant:|;","fv:n":"font-variant:normal;","fv:sc":"font-variant:small-caps;","fz":"font-size:|;","fza":"font-size-adjust:|;","fza:n":"font-size-adjust:none;","ff":"font-family:|;","ff:s":"font-family:serif;","ff:ss":"font-family:sans-serif;","ff:c":"font-family:cursive;","ff:f":"font-family:fantasy;","ff:m":"font-family:monospace;","fef":"font-effect:|;","fef:n":"font-effect:none;","fef:eg":"font-effect:engrave;","fef:eb":"font-effect:emboss;","fef:o":"font-effect:outline;","fem":"font-emphasize:|;","femp":"font-emphasize-position:|;","femp:b":"font-emphasize-position:before;","femp:a":"font-emphasize-position:after;","fems":"font-emphasize-style:|;","fems:n":"font-emphasize-style:none;","fems:ac":"font-emphasize-style:accent;","fems:dt":"font-emphasize-style:dot;","fems:c":"font-emphasize-style:circle;","fems:ds":"font-emphasize-style:disc;","fsm":"font-smooth:|;","fsm:a":"font-smooth:auto;","fsm:n":"font-smooth:never;","fsm:aw":"font-smooth:always;","fst":"font-stretch:|;","fst:n":"font-stretch:normal;","fst:uc":"font-stretch:ultra-condensed;","fst:ec":"font-stretch:extra-condensed;","fst:c":"font-stretch:condensed;","fst:sc":"font-stretch:semi-condensed;","fst:se":"font-stretch:semi-expanded;","fst:e":"font-stretch:expanded;","fst:ee":"font-stretch:extra-expanded;","fst:ue":"font-stretch:ultra-expanded;","op":"opacity:|;","op:ie":"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);","op:ms":"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';","rz":"resize:|;","rz:n":"resize:none;","rz:b":"resize:both;","rz:h":"resize:horizontal;","rz:v":"resize:vertical;","cur":"cursor:|;","cur:a":"cursor:auto;","cur:d":"cursor:default;","cur:c":"cursor:crosshair;","cur:ha":"cursor:hand;","cur:he":"cursor:help;","cur:m":"cursor:move;","cur:p":"cursor:pointer;","cur:t":"cursor:text;","pgbb":"page-break-before:|;","pgbb:au":"page-break-before:auto;","pgbb:al":"page-break-before:always;","pgbb:l":"page-break-before:left;","pgbb:r":"page-break-before:right;","pgbi":"page-break-inside:|;","pgbi:au":"page-break-inside:auto;","pgbi:av":"page-break-inside:avoid;","pgba":"page-break-after:|;","pgba:au":"page-break-after:auto;","pgba:al":"page-break-after:always;","pgba:l":"page-break-after:left;","pgba:r":"page-break-after:right;","orp":"orphans:|;","wid":"widows:|;"}},"html":{"snippets":{"cc:ie6":"","cc:ie":"","cc:noie":"\n\t${child}|\n","html:4t":'\n'+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+"","html:4s":'\n'+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+"","html:xt":'\n'+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+"","html:xs":'\n'+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+"","html:xxs":'\n'+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+"","html:5":"\n"+'\n'+"\n"+" \n"+' \n'+"\n"+"\n\t${child}|\n\n"+""},"abbreviations":{"a":'',"a:link":'',"a:mail":'',"abbr":'',"acronym":'',"base":'',"bdo":'',"bdo:r":'',"bdo:l":'',"link:css":'',"link:print":'',"link:favicon":'',"link:touch":'',"link:rss":'',"link:atom":'',"meta:utf":'',"meta:win":'',"meta:compat":'',"style":'',"script":' + +{{if request.function=='index':}} +

{{=T("Available databases and tables")}}

+ {{if not databases:}}{{=T("No databases in this application")}}{{pass}} + {{for db in sorted(databases):}} + {{for table in databases[db].tables:}} + {{qry='%s.%s.id>0'%(db,table)}} + {{tbl=databases[db][table]}} + {{if hasattr(tbl,'_primarykey'):}} + {{if tbl._primarykey:}} + {{firstkey=tbl[tbl._primarykey[0]]}} + {{if firstkey.type in ['string','text']:}} + {{qry='%s.%s.%s!=""'%(db,table,firstkey.name)}} + {{else:}} + {{qry='%s.%s.%s>0'%(db,table,firstkey.name)}} + {{pass}} + {{else:}} + {{qry=''}} + {{pass}} + {{pass}} +

{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}} +

+ [ {{=A(str(T('insert new'))+' '+table,_href=URL('insert',args=[db,table]))}} ] +

+ {{pass}} + {{pass}} + +{{elif request.function=='select':}} +

{{=XML(str(T("database %s select"))%A(request.args[0],_href=URL('index'))) }} +

+ {{if table:}} + [ {{=A(str(T('insert new %s'))%table,_href=URL('insert',args=[request.args[0],table]))}} ]

+

{{=T("Rows in table")}}


+ {{else:}} +

{{=T("Rows selected")}}


+ {{pass}} + {{=form}} +

{{=T('The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.')}}
+ {{=T('Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.')}}
+ {{=T('"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN')}}

+

+

{{=nrows}} {{=T("selected")}}

+ {{if start>0:}}[ {{=A(T('previous 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start-100)))}} ]{{pass}} + {{if stop + {{linkto=URL('update',args=request.args[0])}} + {{upload=URL('download',args=request.args[0])}} + {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}} + + {{pass}} +

{{=T("Import/Export")}}


+ [ {{=T("export as csv file")}} ] + {{if table:}} + {{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value='import'))}} + {{pass}} + + +{{elif request.function=='insert':}} +

{{=T("database")}} {{=A(request.args[0],_href=URL('index'))}} + {{if hasattr(table,'_primarykey'):}} + {{fieldname=table._primarykey[0]}} + {{dbname=request.args[0]}} + {{tablename=request.args[1]}} + {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} + {{=T("table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} + {{else:}} + {{=T("table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} + {{pass}} +

+

{{=T("New Record")}}


+ {{=form}} + + + +{{elif request.function=='update':}} +

{{=T("database")}} {{=A(request.args[0],_href=URL('index'))}} + {{if hasattr(table,'_primarykey'):}} + {{fieldname=request.vars.keys()[0]}} + {{dbname=request.args[0]}} + {{tablename=request.args[1]}} + {{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} + {{=T("table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} + {{=T("record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}} + {{else:}} + {{=T("table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} + {{=T("record id")}} {{=A(request.args[2],_href=URL('update',args=request.args[:3]))}} + {{pass}} +

+

{{=T("Edit current record")}}



{{=form}} + + + +{{elif request.function=='state':}} +

{{=T("Internal State")}}

+

{{=T("Current request")}}

+ {{=BEAUTIFY(request)}} +

{{=T("Current response")}}

+ {{=BEAUTIFY(response)}} +

{{=T("Current session")}}

+ {{=BEAUTIFY(session)}} + + +{{elif request.function == 'ccache':}} +

Cache

+
+
+
+ Statistics +
+
+

Overview

+

+ Hit Ratio: + {{=total['ratio']}}% + ({{=total['hits']}} hits + and {{=total['misses']}} misses) +

+

+ Size of cache: + {{=total['objects']}} items, + {{=total['bytes']}} bytes + {{if total['bytes'] > 524287:}} + ({{="%.0d" % (total['bytes'] / 1048576)}} MB) + {{pass}} +

+

+ Cache contains items up to + {{="%02d" % total['oldest'][0]}} hours + {{="%02d" % total['oldest'][1]}} minutes + {{="%02d" % total['oldest'][2]}} seconds old. +

+

RAM

+

+ Hit Ratio: + {{=ram['ratio']}}% + ({{=ram['hits']}} hits + and {{=ram['misses']}} misses) +

+

+ Size of cache: + {{=ram['objects']}} items, + {{=ram['bytes']}} bytes + {{if ram['bytes'] > 524287:}} + ({{=ram['bytes'] / 1048576}} MB) + {{pass}} +

+

+ RAM contains items up to + {{="%02d" % ram['oldest'][0]}} hours + {{="%02d" % ram['oldest'][1]}} minutes + {{="%02d" % ram['oldest'][2]}} seconds old. +

+

DISK

+

+ Hit Ratio: + {{=disk['ratio']}}% + ({{=disk['hits']}} hits + and {{=disk['misses']}} misses) +

+

+ Size of cache: + {{=disk['objects']}} items, + {{=disk['bytes']}} bytes + {{if disk['bytes'] > 524287:}} + ({{=disk['bytes'] / 1048576}} MB) + {{pass}} +

+

+ DISK contains items up to + {{="%02d" % disk['oldest'][0]}} hours + {{="%02d" % disk['oldest'][1]}} minutes + {{="%02d" % disk['oldest'][2]}} seconds old. +

+
+ +
+ Manage Cache +
+
+

+ {{=form}} +

+
+
+
+
+{{pass}} ADDED applications/admin/views/debug/index.html Index: applications/admin/views/debug/index.html ================================================================== --- /dev/null +++ applications/admin/views/debug/index.html @@ -0,0 +1,159 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}shell{{end}} + + +
+ + +
+
+
>>>
+
+ + Type PDB debugger command in here and hit Return (Enter) to execute it. +
+
+
+
+ +
+
    +
  • Using the shell may lock the database to other users of this app.
  • +
+
+ + ADDED applications/admin/views/default/about.html Index: applications/admin/views/default/about.html ================================================================== --- /dev/null +++ applications/admin/views/default/about.html @@ -0,0 +1,12 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}about{{end}} + +

{{=T("About application")}} "{{=app}}"

+

{{=T("About")}} {{=app}}

+

{{=button(URL('edit/%s/ABOUT' % (app)), T('edit'))}}

+
{{=about}}
+

{{=T('License for')}} {{=app}}

+

{{=button(URL('edit/%s/LICENSE' % (app)), T('edit'))}}

+
{{=license}}
+ ADDED applications/admin/views/default/amy_ajax.html Index: applications/admin/views/default/amy_ajax.html ================================================================== --- /dev/null +++ applications/admin/views/default/amy_ajax.html @@ -0,0 +1,76 @@ + + + +{{if request.args[1]=="views":}} + +{{else:}} + +{{pass}} + + + ADDED applications/admin/views/default/change_password.html Index: applications/admin/views/default/change_password.html ================================================================== --- /dev/null +++ applications/admin/views/default/change_password.html @@ -0,0 +1,9 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}change_password{{end}} + +

Change Admin Password

+ +
+ {{=form}} +
ADDED applications/admin/views/default/delete.html Index: applications/admin/views/default/delete.html ================================================================== --- /dev/null +++ applications/admin/views/default/delete.html @@ -0,0 +1,8 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}delete{{end}} + +
+

{{=T('Are you sure you want to delete file "%s"?', filename)}}

+

{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Delete')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}

+
ADDED applications/admin/views/default/delete_plugin.html Index: applications/admin/views/default/delete_plugin.html ================================================================== --- /dev/null +++ applications/admin/views/default/delete_plugin.html @@ -0,0 +1,9 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}delete_plugin{{end}} + +
+

{{=T('Are you sure you want to delete plugin "%s"?', plugin)}}

+

{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('NO')))}}

+

{{=FORM(INPUT(_type='submit',_name='delete',_value=T('YES')))}}

+
ADDED applications/admin/views/default/design.html Index: applications/admin/views/default/design.html ================================================================== --- /dev/null +++ applications/admin/views/default/design.html @@ -0,0 +1,313 @@ +{{extend 'layout.html'}} +{{ +def all(items): + return reduce(lambda a,b:a and b,items,True) +def peekfile(path,file): + return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file))) +def editfile(path,file): + return A(SPAN(T('edit')),_class='button editbutton',_href=URL('edit', args=(app, path, file))) +def testfile(path,file): + return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file (to run all files, you may also use the button labelled 'test')"))), _class='icon test tooltip',_href=URL('test', args=(app, file))) +def editlanguagefile(path,file): + return A(SPAN(T('edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file))) +def file_upload_form(location): + form=FORM(T("upload file:")," ", + INPUT(_type="file",_name="file")," ",T("and rename it:")," ", + INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY), + INPUT(_type="hidden",_name="location",_value=location), + INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)), + INPUT(_type="submit",_value=T("upload")),_action=URL('upload_file')) + return form +def file_create_form(location): + form=FORM(T("create file with filename:")," ", + INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY), + INPUT(_type="hidden",_name="location",_value=location), + INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)), + INPUT(_type="submit",_value=T("create")),_action=URL('create_file')) + return form +def upload_plugin_form(app): + form=FORM(T("upload plugin file:")," ", + INPUT(_type="file",_name="pluginfile"), + INPUT(_type="submit",_value=T("upload"))) + return form +def deletefile(arglist): + return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app))) +}} + +{{block sectionclass}}design{{end}} + +

{{=T("Edit application")}} "{{=A(app,_href=URL(app,'default','index'),_target="_blank")}}"

+ + +
+

+ {{=searchbox('search')}} + {{=T("collapse/expand all")}} + + {{=button('#models', T("models"))}} + {{=button('#controllers', T("controllers"))}} + {{=button('#views', T("views"))}} + {{=button('#languages', T("languages"))}} + {{=button('#static', T("static"))}} + {{=button('#modules', T("modules"))}} + {{=button('#plugins', T("plugins"))}} + +

+
+ + + +

+ {{=T("Models")}} + {{=helpicon()}} {{=T("The data representation, define database tables and sets")}} +

+
+ {{if not models:}}

{{=T("There are no models")}}

{{else:}} +
+ {{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}} + {{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}} + {{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}} + {{pass}} +
+ {{pass}} + +
    + {{for m in models:}} +
  • + + {{=editfile('models',m)}} + {{=deletefile([app, 'models', m])}} + + + {{=peekfile('models',m)}} + + + {{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}} + +
  • + {{pass}} +
+
{{=file_create_form('%s/models/' % app)}}
+
+ + +{{ +controller_functions=[] +for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]] +}} + + + +

+ {{=T("Controllers")}} + {{=helpicon()}} {{=T("The application logic, each URL path is mapped in one exposed function in the controller")}} +

+
+ {{if not controllers:}}

{{=T("There are no controllers")}}

{{else:}} +
+ {{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}} + {{=button(URL('test',args=app), T("test"))}} + {{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}} +
+ {{pass}} +
    + {{for c in controllers:}} +
  • + + {{=editfile('controllers',c)}} + {{=deletefile([app, 'controllers', c])}} + {{=testfile('controllers',c)}} + + + {{=peekfile('controllers',c)}} + + + {{if functions[c]:}}{{=T("exposes")}} {{pass}}{{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}} + +
  • + {{pass}} +
+
{{=file_create_form('%s/controllers/' % app)}}
+
+ + + +

+ {{=T("Views")}} + {{=helpicon()}} {{=T("The presentations layer, views are also known as templates")}} +

+
+
+ {{=button(LAYOUTS_APP, T("download layouts"))}} +
+ {{if not views:}}

{{=T("There are no views")}}

{{pass}} +
    + {{for c in views:}} +
  • + + {{=editfile('views',c)}} + {{=deletefile([app, 'views', c])}} + + + {{=peekfile('views',c)}} + + + {{if extend.has_key(c):}}{{=T("extends")}} {{=extend[c]}} {{pass}} + {{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}} + +
  • + {{pass}} +
+
{{=file_create_form('%s/views/' % app)}}
+
+ + + +

+ {{=T("Languages")}} + {{=helpicon()}} {{=T("Translation strings for the application")}} +

+
+
+ {{=button(URL('update_languages/'+app), T('update all languages'))}} +
+ {{if not languages:}}

{{=T("There are no translators, only default language is supported")}}

{{pass}} +
    + {{for file in languages:}} +
  • + + {{=editlanguagefile('languages',file)}} + {{=deletefile([app, 'languages', file])}} + + + {{=peekfile('languages',file)}} + +
  • + {{pass}} +
+
{{=file_create_form('%s/languages/' % app)}}{{=T('(something like "it-it")')}}
+
+ + + +

+ {{=T("Static files")}} + {{=helpicon()}} {{=T("These files are served without processing, your images go here")}} +

+
+
+
+ {{if not statics:}}

{{=T("There are no static files")}}

{{pass}} +
    + {{ + path=[] + for file in statics+['']: + items=file.split('/') + file_path=items[:-1] + filename=items[-1] + while path!=file_path: + if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]): + path.append(file_path[len(path)]) + thispath='static__'+'__'.join(path) + }} +
  • + {{=path[-1]}}/ +
  • + {{ + pass + pass + if filename: + }}
  • + + {{=editfile('static',file)}} {{=deletefile([app,'static',file])}} + + + {{=filename}} + +
  • {{ + pass + pass + }} + {{pass}} +
+
{{=file_create_form('%s/static/' % app)}} + {{=file_upload_form('%s/static/' % app)}}
+
+ + + +

+ {{=T("Modules")}} + {{=helpicon()}} {{=T("Additional code for your application")}} +

+
+
+
+ {{if not modules:}}

{{=T("There are no modules")}}

{{pass}} +
    + {{for m in modules:}} +
  • + + {{=editfile('modules',m)}} + {{if m!='__init__.py':}}{{=deletefile([app, 'modules', m])}}{{pass}} + + + {{=peekfile('modules',m)}} + +
  • + {{pass}} +
+
{{=file_create_form('%s/modules/' % app)}} + {{=file_upload_form('%s/modules/' % app)}}
+
+ + + +

+ {{=T("Plugins")}} + {{=helpicon()}} {{=T("To create a plugin, name a file/folder plugin_[name]")}} +

+
+
+ {{=button(PLUGINS_APP, T('download plugins'))}} +
+
+
+ {{if plugins:}} +
    + {{for plugin in plugins:}} +
  • + {{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin]))}} +
  • + {{pass}} +
+ {{else:}} +

{{=T('There are no plugins')}}

+ {{pass}} +
{{=upload_plugin_form(app)}}
+
+ + + ADDED applications/admin/views/default/downgrade_web2py.html Index: applications/admin/views/default/downgrade_web2py.html ================================================================== --- /dev/null +++ applications/admin/views/default/downgrade_web2py.html @@ -0,0 +1,13 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}upgrade{{end}} + +

{{=T('web2py downgrade')}}

+ +

{{=T('ATTENTION:')}} {{=T('This is an experimental feature and it needs more testing. If you decide to downgrade you do it at your own risk')}}
+{{=T('If start the downgrade, be patient, it may take a while to rollback')}}

+ +
+{{=FORM(INPUT(_type='submit',_name='nodowngrade',_value=T('Cancel')), _class='inline')}} +{{=FORM(INPUT(_type='submit',_name='downgrade',_value=T('Downgrade')), _class='inline')}} +
ADDED applications/admin/views/default/edit.html Index: applications/admin/views/default/edit.html ================================================================== --- /dev/null +++ applications/admin/views/default/edit.html @@ -0,0 +1,92 @@ +{{extend 'layout.html'}} + +{{ + def shortcut(combo, description): + return XML('
  • %s %s
  • ' % (combo, description)) +}} + +{{if TEXT_EDITOR == 'amy':}} +{{include 'default/amy_ajax.html'}} +{{else:}} + + + +{{pass}} + +{{block sectionclass}}edit{{end}} + +

    {{=T('Editing file "%s"',filename)}}

    + +{{if functions:}} +

    + + {{=B(T('exposes:'))}}{{=XML(', '.join([A(f,_href=URL(a=app,c=controller,f=f)).xml() for f in functions]))}} + + {{if editviewlinks:}}
    + {{=B(T('edit views:'))}} + {{=XML(', '.join([v.xml() for v in editviewlinks]))}} + {{pass}} +

    +{{pass}} + +

    + {{=button(URL('design',args=request.args[0]), T('back'))}} + {{if edit_controller:}} + {{=button(edit_controller, T('edit controller'))}} + {{pass}} + {{if view_link:}} + {{=button(view_link, T('try view'))}} + {{pass}} + {{if request.args[1]=='models':}} + {{=T('online designer')}} + {{pass}} + {{=T('docs')}} +

    + +
    +
    + + {{=IMG(_src=URL('static', 'images/save_icon.png'), _alt=T('Save'))}} + + {{=T('Saved file hash:')}} + + {{=T('Last saved on:')}} + {{if TEXT_EDITOR=='amy':}} + + {{else:}} + + {{pass}} + {{=T('currently saved or')}} + {{=T('to previous version.')}} +
    +
    +
    + +{{if filetype=='html':}} +
    +

    Key bindings for ZenCoding Plugin

    +
      + {{=shortcut('Ctrl+S', 'Save via Ajax')}} + {{=shortcut('Ctrl+,', 'Expand Abbreviation')}} + {{=shortcut('Ctrl+M', 'Match Pair')}} + {{=shortcut('Ctrl+H', 'Wrap with Abbreviation')}} + {{=shortcut('Shift+Ctrl+M', 'Merge Lines')}} + {{=shortcut('Ctrl+Shift+←', 'Previous Edit Point')}} + {{=shortcut('Ctrl+Shift+→', 'Next Edit Point')}} + {{=shortcut('Ctrl+Shift+↑', 'Go to Matching Pair')}} +
    +
    +{{else:}} +
    +

    Key bindings

    +
      + {{=shortcut('Ctrl+S', 'Save via Ajax')}} +
    +
    +{{pass}} ADDED applications/admin/views/default/edit_language.html Index: applications/admin/views/default/edit_language.html ================================================================== --- /dev/null +++ applications/admin/views/default/edit_language.html @@ -0,0 +1,18 @@ +{{extend 'layout.html'}} + + +{{block sectionclass}}edit_language{{end}} + +

    {{=T('Editing Language file')}} "{{=filename}}"

    + +
    + {{=form}} +
    + ADDED applications/admin/views/default/index.html Index: applications/admin/views/default/index.html ================================================================== --- /dev/null +++ applications/admin/views/default/index.html @@ -0,0 +1,21 @@ +{{extend 'layout.html'}} + + +{{block sectionclass}}login{{end}} + +

    web2py™ {{=T('Web Framework')}}

    +

    {{=T('Login to the Administrative Interface')}}

    +

    {{=T('ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.')}}

    +
    +
    +
    + + + +
    {{=T('Administrator Password:')}}
    +
    +
    ADDED applications/admin/views/default/peek.html Index: applications/admin/views/default/peek.html ================================================================== --- /dev/null +++ applications/admin/views/default/peek.html @@ -0,0 +1,16 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}peek{{end}} + +

    {{=T("Peeking at file")}} "{{=filename}}"

    + +

    +{{=button(URL('design',args=request.args[0]), T('back'))}} +{{=button(URL('edit',args=request.args), T('edit'))}} +

    + +{{ +if filename[-3:]=='.py': language='python' +else: language='html' +}} +{{=CODE(data,language=language,link='/examples/global/vars/')}} ADDED applications/admin/views/default/plugin.html Index: applications/admin/views/default/plugin.html ================================================================== --- /dev/null +++ applications/admin/views/default/plugin.html @@ -0,0 +1,221 @@ +{{extend 'layout.html'}} +{{ +import os +def all(items): + return reduce(lambda a,b:a and b,items,True) +def peekfile(path,file): + return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file))) +def editfile(path,file): + return A(SPAN(T('edit')),_class='button editbutton',_href=URL('edit', args=(app, path, file))) +def testfile(path,file): + return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file"))), _class='icon test tooltip',_href=URL('test', args=(app, file))) +def editlanguagefile(path,file): + return A(SPAN(T('edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file))) +def file_upload_form(location): + form=FORM(T("upload file:")," ", + INPUT(_type="file",_name="file")," ",T("and rename it:")," ", + INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY), + INPUT(_type="hidden",_name="location",_value=location), + INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)), + INPUT(_type="submit",_value=T("submit")),_action=URL('upload_file')) + return form +def file_create_form(location): + form=FORM(T("create file with filename:")," ", + INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY), + INPUT(_type="hidden",_name="location",_value=location), + INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)), + INPUT(_type="submit",_value=T("submit")),_action=URL('create_file')) + return form +def upload_plugin_form(app): + form=FORM(T("upload plugin file:")," ", + INPUT(_type="file",_name="pluginfile"), + INPUT(_type="submit",_value=T("submit"))) + return form +def deletefile(arglist): + return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app))) +}} + +{{block sectionclass}}plugin{{end}} + +

    + {{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}" +

    +
    + {{=T("collapse/expand all")}} + + {{=button("#models", T("models"))}} + {{=button("#controllers", T("controllers"))}} + {{=button("#views", T("views"))}} + {{=button("#static", T("static"))}} + {{=button("#modules", T("modules"))}} + + + {{=sp_button(URL('design',args=app), T("back"))}} + {{=sp_button(URL('delete_plugin',args=request.args), T("delete plugin"))}} + {{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}} + +
    + + + +

    + {{=T("Models")}} +

    +
    + {{if not models:}} +

    {{=T("There are no models")}}

    + {{pass}} +
    +
    +
      + {{for m in models:}} +
    • + + {{=editfile('models',m)}} + {{=deletefile([app, 'models', m])}} + + + {{=peekfile('models',m)}} + + + {{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}} + +
    • + {{pass}} +
    +
    + + +{{ +controller_functions=[] +for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]] +}} + + + +

    + {{=T("Controllers")}} +

    +
    + {{if not controllers:}} +

    {{=T("There are no controllers")}}

    + {{pass}} +
    +
    +
      + {{for c in controllers:}} +
    • + + {{=editfile('controllers',c)}} + {{=deletefile([app,'controllers',c])}} + {{=testfile('controllers',c)}} + + + {{=peekfile('controllers',c)}} + + + {{if functions[c]:}}{{=T("exposes")}} {{pass}}{{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}} + +
    • + {{pass}} +
    +
    + + + +

    + {{=T("Views")}} +

    +
    + {{if not views:}} +

    {{=T("There are no views")}}

    + {{pass}} +
    +
    +
      + {{for c in views:}} +
    • + + {{=editfile('views',c)}} + {{=deletefile([app,'views',c])}} + + + {{=peekfile('views',c)}} + + + {{if extend.has_key(c):}}{{=T("extends")}} {{=extend[c]}} {{pass}} + {{if include[c]:}}{{=T("includes")}} {{pass}}{{=XML(', '.join([B(f).xml() for f in include[c]]))}} + +
    • + {{pass}} +
    +
    + + + +

    + {{=T("Static files")}} +

    +
    + {{if not statics:}}

    {{=T("There are no static files")}}

    {{pass}} +
      + {{ + path=[] + for file in statics+['']: + items=file.split('/') + file_path=items[:-1] + filename=items[-1] + while path!=file_path: + if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]): + path.append(file_path[len(path)]) + thispath='static__'+'__'.join(path) + }} +
    • + {{=path[-1]}}/ +
    • + {{ + pass + pass + if filename: + }}
    • + + {{=editfile('static',file)}} {{=deletefile([app,'static',file])}} + + + {{=filename}} + +
    • {{ + pass + pass + }} + {{pass}} +
    +
    + + + +

    + {{=T("Modules")}} +

    +
    + {{if not modules:}} +

    {{=T("There are no modules")}}

    + {{pass}} +
    +
    +
      + {{for m in modules:}} +
    • + {{=editfile('modules',m)}} + {{if m!='__init__.py':}}{{=T("delete")}}{{pass}} + {{=peekfile('modules',m)}} +
    • + {{pass}} +
    +
    + + ADDED applications/admin/views/default/resolve.html Index: applications/admin/views/default/resolve.html ================================================================== --- /dev/null +++ applications/admin/views/default/resolve.html @@ -0,0 +1,24 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}resolve{{end}} + +

    {{=T('Resolve Conflict file')}} "{{=filename}}"

    + + + +
    + + + +
    + +
    +
    + {{=diff}} +
    +
    +
    ADDED applications/admin/views/default/site.html Index: applications/admin/views/default/site.html ================================================================== --- /dev/null +++ applications/admin/views/default/site.html @@ -0,0 +1,156 @@ +{{extend 'layout.html'}} +{{import os, glob}} + +{{block sectionclass}}site{{end}} + +
    +
    +

    {{=T("Installed applications")}}

    +
      + {{for a in apps:}} +
    • + {{if a==request.application:}} +

      {{=a}} ({{=T('currently running')}})

      +

      + {{else:}} +

      {{=A(a,_href=URL(a,'default','index'))}}

      + {{if MULTI_USER_MODE and db.app(name=a):}}(created by {{="%(first_name)s %(last_name)s" % db.auth_user[db.app(name=a).owner]}}){{pass}} +

      + {{if not os.path.exists('applications/%s/compiled' % a):}} + {{=sp_button(URL('design',args=a), T("edit"))}} + {{else:}} + {{=button(URL(a,'appadmin','index'), T("appadmin"))}} + {{pass}} + {{=button(URL('about',args=a), T("about"))}} + {{pass}} + {{=button(URL('errors',args=a), T("errors"))}} + {{=button(URL('cleanup',args=a), T("clean"))}} + {{=button(URL('pack',args=a), T("pack all"))}} + {{if not os.path.exists('applications/%s/compiled' % a):}} + {{=button(URL('compile_app',args=a), T("compile"))}} + {{else:}} + {{=button(URL('pack',args=(a, 'compiled')), T("pack compiled"))}} + {{if glob.glob('applications/%s/controllers/*.py' % a):}} + {{=button(URL('remove_compiled_app',args=a), T("remove compiled"))}} + {{pass}} + {{pass}} + {{if a!=request.application:}} + {{=button(URL('uninstall',args=a), T("uninstall"))}} + {{pass}} +

      +
    • + {{pass}} +
    +
    +
    + + ADDED applications/admin/views/default/test.html Index: applications/admin/views/default/test.html ================================================================== --- /dev/null +++ applications/admin/views/default/test.html @@ -0,0 +1,20 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}test{{end}} + +

    {{=T('Testing application')}} "{{=app}}"

    + +{{for controller in sorted(controllers):}} +
    +

    Testing controller "{{=controller}}"... please wait!

    +
    + + +{{pass}} + +

    {{=T("""If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code. +A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}

    +

    {{=T('Functions with no doctests will result in [passed] tests.')}}

    +

    {{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}

    ADDED applications/admin/views/default/ticket.html Index: applications/admin/views/default/ticket.html ================================================================== --- /dev/null +++ applications/admin/views/default/ticket.html @@ -0,0 +1,132 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}ticket{{end}} + +

    {{=T('Error ticket')}} for "{{=app}}"

    +

    {{=T('Ticket ID')}}

    +

    {{=ticket}}

    +{{if output:}}

    {{=output}}

    {{pass}} +

    {{=T('Version')}}

    + + + + + + + + + + + +
    web2py™{{=myversion}}
    Python{{=snapshot.get('pyver','')}}
    +

    {{=T('Traceback')}}

    +
    +{{=traceback}} +
    + +{{if snapshot:}} +{{try:}} + + + +

    + {{=T('Error snapshot')}} + {{=helpicon()}} {{=T('Detailed traceback description')}} +

    + + + +
    + +

    + {{=snapshot['etype']}}({{=snapshot['evalue']}}) +

    +

    + {{=T('inspect attributes')}} +

    +
    +
    +
    {{=T("Exception instance attributes")}}
    + + + {{for k,v in snapshot['exception'].items():}} + + + + + {{pass}} + +
    {{=k}}{{=v}}
    +
    +
    +
    + + +
    +

    {{=T('Frames')}}

    +
      + {{for i, frame in enumerate(snapshot['frames']):}} +
    • + {{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}} +
      +

      + File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}} + {{=T("code")}} + {{=T("arguments")}} + {{=T("variables")}} +

      +
      +
      Function argument list
      +

      {{=frame['call']}}

      +
      +
      +
      Code listing
      + {{if frame['lines']:}} +
      {{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]), 
      +                    language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}
      + {{pass}} +
      +
      +
      Variables
      + + + {{for k,v in frame['dump'].items():}} + + + + + {{pass}} + +
      {{=k}}{{=v}}
      +
      +
      +
    • + {{pass}} +
    +
    + + +
    +

    Context

    +

    + {{=T('locals')}} + {{=T('request')}} + {{=T('session')}} + {{=T('response')}} +

    +
    locals
    {{=BEAUTIFY(snapshot['locals'])}}
    +
    request
    {{=BEAUTIFY(snapshot['request'])}}
    +
    session
    {{=BEAUTIFY(snapshot['session'])}}
    +
    response
    {{=BEAUTIFY(snapshot['response'])}}
    +
    +{{except Exception, e:}} + + {{import traceback;tb=traceback.format_exc().replace("\n","\\n") }} + +{{pass}} +{{pass}} + +
    +

    In file: {{=layer}}

    + {{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}} +
    ADDED applications/admin/views/default/uninstall.html Index: applications/admin/views/default/uninstall.html ================================================================== --- /dev/null +++ applications/admin/views/default/uninstall.html @@ -0,0 +1,9 @@ +{{extend 'layout.html'}} + +
    +

    {{=T('Are you sure you want to uninstall application "%s"?', app)}}

    + + + +
    {{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')))}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Uninstall')))}}
    +
    ADDED applications/admin/views/default/upgrade_web2py.html Index: applications/admin/views/default/upgrade_web2py.html ================================================================== --- /dev/null +++ applications/admin/views/default/upgrade_web2py.html @@ -0,0 +1,13 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}upgrade{{end}} + +

    {{=T('web2py upgrade')}}

    + +

    {{=T('ATTENTION:')}} {{=T('This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk')}}
    +{{=T('If start the upgrade, be patient, it may take a while to download')}}

    + +
    +{{=FORM(INPUT(_type='submit',_name='noupgrade',_value=T('Cancel')), _class='inline')}} +{{=FORM(INPUT(_type='submit',_name='upgrade',_value=T('Upgrade')), _class='inline')}} +
    ADDED applications/admin/views/default/user.html Index: applications/admin/views/default/user.html ================================================================== --- /dev/null +++ applications/admin/views/default/user.html @@ -0,0 +1,19 @@ +{{extend 'layout.html'}} +

    {{=T( request.args(0).replace('_',' ').capitalize() )}}

    +
    +{{=form}} +{{if request.args(0)=='login':}} +{{if not 'register' in auth.settings.actions_disabled:}} +
    register +{{pass}} +{{if not 'request_reset_password' in auth.settings.actions_disabled:}} +
    lost password +{{pass}} +{{pass}} +
    + + ADDED applications/admin/views/gae/deploy.html Index: applications/admin/views/gae/deploy.html ================================================================== --- /dev/null +++ applications/admin/views/gae/deploy.html @@ -0,0 +1,30 @@ +{{extend 'layout.html'}} + + + + + +

    Google App Engine Deployment Interface

    + +

    {{=T("This page can upload your application to the Google App Engine computing cloud. Mind that you must first create indexes locally and this is done by installing the Google appserver and running the app locally with it once, or there will be errors when selecting records. Attention: deployment may take long time, depending on the network speed. Attention: it will overwrite your app.yaml. DO NOT SUBMIT TWICE.")}}

    + +{{if command:}} +

    Command

    + +{{=CODE(command)}} +

    GAE Output

    +
    
    +{{else:}}
    +

    Deployment form

    +
    +{{=form}} +
    +{{pass}} ADDED applications/admin/views/generic.html Index: applications/admin/views/generic.html ================================================================== --- /dev/null +++ applications/admin/views/generic.html @@ -0,0 +1,18 @@ +{{extend 'layout.html'}} +{{""" + +You should not modify this file. +It is used as default when a view is not provided for your controllers + +"""}} + +{{=BEAUTIFY(response._vars)}} + + + + + + + + + ADDED applications/admin/views/layout.html Index: applications/admin/views/layout.html ================================================================== --- /dev/null +++ applications/admin/views/layout.html @@ -0,0 +1,44 @@ + + + + + + {{=response.title or URL()}} + {{response.files.append(URL('static','css/styles.css'))}} + {{include 'web2py_ajax.html'}} + + + + +
    +
    +
    {{=response.flash or ''}}
    + {{include}} +
    +
    + + + ADDED applications/admin/views/mercurial/commit.html Index: applications/admin/views/mercurial/commit.html ================================================================== --- /dev/null +++ applications/admin/views/mercurial/commit.html @@ -0,0 +1,33 @@ +{{extend 'layout.html'}} +{{import time}} + +

    Mercurial Version Control System Interface
    +for application "{{=request.args[0]}}"

    + +

    Commit form

    +{{=form}} + + +{{if repo['.'].rev()>=0:}} +

    Last Revision

    + + + + + + +
    Revision:{{=repo['.'].rev()}}
    Node:{{=repo['.']}}
    Created by:{{=repo['.'].user()}}
    Created on:{{=time.ctime(repo['.'].date()[0])}}
    Description:{{=repo['.'].description()}}
    + +

    Past revisions

    +
    + {{=changes}} +
    + +{{if files:}} +

    Committed files

    +
    +{{=files}} +
    +{{pass}} + +{{pass}} ADDED applications/admin/views/mercurial/revision.html Index: applications/admin/views/mercurial/revision.html ================================================================== --- /dev/null +++ applications/admin/views/mercurial/revision.html @@ -0,0 +1,17 @@ +{{extend 'layout.html'}} + +

    Revision {{=rev}}

    + +{{=form}} + +

    +

    Changelog

    + +{{=desc}} + +

    +

    Files added

    + +{{=TABLE(*[TR(f) for f in files])}} + + ADDED applications/admin/views/shell/index.html Index: applications/admin/views/shell/index.html ================================================================== --- /dev/null +++ applications/admin/views/shell/index.html @@ -0,0 +1,162 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}shell{{end}} + + +
    + + +
    +
    +
    >>>
    +
    + + Type some Python code in here and hit Return (Enter) to execute it. +
    +
    +
    +
    + +
    +
      +
    • Using the shell may lock the database to other users of this app.
    • +
    • Each db statement is automatically committed.
    • +
    • Creating new tables dynamically is not allowed.
    • +
    • Models are automatically imported in the shell.
    • +
    +
    + + ADDED applications/admin/views/toolbar/index.html Index: applications/admin/views/toolbar/index.html ================================================================== --- /dev/null +++ applications/admin/views/toolbar/index.html @@ -0,0 +1,17 @@ + + + {{response.files.append(URL('static','js/jquery.js'))}} + {{include 'web2py_ajax.html'}} + + +
    + URL: {{=URL(app,'default','index')}} + + +
    + + + ADDED applications/admin/views/web2py_ajax.html Index: applications/admin/views/web2py_ajax.html ================================================================== --- /dev/null +++ applications/admin/views/web2py_ajax.html @@ -0,0 +1,27 @@ +{{ +response.files.insert(0,URL('static','js/jquery.js')) +response.files.insert(1,URL('static','css/calendar.css')) +response.files.insert(2,URL('static','js/calendar.js')) +for _item in response.meta or []:}} + {{ +pass +for _k,_file in enumerate(response.files or []): + if _file in response.files[:_k]: + continue + _file0=_file.lower().split('?')[0] + if _file0.endswith('.css'):}} + {{ + elif _file0.endswith('.js'):}} + {{ + pass +pass +}} + + + + ADDED applications/admin/views/wizard/generated.html Index: applications/admin/views/wizard/generated.html ================================================================== --- /dev/null +++ applications/admin/views/wizard/generated.html @@ -0,0 +1,13 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}generated{{end}} + +Open new app in new window +Back to wizard +Admin design page +{{if have_mercurial:}} +Admin versioning page +{{pass}} +Database administration +

    + ADDED applications/admin/views/wizard/step.html Index: applications/admin/views/wizard/step.html ================================================================== --- /dev/null +++ applications/admin/views/wizard/step.html @@ -0,0 +1,140 @@ +{{extend 'layout.html'}} + +{{block sectionclass}}step{{end}} + +

    {{=T('New Application Wizard')}}

    + +
    +{{if request.function=='index':}} +

    {{=T('Start a new app')}}

    +{{else:}} +
    +

    {{=T('Basics')}}

    +

    {{=button(URL('index'), T('restart'))}}

    +

    App Name: {{=session.app['name']}}

    +
    +
    +

    Current settings

    +

    {{=button(URL('step1'), T('edit'))}}

    +
      + {{for key,value in session.app['params']:}} +
    • {{=key}}: {{=value}}
    • + {{pass}} +
    +
    +
    +

    Tables

    +

    {{=button(URL('step2'), T('edit all'))}}

    +
      + {{for i,table in enumerate(session.app['tables']):}} +
    • {{=button(URL('step3',args=i), T('edit'))}} {{=table}}
    • + {{pass}} +
    +
    +
    +

    Pages

    +

    {{=button(URL('step4'), T('edit all'))}}

    +
      + {{for i,page in enumerate(session.app['pages']):}} +
    • {{=button(URL('step5',args=i), T('edit'))}} {{=page}}
    • + {{pass}} +
    +
    +
    +

    {{=T('Generate')}}

    +

    {{=button(URL('step6'), T('go!'))}}

    +
    +{{pass}} +
    + +
    + + + + {{if 'step' in request.function:}} +

    {{=T('Step')}} {{=step}}

    + {{if request.function!='step1':}} + {{=button(URL('step' + str(int(request.function[-1])-1)), T('back'))}} + {{pass}} + {{else:}} +

    {{=T('Begin')}}

    + {{pass}} + {{if request.function in ('step1','step2','step3','step4','step5'):}} + {{=button(URL('step6'), T('skip to generate'))}} + {{pass}} +

    + {{if request.function in ('step1','step6'):}} + + {{pass}} +
    + {{=form}} +
    + + + +
    +

    Instructions

    +
    + {{if request.function=='index':}} +
      +
    • Insert the name of a new app.
    • +
    • If the app exists and was created with the wizard, you will be able to edit it, but any manual editing to the app will be lost.
    • +
    + {{elif request.function=='step1':}} +
      +
    • This Wizard will help you build a new web2py app.
    • +
    • You can create an app with a name that already exists.
    • +
    • If you do not have an email server set email server to "logging".
    • +
    • If you want to use Janrain Engage for login: 1) Sign up for a Janrain Engage account; 2) Register you hostname, domain, and obtain an api key; 3) Set Login Config above to "domain:api_key".
    • +
    • ATTENTION: you can use the wizard to download plugins BUT we cannot guarantee the stability or backward compatibility of plugins. Moreover plugins may conflict with each other. Anyway, we do recommend installing plugin "wiki" with adds CMS like capabilities to your app.
    • +
    + {{elif request.function=='step2':}} +
      +
    • List the names of table that you need.
    • +
    • If you do not need authentication remove the table "auth_user".
    • +
    • Press enter to create a new input row.
    • +
    • Empty rows are ignored.
    • +
    • Other tables for role based access control will be created automatically, and do not need to be listed.
    • +
    • You will be able to add fields later.
    • +
    + {{elif request.function=='step3':}} +
      +
    • List the fields for this table (do not include an id field, it is automatic), for example "name unique" or "birthday date" or "image upload" or "comments multiple" or "description wiki required"
    • +
    • The first keyword(s) for each entry will be used to generate a name for the table field and its label. You can use spaces an other unicode characters.
    • +
    • Keywords "string" (default), "text", "integer", "boolean", "float", "double", "file", "date", "time", "datetime", "file", "upload" will be used to determine the field type and they will not be made part of the field name. +
    • For a reference field use a field name, followed by the name of the referenced table.
    • +
    • Other special keywords are "required", "notnull" or "notempty", "unique". They map into equivalent validators but (at this time) should only be used with string and text types.
    • +
    • The keywords "html" and "wiki" force a text type and set a representation for the field value as sanitized HTML and MARKMIN resepectively.
    • +
    • string, integer and reference fields can be "multiple", i.e. multiple values will be allowed
    • +
    • For the "auth_user" table do not add attributes to the default fields (username, first_name, last_name, password and email). They are handled automatically.
    • +
    • Some fields will be added automatically upon creation and handled automatically: "created_by", "created_on", "modified_by", "modified_on", "active" (only active fields can be selected).
    • +
    • For every table "table" another table "table_archive" is created and it contains the previous versions of each record. This is only accessible via appadmin or programmatically.
    • +
    + {{elif request.function=='step4':}} +
      +
    • List the names of the pages you want to create.
    • +
    • Some pages are listed automatically because they expose Create/Read/Update/Delete for each tables you have created.
    • +
    • All pages, except "error" and those with name starting in underscore willbe listed in the menu. You will be able to edit the menu later.
    • +
    • You should have page "index", the starting point of your app, and page "error", where web2py will redirect to in case of error.
    • +
    + {{elif request.function=='step5':}} +
      +
    • Use the markmin syntax to add text to your pages.
    • +
    + {{elif request.function=='step6':}} +
      +
    • Almost done. Click on the button above to create your new app.
    • +
    • Once done you will be able to edit it as any normal web2py app.
    • +
    + {{pass}} +
    +
    +
    + ADDED applications/examples/ABOUT Index: applications/examples/ABOUT ================================================================== --- /dev/null +++ applications/examples/ABOUT @@ -0,0 +1,6 @@ +web2py is an open source full-stack framework for agile development +of secure database-driven web-based applications, written and programmable in +Python. + +Created by Massimo Di Pierro + ADDED applications/examples/LICENSE Index: applications/examples/LICENSE ================================================================== --- /dev/null +++ applications/examples/LICENSE @@ -0,0 +1,137 @@ +## Web2py License + +Web2py is Licensed under the LGPL license version 3 +(http://www.gnu.org/licenses/lgpl.html) + +Copyrighted (c) by Massimo Di Pierro (2007-2011) + +### On Commercial Redistribution + +In accordance with LGPL you may: +- redistribute web2py with your apps (including official web2py binary versions) +- release your applications which use official web2py libraries under any license you wish +But you must: +- make clear in the documentation that your application uses web2py +- release any modification of the web2py libraries under the LGPLv3 license + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, +BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +(Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a +commercial exception which, for practical purposes, was very similar to the current LPGLv3) + +### Licenses for third party contributed software + +web2py contains third party software under the gluon/contrib/ folder. +Each file/module in contrib is distributed with web2py under its original license. +Here we list some of them. + +#### gluon.contrib.simplejson LICENSE + +Copyright (c) 2006 Bob Ippolito - Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +#### gluon.contrib.rss2.py (originally PyRSS2Gen) LICENSE + +This is copyright (c) by Dalke Scientific Software, LLC and released under the +BSD license. See the file LICENSE in the distribution or + for details. + +#### gluon.contrib.markdown (markdown2) LICENSE + +MIT License from from + +#### gluon.contrib.feedparser LICENSE + +Copyright (c) 2002-2005, Mark Pilgrim + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +#### gluon.wsgiserver.py LICENSE (borrowed from cherrypy) + +Copyright (c) 2004, CherryPy Team (team@cherrypy.org) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the CherryPy Team nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### gluon.contrib.pam LICENSE + +Copyright (C) 2007-2009 Chris AtLee Licensed under the MIT license + +#### gluon.contrib.shell LICENSE + +Copyright (C) by Google inc. Apache 2.0 Lincense + +#### The javascript licenses are in the code itself + ADDED applications/examples/__init__.py Index: applications/examples/__init__.py ================================================================== --- /dev/null +++ applications/examples/__init__.py ADDED applications/examples/controllers/ajax_examples.py Index: applications/examples/controllers/ajax_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/ajax_examples.py @@ -0,0 +1,26 @@ + + + + +def index(): + return dict() + + +def data(): + if not session.m or len(session.m) == 10: + session.m = [] + if request.vars.q: + session.m.append(request.vars.q) + session.m.sort() + return TABLE(*[TR(v) for v in session.m]).xml() + + +def flash(): + response.flash = 'this text should appear!' + return dict() + + +def fade(): + return dict() + + ADDED applications/examples/controllers/appadmin.py Index: applications/examples/controllers/appadmin.py ================================================================== --- /dev/null +++ applications/examples/controllers/appadmin.py @@ -0,0 +1,408 @@ +# -*- coding: utf-8 -*- + +# ########################################################## +# ## make sure administrator is on localhost +# ########################################################### + +import os +import socket +import datetime +import copy +import gluon.contenttype +import gluon.fileutils + +# ## critical --- make a copy of the environment + +global_env = copy.copy(globals()) +global_env['datetime'] = datetime + +http_host = request.env.http_host.split(':')[0] +remote_addr = request.env.remote_addr +try: + hosts = (http_host, socket.gethostname(), + socket.gethostbyname(http_host), + '::1','127.0.0.1','::ffff:127.0.0.1') +except: + hosts = (http_host, ) + +if request.env.http_x_forwarded_for or request.env.wsgi_url_scheme\ + in ['https', 'HTTPS']: + session.secure() +elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"): + raise HTTP(200, T('appadmin is disabled because insecure channel')) + +if (request.application=='admin' and not session.authorized) or \ + (request.application!='admin' and not gluon.fileutils.check_credentials(request)): + redirect(URL('admin', 'default', 'index')) + +ignore_rw = True +response.view = 'appadmin.html' +response.menu = [[T('design'), False, URL('admin', 'default', 'design', + args=[request.application])], [T('db'), False, + URL('index')], [T('state'), False, + URL('state')], [T('cache'), False, + URL('ccache')]] + +# ########################################################## +# ## auxiliary functions +# ########################################################### + + +def get_databases(request): + dbs = {} + for (key, value) in global_env.items(): + cond = False + try: + cond = isinstance(value, GQLDB) + except: + cond = isinstance(value, SQLDB) + if cond: + dbs[key] = value + return dbs + + +databases = get_databases(None) + + +def eval_in_global_env(text): + exec ('_ret=%s' % text, {}, global_env) + return global_env['_ret'] + + +def get_database(request): + if request.args and request.args[0] in databases: + return eval_in_global_env(request.args[0]) + else: + session.flash = T('invalid request') + redirect(URL('index')) + + +def get_table(request): + db = get_database(request) + if len(request.args) > 1 and request.args[1] in db.tables: + return (db, request.args[1]) + else: + session.flash = T('invalid request') + redirect(URL('index')) + + +def get_query(request): + try: + return eval_in_global_env(request.vars.query) + except Exception: + return None + + +def query_by_table_type(tablename,db,request=request): + keyed = hasattr(db[tablename],'_primarykey') + if keyed: + firstkey = db[tablename][db[tablename]._primarykey[0]] + cond = '>0' + if firstkey.type in ['string', 'text']: + cond = '!=""' + qry = '%s.%s.%s%s' % (request.args[0], request.args[1], firstkey.name, cond) + else: + qry = '%s.%s.id>0' % tuple(request.args[:2]) + return qry + + + +# ########################################################## +# ## list all databases and tables +# ########################################################### + + +def index(): + return dict(databases=databases) + + +# ########################################################## +# ## insert a new record +# ########################################################### + + +def insert(): + (db, table) = get_table(request) + form = SQLFORM(db[table], ignore_rw=ignore_rw) + if form.accepts(request.vars, session): + response.flash = T('new record inserted') + return dict(form=form,table=db[table]) + + +# ########################################################## +# ## list all records in table and insert new record +# ########################################################### + + +def download(): + import os + db = get_database(request) + return response.download(request,db) + +def csv(): + import gluon.contenttype + response.headers['Content-Type'] = \ + gluon.contenttype.contenttype('.csv') + db = get_database(request) + query = get_query(request) + if not query: + return None + response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\ + % tuple(request.vars.query.split('.')[:2]) + return str(db(query).select()) + + +def import_csv(table, file): + table.import_from_csv_file(file) + +def select(): + import re + db = get_database(request) + dbname = request.args[0] + regex = re.compile('(?P\w+)\.(?P\w+)=(?P\d+)') + if len(request.args)>1 and hasattr(db[request.args[1]],'_primarykey'): + regex = re.compile('(?P
    \w+)\.(?P\w+)=(?P.+)') + if request.vars.query: + match = regex.match(request.vars.query) + if match: + request.vars.query = '%s.%s.%s==%s' % (request.args[0], + match.group('table'), match.group('field'), + match.group('value')) + else: + request.vars.query = session.last_query + query = get_query(request) + if request.vars.start: + start = int(request.vars.start) + else: + start = 0 + nrows = 0 + stop = start + 100 + table = None + rows = [] + orderby = request.vars.orderby + if orderby: + orderby = dbname + '.' + orderby + if orderby == session.last_orderby: + if orderby[0] == '~': + orderby = orderby[1:] + else: + orderby = '~' + orderby + session.last_orderby = orderby + session.last_query = request.vars.query + form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px', + _name='query', _value=request.vars.query or '', + requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR(T('Update:'), + INPUT(_name='update_check', _type='checkbox', + value=False), INPUT(_style='width:400px', + _name='update_fields', _value=request.vars.update_fields + or '')), TR(T('Delete:'), INPUT(_name='delete_check', + _class='delete', _type='checkbox', value=False), ''), + TR('', '', INPUT(_type='submit', _value='submit'))), + _action=URL(r=request,args=request.args)) + if request.vars.csvfile != None: + try: + import_csv(db[request.vars.table], + request.vars.csvfile.file) + response.flash = T('data uploaded') + except Exception, e: + response.flash = DIV(T('unable to parse csv file'),PRE(str(e))) + if form.accepts(request.vars, formname=None): +# regex = re.compile(request.args[0] + '\.(?P
    \w+)\.id\>0') + regex = re.compile(request.args[0] + '\.(?P
    \w+)\..+') + + match = regex.match(form.vars.query.strip()) + if match: + table = match.group('table') + try: + nrows = db(query).count() + if form.vars.update_check and form.vars.update_fields: + db(query).update(**eval_in_global_env('dict(%s)' + % form.vars.update_fields)) + response.flash = T('%s rows updated', nrows) + elif form.vars.delete_check: + db(query).delete() + response.flash = T('%s rows deleted', nrows) + nrows = db(query).count() + if orderby: + rows = db(query).select(limitby=(start, stop), + orderby=eval_in_global_env(orderby)) + else: + rows = db(query).select(limitby=(start, stop)) + except Exception, e: + (rows, nrows) = ([], 0) + response.flash = DIV(T('Invalid Query'),PRE(str(e))) + return dict( + form=form, + table=table, + start=start, + stop=stop, + nrows=nrows, + rows=rows, + query=request.vars.query, + ) + + +# ########################################################## +# ## edit delete one record +# ########################################################### + + +def update(): + (db, table) = get_table(request) + keyed = hasattr(db[table],'_primarykey') + record = None + if keyed: + key = [f for f in request.vars if f in db[table]._primarykey] + if key: + record = db(db[table][key[0]] == request.vars[key[0]]).select().first() + else: + record = db(db[table].id == request.args(2)).select().first() + + if not record: + qry = query_by_table_type(table, db) + session.flash = T('record does not exist') + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + + if keyed: + for k in db[table]._primarykey: + db[table][k].writable=False + + form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'), + ignore_rw=ignore_rw and not keyed, + linkto=URL('select', + args=request.args[:1]), upload=URL(r=request, + f='download', args=request.args[:1])) + + if form.accepts(request.vars, session): + session.flash = T('done!') + qry = query_by_table_type(table, db) + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + return dict(form=form,table=db[table]) + + +# ########################################################## +# ## get global variables +# ########################################################### + + +def state(): + return dict() + +def ccache(): + form = FORM( + P(TAG.BUTTON("Clear CACHE?", _type="submit", _name="yes", _value="yes")), + P(TAG.BUTTON("Clear RAM", _type="submit", _name="ram", _value="ram")), + P(TAG.BUTTON("Clear DISK", _type="submit", _name="disk", _value="disk")), + ) + + if form.accepts(request.vars, session): + clear_ram = False + clear_disk = False + session.flash = "" + if request.vars.yes: + clear_ram = clear_disk = True + if request.vars.ram: + clear_ram = True + if request.vars.disk: + clear_disk = True + + if clear_ram: + cache.ram.clear() + session.flash += "Ram Cleared " + if clear_disk: + cache.disk.clear() + session.flash += "Disk Cleared" + + redirect(URL(r=request)) + + try: + from guppy import hpy; hp=hpy() + except ImportError: + hp = False + + import shelve, os, copy, time, math + from gluon import portalocker + + ram = { + 'bytes': 0, + 'objects': 0, + 'hits': 0, + 'misses': 0, + 'ratio': 0, + 'oldest': time.time() + } + disk = copy.copy(ram) + total = copy.copy(ram) + + for key, value in cache.ram.storage.items(): + if isinstance(value, dict): + ram['hits'] = value['hit_total'] - value['misses'] + ram['misses'] = value['misses'] + try: + ram['ratio'] = ram['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + ram['ratio'] = 0 + else: + if hp: + ram['bytes'] += hp.iso(value[1]).size + ram['objects'] += hp.iso(value[1]).count + + if value[0] < ram['oldest']: + ram['oldest'] = value[0] + + locker = open(os.path.join(request.folder, + 'cache/cache.lock'), 'a') + portalocker.lock(locker, portalocker.LOCK_EX) + disk_storage = shelve.open(os.path.join(request.folder, 'cache/cache.shelve')) + try: + for key, value in disk_storage.items(): + if isinstance(value, dict): + disk['hits'] = value['hit_total'] - value['misses'] + disk['misses'] = value['misses'] + try: + disk['ratio'] = disk['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + disk['ratio'] = 0 + else: + if hp: + disk['bytes'] += hp.iso(value[1]).size + disk['objects'] += hp.iso(value[1]).count + if value[0] < disk['oldest']: + disk['oldest'] = value[0] + finally: + portalocker.unlock(locker) + locker.close() + disk_storage.close() + + total['bytes'] = ram['bytes'] + disk['bytes'] + total['objects'] = ram['objects'] + disk['objects'] + total['hits'] = ram['hits'] + disk['hits'] + total['misses'] = ram['misses'] + disk['misses'] + try: + total['ratio'] = total['hits'] * 100 / (total['hits'] + total['misses']) + except (KeyError, ZeroDivisionError): + total['ratio'] = 0 + + if disk['oldest'] < ram['oldest']: + total['oldest'] = disk['oldest'] + else: + total['oldest'] = ram['oldest'] + + def GetInHMS(seconds): + hours = math.floor(seconds / 3600) + seconds -= hours * 3600 + minutes = math.floor(seconds / 60) + seconds -= minutes * 60 + seconds = math.floor(seconds) + + return (hours, minutes, seconds) + + ram['oldest'] = GetInHMS(time.time() - ram['oldest']) + disk['oldest'] = GetInHMS(time.time() - disk['oldest']) + total['oldest'] = GetInHMS(time.time() - total['oldest']) + + return dict(form=form, total=total, + ram=ram, disk=disk) + ADDED applications/examples/controllers/database_examples.py Index: applications/examples/controllers/database_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/database_examples.py @@ -0,0 +1,152 @@ +from gluon.fileutils import read_file + +response.menu = [['Register User', False, URL(r=request, + f='register_user')], ['Register Dog', False, + URL('register_dog')], ['Register Product' + , False, URL('register_product')], + ['Buy product', False, URL('buy')]] + + +def register_user(): + """ simple user registration form with validation and database.insert() + also lists all records currently in the table""" + + # ## create an insert form from the table + + form = SQLFORM(db.users) + + # ## if form correct perform the insert + + if form.accepts(request.vars, session): + response.flash = 'new record inserted' + + # ## and get a list of all users + + records = SQLTABLE(db().select(db.users.ALL)) + return dict(form=form, records=records) + + +def register_dog(): + """ simple user registration form with validation and database.insert() + also lists all records currently in the table""" + + form = SQLFORM(db.dogs) + if form.accepts(request.vars, session): + response.flash = 'new record inserted' + download = URL('download') # to see the picture + records = SQLTABLE(db().select(db.dogs.ALL), upload=download) + return dict(form=form, records=records) + + +def register_product(): + """ simple user registration form with validation and database.insert() + also lists all records currently in the table""" + + form = SQLFORM(db.products) + if form.accepts(request.vars, session): + response.flash = 'new record inserted' + records = SQLTABLE(db().select(db.products.ALL)) + return dict(form=form, records=records) + + +def buy(): + """ uses a form to query who is buying what. validates form and + updates existing record or inserts new record in purchases """ + + buyerRecords = db().select(db.users.ALL) + buyerOptions = [] + for row in buyerRecords: + buyerOptions.append(OPTION(row.name, _value=row.id)) + + productRecords = db().select(db.products.ALL) + productOptions = [] + for row in productRecords: + productOptions.append(OPTION(row.name, _value=row.id)) + + form = FORM(TABLE( + TR('Buyer id:', + SELECT(buyerOptions,_name='buyer_id')), + TR('Product id:', + SELECT(productOptions,_name='product_id')), + TR('Quantity:', + INPUT(_type='text', _name='quantity', + requires=IS_INT_IN_RANGE(1, 100))), + TR('', + INPUT(_type='submit', _value='Order')) + )) + if form.accepts(request.vars, session, keepvalues=True): + + # ## check if user is in the database + + if len(db(db.users.id == form.vars.buyer_id).select()) == 0: + form.errors.buyer_id = 'buyer not in database' + + # ## check if product is the database + + if len(db(db.products.id == form.vars.product_id).select())\ + == 0: + form.errors.product_id = 'product not in database' + + # ## if no errors + + if len(form.errors) == 0: + + # ## get a list of same purchases by same user + + purchases = db((db.purchases.buyer_id == form.vars.buyer_id) + & (db.purchases.product_id + == form.vars.product_id)).select() + + # ## if list contains a record, update that record + + if len(purchases) > 0: + purchases[0].update_record(quantity=purchases[0].quantity + + form.vars.quantity) + else: + + # ## or insert a new record in table + db.purchases.insert(buyer_id=form.vars.buyer_id, + product_id=form.vars.product_id, + quantity=form.vars.quantity) + response.flash = 'product purchased!' + if len(form.errors): + response.flash = 'invalid values in form!' + + # ## now get a list of all purchases + + # quick fix to make it runnable on gae + if purchased: + records = db(purchased).select(db.users.name, + db.purchases.quantity, + db.products.name) + else: + records = db().select(db.purchases.ALL) + return dict(form=form, records=SQLTABLE(records), vars=form.vars, + vars2=request.vars) + + +def delete_purchased(): + """ delete all records in purchases """ + + db(db.purchases.id > 0).delete() + redirect(URL('buy')) + + +def reset_purchased(): + """ set quantity=0 for all records in purchases """ + + db(db.purchases.id > 0).update(quantity=0) + redirect(URL('buy')) + + +def download(): + """ used to download uploaded files """ + + import gluon.contenttype + app = request.application + filename = request.args[0] + response.headers['Content-Type'] = \ + gluon.contenttype.contenttype(filename) + return read_file('applications/%s/uploads/%s' % (app, filename), 'rb') + + ADDED applications/examples/controllers/default.py Index: applications/examples/controllers/default.py ================================================================== --- /dev/null +++ applications/examples/controllers/default.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +from gluon.fileutils import read_file + +response.title = T('web2py Web Framework') +response.keywords = T('web2py, Python, Web Framework') +response.description = T('web2py Web Framework') + +session.forget() + +@cache('index') +def index(): + return response.render() + +@cache('what') +def what(): + return response.render() + +@cache('download') +def download(): + return response.render() + +@cache('who') +def who(): + return response.render() + +@cache('support') +def support(): + return response.render() + +@cache('documentation') +def documentation(): + return response.render() + +@cache('usergroups') +def usergroups(): + return response.render() + +def contact(): + redirect(URL('default','usergroups')) + +@cache('videos') +def videos(): + return response.render() + +def security(): + redirect('http://www.web2py.com/book/default/chapter/01#security') + +def api(): + redirect('http://web2py.com/book/default/chapter/04#API') + +@cache('license') +def license(): + import os + filename = os.path.join(request.env.gluon_parent, 'LICENSE') + return response.render(dict(license=MARKMIN(read_file(filename)))) + +def version(): + return request.env.web2py_version + +@cache('examples') +def examples(): + return response.render() + +@cache('changelog') +def changelog(): + import os + filename = os.path.join(request.env.gluon_parent, 'README') + return response.render(dict(changelog=MARKMIN(read_file(filename)))) ADDED applications/examples/controllers/form_examples.py Index: applications/examples/controllers/form_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/form_examples.py @@ -0,0 +1,27 @@ + + + +def form(): + """ a simple entry form with various types of objects """ + + form = FORM(TABLE( + TR('Your name:', INPUT(_type='text', _name='name', + requires=IS_NOT_EMPTY())), + TR('Your email:', INPUT(_type='text', _name='email', + requires=IS_EMAIL())), + TR('Admin', INPUT(_type='checkbox', _name='admin')), + TR('Sure?', SELECT('yes', 'no', _name='sure', + requires=IS_IN_SET(['yes', 'no']))), + TR('Profile', TEXTAREA(_name='profile', + value='write something here')), + TR('', INPUT(_type='submit', _value='SUBMIT')), + )) + if form.accepts(request.vars, session): + response.flash = 'form accepted' + elif form.errors: + response.flash = 'form is invalid' + else: + response.flash = 'please fill the form' + return dict(form=form, vars=form.vars) + + ADDED applications/examples/controllers/global.py Index: applications/examples/controllers/global.py ================================================================== --- /dev/null +++ applications/examples/controllers/global.py @@ -0,0 +1,81 @@ + +session.forget() + +response.menu = [['home', False, '/%s/default/index' + % request.application], ['docs', True, + '/%s/global/vars' % request.application]] + + +def vars(): + """the running controller function!""" + + if not request.args: + ( + doc, + keys, + t, + c, + d, + value, + ) = ( + 'Global variables', + globals(), + None, + None, + (), + None, + ) + (title, args) = ('globals()', '') + elif len(request.args) < 3: + args = '.'.join(request.args) + try: + doc = eval(args + '.__doc__') + except: + doc = 'no documentation' + try: + keys = eval('dir(%s)' % args) + except: + keys = [] + t = eval('type(%s)' % args) + try: + c = eval('%s.__class__' % args) + except: + c = None + try: + d = eval('%s.__bases__' % args) + except: + d = None + title = args + args += '.' + else: + raise HTTP(400) + attributes = {} + for key in keys: + a = args + key + if eval('isinstance(%s,SQLDB)' % a) or a == 'vars': + continue + try: + doc1 = eval(a + '.__doc__') + except: + doc1 = 'no documentation' + t1 = eval('type(%s)' % a) + try: + c1 = eval('%s.__class__' % a) + except: + c1 = None + try: + d1 = eval('%s.__bases__' % a) + except: + d1 = () + attributes[a] = (doc1, t1, c1, d1) + return dict( + title=title, + args=args, + t=t, + c=c, + d=d, + doc=doc, + attributes=attributes, + ) + + ADDED applications/examples/controllers/layout_examples.py Index: applications/examples/controllers/layout_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/layout_examples.py @@ -0,0 +1,27 @@ + + + +def civilized(): + response.menu = [['civilized', True, URL('civilized' + )], ['slick', False, URL('slick')], + ['basic', False, URL('basic')]] + response.flash = 'you clicked on civilized' + return dict(message='you clicked on civilized') + + +def slick(): + response.menu = [['civilized', False, URL('civilized' + )], ['slick', True, URL('slick')], + ['basic', False, URL('basic')]] + response.flash = 'you clicked on slick' + return dict(message='you clicked on slick') + + +def basic(): + response.menu = [['civilized', False, URL('civilized' + )], ['slick', False, URL('slick')], + ['basic', True, URL('basic')]] + response.flash = 'you clicked on basic' + return dict(message='you clicked on basic') + + ADDED applications/examples/controllers/session_examples.py Index: applications/examples/controllers/session_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/session_examples.py @@ -0,0 +1,12 @@ + + + +def counter(): + """ every time you reload, it increases the session.counter """ + + if not session.counter: + session.counter = 0 + session.counter += 1 + return dict(counter=session.counter) + + ADDED applications/examples/controllers/simple_examples.py Index: applications/examples/controllers/simple_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/simple_examples.py @@ -0,0 +1,140 @@ +def hello1(): + """ simple page without template """ + + return 'Hello World' + + +def hello2(): + """ simple page without template but with internationalization """ + + return T('Hello World') + + +def hello3(): + """ page rendered by template simple_examples/index3.html or generic.html""" + + return dict(message='Hello World') + + +def hello4(): + """ page rendered by template simple_examples/index3.html or generic.html""" + + response.view = 'simple_examples/hello3.html' + return dict(message=T('Hello World')) + + +def hello5(): + """ generates full page in controller """ + + return HTML(BODY(H1(T('Hello World'), _style='color: red;'))).xml() # .xml to serialize + + +def hello6(): + """ page rendered with a flash""" + + response.flash = 'Hello World in a flash!' + return dict(message=T('Hello World')) + + +def status(): + """ page that shows internal status""" + response.view = 'generic.html' + return dict(request=request, session=session, response=response) + + +def redirectme(): + """ redirects to /{{=request.application}}/{{=request.controller}}/hello3 """ + + redirect(URL('hello3')) + + +def raisehttp(): + """ returns an HTTP 400 ERROR page """ + + raise HTTP(400, 'internal error') + + +def raiseexception(): + """ generates an exeption, logs the event and returns a ticket number """ + + 1 / 0 + return 'oops' + + +def servejs(): + """ serves a js document """ + + import gluon.contenttype + response.headers['Content-Type'] = \ + gluon.contenttype.contenttype('.js') + return 'alert("This is a Javascript document, it is not supposed to run!");' + + +def makejson(): + import gluon.contrib.simplejson as sj + return sj.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) + + +def makertf(): + import gluon.contrib.pyrtf as q + doc = q.Document() + section = q.Section() + doc.Sections.append(section) + section.append('Section Title') + section.append('web2py is great. ' * 100) + response.headers['Content-Type'] = 'text/rtf' + return q.dumps(doc) + + +def rss_aggregator(): + import datetime + import gluon.contrib.rss2 as rss2 + import gluon.contrib.feedparser as feedparser + d = feedparser.parse('http://rss.slashdot.org/Slashdot/slashdot/to') + + rss = rss2.RSS2(title=d.channel.title, link=d.channel.link, + description=d.channel.description, + lastBuildDate=datetime.datetime.now(), + items=[rss2.RSSItem(title=entry.title, + link=entry.link, description=entry.description, + pubDate=datetime.datetime.now()) for entry in + d.entries]) + response.headers['Content-Type'] = 'application/rss+xml' + return rss2.dumps(rss) + + + +def ajaxwiki(): + default=""" +# section + +## subsection + +### sub subsection + +- **bold** text +- ''italic'' +- [[link http://google.com]] + +`` +def index: return 'hello world' +`` + +----------- +Quoted text +----------- + +--------- +0 | 0 | 1 +0 | 2 | 0 +3 | 0 | 0 +--------- +""" + form = FORM(TEXTAREA(_id='text',_name='text',value=default), + INPUT(_type='button', + _value='markmin', + _onclick="ajax('ajaxwiki_onclick',['text'],'html')")) + return dict(form=form, html=DIV(_id='html')) + +def ajaxwiki_onclick(): + return MARKMIN(request.vars.text).xml() ADDED applications/examples/controllers/spreadsheet.py Index: applications/examples/controllers/spreadsheet.py ================================================================== --- /dev/null +++ applications/examples/controllers/spreadsheet.py @@ -0,0 +1,9 @@ +from gluon.contrib.spreadsheet import Sheet + +def callback(): + return cache.ram('sheet1',lambda:None,None).process(request) + +def index(): + sheet = cache.ram('sheet1',lambda:Sheet(10,10,URL('callback')),0) + #sheet.cell('r0c3',value='=r0c0+r0c1+r0c2',readonly=True) + return dict(sheet=sheet) ADDED applications/examples/controllers/template_examples.py Index: applications/examples/controllers/template_examples.py ================================================================== --- /dev/null +++ applications/examples/controllers/template_examples.py @@ -0,0 +1,35 @@ + + + +def variables(): + return dict(a=10, b=20) + + +def test_for(): + return dict() + + +def test_if(): + return dict() + + +def test_try(): + return dict() + + +def test_def(): + return dict() + + +def escape(): + return dict(message='

    text is scaped

    ') + + +def xml(): + return dict(message=XML('

    text is not escaped

    ')) + + +def beautify(): + return dict(message=BEAUTIFY(request)) + + ADDED applications/examples/models/db.py Index: applications/examples/models/db.py ================================================================== --- /dev/null +++ applications/examples/models/db.py @@ -0,0 +1,69 @@ +######################################################################### +## This scaffolding model makes your app work on Google App Engine too +######################################################################### + +if request.controller.endswith('_examples'): response.generic_patterns.append('*') + +from gluon.settings import settings + +# if running on Google App Engine +if settings.web2py_runtime_gae: + from gluon.contrib.gql import * + # connect to Google BigTable + db = DAL('gae') + # and store sessions there + session.connect(request, response, db=db) +else: + # if not, use SQLite or other DB + db = DAL('sqlite://storage.sqlite') + +db.define_table( + 'users', + Field('name'), + Field('email') + ) + +# ONE (users) TO MANY (dogs) + +db.define_table( + 'dogs', + Field('owner_id', db.users), + Field('name'), + Field('type'), + Field('vaccinated', 'boolean', default=False), + Field('picture', 'upload', default=''), + ) + +db.define_table( + 'products', + Field('name'), + Field('description', 'text') + ) + +# MANY (users) TO MANY (purchases) + +db.define_table( + 'purchases', + Field('buyer_id', db.users), + Field('product_id', db.products), + Field('quantity', 'integer') + ) + +# if running on Google App Engine +if settings.web2py_runtime_gae: + # quick hack to skip the join + purchased = None +else: + # use a joined view + purchased = (db.users.id == db.purchases.buyer_id) & (db.products.id + == db.purchases.product_id) + +db.users.name.requires = IS_NOT_EMPTY() +db.users.email.requires = [IS_EMAIL(), IS_NOT_IN_DB(db, 'users.email')] +db.dogs.owner_id.requires = IS_IN_DB(db, 'users.id', 'users.name') +db.dogs.name.requires = IS_NOT_EMPTY() +db.dogs.type.requires = IS_IN_SET(['small', 'medium', 'large']) +db.purchases.buyer_id.requires = IS_IN_DB(db, 'users.id', 'users.name') +db.purchases.product_id.requires = IS_IN_DB(db, 'products.id', + 'products.name') +db.purchases.quantity.requires = IS_INT_IN_RANGE(0, 10) ADDED applications/examples/models/feeds_reader.py Index: applications/examples/models/feeds_reader.py ================================================================== --- /dev/null +++ applications/examples/models/feeds_reader.py @@ -0,0 +1,48 @@ + +def group_feed_reader(group,mode='div',counter='5'): + """parse group feeds""" + + url = "http://groups.google.com/group/%s/feed/rss_v2_0_topics.xml?num=%s" %\ + (group,counter) + from gluon.contrib import feedparser + g = feedparser.parse(url) + + if mode == 'div': + html = XML(TAG.BLOCKQUOTE(UL(*[LI(A(entry['title']+' - ' +\ + entry['author'][entry['author'].rfind('('):],\ + _href=entry['link'],_target='_blank'))\ + for entry in g['entries'] ]),\ + _class="boxInfo",\ + _style="padding-bottom:5px;")) + + else: + html = XML(UL(*[LI(A(entry['title']+' - ' +\ + entry['author'][entry['author'].rfind('('):],\ + _href=entry['link'],_target='_blank'))\ + for entry in g['entries'] ])) + + return html + + +def code_feed_reader(project,mode='div'): + """parse code feeds""" + + url = "http://code.google.com/feeds/p/%s/hgchanges/basic" % project + from gluon.contrib import feedparser + g = feedparser.parse(url) + if mode == 'div': + html = XML(DIV(UL(*[LI(A(entry['title'],_href=entry['link'],\ + _target='_blank'))\ + for entry in g['entries'][0:5]]),\ + _class="boxInfo",\ + _style="padding-bottom:5px;")) + else: + html = XML(UL(*[LI(A(entry['title'],_href=entry['link'],\ + _target='_blank'))\ + for entry in g['entries'][0:5]])) + + + return html + + + ADDED applications/examples/models/markmin.py Index: applications/examples/models/markmin.py ================================================================== --- /dev/null +++ applications/examples/models/markmin.py @@ -0,0 +1,37 @@ +import gluon.template + +markmin_dict = dict(template=lambda \ + code:gluon.template.render(code,context=globals()), + sup=lambda \ + code:'%s'%code, + br=lambda n:'
    '*int(n), + groupdates=lambda group:group_feed_reader(group), + ) + +def get_content(b=None,\ + c=request.controller,\ + f=request.function,\ + l='en',\ + format='markmin'): + """Gets and renders the file in + /private/content////. + """ + + def openfile(): + import os + path = os.path.join(request.folder,'private','content',l,c,f,b+'.'+format) + return open(path) + + try: + openedfile = openfile() + except Exception, IOError: + l='en' + openedfile = openfile() + + if format == 'markmin': + html = MARKMIN(str(T(openedfile.read())),markmin_dict) + else: + html = str(T(openedfile.read())) + openedfile.close() + + return html ADDED applications/examples/models/menu.py Index: applications/examples/models/menu.py ================================================================== --- /dev/null +++ applications/examples/models/menu.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +######################################################################### +## Changes the menu active item +######################################################################### +def toggle_menuclass(cssclass='pressed',menuid='headermenu'): + """This function changes the menu class to put pressed appearance""" + + positions = dict( + index='', + what='-108px -115px', + download='-211px -115px', + who='-315px -115px', + support='-418px -115px', + documentation='-520px -115px' + ) + + + if request.function in positions.keys(): + jscript = """ + + """ % dict(cssclass=cssclass, + menuid=menuid, + function=request.function, + cssposition=positions[request.function] + ) + + return XML(jscript) + else: + return '' ADDED applications/examples/private/content/en/default/documentation/community.markmin Index: applications/examples/private/content/en/default/documentation/community.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/documentation/community.markmin @@ -0,0 +1,9 @@ +### Community sources + +#### Sites +- [[web2pyslices (recipes) http://web2pyslices.com popup]] +- [[web2py utils documentation http://packages.python.org/web2py_utils/ popup]] +- [[web2pybrasil http://www.web2pybrasil.com.br popup]] +- Apostila em português [[Download http://dl.dropbox.com/u/830444/apostila_web2py_basico.pdf popup]] e [[Online http://web2pybrasil.appspot.com/init/plugin_wiki/page/curso-web2py-000 popup]] +- [[Sitio en español http://www.web2py.com.ar popup]] +- [[Documentación en español http://www.web2py.com.ar/examples/default/docs popup]] ADDED applications/examples/private/content/en/default/documentation/main.markmin Index: applications/examples/private/content/en/default/documentation/main.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/documentation/main.markmin @@ -0,0 +1,4 @@ +## web2py``TM``:sup Documentation + +Here is listed knows sources of documentation on web2py +you can submit your own source [[here contact]] ADDED applications/examples/private/content/en/default/documentation/more.markmin Index: applications/examples/private/content/en/default/documentation/more.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/documentation/more.markmin @@ -0,0 +1,10 @@ +### More resources + +- [[videos http://www.web2py.com/examples/default/videos/ popup]] +- [[Quick Examples http://web2py.com/examples/default/examples popup]] +- [[FAQ http://www.web2py.com/AlterEgo popup]] +- [[Appliances http://web2py.com/appliances popup]] +- [[User Voice http://web2py.uservoice.com/ popup]] +- [[web2py utils http://packages.python.org/web2py_utils/ popup]] +- [[Layouts http://web2py.com/layouts popup]] +- [[Plugins http://web2py.com/plugins popup]] ADDED applications/examples/private/content/en/default/documentation/official.markmin Index: applications/examples/private/content/en/default/documentation/official.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/documentation/official.markmin @@ -0,0 +1,8 @@ +### Official documentation + +#### Books +- [[**web2py full/free online book (english)** http://web2py.com/book popup]] +- [[web2py book (spanish) http://www.latinuxpress.com/books/drafts/web2py/ popup]] +- [[buy e-book/printed version http://stores.lulu.com/web2py popup]] +- [[Epydoc http://www.web2py.com/examples/static/epydoc/index.html popup]] +- [[API http://web2py.com/book/default/chapter/04#API popup]] ADDED applications/examples/private/content/en/default/index/maincontent.markmin Index: applications/examples/private/content/en/default/index/maincontent.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/index/maincontent.markmin @@ -0,0 +1,2 @@ +## web2py``TM``:sup Web Framework +Free open source full-stack framework for rapid development of fast, scalable, [[secure http://www.web2py.com/book/default/chapter/01#security popup]] and portable database-driven web-based applications. Written and programmable in [[Python http://www.python.org popup]]. [[LGPLv3 License http://www.gnu.org/licenses/lgpl.html]] ADDED applications/examples/private/content/en/default/index/whyweb2py.markmin Index: applications/examples/private/content/en/default/index/whyweb2py.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/index/whyweb2py.markmin @@ -0,0 +1,12 @@ +### Why web2py? + +- **Created by a community of professionals** and University professors in Computer Science and Software Engineering. +- **Always backward compatible.** We have not broken backward compatibility since version 1.0 in 2007, and we pledge not to break it in the future. +- **Easy to run.** It requires no installation and no configuration. +- **Runs on** Windows, Mac, Unix/Linux, Google App Engine, Amazon EC2, and almost any web hosting via Python 2.5/2.6/2.7, or Java with Jython. +- **Runs with** Apache, Lighttpd, Cherokee and almost any other web server via CGI, FastCGI, WSGI, mod_proxy, and/or mod_python. It can embed third party WSGI apps and middleware. +- **Talks to** SQLite, PostgreSQL, MySQL, MSSQL, FireBird, Oracle, IBM DB2, Informix, Ingres, and Google App Engine. +- **Secure** [[It prevents the most common types of vulnerabilities http://web2py.com/examples/default/security]] including Cross Site Scripting, Injection Flaws, and Malicious File Execution. +- **Enforces good Software Engineering practices** (Model-View-Controller design, Server-side form validation, postbacks) that make the code more readable, scalable, and maintainable. +- **Speaks multiple protocols** HTML/XML, RSS/ATOM, RTF, PDF, JSON, AJAX, XML-RPC, CSV, REST, WIKI, Flash/AMF, and Linked Data (RDF). +- **Includes** a SSL-enabled and streaming-capable web server, a relational database, a web-based integrated development environment and web-based management interface, a Database Abstraction Layer that writes SQL for you in real time, internationalization support, multiple authentication methods, role based access control, an error logging and ticketing system, multiple caching methods for scalability, the jQuery library for AJAX and effects. [[Read more... http://web2py.com/examples/default/what]] ADDED applications/examples/private/content/en/default/usergroups/grouplist.markmin Index: applications/examples/private/content/en/default/usergroups/grouplist.markmin ================================================================== --- /dev/null +++ applications/examples/private/content/en/default/usergroups/grouplist.markmin @@ -0,0 +1,42 @@ +# web2py usergroups + +You can submit a new group to be listed [[here contact]] +## International Group (English) + +Main group managed by Massimo Di Pierro + +- [[http://groups.google.com/group/web2py/ http://groups.google.com/group/web2py/ popup]] + +``web2py``:groupdates + +## Brazilian Group + +Portuguese speakers group + +- [[http://groups.google.com/group/web2py-users-brazil http://groups.google.com/group/web2py-users-brazil popup]] + +``web2py-users-brazil``:groupdates + +## Spanish Group + +Spanish speakers group + +- [[http://groups.google.com/group/web2py-usuarios http://groups.google.com/group/web2py-usuarios popup]] + +``web2py-usuarios``:groupdates + +## Japanese Group + +Japanese speakers group + +- [[http://groups.google.com/group/web2py-japan http://groups.google.com/group/web2py-japan popup]] + +``web2py-japan``:groupdates + +## French Group + +French speakers group + +- [[http://groups.google.com/group/web2py-fr http://groups.google.com/group/web2py-fr popup]] + +``web2py-fr``:groupdates ADDED applications/examples/static/artwork.tar.gz Index: applications/examples/static/artwork.tar.gz ================================================================== --- /dev/null +++ applications/examples/static/artwork.tar.gz cannot compute difference between binary files ADDED applications/examples/static/bg.gif Index: applications/examples/static/bg.gif ================================================================== --- /dev/null +++ applications/examples/static/bg.gif cannot compute difference between binary files ADDED applications/examples/static/bg.png Index: applications/examples/static/bg.png ================================================================== --- /dev/null +++ applications/examples/static/bg.png cannot compute difference between binary files ADDED applications/examples/static/css/artwork.css Index: applications/examples/static/css/artwork.css ================================================================== --- /dev/null +++ applications/examples/static/css/artwork.css @@ -0,0 +1,141 @@ + +/*---------------------------------- ARTWORK E STICKERS -----------------------------------------*/ +/*logo*/ +.logosDow{ + border-width: 1px; + border-style: solid; + border-color:#CCC; + border-radius:3px; + background-color:#FFF; + -webkit-border-radius: 3px; + -moz-border-radius:3px; + margin:20px auto; + background: -moz-linear-gradient(top, #fbfbfb, #f1f1f1) repeat-X; + background: -webkit-gradient(linear, left top, left bottom, from(#fbfbfb), to(#f1f1f1)) repeat-X; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#666, endColorstr=#FFFFFFFF)"; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fbfbfb, endColorstr=#f1f1f1); + border-width: 1px; + border-style: solid; + border-color:#CCC; + border-radius:3px; + background-color:#FFF; + -webkit-border-radius: 3px; + -moz-border-radius:3px; + width:100%; + + padding:10px 10px 0 10px; + padding-bottom:0 + } +.WH1{ + height:190px; + } +.WH2{ + height:90px; + + } +.logosDow span{ + margin:8px 15px; + float:left; + width:700px; height:20px; + color:#555555; + font:bold 18px/30px Arial,Helvetica,sans-serif; + letter-spacing:-1px; +} +.box-A{ + margin:10px; + float:left; + border-width: 1px; + border-style: solid; + border-color:#CCC; + border-radius:3px; + background-color:#FFF; + -webkit-border-radius: 3px; + -moz-border-radius:3px; + width:250px; height:130px; +} +a.box-A span{ + display:none; + position:relative; + top:-55px; + left:-10px; + width:235px; + height:50px; + background-image:url(../img/tipDownloads2.png); + background-position:center; + background-repeat:no-repeat; +} +a.box-A:hover span{ + display:block; +} +.logoDow1{ + background-image:url(../img/logo3Tones.png); + background-repeat:no-repeat; + background-position:-10px -155px; +} +.logoDow2{ + background-image:url(../img/logo3Tones.png); + background-repeat:no-repeat; + background-position:-10px 0px; +} +.logoDow3{ + background-image:url(../img/logo3Tones.png); + background-repeat:no-repeat; + background-position:-10px -312px; +} +/*fim logo*/ +/*Stick*/ +.stikImage{ + float:left; + width:100px; + height:50px; + margin-left:15px; + background-repeat:no-repeat; + background-position:center; + + } +.stikimage1{ + background-image:url(../img/Stickers1.png); + background-position:center; +} +.stikimage2{ + background-image:url(../img/Stickers2.png); + background-position:center; +} +.stikimage3{ + background-image:url(../img/Stickers3.png); + background-position:center; +} +.stikimage4{ + background-image:url(../img/Stickers8.png); + background-position:center; +} +.stikimage5{ + background-image:url(../img/Stickers5.png); + background-position:center; +} +.stikimage6{ + background-image:url(../img/Stickers6.png); + background-position:center; +} +.stikimage7{ + background-image:url(../img/Stickers7.png); + background-position:center; +} +a.stikImage span{ + display:none; + position:relative; + top:-50px; + left:-50px; + width:180px; + height:50px; + background-image:url(../img/tipDownloads.png); + background-position:center; + background-repeat:no-repeat; +} +a.stikImage:hover span{ + display:block; +} +/*fim do Stick*/ + +/*------------------------------ FIM ARTWORK E STICKERS -----------------------------------------*/ + ADDED applications/examples/static/css/calendar.css Index: applications/examples/static/css/calendar.css ================================================================== --- /dev/null +++ applications/examples/static/css/calendar.css @@ -0,0 +1,4 @@ +.calendar{z-index:99;position:relative;display:none;border-top:2px solid #fff;border-right:2px solid #000;border-bottom:2px solid #000;border-left:2px solid #fff;font-size:11px;color:#000;cursor:default;background:#d4d0c8;font-family:tahoma,verdana,sans-serif;}.calendar table{border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;font-size:11px;color:#000;cursor:default;background:#d4d0c8;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;}.calendar .nav{background:transparent}.calendar thead .title{font-weight:bold;padding:1px;border:1px solid #000;background:#848078;color:#fff;text-align:center;}.calendar thead .name{border-bottom:1px solid #000;padding:2px;text-align:center;background:#f4f0e8;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite{border-top:2px solid #fff;border-right:2px solid #000;border-bottom:2px solid #000;border-left:2px solid #fff;padding:0;background-color:#e4e0d8;}.calendar thead .active{padding:2px 0 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{font-size:80%;color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;border-right:1px solid #000;background:#f4f0e8;}.calendar tbody .rowhilite td{background:#e4e0d8;}.calendar tbody .rowhilite td.wn{background:#d4d0c8;}.calendar tbody td.hilite{padding:1px 3px 1px 1px;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;}.calendar tbody td.active{padding:2px 2px 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar tbody td.selected{font-weight:bold;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;padding:2px 2px 0 2px;background:#e4e0d8;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#f4f0e8;padding:1px;border:1px solid #000;background:#848078;color:#fff;text-align:center;}.calendar tfoot .hilite{border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;padding:1px;background:#e4e0d8;}.calendar tfoot .active{padding:2px 0 0 2px;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;border-top:1px solid #fff;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #fff;background:#e4e0d8;font-size:90%;padding:1px;z-index:100;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;padding:0;border-top:1px solid #000;border-right:1px solid #fff;border-bottom:1px solid #fff;border-left:1px solid #000;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{border-top:1px solid #000;padding:1px 0;text-align:center;background-color:#f4f0e8;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;border:1px solid #889;font-weight:bold;background-color:#fff;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{border-color:#000;background-color:#766;color:#fff;}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;} + +#CP_hourcont {z-index:99;padding: 0px;position:absolute;border:1px dashed #bbbbbb;background-color:#dddddd;display:none;} #CP_minutecont {z-index:99;background-color:#dddddd;padding: 0px;position:absolute;width:45px;border: 1px dashed #cccccc;display:none;} .floatleft {float:left;} .CP_hour {z-index:99;padding:1px;font-family: Arial, Helvetica, sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;margin:1px;background-color:#eeeeee;} .CP_minute {z-index:99;padding:1px;background-color:#eeeeee;font-family: Arial, Helvetica, sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;margin:1px;} .CP_over {z-index:99;background-color:#ffffff;} + ADDED applications/examples/static/css/home.css Index: applications/examples/static/css/home.css ================================================================== --- /dev/null +++ applications/examples/static/css/home.css @@ -0,0 +1,637 @@ +* { + margin:0; + padding:0; + } + +html, body { + height:100%; + background-color:#FFF;/*#f1f6f2;*/ + min-width:1020px; + font-size:14px; + /*font-family:Candara, Verdana, Arial, sans-serif;*/ + font-family:Helvetica,"Helvetica Neue",Arial,sans-serif; + } + +h1,h2,h3,h4,h5,h6 { + font-family: Helvetica,"Helvetica Neue",Arial,sans-serif; //'Garamond','Georgia',serif; + margin:15px 0 10px; + padding:0; + color: #678A86; + + } + +th, th {vertical-align:top} + +li { + padding-bottom:5px; + } + +a { + color: #832D20; //#732F2C; + text-decoration:none; + } + +a:hover { + text-shadow:0 1px 0 #FFF; + text-decoration:underline; + } + + +p { + border-bottom: 10px solid transparent; + color:#383838; + font-size:14px; + line-height:24px; + } + +pre { + font-family:'Consolas','Menlo','Deja Vu Sans Mono','Bitstream Vera Sans Mono',monospace !important; + } + + +.general { + min-height:100%; + position:relative; + width:100%; + } + +#font1 { + font-weight:bold; + font-size:12px; + font-family:Candara, Verdana, Arial, sans-serif; + line-height:19px; + color:#a7b6b5; + text-shadow:0 1px 0 #000; + } + + +/**************************** HEADER ************************************/ +.headerExt{ + top:0; + width:100%; + height:130px; + margin:0px auto; + background-image:url(../img/back-02.png); + background-repeat:repeat-x; + background-position:0px -57px; + z-index:99; + } + +.headerInt{ + position:relative; + width:982px; + height:130px; + margin:0px auto 0px auto; + } + +.boxLogin{ + float:right; + margin:8px 50px 0px 0px; + } + +.logo{ + position:absolute; + background-image:url(../img/web2py_logo.png); + background-position:16px 2px 0px 0px; + background-repeat:no-repeat; + width:230px; + height:50px; + top:33px; + left:45px; + } + + +/***************************** MAIN CONTENT ********************************/ +.content { + width:982px; + margin:0 auto; + overflow:hidden; + padding-bottom:100px; + } + +.onecolcontent { + color:#383838; + font-size:14px; + line-height:24px; + width:850px; + margin:0 auto; + height:auto; + } + +.contentleft { + color:#383838; + font-size:14px; + line-height:24px; + float:left; + width:650px; + height:auto; + } + +.contentright { + color:#383838; + font-size:14px; + line-height:24px; + float:right; + width:300px; + height:auto; + } + +/************************** FOOTER ******************************************/ + +.footerExt{ + background-image:url(../img/back-R-02.png); + background-repeat:repeat-x ; + background-position:0px -15px; + height:100px; + position:absolute; + bottom:0; + width:100%; + overflow:hidden; + + } + +.footerInt{ + position:relative; + width:982px; + height:70px; + margin:30px auto 0 auto; + } + +.Boxfooter1{ + position:absolute; + bottom:0px; + left:30px; + top:5px; + } + +.Boxfooter2{ + position:absolute; + left:130px; + top:5px; + } + +.Boxfooter3{ + position:absolute; + right:0; + top:2px; + } + +a.Boxfooter4{ + background-image:url(../img/1283522094_email.png); + background-position:center; + background-repeat:no-repeat; + position:absolute; + left:32px; + top:36px; + width:40px; + height:32px; + } + +a.Boxfooter5{ + background-image:url(../img/1283522082_phone.png); + background-position:center; + background-repeat:no-repeat; + position:absolute; + left:131px; + top:32px; + width:40px; + height:32px; + } + +.Boxfooter6{ + background-image:url(../img/Stickers4.png); + background-position:center; + background-repeat:no-repeat; + position:absolute; + left:840px; + top:24px; + width:135px; + height:44px; + } + +.Boxfooter7{ + position:absolute; + left:745px; + top:45px; + width:115px; + height:24px; + font-weight:bold; + font-size:12px; + font-family:Candara, Verdana, Arial, sans-serif; + font-style:italic; + line-height:19px; + color:#1B211F; + text-shadow:0 1px 0 #778E88; + } + + +/****************************** LINKS ************************************/ +a.login{ + font-weight:bold; + font-size:12px; + font-family:Candara, Verdana, Arial, sans-serif; + line-height:19px; + text-decoration:none; + color:#a7b6b5; + text-shadow:0 1px 0 #000; + } + +a.login:hover{ + color:#1B211F; + text-shadow:0 1px 0 #778E88; + } + +a.login:visited{ + color:#1B211F; + text-shadow:0 1px 0 #778E88; + } + + + +/********************DOWNLOAD****************************************/ +.boxBtDownload{ + width:240px; + height:57px; + position:relative; + margin:20px auto; + z-index:0; + } +.boxBtDownloadICO{ + width:40px; + height:40px; + float:right; + margin:6px 10px; + background-image:url(../img/netdow2.png);/*Download Icon 1 2 3 */ + background-position:center; + background-repeat:no-repeat; +} +#textBtDownload1{ + font-weight:bold; + font-size:26px; + font-family:Georgia,Palatino,"Palatino Linotype",Times,"Times New Roman",serif; + font-style:italic; + line-height:19px; + color:#1B211F; + text-shadow:0 1px 0 #b5b5b5; + text-decoration:none; + position:absolute; + left:35px; + top:15px; + } +#textBtDownload2{ + font-weight:bold; + font-size:12px; + font-family:Georgia,Palatino,"Palatino Linotype",Times,"Times New Roman",serif; + font-style:italic; + line-height:19px; + color:#747474; + text-shadow:0 1px 0 #FFFFFF; + text-decoration:none; + position:absolute; + left:18px; + top:34px; + } +a.btDownload{ + position:absolute; + + border-width: 1px; + border-style: solid; + border-color:#939593; + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + background-image:url(../img/back-03.png); + background-position:bottom; + background-repeat:repeat-x; + text-decoration:none; + + } +.btDownloadPosicao1{ + width:240px; + height:57px; + } +.btDownloadPosicao2{ + width:250px; + height:57px; + } +a.btDownload:hover { + background-image:url(../img/back-05.png); + } + +.downloadb li a { + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + color:#1B211F; + display:block; + font-size:93%; + margin:0; + padding:6% 40px 6% 6%; + line-height: 16px; + border-width: 1px; + border-style: solid; + border-color:#939593; + background-image:url(../img/back-03.png); + background-position:bottom; + background-repeat:repeat-x; + text-decoration:none; + + } + +.downloadb li a:hover {background-image:url(../img/back-05.png);} + +.downloadb li span{ + width:40px; + height:40px; + float:right; + /*margin:6px 10px;*/ + background-image:url(../img/netdow2.png);/*Download Icon 1 2 3 */ + background-position:center; + background-repeat:no-repeat; +} + +.downloadb li { + list-style-image:none; + list-style-position:outside; + list-style-type:none; + width: 200px; + height: 50px; + + + } + + +/********************************* BOX INFO 1 *****************************/ + +blockquote{ + width: 90%; + margin:10px; + padding: 3px 15px 10px 20px; + // padding: 5px; + border-width: 1px; + border-style: solid; + border-color:#CCC; + border-radius:5px; + background-color:#FFF; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + // margin:20px auto; + text-align:left; + background: -moz-linear-gradient(top, #fbfbfb, #f1f1f1) repeat-X; + background: -webkit-gradient(linear, left top, left bottom, from(#fbfbfb), to(#f1f1f1)) repeat-X; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#666, endColorstr=#FFFFFF)"; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#fbfbfb, endColorstr=#f1f1f1); + border-width: 1px; + border-style: solid; + border-color:#CCC; + border-radius:5px; + background-color:#FFF; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + font-size:12px; + } + +blockquote ul { + padding-left:15px; +// list-style-image: url(../img/bullet.gif); + } + +blockquote h5{ + margin:0; + padding:0; + font-size:12px; + } + +.boxInfoWH1{ + width: 80%; + height: auto; + } + +.boxInfoWH2{ + width:600px; + height: 100px; + } + + + +.boxCode{ + width: 90%; + margin:10px; + background-color:#fff; + text-align:left; + border-width: 1px; + border-style: solid; + border-color:#939593; + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + padding:5px; + } + + + +.boxInfo2 a{ + color:#1B211F; + /*text-shadow:0 1px 0 #778E88;*/ + font-weight:bold; + font-size:12px; + line-height:19px; + text-decoration:none; + } + +.boxInfo2 a:hover{ + text-shadow:0 1px 0 #000; + } + +.boxInfo2 a:visited{ + color:#1B211F; + text-shadow:0 1px 0 #778E88; + } + + +/********************************* BOX BANNER *****************************/ +.boxInfoBanner{ + margin:20px auto; + border-width: 1px; + border-style: solid; + border-color:#939593; + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + background-image:url(../img/online_book_cover.jpg); + background-position:center; + background-repeat:no-repeat; + width: 240px; + height: 175px; + /*-moz-box-shadow:1px 1px 4px #999999; + -webkit-box-shadow:0px 5px 10px #999999;*/ + cursor:pointer; + } + +.boxTopDesc{ + position:relative; + top:-25px; + font-weight:bold; + font-size:18px; + } + +.boxTopDesc:hover{ + color:#a7b6b5; + } + +.boxSimple{ + margin:auto; + border-width: 1px; + border-style: solid; + border-color:#939593; + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + + background-position:center; + background-repeat:no-repeat; + width: 160px; + height: 106px; + left:0; + /*-moz-box-shadow:1px 1px 4px #999999; + -webkit-box-shadow:0px 5px 10px #999999;*/ + margin-right:110px; + margin-top:10px; + } + + +/******************************* BOX SEARCH *****************************/ + +.boxSearch1{ + width: 240px; + height: 27px; + margin:20px auto; + background-color:#f1f6f2; + text-align:left; + border-width: 1px; + border-style: solid; + border-color:#939593; + -moz-background-clip:border; + -moz-background-inline-policy:continuous; + -moz-background-origin:padding; + border-radius:5px; + -webkit-border-radius: 5px; + -moz-border-radius:5px; + background-image:url(../img/back-04.png); + background-position:bottom; + background-repeat:repeat-x; + } + +.boxSearch2{ + width:27px; + height:26px; + background-image:url(../img/icons/1283523626_search.png); + background-repeat:no-repeat; + background-position:center; + float:right; + } + + +/********************************* LEFT LINKS ************************/ +a.btleftlink{ + color:#383838; + font-family:Helvetica,Tahoma,Arial,Sans-Serif; + font-size:18px; + line-height:24px; + text-decoration:none; + float:left; + margin:4px 0px 0px 40px; + } + +a.btleftlink:hover{ + color:#a7b6b5; + } + +.leftlink{ + margin-left:30px; + width:245px; + height:30px; + background-repeat:no-repeat; + background-position:left; + } + +.leftlinkIcoA{ + background-image:url(../img/icons/usergroups.png); + } + +.leftlinkIcoB{ + background-image:url(../img/icons/twitter.png); + } + +.leftlinkIcoC{ + background-image:url(../img/icons/tutorials.png); + } + +.leftlinkIcoD{ + background-image:url(../img/icons/videos.png); + } + +.leftlinkIcoE{ + background-image:url(../img/icons/examples.png); + } + +.leftlinkIcoF{ + background-image:url(../img/icons/uservoice.png); + } + +.leftlinkIcoG{ + background-image:url(../img/icons/slices.png); + } +.leftlinkIcoH{ + background-image:url(../img/icons/demo.png); + } +.leftlinkIcoI{ + background-image:url(../img/icons/appliances.png); + } +.leftlinkIcoJ{ + background-image:url(../img/icons/plugins.png); + } +.leftlinkIcoK{ + background-image:url(../img/icons/livechat.png); + } + + +/************flash************************/ + +.flash{ + width:50%; + padding-bottom:5px; + margin:auto; + display:none; + + +} + +.flashdiv{ + position:fixed; + top:90px; + z-index:999; + width:100%; + margin:auto; + position:fixed; + text-align:center; + + +} + + ADDED applications/examples/static/css/menu.css Index: applications/examples/static/css/menu.css ================================================================== --- /dev/null +++ applications/examples/static/css/menu.css @@ -0,0 +1,136 @@ +/*********** MENU COMPLETO **********/ +.headermenu{ + position:absolute; + margin:10px 10px; + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:0px 0px; + width:655px; + height:37px; + left:290px; + top: 30px; + z-index:200px; +} +a.home{ + position:absolute; + top:0px; + left:0px; + z-index:0; + width:109px; + height:36px; +} +a:hover.home { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:0px -38px; +} +a:active.home { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-0px -76px; + border-collapse:inherit; + +} +a.about{ + position:absolute; + top:0px; + left:108px; + z-index:1; + width:104px; + height:36px; +} +a:hover.about { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-108px -37px; +} +a:active.about { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-108px -76px +} + + +a.download{ + position:absolute; + top:0px; + left:211px; + z-index:2; + width:104px; + height:36px; +} +a:hover.download { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-211px -37px; +} +a:active.download { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-211px -76px +} +a.staff{ + position:absolute; + top:0px; + left:315px; + z-index:3; + width:103px; + height:36px; +} +a:hover.staff { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-315px -37px; +} +a:active.staff { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-315px -76px +} +a.support{ + position:absolute; + top:0px; + left:418px; + z-index:4; + width:103px; + height:36px; +} +a:hover.support { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-418px -37px; +} +a:active.support { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-418px -76px +} +a.documentation{ + position:absolute; + top:0px; + left:520px; + z-index:5; + width:133px; + height:36px; +} +a:hover.documentation { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-520px -37px +} +a:active.documentation { + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + background-position:-520px -76px; +} + +.pressed{ + z-index:0; + background-image:url(../img/Menu-2.png); + background-repeat:no-repeat; + + } + +/*************** FIM DO MENU COMPLETO **********************/ + + ADDED applications/examples/static/epydoc/api-objects.txt Index: applications/examples/static/epydoc/api-objects.txt ================================================================== --- /dev/null +++ applications/examples/static/epydoc/api-objects.txt @@ -0,0 +1,5844 @@ +psycopg2 psycopg2-module.html +psycopg2.Binary psycopg2-module.html#Binary +psycopg2.NUMBER psycopg2-module.html#NUMBER +psycopg2.connect psycopg2-module.html#connect +psycopg2.threadsafety psycopg2-module.html#threadsafety +psycopg2.TimeFromTicks psycopg2-module.html#TimeFromTicks +psycopg2.Timestamp psycopg2-module.html#Timestamp +psycopg2.Date psycopg2-module.html#Date +psycopg2.TimestampFromTicks psycopg2-module.html#TimestampFromTicks +psycopg2.STRING psycopg2-module.html#STRING +psycopg2.DATETIME psycopg2-module.html#DATETIME +psycopg2.Time psycopg2-module.html#Time +psycopg2.DateFromTicks psycopg2-module.html#DateFromTicks +psycopg2.BINARY psycopg2-module.html#BINARY +psycopg2.paramstyle psycopg2-module.html#paramstyle +psycopg2.k psycopg2-module.html#k +psycopg2.ROWID psycopg2-module.html#ROWID +psycopg2.apilevel psycopg2-module.html#apilevel +psycopg2.tz psycopg2.tz-module.html +psycopg2.tz.STDOFFSET psycopg2.tz-module.html#STDOFFSET +psycopg2.tz.DSTDIFF psycopg2.tz-module.html#DSTDIFF +psycopg2.tz.DSTOFFSET psycopg2.tz-module.html#DSTOFFSET +psycopg2.tz.ZERO psycopg2.tz-module.html#ZERO +psycopg2.tz.LOCAL psycopg2.tz-module.html#LOCAL +sqlite3.dbapi2 sqlite3.dbapi2-module.html +sqlite3.dbapi2.SQLITE_DROP_VIEW sqlite3.dbapi2-module.html#SQLITE_DROP_VIEW +sqlite3.dbapi2.SQLITE_CREATE_TRIGGER sqlite3.dbapi2-module.html#SQLITE_CREATE_TRIGGER +sqlite3.dbapi2.version sqlite3.dbapi2-module.html#version +sqlite3.dbapi2.SQLITE_OK sqlite3.dbapi2-module.html#SQLITE_OK +sqlite3.dbapi2.SQLITE_DELETE sqlite3.dbapi2-module.html#SQLITE_DELETE +sqlite3.dbapi2.PARSE_DECLTYPES sqlite3.dbapi2-module.html#PARSE_DECLTYPES +sqlite3.dbapi2.SQLITE_DENY sqlite3.dbapi2-module.html#SQLITE_DENY +sqlite3.dbapi2.paramstyle sqlite3.dbapi2-module.html#paramstyle +sqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW sqlite3.dbapi2-module.html#SQLITE_DROP_TEMP_VIEW +sqlite3.dbapi2.SQLITE_DROP_INDEX sqlite3.dbapi2-module.html#SQLITE_DROP_INDEX +sqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX sqlite3.dbapi2-module.html#SQLITE_CREATE_TEMP_INDEX +sqlite3.dbapi2.SQLITE_IGNORE sqlite3.dbapi2-module.html#SQLITE_IGNORE +sqlite3.dbapi2.sqlite_version_info sqlite3.dbapi2-module.html#sqlite_version_info +sqlite3.dbapi2.SQLITE_ATTACH sqlite3.dbapi2-module.html#SQLITE_ATTACH +sqlite3.dbapi2.SQLITE_SELECT sqlite3.dbapi2-module.html#SQLITE_SELECT +sqlite3.dbapi2.SQLITE_CREATE_TABLE sqlite3.dbapi2-module.html#SQLITE_CREATE_TABLE +sqlite3.dbapi2.SQLITE_READ sqlite3.dbapi2-module.html#SQLITE_READ +sqlite3.dbapi2.SQLITE_CREATE_VIEW sqlite3.dbapi2-module.html#SQLITE_CREATE_VIEW +sqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER sqlite3.dbapi2-module.html#SQLITE_CREATE_TEMP_TRIGGER +sqlite3.dbapi2.SQLITE_PRAGMA sqlite3.dbapi2-module.html#SQLITE_PRAGMA +sqlite3.dbapi2.adapters sqlite3.dbapi2-module.html#adapters +sqlite3.dbapi2.SQLITE_CREATE_INDEX sqlite3.dbapi2-module.html#SQLITE_CREATE_INDEX +sqlite3.dbapi2.threadsafety sqlite3.dbapi2-module.html#threadsafety +sqlite3.dbapi2.SQLITE_ANALYZE sqlite3.dbapi2-module.html#SQLITE_ANALYZE +sqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER sqlite3.dbapi2-module.html#SQLITE_DROP_TEMP_TRIGGER +sqlite3.dbapi2.converters sqlite3.dbapi2-module.html#converters +sqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW sqlite3.dbapi2-module.html#SQLITE_CREATE_TEMP_VIEW +sqlite3.dbapi2.SQLITE_INSERT sqlite3.dbapi2-module.html#SQLITE_INSERT +sqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX sqlite3.dbapi2-module.html#SQLITE_DROP_TEMP_INDEX +sqlite3.dbapi2.SQLITE_UPDATE sqlite3.dbapi2-module.html#SQLITE_UPDATE +sqlite3.dbapi2.version_info sqlite3.dbapi2-module.html#version_info +sqlite3.dbapi2.SQLITE_DETACH sqlite3.dbapi2-module.html#SQLITE_DETACH +sqlite3.dbapi2.SQLITE_ALTER_TABLE sqlite3.dbapi2-module.html#SQLITE_ALTER_TABLE +sqlite3.dbapi2.sqlite_version sqlite3.dbapi2-module.html#sqlite_version +sqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE sqlite3.dbapi2-module.html#SQLITE_DROP_TEMP_TABLE +sqlite3.dbapi2.PARSE_COLNAMES sqlite3.dbapi2-module.html#PARSE_COLNAMES +sqlite3.dbapi2.apilevel sqlite3.dbapi2-module.html#apilevel +sqlite3.dbapi2.DateFromTicks sqlite3.dbapi2-module.html#DateFromTicks +sqlite3.dbapi2.TimeFromTicks sqlite3.dbapi2-module.html#TimeFromTicks +sqlite3.dbapi2.SQLITE_REINDEX sqlite3.dbapi2-module.html#SQLITE_REINDEX +sqlite3.dbapi2.TimestampFromTicks sqlite3.dbapi2-module.html#TimestampFromTicks +sqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE sqlite3.dbapi2-module.html#SQLITE_CREATE_TEMP_TABLE +sqlite3.dbapi2.SQLITE_TRANSACTION sqlite3.dbapi2-module.html#SQLITE_TRANSACTION +sqlite3.dbapi2.x sqlite3.dbapi2-module.html#x +sqlite3.dbapi2.SQLITE_DROP_TRIGGER sqlite3.dbapi2-module.html#SQLITE_DROP_TRIGGER +sqlite3.dbapi2.SQLITE_DROP_TABLE sqlite3.dbapi2-module.html#SQLITE_DROP_TABLE +web2py.gluon web2py.gluon-module.html +web2py.gluon.TAG web2py.gluon-module.html#TAG +web2py.gluon.URL web2py.gluon-module.html#URL +web2py.gluon.ON web2py.gluon-module.html#ON +web2py.gluon.current web2py.gluon-module.html#current +web2py.gluon.redirect web2py.gluon-module.html#redirect +web2py.gluon.embed64 web2py.gluon-module.html#embed64 +web2py.gluon.admin web2py.gluon.admin-module.html +web2py.gluon.admin.app_create web2py.gluon.admin-module.html#app_create +web2py.gluon.admin.app_cleanup web2py.gluon.admin-module.html#app_cleanup +web2py.gluon.admin.plugin_pack web2py.gluon.admin-module.html#plugin_pack +web2py.gluon.admin.w2p_unpack web2py.gluon.fileutils-module.html#w2p_unpack +web2py.gluon.admin.write_file web2py.gluon.fileutils-module.html#write_file +web2py.gluon.admin.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.admin.check_new_version web2py.gluon.admin-module.html#check_new_version +web2py.gluon.admin.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.admin.w2p_pack_plugin web2py.gluon.fileutils-module.html#w2p_pack_plugin +web2py.gluon.admin.upgrade web2py.gluon.admin-module.html#upgrade +web2py.gluon.admin.w2p_pack web2py.gluon.fileutils-module.html#w2p_pack +web2py.gluon.admin.app_pack web2py.gluon.admin-module.html#app_pack +web2py.gluon.admin.recursive_unlink web2py.gluon.fileutils-module.html#recursive_unlink +web2py.gluon.admin.unzip web2py.gluon.admin-module.html#unzip +web2py.gluon.admin.create_missing_folders web2py.gluon.admin-module.html#create_missing_folders +web2py.gluon.admin.app_install web2py.gluon.admin-module.html#app_install +web2py.gluon.admin.app_compile web2py.gluon.admin-module.html#app_compile +web2py.gluon.admin.w2p_unpack_plugin web2py.gluon.fileutils-module.html#w2p_unpack_plugin +web2py.gluon.admin.abspath web2py.gluon.fileutils-module.html#abspath +web2py.gluon.admin.apath web2py.gluon.admin-module.html#apath +web2py.gluon.admin.plugin_install web2py.gluon.admin-module.html#plugin_install +web2py.gluon.admin.add_path_first web2py.gluon.admin-module.html#add_path_first +web2py.gluon.admin.app_pack_compiled web2py.gluon.admin-module.html#app_pack_compiled +web2py.gluon.admin.fix_newlines web2py.gluon.fileutils-module.html#fix_newlines +web2py.gluon.admin.up web2py.gluon.fileutils-module.html#up +web2py.gluon.admin.create_missing_app_folders web2py.gluon.admin-module.html#create_missing_app_folders +web2py.gluon.admin.app_uninstall web2py.gluon.admin-module.html#app_uninstall +web2py.gluon.cache web2py.gluon.cache-module.html +web2py.gluon.cache.DEFAULT_TIME_EXPIRE web2py.gluon.cache-module.html#DEFAULT_TIME_EXPIRE +web2py.gluon.cache.logger web2py.gluon.cache-module.html#logger +web2py.gluon.cfs web2py.gluon.cfs-module.html +web2py.gluon.cfs.cfs_lock web2py.gluon.cfs-module.html#cfs_lock +web2py.gluon.cfs.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.cfs.getcfs web2py.gluon.cfs-module.html#getcfs +web2py.gluon.cfs.cfs web2py.gluon.cfs-module.html#cfs +web2py.gluon.compileapp web2py.gluon.compileapp-module.html +web2py.gluon.compileapp.run_controller_in web2py.gluon.compileapp-module.html#run_controller_in +web2py.gluon.compileapp.is_gae web2py.gluon.compileapp-module.html#is_gae +web2py.gluon.compileapp.build_environment web2py.gluon.compileapp-module.html#build_environment +web2py.gluon.compileapp.TEST_CODE web2py.gluon.compileapp-module.html#TEST_CODE +web2py.gluon.compileapp.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.compileapp.write_file web2py.gluon.fileutils-module.html#write_file +web2py.gluon.compileapp.save_pyc web2py.gluon.compileapp-module.html#save_pyc +web2py.gluon.compileapp.run_view_in web2py.gluon.compileapp-module.html#run_view_in +web2py.gluon.compileapp.compile2 web2py.gluon.restricted-module.html#compile2 +web2py.gluon.compileapp.redirect web2py.gluon.http-module.html#redirect +web2py.gluon.compileapp.is_jython web2py.gluon.compileapp-module.html#is_jython +web2py.gluon.compileapp.getcfs web2py.gluon.cfs-module.html#getcfs +web2py.gluon.compileapp.compile_models web2py.gluon.compileapp-module.html#compile_models +web2py.gluon.compileapp.logger web2py.gluon.compileapp-module.html#logger +web2py.gluon.compileapp.listdir web2py.gluon.fileutils-module.html#listdir +web2py.gluon.compileapp.read_pyc web2py.gluon.compileapp-module.html#read_pyc +web2py.gluon.compileapp.run_models_in web2py.gluon.compileapp-module.html#run_models_in +web2py.gluon.compileapp.parse_template web2py.gluon.template-module.html#parse_template +web2py.gluon.compileapp.compile_views web2py.gluon.compileapp-module.html#compile_views +web2py.gluon.compileapp.test web2py.gluon.compileapp-module.html#test +web2py.gluon.compileapp.local_import_aux web2py.gluon.compileapp-module.html#local_import_aux +web2py.gluon.compileapp.remove_compiled_application web2py.gluon.compileapp-module.html#remove_compiled_application +web2py.gluon.compileapp.mktree web2py.gluon.fileutils-module.html#mktree +web2py.gluon.compileapp.compile_controllers web2py.gluon.compileapp-module.html#compile_controllers +web2py.gluon.compileapp.restricted web2py.gluon.restricted-module.html#restricted +web2py.gluon.compileapp.compile_application web2py.gluon.compileapp-module.html#compile_application +web2py.gluon.contenttype web2py.gluon.contenttype-module.html +web2py.gluon.contenttype.contenttype web2py.gluon.contenttype-module.html#contenttype +web2py.gluon.contenttype.CONTENT_TYPE web2py.gluon.contenttype-module.html#CONTENT_TYPE +web2py.gluon.contrib.pymysql web2py.gluon.contrib.pymysql-module.html +web2py.gluon.contrib.pymysql.Binary web2py.gluon.contrib.pymysql-module.html#Binary +web2py.gluon.contrib.pymysql.NUMBER web2py.gluon.contrib.pymysql-module.html#NUMBER +web2py.gluon.contrib.pymysql.connect web2py.gluon.contrib.pymysql-module.html#connect +web2py.gluon.contrib.pymysql.escape_dict web2py.gluon.contrib.pymysql-module.html#escape_dict +web2py.gluon.contrib.pymysql.DATE web2py.gluon.contrib.pymysql-module.html#DATE +web2py.gluon.contrib.pymysql.escape_string web2py.gluon.contrib.pymysql-module.html#escape_string +web2py.gluon.contrib.pymysql.NULL web2py.gluon.contrib.pymysql-module.html#NULL +web2py.gluon.contrib.pymysql.threadsafety web2py.gluon.contrib.pymysql-module.html#threadsafety +web2py.gluon.contrib.pymysql.thread_safe web2py.gluon.contrib.pymysql-module.html#thread_safe +web2py.gluon.contrib.pymysql.TimeFromTicks web2py.gluon.contrib.pymysql-module.html#TimeFromTicks +web2py.gluon.contrib.pymysql.install_as_MySQLdb web2py.gluon.contrib.pymysql-module.html#install_as_MySQLdb +web2py.gluon.contrib.pymysql.TimestampFromTicks web2py.gluon.contrib.pymysql-module.html#TimestampFromTicks +web2py.gluon.contrib.pymysql.STRING web2py.gluon.contrib.pymysql-module.html#STRING +web2py.gluon.contrib.pymysql.version_info web2py.gluon.contrib.pymysql-module.html#version_info +web2py.gluon.contrib.pymysql.escape_sequence web2py.gluon.contrib.pymysql-module.html#escape_sequence +web2py.gluon.contrib.pymysql.DATETIME web2py.gluon.contrib.pymysql-module.html#DATETIME +web2py.gluon.contrib.pymysql.Connection web2py.gluon.contrib.pymysql-module.html#Connection +web2py.gluon.contrib.pymysql.VERSION web2py.gluon.contrib.pymysql-module.html#VERSION +web2py.gluon.contrib.pymysql.paramstyle web2py.gluon.contrib.pymysql-module.html#paramstyle +web2py.gluon.contrib.pymysql.DateFromTicks web2py.gluon.contrib.pymysql-module.html#DateFromTicks +web2py.gluon.contrib.pymysql.BINARY web2py.gluon.contrib.pymysql-module.html#BINARY +web2py.gluon.contrib.pymysql.TIMESTAMP web2py.gluon.contrib.pymysql-module.html#TIMESTAMP +web2py.gluon.contrib.pymysql.get_client_info web2py.gluon.contrib.pymysql-module.html#get_client_info +web2py.gluon.contrib.pymysql.Connect web2py.gluon.contrib.pymysql-module.html#Connect +web2py.gluon.contrib.pymysql.ROWID web2py.gluon.contrib.pymysql-module.html#ROWID +web2py.gluon.contrib.pymysql.TIME web2py.gluon.contrib.pymysql-module.html#TIME +web2py.gluon.contrib.pymysql.apilevel web2py.gluon.contrib.pymysql-module.html#apilevel +web2py.gluon.contrib.pymysql.constants web2py.gluon.contrib.pymysql.constants-module.html +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.LONGLONG web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#LONGLONG +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.SHORT web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#SHORT +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.TINY_BLOB web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#TINY_BLOB +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.CHAR web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#CHAR +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.TINY web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#TINY +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.DATE web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#DATE +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.NEWDATE web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#NEWDATE +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.NULL web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#NULL +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.TIMESTAMP web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#TIMESTAMP +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.SET web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#SET +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.VARCHAR web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#VARCHAR +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.INTERVAL web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#INTERVAL +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.LONG web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#LONG +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.NEWDECIMAL web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#NEWDECIMAL +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.BIT web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#BIT +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.MEDIUM_BLOB web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#MEDIUM_BLOB +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.VAR_STRING web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#VAR_STRING +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.STRING web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#STRING +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.DECIMAL web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#DECIMAL +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.ENUM web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#ENUM +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.LONG_BLOB web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#LONG_BLOB +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.DATETIME web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#DATETIME +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.YEAR web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#YEAR +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.GEOMETRY web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#GEOMETRY +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.DOUBLE web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#DOUBLE +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.FLOAT web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#FLOAT +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.INT24 web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#INT24 +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.BLOB web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#BLOB +web2py.gluon.contrib.pymysql.constants.FIELD_TYPE.TIME web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html#TIME +web2py.gluon.contrib.pymysql.converters web2py.gluon.contrib.pymysql.converters-module.html +web2py.gluon.contrib.pymysql.converters.conversions web2py.gluon.contrib.pymysql.converters-module.html#conversions +web2py.gluon.contrib.pymysql.converters.convert_bit web2py.gluon.contrib.pymysql.converters-module.html#convert_bit +web2py.gluon.contrib.pymysql.converters.escape_int web2py.gluon.contrib.pymysql.converters-module.html#escape_int +web2py.gluon.contrib.pymysql.converters.decoders web2py.gluon.contrib.pymysql.converters-module.html#decoders +web2py.gluon.contrib.pymysql.converters.escape_object web2py.gluon.contrib.pymysql.converters-module.html#escape_object +web2py.gluon.contrib.pymysql.converters.convert_timedelta web2py.gluon.contrib.pymysql.converters-module.html#convert_timedelta +web2py.gluon.contrib.pymysql.converters.escape_item web2py.gluon.contrib.pymysql.converters-module.html#escape_item +web2py.gluon.contrib.pymysql.converters.escape_unicode web2py.gluon.contrib.pymysql.converters-module.html#escape_unicode +web2py.gluon.contrib.pymysql.converters.ESCAPE_MAP web2py.gluon.contrib.pymysql.converters-module.html#ESCAPE_MAP +web2py.gluon.contrib.pymysql.converters.escape_dict web2py.gluon.contrib.pymysql.converters-module.html#escape_dict +web2py.gluon.contrib.pymysql.converters.escape_None web2py.gluon.contrib.pymysql.converters-module.html#escape_None +web2py.gluon.contrib.pymysql.converters.escape_string web2py.gluon.contrib.pymysql.converters-module.html#escape_string +web2py.gluon.contrib.pymysql.converters.convert_characters web2py.gluon.contrib.pymysql.converters-module.html#convert_characters +web2py.gluon.contrib.pymysql.converters.convert_date web2py.gluon.contrib.pymysql.converters-module.html#convert_date +web2py.gluon.contrib.pymysql.converters.encoders web2py.gluon.contrib.pymysql.converters-module.html#encoders +web2py.gluon.contrib.pymysql.converters.escape_long web2py.gluon.contrib.pymysql.converters-module.html#escape_long +web2py.gluon.contrib.pymysql.converters.convert_float web2py.gluon.contrib.pymysql.converters-module.html#convert_float +web2py.gluon.contrib.pymysql.converters.escape_timedelta web2py.gluon.contrib.pymysql.converters-module.html#escape_timedelta +web2py.gluon.contrib.pymysql.converters.escape_datetime web2py.gluon.contrib.pymysql.converters-module.html#escape_datetime +web2py.gluon.contrib.pymysql.converters.escape_set web2py.gluon.contrib.pymysql.converters-module.html#escape_set +web2py.gluon.contrib.pymysql.converters.escape_struct_time web2py.gluon.contrib.pymysql.converters-module.html#escape_struct_time +web2py.gluon.contrib.pymysql.converters.escape_bool web2py.gluon.contrib.pymysql.converters-module.html#escape_bool +web2py.gluon.contrib.pymysql.converters.escape_date web2py.gluon.contrib.pymysql.converters-module.html#escape_date +web2py.gluon.contrib.pymysql.converters.escape_sequence web2py.gluon.contrib.pymysql.converters-module.html#escape_sequence +web2py.gluon.contrib.pymysql.converters.ESCAPE_REGEX web2py.gluon.contrib.pymysql.converters-module.html#ESCAPE_REGEX +web2py.gluon.contrib.pymysql.converters.convert_time web2py.gluon.contrib.pymysql.converters-module.html#convert_time +web2py.gluon.contrib.pymysql.converters.convert_mysql_timestamp web2py.gluon.contrib.pymysql.converters-module.html#convert_mysql_timestamp +web2py.gluon.contrib.pymysql.converters.convert_long web2py.gluon.contrib.pymysql.converters-module.html#convert_long +web2py.gluon.contrib.pymysql.converters.convert_set web2py.gluon.contrib.pymysql.converters-module.html#convert_set +web2py.gluon.contrib.pymysql.converters.convert_datetime web2py.gluon.contrib.pymysql.converters-module.html#convert_datetime +web2py.gluon.contrib.pymysql.converters.escape_float web2py.gluon.contrib.pymysql.converters-module.html#escape_float +web2py.gluon.contrib.pymysql.converters.convert_int web2py.gluon.contrib.pymysql.converters-module.html#convert_int +web2py.gluon.contrib.pymysql.converters.convert_decimal web2py.gluon.contrib.pymysql.converters-module.html#convert_decimal +web2py.gluon.contrib.pymysql.converters.escape_time web2py.gluon.contrib.pymysql.converters-module.html#escape_time +web2py.gluon.contrib.pymysql.converters.escape_decimal web2py.gluon.contrib.pymysql.converters-module.html#escape_decimal +web2py.gluon.custom_import web2py.gluon.custom_import-module.html +web2py.gluon.custom_import.custom_import_install web2py.gluon.custom_import-module.html#custom_import_install +web2py.gluon.custom_import._web2py_path web2py.gluon.custom_import-module.html#_web2py_path +web2py.gluon.custom_import.track_changes web2py.gluon.custom_import-module.html#track_changes +web2py.gluon.custom_import._web2py_date_tracker_importer web2py.gluon.custom_import-module.html#_web2py_date_tracker_importer +web2py.gluon.custom_import.is_tracking_changes web2py.gluon.custom_import-module.html#is_tracking_changes +web2py.gluon.custom_import._web2py_importer web2py.gluon.custom_import-module.html#_web2py_importer +web2py.gluon.custom_import._is_tracking_changes web2py.gluon.custom_import-module.html#_is_tracking_changes +web2py.gluon.dal web2py.gluon.dal-module.html +web2py.gluon.dal.regex_quotes web2py.gluon.dal-module.html#regex_quotes +web2py.gluon.dal.bar_decode_integer web2py.gluon.dal-module.html#bar_decode_integer +web2py.gluon.dal.have_serializers web2py.gluon.dal-module.html#have_serializers +web2py.gluon.dal.Rows_unpickler web2py.gluon.dal-module.html#Rows_unpickler +web2py.gluon.dal.Row_unpickler web2py.gluon.dal-module.html#Row_unpickler +web2py.gluon.dal.table_field web2py.gluon.dal-module.html#table_field +web2py.gluon.dal.logger web2py.gluon.dal-module.html#logger +web2py.gluon.dal.bar_escape web2py.gluon.dal-module.html#bar_escape +web2py.gluon.dal.Rows_pickler web2py.gluon.dal-module.html#Rows_pickler +web2py.gluon.dal.Row_pickler web2py.gluon.dal-module.html#Row_pickler +web2py.gluon.dal.bar_encode web2py.gluon.dal-module.html#bar_encode +web2py.gluon.dal.bar_decode_string web2py.gluon.dal-module.html#bar_decode_string +web2py.gluon.dal.test_all web2py.gluon.dal-module.html#test_all +web2py.gluon.dal.Reference_pickler web2py.gluon.dal-module.html#Reference_pickler +web2py.gluon.dal.regex_python_keywords web2py.gluon.dal-module.html#regex_python_keywords +web2py.gluon.dal.regex_dbname web2py.gluon.dal-module.html#regex_dbname +web2py.gluon.dal.have_validators web2py.gluon.dal-module.html#have_validators +web2py.gluon.dal.is_jdbc web2py.gluon.dal-module.html#is_jdbc +web2py.gluon.dal.thread web2py.gluon.dal-module.html#thread +web2py.gluon.dal.xorify web2py.gluon.dal-module.html#xorify +web2py.gluon.dal.DEFAULT web2py.gluon.dal-module.html#DEFAULT +web2py.gluon.dal.uuid2int web2py.gluon.dal-module.html#uuid2int +web2py.gluon.dal.regex_cleanup_fn web2py.gluon.dal-module.html#regex_cleanup_fn +web2py.gluon.dal.MAXCHARLENGTH web2py.gluon.dal-module.html#MAXCHARLENGTH +web2py.gluon.dal.update_record web2py.gluon.dal-module.html#update_record +web2py.gluon.dal.ADAPTERS web2py.gluon.dal-module.html#ADAPTERS +web2py.gluon.dal.regex_content web2py.gluon.dal-module.html#regex_content +web2py.gluon.dal.Reference_unpickler web2py.gluon.dal-module.html#Reference_unpickler +web2py.gluon.dal.INGRES_SEQNAME web2py.gluon.dal-module.html#INGRES_SEQNAME +web2py.gluon.dal.CALLABLETYPES web2py.gluon.dal-module.html#CALLABLETYPES +web2py.gluon.dal.have_portalocker web2py.gluon.dal-module.html#have_portalocker +web2py.gluon.dal.string_unpack web2py.gluon.dal-module.html#string_unpack +web2py.gluon.dal.sqlhtml_validators web2py.gluon.dal-module.html#sqlhtml_validators +web2py.gluon.dal.drivers web2py.gluon.dal-module.html#drivers +web2py.gluon.dal.cleanup web2py.gluon.dal-module.html#cleanup +web2py.gluon.dal.INFINITY web2py.gluon.dal-module.html#INFINITY +web2py.gluon.dal.sql_locker web2py.gluon.dal-module.html#sql_locker +web2py.gluon.dal.int2uuid web2py.gluon.dal-module.html#int2uuid +web2py.gluon.debug web2py.gluon.debug-module.html +web2py.gluon.debug.stop_trace web2py.gluon.debug-module.html#stop_trace +web2py.gluon.debug.debugger web2py.gluon.debug-module.html#debugger +web2py.gluon.debug.pipe_in web2py.gluon.debug-module.html#pipe_in +web2py.gluon.debug.set_trace web2py.gluon.debug-module.html#set_trace +web2py.gluon.debug.communicate web2py.gluon.debug-module.html#communicate +web2py.gluon.debug.pipe_out web2py.gluon.debug-module.html#pipe_out +web2py.gluon.debug.logger web2py.gluon.debug-module.html#logger +web2py.gluon.decoder web2py.gluon.decoder-module.html +web2py.gluon.decoder.autoDetectXMLEncoding web2py.gluon.decoder-module.html#autoDetectXMLEncoding +web2py.gluon.decoder.decoder web2py.gluon.decoder-module.html#decoder +web2py.gluon.decoder.autodetect_dict web2py.gluon.decoder-module.html#autodetect_dict +web2py.gluon.fileutils web2py.gluon.fileutils-module.html +web2py.gluon.fileutils.tar web2py.gluon.fileutils-module.html#tar +web2py.gluon.fileutils._extractall web2py.gluon.fileutils-module.html#_extractall +web2py.gluon.fileutils.listdir web2py.gluon.fileutils-module.html#listdir +web2py.gluon.fileutils.w2p_unpack web2py.gluon.fileutils-module.html#w2p_unpack +web2py.gluon.fileutils.write_file web2py.gluon.fileutils-module.html#write_file +web2py.gluon.fileutils.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.fileutils.w2p_pack_plugin web2py.gluon.fileutils-module.html#w2p_pack_plugin +web2py.gluon.fileutils.w2p_pack web2py.gluon.fileutils-module.html#w2p_pack +web2py.gluon.fileutils.recursive_unlink web2py.gluon.fileutils-module.html#recursive_unlink +web2py.gluon.fileutils.get_session web2py.gluon.fileutils-module.html#get_session +web2py.gluon.fileutils.w2p_unpack_plugin web2py.gluon.fileutils-module.html#w2p_unpack_plugin +web2py.gluon.fileutils.abspath web2py.gluon.fileutils-module.html#abspath +web2py.gluon.fileutils.untar web2py.gluon.fileutils-module.html#untar +web2py.gluon.fileutils.cleanpath web2py.gluon.fileutils-module.html#cleanpath +web2py.gluon.fileutils.make_fake_file_like_object web2py.gluon.fileutils-module.html#make_fake_file_like_object +web2py.gluon.fileutils.copystream web2py.gluon.fileutils-module.html#copystream +web2py.gluon.fileutils.fix_newlines web2py.gluon.fileutils-module.html#fix_newlines +web2py.gluon.fileutils.mktree web2py.gluon.fileutils-module.html#mktree +web2py.gluon.fileutils.readlines_file web2py.gluon.fileutils-module.html#readlines_file +web2py.gluon.fileutils.up web2py.gluon.fileutils-module.html#up +web2py.gluon.fileutils.tar_compiled web2py.gluon.fileutils-module.html#tar_compiled +web2py.gluon.fileutils.check_credentials web2py.gluon.fileutils-module.html#check_credentials +web2py.gluon.globals web2py.gluon.globals-module.html +web2py.gluon.globals.custom_json web2py.gluon.serializers-module.html#custom_json +web2py.gluon.globals.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.globals.streamer web2py.gluon.streamer-module.html#streamer +web2py.gluon.globals.stream_file_or_304_or_206 web2py.gluon.streamer-module.html#stream_file_or_304_or_206 +web2py.gluon.globals.contenttype web2py.gluon.contenttype-module.html#contenttype +web2py.gluon.globals.current web2py.gluon.globals-module.html#current +web2py.gluon.globals.json web2py.gluon.serializers-module.html#json +web2py.gluon.globals.handler web2py.gluon.xmlrpc-module.html#handler +web2py.gluon.globals.regex_session_id web2py.gluon.globals-module.html#regex_session_id +web2py.gluon.globals.up web2py.gluon.fileutils-module.html#up +web2py.gluon.globals.xmlescape web2py.gluon.html-module.html#xmlescape +web2py.gluon.highlight web2py.gluon.highlight-module.html +web2py.gluon.highlight.highlight web2py.gluon.highlight-module.html#highlight +web2py.gluon.html web2py.gluon.html-module.html +web2py.gluon.html.TAG web2py.gluon.html-module.html#TAG +web2py.gluon.html.URL web2py.gluon.html-module.html#URL +web2py.gluon.html.ON web2py.gluon.html-module.html#ON +web2py.gluon.html.TAG_unpickler web2py.gluon.html-module.html#TAG_unpickler +web2py.gluon.html.XML_pickle web2py.gluon.html-module.html#XML_pickle +web2py.gluon.html.hmac_hash web2py.gluon.utils-module.html#hmac_hash +web2py.gluon.html.markmin_serializer web2py.gluon.html-module.html#markmin_serializer +web2py.gluon.html.embed64 web2py.gluon.html-module.html#embed64 +web2py.gluon.html.xmlescape web2py.gluon.html-module.html#xmlescape +web2py.gluon.html.verifyURL web2py.gluon.html-module.html#verifyURL +web2py.gluon.html.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.html.regex_crlf web2py.gluon.html-module.html#regex_crlf +web2py.gluon.html.join web2py.gluon.html-module.html#join +web2py.gluon.html.highlight web2py.gluon.highlight-module.html#highlight +web2py.gluon.html.TAG_pickler web2py.gluon.html-module.html#TAG_pickler +web2py.gluon.html.XML_unpickle web2py.gluon.html-module.html#XML_unpickle +web2py.gluon.html.test web2py.gluon.html-module.html#test +web2py.gluon.html.markdown_serializer web2py.gluon.html-module.html#markdown_serializer +web2py.gluon.http web2py.gluon.http-module.html +web2py.gluon.http.redirect web2py.gluon.http-module.html#redirect +web2py.gluon.http.defined_status web2py.gluon.http-module.html#defined_status +web2py.gluon.import_all web2py.gluon.import_all-module.html +web2py.gluon.import_all.dirs web2py.gluon.import_all-module.html#dirs +web2py.gluon.import_all.files web2py.gluon.import_all-module.html#files +web2py.gluon.import_all.alert_dependency web2py.gluon.import_all-module.html#alert_dependency +web2py.gluon.import_all.base_modules web2py.gluon.import_all-module.html#base_modules +web2py.gluon.import_all.candidate web2py.gluon.import_all-module.html#candidate +web2py.gluon.import_all.python_version web2py.gluon.import_all-module.html#python_version +web2py.gluon.import_all.root web2py.gluon.import_all-module.html#root +web2py.gluon.import_all.contributed_modules web2py.gluon.import_all-module.html#contributed_modules +web2py.gluon.import_all.module web2py.gluon.import_all-module.html#module +web2py.gluon.import_all.py27_deprecated web2py.gluon.import_all-module.html#py27_deprecated +web2py.gluon.import_all.py26_deprecated web2py.gluon.import_all-module.html#py26_deprecated +web2py.gluon.import_all.name web2py.gluon.import_all-module.html#name +web2py.gluon.languages web2py.gluon.languages-module.html +web2py.gluon.languages.is_gae web2py.gluon.languages-module.html#is_gae +web2py.gluon.languages.regex_translate web2py.gluon.languages-module.html#regex_translate +web2py.gluon.languages.utf8_repr web2py.gluon.languages-module.html#utf8_repr +web2py.gluon.languages.PY_STRING_LITERAL_RE web2py.gluon.languages-module.html#PY_STRING_LITERAL_RE +web2py.gluon.languages.getcfs web2py.gluon.cfs-module.html#getcfs +web2py.gluon.languages.write_dict web2py.gluon.languages-module.html#write_dict +web2py.gluon.languages.listdir web2py.gluon.fileutils-module.html#listdir +web2py.gluon.languages.lazyT_pickle web2py.gluon.languages-module.html#lazyT_pickle +web2py.gluon.languages.lazyT_unpickle web2py.gluon.languages-module.html#lazyT_unpickle +web2py.gluon.languages.findT web2py.gluon.languages-module.html#findT +web2py.gluon.languages.read_dict_aux web2py.gluon.languages-module.html#read_dict_aux +web2py.gluon.languages.read_dict web2py.gluon.languages-module.html#read_dict +web2py.gluon.languages.regex_language web2py.gluon.languages-module.html#regex_language +web2py.gluon.languages.update_all_languages web2py.gluon.languages-module.html#update_all_languages +web2py.gluon.main web2py.gluon.main-module.html +web2py.gluon.main.build_environment web2py.gluon.compileapp-module.html#build_environment +web2py.gluon.main.parse_get_post_vars web2py.gluon.main-module.html#parse_get_post_vars +web2py.gluon.main.middleware_aux web2py.gluon.main-module.html#middleware_aux +web2py.gluon.main.write_file web2py.gluon.fileutils-module.html#write_file +web2py.gluon.main.get_client web2py.gluon.main-module.html#get_client +web2py.gluon.main.run_view_in web2py.gluon.compileapp-module.html#run_view_in +web2py.gluon.main.redirect web2py.gluon.http-module.html#redirect +web2py.gluon.main.contenttype web2py.gluon.contenttype-module.html#contenttype +web2py.gluon.main.logpath web2py.gluon.main-module.html#logpath +web2py.gluon.main.web2py_path web2py.gluon.main-module.html#web2py_path +web2py.gluon.main.logger web2py.gluon.main-module.html#logger +web2py.gluon.main.start_response_aux web2py.gluon.main-module.html#start_response_aux +web2py.gluon.main.create_missing_folders web2py.gluon.admin-module.html#create_missing_folders +web2py.gluon.main.version_info web2py.gluon.main-module.html#version_info +web2py.gluon.main.Url web2py.gluon.html-module.html#URL +web2py.gluon.main.regex_client web2py.gluon.main-module.html#regex_client +web2py.gluon.main.abspath web2py.gluon.fileutils-module.html#abspath +web2py.gluon.main.run_models_in web2py.gluon.compileapp-module.html#run_models_in +web2py.gluon.main.wsgibase web2py.gluon.main-module.html#wsgibase +web2py.gluon.main.copystream_progress web2py.gluon.main-module.html#copystream_progress +web2py.gluon.main.web2py_version web2py.gluon.main-module.html#web2py_version +web2py.gluon.main.run_controller_in web2py.gluon.compileapp-module.html#run_controller_in +web2py.gluon.main.custom_import_install web2py.gluon.custom_import-module.html#custom_import_install +web2py.gluon.main.appfactory web2py.gluon.main-module.html#appfactory +web2py.gluon.main.add_path_first web2py.gluon.admin-module.html#add_path_first +web2py.gluon.main.serve_controller web2py.gluon.main-module.html#serve_controller +web2py.gluon.main.copystream web2py.gluon.fileutils-module.html#copystream +web2py.gluon.main.create_missing_app_folders web2py.gluon.admin-module.html#create_missing_app_folders +web2py.gluon.main.environ_aux web2py.gluon.main-module.html#environ_aux +web2py.gluon.main.save_password web2py.gluon.main-module.html#save_password +web2py.gluon.main.requests web2py.gluon.main-module.html#requests +web2py.gluon.myregex web2py.gluon.myregex-module.html +web2py.gluon.myregex.regex_expose web2py.gluon.myregex-module.html#regex_expose +web2py.gluon.myregex.regex_tables web2py.gluon.myregex-module.html#regex_tables +web2py.gluon.myregex.regex_extend web2py.gluon.myregex-module.html#regex_extend +web2py.gluon.myregex.regex_include web2py.gluon.myregex-module.html#regex_include +web2py.gluon.newcron web2py.gluon.newcron-module.html +web2py.gluon.newcron._cron_stopping web2py.gluon.newcron-module.html#_cron_stopping +web2py.gluon.newcron.stopcron web2py.gluon.newcron-module.html#stopcron +web2py.gluon.newcron.parsecronline web2py.gluon.newcron-module.html#parsecronline +web2py.gluon.newcron.crondance web2py.gluon.newcron-module.html#crondance +web2py.gluon.newcron.logger web2py.gluon.newcron-module.html#logger +web2py.gluon.newcron.rangetolist web2py.gluon.newcron-module.html#rangetolist +web2py.gluon.portalocker web2py.gluon.portalocker-module.html +web2py.gluon.portalocker.__overlapped web2py.gluon.portalocker-module.html#__overlapped +web2py.gluon.portalocker.lock web2py.gluon.portalocker-module.html#lock +web2py.gluon.portalocker.os_locking web2py.gluon.portalocker-module.html#os_locking +web2py.gluon.portalocker.unlock web2py.gluon.portalocker-module.html#unlock +web2py.gluon.portalocker.LOCK_NB web2py.gluon.portalocker-module.html#LOCK_NB +web2py.gluon.portalocker.LOCK_EX web2py.gluon.portalocker-module.html#LOCK_EX +web2py.gluon.portalocker.logger web2py.gluon.portalocker-module.html#logger +web2py.gluon.portalocker.LOCK_SH web2py.gluon.portalocker-module.html#LOCK_SH +web2py.gluon.reserved_sql_keywords web2py.gluon.reserved_sql_keywords-module.html +web2py.gluon.reserved_sql_keywords.POSTGRESQL_NONRESERVED web2py.gluon.reserved_sql_keywords-module.html#POSTGRESQL_NONRESERVED +web2py.gluon.reserved_sql_keywords.SQLITE web2py.gluon.reserved_sql_keywords-module.html#SQLITE +web2py.gluon.reserved_sql_keywords.POSTGRESQL web2py.gluon.reserved_sql_keywords-module.html#POSTGRESQL +web2py.gluon.reserved_sql_keywords.FIREBIRD web2py.gluon.reserved_sql_keywords-module.html#FIREBIRD +web2py.gluon.reserved_sql_keywords.MSSQL web2py.gluon.reserved_sql_keywords-module.html#MSSQL +web2py.gluon.reserved_sql_keywords.FIREBIRD_NONRESERVED web2py.gluon.reserved_sql_keywords-module.html#FIREBIRD_NONRESERVED +web2py.gluon.reserved_sql_keywords.JDBCPOSTGRESQL web2py.gluon.reserved_sql_keywords-module.html#JDBCPOSTGRESQL +web2py.gluon.reserved_sql_keywords.__author__ web2py.gluon.reserved_sql_keywords-module.html#__author__ +web2py.gluon.reserved_sql_keywords.INFORMIX web2py.gluon.reserved_sql_keywords-module.html#INFORMIX +web2py.gluon.reserved_sql_keywords.COMMON web2py.gluon.reserved_sql_keywords-module.html#COMMON +web2py.gluon.reserved_sql_keywords.MYSQL web2py.gluon.reserved_sql_keywords-module.html#MYSQL +web2py.gluon.reserved_sql_keywords.ORACLE web2py.gluon.reserved_sql_keywords-module.html#ORACLE +web2py.gluon.reserved_sql_keywords.INGRES web2py.gluon.reserved_sql_keywords-module.html#INGRES +web2py.gluon.reserved_sql_keywords.DB2 web2py.gluon.reserved_sql_keywords-module.html#DB2 +web2py.gluon.reserved_sql_keywords.ADAPTERS web2py.gluon.reserved_sql_keywords-module.html#ADAPTERS +web2py.gluon.reserved_sql_keywords.JDBCSQLITE web2py.gluon.reserved_sql_keywords-module.html#JDBCSQLITE +web2py.gluon.restricted web2py.gluon.restricted-module.html +web2py.gluon.restricted.restricted web2py.gluon.restricted-module.html#restricted +web2py.gluon.restricted.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.restricted.snapshot web2py.gluon.restricted-module.html#snapshot +web2py.gluon.restricted.logger web2py.gluon.restricted-module.html#logger +web2py.gluon.restricted.compile2 web2py.gluon.restricted-module.html#compile2 +web2py.gluon.rewrite web2py.gluon.rewrite-module.html +web2py.gluon.rewrite.load web2py.gluon.rewrite-module.html#load +web2py.gluon.rewrite.ROUTER_KEYS web2py.gluon.rewrite-module.html#ROUTER_KEYS +web2py.gluon.rewrite.params_apps web2py.gluon.rewrite-module.html#params_apps +web2py.gluon.rewrite.load_routers web2py.gluon.rewrite-module.html#load_routers +web2py.gluon.rewrite.routers web2py.gluon.rewrite-module.html#routers +web2py.gluon.rewrite.regex_url_in web2py.gluon.rewrite-module.html#regex_url_in +web2py.gluon.rewrite.get_effective_router web2py.gluon.rewrite-module.html#get_effective_router +web2py.gluon.rewrite.regex_anything web2py.gluon.rewrite-module.html#regex_anything +web2py.gluon.rewrite.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.rewrite.url_in web2py.gluon.rewrite-module.html#url_in +web2py.gluon.rewrite.map_url_in web2py.gluon.rewrite-module.html#map_url_in +web2py.gluon.rewrite.map_url_out web2py.gluon.rewrite-module.html#map_url_out +web2py.gluon.rewrite.regex_filter_in web2py.gluon.rewrite-module.html#regex_filter_in +web2py.gluon.rewrite.regex_select web2py.gluon.rewrite-module.html#regex_select +web2py.gluon.rewrite.regex_at web2py.gluon.rewrite-module.html#regex_at +web2py.gluon.rewrite.regex_url web2py.gluon.rewrite-module.html#regex_url +web2py.gluon.rewrite.filter_err web2py.gluon.rewrite-module.html#filter_err +web2py.gluon.rewrite.regex_args web2py.gluon.rewrite-module.html#regex_args +web2py.gluon.rewrite.regex_uri web2py.gluon.rewrite-module.html#regex_uri +web2py.gluon.rewrite.params web2py.gluon.rewrite-module.html#params +web2py.gluon.rewrite.logger web2py.gluon.rewrite-module.html#logger +web2py.gluon.rewrite.regex_filter_out web2py.gluon.rewrite-module.html#regex_filter_out +web2py.gluon.rewrite.try_redirect_on_error web2py.gluon.rewrite-module.html#try_redirect_on_error +web2py.gluon.rewrite.ROUTER_BASE_KEYS web2py.gluon.rewrite-module.html#ROUTER_BASE_KEYS +web2py.gluon.rewrite.abspath web2py.gluon.fileutils-module.html#abspath +web2py.gluon.rewrite.url_out web2py.gluon.rewrite-module.html#url_out +web2py.gluon.rewrite.try_rewrite_on_error web2py.gluon.rewrite-module.html#try_rewrite_on_error +web2py.gluon.rewrite._params_default web2py.gluon.rewrite-module.html#_params_default +web2py.gluon.rewrite.filter_url web2py.gluon.rewrite-module.html#filter_url +web2py.gluon.rewrite.compile_regex web2py.gluon.rewrite-module.html#compile_regex +web2py.gluon.rewrite.thread web2py.gluon.rewrite-module.html#thread +web2py.gluon.rewrite.regex_static web2py.gluon.rewrite-module.html#regex_static +web2py.gluon.rewrite._router_default web2py.gluon.rewrite-module.html#_router_default +web2py.gluon.rewrite.regex_space web2py.gluon.rewrite-module.html#regex_space +web2py.gluon.rocket web2py.gluon.rocket-module.html +web2py.gluon.rocket.BUF_SIZE web2py.gluon.rocket-module.html#BUF_SIZE +web2py.gluon.rocket.demo web2py.gluon.rocket-module.html#demo +web2py.gluon.rocket.PY3K web2py.gluon.rocket-module.html#PY3K +web2py.gluon.rocket.SERVER_SOFTWARE web2py.gluon.rocket-module.html#SERVER_SOFTWARE +web2py.gluon.rocket.HTTP_SERVER_SOFTWARE web2py.gluon.rocket-module.html#HTTP_SERVER_SOFTWARE +web2py.gluon.rocket.LOG_LINE web2py.gluon.rocket-module.html#LOG_LINE +web2py.gluon.rocket.BASE_ENV web2py.gluon.rocket-module.html#BASE_ENV +web2py.gluon.rocket._formatparam web2py.gluon.rocket-module.html#_formatparam +web2py.gluon.rocket.HTTP_METHODS web2py.gluon.rocket-module.html#HTTP_METHODS +web2py.gluon.rocket.log web2py.gluon.rocket-module.html#log +web2py.gluon.rocket.SERVER_NAME web2py.gluon.rocket-module.html#SERVER_NAME +web2py.gluon.rocket.NEWLINE web2py.gluon.rocket-module.html#NEWLINE +web2py.gluon.rocket.HEADER_RESPONSE web2py.gluon.rocket-module.html#HEADER_RESPONSE +web2py.gluon.rocket.DEFAULTS web2py.gluon.rocket-module.html#DEFAULTS +web2py.gluon.rocket.b web2py.gluon.rocket-module.html#b +web2py.gluon.rocket.THREAD_STOP_CHECK_INTERVAL web2py.gluon.rocket-module.html#THREAD_STOP_CHECK_INTERVAL +web2py.gluon.rocket.re_REQUEST_LINE web2py.gluon.rocket-module.html#re_REQUEST_LINE +web2py.gluon.rocket.re_SLASH web2py.gluon.rocket-module.html#re_SLASH +web2py.gluon.rocket.VERSION web2py.gluon.rocket-module.html#VERSION +web2py.gluon.rocket.DEFAULT_LISTEN_QUEUE_SIZE web2py.gluon.rocket-module.html#DEFAULT_LISTEN_QUEUE_SIZE +web2py.gluon.rocket.DEFAULT_MIN_THREADS web2py.gluon.rocket-module.html#DEFAULT_MIN_THREADS +web2py.gluon.rocket.RESPONSE web2py.gluon.rocket-module.html#RESPONSE +web2py.gluon.rocket.get_method web2py.gluon.rocket-module.html#get_method +web2py.gluon.rocket.CherryPyWSGIServer web2py.gluon.rocket-module.html#CherryPyWSGIServer +web2py.gluon.rocket.DEFAULT_MAX_THREADS web2py.gluon.rocket-module.html#DEFAULT_MAX_THREADS +web2py.gluon.rocket.SOCKET_TIMEOUT web2py.gluon.rocket-module.html#SOCKET_TIMEOUT +web2py.gluon.rocket.IS_JYTHON web2py.gluon.rocket-module.html#IS_JYTHON +web2py.gluon.rocket.IGNORE_ERRORS_ON_CLOSE web2py.gluon.rocket-module.html#IGNORE_ERRORS_ON_CLOSE +web2py.gluon.rocket.u web2py.gluon.rocket-module.html#u +web2py.gluon.rocket.has_ssl web2py.gluon.rocket-module.html#has_ssl +web2py.gluon.rocket.demo_app web2py.gluon.rocket-module.html#demo_app +web2py.gluon.rocket._tspecials web2py.gluon.rocket-module.html#_tspecials +web2py.gluon.sanitizer web2py.gluon.sanitizer-module.html +web2py.gluon.sanitizer.sanitize web2py.gluon.sanitizer-module.html#sanitize +web2py.gluon.sanitizer.xssescape web2py.gluon.sanitizer-module.html#xssescape +web2py.gluon.serializers web2py.gluon.serializers-module.html +web2py.gluon.serializers.xml web2py.gluon.serializers-module.html#xml +web2py.gluon.serializers.custom_json web2py.gluon.serializers-module.html#custom_json +web2py.gluon.serializers.xml_rec web2py.gluon.serializers-module.html#xml_rec +web2py.gluon.serializers.json web2py.gluon.serializers-module.html#json +web2py.gluon.serializers.xmlescape web2py.gluon.html-module.html#xmlescape +web2py.gluon.serializers.csv web2py.gluon.serializers-module.html#csv +web2py.gluon.serializers.rss web2py.gluon.serializers-module.html#rss +web2py.gluon.settings web2py.gluon.settings-module.html +web2py.gluon.settings.global_settings web2py.gluon.settings-module.html#global_settings +web2py.gluon.settings.settings web2py.gluon.settings-module.html#settings +web2py.gluon.shell web2py.gluon.shell-module.html +web2py.gluon.shell.exec_environment web2py.gluon.shell-module.html#exec_environment +web2py.gluon.shell.build_environment web2py.gluon.compileapp-module.html#build_environment +web2py.gluon.shell.get_usage web2py.gluon.shell-module.html#get_usage +web2py.gluon.shell.w2p_unpack web2py.gluon.fileutils-module.html#w2p_unpack +web2py.gluon.shell.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.shell.exec_pythonrc web2py.gluon.shell-module.html#exec_pythonrc +web2py.gluon.shell.execute_from_command_line web2py.gluon.shell-module.html#execute_from_command_line +web2py.gluon.shell.parse_path_info web2py.gluon.shell-module.html#parse_path_info +web2py.gluon.shell.env web2py.gluon.shell-module.html#env +web2py.gluon.shell.test web2py.gluon.shell-module.html#test +web2py.gluon.shell.logger web2py.gluon.shell-module.html#logger +web2py.gluon.shell.run web2py.gluon.shell-module.html#run +web2py.gluon.shell.read_pyc web2py.gluon.compileapp-module.html#read_pyc +web2py.gluon.shell.die web2py.gluon.shell-module.html#die +web2py.gluon.shell.run_models_in web2py.gluon.compileapp-module.html#run_models_in +web2py.gluon.sql web2py.gluon.sql-module.html +web2py.gluon.sql.drivers web2py.gluon.sql-module.html#drivers +web2py.gluon.sqlhtml web2py.gluon.sqlhtml-module.html +web2py.gluon.sqlhtml.table_field web2py.gluon.sqlhtml-module.html#table_field +web2py.gluon.sqlhtml.safe_int web2py.gluon.sqlhtml-module.html#safe_int +web2py.gluon.sqlhtml.form_factory web2py.gluon.sqlhtml-module.html#form_factory +web2py.gluon.sqlhtml.represent web2py.gluon.sqlhtml-module.html#represent +web2py.gluon.sqlhtml.safe_float web2py.gluon.sqlhtml-module.html#safe_float +web2py.gluon.sqlhtml.Url web2py.gluon.html-module.html#URL +web2py.gluon.sqlhtml.md5_hash web2py.gluon.utils-module.html#md5_hash +web2py.gluon.sqlhtml.widget_class web2py.gluon.sqlhtml-module.html#widget_class +web2py.gluon.storage web2py.gluon.storage-module.html +web2py.gluon.storage.load_storage web2py.gluon.storage-module.html#load_storage +web2py.gluon.storage.save_storage web2py.gluon.storage-module.html#save_storage +web2py.gluon.streamer web2py.gluon.streamer-module.html +web2py.gluon.streamer.contenttype web2py.gluon.contenttype-module.html#contenttype +web2py.gluon.streamer.DEFAULT_CHUNK_SIZE web2py.gluon.streamer-module.html#DEFAULT_CHUNK_SIZE +web2py.gluon.streamer.regex_start_range web2py.gluon.streamer-module.html#regex_start_range +web2py.gluon.streamer.streamer web2py.gluon.streamer-module.html#streamer +web2py.gluon.streamer.regex_stop_range web2py.gluon.streamer-module.html#regex_stop_range +web2py.gluon.streamer.stream_file_or_304_or_206 web2py.gluon.streamer-module.html#stream_file_or_304_or_206 +web2py.gluon.template web2py.gluon.template-module.html +web2py.gluon.template.render web2py.gluon.template-module.html#render +web2py.gluon.template.parse_template web2py.gluon.template-module.html#parse_template +web2py.gluon.template.get_parsed web2py.gluon.template-module.html#get_parsed +web2py.gluon.tools web2py.gluon.tools-module.html +web2py.gluon.tools.validators web2py.gluon.tools-module.html#validators +web2py.gluon.tools.geocode web2py.gluon.tools-module.html#geocode +web2py.gluon.tools.logger web2py.gluon.tools-module.html#logger +web2py.gluon.tools.regex_geocode web2py.gluon.tools-module.html#regex_geocode +web2py.gluon.tools.ON web2py.gluon.tools-module.html#ON +web2py.gluon.tools.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.tools.contenttype web2py.gluon.contenttype-module.html#contenttype +web2py.gluon.tools.prettydate web2py.gluon.tools-module.html#prettydate +web2py.gluon.tools.current web2py.gluon.tools-module.html#current +web2py.gluon.tools.universal_caller web2py.gluon.tools-module.html#universal_caller +web2py.gluon.tools.test_thread_separation web2py.gluon.tools-module.html#test_thread_separation +web2py.gluon.tools.DEFAULT web2py.gluon.tools-module.html#DEFAULT +web2py.gluon.tools.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.tools.TAG web2py.gluon.tools-module.html#TAG +web2py.gluon.tools.completion web2py.gluon.tools-module.html#completion +web2py.gluon.tools.fetch web2py.gluon.tools-module.html#fetch +web2py.gluon.tools.call_or_redirect web2py.gluon.tools-module.html#call_or_redirect +web2py.gluon.tools.addrow web2py.gluon.tools-module.html#addrow +web2py.gluon.tools.callback web2py.gluon.tools-module.html#callback +web2py.gluon.utils web2py.gluon.utils-module.html +web2py.gluon.utils.initialize_urandom web2py.gluon.utils-module.html#initialize_urandom +web2py.gluon.utils.ctokens web2py.gluon.utils-module.html#ctokens +web2py.gluon.utils.hmac_hash web2py.gluon.utils-module.html#hmac_hash +web2py.gluon.utils.get_digest web2py.gluon.utils-module.html#get_digest +web2py.gluon.utils.web2py_uuid web2py.gluon.utils-module.html#web2py_uuid +web2py.gluon.utils.md5_hash web2py.gluon.utils-module.html#md5_hash +web2py.gluon.utils.logger web2py.gluon.utils-module.html#logger +web2py.gluon.utils.simple_hash web2py.gluon.utils-module.html#simple_hash +web2py.gluon.validators web2py.gluon.validators-module.html +web2py.gluon.validators.unicode_to_ascii_url web2py.gluon.validators-module.html#unicode_to_ascii_url +web2py.gluon.validators.unofficial_url_schemes web2py.gluon.validators-module.html#unofficial_url_schemes +web2py.gluon.validators.http_schemes web2py.gluon.validators-module.html#http_schemes +web2py.gluon.validators.regex1 web2py.gluon.validators-module.html#regex1 +web2py.gluon.validators.regex2 web2py.gluon.validators-module.html#regex2 +web2py.gluon.validators.simple_hash web2py.gluon.utils-module.html#simple_hash +web2py.gluon.validators.hmac_hash web2py.gluon.utils-module.html#hmac_hash +web2py.gluon.validators.unicode_to_ascii_authority web2py.gluon.validators-module.html#unicode_to_ascii_authority +web2py.gluon.validators.regex_time web2py.gluon.validators-module.html#regex_time +web2py.gluon.validators.label_split_regex web2py.gluon.validators-module.html#label_split_regex +web2py.gluon.validators.url_split_regex web2py.gluon.validators-module.html#url_split_regex +web2py.gluon.validators.all_url_schemes web2py.gluon.validators-module.html#all_url_schemes +web2py.gluon.validators.official_url_schemes web2py.gluon.validators-module.html#official_url_schemes +web2py.gluon.validators.is_empty web2py.gluon.validators-module.html#is_empty +web2py.gluon.validators.urlify web2py.gluon.validators-module.html#urlify +web2py.gluon.validators.translate web2py.gluon.validators-module.html#translate +web2py.gluon.validators.options_sorter web2py.gluon.validators-module.html#options_sorter +web2py.gluon.validators.escape_unicode web2py.gluon.validators-module.html#escape_unicode +web2py.gluon.validators.official_top_level_domains web2py.gluon.validators-module.html#official_top_level_domains +web2py.gluon.widget web2py.gluon.widget-module.html +web2py.gluon.widget.ProgramAuthor web2py.gluon.widget-module.html#ProgramAuthor +web2py.gluon.widget.try_start_browser web2py.gluon.widget-module.html#try_start_browser +web2py.gluon.widget.read_file web2py.gluon.fileutils-module.html#read_file +web2py.gluon.widget.write_file web2py.gluon.fileutils-module.html#write_file +web2py.gluon.widget.run web2py.gluon.shell-module.html#run +web2py.gluon.widget.console web2py.gluon.widget-module.html#console +web2py.gluon.widget.ProgramVersion web2py.gluon.widget-module.html#ProgramVersion +web2py.gluon.widget.start web2py.gluon.widget-module.html#start +web2py.gluon.widget.w2p_pack web2py.gluon.fileutils-module.html#w2p_pack +web2py.gluon.widget.test web2py.gluon.shell-module.html#test +web2py.gluon.widget.logger web2py.gluon.widget-module.html#logger +web2py.gluon.widget.presentation web2py.gluon.widget-module.html#presentation +web2py.gluon.widget.msg web2py.gluon.widget-module.html#msg +web2py.gluon.widget.start_browser web2py.gluon.widget-module.html#start_browser +web2py.gluon.widget.ProgramName web2py.gluon.widget-module.html#ProgramName +web2py.gluon.widget.ProgramInfo web2py.gluon.widget-module.html#ProgramInfo +web2py.gluon.winservice web2py.gluon.winservice-module.html +web2py.gluon.winservice.web2py_windows_service_handler web2py.gluon.winservice-module.html#web2py_windows_service_handler +web2py.gluon.xmlrpc web2py.gluon.xmlrpc-module.html +web2py.gluon.xmlrpc.handler web2py.gluon.xmlrpc-module.html#handler +datetime.date datetime.date-class.html +datetime.date.__str__ datetime.date-class.html#__str__ +datetime.date.__getattribute__ datetime.date-class.html#__getattribute__ +datetime.date.__radd__ datetime.date-class.html#__radd__ +datetime.date.toordinal datetime.date-class.html#toordinal +datetime.date.__rsub__ datetime.date-class.html#__rsub__ +datetime.date.year datetime.date-class.html#year +datetime.date.__lt__ datetime.date-class.html#__lt__ +datetime.date.isocalendar datetime.date-class.html#isocalendar +datetime.date.__new__ datetime.date-class.html#__new__ +datetime.date.min datetime.date-class.html#min +datetime.date.strftime datetime.date-class.html#strftime +datetime.date.timetuple datetime.date-class.html#timetuple +datetime.date.today datetime.date-class.html#today +datetime.date.__repr__ datetime.date-class.html#__repr__ +datetime.date.isoformat datetime.date-class.html#isoformat +datetime.date.__ne__ datetime.date-class.html#__ne__ +datetime.date.month datetime.date-class.html#month +datetime.date.max datetime.date-class.html#max +datetime.date.isoweekday datetime.date-class.html#isoweekday +datetime.date.__add__ datetime.date-class.html#__add__ +datetime.date.__gt__ datetime.date-class.html#__gt__ +datetime.date.__reduce__ datetime.date-class.html#__reduce__ +datetime.date.replace datetime.date-class.html#replace +datetime.date.__eq__ datetime.date-class.html#__eq__ +datetime.date.day datetime.date-class.html#day +datetime.date.ctime datetime.date-class.html#ctime +datetime.date.fromordinal datetime.date-class.html#fromordinal +datetime.date.fromtimestamp datetime.date-class.html#fromtimestamp +datetime.date.__le__ datetime.date-class.html#__le__ +datetime.date.weekday datetime.date-class.html#weekday +datetime.date.__hash__ datetime.date-class.html#__hash__ +datetime.date.__sub__ datetime.date-class.html#__sub__ +datetime.date.resolution datetime.date-class.html#resolution +datetime.date.__ge__ datetime.date-class.html#__ge__ +datetime.datetime datetime.datetime-class.html +datetime.date.weekday datetime.date-class.html#weekday +datetime.datetime.__rsub__ datetime.datetime-class.html#__rsub__ +datetime.datetime.__str__ datetime.datetime-class.html#__str__ +datetime.datetime.__reduce__ datetime.datetime-class.html#__reduce__ +datetime.datetime.__radd__ datetime.datetime-class.html#__radd__ +datetime.datetime.utctimetuple datetime.datetime-class.html#utctimetuple +datetime.datetime.second datetime.datetime-class.html#second +datetime.date.toordinal datetime.date-class.html#toordinal +datetime.datetime.utcnow datetime.datetime-class.html#utcnow +datetime.date.year datetime.date-class.html#year +datetime.datetime.__lt__ datetime.datetime-class.html#__lt__ +datetime.date.isocalendar datetime.date-class.html#isocalendar +datetime.datetime.now datetime.datetime-class.html#now +datetime.datetime.__new__ datetime.datetime-class.html#__new__ +datetime.datetime.min datetime.datetime-class.html#min +datetime.datetime.dst datetime.datetime-class.html#dst +datetime.datetime.astimezone datetime.datetime-class.html#astimezone +datetime.datetime.strptime datetime.datetime-class.html#strptime +datetime.datetime.utcfromtimestamp datetime.datetime-class.html#utcfromtimestamp +datetime.date.strftime datetime.date-class.html#strftime +datetime.datetime.combine datetime.datetime-class.html#combine +datetime.datetime.timetuple datetime.datetime-class.html#timetuple +datetime.datetime.max datetime.datetime-class.html#max +datetime.datetime.tzinfo datetime.datetime-class.html#tzinfo +datetime.date.today datetime.date-class.html#today +datetime.datetime.__repr__ datetime.datetime-class.html#__repr__ +datetime.datetime.__ne__ datetime.datetime-class.html#__ne__ +datetime.date.month datetime.date-class.html#month +datetime.datetime.__getattribute__ datetime.datetime-class.html#__getattribute__ +datetime.date.isoweekday datetime.date-class.html#isoweekday +datetime.datetime.replace datetime.datetime-class.html#replace +datetime.datetime.utcoffset datetime.datetime-class.html#utcoffset +datetime.datetime.microsecond datetime.datetime-class.html#microsecond +datetime.datetime.__add__ datetime.datetime-class.html#__add__ +datetime.datetime.__gt__ datetime.datetime-class.html#__gt__ +datetime.datetime.date datetime.datetime-class.html#date +datetime.datetime.isoformat datetime.datetime-class.html#isoformat +datetime.datetime.__eq__ datetime.datetime-class.html#__eq__ +datetime.date.day datetime.date-class.html#day +datetime.datetime.minute datetime.datetime-class.html#minute +datetime.datetime.ctime datetime.datetime-class.html#ctime +datetime.datetime.hour datetime.datetime-class.html#hour +datetime.date.fromordinal datetime.date-class.html#fromordinal +datetime.datetime.fromtimestamp datetime.datetime-class.html#fromtimestamp +datetime.datetime.__le__ datetime.datetime-class.html#__le__ +datetime.datetime.tzname datetime.datetime-class.html#tzname +datetime.datetime.time datetime.datetime-class.html#time +datetime.datetime.__hash__ datetime.datetime-class.html#__hash__ +datetime.datetime.__sub__ datetime.datetime-class.html#__sub__ +datetime.datetime.timetz datetime.datetime-class.html#timetz +datetime.datetime.resolution datetime.datetime-class.html#resolution +datetime.datetime.__ge__ datetime.datetime-class.html#__ge__ +datetime.time datetime.time-class.html +datetime.time.__str__ datetime.time-class.html#__str__ +datetime.time.__getattribute__ datetime.time-class.html#__getattribute__ +datetime.time.isoformat datetime.time-class.html#isoformat +datetime.time.second datetime.time-class.html#second +datetime.time.__lt__ datetime.time-class.html#__lt__ +datetime.time.__new__ datetime.time-class.html#__new__ +datetime.time.min datetime.time-class.html#min +datetime.time.dst datetime.time-class.html#dst +datetime.time.strftime datetime.time-class.html#strftime +datetime.time.tzinfo datetime.time-class.html#tzinfo +datetime.time.__repr__ datetime.time-class.html#__repr__ +datetime.time.__ne__ datetime.time-class.html#__ne__ +datetime.time.max datetime.time-class.html#max +datetime.time.utcoffset datetime.time-class.html#utcoffset +datetime.time.microsecond datetime.time-class.html#microsecond +datetime.time.__gt__ datetime.time-class.html#__gt__ +datetime.time.__reduce__ datetime.time-class.html#__reduce__ +datetime.time.replace datetime.time-class.html#replace +datetime.time.__eq__ datetime.time-class.html#__eq__ +datetime.time.minute datetime.time-class.html#minute +datetime.time.__nonzero__ datetime.time-class.html#__nonzero__ +datetime.time.hour datetime.time-class.html#hour +datetime.time.__le__ datetime.time-class.html#__le__ +datetime.time.tzname datetime.time-class.html#tzname +datetime.time.__hash__ datetime.time-class.html#__hash__ +datetime.time.resolution datetime.time-class.html#resolution +datetime.time.__ge__ datetime.time-class.html#__ge__ +exceptions.Exception exceptions.Exception-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +psycopg2.DataError psycopg2.DataError-class.html +psycopg2.DatabaseError psycopg2.DatabaseError-class.html +psycopg2.Error psycopg2.Error-class.html +psycopg2.IntegrityError psycopg2.IntegrityError-class.html +psycopg2.InterfaceError psycopg2.InterfaceError-class.html +psycopg2.InternalError psycopg2.InternalError-class.html +psycopg2.NotSupportedError psycopg2.NotSupportedError-class.html +psycopg2.OperationalError psycopg2.OperationalError-class.html +psycopg2.ProgrammingError psycopg2.ProgrammingError-class.html +psycopg2.Warning psycopg2.Warning-class.html +psycopg2.tz.FixedOffsetTimezone psycopg2.tz.FixedOffsetTimezone-class.html +psycopg2.tz.FixedOffsetTimezone.dst psycopg2.tz.FixedOffsetTimezone-class.html#dst +psycopg2.tz.FixedOffsetTimezone._name psycopg2.tz.FixedOffsetTimezone-class.html#_name +psycopg2.tz.FixedOffsetTimezone._offset psycopg2.tz.FixedOffsetTimezone-class.html#_offset +psycopg2.tz.FixedOffsetTimezone.utcoffset psycopg2.tz.FixedOffsetTimezone-class.html#utcoffset +psycopg2.tz.FixedOffsetTimezone.tzname psycopg2.tz.FixedOffsetTimezone-class.html#tzname +psycopg2.tz.FixedOffsetTimezone.__init__ psycopg2.tz.FixedOffsetTimezone-class.html#__init__ +psycopg2.tz.LocalTimezone psycopg2.tz.LocalTimezone-class.html +psycopg2.tz.LocalTimezone._isdst psycopg2.tz.LocalTimezone-class.html#_isdst +psycopg2.tz.LocalTimezone.utcoffset psycopg2.tz.LocalTimezone-class.html#utcoffset +psycopg2.tz.LocalTimezone.tzname psycopg2.tz.LocalTimezone-class.html#tzname +psycopg2.tz.LocalTimezone.dst psycopg2.tz.LocalTimezone-class.html#dst +web2py.gluon.cache.Cache web2py.gluon.cache.Cache-class.html +web2py.gluon.cache.Cache.__call__ web2py.gluon.cache.Cache-class.html#__call__ +web2py.gluon.cache.Cache.__init__ web2py.gluon.cache.Cache-class.html#__init__ +web2py.gluon.cache.CacheAbstract web2py.gluon.cache.CacheAbstract-class.html +web2py.gluon.cache.CacheAbstract._clear web2py.gluon.cache.CacheAbstract-class.html#_clear +web2py.gluon.cache.CacheAbstract.clear web2py.gluon.cache.CacheAbstract-class.html#clear +web2py.gluon.cache.CacheAbstract.increment web2py.gluon.cache.CacheAbstract-class.html#increment +web2py.gluon.cache.CacheAbstract.__call__ web2py.gluon.cache.CacheAbstract-class.html#__call__ +web2py.gluon.cache.CacheAbstract.cache_stats_name web2py.gluon.cache.CacheAbstract-class.html#cache_stats_name +web2py.gluon.cache.CacheAbstract.__init__ web2py.gluon.cache.CacheAbstract-class.html#__init__ +web2py.gluon.cache.CacheInRam web2py.gluon.cache.CacheInRam-class.html +web2py.gluon.cache.CacheInRam.meta_storage web2py.gluon.cache.CacheInRam-class.html#meta_storage +web2py.gluon.cache.CacheAbstract._clear web2py.gluon.cache.CacheAbstract-class.html#_clear +web2py.gluon.cache.CacheInRam.clear web2py.gluon.cache.CacheInRam-class.html#clear +web2py.gluon.cache.CacheInRam.locker web2py.gluon.cache.CacheInRam-class.html#locker +web2py.gluon.cache.CacheInRam.increment web2py.gluon.cache.CacheInRam-class.html#increment +web2py.gluon.cache.CacheInRam.__call__ web2py.gluon.cache.CacheInRam-class.html#__call__ +web2py.gluon.cache.CacheAbstract.cache_stats_name web2py.gluon.cache.CacheAbstract-class.html#cache_stats_name +web2py.gluon.cache.CacheInRam.__init__ web2py.gluon.cache.CacheInRam-class.html#__init__ +web2py.gluon.cache.CacheOnDisk web2py.gluon.cache.CacheOnDisk-class.html +web2py.gluon.cache.CacheAbstract._clear web2py.gluon.cache.CacheAbstract-class.html#_clear +web2py.gluon.cache.CacheOnDisk.clear web2py.gluon.cache.CacheOnDisk-class.html#clear +web2py.gluon.cache.CacheOnDisk.__call__ web2py.gluon.cache.CacheOnDisk-class.html#__call__ +web2py.gluon.cache.CacheOnDisk.increment web2py.gluon.cache.CacheOnDisk-class.html#increment +web2py.gluon.cache.CacheOnDisk.speedup_checks web2py.gluon.cache.CacheOnDisk-class.html#speedup_checks +web2py.gluon.cache.CacheAbstract.cache_stats_name web2py.gluon.cache.CacheAbstract-class.html#cache_stats_name +web2py.gluon.cache.CacheOnDisk.__init__ web2py.gluon.cache.CacheOnDisk-class.html#__init__ +web2py.gluon.compileapp.LoadFactory web2py.gluon.compileapp.LoadFactory-class.html +web2py.gluon.compileapp.LoadFactory.__call__ web2py.gluon.compileapp.LoadFactory-class.html#__call__ +web2py.gluon.compileapp.LoadFactory.__init__ web2py.gluon.compileapp.LoadFactory-class.html#__init__ +web2py.gluon.compileapp.mybuiltin web2py.gluon.compileapp.mybuiltin-class.html +web2py.gluon.compileapp.mybuiltin.__getitem__ web2py.gluon.compileapp.mybuiltin-class.html#__getitem__ +web2py.gluon.compileapp.mybuiltin.__setitem__ web2py.gluon.compileapp.mybuiltin-class.html#__setitem__ +web2py.gluon.contrib.pymysql.DBAPISet web2py.gluon.contrib.pymysql.DBAPISet-class.html +web2py.gluon.contrib.pymysql.DBAPISet.__ne__ web2py.gluon.contrib.pymysql.DBAPISet-class.html#__ne__ +web2py.gluon.contrib.pymysql.DBAPISet.__eq__ web2py.gluon.contrib.pymysql.DBAPISet-class.html#__eq__ +web2py.gluon.contrib.pymysql.DBAPISet.__hash__ web2py.gluon.contrib.pymysql.DBAPISet-class.html#__hash__ +web2py.gluon.contrib.pymysql.err.DataError web2py.gluon.contrib.pymysql.err.DataError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.DatabaseError web2py.gluon.contrib.pymysql.err.DatabaseError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.Error web2py.gluon.contrib.pymysql.err.Error-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.IntegrityError web2py.gluon.contrib.pymysql.err.IntegrityError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.InterfaceError web2py.gluon.contrib.pymysql.err.InterfaceError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.InternalError web2py.gluon.contrib.pymysql.err.InternalError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.NotSupportedError web2py.gluon.contrib.pymysql.err.NotSupportedError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.OperationalError web2py.gluon.contrib.pymysql.err.OperationalError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.ProgrammingError web2py.gluon.contrib.pymysql.err.ProgrammingError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.contrib.pymysql.err.Warning web2py.gluon.contrib.pymysql.err.Warning-class.html +web2py.gluon.custom_import._BaseImporter web2py.gluon.custom_import._BaseImporter-class.html +web2py.gluon.custom_import._BaseImporter.begin web2py.gluon.custom_import._BaseImporter-class.html#begin +web2py.gluon.custom_import._BaseImporter.end web2py.gluon.custom_import._BaseImporter-class.html#end +web2py.gluon.custom_import._BaseImporter.__call__ web2py.gluon.custom_import._BaseImporter-class.html#__call__ +web2py.gluon.custom_import._DateTrackerImporter web2py.gluon.custom_import._DateTrackerImporter-class.html +web2py.gluon.custom_import._DateTrackerImporter._get_module_file web2py.gluon.custom_import._DateTrackerImporter-class.html#_get_module_file +web2py.gluon.custom_import._DateTrackerImporter.begin web2py.gluon.custom_import._DateTrackerImporter-class.html#begin +web2py.gluon.custom_import._DateTrackerImporter.end web2py.gluon.custom_import._DateTrackerImporter-class.html#end +web2py.gluon.custom_import._DateTrackerImporter._update_dates web2py.gluon.custom_import._DateTrackerImporter-class.html#_update_dates +web2py.gluon.custom_import._DateTrackerImporter._PACKAGE_PATH_SUFFIX web2py.gluon.custom_import._DateTrackerImporter-class.html#_PACKAGE_PATH_SUFFIX +web2py.gluon.custom_import._DateTrackerImporter.__call__ web2py.gluon.custom_import._DateTrackerImporter-class.html#__call__ +web2py.gluon.custom_import._DateTrackerImporter._reload_check web2py.gluon.custom_import._DateTrackerImporter-class.html#_reload_check +web2py.gluon.custom_import._DateTrackerImporter.__init__ web2py.gluon.custom_import._DateTrackerImporter-class.html#__init__ +web2py.gluon.custom_import._Web2pyDateTrackerImporter web2py.gluon.custom_import._Web2pyDateTrackerImporter-class.html +web2py.gluon.custom_import._Web2pyImporter._matchAppDir web2py.gluon.custom_import._Web2pyImporter-class.html#_matchAppDir +web2py.gluon.custom_import._Web2pyImporter._Web2pyImporter__import__dot web2py.gluon.custom_import._Web2pyImporter-class.html#_Web2pyImporter__import__dot +web2py.gluon.custom_import._DateTrackerImporter.begin web2py.gluon.custom_import._DateTrackerImporter-class.html#begin +web2py.gluon.custom_import._DateTrackerImporter.end web2py.gluon.custom_import._DateTrackerImporter-class.html#end +web2py.gluon.custom_import._DateTrackerImporter._get_module_file web2py.gluon.custom_import._DateTrackerImporter-class.html#_get_module_file +web2py.gluon.custom_import._DateTrackerImporter._update_dates web2py.gluon.custom_import._DateTrackerImporter-class.html#_update_dates +web2py.gluon.custom_import._DateTrackerImporter._PACKAGE_PATH_SUFFIX web2py.gluon.custom_import._DateTrackerImporter-class.html#_PACKAGE_PATH_SUFFIX +web2py.gluon.custom_import._Web2pyImporter._RE_ESCAPED_PATH_SEP web2py.gluon.custom_import._Web2pyImporter-class.html#_RE_ESCAPED_PATH_SEP +web2py.gluon.custom_import._Web2pyImporter.__call__ web2py.gluon.custom_import._Web2pyImporter-class.html#__call__ +web2py.gluon.custom_import._DateTrackerImporter._reload_check web2py.gluon.custom_import._DateTrackerImporter-class.html#_reload_check +web2py.gluon.custom_import._Web2pyImporter.__init__ web2py.gluon.custom_import._Web2pyImporter-class.html#__init__ +web2py.gluon.custom_import._Web2pyImporter web2py.gluon.custom_import._Web2pyImporter-class.html +web2py.gluon.custom_import._Web2pyImporter._matchAppDir web2py.gluon.custom_import._Web2pyImporter-class.html#_matchAppDir +web2py.gluon.custom_import._Web2pyImporter._Web2pyImporter__import__dot web2py.gluon.custom_import._Web2pyImporter-class.html#_Web2pyImporter__import__dot +web2py.gluon.custom_import._BaseImporter.begin web2py.gluon.custom_import._BaseImporter-class.html#begin +web2py.gluon.custom_import._BaseImporter.end web2py.gluon.custom_import._BaseImporter-class.html#end +web2py.gluon.custom_import._Web2pyImporter.__import__dot web2py.gluon.custom_import._Web2pyImporter-class.html#__import__dot +web2py.gluon.custom_import._Web2pyImporter._RE_ESCAPED_PATH_SEP web2py.gluon.custom_import._Web2pyImporter-class.html#_RE_ESCAPED_PATH_SEP +web2py.gluon.custom_import._Web2pyImporter.__call__ web2py.gluon.custom_import._Web2pyImporter-class.html#__call__ +web2py.gluon.custom_import._Web2pyImporter.__init__ web2py.gluon.custom_import._Web2pyImporter-class.html#__init__ +web2py.gluon.dal.BaseAdapter web2py.gluon.dal.BaseAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.BaseAdapter.__init__ web2py.gluon.dal.BaseAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.RANDOM web2py.gluon.dal.BaseAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.BaseAdapter.driver web2py.gluon.dal.BaseAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.types web2py.gluon.dal.BaseAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.BaseAdapter.lastrowid web2py.gluon.dal.BaseAdapter-class.html#lastrowid +web2py.gluon.dal.ConnectionPool web2py.gluon.dal.ConnectionPool-class.html +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.CouchDBAdapter web2py.gluon.dal.CouchDBAdapter-class.html +web2py.gluon.dal.CouchDBAdapter.represent web2py.gluon.dal.CouchDBAdapter-class.html#represent +web2py.gluon.dal.NoSQLAdapter.log_execute web2py.gluon.dal.NoSQLAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.NoSQLAdapter.SUB web2py.gluon.dal.NoSQLAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.NoSQLAdapter.LEFT_JOIN web2py.gluon.dal.NoSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.NoSQLAdapter.distributed_transaction_begin web2py.gluon.dal.NoSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.NoSQLAdapter.rollback web2py.gluon.dal.NoSQLAdapter-class.html#rollback +web2py.gluon.dal.NoSQLAdapter.ON web2py.gluon.dal.NoSQLAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.NoSQLAdapter.integrity_error_class web2py.gluon.dal.NoSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.CouchDBAdapter._select web2py.gluon.dal.CouchDBAdapter-class.html#_select +web2py.gluon.dal.CouchDBAdapter.insert web2py.gluon.dal.CouchDBAdapter-class.html#insert +web2py.gluon.dal.NoSQLAdapter.execute web2py.gluon.dal.NoSQLAdapter-class.html#execute +web2py.gluon.dal.NoSQLAdapter.drop web2py.gluon.dal.NoSQLAdapter-class.html#drop +web2py.gluon.dal.NoSQLAdapter.migrate_table web2py.gluon.dal.NoSQLAdapter-class.html#migrate_table +web2py.gluon.dal.NoSQLAdapter.concat_add web2py.gluon.dal.NoSQLAdapter-class.html#concat_add +web2py.gluon.dal.NoSQLAdapter._insert web2py.gluon.dal.NoSQLAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.CouchDBAdapter.OR web2py.gluon.dal.CouchDBAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.NoSQLAdapter.close web2py.gluon.dal.NoSQLAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.NoSQLAdapter.rowslice web2py.gluon.dal.NoSQLAdapter-class.html#rowslice +web2py.gluon.dal.NoSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.NoSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.NoSQLAdapter.rollback_prepared web2py.gluon.dal.NoSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.NoSQLAdapter.commit_prepared web2py.gluon.dal.NoSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.CouchDBAdapter.EQ web2py.gluon.dal.CouchDBAdapter-class.html#EQ +web2py.gluon.dal.CouchDBAdapter.AND web2py.gluon.dal.CouchDBAdapter-class.html#AND +web2py.gluon.dal.CouchDBAdapter.uploads_in_blob web2py.gluon.dal.CouchDBAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.NoSQLAdapter.commit web2py.gluon.dal.NoSQLAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.NoSQLAdapter.STARTSWITH web2py.gluon.dal.NoSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.NoSQLAdapter.to_unicode web2py.gluon.dal.NoSQLAdapter-class.html#to_unicode +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.NoSQLAdapter._delete web2py.gluon.dal.NoSQLAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.NoSQLAdapter.MUL web2py.gluon.dal.NoSQLAdapter-class.html#MUL +web2py.gluon.dal.CouchDBAdapter.select web2py.gluon.dal.CouchDBAdapter-class.html#select +web2py.gluon.dal.NoSQLAdapter.PRIMARY_KEY web2py.gluon.dal.NoSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.NoSQLAdapter.prepare web2py.gluon.dal.NoSQLAdapter-class.html#prepare +web2py.gluon.dal.CouchDBAdapter.NE web2py.gluon.dal.CouchDBAdapter-class.html#NE +web2py.gluon.dal.NoSQLAdapter.SUBSTRING web2py.gluon.dal.NoSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.CouchDBAdapter.expand web2py.gluon.dal.CouchDBAdapter-class.html#expand +web2py.gluon.dal.NoSQLAdapter.EXTRACT web2py.gluon.dal.NoSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.NoSQLAdapter.represent_exceptions web2py.gluon.dal.NoSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.NoSQLAdapter.ADD web2py.gluon.dal.NoSQLAdapter-class.html#ADD +web2py.gluon.dal.CouchDBAdapter.count web2py.gluon.dal.CouchDBAdapter-class.html#count +web2py.gluon.dal.NoSQLAdapter.UPPER web2py.gluon.dal.NoSQLAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.NoSQLAdapter.LIKE web2py.gluon.dal.NoSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.CouchDBAdapter.file_exists web2py.gluon.dal.CouchDBAdapter-class.html#file_exists +web2py.gluon.dal.CouchDBAdapter.delete web2py.gluon.dal.CouchDBAdapter-class.html#delete +web2py.gluon.dal.NoSQLAdapter.LOWER web2py.gluon.dal.NoSQLAdapter-class.html#LOWER +web2py.gluon.dal.NoSQLAdapter._update web2py.gluon.dal.NoSQLAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.NoSQLAdapter.ENDSWITH web2py.gluon.dal.NoSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.NoSQLAdapter.constraint_name web2py.gluon.dal.NoSQLAdapter-class.html#constraint_name +web2py.gluon.dal.NoSQLAdapter.DIV web2py.gluon.dal.NoSQLAdapter-class.html#DIV +web2py.gluon.dal.CouchDBAdapter.__init__ web2py.gluon.dal.CouchDBAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.CouchDBAdapter.file_open web2py.gluon.dal.CouchDBAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.CouchDBAdapter.COMMA web2py.gluon.dal.CouchDBAdapter-class.html#COMMA +web2py.gluon.dal.CouchDBAdapter.create_table web2py.gluon.dal.CouchDBAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.NoSQLAdapter.AGGREGATE web2py.gluon.dal.NoSQLAdapter-class.html#AGGREGATE +web2py.gluon.dal.CouchDBAdapter.file_close web2py.gluon.dal.CouchDBAdapter-class.html#file_close +web2py.gluon.dal.NoSQLAdapter.RANDOM web2py.gluon.dal.NoSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.BaseAdapter.driver web2py.gluon.dal.BaseAdapter-class.html#driver +web2py.gluon.dal.CouchDBAdapter.update web2py.gluon.dal.CouchDBAdapter-class.html#update +web2py.gluon.dal.NoSQLAdapter.AS web2py.gluon.dal.NoSQLAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.CouchDBAdapter.types web2py.gluon.dal.CouchDBAdapter-class.html#types +web2py.gluon.dal.NoSQLAdapter._count web2py.gluon.dal.NoSQLAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.NoSQLAdapter.alias web2py.gluon.dal.NoSQLAdapter-class.html#alias +web2py.gluon.dal.NoSQLAdapter.lastrowid web2py.gluon.dal.NoSQLAdapter-class.html#lastrowid +web2py.gluon.dal.CubridAdapter web2py.gluon.dal.CubridAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.MySQLAdapter.distributed_transaction_begin web2py.gluon.dal.MySQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.MySQLAdapter.maxcharlength web2py.gluon.dal.MySQLAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.MySQLAdapter._drop web2py.gluon.dal.MySQLAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.MySQLAdapter.concat_add web2py.gluon.dal.MySQLAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.MySQLAdapter.support_distributed_transaction web2py.gluon.dal.MySQLAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.MySQLAdapter.rollback_prepared web2py.gluon.dal.MySQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.MySQLAdapter.commit_prepared web2py.gluon.dal.MySQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.MySQLAdapter.prepare web2py.gluon.dal.MySQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.MySQLAdapter.SUBSTRING web2py.gluon.dal.MySQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.MySQLAdapter.commit_on_alter_table web2py.gluon.dal.MySQLAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.CubridAdapter.__init__ web2py.gluon.dal.CubridAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.MySQLAdapter.RANDOM web2py.gluon.dal.MySQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.CubridAdapter.driver web2py.gluon.dal.CubridAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.MySQLAdapter.types web2py.gluon.dal.MySQLAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.MySQLAdapter.lastrowid web2py.gluon.dal.MySQLAdapter-class.html#lastrowid +web2py.gluon.dal.DAL web2py.gluon.dal.DAL-class.html +web2py.gluon.dal.DAL.Field web2py.gluon.dal.Field-class.html +web2py.gluon.dal.DAL.set_folder web2py.gluon.dal.DAL-class.html#set_folder +web2py.gluon.dal.DAL.__init__ web2py.gluon.dal.DAL-class.html#__init__ +web2py.gluon.dal.DAL.import_from_csv_file web2py.gluon.dal.DAL-class.html#import_from_csv_file +web2py.gluon.dal.DAL.__setattr__ web2py.gluon.dal.DAL-class.html#__setattr__ +web2py.gluon.dal.DAL._update_referenced_by web2py.gluon.dal.DAL-class.html#_update_referenced_by +web2py.gluon.dal.DAL.parse_as_rest web2py.gluon.dal.DAL-class.html#parse_as_rest +web2py.gluon.dal.DAL.export_to_csv_file web2py.gluon.dal.DAL-class.html#export_to_csv_file +web2py.gluon.dal.DAL.define_table web2py.gluon.dal.DAL-class.html#define_table +web2py.gluon.dal.DAL.__getattr__ web2py.gluon.dal.DAL-class.html#__getattr__ +web2py.gluon.dal.DAL.__call__ web2py.gluon.dal.DAL-class.html#__call__ +web2py.gluon.dal.DAL.import_table_definitions web2py.gluon.dal.DAL-class.html#import_table_definitions +web2py.gluon.dal.DAL.distributed_transaction_begin web2py.gluon.dal.DAL-class.html#distributed_transaction_begin +web2py.gluon.dal.DAL.rollback web2py.gluon.dal.DAL-class.html#rollback +web2py.gluon.dal.DAL.__getitem__ web2py.gluon.dal.DAL-class.html#__getitem__ +web2py.gluon.dal.DAL.executesql web2py.gluon.dal.DAL-class.html#executesql +web2py.gluon.dal.DAL.distributed_transaction_commit web2py.gluon.dal.DAL-class.html#distributed_transaction_commit +web2py.gluon.dal.DAL.check_reserved_keyword web2py.gluon.dal.DAL-class.html#check_reserved_keyword +web2py.gluon.dal.DAL.__setitem__ web2py.gluon.dal.DAL-class.html#__setitem__ +web2py.gluon.dal.DAL.commit web2py.gluon.dal.DAL-class.html#commit +web2py.gluon.dal.DAL.__contains__ web2py.gluon.dal.DAL-class.html#__contains__ +web2py.gluon.dal.DAL.__iter__ web2py.gluon.dal.DAL-class.html#__iter__ +web2py.gluon.dal.DAL.__repr__ web2py.gluon.dal.DAL-class.html#__repr__ +web2py.gluon.dal.DAL.Table web2py.gluon.dal.Table-class.html +web2py.gluon.dal.DB2Adapter web2py.gluon.dal.DB2Adapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.DB2Adapter.select_limitby web2py.gluon.dal.DB2Adapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.DB2Adapter.LEFT_JOIN web2py.gluon.dal.DB2Adapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.DB2Adapter.execute web2py.gluon.dal.DB2Adapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.DB2Adapter.rowslice web2py.gluon.dal.DB2Adapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.DB2Adapter.types web2py.gluon.dal.DB2Adapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.DB2Adapter.represent_exceptions web2py.gluon.dal.DB2Adapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.DB2Adapter.__init__ web2py.gluon.dal.DB2Adapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.DB2Adapter.RANDOM web2py.gluon.dal.DB2Adapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.DB2Adapter.driver web2py.gluon.dal.DB2Adapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.DB2Adapter.lastrowid web2py.gluon.dal.DB2Adapter-class.html#lastrowid +web2py.gluon.dal.DatabaseStoredFile web2py.gluon.dal.DatabaseStoredFile-class.html +web2py.gluon.dal.DatabaseStoredFile.exists web2py.gluon.dal.DatabaseStoredFile-class.html#exists +web2py.gluon.dal.DatabaseStoredFile.read web2py.gluon.dal.DatabaseStoredFile-class.html#read +web2py.gluon.dal.DatabaseStoredFile.write web2py.gluon.dal.DatabaseStoredFile-class.html#write +web2py.gluon.dal.DatabaseStoredFile.web2py_filesystem web2py.gluon.dal.DatabaseStoredFile-class.html#web2py_filesystem +web2py.gluon.dal.DatabaseStoredFile.close web2py.gluon.dal.DatabaseStoredFile-class.html#close +web2py.gluon.dal.DatabaseStoredFile.readline web2py.gluon.dal.DatabaseStoredFile-class.html#readline +web2py.gluon.dal.DatabaseStoredFile.__init__ web2py.gluon.dal.DatabaseStoredFile-class.html#__init__ +web2py.gluon.dal.Expression web2py.gluon.dal.Expression-class.html +web2py.gluon.dal.Expression.upper web2py.gluon.dal.Expression-class.html#upper +web2py.gluon.dal.Expression.__getslice__ web2py.gluon.dal.Expression-class.html#__getslice__ +web2py.gluon.dal.Expression.coalesce_zero web2py.gluon.dal.Expression-class.html#coalesce_zero +web2py.gluon.dal.Expression.__str__ web2py.gluon.dal.Expression-class.html#__str__ +web2py.gluon.dal.Expression.month web2py.gluon.dal.Expression-class.html#month +web2py.gluon.dal.Expression.endswith web2py.gluon.dal.Expression-class.html#endswith +web2py.gluon.dal.Expression.year web2py.gluon.dal.Expression-class.html#year +web2py.gluon.dal.Expression.__lt__ web2py.gluon.dal.Expression-class.html#__lt__ +web2py.gluon.dal.Expression.__init__ web2py.gluon.dal.Expression-class.html#__init__ +web2py.gluon.dal.Expression.__invert__ web2py.gluon.dal.Expression-class.html#__invert__ +web2py.gluon.dal.Expression.min web2py.gluon.dal.Expression-class.html#min +web2py.gluon.dal.Expression.sum web2py.gluon.dal.Expression-class.html#sum +web2py.gluon.dal.Expression.contains web2py.gluon.dal.Expression-class.html#contains +web2py.gluon.dal.Expression.belongs web2py.gluon.dal.Expression-class.html#belongs +web2py.gluon.dal.Expression.with_alias web2py.gluon.dal.Expression-class.html#with_alias +web2py.gluon.dal.Expression.startswith web2py.gluon.dal.Expression-class.html#startswith +web2py.gluon.dal.Expression.__getitem__ web2py.gluon.dal.Expression-class.html#__getitem__ +web2py.gluon.dal.Expression.seconds web2py.gluon.dal.Expression-class.html#seconds +web2py.gluon.dal.Expression.max web2py.gluon.dal.Expression-class.html#max +web2py.gluon.dal.Expression.len web2py.gluon.dal.Expression-class.html#len +web2py.gluon.dal.Expression.__or__ web2py.gluon.dal.Expression-class.html#__or__ +web2py.gluon.dal.Expression.__add__ web2py.gluon.dal.Expression-class.html#__add__ +web2py.gluon.dal.Expression.__gt__ web2py.gluon.dal.Expression-class.html#__gt__ +web2py.gluon.dal.Expression.__ne__ web2py.gluon.dal.Expression-class.html#__ne__ +web2py.gluon.dal.Expression.__eq__ web2py.gluon.dal.Expression-class.html#__eq__ +web2py.gluon.dal.Expression.day web2py.gluon.dal.Expression-class.html#day +web2py.gluon.dal.Expression.lower web2py.gluon.dal.Expression-class.html#lower +web2py.gluon.dal.Expression.like web2py.gluon.dal.Expression-class.html#like +web2py.gluon.dal.Expression.hour web2py.gluon.dal.Expression-class.html#hour +web2py.gluon.dal.Expression.__mod__ web2py.gluon.dal.Expression-class.html#__mod__ +web2py.gluon.dal.Expression.__div__ web2py.gluon.dal.Expression-class.html#__div__ +web2py.gluon.dal.Expression.__le__ web2py.gluon.dal.Expression-class.html#__le__ +web2py.gluon.dal.Expression.__mul__ web2py.gluon.dal.Expression-class.html#__mul__ +web2py.gluon.dal.Expression.__sub__ web2py.gluon.dal.Expression-class.html#__sub__ +web2py.gluon.dal.Expression.minutes web2py.gluon.dal.Expression-class.html#minutes +web2py.gluon.dal.Expression.__ge__ web2py.gluon.dal.Expression-class.html#__ge__ +web2py.gluon.dal.Field web2py.gluon.dal.Field-class.html +web2py.gluon.dal.Expression.upper web2py.gluon.dal.Expression-class.html#upper +web2py.gluon.dal.Field.retrieve web2py.gluon.dal.Field-class.html#retrieve +web2py.gluon.dal.Expression.__getslice__ web2py.gluon.dal.Expression-class.html#__getslice__ +web2py.gluon.dal.Expression.coalesce_zero web2py.gluon.dal.Expression-class.html#coalesce_zero +web2py.gluon.dal.Field.__str__ web2py.gluon.dal.Field-class.html#__str__ +web2py.gluon.dal.Expression.month web2py.gluon.dal.Expression-class.html#month +web2py.gluon.dal.Expression.endswith web2py.gluon.dal.Expression-class.html#endswith +web2py.gluon.dal.Expression.year web2py.gluon.dal.Expression-class.html#year +web2py.gluon.dal.Expression.__lt__ web2py.gluon.dal.Expression-class.html#__lt__ +web2py.gluon.dal.Field.__init__ web2py.gluon.dal.Field-class.html#__init__ +web2py.gluon.dal.Expression.__getitem__ web2py.gluon.dal.Expression-class.html#__getitem__ +web2py.gluon.dal.Expression.min web2py.gluon.dal.Expression-class.html#min +web2py.gluon.dal.Expression.sum web2py.gluon.dal.Expression-class.html#sum +web2py.gluon.dal.Expression.contains web2py.gluon.dal.Expression-class.html#contains +web2py.gluon.dal.Expression.belongs web2py.gluon.dal.Expression-class.html#belongs +web2py.gluon.dal.Expression.with_alias web2py.gluon.dal.Expression-class.html#with_alias +web2py.gluon.dal.Field.formatter web2py.gluon.dal.Field-class.html#formatter +web2py.gluon.dal.Field.store web2py.gluon.dal.Field-class.html#store +web2py.gluon.dal.Expression.startswith web2py.gluon.dal.Expression-class.html#startswith +web2py.gluon.dal.Expression.__invert__ web2py.gluon.dal.Expression-class.html#__invert__ +web2py.gluon.dal.Expression.seconds web2py.gluon.dal.Expression-class.html#seconds +web2py.gluon.dal.Expression.max web2py.gluon.dal.Expression-class.html#max +web2py.gluon.dal.Expression.len web2py.gluon.dal.Expression-class.html#len +web2py.gluon.dal.Expression.__or__ web2py.gluon.dal.Expression-class.html#__or__ +web2py.gluon.dal.Expression.__add__ web2py.gluon.dal.Expression-class.html#__add__ +web2py.gluon.dal.Expression.__gt__ web2py.gluon.dal.Expression-class.html#__gt__ +web2py.gluon.dal.Field.validate web2py.gluon.dal.Field-class.html#validate +web2py.gluon.dal.Expression.__eq__ web2py.gluon.dal.Expression-class.html#__eq__ +web2py.gluon.dal.Expression.day web2py.gluon.dal.Expression-class.html#day +web2py.gluon.dal.Field.count web2py.gluon.dal.Field-class.html#count +web2py.gluon.dal.Expression.lower web2py.gluon.dal.Expression-class.html#lower +web2py.gluon.dal.Expression.__ne__ web2py.gluon.dal.Expression-class.html#__ne__ +web2py.gluon.dal.Field.__nonzero__ web2py.gluon.dal.Field-class.html#__nonzero__ +web2py.gluon.dal.Expression.like web2py.gluon.dal.Expression-class.html#like +web2py.gluon.dal.Expression.hour web2py.gluon.dal.Expression-class.html#hour +web2py.gluon.dal.Expression.__mod__ web2py.gluon.dal.Expression-class.html#__mod__ +web2py.gluon.dal.Expression.__div__ web2py.gluon.dal.Expression-class.html#__div__ +web2py.gluon.dal.Expression.__le__ web2py.gluon.dal.Expression-class.html#__le__ +web2py.gluon.dal.Expression.__mul__ web2py.gluon.dal.Expression-class.html#__mul__ +web2py.gluon.dal.Expression.__sub__ web2py.gluon.dal.Expression-class.html#__sub__ +web2py.gluon.dal.Expression.minutes web2py.gluon.dal.Expression-class.html#minutes +web2py.gluon.dal.Expression.__ge__ web2py.gluon.dal.Expression-class.html#__ge__ +web2py.gluon.dal.FireBirdAdapter web2py.gluon.dal.FireBirdAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.FireBirdAdapter.select_limitby web2py.gluon.dal.FireBirdAdapter-class.html#select_limitby +web2py.gluon.dal.FireBirdAdapter._truncate web2py.gluon.dal.FireBirdAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.FireBirdAdapter._drop web2py.gluon.dal.FireBirdAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.FireBirdAdapter.support_distributed_transaction web2py.gluon.dal.FireBirdAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.FireBirdAdapter.NOT_NULL web2py.gluon.dal.FireBirdAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.FireBirdAdapter.create_sequence_and_triggers web2py.gluon.dal.FireBirdAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.FireBirdAdapter.SUBSTRING web2py.gluon.dal.FireBirdAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.FireBirdAdapter.commit_on_alter_table web2py.gluon.dal.FireBirdAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.FireBirdAdapter.sequence_name web2py.gluon.dal.FireBirdAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.FireBirdAdapter.__init__ web2py.gluon.dal.FireBirdAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.FireBirdAdapter.RANDOM web2py.gluon.dal.FireBirdAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.FireBirdAdapter.driver web2py.gluon.dal.FireBirdAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.FireBirdAdapter.trigger_name web2py.gluon.dal.FireBirdAdapter-class.html#trigger_name +web2py.gluon.dal.FireBirdAdapter.types web2py.gluon.dal.FireBirdAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.FireBirdAdapter.lastrowid web2py.gluon.dal.FireBirdAdapter-class.html#lastrowid +web2py.gluon.dal.FireBirdEmbeddedAdapter web2py.gluon.dal.FireBirdEmbeddedAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.FireBirdAdapter.select_limitby web2py.gluon.dal.FireBirdAdapter-class.html#select_limitby +web2py.gluon.dal.FireBirdAdapter._truncate web2py.gluon.dal.FireBirdAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.FireBirdAdapter._drop web2py.gluon.dal.FireBirdAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.FireBirdAdapter.support_distributed_transaction web2py.gluon.dal.FireBirdAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.FireBirdAdapter.NOT_NULL web2py.gluon.dal.FireBirdAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.FireBirdAdapter.create_sequence_and_triggers web2py.gluon.dal.FireBirdAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.FireBirdAdapter.SUBSTRING web2py.gluon.dal.FireBirdAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.FireBirdAdapter.commit_on_alter_table web2py.gluon.dal.FireBirdAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.FireBirdAdapter.sequence_name web2py.gluon.dal.FireBirdAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.FireBirdEmbeddedAdapter.__init__ web2py.gluon.dal.FireBirdEmbeddedAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.FireBirdAdapter.RANDOM web2py.gluon.dal.FireBirdAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.FireBirdAdapter.driver web2py.gluon.dal.FireBirdAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.FireBirdAdapter.trigger_name web2py.gluon.dal.FireBirdAdapter-class.html#trigger_name +web2py.gluon.dal.FireBirdAdapter.types web2py.gluon.dal.FireBirdAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.FireBirdAdapter.lastrowid web2py.gluon.dal.FireBirdAdapter-class.html#lastrowid +web2py.gluon.dal.GAEDecimalProperty web2py.gluon.dal.GAEDecimalProperty-class.html +web2py.gluon.dal.GAEDecimalProperty.make_value_from_datastore web2py.gluon.dal.GAEDecimalProperty-class.html#make_value_from_datastore +web2py.gluon.dal.GAEDecimalProperty.validate web2py.gluon.dal.GAEDecimalProperty-class.html#validate +web2py.gluon.dal.GAEDecimalProperty.get_value_for_datastore web2py.gluon.dal.GAEDecimalProperty-class.html#get_value_for_datastore +web2py.gluon.dal.GAEDecimalProperty.__init__ web2py.gluon.dal.GAEDecimalProperty-class.html#__init__ +web2py.gluon.dal.GAEDecimalProperty.data_type web2py.gluon.dal.GAEDecimalProperty-class.html#data_type +web2py.gluon.dal.GAEF web2py.gluon.dal.GAEF-class.html +web2py.gluon.dal.GAEF.__repr__ web2py.gluon.dal.GAEF-class.html#__repr__ +web2py.gluon.dal.GAEF.__init__ web2py.gluon.dal.GAEF-class.html#__init__ +web2py.gluon.dal.GoogleDatastoreAdapter web2py.gluon.dal.GoogleDatastoreAdapter-class.html +web2py.gluon.dal.NoSQLAdapter.represent web2py.gluon.dal.NoSQLAdapter-class.html#represent +web2py.gluon.dal.NoSQLAdapter.log_execute web2py.gluon.dal.NoSQLAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.NoSQLAdapter.SUB web2py.gluon.dal.NoSQLAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.NoSQLAdapter.LEFT_JOIN web2py.gluon.dal.NoSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.NoSQLAdapter.distributed_transaction_begin web2py.gluon.dal.NoSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.GoogleDatastoreAdapter.GT web2py.gluon.dal.GoogleDatastoreAdapter-class.html#GT +web2py.gluon.dal.NoSQLAdapter.rollback web2py.gluon.dal.NoSQLAdapter-class.html#rollback +web2py.gluon.dal.NoSQLAdapter.ON web2py.gluon.dal.NoSQLAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.GoogleDatastoreAdapter.GE web2py.gluon.dal.GoogleDatastoreAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.NoSQLAdapter.integrity_error_class web2py.gluon.dal.NoSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.NoSQLAdapter._select web2py.gluon.dal.NoSQLAdapter-class.html#_select +web2py.gluon.dal.GoogleDatastoreAdapter.insert web2py.gluon.dal.GoogleDatastoreAdapter-class.html#insert +web2py.gluon.dal.NoSQLAdapter.execute web2py.gluon.dal.NoSQLAdapter-class.html#execute +web2py.gluon.dal.NoSQLAdapter.drop web2py.gluon.dal.NoSQLAdapter-class.html#drop +web2py.gluon.dal.NoSQLAdapter.migrate_table web2py.gluon.dal.NoSQLAdapter-class.html#migrate_table +web2py.gluon.dal.NoSQLAdapter.concat_add web2py.gluon.dal.NoSQLAdapter-class.html#concat_add +web2py.gluon.dal.NoSQLAdapter._insert web2py.gluon.dal.NoSQLAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.NoSQLAdapter.OR web2py.gluon.dal.NoSQLAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.NoSQLAdapter.close web2py.gluon.dal.NoSQLAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.NoSQLAdapter.rowslice web2py.gluon.dal.NoSQLAdapter-class.html#rowslice +web2py.gluon.dal.NoSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.NoSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.NoSQLAdapter.rollback_prepared web2py.gluon.dal.NoSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.NoSQLAdapter.commit_prepared web2py.gluon.dal.NoSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.GoogleDatastoreAdapter.EQ web2py.gluon.dal.GoogleDatastoreAdapter-class.html#EQ +web2py.gluon.dal.GoogleDatastoreAdapter.AND web2py.gluon.dal.GoogleDatastoreAdapter-class.html#AND +web2py.gluon.dal.GoogleDatastoreAdapter.uploads_in_blob web2py.gluon.dal.GoogleDatastoreAdapter-class.html#uploads_in_blob +web2py.gluon.dal.GoogleDatastoreAdapter.NOT web2py.gluon.dal.GoogleDatastoreAdapter-class.html#NOT +web2py.gluon.dal.NoSQLAdapter.commit web2py.gluon.dal.NoSQLAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.NoSQLAdapter.STARTSWITH web2py.gluon.dal.NoSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.NoSQLAdapter.to_unicode web2py.gluon.dal.NoSQLAdapter-class.html#to_unicode +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.NoSQLAdapter._delete web2py.gluon.dal.NoSQLAdapter-class.html#_delete +web2py.gluon.dal.GoogleDatastoreAdapter.BELONGS web2py.gluon.dal.GoogleDatastoreAdapter-class.html#BELONGS +web2py.gluon.dal.NoSQLAdapter.MUL web2py.gluon.dal.NoSQLAdapter-class.html#MUL +web2py.gluon.dal.GoogleDatastoreAdapter.select web2py.gluon.dal.GoogleDatastoreAdapter-class.html#select +web2py.gluon.dal.NoSQLAdapter.PRIMARY_KEY web2py.gluon.dal.NoSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.NoSQLAdapter.prepare web2py.gluon.dal.NoSQLAdapter-class.html#prepare +web2py.gluon.dal.GoogleDatastoreAdapter.NE web2py.gluon.dal.GoogleDatastoreAdapter-class.html#NE +web2py.gluon.dal.NoSQLAdapter.SUBSTRING web2py.gluon.dal.NoSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.GoogleDatastoreAdapter.types web2py.gluon.dal.GoogleDatastoreAdapter-class.html#types +web2py.gluon.dal.NoSQLAdapter.EXTRACT web2py.gluon.dal.NoSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.NoSQLAdapter.represent_exceptions web2py.gluon.dal.NoSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.NoSQLAdapter.ADD web2py.gluon.dal.NoSQLAdapter-class.html#ADD +web2py.gluon.dal.GoogleDatastoreAdapter.count web2py.gluon.dal.GoogleDatastoreAdapter-class.html#count +web2py.gluon.dal.NoSQLAdapter.UPPER web2py.gluon.dal.NoSQLAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.NoSQLAdapter.LIKE web2py.gluon.dal.NoSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.GoogleDatastoreAdapter.file_exists web2py.gluon.dal.GoogleDatastoreAdapter-class.html#file_exists +web2py.gluon.dal.GoogleDatastoreAdapter.delete web2py.gluon.dal.GoogleDatastoreAdapter-class.html#delete +web2py.gluon.dal.NoSQLAdapter.LOWER web2py.gluon.dal.NoSQLAdapter-class.html#LOWER +web2py.gluon.dal.NoSQLAdapter._update web2py.gluon.dal.NoSQLAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.NoSQLAdapter.ENDSWITH web2py.gluon.dal.NoSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.NoSQLAdapter.constraint_name web2py.gluon.dal.NoSQLAdapter-class.html#constraint_name +web2py.gluon.dal.NoSQLAdapter.DIV web2py.gluon.dal.NoSQLAdapter-class.html#DIV +web2py.gluon.dal.GoogleDatastoreAdapter.__init__ web2py.gluon.dal.GoogleDatastoreAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.GoogleDatastoreAdapter.LE web2py.gluon.dal.GoogleDatastoreAdapter-class.html#LE +web2py.gluon.dal.GoogleDatastoreAdapter.file_open web2py.gluon.dal.GoogleDatastoreAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.GoogleDatastoreAdapter.select_raw web2py.gluon.dal.GoogleDatastoreAdapter-class.html#select_raw +web2py.gluon.dal.GoogleDatastoreAdapter.LT web2py.gluon.dal.GoogleDatastoreAdapter-class.html#LT +web2py.gluon.dal.GoogleDatastoreAdapter.COMMA web2py.gluon.dal.GoogleDatastoreAdapter-class.html#COMMA +web2py.gluon.dal.GoogleDatastoreAdapter.create_table web2py.gluon.dal.GoogleDatastoreAdapter-class.html#create_table +web2py.gluon.dal.GoogleDatastoreAdapter.bulk_insert web2py.gluon.dal.GoogleDatastoreAdapter-class.html#bulk_insert +web2py.gluon.dal.NoSQLAdapter.AGGREGATE web2py.gluon.dal.NoSQLAdapter-class.html#AGGREGATE +web2py.gluon.dal.GoogleDatastoreAdapter.file_close web2py.gluon.dal.GoogleDatastoreAdapter-class.html#file_close +web2py.gluon.dal.NoSQLAdapter.RANDOM web2py.gluon.dal.NoSQLAdapter-class.html#RANDOM +web2py.gluon.dal.GoogleDatastoreAdapter.truncate web2py.gluon.dal.GoogleDatastoreAdapter-class.html#truncate +web2py.gluon.dal.BaseAdapter.driver web2py.gluon.dal.BaseAdapter-class.html#driver +web2py.gluon.dal.GoogleDatastoreAdapter.update web2py.gluon.dal.GoogleDatastoreAdapter-class.html#update +web2py.gluon.dal.NoSQLAdapter.AS web2py.gluon.dal.NoSQLAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.GoogleDatastoreAdapter.expand web2py.gluon.dal.GoogleDatastoreAdapter-class.html#expand +web2py.gluon.dal.NoSQLAdapter._count web2py.gluon.dal.NoSQLAdapter-class.html#_count +web2py.gluon.dal.GoogleDatastoreAdapter.CONTAINS web2py.gluon.dal.GoogleDatastoreAdapter-class.html#CONTAINS +web2py.gluon.dal.GoogleDatastoreAdapter.INVERT web2py.gluon.dal.GoogleDatastoreAdapter-class.html#INVERT +web2py.gluon.dal.NoSQLAdapter.alias web2py.gluon.dal.NoSQLAdapter-class.html#alias +web2py.gluon.dal.NoSQLAdapter.lastrowid web2py.gluon.dal.NoSQLAdapter-class.html#lastrowid +web2py.gluon.dal.GoogleSQLAdapter web2py.gluon.dal.GoogleSQLAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.MySQLAdapter.distributed_transaction_begin web2py.gluon.dal.MySQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.MySQLAdapter.maxcharlength web2py.gluon.dal.MySQLAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.MySQLAdapter._drop web2py.gluon.dal.MySQLAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.MySQLAdapter.concat_add web2py.gluon.dal.MySQLAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.MySQLAdapter.support_distributed_transaction web2py.gluon.dal.MySQLAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.UseDatabaseStoredFile.file_delete web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.MySQLAdapter.rollback_prepared web2py.gluon.dal.MySQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.MySQLAdapter.commit_prepared web2py.gluon.dal.MySQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.MySQLAdapter.prepare web2py.gluon.dal.MySQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.MySQLAdapter.SUBSTRING web2py.gluon.dal.MySQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.MySQLAdapter.commit_on_alter_table web2py.gluon.dal.MySQLAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.UseDatabaseStoredFile.file_exists web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.GoogleSQLAdapter.__init__ web2py.gluon.dal.GoogleSQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.UseDatabaseStoredFile.file_open web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.UseDatabaseStoredFile.file_close web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_close +web2py.gluon.dal.MySQLAdapter.RANDOM web2py.gluon.dal.MySQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.MySQLAdapter.driver web2py.gluon.contrib.pymysql-module.html +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.MySQLAdapter.types web2py.gluon.dal.MySQLAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.MySQLAdapter.lastrowid web2py.gluon.dal.MySQLAdapter-class.html#lastrowid +web2py.gluon.dal.InformixAdapter web2py.gluon.dal.InformixAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.InformixAdapter.select_limitby web2py.gluon.dal.InformixAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.InformixAdapter.integrity_error_class web2py.gluon.dal.InformixAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.InformixAdapter.execute web2py.gluon.dal.InformixAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.InformixAdapter.NOT_NULL web2py.gluon.dal.InformixAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.InformixAdapter.types web2py.gluon.dal.InformixAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.InformixAdapter.represent_exceptions web2py.gluon.dal.InformixAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.InformixAdapter.__init__ web2py.gluon.dal.InformixAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.InformixAdapter.RANDOM web2py.gluon.dal.InformixAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.InformixAdapter.driver web2py.gluon.dal.InformixAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.InformixAdapter.lastrowid web2py.gluon.dal.InformixAdapter-class.html#lastrowid +web2py.gluon.dal.IngresAdapter web2py.gluon.dal.IngresAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.IngresAdapter.select_limitby web2py.gluon.dal.IngresAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.IngresAdapter.LEFT_JOIN web2py.gluon.dal.IngresAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.IngresAdapter.RANDOM web2py.gluon.dal.IngresAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.IngresAdapter.integrity_error_class web2py.gluon.dal.IngresAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.IngresAdapter.create_sequence_and_triggers web2py.gluon.dal.IngresAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.IngresAdapter.types web2py.gluon.dal.IngresAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.IngresAdapter.__init__ web2py.gluon.dal.IngresAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.IngresAdapter.driver web2py.gluon.dal.IngresAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.IngresAdapter.lastrowid web2py.gluon.dal.IngresAdapter-class.html#lastrowid +web2py.gluon.dal.IngresUnicodeAdapter web2py.gluon.dal.IngresUnicodeAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.IngresAdapter.select_limitby web2py.gluon.dal.IngresAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.IngresAdapter.LEFT_JOIN web2py.gluon.dal.IngresAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.IngresAdapter.RANDOM web2py.gluon.dal.IngresAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.IngresAdapter.integrity_error_class web2py.gluon.dal.IngresAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.IngresAdapter.create_sequence_and_triggers web2py.gluon.dal.IngresAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.IngresUnicodeAdapter.types web2py.gluon.dal.IngresUnicodeAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.IngresAdapter.__init__ web2py.gluon.dal.IngresAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.IngresAdapter.driver web2py.gluon.dal.IngresAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.IngresAdapter.lastrowid web2py.gluon.dal.IngresAdapter-class.html#lastrowid +web2py.gluon.dal.JDBCPostgreSQLAdapter web2py.gluon.dal.JDBCPostgreSQLAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.PostgreSQLAdapter.distributed_transaction_begin web2py.gluon.dal.PostgreSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.PostgreSQLAdapter.support_distributed_transaction web2py.gluon.dal.PostgreSQLAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.PostgreSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.PostgreSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.PostgreSQLAdapter.rollback_prepared web2py.gluon.dal.PostgreSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.PostgreSQLAdapter.commit_prepared web2py.gluon.dal.PostgreSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.PostgreSQLAdapter.STARTSWITH web2py.gluon.dal.PostgreSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.PostgreSQLAdapter.prepare web2py.gluon.dal.PostgreSQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.PostgreSQLAdapter.types web2py.gluon.dal.PostgreSQLAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.PostgreSQLAdapter.sequence_name web2py.gluon.dal.PostgreSQLAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.PostgreSQLAdapter.LIKE web2py.gluon.dal.PostgreSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.PostgreSQLAdapter.ENDSWITH web2py.gluon.dal.PostgreSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.JDBCPostgreSQLAdapter.__init__ web2py.gluon.dal.JDBCPostgreSQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.PostgreSQLAdapter.RANDOM web2py.gluon.dal.PostgreSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.PostgreSQLAdapter.driver psycopg2-module.html +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.PostgreSQLAdapter.CONTAINS web2py.gluon.dal.PostgreSQLAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.PostgreSQLAdapter.lastrowid web2py.gluon.dal.PostgreSQLAdapter-class.html#lastrowid +web2py.gluon.dal.JDBCSQLiteAdapter web2py.gluon.dal.JDBCSQLiteAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.SQLiteAdapter._truncate web2py.gluon.dal.SQLiteAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.JDBCSQLiteAdapter.execute web2py.gluon.dal.JDBCSQLiteAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.SQLiteAdapter.web2py_extract web2py.gluon.dal.SQLiteAdapter-class.html#web2py_extract +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.types web2py.gluon.dal.BaseAdapter-class.html#types +web2py.gluon.dal.SQLiteAdapter.EXTRACT web2py.gluon.dal.SQLiteAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.JDBCSQLiteAdapter.__init__ web2py.gluon.dal.JDBCSQLiteAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.RANDOM web2py.gluon.dal.BaseAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.JDBCSQLiteAdapter.driver web2py.gluon.dal.JDBCSQLiteAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.SQLiteAdapter.lastrowid web2py.gluon.dal.SQLiteAdapter-class.html#lastrowid +web2py.gluon.dal.MSSQL2Adapter web2py.gluon.dal.MSSQL2Adapter-class.html +web2py.gluon.dal.MSSQL2Adapter.represent web2py.gluon.dal.MSSQL2Adapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.MSSQLAdapter.select_limitby web2py.gluon.dal.MSSQLAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.MSSQLAdapter.LEFT_JOIN web2py.gluon.dal.MSSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.MSSQLAdapter.RANDOM web2py.gluon.dal.MSSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.MSSQLAdapter.integrity_error_class web2py.gluon.dal.MSSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.MSSQL2Adapter.execute web2py.gluon.dal.MSSQL2Adapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.MSSQLAdapter.rowslice web2py.gluon.dal.MSSQLAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.MSSQLAdapter.PRIMARY_KEY web2py.gluon.dal.MSSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.MSSQLAdapter.SUBSTRING web2py.gluon.dal.MSSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.MSSQL2Adapter.types web2py.gluon.dal.MSSQL2Adapter-class.html#types +web2py.gluon.dal.MSSQLAdapter.EXTRACT web2py.gluon.dal.MSSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.MSSQLAdapter.represent_exceptions web2py.gluon.dal.MSSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.MSSQLAdapter.__init__ web2py.gluon.dal.MSSQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.MSSQLAdapter.ALLOW_NULL web2py.gluon.dal.MSSQLAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.MSSQLAdapter.driver web2py.gluon.dal.MSSQLAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.MSSQLAdapter.lastrowid web2py.gluon.dal.MSSQLAdapter-class.html#lastrowid +web2py.gluon.dal.MSSQLAdapter web2py.gluon.dal.MSSQLAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.MSSQLAdapter.select_limitby web2py.gluon.dal.MSSQLAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.MSSQLAdapter.LEFT_JOIN web2py.gluon.dal.MSSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.MSSQLAdapter.RANDOM web2py.gluon.dal.MSSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.MSSQLAdapter.integrity_error_class web2py.gluon.dal.MSSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.MSSQLAdapter.rowslice web2py.gluon.dal.MSSQLAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.MSSQLAdapter.PRIMARY_KEY web2py.gluon.dal.MSSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.MSSQLAdapter.SUBSTRING web2py.gluon.dal.MSSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.MSSQLAdapter.types web2py.gluon.dal.MSSQLAdapter-class.html#types +web2py.gluon.dal.MSSQLAdapter.EXTRACT web2py.gluon.dal.MSSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.MSSQLAdapter.represent_exceptions web2py.gluon.dal.MSSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.MSSQLAdapter.__init__ web2py.gluon.dal.MSSQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.MSSQLAdapter.ALLOW_NULL web2py.gluon.dal.MSSQLAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.MSSQLAdapter.driver web2py.gluon.dal.MSSQLAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.MSSQLAdapter.lastrowid web2py.gluon.dal.MSSQLAdapter-class.html#lastrowid +web2py.gluon.dal.MongoDBAdapter web2py.gluon.dal.MongoDBAdapter-class.html +web2py.gluon.dal.NoSQLAdapter.represent web2py.gluon.dal.NoSQLAdapter-class.html#represent +web2py.gluon.dal.NoSQLAdapter.log_execute web2py.gluon.dal.NoSQLAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.NoSQLAdapter.SUB web2py.gluon.dal.NoSQLAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.NoSQLAdapter.LEFT_JOIN web2py.gluon.dal.NoSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.NoSQLAdapter.distributed_transaction_begin web2py.gluon.dal.NoSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.NoSQLAdapter.rollback web2py.gluon.dal.NoSQLAdapter-class.html#rollback +web2py.gluon.dal.NoSQLAdapter.ON web2py.gluon.dal.NoSQLAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.NoSQLAdapter.integrity_error_class web2py.gluon.dal.NoSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.NoSQLAdapter._select web2py.gluon.dal.NoSQLAdapter-class.html#_select +web2py.gluon.dal.MongoDBAdapter.insert web2py.gluon.dal.MongoDBAdapter-class.html#insert +web2py.gluon.dal.NoSQLAdapter.execute web2py.gluon.dal.NoSQLAdapter-class.html#execute +web2py.gluon.dal.NoSQLAdapter.drop web2py.gluon.dal.NoSQLAdapter-class.html#drop +web2py.gluon.dal.NoSQLAdapter.migrate_table web2py.gluon.dal.NoSQLAdapter-class.html#migrate_table +web2py.gluon.dal.NoSQLAdapter.concat_add web2py.gluon.dal.NoSQLAdapter-class.html#concat_add +web2py.gluon.dal.NoSQLAdapter._insert web2py.gluon.dal.NoSQLAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.NoSQLAdapter.OR web2py.gluon.dal.NoSQLAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.NoSQLAdapter.close web2py.gluon.dal.NoSQLAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.NoSQLAdapter.rowslice web2py.gluon.dal.NoSQLAdapter-class.html#rowslice +web2py.gluon.dal.NoSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.NoSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.NoSQLAdapter.rollback_prepared web2py.gluon.dal.NoSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.NoSQLAdapter.commit_prepared web2py.gluon.dal.NoSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.NoSQLAdapter.AND web2py.gluon.dal.NoSQLAdapter-class.html#AND +web2py.gluon.dal.MongoDBAdapter.uploads_in_blob web2py.gluon.dal.MongoDBAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.NoSQLAdapter.commit web2py.gluon.dal.NoSQLAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.NoSQLAdapter.STARTSWITH web2py.gluon.dal.NoSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.NoSQLAdapter.to_unicode web2py.gluon.dal.NoSQLAdapter-class.html#to_unicode +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.NoSQLAdapter._delete web2py.gluon.dal.NoSQLAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.NoSQLAdapter.MUL web2py.gluon.dal.NoSQLAdapter-class.html#MUL +web2py.gluon.dal.MongoDBAdapter.select web2py.gluon.dal.MongoDBAdapter-class.html#select +web2py.gluon.dal.NoSQLAdapter.PRIMARY_KEY web2py.gluon.dal.NoSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.NoSQLAdapter.prepare web2py.gluon.dal.NoSQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.NoSQLAdapter.SUBSTRING web2py.gluon.dal.NoSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.MongoDBAdapter.types web2py.gluon.dal.MongoDBAdapter-class.html#types +web2py.gluon.dal.NoSQLAdapter.EXTRACT web2py.gluon.dal.NoSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.NoSQLAdapter.represent_exceptions web2py.gluon.dal.NoSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.NoSQLAdapter.ADD web2py.gluon.dal.NoSQLAdapter-class.html#ADD +web2py.gluon.dal.MongoDBAdapter.count web2py.gluon.dal.MongoDBAdapter-class.html#count +web2py.gluon.dal.NoSQLAdapter.UPPER web2py.gluon.dal.NoSQLAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.NoSQLAdapter.LIKE web2py.gluon.dal.NoSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.MongoDBAdapter.delete web2py.gluon.dal.MongoDBAdapter-class.html#delete +web2py.gluon.dal.NoSQLAdapter.LOWER web2py.gluon.dal.NoSQLAdapter-class.html#LOWER +web2py.gluon.dal.NoSQLAdapter._update web2py.gluon.dal.NoSQLAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.NoSQLAdapter.ENDSWITH web2py.gluon.dal.NoSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.NoSQLAdapter.constraint_name web2py.gluon.dal.NoSQLAdapter-class.html#constraint_name +web2py.gluon.dal.NoSQLAdapter.DIV web2py.gluon.dal.NoSQLAdapter-class.html#DIV +web2py.gluon.dal.MongoDBAdapter.__init__ web2py.gluon.dal.MongoDBAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.NoSQLAdapter.AGGREGATE web2py.gluon.dal.NoSQLAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.NoSQLAdapter.RANDOM web2py.gluon.dal.NoSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.BaseAdapter.driver web2py.gluon.dal.BaseAdapter-class.html#driver +web2py.gluon.dal.MongoDBAdapter.update web2py.gluon.dal.MongoDBAdapter-class.html#update +web2py.gluon.dal.NoSQLAdapter.AS web2py.gluon.dal.NoSQLAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.NoSQLAdapter._count web2py.gluon.dal.NoSQLAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.NoSQLAdapter.alias web2py.gluon.dal.NoSQLAdapter-class.html#alias +web2py.gluon.dal.NoSQLAdapter.lastrowid web2py.gluon.dal.NoSQLAdapter-class.html#lastrowid +web2py.gluon.dal.MySQLAdapter web2py.gluon.dal.MySQLAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.MySQLAdapter.distributed_transaction_begin web2py.gluon.dal.MySQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.MySQLAdapter.maxcharlength web2py.gluon.dal.MySQLAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.MySQLAdapter._drop web2py.gluon.dal.MySQLAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.MySQLAdapter.concat_add web2py.gluon.dal.MySQLAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.MySQLAdapter.support_distributed_transaction web2py.gluon.dal.MySQLAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.MySQLAdapter.rollback_prepared web2py.gluon.dal.MySQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.MySQLAdapter.commit_prepared web2py.gluon.dal.MySQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.MySQLAdapter.prepare web2py.gluon.dal.MySQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.MySQLAdapter.SUBSTRING web2py.gluon.dal.MySQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.MySQLAdapter.commit_on_alter_table web2py.gluon.dal.MySQLAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.MySQLAdapter.__init__ web2py.gluon.dal.MySQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.MySQLAdapter.RANDOM web2py.gluon.dal.MySQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.MySQLAdapter.driver web2py.gluon.contrib.pymysql-module.html +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.MySQLAdapter.types web2py.gluon.dal.MySQLAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.MySQLAdapter.lastrowid web2py.gluon.dal.MySQLAdapter-class.html#lastrowid +web2py.gluon.dal.NoSQLAdapter web2py.gluon.dal.NoSQLAdapter-class.html +web2py.gluon.dal.NoSQLAdapter.represent web2py.gluon.dal.NoSQLAdapter-class.html#represent +web2py.gluon.dal.NoSQLAdapter.log_execute web2py.gluon.dal.NoSQLAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.NoSQLAdapter.SUB web2py.gluon.dal.NoSQLAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.NoSQLAdapter.LEFT_JOIN web2py.gluon.dal.NoSQLAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.NoSQLAdapter.distributed_transaction_begin web2py.gluon.dal.NoSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.NoSQLAdapter.rollback web2py.gluon.dal.NoSQLAdapter-class.html#rollback +web2py.gluon.dal.NoSQLAdapter.ON web2py.gluon.dal.NoSQLAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.NoSQLAdapter.integrity_error_class web2py.gluon.dal.NoSQLAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.NoSQLAdapter._select web2py.gluon.dal.NoSQLAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.NoSQLAdapter.execute web2py.gluon.dal.NoSQLAdapter-class.html#execute +web2py.gluon.dal.NoSQLAdapter.drop web2py.gluon.dal.NoSQLAdapter-class.html#drop +web2py.gluon.dal.NoSQLAdapter.migrate_table web2py.gluon.dal.NoSQLAdapter-class.html#migrate_table +web2py.gluon.dal.NoSQLAdapter.concat_add web2py.gluon.dal.NoSQLAdapter-class.html#concat_add +web2py.gluon.dal.NoSQLAdapter._insert web2py.gluon.dal.NoSQLAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.NoSQLAdapter.OR web2py.gluon.dal.NoSQLAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.NoSQLAdapter.close web2py.gluon.dal.NoSQLAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.NoSQLAdapter.rowslice web2py.gluon.dal.NoSQLAdapter-class.html#rowslice +web2py.gluon.dal.NoSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.NoSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.NoSQLAdapter.rollback_prepared web2py.gluon.dal.NoSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.NoSQLAdapter.commit_prepared web2py.gluon.dal.NoSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.NoSQLAdapter.AND web2py.gluon.dal.NoSQLAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.NoSQLAdapter.commit web2py.gluon.dal.NoSQLAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.NoSQLAdapter.STARTSWITH web2py.gluon.dal.NoSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.NoSQLAdapter.to_unicode web2py.gluon.dal.NoSQLAdapter-class.html#to_unicode +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.NoSQLAdapter._delete web2py.gluon.dal.NoSQLAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.NoSQLAdapter.MUL web2py.gluon.dal.NoSQLAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.NoSQLAdapter.PRIMARY_KEY web2py.gluon.dal.NoSQLAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.NoSQLAdapter.prepare web2py.gluon.dal.NoSQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.NoSQLAdapter.SUBSTRING web2py.gluon.dal.NoSQLAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.types web2py.gluon.dal.BaseAdapter-class.html#types +web2py.gluon.dal.NoSQLAdapter.EXTRACT web2py.gluon.dal.NoSQLAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.NoSQLAdapter.represent_exceptions web2py.gluon.dal.NoSQLAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.NoSQLAdapter.ADD web2py.gluon.dal.NoSQLAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.NoSQLAdapter.UPPER web2py.gluon.dal.NoSQLAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.NoSQLAdapter.LIKE web2py.gluon.dal.NoSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.NoSQLAdapter.LOWER web2py.gluon.dal.NoSQLAdapter-class.html#LOWER +web2py.gluon.dal.NoSQLAdapter._update web2py.gluon.dal.NoSQLAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.NoSQLAdapter.ENDSWITH web2py.gluon.dal.NoSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.NoSQLAdapter.constraint_name web2py.gluon.dal.NoSQLAdapter-class.html#constraint_name +web2py.gluon.dal.NoSQLAdapter.DIV web2py.gluon.dal.NoSQLAdapter-class.html#DIV +web2py.gluon.dal.BaseAdapter.__init__ web2py.gluon.dal.BaseAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.NoSQLAdapter.AGGREGATE web2py.gluon.dal.NoSQLAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.NoSQLAdapter.RANDOM web2py.gluon.dal.NoSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.BaseAdapter.driver web2py.gluon.dal.BaseAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.NoSQLAdapter.AS web2py.gluon.dal.NoSQLAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.NoSQLAdapter._count web2py.gluon.dal.NoSQLAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.NoSQLAdapter.alias web2py.gluon.dal.NoSQLAdapter-class.html#alias +web2py.gluon.dal.NoSQLAdapter.lastrowid web2py.gluon.dal.NoSQLAdapter-class.html#lastrowid +web2py.gluon.dal.OracleAdapter web2py.gluon.dal.OracleAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.OracleAdapter.select_limitby web2py.gluon.dal.OracleAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.OracleAdapter.LEFT_JOIN web2py.gluon.dal.OracleAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.OracleAdapter._drop web2py.gluon.dal.OracleAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.OracleAdapter.execute web2py.gluon.dal.OracleAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.OracleAdapter.NOT_NULL web2py.gluon.dal.OracleAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.OracleAdapter.create_sequence_and_triggers web2py.gluon.dal.OracleAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.OracleAdapter.oracle_fix web2py.gluon.dal.OracleAdapter-class.html#oracle_fix +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.OracleAdapter.commit_on_alter_table web2py.gluon.dal.OracleAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.OracleAdapter.represent_exceptions web2py.gluon.dal.OracleAdapter-class.html#represent_exceptions +web2py.gluon.dal.OracleAdapter.sequence_name web2py.gluon.dal.OracleAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.OracleAdapter.constraint_name web2py.gluon.dal.OracleAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.OracleAdapter.__init__ web2py.gluon.dal.OracleAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.OracleAdapter.RANDOM web2py.gluon.dal.OracleAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.OracleAdapter.driver web2py.gluon.dal.OracleAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.OracleAdapter.trigger_name web2py.gluon.dal.OracleAdapter-class.html#trigger_name +web2py.gluon.dal.OracleAdapter.types web2py.gluon.dal.OracleAdapter-class.html#types +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.OracleAdapter.lastrowid web2py.gluon.dal.OracleAdapter-class.html#lastrowid +web2py.gluon.dal.PostgreSQLAdapter web2py.gluon.dal.PostgreSQLAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.PostgreSQLAdapter.distributed_transaction_begin web2py.gluon.dal.PostgreSQLAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.PostgreSQLAdapter.support_distributed_transaction web2py.gluon.dal.PostgreSQLAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.PostgreSQLAdapter.create_sequence_and_triggers web2py.gluon.dal.PostgreSQLAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.PostgreSQLAdapter.rollback_prepared web2py.gluon.dal.PostgreSQLAdapter-class.html#rollback_prepared +web2py.gluon.dal.PostgreSQLAdapter.commit_prepared web2py.gluon.dal.PostgreSQLAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.PostgreSQLAdapter.STARTSWITH web2py.gluon.dal.PostgreSQLAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.PostgreSQLAdapter.prepare web2py.gluon.dal.PostgreSQLAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.PostgreSQLAdapter.types web2py.gluon.dal.PostgreSQLAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.PostgreSQLAdapter.sequence_name web2py.gluon.dal.PostgreSQLAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.PostgreSQLAdapter.LIKE web2py.gluon.dal.PostgreSQLAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.PostgreSQLAdapter.ENDSWITH web2py.gluon.dal.PostgreSQLAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.PostgreSQLAdapter.__init__ web2py.gluon.dal.PostgreSQLAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.PostgreSQLAdapter.RANDOM web2py.gluon.dal.PostgreSQLAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.PostgreSQLAdapter.driver psycopg2-module.html +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.PostgreSQLAdapter.CONTAINS web2py.gluon.dal.PostgreSQLAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.PostgreSQLAdapter.lastrowid web2py.gluon.dal.PostgreSQLAdapter-class.html#lastrowid +web2py.gluon.dal.Query web2py.gluon.dal.Query-class.html +web2py.gluon.dal.Query.__invert__ web2py.gluon.dal.Query-class.html#__invert__ +web2py.gluon.dal.Query.__str__ web2py.gluon.dal.Query-class.html#__str__ +web2py.gluon.dal.Query.__or__ web2py.gluon.dal.Query-class.html#__or__ +web2py.gluon.dal.Query.__and__ web2py.gluon.dal.Query-class.html#__and__ +web2py.gluon.dal.Query.__init__ web2py.gluon.dal.Query-class.html#__init__ +web2py.gluon.dal.Reference web2py.gluon.dal.Reference-class.html +web2py.gluon.dal.Reference.__setattr__ web2py.gluon.dal.Reference-class.html#__setattr__ +web2py.gluon.dal.Reference.__getattr__ web2py.gluon.dal.Reference-class.html#__getattr__ +web2py.gluon.dal.Reference.__getitem__ web2py.gluon.dal.Reference-class.html#__getitem__ +web2py.gluon.dal.Reference.__setitem__ web2py.gluon.dal.Reference-class.html#__setitem__ +web2py.gluon.dal.Reference.__allocate web2py.gluon.dal.Reference-class.html#__allocate +web2py.gluon.dal.Row web2py.gluon.dal.Row-class.html +web2py.gluon.dal.Row.__int__ web2py.gluon.dal.Row-class.html#__int__ +web2py.gluon.dal.Row.__setattr__ web2py.gluon.dal.Row-class.html#__setattr__ +web2py.gluon.dal.Row.__getattr__ web2py.gluon.dal.Row-class.html#__getattr__ +web2py.gluon.dal.Row.__call__ web2py.gluon.dal.Row-class.html#__call__ +web2py.gluon.dal.Row.__ne__ web2py.gluon.dal.Row-class.html#__ne__ +web2py.gluon.dal.Row.__getitem__ web2py.gluon.dal.Row-class.html#__getitem__ +web2py.gluon.dal.Row.as_dict web2py.gluon.dal.Row-class.html#as_dict +web2py.gluon.dal.Row.__setitem__ web2py.gluon.dal.Row-class.html#__setitem__ +web2py.gluon.dal.Row.__eq__ web2py.gluon.dal.Row-class.html#__eq__ +web2py.gluon.dal.Row.__repr__ web2py.gluon.dal.Row-class.html#__repr__ +web2py.gluon.dal.Row.__copy__ web2py.gluon.dal.Row-class.html#__copy__ +web2py.gluon.dal.Rows web2py.gluon.dal.Rows-class.html +web2py.gluon.dal.Rows.__getslice__ web2py.gluon.dal.Rows-class.html#__getslice__ +web2py.gluon.dal.Rows.__str__ web2py.gluon.dal.Rows-class.html#__str__ +web2py.gluon.dal.Rows.__and__ web2py.gluon.dal.Rows-class.html#__and__ +web2py.gluon.dal.Rows.exclude web2py.gluon.dal.Rows-class.html#exclude +web2py.gluon.dal.Rows.find web2py.gluon.dal.Rows-class.html#find +web2py.gluon.dal.Rows.__init__ web2py.gluon.dal.Rows-class.html#__init__ +web2py.gluon.dal.Rows.xml web2py.gluon.dal.Rows-class.html#xml +web2py.gluon.dal.Rows.setvirtualfields web2py.gluon.dal.Rows-class.html#setvirtualfields +web2py.gluon.dal.Rows.export_to_csv_file web2py.gluon.dal.Rows-class.html#export_to_csv_file +web2py.gluon.dal.Rows.json web2py.gluon.dal.Rows-class.html#json +web2py.gluon.dal.Rows.__len__ web2py.gluon.dal.Rows-class.html#__len__ +web2py.gluon.dal.Rows.sort web2py.gluon.dal.Rows-class.html#sort +web2py.gluon.dal.Rows.__getitem__ web2py.gluon.dal.Rows-class.html#__getitem__ +web2py.gluon.dal.Rows.as_dict web2py.gluon.dal.Rows-class.html#as_dict +web2py.gluon.dal.Rows.__iter__ web2py.gluon.dal.Rows-class.html#__iter__ +web2py.gluon.dal.Rows.__or__ web2py.gluon.dal.Rows-class.html#__or__ +web2py.gluon.dal.Rows.last web2py.gluon.dal.Rows-class.html#last +web2py.gluon.dal.Rows.__nonzero__ web2py.gluon.dal.Rows-class.html#__nonzero__ +web2py.gluon.dal.Rows.as_list web2py.gluon.dal.Rows-class.html#as_list +web2py.gluon.dal.Rows.first web2py.gluon.dal.Rows-class.html#first +web2py.gluon.dal.SAPDBAdapter web2py.gluon.dal.SAPDBAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.SAPDBAdapter.select_limitby web2py.gluon.dal.SAPDBAdapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.SAPDBAdapter.support_distributed_transaction web2py.gluon.dal.SAPDBAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.SAPDBAdapter.create_sequence_and_triggers web2py.gluon.dal.SAPDBAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.SAPDBAdapter.types web2py.gluon.dal.SAPDBAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.SAPDBAdapter.sequence_name web2py.gluon.dal.SAPDBAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.SAPDBAdapter.__init__ web2py.gluon.dal.SAPDBAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.RANDOM web2py.gluon.dal.BaseAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.SAPDBAdapter.driver web2py.gluon.dal.SAPDBAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.SAPDBAdapter.lastrowid web2py.gluon.dal.SAPDBAdapter-class.html#lastrowid +web2py.gluon.dal.SQLALL web2py.gluon.dal.SQLALL-class.html +web2py.gluon.dal.SQLALL.__str__ web2py.gluon.dal.SQLALL-class.html#__str__ +web2py.gluon.dal.SQLALL.__init__ web2py.gluon.dal.SQLALL-class.html#__init__ +web2py.gluon.dal.SQLCallableList web2py.gluon.dal.SQLCallableList-class.html +web2py.gluon.dal.SQLCallableList.__call__ web2py.gluon.dal.SQLCallableList-class.html#__call__ +web2py.gluon.dal.SQLCustomType web2py.gluon.dal.SQLCustomType-class.html +web2py.gluon.dal.SQLCustomType.startswith web2py.gluon.dal.SQLCustomType-class.html#startswith +web2py.gluon.dal.SQLCustomType.__getslice__ web2py.gluon.dal.SQLCustomType-class.html#__getslice__ +web2py.gluon.dal.SQLCustomType.__getitem__ web2py.gluon.dal.SQLCustomType-class.html#__getitem__ +web2py.gluon.dal.SQLCustomType.__str__ web2py.gluon.dal.SQLCustomType-class.html#__str__ +web2py.gluon.dal.SQLCustomType.__init__ web2py.gluon.dal.SQLCustomType-class.html#__init__ +web2py.gluon.dal.SQLiteAdapter web2py.gluon.dal.SQLiteAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.BaseAdapter.select_limitby web2py.gluon.dal.BaseAdapter-class.html#select_limitby +web2py.gluon.dal.SQLiteAdapter._truncate web2py.gluon.dal.SQLiteAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.BaseAdapter.LEFT_JOIN web2py.gluon.dal.BaseAdapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.BaseAdapter.execute web2py.gluon.dal.BaseAdapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.BaseAdapter.rowslice web2py.gluon.dal.BaseAdapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.SQLiteAdapter.web2py_extract web2py.gluon.dal.SQLiteAdapter-class.html#web2py_extract +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.BaseAdapter.types web2py.gluon.dal.BaseAdapter-class.html#types +web2py.gluon.dal.SQLiteAdapter.EXTRACT web2py.gluon.dal.SQLiteAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.BaseAdapter.represent_exceptions web2py.gluon.dal.BaseAdapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.SQLiteAdapter.__init__ web2py.gluon.dal.SQLiteAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.BaseAdapter.RANDOM web2py.gluon.dal.BaseAdapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.SQLiteAdapter.driver sqlite3.dbapi2-module.html +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.SQLiteAdapter.lastrowid web2py.gluon.dal.SQLiteAdapter-class.html#lastrowid +web2py.gluon.dal.Set web2py.gluon.dal.Set-class.html +web2py.gluon.dal.Set.delete_uploaded_files web2py.gluon.dal.Set-class.html#delete_uploaded_files +web2py.gluon.dal.Set._update web2py.gluon.dal.Set-class.html#_update +web2py.gluon.dal.Set._delete web2py.gluon.dal.Set-class.html#_delete +web2py.gluon.dal.Set.select web2py.gluon.dal.Set-class.html#select +web2py.gluon.dal.Set.__init__ web2py.gluon.dal.Set-class.html#__init__ +web2py.gluon.dal.Set.__call__ web2py.gluon.dal.Set-class.html#__call__ +web2py.gluon.dal.Set.count web2py.gluon.dal.Set-class.html#count +web2py.gluon.dal.Set.update web2py.gluon.dal.Set-class.html#update +web2py.gluon.dal.Set.isempty web2py.gluon.dal.Set-class.html#isempty +web2py.gluon.dal.Set.validate_and_update web2py.gluon.dal.Set-class.html#validate_and_update +web2py.gluon.dal.Set._select web2py.gluon.dal.Set-class.html#_select +web2py.gluon.dal.Set._count web2py.gluon.dal.Set-class.html#_count +web2py.gluon.dal.Set.delete web2py.gluon.dal.Set-class.html#delete +web2py.gluon.dal.Table web2py.gluon.dal.Table-class.html +web2py.gluon.dal.Table._listify web2py.gluon.dal.Table-class.html#_listify +web2py.gluon.dal.Table._validate web2py.gluon.dal.Table-class.html#_validate +web2py.gluon.dal.Table.__str__ web2py.gluon.dal.Table-class.html#__str__ +web2py.gluon.dal.Table._build_query web2py.gluon.dal.Table-class.html#_build_query +web2py.gluon.dal.Table.__delitem__ web2py.gluon.dal.Table-class.html#__delitem__ +web2py.gluon.dal.Table._truncate web2py.gluon.dal.Table-class.html#_truncate +web2py.gluon.dal.Table.__init__ web2py.gluon.dal.Table-class.html#__init__ +web2py.gluon.dal.Table.validate_and_insert web2py.gluon.dal.Table-class.html#validate_and_insert +web2py.gluon.dal.Table.import_from_csv_file web2py.gluon.dal.Table-class.html#import_from_csv_file +web2py.gluon.dal.Table.__setattr__ web2py.gluon.dal.Table-class.html#__setattr__ +web2py.gluon.dal.Table.truncate web2py.gluon.dal.Table-class.html#truncate +web2py.gluon.dal.Table.__getattr__ web2py.gluon.dal.Table-class.html#__getattr__ +web2py.gluon.dal.Table._filter_fields web2py.gluon.dal.Table-class.html#_filter_fields +web2py.gluon.dal.Table.with_alias web2py.gluon.dal.Table-class.html#with_alias +web2py.gluon.dal.Table.__call__ web2py.gluon.dal.Table-class.html#__call__ +web2py.gluon.dal.Table.__getitem__ web2py.gluon.dal.Table-class.html#__getitem__ +web2py.gluon.dal.Table.on web2py.gluon.dal.Table-class.html#on +web2py.gluon.dal.Table.bulk_insert web2py.gluon.dal.Table-class.html#bulk_insert +web2py.gluon.dal.Table.__setitem__ web2py.gluon.dal.Table-class.html#__setitem__ +web2py.gluon.dal.Table._drop web2py.gluon.dal.Table-class.html#_drop +web2py.gluon.dal.Table.insert web2py.gluon.dal.Table-class.html#insert +web2py.gluon.dal.Table.drop web2py.gluon.dal.Table-class.html#drop +web2py.gluon.dal.Table.__iter__ web2py.gluon.dal.Table-class.html#__iter__ +web2py.gluon.dal.Table.update_or_insert web2py.gluon.dal.Table-class.html#update_or_insert +web2py.gluon.dal.Table.__repr__ web2py.gluon.dal.Table-class.html#__repr__ +web2py.gluon.dal.Table._insert web2py.gluon.dal.Table-class.html#_insert +web2py.gluon.dal.Table._create_references web2py.gluon.dal.Table-class.html#_create_references +web2py.gluon.dal.TeradataAdapter web2py.gluon.dal.TeradataAdapter-class.html +web2py.gluon.dal.BaseAdapter.represent web2py.gluon.dal.BaseAdapter-class.html#represent +web2py.gluon.dal.BaseAdapter.log_execute web2py.gluon.dal.BaseAdapter-class.html#log_execute +web2py.gluon.dal.DB2Adapter.select_limitby web2py.gluon.dal.DB2Adapter-class.html#select_limitby +web2py.gluon.dal.BaseAdapter._truncate web2py.gluon.dal.BaseAdapter-class.html#_truncate +web2py.gluon.dal.BaseAdapter.tables web2py.gluon.dal.BaseAdapter-class.html#tables +web2py.gluon.dal.DB2Adapter.LEFT_JOIN web2py.gluon.dal.DB2Adapter-class.html#LEFT_JOIN +web2py.gluon.dal.BaseAdapter.distributed_transaction_begin web2py.gluon.dal.BaseAdapter-class.html#distributed_transaction_begin +web2py.gluon.dal.BaseAdapter.GT web2py.gluon.dal.BaseAdapter-class.html#GT +web2py.gluon.dal.BaseAdapter.rollback web2py.gluon.dal.BaseAdapter-class.html#rollback +web2py.gluon.dal.BaseAdapter.ON web2py.gluon.dal.BaseAdapter-class.html#ON +web2py.gluon.dal.BaseAdapter.ALLOW_NULL web2py.gluon.dal.BaseAdapter-class.html#ALLOW_NULL +web2py.gluon.dal.BaseAdapter.maxcharlength web2py.gluon.dal.BaseAdapter-class.html#maxcharlength +web2py.gluon.dal.BaseAdapter.GE web2py.gluon.dal.BaseAdapter-class.html#GE +web2py.gluon.dal.BaseAdapter.get_table web2py.gluon.dal.BaseAdapter-class.html#get_table +web2py.gluon.dal.BaseAdapter._drop web2py.gluon.dal.BaseAdapter-class.html#_drop +web2py.gluon.dal.BaseAdapter.integrity_error_class web2py.gluon.dal.BaseAdapter-class.html#integrity_error_class +web2py.gluon.dal.ConnectionPool.pool_connection web2py.gluon.dal.ConnectionPool-class.html#pool_connection +web2py.gluon.dal.BaseAdapter._select web2py.gluon.dal.BaseAdapter-class.html#_select +web2py.gluon.dal.BaseAdapter.insert web2py.gluon.dal.BaseAdapter-class.html#insert +web2py.gluon.dal.DB2Adapter.execute web2py.gluon.dal.DB2Adapter-class.html#execute +web2py.gluon.dal.BaseAdapter.drop web2py.gluon.dal.BaseAdapter-class.html#drop +web2py.gluon.dal.BaseAdapter.migrate_table web2py.gluon.dal.BaseAdapter-class.html#migrate_table +web2py.gluon.dal.BaseAdapter.concat_add web2py.gluon.dal.BaseAdapter-class.html#concat_add +web2py.gluon.dal.BaseAdapter._insert web2py.gluon.dal.BaseAdapter-class.html#_insert +web2py.gluon.dal.ConnectionPool.pools web2py.gluon.dal.ConnectionPool-class.html#pools +web2py.gluon.dal.BaseAdapter.support_distributed_transaction web2py.gluon.dal.BaseAdapter-class.html#support_distributed_transaction +web2py.gluon.dal.BaseAdapter.OR web2py.gluon.dal.BaseAdapter-class.html#OR +web2py.gluon.dal.BaseAdapter.file_delete web2py.gluon.dal.BaseAdapter-class.html#file_delete +web2py.gluon.dal.BaseAdapter.NOT_NULL web2py.gluon.dal.BaseAdapter-class.html#NOT_NULL +web2py.gluon.dal.ConnectionPool.find_or_make_work_folder web2py.gluon.dal.ConnectionPool-class.html#find_or_make_work_folder +web2py.gluon.dal.BaseAdapter.close web2py.gluon.dal.BaseAdapter-class.html#close +web2py.gluon.dal.BaseAdapter.integrity_error web2py.gluon.dal.BaseAdapter-class.html#integrity_error +web2py.gluon.dal.DB2Adapter.rowslice web2py.gluon.dal.DB2Adapter-class.html#rowslice +web2py.gluon.dal.BaseAdapter.create_sequence_and_triggers web2py.gluon.dal.BaseAdapter-class.html#create_sequence_and_triggers +web2py.gluon.dal.BaseAdapter.rollback_prepared web2py.gluon.dal.BaseAdapter-class.html#rollback_prepared +web2py.gluon.dal.BaseAdapter.commit_prepared web2py.gluon.dal.BaseAdapter-class.html#commit_prepared +web2py.gluon.dal.BaseAdapter.EQ web2py.gluon.dal.BaseAdapter-class.html#EQ +web2py.gluon.dal.BaseAdapter.AND web2py.gluon.dal.BaseAdapter-class.html#AND +web2py.gluon.dal.BaseAdapter.uploads_in_blob web2py.gluon.dal.BaseAdapter-class.html#uploads_in_blob +web2py.gluon.dal.BaseAdapter.NOT web2py.gluon.dal.BaseAdapter-class.html#NOT +web2py.gluon.dal.BaseAdapter.commit web2py.gluon.dal.BaseAdapter-class.html#commit +web2py.gluon.dal.BaseAdapter.MOD web2py.gluon.dal.BaseAdapter-class.html#MOD +web2py.gluon.dal.BaseAdapter.STARTSWITH web2py.gluon.dal.BaseAdapter-class.html#STARTSWITH +web2py.gluon.dal.BaseAdapter.SUB web2py.gluon.dal.BaseAdapter-class.html#SUB +web2py.gluon.dal.BaseAdapter.COALESCE_ZERO web2py.gluon.dal.BaseAdapter-class.html#COALESCE_ZERO +web2py.gluon.dal.BaseAdapter._delete web2py.gluon.dal.BaseAdapter-class.html#_delete +web2py.gluon.dal.BaseAdapter.BELONGS web2py.gluon.dal.BaseAdapter-class.html#BELONGS +web2py.gluon.dal.BaseAdapter.MUL web2py.gluon.dal.BaseAdapter-class.html#MUL +web2py.gluon.dal.BaseAdapter.select web2py.gluon.dal.BaseAdapter-class.html#select +web2py.gluon.dal.BaseAdapter.PRIMARY_KEY web2py.gluon.dal.BaseAdapter-class.html#PRIMARY_KEY +web2py.gluon.dal.BaseAdapter.prepare web2py.gluon.dal.BaseAdapter-class.html#prepare +web2py.gluon.dal.BaseAdapter.NE web2py.gluon.dal.BaseAdapter-class.html#NE +web2py.gluon.dal.BaseAdapter.SUBSTRING web2py.gluon.dal.BaseAdapter-class.html#SUBSTRING +web2py.gluon.dal.TeradataAdapter.types web2py.gluon.dal.TeradataAdapter-class.html#types +web2py.gluon.dal.BaseAdapter.EXTRACT web2py.gluon.dal.BaseAdapter-class.html#EXTRACT +web2py.gluon.dal.BaseAdapter.commit_on_alter_table web2py.gluon.dal.BaseAdapter-class.html#commit_on_alter_table +web2py.gluon.dal.DB2Adapter.represent_exceptions web2py.gluon.dal.DB2Adapter-class.html#represent_exceptions +web2py.gluon.dal.BaseAdapter.sequence_name web2py.gluon.dal.BaseAdapter-class.html#sequence_name +web2py.gluon.dal.BaseAdapter.ADD web2py.gluon.dal.BaseAdapter-class.html#ADD +web2py.gluon.dal.BaseAdapter.count web2py.gluon.dal.BaseAdapter-class.html#count +web2py.gluon.dal.BaseAdapter.UPPER web2py.gluon.dal.BaseAdapter-class.html#UPPER +web2py.gluon.dal.BaseAdapter.JOIN web2py.gluon.dal.BaseAdapter-class.html#JOIN +web2py.gluon.dal.BaseAdapter.LIKE web2py.gluon.dal.BaseAdapter-class.html#LIKE +web2py.gluon.dal.ConnectionPool.close_all_instances web2py.gluon.dal.ConnectionPool-class.html#close_all_instances +web2py.gluon.dal.BaseAdapter.file_exists web2py.gluon.dal.BaseAdapter-class.html#file_exists +web2py.gluon.dal.BaseAdapter.delete web2py.gluon.dal.BaseAdapter-class.html#delete +web2py.gluon.dal.BaseAdapter.LOWER web2py.gluon.dal.BaseAdapter-class.html#LOWER +web2py.gluon.dal.BaseAdapter._update web2py.gluon.dal.BaseAdapter-class.html#_update +web2py.gluon.dal.BaseAdapter.parse web2py.gluon.dal.BaseAdapter-class.html#parse +web2py.gluon.dal.BaseAdapter.ENDSWITH web2py.gluon.dal.BaseAdapter-class.html#ENDSWITH +web2py.gluon.dal.BaseAdapter.constraint_name web2py.gluon.dal.BaseAdapter-class.html#constraint_name +web2py.gluon.dal.BaseAdapter.DIV web2py.gluon.dal.BaseAdapter-class.html#DIV +web2py.gluon.dal.TeradataAdapter.__init__ web2py.gluon.dal.TeradataAdapter-class.html#__init__ +web2py.gluon.dal.BaseAdapter.filter_tenant web2py.gluon.dal.BaseAdapter-class.html#filter_tenant +web2py.gluon.dal.BaseAdapter.LE web2py.gluon.dal.BaseAdapter-class.html#LE +web2py.gluon.dal.BaseAdapter.file_open web2py.gluon.dal.BaseAdapter-class.html#file_open +web2py.gluon.dal.ConnectionPool.set_folder web2py.gluon.dal.ConnectionPool-class.html#set_folder +web2py.gluon.dal.BaseAdapter.LT web2py.gluon.dal.BaseAdapter-class.html#LT +web2py.gluon.dal.BaseAdapter.COMMA web2py.gluon.dal.BaseAdapter-class.html#COMMA +web2py.gluon.dal.BaseAdapter.create_table web2py.gluon.dal.BaseAdapter-class.html#create_table +web2py.gluon.dal.BaseAdapter.bulk_insert web2py.gluon.dal.BaseAdapter-class.html#bulk_insert +web2py.gluon.dal.BaseAdapter.AGGREGATE web2py.gluon.dal.BaseAdapter-class.html#AGGREGATE +web2py.gluon.dal.BaseAdapter.file_close web2py.gluon.dal.BaseAdapter-class.html#file_close +web2py.gluon.dal.DB2Adapter.RANDOM web2py.gluon.dal.DB2Adapter-class.html#RANDOM +web2py.gluon.dal.BaseAdapter.truncate web2py.gluon.dal.BaseAdapter-class.html#truncate +web2py.gluon.dal.TeradataAdapter.driver web2py.gluon.dal.TeradataAdapter-class.html#driver +web2py.gluon.dal.BaseAdapter.update web2py.gluon.dal.BaseAdapter-class.html#update +web2py.gluon.dal.BaseAdapter.AS web2py.gluon.dal.BaseAdapter-class.html#AS +web2py.gluon.dal.BaseAdapter.trigger_name web2py.gluon.dal.BaseAdapter-class.html#trigger_name +web2py.gluon.dal.BaseAdapter.expand web2py.gluon.dal.BaseAdapter-class.html#expand +web2py.gluon.dal.BaseAdapter._count web2py.gluon.dal.BaseAdapter-class.html#_count +web2py.gluon.dal.BaseAdapter.CONTAINS web2py.gluon.dal.BaseAdapter-class.html#CONTAINS +web2py.gluon.dal.BaseAdapter.INVERT web2py.gluon.dal.BaseAdapter-class.html#INVERT +web2py.gluon.dal.BaseAdapter.alias web2py.gluon.dal.BaseAdapter-class.html#alias +web2py.gluon.dal.DB2Adapter.lastrowid web2py.gluon.dal.DB2Adapter-class.html#lastrowid +web2py.gluon.dal.UseDatabaseStoredFile web2py.gluon.dal.UseDatabaseStoredFile-class.html +web2py.gluon.dal.UseDatabaseStoredFile.file_close web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_close +web2py.gluon.dal.UseDatabaseStoredFile.file_exists web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_exists +web2py.gluon.dal.UseDatabaseStoredFile.file_delete web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_delete +web2py.gluon.dal.UseDatabaseStoredFile.file_open web2py.gluon.dal.UseDatabaseStoredFile-class.html#file_open +web2py.gluon.debug.Pipe web2py.gluon.debug.Pipe-class.html +web2py.gluon.debug.Pipe.read web2py.gluon.debug.Pipe-class.html#read +web2py.gluon.debug.Pipe.write web2py.gluon.debug.Pipe-class.html#write +web2py.gluon.debug.Pipe.flush web2py.gluon.debug.Pipe-class.html#flush +web2py.gluon.debug.Pipe.readline web2py.gluon.debug.Pipe-class.html#readline +web2py.gluon.debug.Pipe.__init__ web2py.gluon.debug.Pipe-class.html#__init__ +web2py.gluon.globals.Request web2py.gluon.globals.Request-class.html +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.globals.Request.__init__ web2py.gluon.globals.Request-class.html#__init__ +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.globals.Request.compute_uuid web2py.gluon.globals.Request-class.html#compute_uuid +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.globals.Request.user_agent web2py.gluon.globals.Request-class.html#user_agent +web2py.gluon.globals.Request.restful web2py.gluon.globals.Request-class.html#restful +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.globals.Response web2py.gluon.globals.Response-class.html +web2py.gluon.globals.Response.render web2py.gluon.globals.Response-class.html#render +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.globals.Response.download web2py.gluon.globals.Response-class.html#download +web2py.gluon.globals.Response.__init__ web2py.gluon.globals.Response-class.html#__init__ +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.globals.Response.stream web2py.gluon.globals.Response-class.html#stream +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.globals.Response.write web2py.gluon.globals.Response-class.html#write +web2py.gluon.globals.Response.json web2py.gluon.globals.Response-class.html#json +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.globals.Response.xmlrpc web2py.gluon.globals.Response-class.html#xmlrpc +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.globals.Response.toolbar web2py.gluon.globals.Response-class.html#toolbar +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.globals.Session web2py.gluon.globals.Session-class.html +web2py.gluon.globals.Session.forget web2py.gluon.globals.Session-class.html#forget +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.globals.Session.is_new web2py.gluon.globals.Session-class.html#is_new +web2py.gluon.globals.Session.connect web2py.gluon.globals.Session-class.html#connect +web2py.gluon.globals.Session._try_store_in_db web2py.gluon.globals.Session-class.html#_try_store_in_db +web2py.gluon.globals.Session.secure web2py.gluon.globals.Session-class.html#secure +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.globals.Session._close web2py.gluon.globals.Session-class.html#_close +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.globals.Session._unlock web2py.gluon.globals.Session-class.html#_unlock +web2py.gluon.globals.Session._try_store_on_disk web2py.gluon.globals.Session-class.html#_try_store_on_disk +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.globals.Session.is_expired web2py.gluon.globals.Session-class.html#is_expired +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.highlight.Highlighter web2py.gluon.highlight.Highlighter-class.html +web2py.gluon.highlight.Highlighter.python_tokenizer web2py.gluon.highlight.Highlighter-class.html#python_tokenizer +web2py.gluon.highlight.Highlighter.c_tokenizer web2py.gluon.highlight.Highlighter-class.html#c_tokenizer +web2py.gluon.highlight.Highlighter.html_tokenizer web2py.gluon.highlight.Highlighter-class.html#html_tokenizer +web2py.gluon.highlight.Highlighter.all_styles web2py.gluon.highlight.Highlighter-class.html#all_styles +web2py.gluon.highlight.Highlighter.change_style web2py.gluon.highlight.Highlighter-class.html#change_style +web2py.gluon.highlight.Highlighter.highlight web2py.gluon.highlight.Highlighter-class.html#highlight +web2py.gluon.highlight.Highlighter.__init__ web2py.gluon.highlight.Highlighter-class.html#__init__ +web2py.gluon.html.A web2py.gluon.html.A-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.A.tag web2py.gluon.html.A-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.A.xml web2py.gluon.html.A-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.B web2py.gluon.html.B-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.B.tag web2py.gluon.html.B-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.BEAUTIFY web2py.gluon.html.BEAUTIFY-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.BEAUTIFY.tag web2py.gluon.html.BEAUTIFY-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.BEAUTIFY.__init__ web2py.gluon.html.BEAUTIFY-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.BEAUTIFY.no_underscore web2py.gluon.html.BEAUTIFY-class.html#no_underscore +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.BODY web2py.gluon.html.BODY-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.BODY.tag web2py.gluon.html.BODY-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.BR web2py.gluon.html.BR-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.BR.tag web2py.gluon.html.BR-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.BUTTON web2py.gluon.html.BUTTON-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.BUTTON.tag web2py.gluon.html.BUTTON-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.CAT web2py.gluon.html.CAT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.CAT.tag web2py.gluon.html.CAT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.CENTER web2py.gluon.html.CENTER-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.CENTER.tag web2py.gluon.html.CENTER-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.CODE web2py.gluon.html.CODE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.DIV.tag web2py.gluon.html.DIV-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.CODE.xml web2py.gluon.html.CODE-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.COL web2py.gluon.html.COL-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.COL.tag web2py.gluon.html.COL-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.COLGROUP web2py.gluon.html.COLGROUP-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.COLGROUP.tag web2py.gluon.html.COLGROUP-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.DIV web2py.gluon.html.DIV-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.DIV.tag web2py.gluon.html.DIV-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.EM web2py.gluon.html.EM-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.EM.tag web2py.gluon.html.EM-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.EMBED web2py.gluon.html.EMBED-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.EMBED.tag web2py.gluon.html.EMBED-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.FIELDSET web2py.gluon.html.FIELDSET-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.FIELDSET.tag web2py.gluon.html.FIELDSET-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.FORM web2py.gluon.html.FORM-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.FORM.process web2py.gluon.html.FORM-class.html#process +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.FORM.tag web2py.gluon.html.FORM-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.FORM.xml web2py.gluon.html.FORM-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.FORM.__init__ web2py.gluon.html.FORM-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.FORM._postprocessing web2py.gluon.html.FORM-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.FORM.validate web2py.gluon.html.FORM-class.html#validate +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.FORM.accepts web2py.gluon.html.FORM-class.html#accepts +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.FORM.hidden_fields web2py.gluon.html.FORM-class.html#hidden_fields +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H1 web2py.gluon.html.H1-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H1.tag web2py.gluon.html.H1-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H2 web2py.gluon.html.H2-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H2.tag web2py.gluon.html.H2-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H3 web2py.gluon.html.H3-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H3.tag web2py.gluon.html.H3-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H4 web2py.gluon.html.H4-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H4.tag web2py.gluon.html.H4-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H5 web2py.gluon.html.H5-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H5.tag web2py.gluon.html.H5-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.H6 web2py.gluon.html.H6-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.H6.tag web2py.gluon.html.H6-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.HEAD web2py.gluon.html.HEAD-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.HEAD.tag web2py.gluon.html.HEAD-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.HR web2py.gluon.html.HR-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.HR.tag web2py.gluon.html.HR-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.HTML web2py.gluon.html.HTML-class.html +web2py.gluon.html.HTML.frameset web2py.gluon.html.HTML-class.html#frameset +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.HTML.tag web2py.gluon.html.HTML-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.HTML.xml web2py.gluon.html.HTML-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.HTML.strict web2py.gluon.html.HTML-class.html#strict +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.HTML.html5 web2py.gluon.html.HTML-class.html#html5 +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.HTML.transitional web2py.gluon.html.HTML-class.html#transitional +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.I web2py.gluon.html.I-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.I.tag web2py.gluon.html.I-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.IFRAME web2py.gluon.html.IFRAME-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.IFRAME.tag web2py.gluon.html.IFRAME-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.IMG web2py.gluon.html.IMG-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.IMG.tag web2py.gluon.html.IMG-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.INPUT web2py.gluon.html.INPUT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.INPUT._validate web2py.gluon.html.INPUT-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.INPUT.tag web2py.gluon.html.INPUT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.INPUT.xml web2py.gluon.html.INPUT-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.INPUT._postprocessing web2py.gluon.html.INPUT-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.LABEL web2py.gluon.html.LABEL-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.LABEL.tag web2py.gluon.html.LABEL-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.LEGEND web2py.gluon.html.LEGEND-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.LEGEND.tag web2py.gluon.html.LEGEND-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.LI web2py.gluon.html.LI-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.LI.tag web2py.gluon.html.LI-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.LINK web2py.gluon.html.LINK-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.LINK.tag web2py.gluon.html.LINK-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.MARKMIN web2py.gluon.html.MARKMIN-class.html +web2py.gluon.html.MARKMIN.xml web2py.gluon.html.MARKMIN-class.html#xml +web2py.gluon.html.MARKMIN.elements web2py.gluon.html.MARKMIN-class.html#elements +web2py.gluon.html.MARKMIN.__str__ web2py.gluon.html.MARKMIN-class.html#__str__ +web2py.gluon.html.MARKMIN.flatten web2py.gluon.html.MARKMIN-class.html#flatten +web2py.gluon.html.MARKMIN.__init__ web2py.gluon.html.MARKMIN-class.html#__init__ +web2py.gluon.html.MENU web2py.gluon.html.MENU-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.MENU.serialize web2py.gluon.html.MENU-class.html#serialize +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.MENU.tag web2py.gluon.html.MENU-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.MENU.xml web2py.gluon.html.MENU-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.MENU.__init__ web2py.gluon.html.MENU-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.META web2py.gluon.html.META-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.META.tag web2py.gluon.html.META-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.OBJECT web2py.gluon.html.OBJECT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.OBJECT.tag web2py.gluon.html.OBJECT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.OL web2py.gluon.html.OL-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.OL.tag web2py.gluon.html.OL-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.UL._fixup web2py.gluon.html.UL-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.OPTGROUP web2py.gluon.html.OPTGROUP-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.OPTGROUP.tag web2py.gluon.html.OPTGROUP-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.OPTGROUP._fixup web2py.gluon.html.OPTGROUP-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.OPTION web2py.gluon.html.OPTION-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.OPTION.tag web2py.gluon.html.OPTION-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.OPTION._fixup web2py.gluon.html.OPTION-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.P web2py.gluon.html.P-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.P.tag web2py.gluon.html.P-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.P.xml web2py.gluon.html.P-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.PRE web2py.gluon.html.PRE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.PRE.tag web2py.gluon.html.PRE-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.SCRIPT web2py.gluon.html.SCRIPT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.SCRIPT.tag web2py.gluon.html.SCRIPT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.SCRIPT.xml web2py.gluon.html.SCRIPT-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.SELECT web2py.gluon.html.SELECT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.INPUT._validate web2py.gluon.html.INPUT-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.SELECT.tag web2py.gluon.html.SELECT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.SELECT._fixup web2py.gluon.html.SELECT-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.INPUT.xml web2py.gluon.html.INPUT-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.SELECT._postprocessing web2py.gluon.html.SELECT-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.SPAN web2py.gluon.html.SPAN-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.SPAN.tag web2py.gluon.html.SPAN-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.STYLE web2py.gluon.html.STYLE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.STYLE.tag web2py.gluon.html.STYLE-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.STYLE.xml web2py.gluon.html.STYLE-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TABLE web2py.gluon.html.TABLE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TABLE.tag web2py.gluon.html.TABLE-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.TABLE._fixup web2py.gluon.html.TABLE-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TBODY web2py.gluon.html.TBODY-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TBODY.tag web2py.gluon.html.TBODY-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.TBODY._fixup web2py.gluon.html.TBODY-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TD web2py.gluon.html.TD-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TD.tag web2py.gluon.html.TD-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TEXTAREA web2py.gluon.html.TEXTAREA-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.INPUT._validate web2py.gluon.html.INPUT-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TEXTAREA.tag web2py.gluon.html.TEXTAREA-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.INPUT.xml web2py.gluon.html.INPUT-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.TEXTAREA._postprocessing web2py.gluon.html.TEXTAREA-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TFOOT web2py.gluon.html.TFOOT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TFOOT.tag web2py.gluon.html.TFOOT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.TFOOT._fixup web2py.gluon.html.TFOOT-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TH web2py.gluon.html.TH-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TH.tag web2py.gluon.html.TH-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.THEAD web2py.gluon.html.THEAD-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.THEAD.tag web2py.gluon.html.THEAD-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.THEAD._fixup web2py.gluon.html.THEAD-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TITLE web2py.gluon.html.TITLE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TITLE.tag web2py.gluon.html.TITLE-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TR web2py.gluon.html.TR-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TR.tag web2py.gluon.html.TR-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.TR._fixup web2py.gluon.html.TR-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.TT web2py.gluon.html.TT-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TT.tag web2py.gluon.html.TT-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.UL web2py.gluon.html.UL-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.UL.tag web2py.gluon.html.UL-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.UL._fixup web2py.gluon.html.UL-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.XHTML web2py.gluon.html.XHTML-class.html +web2py.gluon.html.XHTML.frameset web2py.gluon.html.XHTML-class.html#frameset +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.XHTML.tag web2py.gluon.html.XHTML-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.XHTML.xml web2py.gluon.html.XHTML-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.XHTML.strict web2py.gluon.html.XHTML-class.html#strict +web2py.gluon.html.DIV.__init__ web2py.gluon.html.DIV-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.XHTML.xmlns web2py.gluon.html.XHTML-class.html#xmlns +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.XHTML.transitional web2py.gluon.html.XHTML-class.html#transitional +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.html.XML web2py.gluon.html.XML-class.html +web2py.gluon.html.XML.__getslice__ web2py.gluon.html.XML-class.html#__getslice__ +web2py.gluon.html.XML.__str__ web2py.gluon.html.XML-class.html#__str__ +web2py.gluon.html.XML.__radd__ web2py.gluon.html.XML-class.html#__radd__ +web2py.gluon.html.XML.flatten web2py.gluon.html.XML-class.html#flatten +web2py.gluon.html.XML.__init__ web2py.gluon.html.XML-class.html#__init__ +web2py.gluon.html.XML.xml web2py.gluon.html.XML-class.html#xml +web2py.gluon.html.XML.__getattr__ web2py.gluon.html.XML-class.html#__getattr__ +web2py.gluon.html.XML.__cmp__ web2py.gluon.html.XML-class.html#__cmp__ +web2py.gluon.html.XML.__len__ web2py.gluon.html.XML-class.html#__len__ +web2py.gluon.html.XML.elements web2py.gluon.html.XML-class.html#elements +web2py.gluon.html.XML.__getitem__ web2py.gluon.html.XML-class.html#__getitem__ +web2py.gluon.html.XML.__iter__ web2py.gluon.html.XML-class.html#__iter__ +web2py.gluon.html.XML.__add__ web2py.gluon.html.XML-class.html#__add__ +web2py.gluon.html.XML.__hash__ web2py.gluon.html.XML-class.html#__hash__ +web2py.gluon.html.XmlComponent web2py.gluon.html.XmlComponent-class.html +web2py.gluon.html.XmlComponent.xml web2py.gluon.html.XmlComponent-class.html#xml +web2py.gluon.html.__TAG__ web2py.gluon.html.__TAG__-class.html +web2py.gluon.html.XmlComponent.xml web2py.gluon.html.XmlComponent-class.html#xml +web2py.gluon.html.__TAG__.__getitem__ web2py.gluon.html.__TAG__-class.html#__getitem__ +web2py.gluon.html.__TAG__.__getattr__ web2py.gluon.html.__TAG__-class.html#__getattr__ +web2py.gluon.html.__TAG__.__call__ web2py.gluon.html.__TAG__-class.html#__call__ +web2py.gluon.html.web2pyHTMLParser web2py.gluon.html.web2pyHTMLParser-class.html +web2py.gluon.html.web2pyHTMLParser.handle_entityref web2py.gluon.html.web2pyHTMLParser-class.html#handle_entityref +web2py.gluon.html.web2pyHTMLParser.handle_starttag web2py.gluon.html.web2pyHTMLParser-class.html#handle_starttag +web2py.gluon.html.web2pyHTMLParser.__init__ web2py.gluon.html.web2pyHTMLParser-class.html#__init__ +web2py.gluon.html.web2pyHTMLParser.handle_endtag web2py.gluon.html.web2pyHTMLParser-class.html#handle_endtag +web2py.gluon.html.web2pyHTMLParser.handle_charref web2py.gluon.html.web2pyHTMLParser-class.html#handle_charref +web2py.gluon.html.web2pyHTMLParser.handle_data web2py.gluon.html.web2pyHTMLParser-class.html#handle_data +web2py.gluon.http.HTTP web2py.gluon.http.HTTP-class.html +web2py.gluon.http.HTTP.__str__ web2py.gluon.http.HTTP-class.html#__str__ +web2py.gluon.http.HTTP.to web2py.gluon.http.HTTP-class.html#to +web2py.gluon.http.HTTP.message web2py.gluon.http.HTTP-class.html#message +web2py.gluon.http.HTTP.__init__ web2py.gluon.http.HTTP-class.html#__init__ +web2py.gluon.languages.lazyT web2py.gluon.languages.lazyT-class.html +web2py.gluon.languages.lazyT.__getslice__ web2py.gluon.languages.lazyT-class.html#__getslice__ +web2py.gluon.languages.lazyT.__str__ web2py.gluon.languages.lazyT-class.html#__str__ +web2py.gluon.languages.lazyT.__radd__ web2py.gluon.languages.lazyT-class.html#__radd__ +web2py.gluon.languages.lazyT.__init__ web2py.gluon.languages.lazyT-class.html#__init__ +web2py.gluon.languages.lazyT.xml web2py.gluon.languages.lazyT-class.html#xml +web2py.gluon.languages.lazyT.__getattr__ web2py.gluon.languages.lazyT-class.html#__getattr__ +web2py.gluon.languages.lazyT.__cmp__ web2py.gluon.languages.lazyT-class.html#__cmp__ +web2py.gluon.languages.lazyT.decode web2py.gluon.languages.lazyT-class.html#decode +web2py.gluon.languages.lazyT.encode web2py.gluon.languages.lazyT-class.html#encode +web2py.gluon.languages.lazyT.__len__ web2py.gluon.languages.lazyT-class.html#__len__ +web2py.gluon.languages.lazyT.__ne__ web2py.gluon.languages.lazyT-class.html#__ne__ +web2py.gluon.languages.lazyT.__getitem__ web2py.gluon.languages.lazyT-class.html#__getitem__ +web2py.gluon.languages.lazyT.read web2py.gluon.languages.lazyT-class.html#read +web2py.gluon.languages.lazyT.__iter__ web2py.gluon.languages.lazyT-class.html#__iter__ +web2py.gluon.languages.lazyT.T web2py.gluon.languages.lazyT-class.html#T +web2py.gluon.languages.lazyT.__add__ web2py.gluon.languages.lazyT-class.html#__add__ +web2py.gluon.languages.lazyT.__eq__ web2py.gluon.languages.lazyT-class.html#__eq__ +web2py.gluon.languages.lazyT.__mod__ web2py.gluon.languages.lazyT-class.html#__mod__ +web2py.gluon.languages.lazyT.m web2py.gluon.languages.lazyT-class.html#m +web2py.gluon.languages.lazyT.s web2py.gluon.languages.lazyT-class.html#s +web2py.gluon.languages.lazyT.__repr__ web2py.gluon.languages.lazyT-class.html#__repr__ +web2py.gluon.languages.lazyT.__hash__ web2py.gluon.languages.lazyT-class.html#__hash__ +web2py.gluon.languages.translator web2py.gluon.languages.translator-class.html +web2py.gluon.languages.translator.force web2py.gluon.languages.translator-class.html#force +web2py.gluon.languages.translator.get_possible_languages web2py.gluon.languages.translator-class.html#get_possible_languages +web2py.gluon.languages.translator.__call__ web2py.gluon.languages.translator-class.html#__call__ +web2py.gluon.languages.translator.translate web2py.gluon.languages.translator-class.html#translate +web2py.gluon.languages.translator.__init__ web2py.gluon.languages.translator-class.html#__init__ +web2py.gluon.languages.translator.set_current_languages web2py.gluon.languages.translator-class.html#set_current_languages +web2py.gluon.main.HttpServer web2py.gluon.main.HttpServer-class.html +web2py.gluon.main.HttpServer.stop web2py.gluon.main.HttpServer-class.html#stop +web2py.gluon.main.HttpServer.start web2py.gluon.main.HttpServer-class.html#start +web2py.gluon.main.HttpServer.__init__ web2py.gluon.main.HttpServer-class.html#__init__ +web2py.gluon.newcron.Token web2py.gluon.newcron.Token-class.html +web2py.gluon.newcron.Token.acquire web2py.gluon.newcron.Token-class.html#acquire +web2py.gluon.newcron.Token.release web2py.gluon.newcron.Token-class.html#release +web2py.gluon.newcron.Token.__init__ web2py.gluon.newcron.Token-class.html#__init__ +web2py.gluon.newcron.cronlauncher web2py.gluon.newcron.cronlauncher-class.html +web2py.gluon.newcron.cronlauncher.run web2py.gluon.newcron.cronlauncher-class.html#run +web2py.gluon.newcron.cronlauncher.__init__ web2py.gluon.newcron.cronlauncher-class.html#__init__ +web2py.gluon.newcron.extcron web2py.gluon.newcron.extcron-class.html +web2py.gluon.newcron.extcron.run web2py.gluon.newcron.extcron-class.html#run +web2py.gluon.newcron.extcron.__init__ web2py.gluon.newcron.extcron-class.html#__init__ +web2py.gluon.newcron.hardcron web2py.gluon.newcron.hardcron-class.html +web2py.gluon.newcron.hardcron.run web2py.gluon.newcron.hardcron-class.html#run +web2py.gluon.newcron.hardcron.__init__ web2py.gluon.newcron.hardcron-class.html#__init__ +web2py.gluon.newcron.hardcron.launch web2py.gluon.newcron.hardcron-class.html#launch +web2py.gluon.newcron.softcron web2py.gluon.newcron.softcron-class.html +web2py.gluon.newcron.softcron.run web2py.gluon.newcron.softcron-class.html#run +web2py.gluon.newcron.softcron.__init__ web2py.gluon.newcron.softcron-class.html#__init__ +web2py.gluon.restricted.RestrictedError web2py.gluon.restricted.RestrictedError-class.html +web2py.gluon.restricted.RestrictedError.load web2py.gluon.restricted.RestrictedError-class.html#load +web2py.gluon.restricted.RestrictedError.log web2py.gluon.restricted.RestrictedError-class.html#log +web2py.gluon.restricted.RestrictedError.__init__ web2py.gluon.restricted.RestrictedError-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.restricted.TicketStorage web2py.gluon.restricted.TicketStorage-class.html +web2py.gluon.restricted.TicketStorage.load web2py.gluon.restricted.TicketStorage-class.html#load +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.restricted.TicketStorage.__init__ web2py.gluon.restricted.TicketStorage-class.html#__init__ +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.restricted.TicketStorage.store web2py.gluon.restricted.TicketStorage-class.html#store +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.restricted.TicketStorage._error_file web2py.gluon.restricted.TicketStorage-class.html#_error_file +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.restricted.TicketStorage._get_table web2py.gluon.restricted.TicketStorage-class.html#_get_table +web2py.gluon.restricted.TicketStorage._store_on_disk web2py.gluon.restricted.TicketStorage-class.html#_store_on_disk +web2py.gluon.restricted.TicketStorage._store_in_db web2py.gluon.restricted.TicketStorage-class.html#_store_in_db +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.rewrite.MapUrlIn web2py.gluon.rewrite.MapUrlIn-class.html +web2py.gluon.rewrite.MapUrlIn.map_controller web2py.gluon.rewrite.MapUrlIn-class.html#map_controller +web2py.gluon.rewrite.MapUrlIn.validate_args web2py.gluon.rewrite.MapUrlIn-class.html#validate_args +web2py.gluon.rewrite.MapUrlIn.arg0 web2py.gluon.rewrite.MapUrlIn-class.html#arg0 +web2py.gluon.rewrite.MapUrlIn.map_static web2py.gluon.rewrite.MapUrlIn-class.html#map_static +web2py.gluon.rewrite.MapUrlIn.map_language web2py.gluon.rewrite.MapUrlIn-class.html#map_language +web2py.gluon.rewrite.MapUrlIn.map_app web2py.gluon.rewrite.MapUrlIn-class.html#map_app +web2py.gluon.rewrite.MapUrlIn.__init__ web2py.gluon.rewrite.MapUrlIn-class.html#__init__ +web2py.gluon.rewrite.MapUrlIn.map_prefix web2py.gluon.rewrite.MapUrlIn-class.html#map_prefix +web2py.gluon.rewrite.MapUrlIn.update_request web2py.gluon.rewrite.MapUrlIn-class.html#update_request +web2py.gluon.rewrite.MapUrlIn.map_function web2py.gluon.rewrite.MapUrlIn-class.html#map_function +web2py.gluon.rewrite.MapUrlIn.map_root_static web2py.gluon.rewrite.MapUrlIn-class.html#map_root_static +web2py.gluon.rewrite.MapUrlIn.harg0 web2py.gluon.rewrite.MapUrlIn-class.html#harg0 +web2py.gluon.rewrite.MapUrlIn.pop_arg_if web2py.gluon.rewrite.MapUrlIn-class.html#pop_arg_if +web2py.gluon.rewrite.MapUrlOut web2py.gluon.rewrite.MapUrlOut-class.html +web2py.gluon.rewrite.MapUrlOut.acf web2py.gluon.rewrite.MapUrlOut-class.html#acf +web2py.gluon.rewrite.MapUrlOut.omit_lang web2py.gluon.rewrite.MapUrlOut-class.html#omit_lang +web2py.gluon.rewrite.MapUrlOut.build_acf web2py.gluon.rewrite.MapUrlOut-class.html#build_acf +web2py.gluon.rewrite.MapUrlOut.omit_acf web2py.gluon.rewrite.MapUrlOut-class.html#omit_acf +web2py.gluon.rewrite.MapUrlOut.__init__ web2py.gluon.rewrite.MapUrlOut-class.html#__init__ +web2py.gluon.rocket.BadRequest web2py.gluon.rocket.BadRequest-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.rocket.ChunkedReader web2py.gluon.rocket.ChunkedReader-class.html +web2py.gluon.rocket.ChunkedReader._read_header web2py.gluon.rocket.ChunkedReader-class.html#_read_header +web2py.gluon.rocket.ChunkedReader.read web2py.gluon.rocket.ChunkedReader-class.html#read +web2py.gluon.rocket.ChunkedReader.readlines web2py.gluon.rocket.ChunkedReader-class.html#readlines +web2py.gluon.rocket.ChunkedReader.readline web2py.gluon.rocket.ChunkedReader-class.html#readline +web2py.gluon.rocket.ChunkedReader.__init__ web2py.gluon.rocket.ChunkedReader-class.html#__init__ +web2py.gluon.rocket.Connection web2py.gluon.rocket.Connection-class.html +web2py.gluon.rocket.Connection.secure web2py.gluon.rocket.Connection-class.html#secure +web2py.gluon.rocket.Connection.shutdown web2py.gluon.rocket.Connection-class.html#shutdown +web2py.gluon.rocket.Connection.close web2py.gluon.rocket.Connection-class.html#close +web2py.gluon.rocket.Connection.__init__ web2py.gluon.rocket.Connection-class.html#__init__ +web2py.gluon.rocket.Connection.makefile web2py.gluon.rocket.Connection-class.html#makefile +web2py.gluon.rocket.Connection.server_port web2py.gluon.rocket.Connection-class.html#server_port +web2py.gluon.rocket.Connection.start_time web2py.gluon.rocket.Connection-class.html#start_time +web2py.gluon.rocket.Connection.ssl web2py.gluon.rocket.Connection-class.html#ssl +web2py.gluon.rocket.Connection.client_port web2py.gluon.rocket.Connection-class.html#client_port +web2py.gluon.rocket.Connection.setblocking web2py.gluon.rocket.Connection-class.html#setblocking +web2py.gluon.rocket.Connection.fileno web2py.gluon.rocket.Connection-class.html#fileno +web2py.gluon.rocket.Connection.socket web2py.gluon.rocket.Connection-class.html#socket +web2py.gluon.rocket.Connection.client_addr web2py.gluon.rocket.Connection-class.html#client_addr +web2py.gluon.rocket.Connection.sendall web2py.gluon.rocket.Connection-class.html#sendall +web2py.gluon.rocket.FileWrapper web2py.gluon.rocket.FileWrapper-class.html +web2py.gluon.rocket.FileWrapper.__iter__ web2py.gluon.rocket.FileWrapper-class.html#__iter__ +web2py.gluon.rocket.FileWrapper.__init__ web2py.gluon.rocket.FileWrapper-class.html#__init__ +web2py.gluon.rocket.FileWrapper.__getitem__ web2py.gluon.rocket.FileWrapper-class.html#__getitem__ +web2py.gluon.rocket.FileWrapper.next web2py.gluon.rocket.FileWrapper-class.html#next +web2py.gluon.rocket.Headers web2py.gluon.rocket.Headers-class.html +web2py.gluon.rocket.Headers.__delitem__ web2py.gluon.rocket.Headers-class.html#__delitem__ +web2py.gluon.rocket.Headers.setdefault web2py.gluon.rocket.Headers-class.html#setdefault +web2py.gluon.rocket.Headers.__getitem__ web2py.gluon.rocket.Headers-class.html#__getitem__ +web2py.gluon.rocket.Headers.__contains__ web2py.gluon.rocket.Headers-class.html#__contains__ +web2py.gluon.rocket.Headers.keys web2py.gluon.rocket.Headers-class.html#keys +web2py.gluon.rocket.Headers.items web2py.gluon.rocket.Headers-class.html#items +web2py.gluon.rocket.Headers.__str__ web2py.gluon.rocket.Headers-class.html#__str__ +web2py.gluon.rocket.Headers.get_all web2py.gluon.rocket.Headers-class.html#get_all +web2py.gluon.rocket.Headers.add_header web2py.gluon.rocket.Headers-class.html#add_header +web2py.gluon.rocket.Headers.__setitem__ web2py.gluon.rocket.Headers-class.html#__setitem__ +web2py.gluon.rocket.Headers.has_key web2py.gluon.rocket.Headers-class.html#has_key +web2py.gluon.rocket.Headers.values web2py.gluon.rocket.Headers-class.html#values +web2py.gluon.rocket.Headers.__len__ web2py.gluon.rocket.Headers-class.html#__len__ +web2py.gluon.rocket.Headers.get web2py.gluon.rocket.Headers-class.html#get +web2py.gluon.rocket.Headers.__init__ web2py.gluon.rocket.Headers-class.html#__init__ +web2py.gluon.rocket.Headers.__repr__ web2py.gluon.rocket.Headers-class.html#__repr__ +web2py.gluon.rocket.Listener web2py.gluon.rocket.Listener-class.html +web2py.gluon.rocket.Listener.run web2py.gluon.rocket.Listener-class.html#run +web2py.gluon.rocket.Listener.__init__ web2py.gluon.rocket.Listener-class.html#__init__ +web2py.gluon.rocket.Listener.wrap_socket web2py.gluon.rocket.Listener-class.html#wrap_socket +web2py.gluon.rocket.Monitor web2py.gluon.rocket.Monitor-class.html +web2py.gluon.rocket.Monitor.run web2py.gluon.rocket.Monitor-class.html#run +web2py.gluon.rocket.Monitor.__init__ web2py.gluon.rocket.Monitor-class.html#__init__ +web2py.gluon.rocket.Monitor.stop web2py.gluon.rocket.Monitor-class.html#stop +web2py.gluon.rocket.NullHandler web2py.gluon.rocket.NullHandler-class.html +web2py.gluon.rocket.NullHandler.emit web2py.gluon.rocket.NullHandler-class.html#emit +web2py.gluon.rocket.Rocket web2py.gluon.rocket.Rocket-class.html +web2py.gluon.rocket.Rocket._sigterm web2py.gluon.rocket.Rocket-class.html#_sigterm +web2py.gluon.rocket.Rocket.stop web2py.gluon.rocket.Rocket-class.html#stop +web2py.gluon.rocket.Rocket._sighup web2py.gluon.rocket.Rocket-class.html#_sighup +web2py.gluon.rocket.Rocket.start web2py.gluon.rocket.Rocket-class.html#start +web2py.gluon.rocket.Rocket.__init__ web2py.gluon.rocket.Rocket-class.html#__init__ +web2py.gluon.rocket.Rocket.restart web2py.gluon.rocket.Rocket-class.html#restart +web2py.gluon.rocket.SSLError web2py.gluon.rocket.SSLError-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.rocket.SocketClosed web2py.gluon.rocket.SocketClosed-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.rocket.SocketTimeout web2py.gluon.rocket.SocketTimeout-class.html +exceptions.Exception.__init__ exceptions.Exception-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.rocket.ThreadPool web2py.gluon.rocket.ThreadPool-class.html +web2py.gluon.rocket.ThreadPool.stop web2py.gluon.rocket.ThreadPool-class.html#stop +web2py.gluon.rocket.ThreadPool.grow web2py.gluon.rocket.ThreadPool-class.html#grow +web2py.gluon.rocket.ThreadPool.start web2py.gluon.rocket.ThreadPool-class.html#start +web2py.gluon.rocket.ThreadPool.dynamic_resize web2py.gluon.rocket.ThreadPool-class.html#dynamic_resize +web2py.gluon.rocket.ThreadPool.bring_out_your_dead web2py.gluon.rocket.ThreadPool-class.html#bring_out_your_dead +web2py.gluon.rocket.ThreadPool.shrink web2py.gluon.rocket.ThreadPool-class.html#shrink +web2py.gluon.rocket.ThreadPool.__init__ web2py.gluon.rocket.ThreadPool-class.html#__init__ +web2py.gluon.rocket.WSGIWorker web2py.gluon.rocket.WSGIWorker-class.html +web2py.gluon.rocket.WSGIWorker.start_response web2py.gluon.rocket.WSGIWorker-class.html#start_response +web2py.gluon.rocket.Worker.read_request_line web2py.gluon.rocket.Worker-class.html#read_request_line +web2py.gluon.rocket.WSGIWorker.run_app web2py.gluon.rocket.WSGIWorker-class.html#run_app +web2py.gluon.rocket.WSGIWorker.write_warning web2py.gluon.rocket.WSGIWorker-class.html#write_warning +web2py.gluon.rocket.WSGIWorker.__init__ web2py.gluon.rocket.WSGIWorker-class.html#__init__ +web2py.gluon.rocket.WSGIWorker.write web2py.gluon.rocket.WSGIWorker-class.html#write +web2py.gluon.rocket.Worker._read_request_line_jython web2py.gluon.rocket.Worker-class.html#_read_request_line_jython +web2py.gluon.rocket.Worker.send_response web2py.gluon.rocket.Worker-class.html#send_response +web2py.gluon.rocket.Worker.run web2py.gluon.rocket.Worker-class.html#run +web2py.gluon.rocket.WSGIWorker.build_environ web2py.gluon.rocket.WSGIWorker-class.html#build_environ +web2py.gluon.rocket.Worker._handleError web2py.gluon.rocket.Worker-class.html#_handleError +web2py.gluon.rocket.WSGIWorker.send_headers web2py.gluon.rocket.WSGIWorker-class.html#send_headers +web2py.gluon.rocket.Worker.kill web2py.gluon.rocket.Worker-class.html#kill +web2py.gluon.rocket.Worker.read_headers web2py.gluon.rocket.Worker-class.html#read_headers +web2py.gluon.rocket.Worker web2py.gluon.rocket.Worker-class.html +web2py.gluon.rocket.Worker.read_request_line web2py.gluon.rocket.Worker-class.html#read_request_line +web2py.gluon.rocket.Worker.run_app web2py.gluon.rocket.Worker-class.html#run_app +web2py.gluon.rocket.Worker.kill web2py.gluon.rocket.Worker-class.html#kill +web2py.gluon.rocket.Worker.__init__ web2py.gluon.rocket.Worker-class.html#__init__ +web2py.gluon.rocket.Worker._read_request_line_jython web2py.gluon.rocket.Worker-class.html#_read_request_line_jython +web2py.gluon.rocket.Worker.send_response web2py.gluon.rocket.Worker-class.html#send_response +web2py.gluon.rocket.Worker.run web2py.gluon.rocket.Worker-class.html#run +web2py.gluon.rocket.Worker._handleError web2py.gluon.rocket.Worker-class.html#_handleError +web2py.gluon.rocket.Worker.read_headers web2py.gluon.rocket.Worker-class.html#read_headers +web2py.gluon.sanitizer.XssCleaner web2py.gluon.sanitizer.XssCleaner-class.html +web2py.gluon.sanitizer.XssCleaner.xtags web2py.gluon.sanitizer.XssCleaner-class.html#xtags +web2py.gluon.sanitizer.XssCleaner.handle_data web2py.gluon.sanitizer.XssCleaner-class.html#handle_data +web2py.gluon.sanitizer.XssCleaner.handle_charref web2py.gluon.sanitizer.XssCleaner-class.html#handle_charref +web2py.gluon.sanitizer.XssCleaner.strip web2py.gluon.sanitizer.XssCleaner-class.html#strip +web2py.gluon.sanitizer.XssCleaner.unknown_starttag web2py.gluon.sanitizer.XssCleaner-class.html#unknown_starttag +web2py.gluon.sanitizer.XssCleaner.handle_entityref web2py.gluon.sanitizer.XssCleaner-class.html#handle_entityref +web2py.gluon.sanitizer.XssCleaner.handle_comment web2py.gluon.sanitizer.XssCleaner-class.html#handle_comment +web2py.gluon.sanitizer.XssCleaner.handle_starttag web2py.gluon.sanitizer.XssCleaner-class.html#handle_starttag +web2py.gluon.sanitizer.XssCleaner.__init__ web2py.gluon.sanitizer.XssCleaner-class.html#__init__ +web2py.gluon.sanitizer.XssCleaner.url_is_acceptable web2py.gluon.sanitizer.XssCleaner-class.html#url_is_acceptable +web2py.gluon.sanitizer.XssCleaner.handle_endtag web2py.gluon.sanitizer.XssCleaner-class.html#handle_endtag +web2py.gluon.sanitizer.XssCleaner.unknown_endtag web2py.gluon.sanitizer.XssCleaner-class.html#unknown_endtag +web2py.gluon.sqlhtml.AutocompleteWidget web2py.gluon.sqlhtml.AutocompleteWidget-class.html +web2py.gluon.sqlhtml.AutocompleteWidget.callback web2py.gluon.sqlhtml.AutocompleteWidget-class.html#callback +web2py.gluon.sqlhtml.AutocompleteWidget.__call__ web2py.gluon.sqlhtml.AutocompleteWidget-class.html#__call__ +web2py.gluon.sqlhtml.AutocompleteWidget.__init__ web2py.gluon.sqlhtml.AutocompleteWidget-class.html#__init__ +web2py.gluon.sqlhtml.BooleanWidget web2py.gluon.sqlhtml.BooleanWidget-class.html +web2py.gluon.sqlhtml.BooleanWidget.widget web2py.gluon.sqlhtml.BooleanWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.CheckboxesWidget web2py.gluon.sqlhtml.CheckboxesWidget-class.html +web2py.gluon.sqlhtml.CheckboxesWidget.widget web2py.gluon.sqlhtml.CheckboxesWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.OptionsWidget.has_options web2py.gluon.sqlhtml.OptionsWidget-class.html#has_options +web2py.gluon.sqlhtml.DateWidget web2py.gluon.sqlhtml.DateWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.DatetimeWidget web2py.gluon.sqlhtml.DatetimeWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.DecimalWidget web2py.gluon.sqlhtml.DecimalWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.DoubleWidget web2py.gluon.sqlhtml.DoubleWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.FormWidget web2py.gluon.sqlhtml.FormWidget-class.html +web2py.gluon.sqlhtml.FormWidget.widget web2py.gluon.sqlhtml.FormWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.IntegerWidget web2py.gluon.sqlhtml.IntegerWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.ListWidget web2py.gluon.sqlhtml.ListWidget-class.html +web2py.gluon.sqlhtml.ListWidget.widget web2py.gluon.sqlhtml.ListWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.MultipleOptionsWidget web2py.gluon.sqlhtml.MultipleOptionsWidget-class.html +web2py.gluon.sqlhtml.MultipleOptionsWidget.widget web2py.gluon.sqlhtml.MultipleOptionsWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.OptionsWidget.has_options web2py.gluon.sqlhtml.OptionsWidget-class.html#has_options +web2py.gluon.sqlhtml.OptionsWidget web2py.gluon.sqlhtml.OptionsWidget-class.html +web2py.gluon.sqlhtml.OptionsWidget.widget web2py.gluon.sqlhtml.OptionsWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.OptionsWidget.has_options web2py.gluon.sqlhtml.OptionsWidget-class.html#has_options +web2py.gluon.sqlhtml.PasswordWidget web2py.gluon.sqlhtml.PasswordWidget-class.html +web2py.gluon.sqlhtml.PasswordWidget.widget web2py.gluon.sqlhtml.PasswordWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.PasswordWidget.DEFAULT_PASSWORD_DISPLAY web2py.gluon.sqlhtml.PasswordWidget-class.html#DEFAULT_PASSWORD_DISPLAY +web2py.gluon.sqlhtml.RadioWidget web2py.gluon.sqlhtml.RadioWidget-class.html +web2py.gluon.sqlhtml.RadioWidget.widget web2py.gluon.sqlhtml.RadioWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.OptionsWidget.has_options web2py.gluon.sqlhtml.OptionsWidget-class.html#has_options +web2py.gluon.sqlhtml.SQLFORM web2py.gluon.sqlhtml.SQLFORM-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.FORM.process web2py.gluon.html.FORM-class.html#process +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.FORM.tag web2py.gluon.html.FORM-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.sqlhtml.SQLFORM.FIELDNAME_REQUEST_DELETE web2py.gluon.sqlhtml.SQLFORM-class.html#FIELDNAME_REQUEST_DELETE +web2py.gluon.html.DIV._fixup web2py.gluon.html.DIV-class.html#_fixup +web2py.gluon.sqlhtml.SQLFORM.createform web2py.gluon.sqlhtml.SQLFORM-class.html#createform +web2py.gluon.sqlhtml.SQLFORM.__init__ web2py.gluon.sqlhtml.SQLFORM-class.html#__init__ +web2py.gluon.html.FORM.xml web2py.gluon.html.FORM-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.sqlhtml.SQLFORM.ID_LABEL_SUFFIX web2py.gluon.sqlhtml.SQLFORM-class.html#ID_LABEL_SUFFIX +web2py.gluon.sqlhtml.SQLFORM.factory web2py.gluon.sqlhtml.SQLFORM-class.html#factory +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.sqlhtml.SQLFORM.ID_ROW_SUFFIX web2py.gluon.sqlhtml.SQLFORM-class.html#ID_ROW_SUFFIX +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.sqlhtml.SQLFORM.widgets web2py.gluon.sqlhtml.SQLFORM-class.html#widgets +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.sqlhtml.SQLFORM.FIELDKEY_DELETE_RECORD web2py.gluon.sqlhtml.SQLFORM-class.html#FIELDKEY_DELETE_RECORD +web2py.gluon.html.FORM._postprocessing web2py.gluon.html.FORM-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.FORM.validate web2py.gluon.html.FORM-class.html#validate +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.sqlhtml.SQLFORM.accepts web2py.gluon.sqlhtml.SQLFORM-class.html#accepts +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.FORM.hidden_fields web2py.gluon.html.FORM-class.html#hidden_fields +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.sqlhtml.SQLTABLE web2py.gluon.sqlhtml.SQLTABLE-class.html +web2py.gluon.html.DIV.regex_id web2py.gluon.html.DIV-class.html#regex_id +web2py.gluon.html.DIV._validate web2py.gluon.html.DIV-class.html#_validate +web2py.gluon.html.DIV.regex_tag web2py.gluon.html.DIV-class.html#regex_tag +web2py.gluon.html.DIV.__str__ web2py.gluon.html.DIV-class.html#__str__ +web2py.gluon.html.DIV.sibling web2py.gluon.html.DIV-class.html#sibling +web2py.gluon.html.TABLE.tag web2py.gluon.html.TABLE-class.html#tag +web2py.gluon.html.DIV.flatten web2py.gluon.html.DIV-class.html#flatten +web2py.gluon.html.TABLE._fixup web2py.gluon.html.TABLE-class.html#_fixup +web2py.gluon.html.DIV.append web2py.gluon.html.DIV-class.html#append +web2py.gluon.html.DIV.xml web2py.gluon.html.DIV-class.html#xml +web2py.gluon.html.DIV._setnode web2py.gluon.html.DIV-class.html#_setnode +web2py.gluon.sqlhtml.SQLTABLE.style web2py.gluon.sqlhtml.SQLTABLE-class.html#style +web2py.gluon.html.DIV._xml web2py.gluon.html.DIV-class.html#_xml +web2py.gluon.sqlhtml.SQLTABLE.__init__ web2py.gluon.sqlhtml.SQLTABLE-class.html#__init__ +web2py.gluon.html.DIV.siblings web2py.gluon.html.DIV-class.html#siblings +web2py.gluon.html.DIV.__len__ web2py.gluon.html.DIV-class.html#__len__ +web2py.gluon.html.DIV.elements web2py.gluon.html.DIV-class.html#elements +web2py.gluon.html.DIV.__getitem__ web2py.gluon.html.DIV-class.html#__getitem__ +web2py.gluon.html.DIV.insert web2py.gluon.html.DIV-class.html#insert +web2py.gluon.html.DIV._postprocessing web2py.gluon.html.DIV-class.html#_postprocessing +web2py.gluon.html.DIV.update web2py.gluon.html.DIV-class.html#update +web2py.gluon.html.DIV.__setitem__ web2py.gluon.html.DIV-class.html#__setitem__ +web2py.gluon.html.DIV.__delitem__ web2py.gluon.html.DIV-class.html#__delitem__ +web2py.gluon.html.DIV.regex_class web2py.gluon.html.DIV-class.html#regex_class +web2py.gluon.html.DIV.__nonzero__ web2py.gluon.html.DIV-class.html#__nonzero__ +web2py.gluon.html.DIV._traverse web2py.gluon.html.DIV-class.html#_traverse +web2py.gluon.html.DIV.element web2py.gluon.html.DIV-class.html#element +web2py.gluon.html.DIV._wrap_components web2py.gluon.html.DIV-class.html#_wrap_components +web2py.gluon.html.DIV.regex_attr web2py.gluon.html.DIV-class.html#regex_attr +web2py.gluon.sqlhtml.StringWidget web2py.gluon.sqlhtml.StringWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.TextWidget web2py.gluon.sqlhtml.TextWidget-class.html +web2py.gluon.sqlhtml.TextWidget.widget web2py.gluon.sqlhtml.TextWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.TimeWidget web2py.gluon.sqlhtml.TimeWidget-class.html +web2py.gluon.sqlhtml.StringWidget.widget web2py.gluon.sqlhtml.StringWidget-class.html#widget +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.UploadWidget web2py.gluon.sqlhtml.UploadWidget-class.html +web2py.gluon.sqlhtml.UploadWidget.represent web2py.gluon.sqlhtml.UploadWidget-class.html#represent +web2py.gluon.sqlhtml.UploadWidget.widget web2py.gluon.sqlhtml.UploadWidget-class.html#widget +web2py.gluon.sqlhtml.UploadWidget.GENERIC_DESCRIPTION web2py.gluon.sqlhtml.UploadWidget-class.html#GENERIC_DESCRIPTION +web2py.gluon.sqlhtml.UploadWidget.DELETE_FILE web2py.gluon.sqlhtml.UploadWidget-class.html#DELETE_FILE +web2py.gluon.sqlhtml.UploadWidget.is_image web2py.gluon.sqlhtml.UploadWidget-class.html#is_image +web2py.gluon.sqlhtml.UploadWidget.DEFAULT_WIDTH web2py.gluon.sqlhtml.UploadWidget-class.html#DEFAULT_WIDTH +web2py.gluon.sqlhtml.FormWidget._attributes web2py.gluon.sqlhtml.FormWidget-class.html#_attributes +web2py.gluon.sqlhtml.UploadWidget.ID_DELETE_SUFFIX web2py.gluon.sqlhtml.UploadWidget-class.html#ID_DELETE_SUFFIX +web2py.gluon.storage.List web2py.gluon.storage.List-class.html +web2py.gluon.storage.List.__call__ web2py.gluon.storage.List-class.html#__call__ +web2py.gluon.storage.Messages web2py.gluon.storage.Messages-class.html +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.storage.Messages.__init__ web2py.gluon.storage.Messages-class.html#__init__ +web2py.gluon.storage.Messages.__setattr__ web2py.gluon.storage.Messages-class.html#__setattr__ +web2py.gluon.storage.Messages.__getattr__ web2py.gluon.storage.Messages-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.storage.Settings web2py.gluon.storage.Settings-class.html +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.storage.Settings.__setattr__ web2py.gluon.storage.Settings-class.html#__setattr__ +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.storage.Storage web2py.gluon.storage.Storage-class.html +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.storage.Storage.__getattr__ web2py.gluon.storage.Storage-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.storage.StorageList web2py.gluon.storage.StorageList-class.html +web2py.gluon.storage.Storage.getlist web2py.gluon.storage.Storage-class.html#getlist +web2py.gluon.storage.Storage.__setattr__ web2py.gluon.storage.Storage-class.html#__setattr__ +web2py.gluon.storage.StorageList.__getattr__ web2py.gluon.storage.StorageList-class.html#__getattr__ +web2py.gluon.storage.Storage.__getstate__ web2py.gluon.storage.Storage-class.html#__getstate__ +web2py.gluon.storage.Storage.__setstate__ web2py.gluon.storage.Storage-class.html#__setstate__ +web2py.gluon.storage.Storage.getlast web2py.gluon.storage.Storage-class.html#getlast +web2py.gluon.storage.Storage.__delattr__ web2py.gluon.storage.Storage-class.html#__delattr__ +web2py.gluon.storage.Storage.__repr__ web2py.gluon.storage.Storage-class.html#__repr__ +web2py.gluon.storage.Storage.getfirst web2py.gluon.storage.Storage-class.html#getfirst +web2py.gluon.template.BlockNode web2py.gluon.template.BlockNode-class.html +web2py.gluon.template.BlockNode.extend web2py.gluon.template.BlockNode-class.html#extend +web2py.gluon.template.BlockNode.__str__ web2py.gluon.template.BlockNode-class.html#__str__ +web2py.gluon.template.BlockNode.append web2py.gluon.template.BlockNode-class.html#append +web2py.gluon.template.BlockNode.output web2py.gluon.template.BlockNode-class.html#output +web2py.gluon.template.BlockNode.__init__ web2py.gluon.template.BlockNode-class.html#__init__ +web2py.gluon.template.BlockNode.__repr__ web2py.gluon.template.BlockNode-class.html#__repr__ +web2py.gluon.template.Content web2py.gluon.template.Content-class.html +web2py.gluon.template.Content.insert web2py.gluon.template.Content-class.html#insert +web2py.gluon.template.Content.extend web2py.gluon.template.Content-class.html#extend +web2py.gluon.template.Content.__str__ web2py.gluon.template.Content-class.html#__str__ +web2py.gluon.template.Content.clear_content web2py.gluon.template.Content-class.html#clear_content +web2py.gluon.template.Content.append web2py.gluon.template.Content-class.html#append +web2py.gluon.template.Content._insert web2py.gluon.template.Content-class.html#_insert +web2py.gluon.template.BlockNode.output web2py.gluon.template.BlockNode-class.html#output +web2py.gluon.template.Content.__init__ web2py.gluon.template.Content-class.html#__init__ +web2py.gluon.template.BlockNode.__repr__ web2py.gluon.template.BlockNode-class.html#__repr__ +web2py.gluon.template.Node web2py.gluon.template.Node-class.html +web2py.gluon.template.Node.__str__ web2py.gluon.template.Node-class.html#__str__ +web2py.gluon.template.Node.__init__ web2py.gluon.template.Node-class.html#__init__ +web2py.gluon.template.SuperNode web2py.gluon.template.SuperNode-class.html +web2py.gluon.template.SuperNode.__str__ web2py.gluon.template.SuperNode-class.html#__str__ +web2py.gluon.template.SuperNode.__repr__ web2py.gluon.template.SuperNode-class.html#__repr__ +web2py.gluon.template.SuperNode.__init__ web2py.gluon.template.SuperNode-class.html#__init__ +web2py.gluon.template.TemplateParser web2py.gluon.template.TemplateParser-class.html +web2py.gluon.template.TemplateParser.reindent web2py.gluon.template.TemplateParser-class.html#reindent +web2py.gluon.template.TemplateParser.__str__ web2py.gluon.template.TemplateParser-class.html#__str__ +web2py.gluon.template.TemplateParser.parse web2py.gluon.template.TemplateParser-class.html#parse +web2py.gluon.template.TemplateParser.__init__ web2py.gluon.template.TemplateParser-class.html#__init__ +web2py.gluon.template.TemplateParser.extend web2py.gluon.template.TemplateParser-class.html#extend +web2py.gluon.template.TemplateParser.r_multiline web2py.gluon.template.TemplateParser-class.html#r_multiline +web2py.gluon.template.TemplateParser.re_unblock web2py.gluon.template.TemplateParser-class.html#re_unblock +web2py.gluon.template.TemplateParser.include web2py.gluon.template.TemplateParser-class.html#include +web2py.gluon.template.TemplateParser.re_pass web2py.gluon.template.TemplateParser-class.html#re_pass +web2py.gluon.template.TemplateParser.__unicode__ web2py.gluon.template.TemplateParser-class.html#__unicode__ +web2py.gluon.template.TemplateParser.r_tag web2py.gluon.template.TemplateParser-class.html#r_tag +web2py.gluon.template.TemplateParser.to_string web2py.gluon.template.TemplateParser-class.html#to_string +web2py.gluon.template.TemplateParser._raise_error web2py.gluon.template.TemplateParser-class.html#_raise_error +web2py.gluon.template.TemplateParser.re_block web2py.gluon.template.TemplateParser-class.html#re_block +web2py.gluon.template.TemplateParser._get_file_text web2py.gluon.template.TemplateParser-class.html#_get_file_text +web2py.gluon.tools.Auth web2py.gluon.tools.Auth-class.html +web2py.gluon.tools.Auth.profile web2py.gluon.tools.Auth-class.html#profile +web2py.gluon.tools.Auth.retrieve_username web2py.gluon.tools.Auth-class.html#retrieve_username +web2py.gluon.tools.Auth.add_permission web2py.gluon.tools.Auth-class.html#add_permission +web2py.gluon.tools.Auth.requires_membership web2py.gluon.tools.Auth-class.html#requires_membership +web2py.gluon.tools.Auth.add_group web2py.gluon.tools.Auth-class.html#add_group +web2py.gluon.tools.Auth.requires_permission web2py.gluon.tools.Auth-class.html#requires_permission +web2py.gluon.tools.Auth.random_password web2py.gluon.tools.Auth-class.html#random_password +web2py.gluon.tools.Auth.verify_email web2py.gluon.tools.Auth-class.html#verify_email +web2py.gluon.tools.Auth.id_group web2py.gluon.tools.Auth-class.html#id_group +web2py.gluon.tools.Auth.cas_login web2py.gluon.tools.Auth-class.html#cas_login +web2py.gluon.tools.Auth.define_tables web2py.gluon.tools.Auth-class.html#define_tables +web2py.gluon.tools.Auth.cas_validate web2py.gluon.tools.Auth-class.html#cas_validate +web2py.gluon.tools.Auth.del_group web2py.gluon.tools.Auth-class.html#del_group +web2py.gluon.tools.Auth.user_id web2py.gluon.tools.Auth-class.html#user_id +web2py.gluon.tools.Auth.del_permission web2py.gluon.tools.Auth-class.html#del_permission +web2py.gluon.tools.Auth._HTTP web2py.gluon.tools.Auth-class.html#_HTTP +web2py.gluon.tools.Auth.accessible_query web2py.gluon.tools.Auth-class.html#accessible_query +web2py.gluon.tools.Auth.login_bare web2py.gluon.tools.Auth-class.html#login_bare +web2py.gluon.tools.Auth.is_logged_in web2py.gluon.tools.Auth-class.html#is_logged_in +web2py.gluon.tools.Auth.basic web2py.gluon.tools.Auth-class.html#basic +web2py.gluon.tools.Auth.__call__ web2py.gluon.tools.Auth-class.html#__call__ +web2py.gluon.tools.Auth.requires_signature web2py.gluon.tools.Auth-class.html#requires_signature +web2py.gluon.tools.Auth.not_authorized web2py.gluon.tools.Auth-class.html#not_authorized +web2py.gluon.tools.Auth.reset_password_deprecated web2py.gluon.tools.Auth-class.html#reset_password_deprecated +web2py.gluon.tools.Auth.__get_migrate web2py.gluon.tools.Auth-class.html#__get_migrate +web2py.gluon.tools.Auth.is_impersonating web2py.gluon.tools.Auth-class.html#is_impersonating +web2py.gluon.tools.Auth.has_membership web2py.gluon.tools.Auth-class.html#has_membership +web2py.gluon.tools.Auth.log_event web2py.gluon.tools.Auth-class.html#log_event +web2py.gluon.tools.Auth._get_user_id web2py.gluon.tools.Auth-class.html#_get_user_id +web2py.gluon.tools.Auth.has_permission web2py.gluon.tools.Auth-class.html#has_permission +web2py.gluon.tools.Auth.logout web2py.gluon.tools.Auth-class.html#logout +web2py.gluon.tools.Auth.groups web2py.gluon.tools.Auth-class.html#groups +web2py.gluon.tools.Auth.user_group web2py.gluon.tools.Auth-class.html#user_group +web2py.gluon.tools.Auth.add_membership web2py.gluon.tools.Auth-class.html#add_membership +web2py.gluon.tools.Auth.retrieve_password web2py.gluon.tools.Auth-class.html#retrieve_password +web2py.gluon.tools.Auth.url web2py.gluon.tools.Auth-class.html#url +web2py.gluon.tools.Auth.get_or_create_user web2py.gluon.tools.Auth-class.html#get_or_create_user +web2py.gluon.tools.Auth.register web2py.gluon.tools.Auth-class.html#register +web2py.gluon.tools.Auth.reset_password web2py.gluon.tools.Auth-class.html#reset_password +web2py.gluon.tools.Auth.navbar web2py.gluon.tools.Auth-class.html#navbar +web2py.gluon.tools.Auth.requires_login web2py.gluon.tools.Auth-class.html#requires_login +web2py.gluon.tools.Auth.__init__ web2py.gluon.tools.Auth-class.html#__init__ +web2py.gluon.tools.Auth.change_password web2py.gluon.tools.Auth-class.html#change_password +web2py.gluon.tools.Auth.del_membership web2py.gluon.tools.Auth-class.html#del_membership +web2py.gluon.tools.Auth.impersonate web2py.gluon.tools.Auth-class.html#impersonate +web2py.gluon.tools.Auth.login web2py.gluon.tools.Auth-class.html#login +web2py.gluon.tools.Auth.request_reset_password web2py.gluon.tools.Auth-class.html#request_reset_password +web2py.gluon.tools.Auth.requires web2py.gluon.tools.Auth-class.html#requires +web2py.gluon.tools.Crud web2py.gluon.tools.Crud-class.html +web2py.gluon.tools.Crud.get_format web2py.gluon.tools.Crud-class.html#get_format +web2py.gluon.tools.Crud.archive web2py.gluon.tools.Crud-class.html#archive +web2py.gluon.tools.Crud.__init__ web2py.gluon.tools.Crud-class.html#__init__ +web2py.gluon.tools.Crud.tables web2py.gluon.tools.Crud-class.html#tables +web2py.gluon.tools.Crud.rows web2py.gluon.tools.Crud-class.html#rows +web2py.gluon.tools.Crud.create web2py.gluon.tools.Crud-class.html#create +web2py.gluon.tools.Crud.select web2py.gluon.tools.Crud-class.html#select +web2py.gluon.tools.Crud.__call__ web2py.gluon.tools.Crud-class.html#__call__ +web2py.gluon.tools.Crud.get_query web2py.gluon.tools.Crud-class.html#get_query +web2py.gluon.tools.Crud.read web2py.gluon.tools.Crud-class.html#read +web2py.gluon.tools.Crud.update web2py.gluon.tools.Crud-class.html#update +web2py.gluon.tools.Crud.log_event web2py.gluon.tools.Crud-class.html#log_event +web2py.gluon.tools.Crud.search web2py.gluon.tools.Crud-class.html#search +web2py.gluon.tools.Crud.url web2py.gluon.tools.Crud-class.html#url +web2py.gluon.tools.Crud.has_permission web2py.gluon.tools.Crud-class.html#has_permission +web2py.gluon.tools.Crud.delete web2py.gluon.tools.Crud-class.html#delete +web2py.gluon.tools.Mail web2py.gluon.tools.Mail-class.html +web2py.gluon.tools.Mail.send web2py.gluon.tools.Mail-class.html#send +web2py.gluon.tools.Mail.Attachment web2py.gluon.tools.Mail.Attachment-class.html +web2py.gluon.tools.Mail.__init__ web2py.gluon.tools.Mail-class.html#__init__ +web2py.gluon.tools.Mail.Attachment web2py.gluon.tools.Mail.Attachment-class.html +web2py.gluon.tools.Mail.Attachment.__init__ web2py.gluon.tools.Mail.Attachment-class.html#__init__ +web2py.gluon.tools.PluginManager web2py.gluon.tools.PluginManager-class.html +web2py.gluon.tools.PluginManager.__new__ web2py.gluon.tools.PluginManager-class.html#__new__ +web2py.gluon.tools.PluginManager.__contains__ web2py.gluon.tools.PluginManager-class.html#__contains__ +web2py.gluon.tools.PluginManager.keys web2py.gluon.tools.PluginManager-class.html#keys +web2py.gluon.tools.PluginManager.__getattr__ web2py.gluon.tools.PluginManager-class.html#__getattr__ +web2py.gluon.tools.PluginManager.instances web2py.gluon.tools.PluginManager-class.html#instances +web2py.gluon.tools.PluginManager.__init__ web2py.gluon.tools.PluginManager-class.html#__init__ +web2py.gluon.tools.Recaptcha web2py.gluon.tools.Recaptcha-class.html +web2py.gluon.tools.Recaptcha.VERIFY_SERVER web2py.gluon.tools.Recaptcha-class.html#VERIFY_SERVER +web2py.gluon.tools.Recaptcha._validate web2py.gluon.tools.Recaptcha-class.html#_validate +web2py.gluon.tools.Recaptcha.xml web2py.gluon.tools.Recaptcha-class.html#xml +web2py.gluon.tools.Recaptcha.__init__ web2py.gluon.tools.Recaptcha-class.html#__init__ +web2py.gluon.tools.Recaptcha.API_SERVER web2py.gluon.tools.Recaptcha-class.html#API_SERVER +web2py.gluon.tools.Recaptcha.API_SSL_SERVER web2py.gluon.tools.Recaptcha-class.html#API_SSL_SERVER +web2py.gluon.tools.Service web2py.gluon.tools.Service-class.html +web2py.gluon.tools.Service.__init__ web2py.gluon.tools.Service-class.html#__init__ +web2py.gluon.tools.Service.xml web2py.gluon.tools.Service-class.html#xml +web2py.gluon.tools.Service.amfrpc3 web2py.gluon.tools.Service-class.html#amfrpc3 +web2py.gluon.tools.Service.json web2py.gluon.tools.Service-class.html#json +web2py.gluon.tools.Service.serve_xmlrpc web2py.gluon.tools.Service-class.html#serve_xmlrpc +web2py.gluon.tools.Service.csv web2py.gluon.tools.Service-class.html#csv +web2py.gluon.tools.Service.soap web2py.gluon.tools.Service-class.html#soap +web2py.gluon.tools.Service.JsonRpcException web2py.gluon.tools.Service.JsonRpcException-class.html +web2py.gluon.tools.Service.serve_soap web2py.gluon.tools.Service-class.html#serve_soap +web2py.gluon.tools.Service.run web2py.gluon.tools.Service-class.html#run +web2py.gluon.tools.Service.serve_csv web2py.gluon.tools.Service-class.html#serve_csv +web2py.gluon.tools.Service.xmlrpc web2py.gluon.tools.Service-class.html#xmlrpc +web2py.gluon.tools.Service.serve_run web2py.gluon.tools.Service-class.html#serve_run +web2py.gluon.tools.Service.__call__ web2py.gluon.tools.Service-class.html#__call__ +web2py.gluon.tools.Service.serve_jsonrpc web2py.gluon.tools.Service-class.html#serve_jsonrpc +web2py.gluon.tools.Service.rss web2py.gluon.tools.Service-class.html#rss +web2py.gluon.tools.Service.serve_json web2py.gluon.tools.Service-class.html#serve_json +web2py.gluon.tools.Service.serve_rss web2py.gluon.tools.Service-class.html#serve_rss +web2py.gluon.tools.Service.jsonrpc web2py.gluon.tools.Service-class.html#jsonrpc +web2py.gluon.tools.Service.amfrpc web2py.gluon.tools.Service-class.html#amfrpc +web2py.gluon.tools.Service.serve_amfrpc web2py.gluon.tools.Service-class.html#serve_amfrpc +web2py.gluon.tools.Service.serve_xml web2py.gluon.tools.Service-class.html#serve_xml +web2py.gluon.tools.Service.error web2py.gluon.tools.Service-class.html#error +web2py.gluon.tools.Service.JsonRpcException web2py.gluon.tools.Service.JsonRpcException-class.html +web2py.gluon.tools.Service.JsonRpcException.__init__ web2py.gluon.tools.Service.JsonRpcException-class.html#__init__ +exceptions.Exception.__new__ exceptions.Exception-class.html#__new__ +web2py.gluon.validators.CLEANUP web2py.gluon.validators.CLEANUP-class.html +web2py.gluon.validators.CLEANUP.__call__ web2py.gluon.validators.CLEANUP-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.CLEANUP.__init__ web2py.gluon.validators.CLEANUP-class.html#__init__ +web2py.gluon.validators.CRYPT web2py.gluon.validators.CRYPT-class.html +web2py.gluon.validators.CRYPT.__call__ web2py.gluon.validators.CRYPT-class.html#__call__ +web2py.gluon.validators.CRYPT.__init__ web2py.gluon.validators.CRYPT-class.html#__init__ +web2py.gluon.validators.IS_ALPHANUMERIC web2py.gluon.validators.IS_ALPHANUMERIC-class.html +web2py.gluon.validators.IS_MATCH.__call__ web2py.gluon.validators.IS_MATCH-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_ALPHANUMERIC.__init__ web2py.gluon.validators.IS_ALPHANUMERIC-class.html#__init__ +web2py.gluon.validators.IS_DATE web2py.gluon.validators.IS_DATE-class.html +web2py.gluon.validators.IS_DATE.__call__ web2py.gluon.validators.IS_DATE-class.html#__call__ +web2py.gluon.validators.IS_DATE.formatter web2py.gluon.validators.IS_DATE-class.html#formatter +web2py.gluon.validators.IS_DATE.__init__ web2py.gluon.validators.IS_DATE-class.html#__init__ +web2py.gluon.validators.IS_DATETIME web2py.gluon.validators.IS_DATETIME-class.html +web2py.gluon.validators.IS_DATETIME.formatter web2py.gluon.validators.IS_DATETIME-class.html#formatter +web2py.gluon.validators.IS_DATETIME.__call__ web2py.gluon.validators.IS_DATETIME-class.html#__call__ +web2py.gluon.validators.IS_DATETIME.isodatetime web2py.gluon.validators.IS_DATETIME-class.html#isodatetime +web2py.gluon.validators.IS_DATETIME.__init__ web2py.gluon.validators.IS_DATETIME-class.html#__init__ +web2py.gluon.validators.IS_DATETIME.nice web2py.gluon.validators.IS_DATETIME-class.html#nice +web2py.gluon.validators.IS_DATETIME_IN_RANGE web2py.gluon.validators.IS_DATETIME_IN_RANGE-class.html +web2py.gluon.validators.IS_DATETIME.isodatetime web2py.gluon.validators.IS_DATETIME-class.html#isodatetime +web2py.gluon.validators.IS_DATETIME_IN_RANGE.__call__ web2py.gluon.validators.IS_DATETIME_IN_RANGE-class.html#__call__ +web2py.gluon.validators.IS_DATETIME.formatter web2py.gluon.validators.IS_DATETIME-class.html#formatter +web2py.gluon.validators.IS_DATETIME_IN_RANGE.__init__ web2py.gluon.validators.IS_DATETIME_IN_RANGE-class.html#__init__ +web2py.gluon.validators.IS_DATETIME.nice web2py.gluon.validators.IS_DATETIME-class.html#nice +web2py.gluon.validators.IS_DATE_IN_RANGE web2py.gluon.validators.IS_DATE_IN_RANGE-class.html +web2py.gluon.validators.IS_DATE_IN_RANGE.__call__ web2py.gluon.validators.IS_DATE_IN_RANGE-class.html#__call__ +web2py.gluon.validators.IS_DATE.formatter web2py.gluon.validators.IS_DATE-class.html#formatter +web2py.gluon.validators.IS_DATE_IN_RANGE.__init__ web2py.gluon.validators.IS_DATE_IN_RANGE-class.html#__init__ +web2py.gluon.validators.IS_DECIMAL_IN_RANGE web2py.gluon.validators.IS_DECIMAL_IN_RANGE-class.html +web2py.gluon.validators.IS_DECIMAL_IN_RANGE.__call__ web2py.gluon.validators.IS_DECIMAL_IN_RANGE-class.html#__call__ +web2py.gluon.validators.IS_DECIMAL_IN_RANGE.formatter web2py.gluon.validators.IS_DECIMAL_IN_RANGE-class.html#formatter +web2py.gluon.validators.IS_DECIMAL_IN_RANGE.__init__ web2py.gluon.validators.IS_DECIMAL_IN_RANGE-class.html#__init__ +web2py.gluon.validators.IS_EMAIL web2py.gluon.validators.IS_EMAIL-class.html +web2py.gluon.validators.IS_EMAIL.regex web2py.gluon.validators.IS_EMAIL-class.html#regex +web2py.gluon.validators.IS_EMAIL.regex_proposed_but_failed web2py.gluon.validators.IS_EMAIL-class.html#regex_proposed_but_failed +web2py.gluon.validators.IS_EMAIL.__call__ web2py.gluon.validators.IS_EMAIL-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_EMAIL.__init__ web2py.gluon.validators.IS_EMAIL-class.html#__init__ +web2py.gluon.validators.IS_EMPTY_OR web2py.gluon.validators.IS_EMPTY_OR-class.html +web2py.gluon.validators.IS_EMPTY_OR.set_self_id web2py.gluon.validators.IS_EMPTY_OR-class.html#set_self_id +web2py.gluon.validators.IS_EMPTY_OR._options web2py.gluon.validators.IS_EMPTY_OR-class.html#_options +web2py.gluon.validators.IS_EMPTY_OR.__call__ web2py.gluon.validators.IS_EMPTY_OR-class.html#__call__ +web2py.gluon.validators.IS_EMPTY_OR.formatter web2py.gluon.validators.IS_EMPTY_OR-class.html#formatter +web2py.gluon.validators.IS_EMPTY_OR.__init__ web2py.gluon.validators.IS_EMPTY_OR-class.html#__init__ +web2py.gluon.validators.IS_EQUAL_TO web2py.gluon.validators.IS_EQUAL_TO-class.html +web2py.gluon.validators.IS_EQUAL_TO.__call__ web2py.gluon.validators.IS_EQUAL_TO-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_EQUAL_TO.__init__ web2py.gluon.validators.IS_EQUAL_TO-class.html#__init__ +web2py.gluon.validators.IS_EXPR web2py.gluon.validators.IS_EXPR-class.html +web2py.gluon.validators.IS_EXPR.__call__ web2py.gluon.validators.IS_EXPR-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_EXPR.__init__ web2py.gluon.validators.IS_EXPR-class.html#__init__ +web2py.gluon.validators.IS_FLOAT_IN_RANGE web2py.gluon.validators.IS_FLOAT_IN_RANGE-class.html +web2py.gluon.validators.IS_FLOAT_IN_RANGE.__call__ web2py.gluon.validators.IS_FLOAT_IN_RANGE-class.html#__call__ +web2py.gluon.validators.IS_FLOAT_IN_RANGE.formatter web2py.gluon.validators.IS_FLOAT_IN_RANGE-class.html#formatter +web2py.gluon.validators.IS_FLOAT_IN_RANGE.__init__ web2py.gluon.validators.IS_FLOAT_IN_RANGE-class.html#__init__ +web2py.gluon.validators.IS_GENERIC_URL web2py.gluon.validators.IS_GENERIC_URL-class.html +web2py.gluon.validators.IS_GENERIC_URL.__call__ web2py.gluon.validators.IS_GENERIC_URL-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_GENERIC_URL.__init__ web2py.gluon.validators.IS_GENERIC_URL-class.html#__init__ +web2py.gluon.validators.IS_HTTP_URL web2py.gluon.validators.IS_HTTP_URL-class.html +web2py.gluon.validators.IS_HTTP_URL.__call__ web2py.gluon.validators.IS_HTTP_URL-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_HTTP_URL.__init__ web2py.gluon.validators.IS_HTTP_URL-class.html#__init__ +web2py.gluon.validators.IS_IMAGE web2py.gluon.validators.IS_IMAGE-class.html +web2py.gluon.validators.IS_IMAGE.__png web2py.gluon.validators.IS_IMAGE-class.html#__png +web2py.gluon.validators.IS_IMAGE.__jpeg web2py.gluon.validators.IS_IMAGE-class.html#__jpeg +web2py.gluon.validators.IS_IMAGE.__bmp web2py.gluon.validators.IS_IMAGE-class.html#__bmp +web2py.gluon.validators.IS_IMAGE.__call__ web2py.gluon.validators.IS_IMAGE-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_IMAGE.__gif web2py.gluon.validators.IS_IMAGE-class.html#__gif +web2py.gluon.validators.IS_IMAGE.__init__ web2py.gluon.validators.IS_IMAGE-class.html#__init__ +web2py.gluon.validators.IS_INT_IN_RANGE web2py.gluon.validators.IS_INT_IN_RANGE-class.html +web2py.gluon.validators.IS_INT_IN_RANGE.__call__ web2py.gluon.validators.IS_INT_IN_RANGE-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_INT_IN_RANGE.__init__ web2py.gluon.validators.IS_INT_IN_RANGE-class.html#__init__ +web2py.gluon.validators.IS_IN_DB web2py.gluon.validators.IS_IN_DB-class.html +web2py.gluon.validators.IS_IN_DB.build_set web2py.gluon.validators.IS_IN_DB-class.html#build_set +web2py.gluon.validators.IS_IN_DB.set_self_id web2py.gluon.validators.IS_IN_DB-class.html#set_self_id +web2py.gluon.validators.IS_IN_DB.__call__ web2py.gluon.validators.IS_IN_DB-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_IN_DB.options web2py.gluon.validators.IS_IN_DB-class.html#options +web2py.gluon.validators.IS_IN_DB.__init__ web2py.gluon.validators.IS_IN_DB-class.html#__init__ +web2py.gluon.validators.IS_IN_SET web2py.gluon.validators.IS_IN_SET-class.html +web2py.gluon.validators.IS_IN_SET.__call__ web2py.gluon.validators.IS_IN_SET-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_IN_SET.options web2py.gluon.validators.IS_IN_SET-class.html#options +web2py.gluon.validators.IS_IN_SET.__init__ web2py.gluon.validators.IS_IN_SET-class.html#__init__ +web2py.gluon.validators.IS_IN_SUBSET web2py.gluon.validators.IS_IN_SUBSET-class.html +web2py.gluon.validators.IS_IN_SUBSET.__call__ web2py.gluon.validators.IS_IN_SUBSET-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_IN_SET.options web2py.gluon.validators.IS_IN_SET-class.html#options +web2py.gluon.validators.IS_IN_SUBSET.__init__ web2py.gluon.validators.IS_IN_SUBSET-class.html#__init__ +web2py.gluon.validators.IS_IPV4 web2py.gluon.validators.IS_IPV4-class.html +web2py.gluon.validators.IS_IPV4.regex web2py.gluon.validators.IS_IPV4-class.html#regex +web2py.gluon.validators.IS_IPV4.private web2py.gluon.validators.IS_IPV4-class.html#private +web2py.gluon.validators.IS_IPV4.numbers web2py.gluon.validators.IS_IPV4-class.html#numbers +web2py.gluon.validators.IS_IPV4.__call__ web2py.gluon.validators.IS_IPV4-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_IPV4.automatic web2py.gluon.validators.IS_IPV4-class.html#automatic +web2py.gluon.validators.IS_IPV4.__init__ web2py.gluon.validators.IS_IPV4-class.html#__init__ +web2py.gluon.validators.IS_IPV4.localhost web2py.gluon.validators.IS_IPV4-class.html#localhost +web2py.gluon.validators.IS_LENGTH web2py.gluon.validators.IS_LENGTH-class.html +web2py.gluon.validators.IS_LENGTH.__call__ web2py.gluon.validators.IS_LENGTH-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_LENGTH.__init__ web2py.gluon.validators.IS_LENGTH-class.html#__init__ +web2py.gluon.validators.IS_LIST_OF web2py.gluon.validators.IS_LIST_OF-class.html +web2py.gluon.validators.IS_LIST_OF.__call__ web2py.gluon.validators.IS_LIST_OF-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_LIST_OF.__init__ web2py.gluon.validators.IS_LIST_OF-class.html#__init__ +web2py.gluon.validators.IS_LOWER web2py.gluon.validators.IS_LOWER-class.html +web2py.gluon.validators.IS_LOWER.__call__ web2py.gluon.validators.IS_LOWER-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_MATCH web2py.gluon.validators.IS_MATCH-class.html +web2py.gluon.validators.IS_MATCH.__call__ web2py.gluon.validators.IS_MATCH-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_MATCH.__init__ web2py.gluon.validators.IS_MATCH-class.html#__init__ +web2py.gluon.validators.IS_NOT_EMPTY web2py.gluon.validators.IS_NOT_EMPTY-class.html +web2py.gluon.validators.IS_NOT_EMPTY.__call__ web2py.gluon.validators.IS_NOT_EMPTY-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_NOT_EMPTY.__init__ web2py.gluon.validators.IS_NOT_EMPTY-class.html#__init__ +web2py.gluon.validators.IS_NOT_IN_DB web2py.gluon.validators.IS_NOT_IN_DB-class.html +web2py.gluon.validators.IS_NOT_IN_DB.set_self_id web2py.gluon.validators.IS_NOT_IN_DB-class.html#set_self_id +web2py.gluon.validators.IS_NOT_IN_DB.__call__ web2py.gluon.validators.IS_NOT_IN_DB-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_NOT_IN_DB.__init__ web2py.gluon.validators.IS_NOT_IN_DB-class.html#__init__ +web2py.gluon.validators.IS_SLUG web2py.gluon.validators.IS_SLUG-class.html +web2py.gluon.validators.IS_SLUG.urlify web2py.gluon.validators.IS_SLUG-class.html#urlify +web2py.gluon.validators.IS_SLUG.__call__ web2py.gluon.validators.IS_SLUG-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_SLUG.__init__ web2py.gluon.validators.IS_SLUG-class.html#__init__ +web2py.gluon.validators.IS_STRONG web2py.gluon.validators.IS_STRONG-class.html +web2py.gluon.validators.IS_STRONG.__call__ web2py.gluon.validators.IS_STRONG-class.html#__call__ +web2py.gluon.validators.IS_STRONG.__init__ web2py.gluon.validators.IS_STRONG-class.html#__init__ +web2py.gluon.validators.IS_TIME web2py.gluon.validators.IS_TIME-class.html +web2py.gluon.validators.IS_TIME.__call__ web2py.gluon.validators.IS_TIME-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_TIME.__init__ web2py.gluon.validators.IS_TIME-class.html#__init__ +web2py.gluon.validators.IS_UPLOAD_FILENAME web2py.gluon.validators.IS_UPLOAD_FILENAME-class.html +web2py.gluon.validators.IS_UPLOAD_FILENAME.__call__ web2py.gluon.validators.IS_UPLOAD_FILENAME-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_UPLOAD_FILENAME.__init__ web2py.gluon.validators.IS_UPLOAD_FILENAME-class.html#__init__ +web2py.gluon.validators.IS_UPPER web2py.gluon.validators.IS_UPPER-class.html +web2py.gluon.validators.IS_UPPER.__call__ web2py.gluon.validators.IS_UPPER-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_URL web2py.gluon.validators.IS_URL-class.html +web2py.gluon.validators.IS_URL.__call__ web2py.gluon.validators.IS_URL-class.html#__call__ +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.validators.IS_URL.__init__ web2py.gluon.validators.IS_URL-class.html#__init__ +web2py.gluon.validators.Validator web2py.gluon.validators.Validator-class.html +web2py.gluon.validators.Validator.formatter web2py.gluon.validators.Validator-class.html#formatter +web2py.gluon.widget.IO web2py.gluon.widget.IO-class.html +web2py.gluon.widget.IO.write web2py.gluon.widget.IO-class.html#write +web2py.gluon.widget.IO.__init__ web2py.gluon.widget.IO-class.html#__init__ +web2py.gluon.widget.web2pyDialog web2py.gluon.widget.web2pyDialog-class.html +web2py.gluon.widget.web2pyDialog.quit web2py.gluon.widget.web2pyDialog-class.html#quit +web2py.gluon.widget.web2pyDialog.update_canvas web2py.gluon.widget.web2pyDialog-class.html#update_canvas +web2py.gluon.widget.web2pyDialog.stop web2py.gluon.widget.web2pyDialog-class.html#stop +web2py.gluon.widget.web2pyDialog.update web2py.gluon.widget.web2pyDialog-class.html#update +web2py.gluon.widget.web2pyDialog.connect_pages web2py.gluon.widget.web2pyDialog-class.html#connect_pages +web2py.gluon.widget.web2pyDialog.start web2py.gluon.widget.web2pyDialog-class.html#start +web2py.gluon.widget.web2pyDialog.error web2py.gluon.widget.web2pyDialog-class.html#error +web2py.gluon.widget.web2pyDialog.checkTaskBar web2py.gluon.widget.web2pyDialog-class.html#checkTaskBar +web2py.gluon.widget.web2pyDialog.__init__ web2py.gluon.widget.web2pyDialog-class.html#__init__ +web2py.gluon.winservice.Service web2py.gluon.winservice.Service-class.html +web2py.gluon.winservice.Service.SvcDoRun web2py.gluon.winservice.Service-class.html#SvcDoRun +web2py.gluon.winservice.Service.SvcStop web2py.gluon.winservice.Service-class.html#SvcStop +web2py.gluon.winservice.Service.log web2py.gluon.winservice.Service-class.html#log +web2py.gluon.winservice.Service.stop web2py.gluon.winservice.Service-class.html#stop +web2py.gluon.winservice.Service._svc_display_name_ web2py.gluon.winservice.Service-class.html#_svc_display_name_ +web2py.gluon.winservice.Service.start web2py.gluon.winservice.Service-class.html#start +web2py.gluon.winservice.Service._svc_name_ web2py.gluon.winservice.Service-class.html#_svc_name_ +web2py.gluon.winservice.Service.__init__ web2py.gluon.winservice.Service-class.html#__init__ +web2py.gluon.winservice.Web2pyService web2py.gluon.winservice.Web2pyService-class.html +web2py.gluon.winservice.Service.SvcDoRun web2py.gluon.winservice.Service-class.html#SvcDoRun +web2py.gluon.winservice.Service.SvcStop web2py.gluon.winservice.Service-class.html#SvcStop +web2py.gluon.winservice.Web2pyService.chdir web2py.gluon.winservice.Web2pyService-class.html#chdir +web2py.gluon.winservice.Service.log web2py.gluon.winservice.Service-class.html#log +web2py.gluon.winservice.Web2pyService.start web2py.gluon.winservice.Web2pyService-class.html#start +web2py.gluon.winservice.Web2pyService.stop web2py.gluon.winservice.Web2pyService-class.html#stop +web2py.gluon.winservice.Web2pyService.server web2py.gluon.winservice.Web2pyService-class.html#server +web2py.gluon.winservice.Web2pyService._exe_args_ web2py.gluon.winservice.Web2pyService-class.html#_exe_args_ +web2py.gluon.winservice.Web2pyService._svc_name_ web2py.gluon.winservice.Web2pyService-class.html#_svc_name_ +web2py.gluon.winservice.Web2pyService._svc_display_name_ web2py.gluon.winservice.Web2pyService-class.html#_svc_display_name_ +web2py.gluon.winservice.Service.__init__ web2py.gluon.winservice.Service-class.html#__init__ ADDED applications/examples/static/epydoc/class-tree.html Index: applications/examples/static/epydoc/class-tree.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/class-tree.html @@ -0,0 +1,1080 @@ + + + + + Class Hierarchy + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
    [hide private]
    [frames] | no frames]
    +
    +
    + [ Module Hierarchy + | Class Hierarchy ] +

    +

    Class Hierarchy

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/crarr.png Index: applications/examples/static/epydoc/crarr.png ================================================================== --- /dev/null +++ applications/examples/static/epydoc/crarr.png cannot compute difference between binary files ADDED applications/examples/static/epydoc/datetime.date-class.html Index: applications/examples/static/epydoc/datetime.date-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/datetime.date-class.html @@ -0,0 +1,960 @@ + + + + + datetime.date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + datetime :: + date :: + Class date + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class date



    +
    +object --+
    +         |
    +        date
    +
    + +
    Known Subclasses:
    +
    + datetime +
    + +
    +date(year, month, day) --> date object

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __add__(x, + y)
    + x+y
    + + +
    + +
    +   + + + + + + +
    __eq__(x, + y)
    + x==y
    + + +
    + +
    +   + + + + + + +
    __ge__(x, + y)
    + x>=y
    + + +
    + +
    +   + + + + + + +
    __getattribute__(...)
    + x.__getattribute__('name') <==> x.name
    + + +
    + +
    +   + + + + + + +
    __gt__(x, + y)
    + x>y
    + + +
    + +
    +   + + + + + + +
    __hash__(x)
    + hash(x)
    + + +
    + +
    +   + + + + + + +
    __le__(x, + y)
    + x<=y
    + + +
    + +
    +   + + + + + + +
    __lt__(x, + y)
    + x<y
    + + +
    + +
    +   + + + + + + +
    __ne__(x, + y)
    + x!=y
    + + +
    + +
    +   + + + + + + +
    __new__(T, + S, + ...)
    + Returns: +a new object with type S, a subtype of T
    + + +
    + +
    +   + + + + + + +
    __radd__(x, + y)
    + y+x
    + + +
    + +
    +   + + + + + + +
    __reduce__()
    + Returns: +(cls, state)
    + + +
    + +
    +   + + + + + + +
    __repr__(x)
    + repr(x)
    + + +
    + +
    +   + + + + + + +
    __rsub__(x, + y)
    + y-x
    + + +
    + +
    +   + + + + + + +
    __str__(x)
    + str(x)
    + + +
    + +
    +   + + + + + + +
    __sub__(x, + y)
    + x-y
    + + +
    + +
    +   + + + + + + +
    ctime(...)
    + Return ctime() style string.
    + + +
    + +
    +   + + + + + + +
    fromordinal(...)
    + int -> date corresponding to a proleptic Gregorian ordinal.
    + + +
    + +
    +   + + + + + + +
    fromtimestamp(...)
    + timestamp -> local date from a POSIX timestamp (like + time.time()).
    + + +
    + +
    +   + + + + + + +
    isocalendar(...)
    + Return a 3-tuple containing ISO year, week number, and + weekday.
    + + +
    + +
    +   + + + + + + +
    isoformat(...)
    + Return string in ISO 8601 format, YYYY-MM-DD.
    + + +
    + +
    +   + + + + + + +
    isoweekday(...)
    + Return the day of the week represented by the date.
    + + +
    + +
    +   + + + + + + +
    replace(...)
    + Return date with new specified fields.
    + + +
    + +
    +   + + + + + + +
    strftime(...)
    + format -> strftime() style string.
    + + +
    + +
    +   + + + + + + +
    timetuple(...)
    + Return time tuple, compatible with time.localtime().
    + + +
    + +
    +   + + + + + + +
    today(...)
    + Current date or datetime: same as + self.__class__.fromtimestamp(time.time()).
    + + +
    + +
    +   + + + + + + +
    toordinal(...)
    + Return proleptic Gregorian ordinal.
    + + +
    + +
    +   + + + + + + +
    weekday(...)
    + Return the day of the week represented by the date.
    + + +
    + +
    +

    Inherited from object: + __delattr__, + __init__, + __reduce_ex__, + __setattr__ +

    +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + max = datetime.date(9999, 12, 31) +
    +   + + min = datetime.date(1, 1, 1) +
    +   + + resolution = datetime.timedelta(1) +
    + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +   + + day +
    +   + + month +
    +   + + year +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __getattribute__(...) +

    +
      +
    + + x.__getattribute__('name') <==> x.name +
    +
    Overrides: + object.__getattribute__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __hash__(x) +
    (Hashing function) +

    +
      +
    + + hash(x) +
    +
    Overrides: + object.__hash__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __new__(T, + S, + ...) +

    +
      +
    + + +
    +
    Returns:
    +
    +a new object with type S, a subtype of T
    +
    +
    +
    Overrides: + object.__new__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __reduce__() +

    +
      +
    + + helper for pickle +
    +
    Returns:
    +
    +(cls, state)
    +
    +
    +
    Overrides: + object.__reduce__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __repr__(x) +
    (Representation operator) +

    +
      +
    + + repr(x) +
    +
    Overrides: + object.__repr__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __str__(x) +
    (Informal representation operator) +

    +
      +
    + + str(x) +
    +
    Overrides: + object.__str__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    isoweekday(...) +

    +
      +
    + + Return the day of the week represented by the date. Monday == 1 ... + Sunday == 7 +
    +
    +
    +
    + +
    + +
    + + +
    +

    toordinal(...) +

    +
      +
    + + Return proleptic Gregorian ordinal. January 1 of year 1 is day 1. +
    +
    +
    +
    + +
    + +
    + + +
    +

    weekday(...) +

    +
      +
    + + Return the day of the week represented by the date. Monday == 0 ... + Sunday == 6 +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/datetime.datetime-class.html Index: applications/examples/static/epydoc/datetime.datetime-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/datetime.datetime-class.html @@ -0,0 +1,1383 @@ + + + + + datetime.datetime + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + datetime :: + datetime :: + Class datetime + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class datetime



    +
    +object --+    
    +         |    
    +      date --+
    +             |
    +            datetime
    +
    + +
    +

    datetime(year, month, day[, hour[, minute[, second[, + microsecond[,tzinfo]]]]])

    + The year, month and day arguments are required. tzinfo may be None, or + an instance of a tzinfo subclass. The remaining arguments may be ints or + longs.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __add__(x, + y)
    + x+y
    + + +
    + +
    +   + + + + + + +
    __eq__(x, + y)
    + x==y
    + + +
    + +
    +   + + + + + + +
    __ge__(x, + y)
    + x>=y
    + + +
    + +
    +   + + + + + + +
    __getattribute__(...)
    + x.__getattribute__('name') <==> x.name
    + + +
    + +
    +   + + + + + + +
    __gt__(x, + y)
    + x>y
    + + +
    + +
    +   + + + + + + +
    __hash__(x)
    + hash(x)
    + + +
    + +
    +   + + + + + + +
    __le__(x, + y)
    + x<=y
    + + +
    + +
    +   + + + + + + +
    __lt__(x, + y)
    + x<y
    + + +
    + +
    +   + + + + + + +
    __ne__(x, + y)
    + x!=y
    + + +
    + +
    +   + + + + + + +
    __new__(T, + S, + ...)
    + Returns: +a new object with type S, a subtype of T
    + + +
    + +
    +   + + + + + + +
    __radd__(x, + y)
    + y+x
    + + +
    + +
    +   + + + + + + +
    __reduce__()
    + Returns: +(cls, state)
    + + +
    + +
    +   + + + + + + +
    __repr__(x)
    + repr(x)
    + + +
    + +
    +   + + + + + + +
    __rsub__(x, + y)
    + y-x
    + + +
    + +
    +   + + + + + + +
    __str__(x)
    + str(x)
    + + +
    + +
    +   + + + + + + +
    __sub__(x, + y)
    + x-y
    + + +
    + +
    +   + + + + + + +
    astimezone(...)
    + tz -> convert to local time in new timezone tz
    + + +
    + +
    +   + + + + + + +
    combine(...)
    + date, time -> datetime with same date and time fields
    + + +
    + +
    +   + + + + + + +
    ctime(...)
    + Return ctime() style string.
    + + +
    + +
    +   + + + + + + +
    date(...)
    + Return date object with same year, month and day.
    + + +
    + +
    +   + + + + + + +
    dst(...)
    + Return self.tzinfo.dst(self).
    + + +
    + +
    +   + + + + + + +
    fromtimestamp(...)
    + timestamp[, tz] -> tz's local time from POSIX timestamp.
    + + +
    + +
    +   + + + + + + +
    isoformat(...)
    + [sep] -> string in ISO 8601 format, + YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].
    + + +
    + +
    +   + + + + + + +
    now(...)
    + [tz] -> new datetime with tz's local day and time.
    + + +
    + +
    +   + + + + + + +
    replace(...)
    + Return datetime with new specified fields.
    + + +
    + +
    +   + + + + + + +
    strptime(...)
    + string, format -> new datetime parsed from a string (like + time.strptime()).
    + + +
    + +
    +   + + + + + + +
    time(...)
    + Return time object with same time but with tzinfo=None.
    + + +
    + +
    +   + + + + + + +
    timetuple(...)
    + Return time tuple, compatible with time.localtime().
    + + +
    + +
    +   + + + + + + +
    timetz(...)
    + Return time object with same time and tzinfo.
    + + +
    + +
    +   + + + + + + +
    tzname(...)
    + Return self.tzinfo.tzname(self).
    + + +
    + +
    +   + + + + + + +
    utcfromtimestamp(...)
    + timestamp -> UTC datetime from a POSIX timestamp (like + time.time()).
    + + +
    + +
    +   + + + + + + +
    utcnow(...)
    + Return a new datetime representing UTC day and time.
    + + +
    + +
    +   + + + + + + +
    utcoffset(...)
    + Return self.tzinfo.utcoffset(self).
    + + +
    + +
    +   + + + + + + +
    utctimetuple(...)
    + Return UTC time tuple, compatible with time.localtime().
    + + +
    + +
    +

    Inherited from date: + fromordinal, + isocalendar, + isoweekday, + strftime, + today, + toordinal, + weekday +

    +

    Inherited from object: + __delattr__, + __init__, + __reduce_ex__, + __setattr__ +

    +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + max = datetime.datetime(9999, 12, 31, 23, 59, 59, 999999) +
    +   + + min = datetime.datetime(1, 1, 1, 0, 0) +
    +   + + resolution = datetime.timedelta(0, 0, 1) +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +   + + hour +
    +   + + microsecond +
    +   + + minute +
    +   + + second +
    +   + + tzinfo +
    +

    Inherited from date: + day, + month, + year +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __add__(x, + y) +
    (Addition operator) +

    +
      +
    + + x+y +
    +
    Overrides: + date.__add__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __eq__(x, + y) +
    (Equality operator) +

    +
      +
    + + x==y +
    +
    Overrides: + date.__eq__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __ge__(x, + y) +
    (Greater-than-or-equals operator) +

    +
      +
    + + x>=y +
    +
    Overrides: + date.__ge__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __getattribute__(...) +

    +
      +
    + + x.__getattribute__('name') <==> x.name +
    +
    Overrides: + date.__getattribute__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __gt__(x, + y) +
    (Greater-than operator) +

    +
      +
    + + x>y +
    +
    Overrides: + date.__gt__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __hash__(x) +
    (Hashing function) +

    +
      +
    + + hash(x) +
    +
    Overrides: + date.__hash__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __le__(x, + y) +
    (Less-than-or-equals operator) +

    +
      +
    + + x<=y +
    +
    Overrides: + date.__le__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __lt__(x, + y) +
    (Less-than operator) +

    +
      +
    + + x<y +
    +
    Overrides: + date.__lt__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __ne__(x, + y) +

    +
      +
    + + x!=y +
    +
    Overrides: + date.__ne__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __new__(T, + S, + ...) +

    +
      +
    + + +
    +
    Returns:
    +
    +a new object with type S, a subtype of T
    +
    +
    +
    Overrides: + date.__new__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __radd__(x, + y) +
    (Right-side addition operator) +

    +
      +
    + + y+x +
    +
    Overrides: + date.__radd__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __reduce__() +

    +
      +
    + + helper for pickle +
    +
    Returns:
    +
    +(cls, state)
    +
    +
    +
    Overrides: + date.__reduce__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __repr__(x) +
    (Representation operator) +

    +
      +
    + + repr(x) +
    +
    Overrides: + date.__repr__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __rsub__(x, + y) +

    +
      +
    + + y-x +
    +
    Overrides: + date.__rsub__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __str__(x) +
    (Informal representation operator) +

    +
      +
    + + str(x) +
    +
    Overrides: + date.__str__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __sub__(x, + y) +
    (Subtraction operator) +

    +
      +
    + + x-y +
    +
    Overrides: + date.__sub__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    ctime(...) +

    +
      +
    + + Return ctime() style string. +
    +
    Overrides: + date.ctime +
    +
    +
    +
    + +
    + +
    + + +
    +

    fromtimestamp(...) +

    +
      +
    + + timestamp[, tz] -> tz's local time from POSIX timestamp. +
    +
    Overrides: + date.fromtimestamp +
    +
    +
    +
    + +
    + +
    + + +
    +

    isoformat(...) +

    +
      +
    + +

    [sep] -> string in ISO 8601 format, + YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].

    + sep is used to separate the year from the time, and defaults to + 'T'. +
    +
    Overrides: + date.isoformat +
    +
    +
    +
    + +
    + +
    + + +
    +

    replace(...) +

    +
      +
    + + Return datetime with new specified fields. +
    +
    Overrides: + date.replace +
    +
    +
    +
    + +
    + +
    + + +
    +

    timetuple(...) +

    +
      +
    + + Return time tuple, compatible with time.localtime(). +
    +
    Overrides: + date.timetuple +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/datetime.time-class.html Index: applications/examples/static/epydoc/datetime.time-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/datetime.time-class.html @@ -0,0 +1,753 @@ + + + + + datetime.time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + datetime :: + time :: + Class time + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class time



    +
    +object --+
    +         |
    +        time
    +
    + +
    +

    time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a + time object

    + All arguments are optional. tzinfo may be None, or an instance of a + tzinfo subclass. The remaining arguments may be ints or longs.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __eq__(x, + y)
    + x==y
    + + +
    + +
    +   + + + + + + +
    __ge__(x, + y)
    + x>=y
    + + +
    + +
    +   + + + + + + +
    __getattribute__(...)
    + x.__getattribute__('name') <==> x.name
    + + +
    + +
    +   + + + + + + +
    __gt__(x, + y)
    + x>y
    + + +
    + +
    +   + + + + + + +
    __hash__(x)
    + hash(x)
    + + +
    + +
    +   + + + + + + +
    __le__(x, + y)
    + x<=y
    + + +
    + +
    +   + + + + + + +
    __lt__(x, + y)
    + x<y
    + + +
    + +
    +   + + + + + + +
    __ne__(x, + y)
    + x!=y
    + + +
    + +
    +   + + + + + + +
    __new__(T, + S, + ...)
    + Returns: +a new object with type S, a subtype of T
    + + +
    + +
    +   + + + + + + +
    __nonzero__(x)
    + x != 0
    + + +
    + +
    +   + + + + + + +
    __reduce__()
    + Returns: +(cls, state)
    + + +
    + +
    +   + + + + + + +
    __repr__(x)
    + repr(x)
    + + +
    + +
    +   + + + + + + +
    __str__(x)
    + str(x)
    + + +
    + +
    +   + + + + + + +
    dst(...)
    + Return self.tzinfo.dst(self).
    + + +
    + +
    +   + + + + + + +
    isoformat(...)
    + Return string in ISO 8601 format, HH:MM:SS[.mmmmmm][+HH:MM].
    + + +
    + +
    +   + + + + + + +
    replace(...)
    + Return time with new specified fields.
    + + +
    + +
    +   + + + + + + +
    strftime(...)
    + format -> strftime() style string.
    + + +
    + +
    +   + + + + + + +
    tzname(...)
    + Return self.tzinfo.tzname(self).
    + + +
    + +
    +   + + + + + + +
    utcoffset(...)
    + Return self.tzinfo.utcoffset(self).
    + + +
    + +
    +

    Inherited from object: + __delattr__, + __init__, + __reduce_ex__, + __setattr__ +

    +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + max = datetime.time(23, 59, 59, 999999) +
    +   + + min = datetime.time(0, 0) +
    +   + + resolution = datetime.timedelta(0, 0, 1) +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +   + + hour +
    +   + + microsecond +
    +   + + minute +
    +   + + second +
    +   + + tzinfo +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __getattribute__(...) +

    +
      +
    + + x.__getattribute__('name') <==> x.name +
    +
    Overrides: + object.__getattribute__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __hash__(x) +
    (Hashing function) +

    +
      +
    + + hash(x) +
    +
    Overrides: + object.__hash__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __new__(T, + S, + ...) +

    +
      +
    + + +
    +
    Returns:
    +
    +a new object with type S, a subtype of T
    +
    +
    +
    Overrides: + object.__new__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __reduce__() +

    +
      +
    + + helper for pickle +
    +
    Returns:
    +
    +(cls, state)
    +
    +
    +
    Overrides: + object.__reduce__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __repr__(x) +
    (Representation operator) +

    +
      +
    + + repr(x) +
    +
    Overrides: + object.__repr__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __str__(x) +
    (Informal representation operator) +

    +
      +
    + + str(x) +
    +
    Overrides: + object.__str__ +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/epydoc.css Index: applications/examples/static/epydoc/epydoc.css ================================================================== --- /dev/null +++ applications/examples/static/epydoc/epydoc.css @@ -0,0 +1,410 @@ + + +/* Epydoc CSS Stylesheet + * + * This stylesheet can be used to customize the appearance of epydoc's + * HTML output. + * + */ + +/* Default Colors & Styles + * - Set the default foreground & background color with 'body'; and + * link colors with 'a:link' and 'a:visited'. + * - Use bold for decision list terms. + * - The heading styles defined here are used for headings *within* + * docstring descriptions. All headings used by epydoc itself use + * either class='epydoc' or class='toc' (CSS styles for both + * defined below). +body { background: #ffffff; color: #000000; } +a:link { color: #0000ff; } +a:visited { color: #204080; } +dt { font-weight: bold; } +h1 { font-size: +140%; font-style: italic; + font-weight: bold; } +h2 { font-size: +125%; font-style: italic; + font-weight: bold; } +h3 { font-size: +110%; font-style: italic; + font-weight: normal; } +code { font-size: 100%; } + */ + +body { background-color: #fff; color: #585858; font-size: 10pt; font-family: georgia, serif; } +a {color: #FF5C1F; } +a:hover { text-decoration: underline; } +a:visited { color: #FF5C1F;} +dt { font-weight: bold; } +h1 { font-size: +140%; font-style: italic; + font-weight: bold; } +h2 { color: #185360; font-size: +125%; font-style: italic; + font-weight: bold; } +h3 { color: #185360; font-size: +110%; font-style: italic; + font-weight: normal; } +code { font-size: 100%; } + +/* Page Header & Footer + * - The standard page header consists of a navigation bar (with + * pointers to standard pages such as 'home' and 'trees'); a + * breadcrumbs list, which can be used to navigate to containing + * classes or modules; options links, to show/hide private + * variables and to show/hide frames; and a page title (using + *

    ). The page title may be followed by a link to the + * corresponding source code (using 'span.codelink'). + * - The footer consists of a navigation bar, a timestamp, and a + * pointer to epydoc's homepage. + +h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } +h2.epydoc { font-size: +130%; font-weight: bold; } +h3.epydoc { font-size: +115%; font-weight: bold; } +td h3.epydoc { font-size: +115%; font-weight: bold; + margin-bottom: 0; } +table.navbar { background: #a0c0ff; color: #000000; + border: 2px groove #c0d0d0; } +table.navbar table { color: #000000; } +th.navbar-select { background: #70b0ff; + color: #000000; } +table.navbar a { text-decoration: none; } +table.navbar a:link { color: #0000ff; } +table.navbar a:visited { color: #204080; } +span.breadcrumbs { font-size: 85%; font-weight: bold; } +span.options { font-size: 70%; } +span.codelink { font-size: 85%; } +td.footer { font-size: 85%; } +*/ + +h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } +h2.epydoc { font-size: +130%; font-weight: bold; } +h3.epydoc { font-size: +115%; font-weight: bold; } +td h3.epydoc { font-size: +115%; font-weight: bold; + margin-bottom: 0; } +table.navbar { background: url('title.png') repeat-x; + #background: #a0c0ff; + color: #FF5C1F; + #border: 2px groove #c0d0d0; } + +table.navbar table { color: #FF5C1F; } +th.navbar-select { background: #fff; + color: #195866; } + +table.navbar a { text-decoration: none; + color: #FF5C1F;} +table.navbar a:link { color: #FF5C1F; } +table.navbar a:visited { color: #FF5C1F; } + +span.breadcrumbs { font-size: 85%; font-weight: bold; } +span.options { font-size: 70%; } +span.codelink { font-size: 85%; } +td.footer { font-size: 85%; } + + +/* Table Headers + * - Each summary table and details section begins with a 'header' + * row. This row contains a section title (marked by + * 'span.table-header') as well as a show/hide private link + * (marked by 'span.options', defined above). + * - Summary tables that contain user-defined groups mark those + * groups using 'group header' rows. + +td.table-header { background: #70b0ff; color: #000000; + border: 1px solid #608090; } +td.table-header table { color: #000000; } +td.table-header table a:link { color: #0000ff; } +td.table-header table a:visited { color: #204080; } +span.table-header { font-size: 120%; font-weight: bold; } +th.group-header { background: #c0e0f8; color: #000000; + text-align: left; font-style: italic; + font-size: 115%; + border: 1px solid #608090; } +*/ +td.table-header { background: #258396; color: #000000; + border: 1px solid #608090; } + +td.table-header table { color: #fff; } +td.table-header table a:link { color: #FF5C1F; } +td.table-header table a:visited { color: #FF5C1F; } +span.table-header { font-size: 120%; font-weight: bold; } +th.group-header { background: #185360; color: #fff; + text-align: left; font-style: italic; + font-size: 115%; + border: 1px solid #608090; } + +/* Summary Tables (functions, variables, etc) + * - Each object is described by a single row of the table with + * two cells. The left cell gives the object's type, and is + * marked with 'code.summary-type'. The right cell gives the + * object's name and a summary description. + * - CSS styles for the table's header and group headers are + * defined above, under 'Table Headers' + */ +table.summary { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin-bottom: 0.5em; } +td.summary { border: 1px solid #608090; } +code.summary-type { font-size: 85%; } +table.summary a:link { color: #FF5C1F; } +table.summary a:visited { color: #FF5C1F; } + + +/* Details Tables (functions, variables, etc) + * - Each object is described in its own div. + * - A single-row summary table w/ table-header is used as + * a header for each details section (CSS style for table-header + * is defined above, under 'Table Headers'). + */ +table.details { border-collapse: collapse; + background: #e8f0f8; color: #585858; + border: 1px solid #608090; + margin: .2em 0 0 0; } +table.details table { color: #fff; } +table.details a:link { color: #FF5C1F; } +table.details a:visited { color: #FF5C1F; } + +/* Fields */ +dl.fields { margin-left: 2em; margin-top: 1em; + margin-bottom: 1em; } +dl.fields dd ul { margin-left: 0em; padding-left: 0em; } +div.fields { margin-left: 2em; } +div.fields p { margin-bottom: 0.5em; } + +/* Index tables (identifier index, term index, etc) + * - link-index is used for indices containing lists of links + * (namely, the identifier index & term index). + * - index-where is used in link indices for the text indicating + * the container/source for each link. + * - metadata-index is used for indices containing metadata + * extracted from fields (namely, the bug index & todo index). + */ +table.link-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; } +td.link-index { border-width: 0px; } +table.link-index a:link { color: #FF5C1F; } +table.link-index a:visited { color: #FF5C1F; } +span.index-where { font-size: 70%; } +table.metadata-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +td.metadata-index { border-width: 1px; border-style: solid; } +table.metadata-index a:link { color: #FF5C1F; } +table.metadata-index a:visited { color: #FF5C1F; } + +/* Function signatures + * - sig* is used for the signature in the details section. + * - .summary-sig* is used for the signature in the summary + * table, and when listing property accessor functions. +.sig-name { color: #006080; } +.sig-arg { color: #008060; } +.sig-default { color: #602000; } +.summary-sig { font-family: monospace; } +.summary-sig-name { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:link + { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:visited + { color: #006080; font-weight: bold; } +.summary-sig-arg { color: #006040; } +.summary-sig-default { color: #501800; } + * */ +.sig-name { color: #FF5C1F; } +.sig-arg { color: #008060; } +.sig-default { color: #602000; } +.summary-sig { font-family: monospace; } +.summary-sig-name { color: #FF5C1F; font-weight: bold; } +table.summary a.summary-sig-name:link + { color: #FF5C1F; font-weight: bold; } +table.summary a.summary-sig-name:visited + { color: #FF5C1F; font-weight: bold; } +.summary-sig-arg { color: #006040; } +.summary-sig-default { color: #FF5C1F; } + + +/* To render variables, classes etc. like functions */ +table.summary .summary-name { color: #FF5C1F; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:link { color: #FF5C1F; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:visited { color: #FF5C1F; font-weight: bold; + font-family: monospace; } + +/* Variable values + * - In the 'variable details' sections, each variable's value is + * listed in a 'pre.variable' box. The width of this box is + * restricted to 80 chars; if the value's repr is longer than + * this it will be wrapped, using a backslash marked with + * class 'variable-linewrap'. If the value's repr is longer + * than 3 lines, the rest will be elided; and an ellipsis + * marker ('...' marked with 'variable-ellipsis') will be used. + * - If the value is a string, its quote marks will be marked + * with 'variable-quote'. + * - If the variable is a regexp, it is syntax-highlighted using + * the re* CSS classes. + */ +pre.variable { padding: .5em; margin: 0; + background: #dce4ec; color: #000000; + border: 1px solid #708890; } +.variable-linewrap { color: #604000; font-weight: bold; } +.variable-ellipsis { color: #604000; font-weight: bold; } +.variable-quote { color: #604000; font-weight: bold; } +.variable-group { color: #008000; font-weight: bold; } +.variable-op { color: #604000; font-weight: bold; } +.variable-string { color: #006030; } +.variable-unknown { color: #a00000; font-weight: bold; } +.re { color: #000000; } +.re-char { color: #006030; } +.re-op { color: #600000; } +.re-group { color: #003060; } +.re-ref { color: #404040; } + +/* Base tree + * - Used by class pages to display the base class hierarchy. + */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Frames-based table of contents headers + * - Consists of two frames: one for selecting modules; and + * the other listing the contents of the selected module. + * - h1.toc is used for each frame's heading + * - h2.toc is used for subheadings within each frame. + */ +h1.toc { text-align: center; font-size: 105%; + margin: 0; font-weight: bold; + padding: 0; } +h2.toc { font-size: 100%; font-weight: bold; + margin: 0.5em 0 0 -0.3em; } + +/* Syntax Highlighting for Source Code + * - doctest examples are displayed in a 'pre.py-doctest' block. + * If the example is in a details table entry, then it will use + * the colors specified by the 'table pre.py-doctest' line. + * - Source code listings are displayed in a 'pre.py-src' block. + * Each line is marked with 'span.py-line' (used to draw a line + * down the left margin, separating the code from the line + * numbers). Line numbers are displayed with 'span.py-lineno'. + * The expand/collapse block toggle button is displayed with + * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not + * modify the font size of the text.) + * - If a source code page is opened with an anchor, then the + * corresponding code block will be highlighted. The code + * block's header is highlighted with 'py-highlight-hdr'; and + * the code block's body is highlighted with 'py-highlight'. + * - The remaining py-* classes are used to perform syntax + * highlighting (py-string for string literals, py-name for names, + * etc.) + +pre.py-doctest { padding: .5em; margin: 1em; + background: #e8f0f8; color: #000000; + border: 1px solid #708890; } +table pre.py-doctest { background: #dce4ec; + color: #000000; } +pre.py-src { border: 2px solid #000000; + background: #f0f0f0; color: #000000; } +.py-line { border-left: 2px solid #000000; + margin-left: .2em; padding-left: .4em; } +.py-lineno { font-style: italic; font-size: 90%; + padding-left: .5em; } +a.py-toggle { text-decoration: none; } +div.py-highlight-hdr { border-top: 2px solid #000000; + border-bottom: 2px solid #000000; + background: #d8e8e8; } +div.py-highlight { border-bottom: 2px solid #000000; + background: #d0e0e0; } +.py-prompt { color: #005050; font-weight: bold;} +.py-more { color: #005050; font-weight: bold;} +.py-string { color: #006030; } +.py-comment { color: #003060; } +.py-keyword { color: #600000; } +.py-output { color: #404040; } +.py-name { color: #000050; } +.py-name:link { color: #000050 !important; } +.py-name:visited { color: #000050 !important; } +.py-number { color: #005000; } +.py-defname { color: #000060; font-weight: bold; } +.py-def-name { color: #000060; font-weight: bold; } +.py-base-class { color: #000060; } +.py-param { color: #000060; } +.py-docstring { color: #006030; } +.py-decorator { color: #804020; } + */ +/* Use this if you don't want links to names underlined: */ +/*a.py-name { text-decoration: none; }*/ + +pre.py-doctest { padding: .5em; margin: 1em; + background: #e8f0f8; color: #000000; + border: 1px solid #708890; } +table pre.py-doctest { background: #dce4ec; + color: #000000; } +pre.py-src { border: 2px solid #000000; + background: #f0f0f0; color: #000000; } +.py-line { border-left: 2px solid #000000; + margin-left: .2em; padding-left: .4em; } +.py-lineno { font-style: italic; font-size: 90%; + padding-left: .5em; } +a.py-toggle { text-decoration: none; } +div.py-highlight-hdr { border-top: 2px solid #000000; + border-bottom: 2px solid #000000; + background: #d8e8e8; } +div.py-highlight { border-bottom: 2px solid #000000; + background: #d0e0e0; } +.py-prompt { color: #005050; font-weight: bold;} +.py-more { color: #005050; font-weight: bold;} +.py-string { color: green; } +.py-comment { color: green; } +.py-keyword { color: blue; } +.py-output { color: #404040; } +.py-name { color: #585858;} +.py-name:link { color: #FF5C1F !important; } +.py-name:visited { color: #FF5C1F !important; } +.py-number { color: #005000; } +.py-defname { color: #FF5C1F; font-weight: bold; } +.py-def-name { color: #FF5C1F; font-weight: bold; } +.py-base-class { color: #FF5C1F; } +.py-param { color: #000060; } +.py-docstring { color: green; } +.py-decorator { color: #804020; } + +/* Graphs & Diagrams + * - These CSS styles are used for graphs & diagrams generated using + * Graphviz dot. 'img.graph-without-title' is used for bare + * diagrams (to remove the border created by making the image + * clickable). + */ +img.graph-without-title { border: none; } +img.graph-with-title { border: 1px solid #000000; } +span.graph-title { font-weight: bold; } +span.graph-caption { } + +/* General-purpose classes + * - 'p.indent-wrapped-lines' defines a paragraph whose first line + * is not indented, but whose subsequent lines are. + * - The 'nomargin-top' class is used to remove the top margin (e.g. + * from lists). The 'nomargin' class is used to remove both the + * top and bottom margin (but not the left or right margin -- + * for lists, that would cause the bullets to disappear.) + */ +p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; + margin: 0; } +.nomargin-top { margin-top: 0; } +.nomargin { margin-top: 0; margin-bottom: 0; } + +/* HTML Log */ +div.log-block { padding: 0; margin: .5em 0 .5em 0; + background: #e8f0f8; color: #000000; + border: 1px solid #000000; } +div.log-error { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffb0b0; color: #000000; + border: 1px solid #000000; } +div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffffb0; color: #000000; + border: 1px solid #000000; } +div.log-info { padding: .1em .3em .1em .3em; margin: 4px; + background: #b0ffb0; color: #000000; + border: 1px solid #000000; } +h2.log-hdr { background: #70b0ff; color: #000000; + margin: 0; padding: 0em 0.5em 0em 0.5em; + border-bottom: 1px solid #000000; font-size: 110%; } +p.log { font-weight: bold; margin: .5em 0 .5em 0; } +tr.opt-changed { color: #000000; font-weight: bold; } +tr.opt-default { color: #606060; } +pre.log { margin: 0; padding: 0; padding-left: 1em; } ADDED applications/examples/static/epydoc/epydoc.js Index: applications/examples/static/epydoc/epydoc.js ================================================================== --- /dev/null +++ applications/examples/static/epydoc/epydoc.js @@ -0,0 +1,280 @@ +function toggle_private() { + // Search for any private/public links on this page. Store + // their old text in "cmd," so we will know what action to + // take; and change their text to the opposite action. + var cmd = "?"; + var elts = document.getElementsByTagName("a"); + for(var i=0; i...
    "; + elt.innerHTML = s; + } +} + +function toggle(id) { + elt = document.getElementById(id+"-toggle"); + if (elt.innerHTML == "-") + collapse(id); + else + expand(id); + return false; +} + +function highlight(id) { + var elt = document.getElementById(id+"-def"); + if (elt) elt.className = "py-highlight-hdr"; + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.className = "py-highlight"; + var elt = document.getElementById(id+"-collapsed"); + if (elt) elt.className = "py-highlight"; +} + +function num_lines(s) { + var n = 1; + var pos = s.indexOf("\n"); + while ( pos > 0) { + n += 1; + pos = s.indexOf("\n", pos+1); + } + return n; +} + +// Collapse all blocks that mave more than `min_lines` lines. +function collapse_all(min_lines) { + var elts = document.getElementsByTagName("div"); + for (var i=0; i 0) + if (elt.id.substring(split, elt.id.length) == "-expanded") + if (num_lines(elt.innerHTML) > min_lines) + collapse(elt.id.substring(0, split)); + } +} + +function expandto(href) { + var start = href.indexOf("#")+1; + if (start != 0 && start != href.length) { + if (href.substring(start, href.length) != "-") { + collapse_all(4); + pos = href.indexOf(".", start); + while (pos != -1) { + var id = href.substring(start, pos); + expand(id); + pos = href.indexOf(".", pos+1); + } + var id = href.substring(start, href.length); + expand(id); + highlight(id); + } + } +} + +function kill_doclink(id) { + var parent = document.getElementById(id); + parent.removeChild(parent.childNodes.item(0)); +} +function auto_kill_doclink(ev) { + if (!ev) var ev = window.event; + if (!this.contains(ev.toElement)) { + var parent = document.getElementById(this.parentID); + parent.removeChild(parent.childNodes.item(0)); + } +} + +function doclink(id, name, targets_id) { + var elt = document.getElementById(id); + + // If we already opened the box, then destroy it. + // (This case should never occur, but leave it in just in case.) + if (elt.childNodes.length > 1) { + elt.removeChild(elt.childNodes.item(0)); + } + else { + // The outer box: relative + inline positioning. + var box1 = document.createElement("div"); + box1.style.position = "relative"; + box1.style.display = "inline"; + box1.style.top = 0; + box1.style.left = 0; + + // A shadow for fun + var shadow = document.createElement("div"); + shadow.style.position = "absolute"; + shadow.style.left = "-1.3em"; + shadow.style.top = "-1.3em"; + shadow.style.background = "#404040"; + + // The inner box: absolute positioning. + var box2 = document.createElement("div"); + box2.style.position = "relative"; + box2.style.border = "1px solid #a0a0a0"; + box2.style.left = "-.2em"; + box2.style.top = "-.2em"; + box2.style.background = "white"; + box2.style.padding = ".3em .4em .3em .4em"; + box2.style.fontStyle = "normal"; + box2.onmouseout=auto_kill_doclink; + box2.parentID = id; + + // Get the targets + var targets_elt = document.getElementById(targets_id); + var targets = targets_elt.getAttribute("targets"); + var links = ""; + target_list = targets.split(","); + for (var i=0; i" + + target[0] + ""; + } + + // Put it all together. + elt.insertBefore(box1, elt.childNodes.item(0)); + //box1.appendChild(box2); + box1.appendChild(shadow); + shadow.appendChild(box2); + box2.innerHTML = + "Which "+name+" do you want to see documentation for?" + + ""; + } + return false; +} + +function get_anchor() { + var href = location.href; + var start = href.indexOf("#")+1; + if ((start != 0) && (start != href.length)) + return href.substring(start, href.length); + } +function redirect_url(dottedName) { + // Scan through each element of the "pages" list, and check + // if "name" matches with any of them. + for (var i=0; i-m" or "-c"; + // extract the portion & compare it to dottedName. + var pagename = pages[i].substring(0, pages[i].length-2); + if (pagename == dottedName.substring(0,pagename.length)) { + + // We've found a page that matches `dottedName`; + // construct its URL, using leftover `dottedName` + // content to form an anchor. + var pagetype = pages[i].charAt(pages[i].length-1); + var url = pagename + ((pagetype=="m")?"-module.html": + "-class.html"); + if (dottedName.length > pagename.length) + url += "#" + dottedName.substring(pagename.length+1, + dottedName.length); + return url; + } + } + } ADDED applications/examples/static/epydoc/exceptions.Exception-class.html Index: applications/examples/static/epydoc/exceptions.Exception-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/exceptions.Exception-class.html @@ -0,0 +1,324 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + exceptions :: + Exception :: + Class Exception + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class Exception



    +
    +   object --+    
    +            |    
    +BaseException --+
    +                |
    +               Exception
    +
    + +
    Known Subclasses:
    +
    + StandardError, + Warning, + GeneratorExit, + StopIteration, + web2py.gluon.http.HTTP, + Queue.Empty, + Queue.Full, + HTMLParser.HTMLParseError, + web2py.gluon.rocket.BadRequest, + socket.error, + web2py.gluon.rocket.SocketClosed, + web2py.gluon.rocket.SocketTimeout, + web2py.gluon.rocket.BadRequest, + web2py.gluon.rocket.SocketClosed, + web2py.gluon.contrib.pymysql.err.MySQLError, + web2py.gluon.tools.Service.JsonRpcException, + web2py.gluon.tools.Service.JsonRpcException, + web2py.gluon.restricted.RestrictedError +
    + +
    +Common base class for all non-exit exceptions.

    + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __init__(...)
    + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature
    + + +
    + +
    +   + + + + + + +
    __new__(T, + S, + ...)
    + Returns: +a new object with type S, a subtype of T
    + + +
    + +
    +

    Inherited from BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __init__(...) +
    (Constructor) +

    +
      +
    + + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
    +
    Overrides: + BaseException.__init__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __new__(T, + S, + ...) +

    +
      +
    + + +
    +
    Returns:
    +
    +a new object with type S, a subtype of T
    +
    +
    +
    Overrides: + BaseException.__new__ +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/frames.html Index: applications/examples/static/epydoc/frames.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/frames.html @@ -0,0 +1,17 @@ + + + + + web2py Web Framework + + + + + + + + + ADDED applications/examples/static/epydoc/help.html Index: applications/examples/static/epydoc/help.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/help.html @@ -0,0 +1,278 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    API Documentation

    + +

    This document contains the API (Application Programming Interface) +documentation for web2py Web Framework. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

    + +

    Object Documentation

    + +

    Each Package Documentation page contains:

    +
      +
    • A description of the package.
    • +
    • A list of the modules and sub-packages contained by the + package.
    • +
    • A summary of the classes defined by the package.
    • +
    • A summary of the functions defined by the package.
    • +
    • A summary of the variables defined by the package.
    • +
    • A detailed description of each function defined by the + package.
    • +
    • A detailed description of each variable defined by the + package.
    • +
    + +

    Each Module Documentation page contains:

    +
      +
    • A description of the module.
    • +
    • A summary of the classes defined by the module.
    • +
    • A summary of the functions defined by the module.
    • +
    • A summary of the variables defined by the module.
    • +
    • A detailed description of each function defined by the + module.
    • +
    • A detailed description of each variable defined by the + module.
    • +
    + +

    Each Class Documentation page contains:

    +
      +
    • A class inheritance diagram.
    • +
    • A list of known subclasses.
    • +
    • A description of the class.
    • +
    • A summary of the methods defined by the class.
    • +
    • A summary of the instance variables defined by the class.
    • +
    • A summary of the class (static) variables defined by the + class.
    • +
    • A detailed description of each method defined by the + class.
    • +
    • A detailed description of each instance variable defined by the + class.
    • +
    • A detailed description of each class (static) variable defined + by the class.
    • +
    + +

    Project Documentation

    + +

    The Trees page contains the module and class hierarchies:

    +
      +
    • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
    • +
    • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
    • +
    + +

    The Index page contains indices of terms and + identifiers:

    +
      +
    • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
    • +
    • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
    • +
    + +

    The Table of Contents

    + +

    The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

    + + + + + + + + + +
    + Project
    Contents
    ...
    + API
    Documentation
    Frame


    +
    + Module
    Contents
     
    ...
      +

    + +

    The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

    + +

    The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

    + +

    The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

    + +

    The Navigation Bar

    + +

    A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LabelHighlighted when...Links to...
    [Parent](never highlighted) the parent of the current package
    [Package]viewing a packagethe package containing the current object +
    [Module]viewing a modulethe module containing the current object +
    [Class]viewing a class the class containing the current object
    [Trees]viewing the trees page the trees page
    [Index]viewing the index page the index page
    [Help]viewing the help page the help page
    + +

    The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

    + +

    A timestamp below the bottom navigation bar indicates when each +page was last updated.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/identifier-index.html Index: applications/examples/static/epydoc/identifier-index.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/identifier-index.html @@ -0,0 +1,5669 @@ + + + + + Identifier Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +
    +

    Identifier Index

    +
    +[ + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + _ +] +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    A

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    B

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    C

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    D

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    E

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    F

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    G

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    H

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    I

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    J

    + + + + + + + + + + + + + + + + + + + + + + +

    K

    + + + + + + + + + + + + +

    L

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    M

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    N

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    O

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    P

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Q

    + + + + + + + + +

    R

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    S

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    T

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    U

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    V

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    W

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    X

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Y

    + + + + + + + + +

    Z

    + + + + + + + + +

    _

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/index.html Index: applications/examples/static/epydoc/index.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/index.html @@ -0,0 +1,17 @@ + + + + + web2py Web Framework + + + + + + + + + ADDED applications/examples/static/epydoc/module-tree.html Index: applications/examples/static/epydoc/module-tree.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/module-tree.html @@ -0,0 +1,242 @@ + + + + + Module Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
    [hide private]
    [frames] | no frames]
    +
    +
    + [ Module Hierarchy + | Class Hierarchy ] +

    +

    Module Hierarchy

    +
      +
    • psycopg2: A Python driver for PostgreSQL + +psycopg is a PostgreSQL_ database adapter for the Python_ programming +language. + +
    • +
    • sqlite3.dbapi2: PyMySQL: A pure-Python drop-in replacement for MySQLdb.
    • +
    • web2py.gluon: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html) +
        +
      • web2py.gluon.admin: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.cache: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.cfs: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.compileapp: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.contenttype: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.contrib + +
      • +
      • web2py.gluon.custom_import
      • +
      • web2py.gluon.dal: This file is part of the web2py Web Framework...
      • +
      • web2py.gluon.debug: This file is part of the web2py Web Framework Developed by + Massimo Di Pierro <mdipierro@cs.depaul.edu>, limodou + <limodou@gmail.com> and srackham + <srackham@gmail.com>.
      • +
      • web2py.gluon.decoder
      • +
      • web2py.gluon.fileutils: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.globals: This file is part of the web2py Web Framework...
      • +
      • web2py.gluon.highlight: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.html: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.http: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.import_all: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.languages: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.main: This file is part of the web2py Web Framework...
      • +
      • web2py.gluon.myregex: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.newcron: Created by Attila Csipa <web2py@csipa.in.rs> Modified by + Massimo Di Pierro <mdipierro@cs.depaul.edu>
      • +
      • web2py.gluon.portalocker: Cross-platform (posix/nt) API for flock-style file locking.
      • +
      • web2py.gluon.reserved_sql_keywords
      • +
      • web2py.gluon.restricted: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.rewrite: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.rocket
      • +
      • web2py.gluon.sanitizer: :
      • +
      • web2py.gluon.serializers: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.settings: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.shell: This file is part of the web2py Web Framework Developed by + Massimo Di Pierro <mdipierro@cs.depaul.edu>, limodou + <limodou@gmail.com> and srackham + <srackham@gmail.com>.
      • +
      • web2py.gluon.sql
      • +
      • web2py.gluon.sqlhtml: This file is part of the web2py Web Framework...
      • +
      • web2py.gluon.storage: This file is part of the web2py Web Framework...
      • +
      • web2py.gluon.streamer: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.template: This file is part of the web2py Web Framework (Copyrighted, 2007-2011).
      • +
      • web2py.gluon.tools: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.utils: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.validators: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.widget: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      • web2py.gluon.xmlrpc: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
      • +
      +
    • +
    • web2py.gluon.contrib.pymysql: PyMySQL: A pure-Python drop-in replacement for MySQLdb. + +
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2-module.html Index: applications/examples/static/epydoc/psycopg2-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2-module.html @@ -0,0 +1,770 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package psycopg2 + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Package psycopg2

    source code

    +
    +A Python driver for PostgreSQL
    +
    +psycopg is a PostgreSQL_ database adapter for the Python_ programming
    +language. This is version 2, a complete rewrite of the original code to
    +provide new-style classes for connection and cursor objects and other sweet
    +candies. Like the original, psycopg 2 was written with the aim of being very
    +small and fast, and stable as a rock.
    +
    +Homepage: http://initd.org/projects/psycopg2
    +
    +.. _PostgreSQL: http://www.postgresql.org/
    +.. _Python: http://www.python.org/
    +
    +:Groups:
    +  * `Connections creation`: connect
    +  * `Value objects constructors`: Binary, Date, DateFromTicks, Time,
    +    TimeFromTicks, Timestamp, TimestampFromTicks
    +
    +


    + +
    +

    Version: + 2.0.6 (dec mx dt ext pq3) +

    +
    + + + + + + +
    + + + + + +
    Submodules[hide private]
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + DataError
    + Error related to problems with the processed data. +
    +   + + DatabaseError
    + Error related to the database engine. +
    +   + + Error
    + Base class for error exceptions. +
    +   + + IntegrityError
    + Error related to database integrity. +
    +   + + InterfaceError
    + Error related to the database interface. +
    +   + + InternalError
    + The database encountered an internal error. +
    +   + + NotSupportedError
    + A not supported datbase API was called. +
    +   + + OperationalError
    + Error related to database operation (disconnect, memory + allocation etc). +
    +   + + ProgrammingError
    + Error related to database programming (SQL error, table not + found etc). +
    +   + + Warning
    + A database warning. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    Binary(buffer)
    + Build an object capable to hold a bynary string value.
    + + +
    + +
    +   + + + + + + +
    Date(year, + month, + day)
    + Build an object holding a date value.
    + + +
    + +
    +   + + + + + + +
    DateFromTicks(ticks)
    + Build an object holding a date value from the given ticks + value.
    + + +
    + +
    +   + + + + + + +
    Time(hour, + minutes, + seconds, + tzinfo=None)
    + Build an object holding a time value.
    + + +
    + +
    +   + + + + + + +
    TimeFromTicks(ticks)
    + Build an object holding a time value from the given ticks + value.
    + + +
    + +
    +   + + + + + + +
    Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None)
    + Build an object holding a timestamp value.
    + + +
    + +
    +   + + + + + + +
    TimestampFromTicks(ticks)
    + Build an object holding a timestamp value from the given ticks + value.
    + + +
    + +
    +   + + + + + + +
    connect(dsn, + ...)
    + Create a new database connection.
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + BINARY = <psycopg2._psycopg.type object at 0xd660a0> +
    +   + + DATETIME = <psycopg2._psycopg.type object at 0xd5ef80> +
    +   + + NUMBER = <psycopg2._psycopg.type object at 0xd5ed88> +
    +   + + ROWID = <psycopg2._psycopg.type object at 0xd660d8> +
    +   + + STRING = <psycopg2._psycopg.type object at 0xd5ef10> +
    +   + + apilevel = '2.0' +
    +   + + k = 'DatabaseError' +
    +   + + paramstyle = 'pyformat' +
    +   + + threadsafety = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    Binary(buffer) +

    +
      +
    + + Build an object capable to hold a bynary string value. +
    +
    Returns:
    +
    +new binary object
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    Date(year, + month, + day) +

    +
      +
    + + Build an object holding a date value. +
    +
    Returns:
    +
    +new date
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    DateFromTicks(ticks) +

    +
      +
    + +

    Build an object holding a date value from the given ticks value.

    + Ticks are the number of seconds since the epoch; see the documentation + of the standard Python time module for details). +
    +
    Returns:
    +
    +new date
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    Time(hour, + minutes, + seconds, + tzinfo=None) +

    +
      +
    + + Build an object holding a time value. +
    +
    Returns:
    +
    +new time
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    TimeFromTicks(ticks) +

    +
      +
    + +

    Build an object holding a time value from the given ticks value.

    + Ticks are the number of seconds since the epoch; see the documentation + of the standard Python time module for details). +
    +
    Returns:
    +
    +new time
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None) +

    +
      +
    + + Build an object holding a timestamp value. +
    +
    Returns:
    +
    +new timestamp
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    TimestampFromTicks(ticks) +

    +
      +
    + +

    Build an object holding a timestamp value from the given ticks + value.

    + Ticks are the number of seconds since the epoch; see the documentation + of the standard Python time module for details). +
    +
    Returns:
    +
    +new timestamp
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    connect(dsn, + ...) +

    +
      +
    + +
    +Create a new database connection.
    +
    +This function supports two different but equivalent sets of arguments.
    +A single data source name or ``dsn`` string can be used to specify the
    +connection parameters, as follows::
    +
    +    psycopg2.connect("dbname=xxx user=xxx ...")
    +
    +If ``dsn`` is not provided it is possible to pass the parameters as
    +keyword arguments; e.g.::
    +
    +    psycopg2.connect(database='xxx', user='xxx', ...)
    +
    +The full list of available parameters is:
    +
    +- ``dbname`` -- database name (only in 'dsn')
    +- ``database`` -- database name (only as keyword argument)
    +- ``host`` -- host address (defaults to UNIX socket if not provided)
    +- ``port`` -- port number (defaults to 5432 if not provided)
    +- ``user`` -- user name used to authenticate
    +- ``password`` -- password used to authenticate
    +- ``sslmode`` -- SSL mode (see PostgreSQL documentation)
    +
    +If the ``connection_factory`` keyword argument is not provided this
    +function always return an instance of the `connection` class.
    +Else the given sub-class of `extensions.connection` will be used to
    +instantiate the connection object.
    +
    +:return: New database connection
    +:rtype: `extensions.connection`
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2-pysrc.html Index: applications/examples/static/epydoc/psycopg2-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2-pysrc.html @@ -0,0 +1,225 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package psycopg2 + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Package psycopg2

    +
    + 1  """A Python driver for PostgreSQL 
    + 2   
    + 3  psycopg is a PostgreSQL_ database adapter for the Python_ programming 
    + 4  language. This is version 2, a complete rewrite of the original code to 
    + 5  provide new-style classes for connection and cursor objects and other sweet 
    + 6  candies. Like the original, psycopg 2 was written with the aim of being very 
    + 7  small and fast, and stable as a rock. 
    + 8   
    + 9  Homepage: http://initd.org/projects/psycopg2 
    +10   
    +11  .. _PostgreSQL: http://www.postgresql.org/ 
    +12  .. _Python: http://www.python.org/ 
    +13   
    +14  :Groups: 
    +15    * `Connections creation`: connect 
    +16    * `Value objects constructors`: Binary, Date, DateFromTicks, Time, 
    +17      TimeFromTicks, Timestamp, TimestampFromTicks 
    +18  """ 
    +19  # psycopg/__init__.py - initialization of the psycopg module 
    +20  # 
    +21  # Copyright (C) 2003-2004 Federico Di Gregorio  <fog@debian.org> 
    +22  # 
    +23  # This program is free software; you can redistribute it and/or modify 
    +24  # it under the terms of the GNU General Public License as published by the 
    +25  # Free Software Foundation; either version 2, or (at your option) any later 
    +26  # version. 
    +27  # 
    +28  # This program is distributed in the hope that it will be useful, but 
    +29  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 
    +30  # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
    +31  # for more details. 
    +32   
    +33  # Import modules needed by _psycopg to allow tools like py2exe to do 
    +34  # their work without bothering about the module dependencies. 
    +35  #  
    +36  # TODO: we should probably use the Warnings framework to signal a missing 
    +37  # module instead of raising an exception (in case we're running a thin 
    +38  # embedded Python or something even more devious.) 
    +39   
    +40  import sys, warnings 
    +41  if sys.version_info[0] >= 2 and sys.version_info[1] >= 3: 
    +42      try: 
    +43          import datetime as _psycopg_needs_datetime 
    +44      except: 
    +45          warnings.warn( 
    +46              "can't import datetime module probably needed by _psycopg", 
    +47              RuntimeWarning) 
    +48  if sys.version_info[0] >= 2 and sys.version_info[1] >= 4: 
    +49      try: 
    +50          import decimal as _psycopg_needs_decimal 
    +51      except: 
    +52          warnings.warn( 
    +53              "can't import decimal module probably needed by _psycopg", 
    +54              RuntimeWarning) 
    +55  from psycopg2 import tz 
    +56  del sys, warnings 
    +57   
    +58  # Import the DBAPI-2.0 stuff into top-level module. 
    +59   
    +60  from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID 
    +61   
    +62  from _psycopg import Binary, Date, Time, Timestamp 
    +63  from _psycopg import DateFromTicks, TimeFromTicks, TimestampFromTicks 
    +64   
    +65  from _psycopg import Error, Warning, DataError, DatabaseError, ProgrammingError 
    +66  from _psycopg import IntegrityError, InterfaceError, InternalError 
    +67  from _psycopg import NotSupportedError, OperationalError 
    +68   
    +69  from _psycopg import connect, apilevel, threadsafety, paramstyle 
    +70  from _psycopg import __version__ 
    +71   
    +72  __all__ = [ k for k in locals().keys() if not k.startswith('_') ] 
    +73   
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.DataError-class.html Index: applications/examples/static/epydoc/psycopg2.DataError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.DataError-class.html @@ -0,0 +1,204 @@ + + + + + psycopg2.DataError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + DataError :: + Class DataError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class DataError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          DataError
    +
    + +
    +Error related to problems with the processed data.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.DatabaseError-class.html Index: applications/examples/static/epydoc/psycopg2.DatabaseError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.DatabaseError-class.html @@ -0,0 +1,212 @@ + + + + + psycopg2.DatabaseError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + DatabaseError :: + Class DatabaseError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class DatabaseError

    source code

    +
    +              object --+                
    +                       |                
    +exceptions.BaseException --+            
    +                           |            
    +        exceptions.Exception --+        
    +                               |        
    +        exceptions.StandardError --+    
    +                                   |    
    +                               Error --+
    +                                       |
    +                                      DatabaseError
    +
    + +
    Known Subclasses:
    +
    + DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError +
    + +
    +Error related to the database engine.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.Error-class.html Index: applications/examples/static/epydoc/psycopg2.Error-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.Error-class.html @@ -0,0 +1,206 @@ + + + + + psycopg2.Error + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + Error :: + Class Error + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class Error

    source code

    +
    +              object --+            
    +                       |            
    +exceptions.BaseException --+        
    +                           |        
    +        exceptions.Exception --+    
    +                               |    
    +        exceptions.StandardError --+
    +                                   |
    +                                  Error
    +
    + +
    Known Subclasses:
    +
    + DatabaseError, + InterfaceError +
    + +
    +Base class for error exceptions.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.IntegrityError-class.html Index: applications/examples/static/epydoc/psycopg2.IntegrityError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.IntegrityError-class.html @@ -0,0 +1,204 @@ + + + + + psycopg2.IntegrityError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + IntegrityError :: + Class IntegrityError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class IntegrityError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          IntegrityError
    +
    + +
    +Error related to database integrity.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.InterfaceError-class.html Index: applications/examples/static/epydoc/psycopg2.InterfaceError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.InterfaceError-class.html @@ -0,0 +1,202 @@ + + + + + psycopg2.InterfaceError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + InterfaceError :: + Class InterfaceError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class InterfaceError

    source code

    +
    +              object --+                
    +                       |                
    +exceptions.BaseException --+            
    +                           |            
    +        exceptions.Exception --+        
    +                               |        
    +        exceptions.StandardError --+    
    +                                   |    
    +                               Error --+
    +                                       |
    +                                      InterfaceError
    +
    + +
    +Error related to the database interface.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.InternalError-class.html Index: applications/examples/static/epydoc/psycopg2.InternalError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.InternalError-class.html @@ -0,0 +1,204 @@ + + + + + psycopg2.InternalError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + InternalError :: + Class InternalError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class InternalError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          InternalError
    +
    + +
    +The database encountered an internal error.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.NotSupportedError-class.html Index: applications/examples/static/epydoc/psycopg2.NotSupportedError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.NotSupportedError-class.html @@ -0,0 +1,204 @@ + + + + + psycopg2.NotSupportedError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + NotSupportedError :: + Class NotSupportedError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class NotSupportedError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          NotSupportedError
    +
    + +
    +A not supported datbase API was called.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.OperationalError-class.html Index: applications/examples/static/epydoc/psycopg2.OperationalError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.OperationalError-class.html @@ -0,0 +1,205 @@ + + + + + psycopg2.OperationalError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + OperationalError :: + Class OperationalError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class OperationalError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          OperationalError
    +
    + +
    +Error related to database operation (disconnect, memory allocation + etc).

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.ProgrammingError-class.html Index: applications/examples/static/epydoc/psycopg2.ProgrammingError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.ProgrammingError-class.html @@ -0,0 +1,205 @@ + + + + + psycopg2.ProgrammingError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + ProgrammingError :: + Class ProgrammingError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class ProgrammingError

    source code

    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +        exceptions.StandardError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          ProgrammingError
    +
    + +
    +Error related to database programming (SQL error, table not found + etc).

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.Warning-class.html Index: applications/examples/static/epydoc/psycopg2.Warning-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.Warning-class.html @@ -0,0 +1,200 @@ + + + + + psycopg2.Warning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + Warning :: + Class Warning + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class Warning

    source code

    +
    +              object --+            
    +                       |            
    +exceptions.BaseException --+        
    +                           |        
    +        exceptions.Exception --+    
    +                               |    
    +        exceptions.StandardError --+
    +                                   |
    +                                  Warning
    +
    + +
    +A database warning.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.StandardError: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.tz-module.html Index: applications/examples/static/epydoc/psycopg2.tz-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.tz-module.html @@ -0,0 +1,207 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package psycopg2 :: + Module tz + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module tz

    source code

    +

    tzinfo implementations for psycopg2

    + This module holds two different tzinfo implementations that can be + used as the 'tzinfo' argument to datetime constructors, directly passed + to psycopg functions or used to set the .tzinfo_factory attribute in + cursors.

    + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + FixedOffsetTimezone
    + Fixed offset in minutes east from UTC. +
    +   + + LocalTimezone
    + Platform idea of local timezone. +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + DSTDIFF = datetime.timedelta(0, 3600) +
    +   + + DSTOFFSET = datetime.timedelta(0, 3600) +
    +   + + LOCAL = <psycopg2.tz.LocalTimezone object at 0xd4e690> +
    +   + + STDOFFSET = datetime.timedelta(0) +
    +   + + ZERO = datetime.timedelta(0) +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.tz-pysrc.html Index: applications/examples/static/epydoc/psycopg2.tz-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.tz-pysrc.html @@ -0,0 +1,221 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package psycopg2 :: + Module tz + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module psycopg2.tz

    +
    +  1  """tzinfo implementations for psycopg2 
    +  2   
    +  3  This module holds two different tzinfo implementations that can be used as 
    +  4  the 'tzinfo' argument to datetime constructors, directly passed to psycopg 
    +  5  functions or used to set the .tzinfo_factory attribute in cursors.  
    +  6  """ 
    +  7  # psycopg/tz.py - tzinfo implementation 
    +  8  # 
    +  9  # Copyright (C) 2003-2004 Federico Di Gregorio  <fog@debian.org> 
    + 10  # 
    + 11  # This program is free software; you can redistribute it and/or modify 
    + 12  # it under the terms of the GNU General Public License as published by the 
    + 13  # Free Software Foundation; either version 2, or (at your option) any later 
    + 14  # version. 
    + 15  # 
    + 16  # This program is distributed in the hope that it will be useful, but 
    + 17  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 
    + 18  # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
    + 19  # for more details. 
    + 20   
    + 21  import datetime 
    + 22  import time 
    + 23   
    + 24   
    + 25  ZERO = datetime.timedelta(0) 
    + 26   
    +
    27 -class FixedOffsetTimezone(datetime.tzinfo): +
    28 """Fixed offset in minutes east from UTC. + 29 + 30 This is exactly the implementation found in Python 2.3.x documentation, + 31 with a small change to the __init__ method to allow for pickling and a + 32 default name in the form 'sHH:MM' ('s' is the sign.) + 33 """ + 34 _name = None + 35 _offset = ZERO + 36 +
    37 - def __init__(self, offset=None, name=None): +
    38 if offset is not None: + 39 self._offset = datetime.timedelta(minutes = offset) + 40 if name is not None: + 41 self._name = name +
    42 +
    43 - def utcoffset(self, dt): +
    44 return self._offset +
    45 +
    46 - def tzname(self, dt): +
    47 if self._name is not None: + 48 return self._name + 49 else: + 50 seconds = self._offset.seconds + self._offset.days * 86400 + 51 hours, seconds = divmod(seconds, 3600) + 52 minutes = seconds/60 + 53 if minutes: + 54 return "%+03d:%d" % (hours, minutes) + 55 else: + 56 return "%+03d" % hours +
    57 +
    58 - def dst(self, dt): +
    59 return ZERO +
    60 + 61 + 62 STDOFFSET = datetime.timedelta(seconds = -time.timezone) + 63 if time.daylight: + 64 DSTOFFSET = datetime.timedelta(seconds = -time.altzone) + 65 else: + 66 DSTOFFSET = STDOFFSET + 67 DSTDIFF = DSTOFFSET - STDOFFSET + 68 +
    69 -class LocalTimezone(datetime.tzinfo): +
    70 """Platform idea of local timezone. + 71 + 72 This is the exact implementation from the Pyhton 2.3 documentation. + 73 """ + 74 +
    75 - def utcoffset(self, dt): +
    76 if self._isdst(dt): + 77 return DSTOFFSET + 78 else: + 79 return STDOFFSET +
    80 +
    81 - def dst(self, dt): +
    82 if self._isdst(dt): + 83 return DSTDIFF + 84 else: + 85 return ZERO +
    86 +
    87 - def tzname(self, dt): +
    88 return time.tzname[self._isdst(dt)] +
    89 +
    90 - def _isdst(self, dt): +
    91 tt = (dt.year, dt.month, dt.day, + 92 dt.hour, dt.minute, dt.second, + 93 dt.weekday(), 0, -1) + 94 stamp = time.mktime(tt) + 95 tt = time.localtime(stamp) + 96 return tt.tm_isdst > 0 +
    97 + 98 LOCAL = LocalTimezone() + 99 +100 # TODO: pre-generate some interesting time zones? +101 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.tz.FixedOffsetTimezone-class.html Index: applications/examples/static/epydoc/psycopg2.tz.FixedOffsetTimezone-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.tz.FixedOffsetTimezone-class.html @@ -0,0 +1,416 @@ + + + + + psycopg2.tz.FixedOffsetTimezone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + tz :: + FixedOffsetTimezone :: + Class FixedOffsetTimezone + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class FixedOffsetTimezone

    source code

    +
    +     object --+    
    +              |    
    +datetime.tzinfo --+
    +                  |
    +                 FixedOffsetTimezone
    +
    + +
    +

    Fixed offset in minutes east from UTC.

    + This is exactly the implementation found in Python 2.3.x + documentation, with a small change to the __init__ method to allow for + pickling and a default name in the form 'sHH:MM' ('s' is the sign.)

    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __init__(self, + offset=1, + name=1)
    + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature
    + source code + +
    + +
    +   + + + + + + +
    dst(self, + dt)
    + datetime -> DST offset in minutes east of UTC.
    + source code + +
    + +
    +   + + + + + + +
    tzname(self, + dt)
    + datetime -> string name of time zone.
    + source code + +
    + +
    +   + + + + + + +
    utcoffset(self, + dt)
    + datetime -> minutes east of UTC (negative for west of UTC).
    + source code + +
    + +
    +

    Inherited from datetime.tzinfo: + __getattribute__, + __new__, + __reduce__, + fromutc +

    +

    Inherited from object: + __delattr__, + __hash__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + _name = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + _offset = datetime.timedelta(0) +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __init__(self, + offset=1, + name=1) +
    (Constructor) +

    +
    source code  +
    + + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
    +
    Overrides: + object.__init__ +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    dst(self, + dt) +

    +
    source code  +
    + + datetime -> DST offset in minutes east of UTC. +
    +
    Overrides: + datetime.tzinfo.dst +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    tzname(self, + dt) +

    +
    source code  +
    + + datetime -> string name of time zone. +
    +
    Overrides: + datetime.tzinfo.tzname +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    utcoffset(self, + dt) +

    +
    source code  +
    + + datetime -> minutes east of UTC (negative for west of UTC). +
    +
    Overrides: + datetime.tzinfo.utcoffset +
    (inherited documentation)
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/psycopg2.tz.LocalTimezone-class.html Index: applications/examples/static/epydoc/psycopg2.tz.LocalTimezone-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/psycopg2.tz.LocalTimezone-class.html @@ -0,0 +1,353 @@ + + + + + psycopg2.tz.LocalTimezone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + psycopg2 :: + tz :: + LocalTimezone :: + Class LocalTimezone + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class LocalTimezone

    source code

    +
    +     object --+    
    +              |    
    +datetime.tzinfo --+
    +                  |
    +                 LocalTimezone
    +
    + +
    +

    Platform idea of local timezone.

    + This is the exact implementation from the Pyhton 2.3 + documentation.

    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    _isdst(self, + dt) + source code + +
    + +
    +   + + + + + + +
    dst(self, + dt)
    + datetime -> DST offset in minutes east of UTC.
    + source code + +
    + +
    +   + + + + + + +
    tzname(self, + dt)
    + datetime -> string name of time zone.
    + source code + +
    + +
    +   + + + + + + +
    utcoffset(self, + dt)
    + datetime -> minutes east of UTC (negative for west of UTC).
    + source code + +
    + +
    +

    Inherited from datetime.tzinfo: + __getattribute__, + __new__, + __reduce__, + fromutc +

    +

    Inherited from object: + __delattr__, + __hash__, + __init__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    dst(self, + dt) +

    +
    source code  +
    + + datetime -> DST offset in minutes east of UTC. +
    +
    Overrides: + datetime.tzinfo.dst +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    tzname(self, + dt) +

    +
    source code  +
    + + datetime -> string name of time zone. +
    +
    Overrides: + datetime.tzinfo.tzname +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    utcoffset(self, + dt) +

    +
    source code  +
    + + datetime -> minutes east of UTC (negative for west of UTC). +
    +
    Overrides: + datetime.tzinfo.utcoffset +
    (inherited documentation)
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/redirect.html Index: applications/examples/static/epydoc/redirect.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/redirect.html @@ -0,0 +1,38 @@ +Epydoc Redirect Page + + + + + + + + +

    Epydoc Auto-redirect page

    + +

    When javascript is enabled, this page will redirect URLs of +the form redirect.html#dotted.name to the +documentation for the object with the given fully-qualified +dotted name.

    +

     

    + + + + + ADDED applications/examples/static/epydoc/sqlite3.dbapi2-module.html Index: applications/examples/static/epydoc/sqlite3.dbapi2-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/sqlite3.dbapi2-module.html @@ -0,0 +1,589 @@ + + + + + sqlite3.dbapi2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package sqlite3 :: + Module dbapi2 + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module dbapi2

    source code

    +

    PyMySQL: A pure-Python drop-in replacement for MySQLdb.

    +

    Copyright (c) 2010 PyMySQL contributors

    +

    Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, and + to permit persons to whom the Software is furnished to do so, subject to + the following conditions:

    +

    The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software.

    + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE.

    + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    DateFromTicks(ticks) + source code + +
    + +
    +   + + + + + + +
    TimeFromTicks(ticks) + source code + +
    + +
    +   + + + + + + +
    TimestampFromTicks(ticks) + source code + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + PARSE_COLNAMES = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + PARSE_DECLTYPES = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_ALTER_TABLE = 26 +
    +   + + SQLITE_ANALYZE = 28 +
    +   + + SQLITE_ATTACH = 24 +
    +   + + SQLITE_CREATE_INDEX = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_CREATE_TABLE = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_CREATE_TEMP_INDEX = 3 +
    +   + + SQLITE_CREATE_TEMP_TABLE = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_CREATE_TEMP_TRIGGER = 5 +
    +   + + SQLITE_CREATE_TEMP_VIEW = 6 +
    +   + + SQLITE_CREATE_TRIGGER = 7 +
    +   + + SQLITE_CREATE_VIEW = 8 +
    +   + + SQLITE_DELETE = 9 +
    +   + + SQLITE_DENY = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_DETACH = 25 +
    +   + + SQLITE_DROP_INDEX = 10 +
    +   + + SQLITE_DROP_TABLE = 11 +
    +   + + SQLITE_DROP_TEMP_INDEX = 12 +
    +   + + SQLITE_DROP_TEMP_TABLE = 13 +
    +   + + SQLITE_DROP_TEMP_TRIGGER = 14 +
    +   + + SQLITE_DROP_TEMP_VIEW = 15 +
    +   + + SQLITE_DROP_TRIGGER = 16 +
    +   + + SQLITE_DROP_VIEW = 17 +
    +   + + SQLITE_IGNORE = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + SQLITE_INSERT = 18 +
    +   + + SQLITE_OK = 0 +
    +   + + SQLITE_PRAGMA = 19 +
    +   + + SQLITE_READ = 20 +
    +   + + SQLITE_REINDEX = 27 +
    +   + + SQLITE_SELECT = 21 +
    +   + + SQLITE_TRANSACTION = 22 +
    +   + + SQLITE_UPDATE = 23 +
    +   + + adapters = {(<type 'datetime.date'>, <type 'sqlite3.PreparePro... +
    +   + + apilevel = '2.0' +
    +   + + converters = {'DATE': <function convert_date at 0xd25668>, 'TI... +
    +   + + paramstyle = 'qmark' +
    +   + + sqlite_version = '3.4.2' +
    +   + + sqlite_version_info = (3, 4, 2) +
    +   + + threadsafety = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + version = '2.3.2' +
    +   + + version_info = (2, 3, 2) +
    +   + + x = '2' +
    + + + + + + +
    + + + + + +
    Variables Details[hide private]
    +
    + +
    + +
    +

    adapters

    + +
    +
    +
    +
    Value:
    +
    +{(<type 'datetime.date'>, <type 'sqlite3.PrepareProtocol'>): <function\
    + adapt_date at 0xd25578>,
    + (<type 'datetime.datetime'>, <type 'sqlite3.PrepareProtocol'>): <func\
    +tion adapt_datetime at 0xd255f0>}
    +
    +
    +
    +
    +
    + +
    + +
    +

    converters

    + +
    +
    +
    +
    Value:
    +
    +{'DATE': <function convert_date at 0xd25668>,
    + 'TIMESTAMP': <function convert_timestamp at 0xd256e0>}
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/sqlite3.dbapi2-pysrc.html Index: applications/examples/static/epydoc/sqlite3.dbapi2-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/sqlite3.dbapi2-pysrc.html @@ -0,0 +1,217 @@ + + + + + sqlite3.dbapi2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package sqlite3 :: + Module dbapi2 + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module sqlite3.dbapi2

    +
    + 1  #-*- coding: ISO-8859-1 -*- 
    + 2  # pysqlite2/dbapi2.py: the DB-API 2.0 interface 
    + 3  # 
    + 4  # Copyright (C) 2004-2005 Gerhard Häring <gh@ghaering.de> 
    + 5  # 
    + 6  # This file is part of pysqlite. 
    + 7  # 
    + 8  # This software is provided 'as-is', without any express or implied 
    + 9  # warranty.  In no event will the authors be held liable for any damages 
    +10  # arising from the use of this software. 
    +11  # 
    +12  # Permission is granted to anyone to use this software for any purpose, 
    +13  # including commercial applications, and to alter it and redistribute it 
    +14  # freely, subject to the following restrictions: 
    +15  # 
    +16  # 1. The origin of this software must not be misrepresented; you must not 
    +17  #    claim that you wrote the original software. If you use this software 
    +18  #    in a product, an acknowledgment in the product documentation would be 
    +19  #    appreciated but is not required. 
    +20  # 2. Altered source versions must be plainly marked as such, and must not be 
    +21  #    misrepresented as being the original software. 
    +22  # 3. This notice may not be removed or altered from any source distribution. 
    +23   
    +24  import datetime 
    +25  import time 
    +26   
    +27  from _sqlite3 import * 
    +28   
    +29  paramstyle = "qmark" 
    +30   
    +31  threadsafety = 1 
    +32   
    +33  apilevel = "2.0" 
    +34   
    +35  Date = datetime.date 
    +36   
    +37  Time = datetime.time 
    +38   
    +39  Timestamp = datetime.datetime 
    +40   
    +
    41 -def DateFromTicks(ticks): +
    42 return apply(Date, time.localtime(ticks)[:3]) +
    43 +
    44 -def TimeFromTicks(ticks): +
    45 return apply(Time, time.localtime(ticks)[3:6]) +
    46 +
    47 -def TimestampFromTicks(ticks): +
    48 return apply(Timestamp, time.localtime(ticks)[:6]) +
    49 +50 version_info = tuple([int(x) for x in version.split(".")]) +51 sqlite_version_info = tuple([int(x) for x in sqlite_version.split(".")]) +52 +53 Binary = buffer +54 +
    56 def adapt_date(val): +57 return val.isoformat() +
    58 +59 def adapt_datetime(val): +60 return val.isoformat(" ") +61 +62 def convert_date(val): +63 return datetime.date(*map(int, val.split("-"))) +64 +65 def convert_timestamp(val): +66 datepart, timepart = val.split(" ") +67 year, month, day = map(int, datepart.split("-")) +68 timepart_full = timepart.split(".") +69 hours, minutes, seconds = map(int, timepart_full[0].split(":")) +70 if len(timepart_full) == 2: +71 microseconds = int(float("0." + timepart_full[1]) * 1000000) +72 else: +73 microseconds = 0 +74 +75 val = datetime.datetime(year, month, day, hours, minutes, seconds, microseconds) +76 return val +77 +78 +79 register_adapter(datetime.date, adapt_date) +80 register_adapter(datetime.datetime, adapt_datetime) +81 register_converter("date", convert_date) +82 register_converter("timestamp", convert_timestamp) +83 +84 register_adapters_and_converters() +85 +86 # Clean up namespace +87 +88 del(register_adapters_and_converters) +89 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/title.png Index: applications/examples/static/epydoc/title.png ================================================================== --- /dev/null +++ applications/examples/static/epydoc/title.png cannot compute difference between binary files ADDED applications/examples/static/epydoc/toc-everything.html Index: applications/examples/static/epydoc/toc-everything.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-everything.html @@ -0,0 +1,1868 @@ + + + + + Everything + + + + + +

    Everything

    +
    +

    All Classes

    + datetime.date
    datetime.datetime
    datetime.time
    exceptions.Exception
    psycopg2.DataError
    psycopg2.DatabaseError
    psycopg2.Error
    psycopg2.IntegrityError
    psycopg2.InterfaceError
    psycopg2.InternalError
    psycopg2.NotSupportedError
    psycopg2.OperationalError
    psycopg2.ProgrammingError
    psycopg2.Warning
    psycopg2.tz.FixedOffsetTimezone
    psycopg2.tz.LocalTimezone
    web2py.gluon.cache.Cache
    + + + web2py.gluon.compileapp.LoadFactory
    web2py.gluon.compileapp.mybuiltin
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.debug.Pipe
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.main.HttpServer
    web2py.gluon.newcron.Token
    web2py.gluon.newcron.cronlauncher
    web2py.gluon.newcron.extcron
    web2py.gluon.newcron.hardcron
    web2py.gluon.newcron.softcron
    web2py.gluon.restricted.RestrictedError
    web2py.gluon.restricted.TicketStorage
    + + + + + + + + + web2py.gluon.rocket.NullHandler
    web2py.gluon.rocket.Rocket
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.template.BlockNode
    web2py.gluon.template.Content
    web2py.gluon.template.Node
    web2py.gluon.template.SuperNode
    web2py.gluon.template.TemplateParser
    web2py.gluon.tools.Auth
    web2py.gluon.tools.Crud
    web2py.gluon.tools.Mail
    web2py.gluon.tools.Mail.Attachment
    web2py.gluon.tools.PluginManager
    web2py.gluon.tools.Recaptcha
    web2py.gluon.tools.Service
    web2py.gluon.tools.Service.JsonRpcException
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.widget.IO
    web2py.gluon.widget.web2pyDialog
    + +

    All Functions

    + web2py.gluon.admin.add_path_first
    web2py.gluon.admin.apath
    web2py.gluon.admin.app_cleanup
    web2py.gluon.admin.app_compile
    web2py.gluon.admin.app_create
    web2py.gluon.admin.app_install
    web2py.gluon.admin.app_pack
    web2py.gluon.admin.app_pack_compiled
    web2py.gluon.admin.app_uninstall
    web2py.gluon.admin.check_new_version
    web2py.gluon.admin.create_missing_app_folders
    web2py.gluon.admin.create_missing_folders
    web2py.gluon.admin.plugin_install
    web2py.gluon.admin.plugin_pack
    web2py.gluon.admin.unzip
    web2py.gluon.admin.upgrade
    + web2py.gluon.compileapp.build_environment
    web2py.gluon.compileapp.compile_application
    web2py.gluon.compileapp.compile_controllers
    web2py.gluon.compileapp.compile_models
    web2py.gluon.compileapp.compile_views
    web2py.gluon.compileapp.local_import_aux
    web2py.gluon.compileapp.read_pyc
    web2py.gluon.compileapp.remove_compiled_application
    web2py.gluon.compileapp.run_controller_in
    web2py.gluon.compileapp.run_models_in
    web2py.gluon.compileapp.run_view_in
    web2py.gluon.compileapp.save_pyc
    web2py.gluon.compileapp.test
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.custom_import.custom_import_install
    web2py.gluon.custom_import.is_tracking_changes
    web2py.gluon.custom_import.track_changes
    + + + + + + + + + + + + + + + + + + web2py.gluon.debug.communicate
    web2py.gluon.debug.set_trace
    web2py.gluon.debug.stop_trace
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.main.appfactory
    + + + + + web2py.gluon.main.save_password
    + + web2py.gluon.main.wsgibase
    web2py.gluon.newcron.crondance
    web2py.gluon.newcron.parsecronline
    web2py.gluon.newcron.rangetolist
    web2py.gluon.newcron.stopcron
    + + web2py.gluon.restricted.compile2
    web2py.gluon.restricted.restricted
    + + + + + + + + + + + + + + + + + + + + web2py.gluon.rocket.CherryPyWSGIServer
    + web2py.gluon.rocket.b
    + + + web2py.gluon.rocket.u
    + + + + + + + + web2py.gluon.shell.die
    web2py.gluon.shell.env
    web2py.gluon.shell.exec_environment
    web2py.gluon.shell.exec_pythonrc
    web2py.gluon.shell.execute_from_command_line
    web2py.gluon.shell.get_usage
    web2py.gluon.shell.parse_path_info
    web2py.gluon.shell.run
    web2py.gluon.shell.test
    + + + + + + + web2py.gluon.template.get_parsed
    web2py.gluon.template.parse_template
    web2py.gluon.template.render
    + + + + + web2py.gluon.tools.fetch
    web2py.gluon.tools.geocode
    web2py.gluon.tools.prettydate
    + + + + + + + + + + + + + + + + web2py.gluon.widget.console
    web2py.gluon.widget.presentation
    web2py.gluon.widget.start
    web2py.gluon.widget.start_browser
    web2py.gluon.widget.try_start_browser
    web2py.gluon.winservice.web2py_windows_service_handler
    +

    All Variables

    + psycopg2.BINARY
    psycopg2.DATETIME
    psycopg2.NUMBER
    psycopg2.ROWID
    psycopg2.STRING
    psycopg2.apilevel
    psycopg2.k
    psycopg2.paramstyle
    psycopg2.threadsafety
    psycopg2.tz.DSTDIFF
    psycopg2.tz.DSTOFFSET
    psycopg2.tz.LOCAL
    psycopg2.tz.STDOFFSET
    psycopg2.tz.ZERO
    sqlite3.dbapi2.PARSE_COLNAMES
    sqlite3.dbapi2.PARSE_DECLTYPES
    sqlite3.dbapi2.SQLITE_ALTER_TABLE
    sqlite3.dbapi2.SQLITE_ANALYZE
    sqlite3.dbapi2.SQLITE_ATTACH
    sqlite3.dbapi2.SQLITE_CREATE_INDEX
    sqlite3.dbapi2.SQLITE_CREATE_TABLE
    sqlite3.dbapi2.SQLITE_CREATE_TEMP_INDEX
    sqlite3.dbapi2.SQLITE_CREATE_TEMP_TABLE
    sqlite3.dbapi2.SQLITE_CREATE_TEMP_TRIGGER
    sqlite3.dbapi2.SQLITE_CREATE_TEMP_VIEW
    sqlite3.dbapi2.SQLITE_CREATE_TRIGGER
    sqlite3.dbapi2.SQLITE_CREATE_VIEW
    sqlite3.dbapi2.SQLITE_DELETE
    sqlite3.dbapi2.SQLITE_DENY
    sqlite3.dbapi2.SQLITE_DETACH
    sqlite3.dbapi2.SQLITE_DROP_INDEX
    sqlite3.dbapi2.SQLITE_DROP_TABLE
    sqlite3.dbapi2.SQLITE_DROP_TEMP_INDEX
    sqlite3.dbapi2.SQLITE_DROP_TEMP_TABLE
    sqlite3.dbapi2.SQLITE_DROP_TEMP_TRIGGER
    sqlite3.dbapi2.SQLITE_DROP_TEMP_VIEW
    sqlite3.dbapi2.SQLITE_DROP_TRIGGER
    sqlite3.dbapi2.SQLITE_DROP_VIEW
    sqlite3.dbapi2.SQLITE_IGNORE
    sqlite3.dbapi2.SQLITE_INSERT
    sqlite3.dbapi2.SQLITE_OK
    sqlite3.dbapi2.SQLITE_PRAGMA
    sqlite3.dbapi2.SQLITE_READ
    sqlite3.dbapi2.SQLITE_REINDEX
    sqlite3.dbapi2.SQLITE_SELECT
    sqlite3.dbapi2.SQLITE_TRANSACTION
    sqlite3.dbapi2.SQLITE_UPDATE
    sqlite3.dbapi2.adapters
    sqlite3.dbapi2.apilevel
    sqlite3.dbapi2.converters
    sqlite3.dbapi2.paramstyle
    sqlite3.dbapi2.sqlite_version
    sqlite3.dbapi2.sqlite_version_info
    sqlite3.dbapi2.threadsafety
    sqlite3.dbapi2.version
    sqlite3.dbapi2.version_info
    sqlite3.dbapi2.x
    web2py.gluon.ON
    web2py.gluon.TAG
    + + + + web2py.gluon.compileapp.TEST_CODE
    web2py.gluon.compileapp.is_gae
    web2py.gluon.compileapp.is_jython
    web2py.gluon.compileapp.logger
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.current
    + + + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.debug.debugger
    web2py.gluon.debug.logger
    web2py.gluon.debug.pipe_in
    web2py.gluon.debug.pipe_out
    + + + + + + + web2py.gluon.import_all.alert_dependency
    web2py.gluon.import_all.base_modules
    web2py.gluon.import_all.candidate
    web2py.gluon.import_all.contributed_modules
    web2py.gluon.import_all.dirs
    web2py.gluon.import_all.files
    web2py.gluon.import_all.module
    web2py.gluon.import_all.name
    web2py.gluon.import_all.py26_deprecated
    web2py.gluon.import_all.py27_deprecated
    web2py.gluon.import_all.python_version
    web2py.gluon.import_all.root
    + + + + + + + + + + + + + + + + web2py.gluon.newcron.logger
    + + + + + + web2py.gluon.reserved_sql_keywords.ADAPTERS
    web2py.gluon.reserved_sql_keywords.COMMON
    web2py.gluon.reserved_sql_keywords.DB2
    web2py.gluon.reserved_sql_keywords.FIREBIRD
    web2py.gluon.reserved_sql_keywords.FIREBIRD_NONRESERVED
    web2py.gluon.reserved_sql_keywords.INFORMIX
    web2py.gluon.reserved_sql_keywords.INGRES
    web2py.gluon.reserved_sql_keywords.JDBCPOSTGRESQL
    web2py.gluon.reserved_sql_keywords.JDBCSQLITE
    web2py.gluon.reserved_sql_keywords.MSSQL
    web2py.gluon.reserved_sql_keywords.MYSQL
    web2py.gluon.reserved_sql_keywords.ORACLE
    web2py.gluon.reserved_sql_keywords.POSTGRESQL
    web2py.gluon.reserved_sql_keywords.POSTGRESQL_NONRESERVED
    web2py.gluon.reserved_sql_keywords.SQLITE
    web2py.gluon.reserved_sql_keywords.__author__
    + + + + + + + + + + + + + + + web2py.gluon.rocket.BUF_SIZE
    web2py.gluon.rocket.DEFAULTS
    + + + + + web2py.gluon.rocket.HTTP_SERVER_SOFTWARE
    web2py.gluon.rocket.IGNORE_ERRORS_ON_CLOSE
    web2py.gluon.rocket.IS_JYTHON
    + + web2py.gluon.rocket.PY3K
    + web2py.gluon.rocket.SERVER_NAME
    web2py.gluon.rocket.SERVER_SOFTWARE
    + + web2py.gluon.rocket.VERSION
    + + + + + + + web2py.gluon.shell.logger
    web2py.gluon.sql.drivers
    + + + + + + + + + + + + + + + + + + + + + + web2py.gluon.widget.ProgramAuthor
    web2py.gluon.widget.ProgramInfo
    web2py.gluon.widget.ProgramName
    web2py.gluon.widget.ProgramVersion
    web2py.gluon.widget.logger
    web2py.gluon.widget.msg

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-psycopg2-module.html Index: applications/examples/static/epydoc/toc-psycopg2-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-psycopg2-module.html @@ -0,0 +1,60 @@ + + + + + psycopg2 + + + + + +

    Module psycopg2

    +
    +

    Classes

    + DataError
    DatabaseError
    Error
    IntegrityError
    InterfaceError
    InternalError
    NotSupportedError
    OperationalError
    ProgrammingError
    Warning

    Functions

    + Binary
    Date
    DateFromTicks
    Time
    TimeFromTicks
    Timestamp
    TimestampFromTicks
    connect

    Variables

    + BINARY
    DATETIME
    NUMBER
    ROWID
    STRING
    apilevel
    k
    paramstyle
    threadsafety

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-psycopg2.tz-module.html Index: applications/examples/static/epydoc/toc-psycopg2.tz-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-psycopg2.tz-module.html @@ -0,0 +1,39 @@ + + + + + tz + + + + + +

    Module tz

    +
    +

    Classes

    + FixedOffsetTimezone
    LocalTimezone

    Variables

    + DSTDIFF
    DSTOFFSET
    LOCAL
    STDOFFSET
    ZERO

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-sqlite3.dbapi2-module.html Index: applications/examples/static/epydoc/toc-sqlite3.dbapi2-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-sqlite3.dbapi2-module.html @@ -0,0 +1,78 @@ + + + + + dbapi2 + + + + + +

    Module dbapi2

    +
    +

    Functions

    + DateFromTicks
    TimeFromTicks
    TimestampFromTicks

    Variables

    + PARSE_COLNAMES
    PARSE_DECLTYPES
    SQLITE_ALTER_TABLE
    SQLITE_ANALYZE
    SQLITE_ATTACH
    SQLITE_CREATE_INDEX
    SQLITE_CREATE_TABLE
    SQLITE_CREATE_TEMP_INDEX
    SQLITE_CREATE_TEMP_TABLE
    SQLITE_CREATE_TEMP_TRIGGER
    SQLITE_CREATE_TEMP_VIEW
    SQLITE_CREATE_TRIGGER
    SQLITE_CREATE_VIEW
    SQLITE_DELETE
    SQLITE_DENY
    SQLITE_DETACH
    SQLITE_DROP_INDEX
    SQLITE_DROP_TABLE
    SQLITE_DROP_TEMP_INDEX
    SQLITE_DROP_TEMP_TABLE
    SQLITE_DROP_TEMP_TRIGGER
    SQLITE_DROP_TEMP_VIEW
    SQLITE_DROP_TRIGGER
    SQLITE_DROP_VIEW
    SQLITE_IGNORE
    SQLITE_INSERT
    SQLITE_OK
    SQLITE_PRAGMA
    SQLITE_READ
    SQLITE_REINDEX
    SQLITE_SELECT
    SQLITE_TRANSACTION
    SQLITE_UPDATE
    adapters
    apilevel
    converters
    paramstyle
    sqlite_version
    sqlite_version_info
    threadsafety
    version
    version_info
    x

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon-module.html @@ -0,0 +1,131 @@ + + + + + gluon + + + + + +

    Module gluon

    +
    +

    Classes

    + A
    B
    BEAUTIFY
    BODY
    BR
    CAT
    CENTER
    CLEANUP
    CODE
    CRYPT
    DAL
    DIV
    EM
    EMBED
    FIELDSET
    FORM
    Field
    H1
    H2
    H3
    H4
    H5
    H6
    HEAD
    HR
    HTML
    HTTP
    I
    IFRAME
    IMG
    INPUT
    IS_ALPHANUMERIC
    IS_DATE
    IS_DATETIME
    IS_DATETIME_IN_RANGE
    IS_DATE_IN_RANGE
    IS_DECIMAL_IN_RANGE
    IS_EMAIL
    IS_EMPTY_OR
    IS_EQUAL_TO
    IS_EXPR
    IS_FLOAT_IN_RANGE
    IS_IMAGE
    IS_INT_IN_RANGE
    IS_IN_DB
    IS_IN_SET
    IS_IPV4
    IS_LENGTH
    IS_LIST_OF
    IS_LOWER
    IS_MATCH
    IS_NOT_EMPTY
    IS_NOT_IN_DB
    IS_NULL_OR
    IS_SLUG
    IS_STRONG
    IS_TIME
    IS_UPLOAD_FILENAME
    IS_UPPER
    IS_URL
    LABEL
    LEGEND
    LI
    LINK
    MARKMIN
    MENU
    META
    OBJECT
    OL
    OPTGROUP
    OPTION
    P
    PRE
    SCRIPT
    SELECT
    SPAN
    SQLFORM
    SQLTABLE
    STYLE
    TABLE
    TBODY
    TD
    TEXTAREA
    TFOOT
    TH
    THEAD
    TITLE
    TR
    TT
    UL
    XHTML
    XML

    Functions

    + URL
    embed64
    redirect

    Variables

    + ON
    TAG
    current

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.admin-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.admin-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.admin-module.html @@ -0,0 +1,47 @@ + + + + + admin + + + + + +

    Module admin

    +
    +

    Functions

    + add_path_first
    apath
    app_cleanup
    app_compile
    app_create
    app_install
    app_pack
    app_pack_compiled
    app_uninstall
    check_new_version
    create_missing_app_folders
    create_missing_folders
    plugin_install
    plugin_pack
    unzip
    upgrade

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.cfs-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.cfs-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.cfs-module.html @@ -0,0 +1,41 @@ + + + + + cfs + + + + + +

    Module cfs

    +
    +

    Functions

    +
    + getcfs
    +

    Variables

    +
    + cfs
    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.compileapp-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.compileapp-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.compileapp-module.html @@ -0,0 +1,52 @@ + + + + + compileapp + + + + + +

    Module compileapp

    +
    +

    Classes

    + LoadFactory
    mybuiltin

    Functions

    + build_environment
    compile_application
    compile_controllers
    compile_models
    compile_views
    local_import_aux
    read_pyc
    remove_compiled_application
    run_controller_in
    run_models_in
    run_view_in
    save_pyc
    test

    Variables

    + TEST_CODE
    is_gae
    is_jython
    logger

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.contenttype-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.contenttype-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.contenttype-module.html @@ -0,0 +1,38 @@ + + + + + contenttype + + + + + +

    Module contenttype

    +
    +

    Functions

    + +

    Variables

    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql-module.html @@ -0,0 +1,156 @@ + + + + + pymysql + + + + + +

    Module pymysql

    +
    +

    Classes

    + + + +
    + Date
    +
    + Error
    + + + + + + +
    + Time
    + + +

    Functions

    +
    + Binary
    + + + + + + + + + + + + +

    Variables

    +
    + BINARY
    +
    + DATE
    + +
    + NULL
    +
    + NUMBER
    +
    + ROWID
    +
    + STRING
    +
    + TIME
    + + + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants-module.html @@ -0,0 +1,30 @@ + + + + + constants + + + + + +

    Module constants

    +
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html @@ -0,0 +1,118 @@ + + + + + FIELD_TYPE + + + + + +

    Module FIELD_TYPE

    +
    +

    Variables

    +
    + BIT
    +
    + BLOB
    +
    + CHAR
    +
    + DATE
    + + +
    + DOUBLE
    +
    + ENUM
    +
    + FLOAT
    + +
    + INT24
    + +
    + LONG
    + + + + + +
    + NULL
    +
    + SET
    +
    + SHORT
    +
    + STRING
    +
    + TIME
    + +
    + TINY
    + + + +
    + YEAR
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.converters-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.converters-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.contrib.pymysql.converters-module.html @@ -0,0 +1,137 @@ + + + + + converters + + + + + +

    Module converters

    +
    +

    Functions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Variables

    + + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.custom_import-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.custom_import-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.custom_import-module.html @@ -0,0 +1,60 @@ + + + + + custom_import + + + + + +

    Module custom_import

    +
    +

    Classes

    + + + + +

    Functions

    + custom_import_install
    is_tracking_changes
    track_changes

    Variables

    + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.dal-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.dal-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.dal-module.html @@ -0,0 +1,294 @@ + + + + + dal + + + + + +

    Module dal

    +
    +

    Classes

    + + + + +
    + DAL
    + + + +
    + Field
    + + + +
    + GAEF
    +
    + GQLDB
    + + + + + + + + + + + + + + +
    + Query
    + +
    + Row
    +
    + Rows
    + +
    + SQLALL
    + + +
    + SQLDB
    + + + +
    + SQLSet
    + + + + +
    + Set
    +
    + Table
    + + +

    Functions

    + + + + + + + + + + + + + + + + + +
    + xorify
    +

    Variables

    + + + + + + + + + + +
    + logger
    + + + + + + + + +
    + thread
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.debug-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.debug-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.debug-module.html @@ -0,0 +1,41 @@ + + + + + debug + + + + + +

    Module debug

    +
    +

    Classes

    + Pipe

    Functions

    + communicate
    set_trace
    stop_trace

    Variables

    + debugger
    logger
    pipe_in
    pipe_out

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.decoder-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.decoder-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.decoder-module.html @@ -0,0 +1,41 @@ + + + + + decoder + + + + + +

    Module decoder

    +
    +

    Functions

    + + +

    Variables

    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.fileutils-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.fileutils-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.fileutils-module.html @@ -0,0 +1,97 @@ + + + + + fileutils + + + + + +

    Module fileutils

    +
    +

    Functions

    + + + + + + + + + +
    + mktree
    + + + +
    + tar
    + +
    + untar
    +
    + up
    + + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.globals-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.globals-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.globals-module.html @@ -0,0 +1,47 @@ + + + + + globals + + + + + +

    Module globals

    +
    +

    Classes

    + + + +

    Variables

    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.highlight-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.highlight-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.highlight-module.html @@ -0,0 +1,38 @@ + + + + + highlight + + + + + +

    Module highlight

    +
    +

    Classes

    + +

    Functions

    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.html-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.html-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.html-module.html @@ -0,0 +1,264 @@ + + + + + html + + + + + +

    Module html

    +
    +

    Classes

    +
    + A
    +
    + B
    + +
    + BODY
    +
    + BR
    +
    + BUTTON
    +
    + CAT
    +
    + CENTER
    +
    + CODE
    +
    + COL
    + +
    + DIV
    +
    + EM
    +
    + EMBED
    + +
    + FORM
    +
    + H1
    +
    + H2
    +
    + H3
    +
    + H4
    +
    + H5
    +
    + H6
    +
    + HEAD
    +
    + HR
    +
    + HTML
    +
    + I
    +
    + IFRAME
    +
    + IMG
    +
    + INPUT
    +
    + LABEL
    +
    + LEGEND
    +
    + LI
    +
    + LINK
    + +
    + MENU
    +
    + META
    +
    + OBJECT
    +
    + OL
    + +
    + OPTION
    +
    + P
    +
    + PRE
    +
    + SCRIPT
    +
    + SELECT
    +
    + SPAN
    +
    + STYLE
    +
    + TABLE
    +
    + TBODY
    +
    + TD
    + +
    + TFOOT
    +
    + TH
    +
    + THEAD
    +
    + TITLE
    +
    + TR
    +
    + TT
    +
    + UL
    +
    + XHTML
    +
    + XML
    + + + +

    Functions

    + + +
    + URL
    + + + +
    + join
    + + +
    + test
    + + +

    Variables

    +
    + ON
    +
    + TAG
    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.http-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.http-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.http-module.html @@ -0,0 +1,45 @@ + + + + + http + + + + + +

    Module http

    +
    +

    Classes

    + +
    + HTTP
    +

    Functions

    + +

    Variables

    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.import_all-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.import_all-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.import_all-module.html @@ -0,0 +1,43 @@ + + + + + import_all + + + + + +

    Module import_all

    +
    +

    Variables

    + alert_dependency
    base_modules
    candidate
    contributed_modules
    dirs
    files
    module
    name
    py26_deprecated
    py27_deprecated
    python_version
    root

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.languages-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.languages-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.languages-module.html @@ -0,0 +1,75 @@ + + + + + languages + + + + + +

    Module languages

    +
    +

    Classes

    +
    + lazyT
    + +

    Functions

    +
    + findT
    + + + + + + + +

    Variables

    + +
    + is_gae
    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.main-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.main-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.main-module.html @@ -0,0 +1,79 @@ + + + + + main + + + + + +

    Module main

    +
    +

    Classes

    + HttpServer

    Functions

    + appfactory
    + + + + + save_password
    + + wsgibase

    Variables

    +
    + logger
    + + + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.myregex-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.myregex-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.myregex-module.html @@ -0,0 +1,43 @@ + + + + + myregex + + + + + +

    Module myregex

    +
    +

    Variables

    + + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.newcron-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.newcron-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.newcron-module.html @@ -0,0 +1,46 @@ + + + + + newcron + + + + + +

    Module newcron

    +
    +

    Classes

    + Token
    cronlauncher
    extcron
    hardcron
    softcron

    Functions

    + crondance
    parsecronline
    rangetolist
    stopcron

    Variables

    + + logger

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.portalocker-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.portalocker-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.portalocker-module.html @@ -0,0 +1,56 @@ + + + + + portalocker + + + + + +

    Module portalocker

    +
    +

    Functions

    +
    + lock
    +
    + unlock
    +

    Variables

    + + + + +
    + logger
    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.reserved_sql_keywords-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.reserved_sql_keywords-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.reserved_sql_keywords-module.html @@ -0,0 +1,47 @@ + + + + + reserved_sql_keywords + + + + + +

    Module reserved_sql_keywords

    +
    +

    Variables

    + ADAPTERS
    COMMON
    DB2
    FIREBIRD
    FIREBIRD_NONRESERVED
    INFORMIX
    INGRES
    JDBCPOSTGRESQL
    JDBCSQLITE
    MSSQL
    MYSQL
    ORACLE
    POSTGRESQL
    POSTGRESQL_NONRESERVED
    SQLITE
    __author__

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.restricted-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.restricted-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.restricted-module.html @@ -0,0 +1,43 @@ + + + + + restricted + + + + + +

    Module restricted

    +
    +

    Classes

    + RestrictedError
    TicketStorage

    Functions

    + compile2
    restricted
    +

    Variables

    +
    + logger
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.rewrite-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.rewrite-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.rewrite-module.html @@ -0,0 +1,135 @@ + + + + + rewrite + + + + + +

    Module rewrite

    +
    +

    Classes

    + + +

    Functions

    + + + + + + +
    + load
    + + + + + + + + + + +
    + url_in
    + +

    Variables

    + + +
    + logger
    +
    + params
    + + + + + + + + +
    + thread
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.rocket-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.rocket-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.rocket-module.html @@ -0,0 +1,146 @@ + + + + + rocket + + + + + +

    Module rocket

    +
    +

    Classes

    + + + + + + + + NullHandler
    Rocket
    + + + + +
    + Worker
    +

    Functions

    + CherryPyWSGIServer
    + b
    + demo
    + + + u

    Variables

    + + BUF_SIZE
    DEFAULTS
    + + + + + HTTP_SERVER_SOFTWARE
    IGNORE_ERRORS_ON_CLOSE
    IS_JYTHON
    + + PY3K
    + SERVER_NAME
    SERVER_SOFTWARE
    + + VERSION
    + +
    + log
    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.sanitizer-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.sanitizer-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.sanitizer-module.html @@ -0,0 +1,41 @@ + + + + + sanitizer + + + + + +

    Module sanitizer

    +
    +

    Classes

    + +

    Functions

    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.serializers-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.serializers-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.serializers-module.html @@ -0,0 +1,49 @@ + + + + + serializers + + + + + +

    Module serializers

    +
    +

    Functions

    +
    + csv
    + +
    + json
    +
    + rss
    +
    + xml
    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.settings-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.settings-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.settings-module.html @@ -0,0 +1,37 @@ + + + + + settings + + + + + +

    Module settings

    +
    +

    Variables

    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.shell-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.shell-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.shell-module.html @@ -0,0 +1,42 @@ + + + + + shell + + + + + +

    Module shell

    +
    +

    Functions

    + die
    env
    exec_environment
    exec_pythonrc
    execute_from_command_line
    get_usage
    parse_path_info
    run
    test

    Variables

    + logger

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.sql-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.sql-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.sql-module.html @@ -0,0 +1,35 @@ + + + + + sql + + + + + +

    Module sql

    +
    +

    Classes

    + DAL
    Field

    Variables

    + drivers

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.sqlhtml-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.sqlhtml-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.sqlhtml-module.html @@ -0,0 +1,111 @@ + + + + + sqlhtml + + + + + +

    Module sqlhtml

    +
    +

    Classes

    + + + + + + + + + + + + + + + + + + + + +

    Functions

    + + + + +

    Variables

    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.storage-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.storage-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.storage-module.html @@ -0,0 +1,53 @@ + + + + + storage + + + + + +

    Module storage

    +
    +

    Classes

    +
    + List
    + + + + +

    Functions

    + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.streamer-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.streamer-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.streamer-module.html @@ -0,0 +1,47 @@ + + + + + streamer + + + + + +

    Module streamer

    +
    +

    Functions

    + + +

    Variables

    + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.template-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.template-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.template-module.html @@ -0,0 +1,40 @@ + + + + + template + + + + + +

    Module template

    +
    +

    Classes

    + BlockNode
    Content
    Node
    SuperNode
    TemplateParser

    Functions

    + get_parsed
    parse_template
    render

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.tools-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.tools-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.tools-module.html @@ -0,0 +1,81 @@ + + + + + tools + + + + + +

    Module tools

    +
    +

    Classes

    + Auth
    Crud
    Mail
    PluginManager
    Recaptcha
    Service

    Functions

    + +
    + addrow
    + + + + fetch
    geocode
    prettydate
    + + +

    Variables

    +
    + ON
    +
    + TAG
    + +
    + logger
    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.utils-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.utils-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.utils-module.html @@ -0,0 +1,56 @@ + + + + + utils + + + + + +

    Module utils

    +
    +

    Functions

    + + + + + + +

    Variables

    + +
    + logger
    +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.validators-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.validators-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.validators-module.html @@ -0,0 +1,189 @@ + + + + + validators + + + + + +

    Module validators

    +
    +

    Classes

    + +
    + CRYPT
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + IS_URL
    + +

    Functions

    + + + + + + +
    + urlify
    +

    Variables

    + + + + + +
    + regex1
    +
    + regex2
    + + + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.widget-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.widget-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.widget-module.html @@ -0,0 +1,47 @@ + + + + + widget + + + + + +

    Module widget

    +
    +

    Classes

    + BaseException
    IO
    web2pyDialog

    Functions

    + console
    presentation
    start
    start_browser
    try_start_browser

    Variables

    + ProgramAuthor
    ProgramInfo
    ProgramName
    ProgramVersion
    logger
    msg

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.winservice-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.winservice-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.winservice-module.html @@ -0,0 +1,39 @@ + + + + + winservice + + + + + +

    Module winservice

    +
    +

    Classes

    + + +

    Functions

    + web2py_windows_service_handler

    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc-web2py.gluon.xmlrpc-module.html Index: applications/examples/static/epydoc/toc-web2py.gluon.xmlrpc-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc-web2py.gluon.xmlrpc-module.html @@ -0,0 +1,34 @@ + + + + + xmlrpc + + + + + +

    Module xmlrpc

    +
    +

    Functions

    + +
    +[hide private] + + + + + ADDED applications/examples/static/epydoc/toc.html Index: applications/examples/static/epydoc/toc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/toc.html @@ -0,0 +1,132 @@ + + + + + Table of Contents + + + + + +

    Table of Contents

    +
    + Everything +
    +

    Modules

    + psycopg2
    psycopg2.tz
    sqlite3.dbapi2
    web2py.gluon
    web2py.gluon.admin
    web2py.gluon.cache
    + web2py.gluon.compileapp
    + + + + + web2py.gluon.custom_import
    + web2py.gluon.debug
    + + + + + + web2py.gluon.import_all
    + web2py.gluon.main
    + web2py.gluon.newcron
    + web2py.gluon.reserved_sql_keywords
    web2py.gluon.restricted
    + web2py.gluon.rocket
    + + + web2py.gluon.shell
    web2py.gluon.sql
    + + + web2py.gluon.template
    web2py.gluon.tools
    + + web2py.gluon.widget
    web2py.gluon.winservice
    +
    + [hide private] + + + + + ADDED applications/examples/static/epydoc/web2py.gluon-module.html Index: applications/examples/static/epydoc/web2py.gluon-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon-module.html @@ -0,0 +1,1286 @@ + + + + + web2py.gluon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Package gluon

    source code

    +This file is part of the web2py Web Framework Copyrighted by Massimo + Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html) +

    Web2Py framework modules



    + + + + + + + + +
    + + + + + +
    Submodules[hide private]
    +
    +
      +
    • web2py.gluon.admin: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.cache: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.cfs: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.compileapp: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.contenttype: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.contrib + +
    • +
    • web2py.gluon.custom_import
    • +
    • web2py.gluon.dal: This file is part of the web2py Web Framework...
    • +
    • web2py.gluon.debug: This file is part of the web2py Web Framework Developed by + Massimo Di Pierro <mdipierro@cs.depaul.edu>, limodou + <limodou@gmail.com> and srackham + <srackham@gmail.com>.
    • +
    • web2py.gluon.decoder
    • +
    • web2py.gluon.fileutils: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.globals: This file is part of the web2py Web Framework...
    • +
    • web2py.gluon.highlight: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.html: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.http: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.import_all: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.languages: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.main: This file is part of the web2py Web Framework...
    • +
    • web2py.gluon.myregex: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.newcron: Created by Attila Csipa <web2py@csipa.in.rs> Modified by + Massimo Di Pierro <mdipierro@cs.depaul.edu>
    • +
    • web2py.gluon.portalocker: Cross-platform (posix/nt) API for flock-style file locking.
    • +
    • web2py.gluon.reserved_sql_keywords
    • +
    • web2py.gluon.restricted: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.rewrite: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.rocket
    • +
    • web2py.gluon.sanitizer: :
    • +
    • web2py.gluon.serializers: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.settings: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.shell: This file is part of the web2py Web Framework Developed by + Massimo Di Pierro <mdipierro@cs.depaul.edu>, limodou + <limodou@gmail.com> and srackham + <srackham@gmail.com>.
    • +
    • web2py.gluon.sql
    • +
    • web2py.gluon.sqlhtml: This file is part of the web2py Web Framework...
    • +
    • web2py.gluon.storage: This file is part of the web2py Web Framework...
    • +
    • web2py.gluon.streamer: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.template: This file is part of the web2py Web Framework (Copyrighted, 2007-2011).
    • +
    • web2py.gluon.tools: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.utils: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.validators: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.widget: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    • web2py.gluon.xmlrpc: This file is part of the web2py Web Framework Copyrighted by + Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)
    • +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + HTTP +
    +   + + DAL
    + an instance of this class represents a database connection +
    +   + + Field
    + an instance of this class represents a database field +
    +   + + SQLFORM
    + SQLFORM is used to map a table (and a current record) into an HTML form + +given a SQLTable stored in db.table + +generates an insert form:: + + SQLFORM(db.table) + +generates an update form:: + + record=db.table[some_id] + SQLFORM(db.table, record) + +generates an update with a delete button:: + + SQLFORM(db.table, record, deletable=True) + +if record is an int:: + + record=db.table[record] + +optional arguments: + +:param fields: a list of fields that should be placed in the form, + default is all. +
    +   + + SQLTABLE
    + given a Rows object, as returned by a db().select(), generates +an html table with the rows. +
    +   + + A +
    +   + + B +
    +   + + BEAUTIFY
    + example:: + + >>> BEAUTIFY(['a', 'b', {'hello': 'world'}]).xml() + '<div><table><tr><td><div>a</div></td></tr><tr><td><div>b</div></td></tr><tr><td><div><table><tr><td style="font-weight:bold;">hello</td><td valign="top">:</td><td><div>world</div></td></tr></table></div></td></tr></table></div>' + +turns any list, dictionary, etc into decent looking html. +
    +   + + BODY +
    +   + + BR +
    +   + + CAT +
    +   + + CENTER +
    +   + + CLEANUP
    + example: +
    +   + + CODE
    + displays code in HTML with syntax highlighting. +
    +   + + CRYPT
    + example: +
    +   + + DIV
    + HTML helper, for easy generating and manipulating a DOM + structure. +
    +   + + EM +
    +   + + EMBED +
    +   + + FIELDSET +
    +   + + FORM
    + example: +
    +   + + H1 +
    +   + + H2 +
    +   + + H3 +
    +   + + H4 +
    +   + + H5 +
    +   + + H6 +
    +   + + HEAD +
    +   + + HR +
    +   + + HTML
    + There are four predefined document type definitions. +
    +   + + I +
    +   + + IFRAME +
    +   + + IMG +
    +   + + INPUT
    + INPUT Component + +examples:: + + >>> INPUT(_type='text', _name='name', value='Max').xml() + '<input name="name" type="text" value="Max" />' + + >>> INPUT(_type='checkbox', _name='checkbox', value='on').xml() + '<input checked="checked" name="checkbox" type="checkbox" value="on" />' + + >>> INPUT(_type='radio', _name='radio', _value='yes', value='yes').xml() + '<input checked="checked" name="radio" type="radio" value="yes" />' + + >>> INPUT(_type='radio', _name='radio', _value='no', value='yes').xml() + '<input name="radio" type="radio" value="no" />' + +the input helper takes two special attributes value= and requires=. +
    +   + + IS_ALPHANUMERIC
    + example: +
    +   + + IS_DATE
    + example: +
    +   + + IS_DATETIME
    + example: +
    +   + + IS_DATETIME_IN_RANGE
    + example: +
    +   + + IS_DATE_IN_RANGE
    + example: +
    +   + + IS_DECIMAL_IN_RANGE
    + Determine that the argument is (or can be represented as) a + Python Decimal, and that it falls within the specified inclusive + range. +
    +   + + IS_EMAIL
    + Checks if field's value is a valid email address. +
    +   + + IS_EMPTY_OR
    + dummy class for testing IS_EMPTY_OR +
    +   + + IS_EQUAL_TO
    + example: +
    +   + + IS_EXPR
    + example: +
    +   + + IS_FLOAT_IN_RANGE
    + Determine that the argument is (or can be represented as) a + float, and that it falls within the specified inclusive range. +
    +   + + IS_IMAGE
    + Checks if file uploaded through file input was saved in one of + selected image formats and has dimensions (width and height) within + given boundaries. +
    +   + + IS_INT_IN_RANGE
    + Determine that the argument is (or can be represented as) an + int, and that it falls within the specified range. +
    +   + + IS_IN_DB
    + example: +
    +   + + IS_IN_SET
    + example: +
    +   + + IS_IPV4
    + Checks if field's value is an IP version 4 address in decimal form. +
    +   + + IS_LENGTH
    + Checks if length of field's value fits between given + boundaries. +
    +   + + IS_LIST_OF +
    +   + + IS_LOWER
    + convert to lower case +
    +   + + IS_MATCH
    + example: +
    +   + + IS_NOT_EMPTY
    + example: +
    +   + + IS_NOT_IN_DB
    + example: +
    +   + + IS_NULL_OR
    + dummy class for testing IS_EMPTY_OR +
    +   + + IS_SLUG
    + convert arbitrary text string to a slug +
    +   + + IS_STRONG
    + example: +
    +   + + IS_TIME
    + example: +
    +   + + IS_UPLOAD_FILENAME
    + Checks if name and extension of file uploaded through file input matches +given criteria. +
    +   + + IS_UPPER
    + convert to upper case +
    +   + + IS_URL
    + Rejects a URL string if any of the following is true: + * The string is empty or None + * The string uses characters that are not allowed in a URL + * The string breaks any of the HTTP syntactic rules + * The URL scheme specified (if one is specified) is not 'http' or 'https' + * The top-level domain (if a host name is specified) does not exist + +(These rules are based on RFC 2616: http://www.faqs.org/rfcs/rfc2616.html) + +This function only checks the URL's syntax. +
    +   + + LABEL +
    +   + + LEGEND +
    +   + + LI +
    +   + + LINK +
    +   + + MARKMIN
    + For documentation: + http://web2py.com/examples/static/markmin.html +
    +   + + MENU
    + Used to build menus... +
    +   + + META +
    +   + + OBJECT +
    +   + + OL +
    +   + + OPTGROUP +
    +   + + OPTION +
    +   + + P
    + Will replace ``\n`` by ``<br />`` if the `cr2br` attribute + is provided. +
    +   + + PRE +
    +   + + SCRIPT +
    +   + + SELECT
    + example: +
    +   + + SPAN +
    +   + + STYLE +
    +   + + TABLE
    + TABLE Component. +
    +   + + TBODY +
    +   + + TD +
    +   + + TEXTAREA
    + example: +
    +   + + TFOOT +
    +   + + TH +
    +   + + THEAD +
    +   + + TITLE +
    +   + + TR
    + TR Component. +
    +   + + TT +
    +   + + UL
    + UL Component. +
    +   + + XHTML
    + This is XHTML version of the HTML helper. +
    +   + + XML
    + use it to wrap a string that contains XML/HTML so that it will + not be escaped by the template +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    redirect(location, + how=303) + source code + +
    + +
    +   + + + + + + +
    URL(a=1, + c=1, + f=1, + r=1, + args=[], + vars={}, + anchor='', + extension=1, + env=1, + hmac_key=1, + hash_vars=True, + salt=1, + user_signature=1, + scheme=1, + host=1, + port=1)
    + generate a URL + +example:: + + >>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'], + ...
    + source code + +
    + +
    +   + + + + + + +
    embed64(filename=1, + file=1, + data=1, + extension='image/gif')
    + helper to encode the provided (binary) data into base64.
    + source code + +
    + +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + current = threading.local() +
    +   + + ON = True +
    +   + + TAG = __TAG__() +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    URL(a=1, + c=1, + f=1, + r=1, + args=[], + vars={}, + anchor='', + extension=1, + env=1, + hmac_key=1, + hash_vars=True, + salt=1, + user_signature=1, + scheme=1, + host=1, + port=1) +

    +
    source code  +
    + +
    +
    +generate a URL
    +
    +example::
    +
    +    >>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'],
    +    ...     vars={'p':1, 'q':2}, anchor='1'))
    +    '/a/c/f/x/y/z?p=1&q=2#1'
    +
    +    >>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'],
    +    ...     vars={'p':(1,3), 'q':2}, anchor='1'))
    +    '/a/c/f/x/y/z?p=1&p=3&q=2#1'
    +
    +    >>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'],
    +    ...     vars={'p':(3,1), 'q':2}, anchor='1'))
    +    '/a/c/f/x/y/z?p=3&p=1&q=2#1'
    +
    +    >>> str(URL(a='a', c='c', f='f', anchor='1+2'))
    +    '/a/c/f#1%2B2'
    +
    +    >>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'],
    +    ...     vars={'p':(1,3), 'q':2}, anchor='1', hmac_key='key'))
    +    '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=5d06bb8a4a6093dd325da2ee591c35c61afbd3c6#1'
    +
    +generates a url '/a/c/f' corresponding to application a, controller c
    +and function f. If r=request is passed, a, c, f are set, respectively,
    +to r.application, r.controller, r.function.
    +
    +The more typical usage is:
    +
    +URL(r=request, f='index') that generates a url for the index function
    +within the present application and controller.
    +
    +:param a: application (default to current if r is given)
    +:param c: controller (default to current if r is given)
    +:param f: function (default to current if r is given)
    +:param r: request (optional)
    +:param args: any arguments (optional)
    +:param vars: any variables (optional)
    +:param anchor: anchorname, without # (optional)
    +:param hmac_key: key to use when generating hmac signature (optional)
    +:param hash_vars: which of the vars to include in our hmac signature
    +    True (default) - hash all vars, False - hash none of the vars,
    +    iterable - hash only the included vars ['key1','key2']
    +:param scheme: URI scheme (True, 'http' or 'https', etc); forces absolute URL (optional)
    +:param host: string to force absolute URL with host (True means http_host)
    +:param port: optional port number (forces absolute URL)
    +
    +:raises SyntaxError: when no application, controller or function is
    +    available
    +:raises SyntaxError: when a CRLF is found in the generated url
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    embed64(filename=1, + file=1, + data=1, + extension='image/gif') +

    +
    source code  +
    + +

    helper to encode the provided (binary) data into base64.

    + :param filename: if provided, opens and reads this file in 'rb' mode + :param file: if provided, reads this file :param data: if provided, uses + the provided data +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon-pysrc.html @@ -0,0 +1,144 @@ + + + + + web2py.gluon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Package web2py.gluon

    +
    + 1  #!/usr/bin/env python 
    + 2  # -*- coding: utf-8 -*- 
    + 3  """ 
    + 4  This file is part of the web2py Web Framework 
    + 5  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    + 6  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    + 7   
    + 8   
    + 9  Web2Py framework modules 
    +10  ======================== 
    +11  """ 
    +12   
    +13  __all__ = ['A', 'B', 'BEAUTIFY', 'BODY', 'BR', 'CAT', 'CENTER', 'CLEANUP', 'CODE', 'CRYPT', 'DAL', 'DIV', 'EM', 'EMBED', 'FIELDSET', 'FORM', 'Field', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEAD', 'HR', 'HTML', 'HTTP', 'I', 'IFRAME', 'IMG', 'INPUT', 'IS_ALPHANUMERIC', 'IS_DATE', 'IS_DATETIME', 'IS_DATETIME_IN_RANGE', 'IS_DATE_IN_RANGE', 'IS_DECIMAL_IN_RANGE', 'IS_EMAIL', 'IS_EMPTY_OR', 'IS_EQUAL_TO', 'IS_EXPR', 'IS_FLOAT_IN_RANGE', 'IS_IMAGE', 'IS_INT_IN_RANGE', 'IS_IN_DB', 'IS_IN_SET', 'IS_IPV4', 'IS_LENGTH', 'IS_LIST_OF', 'IS_LOWER', 'IS_MATCH', 'IS_NOT_EMPTY', 'IS_NOT_IN_DB', 'IS_NULL_OR', 'IS_SLUG', 'IS_STRONG', 'IS_TIME', 'IS_UPLOAD_FILENAME', 'IS_UPPER', 'IS_URL', 'LABEL', 'LEGEND', 'LI', 'LINK', 'MARKMIN', 'MENU', 'META', 'OBJECT', 'OL', 'ON', 'OPTGROUP', 'OPTION', 'P', 'PRE', 'SCRIPT', 'SELECT', 'SPAN', 'SQLFORM', 'SQLTABLE', 'STYLE', 'TABLE', 'TAG', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TITLE', 'TR', 'TT', 'UL', 'URL', 'XHTML', 'XML','redirect','current','embed64'] 
    +14   
    +15  from globals import current 
    +16  from html import * 
    +17  from validators import * 
    +18  from http import redirect, HTTP 
    +19  from dal import DAL, Field 
    +20  from sqlhtml import SQLFORM, SQLTABLE 
    +21   
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.admin-module.html Index: applications/examples/static/epydoc/web2py.gluon.admin-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.admin-module.html @@ -0,0 +1,898 @@ + + + + + web2py.gluon.admin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module admin + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module admin

    source code

    +This file is part of the web2py Web Framework Copyrighted by Massimo + Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html) +

    Utility functions for the Admin application



    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    apath(path='', + r=1)
    + Builds a path inside an application folder...
    + source code + +
    + +
    +   + + + + + + +
    app_pack(app, + request)
    + Builds a w2p package for the application...
    + source code + +
    + +
    +   + + + + + + +
    app_pack_compiled(app, + request)
    + Builds a w2p bytecode-compiled package for the application...
    + source code + +
    + +
    +   + + + + + + +
    app_cleanup(app, + request)
    + Removes session, cache and error files...
    + source code + +
    + +
    +   + + + + + + +
    app_compile(app, + request)
    + Compiles the application...
    + source code + +
    + +
    +   + + + + + + +
    app_create(app, + request, + force=True, + key=1)
    + Create a copy of welcome.w2p (scaffolding) app...
    + source code + +
    + +
    +   + + + + + + +
    app_install(app, + fobj, + request, + filename, + overwrite=1)
    + Installs an application: + +- Identifies file type by filename +- Writes `fobj` contents to the `../deposit/` folder +- Calls `w2p_unpack()` to do the job.
    + source code + +
    + +
    +   + + + + + + +
    app_uninstall(app, + request)
    + Uninstalls the application.
    + source code + +
    + +
    +   + + + + + + +
    plugin_pack(app, + plugin_name, + request)
    + Builds a w2p package for the application...
    + source code + +
    + +
    +   + + + + + + +
    plugin_install(app, + fobj, + request, + filename)
    + Installs an application: + +- Identifies file type by filename +- Writes `fobj` contents to the `../deposit/` folder +- Calls `w2p_unpack()` to do the job.
    + source code + +
    + +
    +   + + + + + + +
    check_new_version(myversion, + version_URL)
    + Compares current web2py's version with the latest stable web2py version.
    + source code + +
    + +
    +   + + + + + + +
    unzip(filename, + dir, + subfolder='')
    + Unzips filename into dir (.zip only, no .gz etc) if subfolder!='' + it unzip only files in subfolder
    + source code + +
    + +
    +   + + + + + + +
    upgrade(request, + url='http://web2py.com')
    + Upgrades web2py (src, osx, win) is a new version is posted.
    + source code + +
    + +
    +   + + + + + + +
    add_path_first(path) + source code + +
    + +
    +   + + + + + + +
    create_missing_folders() + source code + +
    + +
    +   + + + + + + +
    create_missing_app_folders(request) + source code + +
    + +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    apath(path='', + r=1) +

    +
    source code  +
    + +
    +
    +Builds a path inside an application folder
    +
    +Parameters
    +----------
    +path:
    +    path within the application folder
    +r:
    +    the global request object
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_pack(app, + request) +

    +
    source code  +
    + +
    +
    +Builds a w2p package for the application
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +Returns
    +-------
    +filename:
    +    filename of the w2p file or None on error
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_pack_compiled(app, + request) +

    +
    source code  +
    + +
    +
    +Builds a w2p bytecode-compiled package for the application
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +Returns
    +-------
    +filename:
    +    filename of the w2p file or None on error
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_cleanup(app, + request) +

    +
    source code  +
    + +
    +
    +Removes session, cache and error files
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_compile(app, + request) +

    +
    source code  +
    + +
    +
    +Compiles the application
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_create(app, + request, + force=True, + key=1) +

    +
    source code  +
    + +
    +
    +Create a copy of welcome.w2p (scaffolding) app
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_install(app, + fobj, + request, + filename, + overwrite=1) +

    +
    source code  +
    + +
    +
    +Installs an application:
    +
    +- Identifies file type by filename
    +- Writes `fobj` contents to the `../deposit/` folder
    +- Calls `w2p_unpack()` to do the job.
    +
    +Parameters
    +----------
    +app:
    +    new application name
    +fobj:
    +    file object containing the application to be installed
    +request:
    +    the global request object
    +filename:
    +    original filename of the `fobj`, required to determine extension
    +
    +Returns
    +-------
    +upname:
    +    name of the file where app is temporarily stored or `None` on failure
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    app_uninstall(app, + request) +

    +
    source code  +
    + +
    +
    +Uninstalls the application.
    +
    +Parameters
    +----------
    +app:
    +    application name
    +request:
    +    the global request object
    +
    +Returns
    +-------
    +`True` on success, `False` on failure
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    plugin_pack(app, + plugin_name, + request) +

    +
    source code  +
    + +
    +
    +Builds a w2p package for the application
    +
    +Parameters
    +----------
    +app:
    +    application name
    +plugin_name:
    +    the name of the plugin without plugin_ prefix
    +request:
    +    the current request app
    +
    +Returns
    +-------
    +filename:
    +    filename of the w2p file or None on error
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    plugin_install(app, + fobj, + request, + filename) +

    +
    source code  +
    + +
    +
    +Installs an application:
    +
    +- Identifies file type by filename
    +- Writes `fobj` contents to the `../deposit/` folder
    +- Calls `w2p_unpack()` to do the job.
    +
    +Parameters
    +----------
    +app:
    +    new application name
    +fobj:
    +    file object containing the application to be installed
    +request:
    +    the global request object
    +filename:
    +    original filename of the `fobj`, required to determine extension
    +
    +Returns
    +-------
    +upname:
    +    name of the file where app is temporarily stored or `None` on failure
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    check_new_version(myversion, + version_URL) +

    +
    source code  +
    + +
    +
    +Compares current web2py's version with the latest stable web2py version.
    +
    +Parameters
    +----------
    +myversion:
    +    the current version as stored in file `web2py/VERSION`
    +version_URL:
    +    the URL that contains the version of the latest stable release
    +
    +Returns
    +-------
    +state:
    +    `True` if upgrade available, `False` if current version if up-to-date,
    +    -1 on error
    +version:
    +    the most up-to-version available
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    upgrade(request, + url='http://web2py.com') +

    +
    source code  +
    + +
    +
    +Upgrades web2py (src, osx, win) is a new version is posted.
    +It detects whether src, osx or win is running and downloads the right one
    +
    +Parameters
    +----------
    +request:
    +    the current request object, required to determine version and path
    +url:
    +    the incomplete url where to locate the latest web2py
    +    actual url is url+'/examples/static/web2py_(src|osx|win).zip'
    +
    +Returns
    +-------
    +    True on success, False on failure (network problem or old version)
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.admin-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.admin-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.admin-pysrc.html @@ -0,0 +1,599 @@ + + + + + web2py.gluon.admin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module admin + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.admin

    +
    +  1  """ 
    +  2  This file is part of the web2py Web Framework 
    +  3  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    +  4  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    +  5   
    +  6  Utility functions for the Admin application 
    +  7  =========================================== 
    +  8  """ 
    +  9  import os 
    + 10  import sys 
    + 11  import traceback 
    + 12  import zipfile 
    + 13  import urllib 
    + 14  from shutil import rmtree 
    + 15  from utils import web2py_uuid 
    + 16  from fileutils import w2p_pack, w2p_unpack, w2p_pack_plugin, w2p_unpack_plugin 
    + 17  from fileutils import up, fix_newlines, abspath, recursive_unlink 
    + 18  from fileutils import read_file, write_file 
    + 19  from restricted import RestrictedError 
    + 20  from settings import global_settings 
    + 21   
    +
    22 -def apath(path='', r=None): +
    23 """ + 24 Builds a path inside an application folder + 25 + 26 Parameters + 27 ---------- + 28 path: + 29 path within the application folder + 30 r: + 31 the global request object + 32 + 33 """ + 34 + 35 opath = up(r.folder) + 36 while path[:3] == '../': + 37 (opath, path) = (up(opath), path[3:]) + 38 return os.path.join(opath, path).replace('\\', '/') +
    39 + 40 +
    41 -def app_pack(app, request): +
    42 """ + 43 Builds a w2p package for the application + 44 + 45 Parameters + 46 ---------- + 47 app: + 48 application name + 49 request: + 50 the global request object + 51 + 52 Returns + 53 ------- + 54 filename: + 55 filename of the w2p file or None on error + 56 """ + 57 try: + 58 app_cleanup(app, request) + 59 filename = apath('../deposit/%s.w2p' % app, request) + 60 w2p_pack(filename, apath(app, request)) + 61 return filename + 62 except Exception: + 63 return False +
    64 + 65 +
    66 -def app_pack_compiled(app, request): +
    67 """ + 68 Builds a w2p bytecode-compiled package for the application + 69 + 70 Parameters + 71 ---------- + 72 app: + 73 application name + 74 request: + 75 the global request object + 76 + 77 Returns + 78 ------- + 79 filename: + 80 filename of the w2p file or None on error + 81 """ + 82 + 83 try: + 84 filename = apath('../deposit/%s.w2p' % app, request) + 85 w2p_pack(filename, apath(app, request), compiled=True) + 86 return filename + 87 except Exception: + 88 return None +
    89 +
    90 -def app_cleanup(app, request): +
    91 """ + 92 Removes session, cache and error files + 93 + 94 Parameters + 95 ---------- + 96 app: + 97 application name + 98 request: + 99 the global request object +100 """ +101 r = True +102 +103 # Remove error files +104 path = apath('%s/errors/' % app, request) +105 if os.path.exists(path): +106 for f in os.listdir(path): +107 try: +108 if f[:1]!='.': os.unlink(os.path.join(path,f)) +109 except IOError: +110 r = False +111 +112 # Remove session files +113 path = apath('%s/sessions/' % app, request) +114 if os.path.exists(path): +115 for f in os.listdir(path): +116 try: +117 if f[:1]!='.': recursive_unlink(os.path.join(path,f)) +118 except IOError: +119 r = False +120 +121 # Remove cache files +122 path = apath('%s/sessions/' % app, request) +123 if os.path.exists(path): +124 for f in os.listdir(path): +125 try: +126 if f[:1]!='.': os.unlink(os.path.join(path,f)) +127 except IOError: +128 r = False +129 return r +
    130 +131 +
    132 -def app_compile(app, request): +
    133 """ +134 Compiles the application +135 +136 Parameters +137 ---------- +138 app: +139 application name +140 request: +141 the global request object +142 """ +143 from compileapp import compile_application, remove_compiled_application +144 folder = apath(app, request) +145 try: +146 compile_application(folder) +147 return None +148 except (Exception, RestrictedError): +149 tb = traceback.format_exc(sys.exc_info) +150 remove_compiled_application(folder) +151 return tb +
    152 +
    153 -def app_create(app, request,force=False,key=None): +
    154 """ +155 Create a copy of welcome.w2p (scaffolding) app +156 +157 Parameters +158 ---------- +159 app: +160 application name +161 request: +162 the global request object +163 +164 """ +165 try: +166 path = apath(app, request) +167 os.mkdir(path) +168 except: +169 if not force: +170 return False +171 try: +172 w2p_unpack('welcome.w2p', path) +173 for subfolder in ['models','views','controllers', 'databases', +174 'modules','cron','errors','sessions', +175 'languages','static','private','uploads']: +176 subpath = os.path.join(path,subfolder) +177 if not os.path.exists(subpath): +178 os.mkdir(subpath) +179 db = os.path.join(path, 'models', 'db.py') +180 if os.path.exists(db): +181 data = read_file(db) +182 data = data.replace('<your secret key>', +183 'sha512:'+(key or web2py_uuid())) +184 write_file(db, data) +185 return True +186 except: +187 rmtree(path) +188 return False +
    189 +190 +
    191 -def app_install(app, fobj, request, filename, overwrite=None): +
    192 """ +193 Installs an application: +194 +195 - Identifies file type by filename +196 - Writes `fobj` contents to the `../deposit/` folder +197 - Calls `w2p_unpack()` to do the job. +198 +199 Parameters +200 ---------- +201 app: +202 new application name +203 fobj: +204 file object containing the application to be installed +205 request: +206 the global request object +207 filename: +208 original filename of the `fobj`, required to determine extension +209 +210 Returns +211 ------- +212 upname: +213 name of the file where app is temporarily stored or `None` on failure +214 """ +215 did_mkdir = False +216 if filename[-4:] == '.w2p': +217 extension = 'w2p' +218 elif filename[-7:] == '.tar.gz': +219 extension = 'tar.gz' +220 else: +221 extension = 'tar' +222 upname = apath('../deposit/%s.%s' % (app, extension), request) +223 +224 try: +225 write_file(upname, fobj.read(), 'wb') +226 path = apath(app, request) +227 if not overwrite: +228 os.mkdir(path) +229 did_mkdir = True +230 w2p_unpack(upname, path) +231 if extension != 'tar': +232 os.unlink(upname) +233 fix_newlines(path) +234 return upname +235 except Exception: +236 if did_mkdir: +237 rmtree(path) +238 return False +
    239 +240 +
    241 -def app_uninstall(app, request): +
    242 """ +243 Uninstalls the application. +244 +245 Parameters +246 ---------- +247 app: +248 application name +249 request: +250 the global request object +251 +252 Returns +253 ------- +254 `True` on success, `False` on failure +255 """ +256 try: +257 # Hey App, this is your end... +258 path = apath(app, request) +259 rmtree(path) +260 return True +261 except Exception: +262 return False +
    263 +
    264 -def plugin_pack(app, plugin_name, request): +
    265 """ +266 Builds a w2p package for the application +267 +268 Parameters +269 ---------- +270 app: +271 application name +272 plugin_name: +273 the name of the plugin without plugin_ prefix +274 request: +275 the current request app +276 +277 Returns +278 ------- +279 filename: +280 filename of the w2p file or None on error +281 """ +282 try: +283 filename = apath('../deposit/web2py.plugin.%s.w2p' % plugin_name, request) +284 w2p_pack_plugin(filename, apath(app, request), plugin_name) +285 return filename +286 except Exception: +287 return False +
    288 +
    289 -def plugin_install(app, fobj, request, filename): +
    290 """ +291 Installs an application: +292 +293 - Identifies file type by filename +294 - Writes `fobj` contents to the `../deposit/` folder +295 - Calls `w2p_unpack()` to do the job. +296 +297 Parameters +298 ---------- +299 app: +300 new application name +301 fobj: +302 file object containing the application to be installed +303 request: +304 the global request object +305 filename: +306 original filename of the `fobj`, required to determine extension +307 +308 Returns +309 ------- +310 upname: +311 name of the file where app is temporarily stored or `None` on failure +312 """ +313 +314 upname = apath('../deposit/%s' % filename, request) +315 +316 try: +317 write_file(upname, fobj.read(), 'wb') +318 path = apath(app, request) +319 w2p_unpack_plugin(upname, path) +320 fix_newlines(path) +321 return upname +322 except Exception: +323 os.unlink(upname) +324 return False +
    325 +
    326 -def check_new_version(myversion, version_URL): +
    327 """ +328 Compares current web2py's version with the latest stable web2py version. +329 +330 Parameters +331 ---------- +332 myversion: +333 the current version as stored in file `web2py/VERSION` +334 version_URL: +335 the URL that contains the version of the latest stable release +336 +337 Returns +338 ------- +339 state: +340 `True` if upgrade available, `False` if current version if up-to-date, +341 -1 on error +342 version: +343 the most up-to-version available +344 """ +345 try: +346 from urllib import urlopen +347 version = urlopen(version_URL).read() +348 except Exception: +349 return -1, myversion +350 +351 if version > myversion: +352 return True, version +353 else: +354 return False, version +
    355 +
    356 -def unzip(filename, dir, subfolder=''): +
    357 """ +358 Unzips filename into dir (.zip only, no .gz etc) +359 if subfolder!='' it unzip only files in subfolder +360 """ +361 filename = abspath(filename) +362 if not zipfile.is_zipfile(filename): +363 raise RuntimeError, 'Not a valid zipfile' +364 zf = zipfile.ZipFile(filename) +365 if not subfolder.endswith('/'): +366 subfolder = subfolder + '/' +367 n = len(subfolder) +368 for name in sorted(zf.namelist()): +369 if not name.startswith(subfolder): +370 continue +371 #print name[n:] +372 if name.endswith('/'): +373 folder = os.path.join(dir,name[n:]) +374 if not os.path.exists(folder): +375 os.mkdir(folder) +376 else: +377 write_file(os.path.join(dir, name[n:]), zf.read(name), 'wb') +
    378 +379 +
    380 -def upgrade(request, url='http://web2py.com'): +
    381 """ +382 Upgrades web2py (src, osx, win) is a new version is posted. +383 It detects whether src, osx or win is running and downloads the right one +384 +385 Parameters +386 ---------- +387 request: +388 the current request object, required to determine version and path +389 url: +390 the incomplete url where to locate the latest web2py +391 actual url is url+'/examples/static/web2py_(src|osx|win).zip' +392 +393 Returns +394 ------- +395 True on success, False on failure (network problem or old version) +396 """ +397 web2py_version = request.env.web2py_version +398 gluon_parent = request.env.gluon_parent +399 if not gluon_parent.endswith('/'): +400 gluon_parent = gluon_parent + '/' +401 (check, version) = check_new_version(web2py_version, +402 url+'/examples/default/version') +403 if not check: +404 return (False, 'Already latest version') +405 if os.path.exists(os.path.join(gluon_parent, 'web2py.exe')): +406 version_type = 'win' +407 destination = gluon_parent +408 subfolder = 'web2py/' +409 elif gluon_parent.endswith('/Contents/Resources/'): +410 version_type = 'osx' +411 destination = gluon_parent[:-len('/Contents/Resources/')] +412 subfolder = 'web2py/web2py.app/' +413 else: +414 version_type = 'src' +415 destination = gluon_parent +416 subfolder = 'web2py/' +417 +418 full_url = url + '/examples/static/web2py_%s.zip' % version_type +419 filename = abspath('web2py_%s_downloaded.zip' % version_type) +420 file = None +421 try: +422 write_file(filename, urllib.urlopen(full_url).read(), 'wb') +423 except Exception,e: +424 return False, e +425 try: +426 unzip(filename, destination, subfolder) +427 return True, None +428 except Exception,e: +429 return False, e +
    430 +
    431 -def add_path_first(path): +
    432 sys.path = [path]+[p for p in sys.path if (not p==path and not p==(path+'/'))] +
    433 +
    435 if not global_settings.web2py_runtime_gae: +436 for path in ('applications', 'deposit', 'site-packages', 'logs'): +437 path = abspath(path, gluon=True) +438 if not os.path.exists(path): +439 os.mkdir(path) +440 paths = (global_settings.gluon_parent, abspath('site-packages', gluon=True), abspath('gluon', gluon=True), '') +441 [add_path_first(path) for path in paths] +
    442 +
    443 -def create_missing_app_folders(request): +
    444 if not global_settings.web2py_runtime_gae: +445 if request.folder not in global_settings.app_folders: +446 for subfolder in ('models', 'views', 'controllers', 'databases', +447 'modules', 'cron', 'errors', 'sessions', +448 'languages', 'static', 'private', 'uploads'): +449 path = os.path.join(request.folder, subfolder) +450 if not os.path.exists(path): +451 os.mkdir(path) +452 global_settings.app_folders.add(request.folder) +
    453 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.cfs-module.html Index: applications/examples/static/epydoc/web2py.gluon.cfs-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.cfs-module.html @@ -0,0 +1,244 @@ + + + + + web2py.gluon.cfs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module cfs + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module cfs

    source code

    +This file is part of the web2py Web Framework Copyrighted by Massimo + Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html) +

    Functions required to execute app components

    + FOR INTERNAL USE ONLY

    + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    getcfs(key, + filename, + filter=1)
    + Caches the *filtered* file `filename` with `key` until the file is +modified.
    + source code + +
    + +
    + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + cfs = {} +
    +   + + cfs_lock = thread.allocate_lock() +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    getcfs(key, + filename, + filter=1) +

    +
    source code  +
    + +
    +
    +Caches the *filtered* file `filename` with `key` until the file is
    +modified.
    +
    +:param key: the cache key
    +:param filename: the file to cache
    +:param filter: is the function used for filtering. Normally `filename` is a
    +    .py file and `filter` is a function that bytecode compiles the file.
    +    In this way the bytecode compiled file is cached. (Default = None)
    +
    +This is used on Google App Engine since pyc files cannot be saved.
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.cfs-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.cfs-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.cfs-pysrc.html @@ -0,0 +1,177 @@ + + + + + web2py.gluon.cfs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module cfs + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.cfs

    +
    + 1  #!/usr/bin/env python 
    + 2  # -*- coding: utf-8 -*- 
    + 3   
    + 4  """ 
    + 5  This file is part of the web2py Web Framework 
    + 6  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    + 7  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    + 8   
    + 9  Functions required to execute app components 
    +10  ============================================ 
    +11   
    +12  FOR INTERNAL USE ONLY 
    +13  """ 
    +14   
    +15  import os 
    +16  import stat 
    +17  import thread 
    +18  from fileutils import read_file 
    +19   
    +20  cfs = {}  # for speed-up 
    +21  cfs_lock = thread.allocate_lock()  # and thread safety 
    +22   
    +23   
    +
    24 -def getcfs(key, filename, filter=None): +
    25 """ +26 Caches the *filtered* file `filename` with `key` until the file is +27 modified. +28 +29 :param key: the cache key +30 :param filename: the file to cache +31 :param filter: is the function used for filtering. Normally `filename` is a +32 .py file and `filter` is a function that bytecode compiles the file. +33 In this way the bytecode compiled file is cached. (Default = None) +34 +35 This is used on Google App Engine since pyc files cannot be saved. +36 """ +37 t = os.stat(filename)[stat.ST_MTIME] +38 cfs_lock.acquire() +39 item = cfs.get(key, None) +40 cfs_lock.release() +41 if item and item[0] == t: +42 return item[1] +43 if not filter: +44 data = read_file(filename) +45 else: +46 data = filter() +47 cfs_lock.acquire() +48 cfs[key] = (t, data) +49 cfs_lock.release() +50 return data +
    51 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.compileapp-module.html Index: applications/examples/static/epydoc/web2py.gluon.compileapp-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.compileapp-module.html @@ -0,0 +1,678 @@ + + + + + web2py.gluon.compileapp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module compileapp + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module compileapp

    source code

    +This file is part of the web2py Web Framework Copyrighted by Massimo + Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html) +

    Functions required to execute app components

    + FOR INTERNAL USE ONLY

    + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + mybuiltin
    + NOTE could simple use a dict and populate it, NOTE not sure if + this changes things though if monkey patching import..... +
    +   + + LoadFactory
    + Attention: this helper is new and experimental +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    local_import_aux(name, + force=True, + app='welcome')
    + In apps, instead of importing a local module +(in applications/app/modules) with:: + + import a.b.c as d + +you should do:: + + d = local_import('a.b.c') + +or (to force a reload): + + d = local_import('a.b.c', reload=True) + +This prevents conflict between applications and un-necessary execs.
    + source code + +
    + +
    +   + + + + + + +
    build_environment(request, + response, + session, + store_current=True)
    + Build the environment dictionary into which web2py files are + executed.
    + source code + +
    + +
    +   + + + + + + +
    save_pyc(filename)
    + Bytecode compiles the file `filename`
    + source code + +
    + +
    +   + + + + + + +
    read_pyc(filename)
    + Read the code inside a bytecode compiled file if the MAGIC number + is compatible
    + source code + +
    + +
    +   + + + + + + +
    compile_views(folder)
    + Compiles all the views in the application specified by + `folder`
    + source code + +
    + +
    +   + + + + + + +
    compile_models(folder)
    + Compiles all the models in the application specified by + `folder`
    + source code + +
    + +
    +   + + + + + + +
    compile_controllers(folder)
    + Compiles all the controllers in the application specified by + `folder`
    + source code + +
    + +
    +   + + + + + + +
    run_models_in(environment)
    + Runs all models (in the app specified by the current folder) It + tries pre-compiled models first before compiling them.
    + source code + +
    + +
    +   + + + + + + +
    run_controller_in(controller, + function, + environment)
    + Runs the controller.function() (for the app specified by the + current folder).
    + source code + +
    + +
    +   + + + + + + +
    run_view_in(environment)
    + Executes the view for the requested action.
    + source code + +
    + +
    +   + + + + + + +
    remove_compiled_application(folder)
    + Deletes the folder `compiled` containing the compiled + application.
    + source code + +
    + +
    +   + + + + + + +
    compile_application(folder)
    + Compiles all models, views, controller for the application in + `folder`.
    + source code + +
    + +
    +   + + + + + + +
    test()
    + Example:
    + source code + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + logger = logging.getLogger("web2py") +
    +   + + is_gae = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + is_jython = True +
    +   + + TEST_CODE = '\ndef _TEST():\n import doctest, sys, cStringI... +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    local_import_aux(name, + force=True, + app='welcome') +

    +
    source code  +
    + +
    +
    +In apps, instead of importing a local module
    +(in applications/app/modules) with::
    +
    +   import a.b.c as d
    +
    +you should do::
    +
    +   d = local_import('a.b.c')
    +
    +or (to force a reload):
    +
    +   d = local_import('a.b.c', reload=True)
    +
    +This prevents conflict between applications and un-necessary execs.
    +It can be used to import any module, including regular Python modules.
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    read_pyc(filename) +

    +
    source code  +
    + +

    Read the code inside a bytecode compiled file if the MAGIC number is + compatible

    + :returns: a code object +
    +
    +
    +
    + +
    + +
    + + +
    +

    run_controller_in(controller, + function, + environment) +

    +
    source code  +
    + + Runs the controller.function() (for the app specified by the current + folder). It tries pre-compiled controller_function.pyc first before + compiling it. +
    +
    +
    +
    + +
    + +
    + + +
    +

    run_view_in(environment) +

    +
    source code  +
    + + Executes the view for the requested action. The view is the one + specified in `response.view` or determined by the url or + `view/generic.extension` It tries the pre-compiled + views_controller_function.pyc before compiling it. +
    +
    +
    +
    + +
    + +
    + + +
    +

    test() +

    +
    source code  +
    + + Example: +
    +   >>> import traceback, types
    +   >>> environment={'x':1}
    +   >>> open('a.py', 'w').write('print 1/x')
    +   >>> save_pyc('a.py')
    +   >>> os.unlink('a.py')
    +   >>> if type(read_pyc('a.pyc'))==types.CodeType: print 'code'
    +   code
    +   >>> exec read_pyc('a.pyc') in environment
    +   1
    +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + + +
    Variables Details[hide private]
    +
    + +
    + +
    +

    TEST_CODE

    + +
    +
    +
    +
    Value:
    +
    +'''
    +def _TEST():
    +    import doctest, sys, cStringIO, types, cgi, gluon.fileutils
    +    if not gluon.fileutils.check_credentials(request):
    +        raise HTTP(401, web2py_error=\'invalid credentials\')
    +    stdout = sys.stdout
    +    html = \'<h2>Testing controller "%s.py" ... done.</h2><br/>\\n\' \\
    +\
    +...
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.compileapp-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.compileapp-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.compileapp-pysrc.html @@ -0,0 +1,814 @@ + + + + + web2py.gluon.compileapp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module compileapp + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.compileapp

    +
    +  1  #!/usr/bin/env python 
    +  2  # -*- coding: utf-8 -*- 
    +  3   
    +  4  """ 
    +  5  This file is part of the web2py Web Framework 
    +  6  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    +  7  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    +  8   
    +  9  Functions required to execute app components 
    + 10  ============================================ 
    + 11   
    + 12  FOR INTERNAL USE ONLY 
    + 13  """ 
    + 14   
    + 15  import re 
    + 16  import sys 
    + 17  import fnmatch 
    + 18  import os 
    + 19  import copy 
    + 20  import random 
    + 21  import __builtin__ 
    + 22  from storage import Storage, List 
    + 23  from template import parse_template 
    + 24  from restricted import restricted, compile2 
    + 25  from fileutils import mktree, listdir, read_file, write_file 
    + 26  from myregex import regex_expose 
    + 27  from languages import translator 
    + 28  from dal import BaseAdapter, SQLDB, SQLField, DAL, Field 
    + 29  from sqlhtml import SQLFORM, SQLTABLE 
    + 30  from cache import Cache 
    + 31  from globals import current 
    + 32  import settings 
    + 33  from cfs import getcfs 
    + 34  import html 
    + 35  import validators 
    + 36  from http import HTTP, redirect 
    + 37  import marshal 
    + 38  import shutil 
    + 39  import imp 
    + 40  import logging 
    + 41  logger = logging.getLogger("web2py") 
    + 42  import rewrite 
    + 43   
    + 44  try: 
    + 45      import py_compile 
    + 46  except: 
    + 47      logger.warning('unable to import py_compile') 
    + 48   
    + 49  is_gae = settings.global_settings.web2py_runtime_gae 
    + 50  is_jython = settings.global_settings.is_jython = 'java' in sys.platform.lower() or hasattr(sys, 'JYTHON_JAR') or str(sys.copyright).find('Jython') > 0 
    + 51   
    + 52  TEST_CODE = \ 
    + 53      r""" 
    + 54  def _TEST(): 
    + 55      import doctest, sys, cStringIO, types, cgi, gluon.fileutils 
    + 56      if not gluon.fileutils.check_credentials(request): 
    + 57          raise HTTP(401, web2py_error='invalid credentials') 
    + 58      stdout = sys.stdout 
    + 59      html = '<h2>Testing controller "%s.py" ... done.</h2><br/>\n' \ 
    + 60          % request.controller 
    + 61      for key in sorted([key for key in globals() if not key in __symbols__+['_TEST']]): 
    + 62          eval_key = eval(key) 
    + 63          if type(eval_key) == types.FunctionType: 
    + 64              number_doctests = sum([len(ds.examples) for ds in doctest.DocTestFinder().find(eval_key)]) 
    + 65              if number_doctests>0: 
    + 66                  sys.stdout = cStringIO.StringIO() 
    + 67                  name = '%s/controllers/%s.py in %s.__doc__' \ 
    + 68                      % (request.folder, request.controller, key) 
    + 69                  doctest.run_docstring_examples(eval_key, 
    + 70                      globals(), False, name=name) 
    + 71                  report = sys.stdout.getvalue().strip() 
    + 72                  if report: 
    + 73                      pf = 'failed' 
    + 74                  else: 
    + 75                      pf = 'passed' 
    + 76                  html += '<h3 class="%s">Function %s [%s]</h3>\n' \ 
    + 77                      % (pf, key, pf) 
    + 78                  if report: 
    + 79                      html += CODE(report, language='web2py', \ 
    + 80                          link='/examples/global/vars/').xml() 
    + 81                  html += '<br/>\n' 
    + 82              else: 
    + 83                  html += \ 
    + 84                      '<h3 class="nodoctests">Function %s [no doctests]</h3><br/>\n' \ 
    + 85                      % (key) 
    + 86      response._vars = html 
    + 87      sys.stdout = stdout 
    + 88  _TEST() 
    + 89  """ 
    + 90   
    +
    91 -class mybuiltin(object): +
    92 """ + 93 NOTE could simple use a dict and populate it, + 94 NOTE not sure if this changes things though if monkey patching import..... + 95 """ + 96 #__builtins__ +
    97 - def __getitem__(self, key): +
    98 try: + 99 return getattr(__builtin__, key) +100 except AttributeError: +101 raise KeyError, key +
    102 - def __setitem__(self, key, value): +
    103 setattr(self, key, value) +
    104 +
    105 -class LoadFactory(object): +
    106 """ +107 Attention: this helper is new and experimental +108 """ +
    109 - def __init__(self,environment): +
    110 self.environment = environment +
    111 - def __call__(self, c=None, f='index', args=[], vars={}, +112 extension=None, target=None,ajax=False,ajax_trap=False, +113 url=None,user_signature=False, content='loading...',**attr): +
    114 import globals +115 target = target or 'c'+str(random.random())[2:] +116 attr['_id']=target +117 request = self.environment['request'] +118 if not isinstance(vars,Storage): +119 vars = Storage(vars) +120 if '.' in f: +121 f, extension = f.split('.',1) +122 if url or ajax: +123 url = url or html.URL(request.application, c, f, r=request, +124 args=args, vars=vars, extension=extension, +125 user_signature=user_signature) +126 script = html.SCRIPT('web2py_component("%s","%s")' % (url, target), +127 _type="text/javascript") +128 return html.TAG[''](script, html.DIV(content,**attr)) +129 else: +130 if not isinstance(args,(list,tuple)): +131 args = [args] +132 c = c or request.controller +133 +134 other_request = Storage() +135 for key, value in request.items(): +136 other_request[key] = value +137 other_request['env'] = Storage() +138 for key, value in request.env.items(): +139 other_request.env['key'] = value +140 other_request.controller = c +141 other_request.function = f +142 other_request.extension = extension or request.extension +143 other_request.args = List(args) +144 other_request.vars = vars +145 other_request.get_vars = vars +146 other_request.post_vars = Storage() +147 other_response = globals.Response() +148 other_request.env.path_info = '/' + \ +149 '/'.join([request.application,c,f] + \ +150 map(str, other_request.args)) +151 other_request.env.query_string = \ +152 vars and html.URL(vars=vars).split('?')[1] or '' +153 other_request.env.http_web2py_component_location = \ +154 request.env.path_info +155 other_request.cid = target +156 other_request.env.http_web2py_component_element = target +157 other_response.view = '%s/%s.%s' % (c,f, other_request.extension) +158 other_environment = copy.copy(self.environment) +159 other_response._view_environment = other_environment +160 other_response.generic_patterns = \ +161 copy.copy(current.response.generic_patterns) +162 other_environment['request'] = other_request +163 other_environment['response'] = other_response +164 +165 ## some magic here because current are thread-locals +166 +167 original_request, current.request = current.request, other_request +168 original_response, current.response = current.response, other_response +169 page = run_controller_in(c, f, other_environment) +170 if isinstance(page, dict): +171 other_response._vars = page +172 for key in page: +173 other_response._view_environment[key] = page[key] +174 run_view_in(other_response._view_environment) +175 page = other_response.body.getvalue() +176 current.request, current.response = original_request, original_response +177 js = None +178 if ajax_trap: +179 link = html.URL(request.application, c, f, r=request, +180 args=args, vars=vars, extension=extension, +181 user_signature=user_signature) +182 js = "web2py_trap_form('%s','%s');" % (link, target) +183 script = js and html.SCRIPT(js,_type="text/javascript") or '' +184 return html.TAG[''](html.DIV(html.XML(page),**attr),script) +
    185 +186 +
    187 -def local_import_aux(name, force=False, app='welcome'): +
    188 """ +189 In apps, instead of importing a local module +190 (in applications/app/modules) with:: +191 +192 import a.b.c as d +193 +194 you should do:: +195 +196 d = local_import('a.b.c') +197 +198 or (to force a reload): +199 +200 d = local_import('a.b.c', reload=True) +201 +202 This prevents conflict between applications and un-necessary execs. +203 It can be used to import any module, including regular Python modules. +204 """ +205 items = name.replace('/','.') +206 name = "applications.%s.modules.%s" % (app, items) +207 module = __import__(name) +208 for item in name.split(".")[1:]: +209 module = getattr(module, item) +210 if force: +211 reload(module) +212 return module +
    213 +214 +215 """ +216 OLD IMPLEMENTATION: +217 items = name.replace('/','.').split('.') +218 filename, modulepath = items[-1], os.path.join(apath,'modules',*items[:-1]) +219 imp.acquire_lock() +220 try: +221 file=None +222 (file,path,desc) = imp.find_module(filename,[modulepath]+sys.path) +223 if not path in sys.modules or reload: +224 if is_gae: +225 module={} +226 execfile(path,{},module) +227 module=Storage(module) +228 else: +229 module = imp.load_module(path,file,path,desc) +230 sys.modules[path] = module +231 else: +232 module = sys.modules[path] +233 except Exception, e: +234 module = None +235 if file: +236 file.close() +237 imp.release_lock() +238 if not module: +239 raise ImportError, "cannot find module %s in %s" % (filename, modulepath) +240 return module +241 """ +242 +
    243 -def build_environment(request, response, session, store_current=True): +
    244 """ +245 Build the environment dictionary into which web2py files are executed. +246 """ +247 +248 environment = {} +249 for key in html.__all__: +250 environment[key] = getattr(html, key) +251 for key in validators.__all__: +252 environment[key] = getattr(validators, key) +253 if not request.env: +254 request.env = Storage() +255 +256 t = environment['T'] = translator(request) +257 c = environment['cache'] = Cache(request) +258 if store_current: +259 current.request = request +260 current.response = response +261 current.session = session +262 current.T = t +263 current.cache = c +264 +265 global __builtins__ +266 if is_jython: # jython hack +267 __builtins__ = mybuiltin() +268 else: +269 __builtins__['__import__'] = __builtin__.__import__ +270 environment['__builtins__'] = __builtins__ +271 environment['HTTP'] = HTTP +272 environment['redirect'] = redirect +273 environment['request'] = request +274 environment['response'] = response +275 environment['session'] = session +276 environment['DAL'] = DAL +277 environment['Field'] = Field +278 environment['SQLDB'] = SQLDB # for backward compatibility +279 environment['SQLField'] = SQLField # for backward compatibility +280 environment['SQLFORM'] = SQLFORM +281 environment['SQLTABLE'] = SQLTABLE +282 environment['LOAD'] = LoadFactory(environment) +283 environment['local_import'] = \ +284 lambda name, reload=False, app=request.application:\ +285 local_import_aux(name,reload,app) +286 BaseAdapter.set_folder(os.path.join(request.folder, 'databases')) +287 response._view_environment = copy.copy(environment) +288 return environment +
    289 +290 +
    291 -def save_pyc(filename): +
    292 """ +293 Bytecode compiles the file `filename` +294 """ +295 py_compile.compile(filename) +
    296 +297 +
    298 -def read_pyc(filename): +
    299 """ +300 Read the code inside a bytecode compiled file if the MAGIC number is +301 compatible +302 +303 :returns: a code object +304 """ +305 data = read_file(filename, 'rb') +306 if not is_gae and data[:4] != imp.get_magic(): +307 raise SystemError, 'compiled code is incompatible' +308 return marshal.loads(data[8:]) +
    309 +310 +
    311 -def compile_views(folder): +
    312 """ +313 Compiles all the views in the application specified by `folder` +314 """ +315 +316 path = os.path.join(folder, 'views') +317 for file in listdir(path, '^[\w/]+\.\w+$'): +318 data = parse_template(file, path) +319 filename = ('views/%s.py' % file).replace('/', '_').replace('\\', '_') +320 filename = os.path.join(folder, 'compiled', filename) +321 write_file(filename, data) +322 save_pyc(filename) +323 os.unlink(filename) +
    324 +325 +
    326 -def compile_models(folder): +
    327 """ +328 Compiles all the models in the application specified by `folder` +329 """ +330 +331 path = os.path.join(folder, 'models') +332 for file in listdir(path, '.+\.py$'): +333 data = read_file(os.path.join(path, file)) +334 filename = os.path.join(folder, 'compiled','models',file) +335 mktree(filename) +336 write_file(filename, data) +337 save_pyc(filename) +338 os.unlink(filename) +
    339 +340 +
    341 -def compile_controllers(folder): +
    342 """ +343 Compiles all the controllers in the application specified by `folder` +344 """ +345 +346 path = os.path.join(folder, 'controllers') +347 for file in listdir(path, '.+\.py$'): +348 ### why is this here? save_pyc(os.path.join(path, file)) +349 data = read_file(os.path.join(path,file)) +350 exposed = regex_expose.findall(data) +351 for function in exposed: +352 command = data + "\nresponse._vars=response._caller(%s)\n" % \ +353 function +354 filename = os.path.join(folder, 'compiled', ('controllers/' +355 + file[:-3]).replace('/', '_') +356 + '_' + function + '.py') +357 write_file(filename, command) +358 save_pyc(filename) +359 os.unlink(filename) +
    360 +361 +
    362 -def run_models_in(environment): +
    363 """ +364 Runs all models (in the app specified by the current folder) +365 It tries pre-compiled models first before compiling them. +366 """ +367 +368 folder = environment['request'].folder +369 c = environment['request'].controller +370 f = environment['request'].function +371 cpath = os.path.join(folder, 'compiled') +372 if os.path.exists(cpath): +373 for model in listdir(cpath, '^models_\w+\.pyc$', 0): +374 restricted(read_pyc(model), environment, layer=model) +375 path = os.path.join(cpath, 'models') +376 models = listdir(path, '^\w+\.pyc$',0,sort=False) +377 compiled=True +378 else: +379 path = os.path.join(folder, 'models') +380 models = listdir(path, '^\w+\.py$',0,sort=False) +381 compiled=False +382 paths = (path, os.path.join(path,c), os.path.join(path,c,f)) +383 for model in models: +384 if not os.path.split(model)[0] in paths and c!='appadmin': +385 continue +386 elif compiled: +387 code = read_pyc(model) +388 elif is_gae: +389 code = getcfs(model, model, +390 lambda: compile2(read_file(model), model)) +391 else: +392 code = getcfs(model, model, None) +393 restricted(code, environment, layer=model) +
    394 +395 +
    396 -def run_controller_in(controller, function, environment): +
    397 """ +398 Runs the controller.function() (for the app specified by +399 the current folder). +400 It tries pre-compiled controller_function.pyc first before compiling it. +401 """ +402 +403 # if compiled should run compiled! +404 +405 folder = environment['request'].folder +406 path = os.path.join(folder, 'compiled') +407 badc = 'invalid controller (%s/%s)' % (controller, function) +408 badf = 'invalid function (%s/%s)' % (controller, function) +409 if os.path.exists(path): +410 filename = os.path.join(path, 'controllers_%s_%s.pyc' +411 % (controller, function)) +412 if not os.path.exists(filename): +413 raise HTTP(404, +414 rewrite.thread.routes.error_message % badf, +415 web2py_error=badf) +416 restricted(read_pyc(filename), environment, layer=filename) +417 elif function == '_TEST': +418 # TESTING: adjust the path to include site packages +419 from settings import global_settings +420 from admin import abspath, add_path_first +421 paths = (global_settings.gluon_parent, abspath('site-packages', gluon=True), abspath('gluon', gluon=True), '') +422 [add_path_first(path) for path in paths] +423 # TESTING END +424 +425 filename = os.path.join(folder, 'controllers/%s.py' +426 % controller) +427 if not os.path.exists(filename): +428 raise HTTP(404, +429 rewrite.thread.routes.error_message % badc, +430 web2py_error=badc) +431 environment['__symbols__'] = environment.keys() +432 code = read_file(filename) +433 code += TEST_CODE +434 restricted(code, environment, layer=filename) +435 else: +436 filename = os.path.join(folder, 'controllers/%s.py' +437 % controller) +438 if not os.path.exists(filename): +439 raise HTTP(404, +440 rewrite.thread.routes.error_message % badc, +441 web2py_error=badc) +442 code = read_file(filename) +443 exposed = regex_expose.findall(code) +444 if not function in exposed: +445 raise HTTP(404, +446 rewrite.thread.routes.error_message % badf, +447 web2py_error=badf) +448 code = "%s\nresponse._vars=response._caller(%s)\n" % (code, function) +449 if is_gae: +450 layer = filename + ':' + function +451 code = getcfs(layer, filename, lambda: compile2(code,layer)) +452 restricted(code, environment, filename) +453 response = environment['response'] +454 vars=response._vars +455 if response.postprocessing: +456 for p in response.postprocessing: +457 vars = p(vars) +458 if isinstance(vars,unicode): +459 vars = vars.encode('utf8') +460 if hasattr(vars,'xml'): +461 vars = vars.xml() +462 return vars +
    463 +
    464 -def run_view_in(environment): +
    465 """ +466 Executes the view for the requested action. +467 The view is the one specified in `response.view` or determined by the url +468 or `view/generic.extension` +469 It tries the pre-compiled views_controller_function.pyc before compiling it. +470 """ +471 +472 request = environment['request'] +473 response = environment['response'] +474 folder = request.folder +475 path = os.path.join(folder, 'compiled') +476 badv = 'invalid view (%s)' % response.view +477 patterns = response.generic_patterns or [] +478 regex = re.compile('|'.join(fnmatch.translate(r) for r in patterns)) +479 short_action = '%(controller)s/%(function)s.%(extension)s' % request +480 allow_generic = patterns and regex.search(short_action) +481 if not isinstance(response.view, str): +482 ccode = parse_template(response.view, os.path.join(folder, 'views'), +483 context=environment) +484 restricted(ccode, environment, 'file stream') +485 elif os.path.exists(path): +486 x = response.view.replace('/', '_') +487 files = ['views_%s.pyc' % x] +488 if allow_generic: +489 files.append('views_generic.%s.pyc' % request.extension) +490 # for backward compatibility +491 if request.extension == 'html': +492 files.append('views_%s.pyc' % x[:-5]) +493 if allow_generic: +494 files.append('views_generic.pyc') +495 # end backward compatibility code +496 for f in files: +497 filename = os.path.join(path,f) +498 if os.path.exists(filename): +499 code = read_pyc(filename) +500 restricted(code, environment, layer=filename) +501 return +502 raise HTTP(404, +503 rewrite.thread.routes.error_message % badv, +504 web2py_error=badv) +505 else: +506 filename = os.path.join(folder, 'views', response.view) +507 if not os.path.exists(filename) and allow_generic: +508 response.view = 'generic.' + request.extension +509 filename = os.path.join(folder, 'views', response.view) +510 if not os.path.exists(filename): +511 raise HTTP(404, +512 rewrite.thread.routes.error_message % badv, +513 web2py_error=badv) +514 layer = filename +515 if is_gae: +516 ccode = getcfs(layer, filename, +517 lambda: compile2(parse_template(response.view, +518 os.path.join(folder, 'views'), +519 context=environment),layer)) +520 else: +521 ccode = parse_template(response.view, +522 os.path.join(folder, 'views'), +523 context=environment) +524 restricted(ccode, environment, layer) +
    525 +
    526 -def remove_compiled_application(folder): +
    527 """ +528 Deletes the folder `compiled` containing the compiled application. +529 """ +530 try: +531 shutil.rmtree(os.path.join(folder, 'compiled')) +532 path = os.path.join(folder, 'controllers') +533 for file in listdir(path,'.*\.pyc$',drop=False): +534 os.unlink(file) +535 except OSError: +536 pass +
    537 +538 +
    539 -def compile_application(folder): +
    540 """ +541 Compiles all models, views, controller for the application in `folder`. +542 """ +543 remove_compiled_application(folder) +544 os.mkdir(os.path.join(folder, 'compiled')) +545 compile_models(folder) +546 compile_controllers(folder) +547 compile_views(folder) +
    548 +549 +
    550 -def test(): +
    551 """ +552 Example:: +553 +554 >>> import traceback, types +555 >>> environment={'x':1} +556 >>> open('a.py', 'w').write('print 1/x') +557 >>> save_pyc('a.py') +558 >>> os.unlink('a.py') +559 >>> if type(read_pyc('a.pyc'))==types.CodeType: print 'code' +560 code +561 >>> exec read_pyc('a.pyc') in environment +562 1 +563 """ +564 +565 return +
    566 +567 +568 if __name__ == '__main__': +569 import doctest +570 doctest.testmod() +571 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.compileapp.LoadFactory-class.html Index: applications/examples/static/epydoc/web2py.gluon.compileapp.LoadFactory-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.compileapp.LoadFactory-class.html @@ -0,0 +1,275 @@ + + + + + web2py.gluon.compileapp.LoadFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module compileapp :: + Class LoadFactory + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class LoadFactory

    source code

    +
    +object --+
    +         |
    +        LoadFactory
    +
    + +
    +Attention: this helper is new and experimental

    + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __init__(self, + environment)
    + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature
    + source code + +
    + +
    +   + + + + + + +
    __call__(self, + c=1, + f='index', + args=[], + vars={}, + extension=1, + target=1, + ajax=True, + ajax_trap=True, + url=1, + user_signature=True, + content='loading...', + **attr) + source code + +
    + +
    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __init__(self, + environment) +
    (Constructor) +

    +
    source code  +
    + + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
    +
    Overrides: + object.__init__ +
    (inherited documentation)
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.compileapp.mybuiltin-class.html Index: applications/examples/static/epydoc/web2py.gluon.compileapp.mybuiltin-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.compileapp.mybuiltin-class.html @@ -0,0 +1,220 @@ + + + + + web2py.gluon.compileapp.mybuiltin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module compileapp :: + Class mybuiltin + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class mybuiltin

    source code

    +
    +object --+
    +         |
    +        mybuiltin
    +
    + +
    +NOTE could simple use a dict and populate it, NOTE not sure if this + changes things though if monkey patching import.....

    + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __getitem__(self, + key) + source code + +
    + +
    +   + + + + + + +
    __setitem__(self, + key, + value) + source code + +
    + +
    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __init__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contenttype-module.html Index: applications/examples/static/epydoc/web2py.gluon.contenttype-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contenttype-module.html @@ -0,0 +1,236 @@ + + + + + web2py.gluon.contenttype + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module contenttype + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module contenttype

    source code

    +

    This file is part of the web2py Web Framework Copyrighted by Massimo + Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 + (http://www.gnu.org/licenses/lgpl.html)

    + CONTENT_TYPE dictionary created against freedesktop.org' shared mime + info database version 0.70.

    + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    contenttype(filename, + default='text/plain')
    + Returns the Content-Type string matching extension of the given + filename.
    + source code + +
    + +
    + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + CONTENT_TYPE = {'.123': 'application/vnd.lotus-1-2-3', '.3ds':... +
    + + + + + + +
    + + + + + +
    Variables Details[hide private]
    +
    + +
    + +
    +

    CONTENT_TYPE

    + +
    +
    +
    +
    Value:
    +
    +{'.123': 'application/vnd.lotus-1-2-3',
    + '.3ds': 'image/x-3ds',
    + '.3g2': 'video/3gpp',
    + '.3ga': 'video/3gpp',
    + '.3gp': 'video/3gpp',
    + '.3gpp': 'video/3gpp',
    + '.602': 'application/x-t602',
    + '.669': 'audio/x-mod',
    +...
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contenttype-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.contenttype-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contenttype-pysrc.html @@ -0,0 +1,840 @@ + + + + + web2py.gluon.contenttype + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module contenttype + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.contenttype

    +
    +  1  #!/usr/bin/env python 
    +  2  # -*- coding: utf-8 -*- 
    +  3   
    +  4  """ 
    +  5  This file is part of the web2py Web Framework 
    +  6  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    +  7  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    +  8   
    +  9  CONTENT_TYPE dictionary created against freedesktop.org' shared mime info 
    + 10  database version 0.70. 
    + 11  """ 
    + 12   
    + 13  __all__ = ['contenttype'] 
    + 14   
    + 15  CONTENT_TYPE = { 
    + 16      '.load': 'text/html', 
    + 17      '.123': 'application/vnd.lotus-1-2-3', 
    + 18      '.3ds': 'image/x-3ds', 
    + 19      '.3g2': 'video/3gpp', 
    + 20      '.3ga': 'video/3gpp', 
    + 21      '.3gp': 'video/3gpp', 
    + 22      '.3gpp': 'video/3gpp', 
    + 23      '.602': 'application/x-t602', 
    + 24      '.669': 'audio/x-mod', 
    + 25      '.7z': 'application/x-7z-compressed', 
    + 26      '.a': 'application/x-archive', 
    + 27      '.aac': 'audio/mp4', 
    + 28      '.abw': 'application/x-abiword', 
    + 29      '.abw.crashed': 'application/x-abiword', 
    + 30      '.abw.gz': 'application/x-abiword', 
    + 31      '.ac3': 'audio/ac3', 
    + 32      '.ace': 'application/x-ace', 
    + 33      '.adb': 'text/x-adasrc', 
    + 34      '.ads': 'text/x-adasrc', 
    + 35      '.afm': 'application/x-font-afm', 
    + 36      '.ag': 'image/x-applix-graphics', 
    + 37      '.ai': 'application/illustrator', 
    + 38      '.aif': 'audio/x-aiff', 
    + 39      '.aifc': 'audio/x-aiff', 
    + 40      '.aiff': 'audio/x-aiff', 
    + 41      '.al': 'application/x-perl', 
    + 42      '.alz': 'application/x-alz', 
    + 43      '.amr': 'audio/amr', 
    + 44      '.ani': 'application/x-navi-animation', 
    + 45      '.anim[1-9j]': 'video/x-anim', 
    + 46      '.anx': 'application/annodex', 
    + 47      '.ape': 'audio/x-ape', 
    + 48      '.arj': 'application/x-arj', 
    + 49      '.arw': 'image/x-sony-arw', 
    + 50      '.as': 'application/x-applix-spreadsheet', 
    + 51      '.asc': 'text/plain', 
    + 52      '.asf': 'video/x-ms-asf', 
    + 53      '.asp': 'application/x-asp', 
    + 54      '.ass': 'text/x-ssa', 
    + 55      '.asx': 'audio/x-ms-asx', 
    + 56      '.atom': 'application/atom+xml', 
    + 57      '.au': 'audio/basic', 
    + 58      '.avi': 'video/x-msvideo', 
    + 59      '.aw': 'application/x-applix-word', 
    + 60      '.awb': 'audio/amr-wb', 
    + 61      '.awk': 'application/x-awk', 
    + 62      '.axa': 'audio/annodex', 
    + 63      '.axv': 'video/annodex', 
    + 64      '.bak': 'application/x-trash', 
    + 65      '.bcpio': 'application/x-bcpio', 
    + 66      '.bdf': 'application/x-font-bdf', 
    + 67      '.bib': 'text/x-bibtex', 
    + 68      '.bin': 'application/octet-stream', 
    + 69      '.blend': 'application/x-blender', 
    + 70      '.blender': 'application/x-blender', 
    + 71      '.bmp': 'image/bmp', 
    + 72      '.bz': 'application/x-bzip', 
    + 73      '.bz2': 'application/x-bzip', 
    + 74      '.c': 'text/x-csrc', 
    + 75      '.c++': 'text/x-c++src', 
    + 76      '.cab': 'application/vnd.ms-cab-compressed', 
    + 77      '.cb7': 'application/x-cb7', 
    + 78      '.cbr': 'application/x-cbr', 
    + 79      '.cbt': 'application/x-cbt', 
    + 80      '.cbz': 'application/x-cbz', 
    + 81      '.cc': 'text/x-c++src', 
    + 82      '.cdf': 'application/x-netcdf', 
    + 83      '.cdr': 'application/vnd.corel-draw', 
    + 84      '.cer': 'application/x-x509-ca-cert', 
    + 85      '.cert': 'application/x-x509-ca-cert', 
    + 86      '.cgm': 'image/cgm', 
    + 87      '.chm': 'application/x-chm', 
    + 88      '.chrt': 'application/x-kchart', 
    + 89      '.class': 'application/x-java', 
    + 90      '.cls': 'text/x-tex', 
    + 91      '.cmake': 'text/x-cmake', 
    + 92      '.cpio': 'application/x-cpio', 
    + 93      '.cpio.gz': 'application/x-cpio-compressed', 
    + 94      '.cpp': 'text/x-c++src', 
    + 95      '.cr2': 'image/x-canon-cr2', 
    + 96      '.crt': 'application/x-x509-ca-cert', 
    + 97      '.crw': 'image/x-canon-crw', 
    + 98      '.cs': 'text/x-csharp', 
    + 99      '.csh': 'application/x-csh', 
    +100      '.css': 'text/css', 
    +101      '.cssl': 'text/css', 
    +102      '.csv': 'text/csv', 
    +103      '.cue': 'application/x-cue', 
    +104      '.cur': 'image/x-win-bitmap', 
    +105      '.cxx': 'text/x-c++src', 
    +106      '.d': 'text/x-dsrc', 
    +107      '.dar': 'application/x-dar', 
    +108      '.dbf': 'application/x-dbf', 
    +109      '.dc': 'application/x-dc-rom', 
    +110      '.dcl': 'text/x-dcl', 
    +111      '.dcm': 'application/dicom', 
    +112      '.dcr': 'image/x-kodak-dcr', 
    +113      '.dds': 'image/x-dds', 
    +114      '.deb': 'application/x-deb', 
    +115      '.der': 'application/x-x509-ca-cert', 
    +116      '.desktop': 'application/x-desktop', 
    +117      '.dia': 'application/x-dia-diagram', 
    +118      '.diff': 'text/x-patch', 
    +119      '.divx': 'video/x-msvideo', 
    +120      '.djv': 'image/vnd.djvu', 
    +121      '.djvu': 'image/vnd.djvu', 
    +122      '.dng': 'image/x-adobe-dng', 
    +123      '.doc': 'application/msword', 
    +124      '.docbook': 'application/docbook+xml', 
    +125      '.docm': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    +126      '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    +127      '.dot': 'text/vnd.graphviz', 
    +128      '.dsl': 'text/x-dsl', 
    +129      '.dtd': 'application/xml-dtd', 
    +130      '.dtx': 'text/x-tex', 
    +131      '.dv': 'video/dv', 
    +132      '.dvi': 'application/x-dvi', 
    +133      '.dvi.bz2': 'application/x-bzdvi', 
    +134      '.dvi.gz': 'application/x-gzdvi', 
    +135      '.dwg': 'image/vnd.dwg', 
    +136      '.dxf': 'image/vnd.dxf', 
    +137      '.e': 'text/x-eiffel', 
    +138      '.egon': 'application/x-egon', 
    +139      '.eif': 'text/x-eiffel', 
    +140      '.el': 'text/x-emacs-lisp', 
    +141      '.emf': 'image/x-emf', 
    +142      '.emp': 'application/vnd.emusic-emusic_package', 
    +143      '.ent': 'application/xml-external-parsed-entity', 
    +144      '.eps': 'image/x-eps', 
    +145      '.eps.bz2': 'image/x-bzeps', 
    +146      '.eps.gz': 'image/x-gzeps', 
    +147      '.epsf': 'image/x-eps', 
    +148      '.epsf.bz2': 'image/x-bzeps', 
    +149      '.epsf.gz': 'image/x-gzeps', 
    +150      '.epsi': 'image/x-eps', 
    +151      '.epsi.bz2': 'image/x-bzeps', 
    +152      '.epsi.gz': 'image/x-gzeps', 
    +153      '.epub': 'application/epub+zip', 
    +154      '.erl': 'text/x-erlang', 
    +155      '.es': 'application/ecmascript', 
    +156      '.etheme': 'application/x-e-theme', 
    +157      '.etx': 'text/x-setext', 
    +158      '.exe': 'application/x-ms-dos-executable', 
    +159      '.exr': 'image/x-exr', 
    +160      '.ez': 'application/andrew-inset', 
    +161      '.f': 'text/x-fortran', 
    +162      '.f90': 'text/x-fortran', 
    +163      '.f95': 'text/x-fortran', 
    +164      '.fb2': 'application/x-fictionbook+xml', 
    +165      '.fig': 'image/x-xfig', 
    +166      '.fits': 'image/fits', 
    +167      '.fl': 'application/x-fluid', 
    +168      '.flac': 'audio/x-flac', 
    +169      '.flc': 'video/x-flic', 
    +170      '.fli': 'video/x-flic', 
    +171      '.flv': 'video/x-flv', 
    +172      '.flw': 'application/x-kivio', 
    +173      '.fo': 'text/x-xslfo', 
    +174      '.for': 'text/x-fortran', 
    +175      '.g3': 'image/fax-g3', 
    +176      '.gb': 'application/x-gameboy-rom', 
    +177      '.gba': 'application/x-gba-rom', 
    +178      '.gcrd': 'text/directory', 
    +179      '.ged': 'application/x-gedcom', 
    +180      '.gedcom': 'application/x-gedcom', 
    +181      '.gen': 'application/x-genesis-rom', 
    +182      '.gf': 'application/x-tex-gf', 
    +183      '.gg': 'application/x-sms-rom', 
    +184      '.gif': 'image/gif', 
    +185      '.glade': 'application/x-glade', 
    +186      '.gmo': 'application/x-gettext-translation', 
    +187      '.gnc': 'application/x-gnucash', 
    +188      '.gnd': 'application/gnunet-directory', 
    +189      '.gnucash': 'application/x-gnucash', 
    +190      '.gnumeric': 'application/x-gnumeric', 
    +191      '.gnuplot': 'application/x-gnuplot', 
    +192      '.gp': 'application/x-gnuplot', 
    +193      '.gpg': 'application/pgp-encrypted', 
    +194      '.gplt': 'application/x-gnuplot', 
    +195      '.gra': 'application/x-graphite', 
    +196      '.gsf': 'application/x-font-type1', 
    +197      '.gsm': 'audio/x-gsm', 
    +198      '.gtar': 'application/x-tar', 
    +199      '.gv': 'text/vnd.graphviz', 
    +200      '.gvp': 'text/x-google-video-pointer', 
    +201      '.gz': 'application/x-gzip', 
    +202      '.h': 'text/x-chdr', 
    +203      '.h++': 'text/x-c++hdr', 
    +204      '.hdf': 'application/x-hdf', 
    +205      '.hh': 'text/x-c++hdr', 
    +206      '.hp': 'text/x-c++hdr', 
    +207      '.hpgl': 'application/vnd.hp-hpgl', 
    +208      '.hpp': 'text/x-c++hdr', 
    +209      '.hs': 'text/x-haskell', 
    +210      '.htm': 'text/html', 
    +211      '.html': 'text/html', 
    +212      '.hwp': 'application/x-hwp', 
    +213      '.hwt': 'application/x-hwt', 
    +214      '.hxx': 'text/x-c++hdr', 
    +215      '.ica': 'application/x-ica', 
    +216      '.icb': 'image/x-tga', 
    +217      '.icns': 'image/x-icns', 
    +218      '.ico': 'image/vnd.microsoft.icon', 
    +219      '.ics': 'text/calendar', 
    +220      '.idl': 'text/x-idl', 
    +221      '.ief': 'image/ief', 
    +222      '.iff': 'image/x-iff', 
    +223      '.ilbm': 'image/x-ilbm', 
    +224      '.ime': 'text/x-imelody', 
    +225      '.imy': 'text/x-imelody', 
    +226      '.ins': 'text/x-tex', 
    +227      '.iptables': 'text/x-iptables', 
    +228      '.iso': 'application/x-cd-image', 
    +229      '.iso9660': 'application/x-cd-image', 
    +230      '.it': 'audio/x-it', 
    +231      '.j2k': 'image/jp2', 
    +232      '.jad': 'text/vnd.sun.j2me.app-descriptor', 
    +233      '.jar': 'application/x-java-archive', 
    +234      '.java': 'text/x-java', 
    +235      '.jng': 'image/x-jng', 
    +236      '.jnlp': 'application/x-java-jnlp-file', 
    +237      '.jp2': 'image/jp2', 
    +238      '.jpc': 'image/jp2', 
    +239      '.jpe': 'image/jpeg', 
    +240      '.jpeg': 'image/jpeg', 
    +241      '.jpf': 'image/jp2', 
    +242      '.jpg': 'image/jpeg', 
    +243      '.jpr': 'application/x-jbuilder-project', 
    +244      '.jpx': 'image/jp2', 
    +245      '.js': 'application/javascript', 
    +246      '.json': 'application/json', 
    +247      '.k25': 'image/x-kodak-k25', 
    +248      '.kar': 'audio/midi', 
    +249      '.karbon': 'application/x-karbon', 
    +250      '.kdc': 'image/x-kodak-kdc', 
    +251      '.kdelnk': 'application/x-desktop', 
    +252      '.kexi': 'application/x-kexiproject-sqlite3', 
    +253      '.kexic': 'application/x-kexi-connectiondata', 
    +254      '.kexis': 'application/x-kexiproject-shortcut', 
    +255      '.kfo': 'application/x-kformula', 
    +256      '.kil': 'application/x-killustrator', 
    +257      '.kino': 'application/smil', 
    +258      '.kml': 'application/vnd.google-earth.kml+xml', 
    +259      '.kmz': 'application/vnd.google-earth.kmz', 
    +260      '.kon': 'application/x-kontour', 
    +261      '.kpm': 'application/x-kpovmodeler', 
    +262      '.kpr': 'application/x-kpresenter', 
    +263      '.kpt': 'application/x-kpresenter', 
    +264      '.kra': 'application/x-krita', 
    +265      '.ksp': 'application/x-kspread', 
    +266      '.kud': 'application/x-kugar', 
    +267      '.kwd': 'application/x-kword', 
    +268      '.kwt': 'application/x-kword', 
    +269      '.la': 'application/x-shared-library-la', 
    +270      '.latex': 'text/x-tex', 
    +271      '.ldif': 'text/x-ldif', 
    +272      '.lha': 'application/x-lha', 
    +273      '.lhs': 'text/x-literate-haskell', 
    +274      '.lhz': 'application/x-lhz', 
    +275      '.log': 'text/x-log', 
    +276      '.ltx': 'text/x-tex', 
    +277      '.lua': 'text/x-lua', 
    +278      '.lwo': 'image/x-lwo', 
    +279      '.lwob': 'image/x-lwo', 
    +280      '.lws': 'image/x-lws', 
    +281      '.ly': 'text/x-lilypond', 
    +282      '.lyx': 'application/x-lyx', 
    +283      '.lz': 'application/x-lzip', 
    +284      '.lzh': 'application/x-lha', 
    +285      '.lzma': 'application/x-lzma', 
    +286      '.lzo': 'application/x-lzop', 
    +287      '.m': 'text/x-matlab', 
    +288      '.m15': 'audio/x-mod', 
    +289      '.m2t': 'video/mpeg', 
    +290      '.m3u': 'audio/x-mpegurl', 
    +291      '.m3u8': 'audio/x-mpegurl', 
    +292      '.m4': 'application/x-m4', 
    +293      '.m4a': 'audio/mp4', 
    +294      '.m4b': 'audio/x-m4b', 
    +295      '.m4v': 'video/mp4', 
    +296      '.mab': 'application/x-markaby', 
    +297      '.man': 'application/x-troff-man', 
    +298      '.mbox': 'application/mbox', 
    +299      '.md': 'application/x-genesis-rom', 
    +300      '.mdb': 'application/vnd.ms-access', 
    +301      '.mdi': 'image/vnd.ms-modi', 
    +302      '.me': 'text/x-troff-me', 
    +303      '.med': 'audio/x-mod', 
    +304      '.metalink': 'application/metalink+xml', 
    +305      '.mgp': 'application/x-magicpoint', 
    +306      '.mid': 'audio/midi', 
    +307      '.midi': 'audio/midi', 
    +308      '.mif': 'application/x-mif', 
    +309      '.minipsf': 'audio/x-minipsf', 
    +310      '.mka': 'audio/x-matroska', 
    +311      '.mkv': 'video/x-matroska', 
    +312      '.ml': 'text/x-ocaml', 
    +313      '.mli': 'text/x-ocaml', 
    +314      '.mm': 'text/x-troff-mm', 
    +315      '.mmf': 'application/x-smaf', 
    +316      '.mml': 'text/mathml', 
    +317      '.mng': 'video/x-mng', 
    +318      '.mo': 'application/x-gettext-translation', 
    +319      '.mo3': 'audio/x-mo3', 
    +320      '.moc': 'text/x-moc', 
    +321      '.mod': 'audio/x-mod', 
    +322      '.mof': 'text/x-mof', 
    +323      '.moov': 'video/quicktime', 
    +324      '.mov': 'video/quicktime', 
    +325      '.movie': 'video/x-sgi-movie', 
    +326      '.mp+': 'audio/x-musepack', 
    +327      '.mp2': 'video/mpeg', 
    +328      '.mp3': 'audio/mpeg', 
    +329      '.mp4': 'video/mp4', 
    +330      '.mpc': 'audio/x-musepack', 
    +331      '.mpe': 'video/mpeg', 
    +332      '.mpeg': 'video/mpeg', 
    +333      '.mpg': 'video/mpeg', 
    +334      '.mpga': 'audio/mpeg', 
    +335      '.mpp': 'audio/x-musepack', 
    +336      '.mrl': 'text/x-mrml', 
    +337      '.mrml': 'text/x-mrml', 
    +338      '.mrw': 'image/x-minolta-mrw', 
    +339      '.ms': 'text/x-troff-ms', 
    +340      '.msi': 'application/x-msi', 
    +341      '.msod': 'image/x-msod', 
    +342      '.msx': 'application/x-msx-rom', 
    +343      '.mtm': 'audio/x-mod', 
    +344      '.mup': 'text/x-mup', 
    +345      '.mxf': 'application/mxf', 
    +346      '.n64': 'application/x-n64-rom', 
    +347      '.nb': 'application/mathematica', 
    +348      '.nc': 'application/x-netcdf', 
    +349      '.nds': 'application/x-nintendo-ds-rom', 
    +350      '.nef': 'image/x-nikon-nef', 
    +351      '.nes': 'application/x-nes-rom', 
    +352      '.nfo': 'text/x-nfo', 
    +353      '.not': 'text/x-mup', 
    +354      '.nsc': 'application/x-netshow-channel', 
    +355      '.nsv': 'video/x-nsv', 
    +356      '.o': 'application/x-object', 
    +357      '.obj': 'application/x-tgif', 
    +358      '.ocl': 'text/x-ocl', 
    +359      '.oda': 'application/oda', 
    +360      '.odb': 'application/vnd.oasis.opendocument.database', 
    +361      '.odc': 'application/vnd.oasis.opendocument.chart', 
    +362      '.odf': 'application/vnd.oasis.opendocument.formula', 
    +363      '.odg': 'application/vnd.oasis.opendocument.graphics', 
    +364      '.odi': 'application/vnd.oasis.opendocument.image', 
    +365      '.odm': 'application/vnd.oasis.opendocument.text-master', 
    +366      '.odp': 'application/vnd.oasis.opendocument.presentation', 
    +367      '.ods': 'application/vnd.oasis.opendocument.spreadsheet', 
    +368      '.odt': 'application/vnd.oasis.opendocument.text', 
    +369      '.oga': 'audio/ogg', 
    +370      '.ogg': 'video/x-theora+ogg', 
    +371      '.ogm': 'video/x-ogm+ogg', 
    +372      '.ogv': 'video/ogg', 
    +373      '.ogx': 'application/ogg', 
    +374      '.old': 'application/x-trash', 
    +375      '.oleo': 'application/x-oleo', 
    +376      '.opml': 'text/x-opml+xml', 
    +377      '.ora': 'image/openraster', 
    +378      '.orf': 'image/x-olympus-orf', 
    +379      '.otc': 'application/vnd.oasis.opendocument.chart-template', 
    +380      '.otf': 'application/x-font-otf', 
    +381      '.otg': 'application/vnd.oasis.opendocument.graphics-template', 
    +382      '.oth': 'application/vnd.oasis.opendocument.text-web', 
    +383      '.otp': 'application/vnd.oasis.opendocument.presentation-template', 
    +384      '.ots': 'application/vnd.oasis.opendocument.spreadsheet-template', 
    +385      '.ott': 'application/vnd.oasis.opendocument.text-template', 
    +386      '.owl': 'application/rdf+xml', 
    +387      '.oxt': 'application/vnd.openofficeorg.extension', 
    +388      '.p': 'text/x-pascal', 
    +389      '.p10': 'application/pkcs10', 
    +390      '.p12': 'application/x-pkcs12', 
    +391      '.p7b': 'application/x-pkcs7-certificates', 
    +392      '.p7s': 'application/pkcs7-signature', 
    +393      '.pack': 'application/x-java-pack200', 
    +394      '.pak': 'application/x-pak', 
    +395      '.par2': 'application/x-par2', 
    +396      '.pas': 'text/x-pascal', 
    +397      '.patch': 'text/x-patch', 
    +398      '.pbm': 'image/x-portable-bitmap', 
    +399      '.pcd': 'image/x-photo-cd', 
    +400      '.pcf': 'application/x-cisco-vpn-settings', 
    +401      '.pcf.gz': 'application/x-font-pcf', 
    +402      '.pcf.z': 'application/x-font-pcf', 
    +403      '.pcl': 'application/vnd.hp-pcl', 
    +404      '.pcx': 'image/x-pcx', 
    +405      '.pdb': 'chemical/x-pdb', 
    +406      '.pdc': 'application/x-aportisdoc', 
    +407      '.pdf': 'application/pdf', 
    +408      '.pdf.bz2': 'application/x-bzpdf', 
    +409      '.pdf.gz': 'application/x-gzpdf', 
    +410      '.pef': 'image/x-pentax-pef', 
    +411      '.pem': 'application/x-x509-ca-cert', 
    +412      '.perl': 'application/x-perl', 
    +413      '.pfa': 'application/x-font-type1', 
    +414      '.pfb': 'application/x-font-type1', 
    +415      '.pfx': 'application/x-pkcs12', 
    +416      '.pgm': 'image/x-portable-graymap', 
    +417      '.pgn': 'application/x-chess-pgn', 
    +418      '.pgp': 'application/pgp-encrypted', 
    +419      '.php': 'application/x-php', 
    +420      '.php3': 'application/x-php', 
    +421      '.php4': 'application/x-php', 
    +422      '.pict': 'image/x-pict', 
    +423      '.pict1': 'image/x-pict', 
    +424      '.pict2': 'image/x-pict', 
    +425      '.pickle': 'application/python-pickle', 
    +426      '.pk': 'application/x-tex-pk', 
    +427      '.pkipath': 'application/pkix-pkipath', 
    +428      '.pkr': 'application/pgp-keys', 
    +429      '.pl': 'application/x-perl', 
    +430      '.pla': 'audio/x-iriver-pla', 
    +431      '.pln': 'application/x-planperfect', 
    +432      '.pls': 'audio/x-scpls', 
    +433      '.pm': 'application/x-perl', 
    +434      '.png': 'image/png', 
    +435      '.pnm': 'image/x-portable-anymap', 
    +436      '.pntg': 'image/x-macpaint', 
    +437      '.po': 'text/x-gettext-translation', 
    +438      '.por': 'application/x-spss-por', 
    +439      '.pot': 'text/x-gettext-translation-template', 
    +440      '.ppm': 'image/x-portable-pixmap', 
    +441      '.pps': 'application/vnd.ms-powerpoint', 
    +442      '.ppt': 'application/vnd.ms-powerpoint', 
    +443      '.pptm': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 
    +444      '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 
    +445      '.ppz': 'application/vnd.ms-powerpoint', 
    +446      '.prc': 'application/x-palm-database', 
    +447      '.ps': 'application/postscript', 
    +448      '.ps.bz2': 'application/x-bzpostscript', 
    +449      '.ps.gz': 'application/x-gzpostscript', 
    +450      '.psd': 'image/vnd.adobe.photoshop', 
    +451      '.psf': 'audio/x-psf', 
    +452      '.psf.gz': 'application/x-gz-font-linux-psf', 
    +453      '.psflib': 'audio/x-psflib', 
    +454      '.psid': 'audio/prs.sid', 
    +455      '.psw': 'application/x-pocket-word', 
    +456      '.pw': 'application/x-pw', 
    +457      '.py': 'text/x-python', 
    +458      '.pyc': 'application/x-python-bytecode', 
    +459      '.pyo': 'application/x-python-bytecode', 
    +460      '.qif': 'image/x-quicktime', 
    +461      '.qt': 'video/quicktime', 
    +462      '.qtif': 'image/x-quicktime', 
    +463      '.qtl': 'application/x-quicktime-media-link', 
    +464      '.qtvr': 'video/quicktime', 
    +465      '.ra': 'audio/vnd.rn-realaudio', 
    +466      '.raf': 'image/x-fuji-raf', 
    +467      '.ram': 'application/ram', 
    +468      '.rar': 'application/x-rar', 
    +469      '.ras': 'image/x-cmu-raster', 
    +470      '.raw': 'image/x-panasonic-raw', 
    +471      '.rax': 'audio/vnd.rn-realaudio', 
    +472      '.rb': 'application/x-ruby', 
    +473      '.rdf': 'application/rdf+xml', 
    +474      '.rdfs': 'application/rdf+xml', 
    +475      '.reg': 'text/x-ms-regedit', 
    +476      '.rej': 'application/x-reject', 
    +477      '.rgb': 'image/x-rgb', 
    +478      '.rle': 'image/rle', 
    +479      '.rm': 'application/vnd.rn-realmedia', 
    +480      '.rmj': 'application/vnd.rn-realmedia', 
    +481      '.rmm': 'application/vnd.rn-realmedia', 
    +482      '.rms': 'application/vnd.rn-realmedia', 
    +483      '.rmvb': 'application/vnd.rn-realmedia', 
    +484      '.rmx': 'application/vnd.rn-realmedia', 
    +485      '.roff': 'text/troff', 
    +486      '.rp': 'image/vnd.rn-realpix', 
    +487      '.rpm': 'application/x-rpm', 
    +488      '.rss': 'application/rss+xml', 
    +489      '.rt': 'text/vnd.rn-realtext', 
    +490      '.rtf': 'application/rtf', 
    +491      '.rtx': 'text/richtext', 
    +492      '.rv': 'video/vnd.rn-realvideo', 
    +493      '.rvx': 'video/vnd.rn-realvideo', 
    +494      '.s3m': 'audio/x-s3m', 
    +495      '.sam': 'application/x-amipro', 
    +496      '.sami': 'application/x-sami', 
    +497      '.sav': 'application/x-spss-sav', 
    +498      '.scm': 'text/x-scheme', 
    +499      '.sda': 'application/vnd.stardivision.draw', 
    +500      '.sdc': 'application/vnd.stardivision.calc', 
    +501      '.sdd': 'application/vnd.stardivision.impress', 
    +502      '.sdp': 'application/sdp', 
    +503      '.sds': 'application/vnd.stardivision.chart', 
    +504      '.sdw': 'application/vnd.stardivision.writer', 
    +505      '.sgf': 'application/x-go-sgf', 
    +506      '.sgi': 'image/x-sgi', 
    +507      '.sgl': 'application/vnd.stardivision.writer', 
    +508      '.sgm': 'text/sgml', 
    +509      '.sgml': 'text/sgml', 
    +510      '.sh': 'application/x-shellscript', 
    +511      '.shar': 'application/x-shar', 
    +512      '.shn': 'application/x-shorten', 
    +513      '.siag': 'application/x-siag', 
    +514      '.sid': 'audio/prs.sid', 
    +515      '.sik': 'application/x-trash', 
    +516      '.sis': 'application/vnd.symbian.install', 
    +517      '.sisx': 'x-epoc/x-sisx-app', 
    +518      '.sit': 'application/x-stuffit', 
    +519      '.siv': 'application/sieve', 
    +520      '.sk': 'image/x-skencil', 
    +521      '.sk1': 'image/x-skencil', 
    +522      '.skr': 'application/pgp-keys', 
    +523      '.slk': 'text/spreadsheet', 
    +524      '.smaf': 'application/x-smaf', 
    +525      '.smc': 'application/x-snes-rom', 
    +526      '.smd': 'application/vnd.stardivision.mail', 
    +527      '.smf': 'application/vnd.stardivision.math', 
    +528      '.smi': 'application/x-sami', 
    +529      '.smil': 'application/smil', 
    +530      '.sml': 'application/smil', 
    +531      '.sms': 'application/x-sms-rom', 
    +532      '.snd': 'audio/basic', 
    +533      '.so': 'application/x-sharedlib', 
    +534      '.spc': 'application/x-pkcs7-certificates', 
    +535      '.spd': 'application/x-font-speedo', 
    +536      '.spec': 'text/x-rpm-spec', 
    +537      '.spl': 'application/x-shockwave-flash', 
    +538      '.spx': 'audio/x-speex', 
    +539      '.sql': 'text/x-sql', 
    +540      '.sr2': 'image/x-sony-sr2', 
    +541      '.src': 'application/x-wais-source', 
    +542      '.srf': 'image/x-sony-srf', 
    +543      '.srt': 'application/x-subrip', 
    +544      '.ssa': 'text/x-ssa', 
    +545      '.stc': 'application/vnd.sun.xml.calc.template', 
    +546      '.std': 'application/vnd.sun.xml.draw.template', 
    +547      '.sti': 'application/vnd.sun.xml.impress.template', 
    +548      '.stm': 'audio/x-stm', 
    +549      '.stw': 'application/vnd.sun.xml.writer.template', 
    +550      '.sty': 'text/x-tex', 
    +551      '.sub': 'text/x-subviewer', 
    +552      '.sun': 'image/x-sun-raster', 
    +553      '.sv4cpio': 'application/x-sv4cpio', 
    +554      '.sv4crc': 'application/x-sv4crc', 
    +555      '.svg': 'image/svg+xml', 
    +556      '.svgz': 'image/svg+xml-compressed', 
    +557      '.swf': 'application/x-shockwave-flash', 
    +558      '.sxc': 'application/vnd.sun.xml.calc', 
    +559      '.sxd': 'application/vnd.sun.xml.draw', 
    +560      '.sxg': 'application/vnd.sun.xml.writer.global', 
    +561      '.sxi': 'application/vnd.sun.xml.impress', 
    +562      '.sxm': 'application/vnd.sun.xml.math', 
    +563      '.sxw': 'application/vnd.sun.xml.writer', 
    +564      '.sylk': 'text/spreadsheet', 
    +565      '.t': 'text/troff', 
    +566      '.t2t': 'text/x-txt2tags', 
    +567      '.tar': 'application/x-tar', 
    +568      '.tar.bz': 'application/x-bzip-compressed-tar', 
    +569      '.tar.bz2': 'application/x-bzip-compressed-tar', 
    +570      '.tar.gz': 'application/x-compressed-tar', 
    +571      '.tar.lzma': 'application/x-lzma-compressed-tar', 
    +572      '.tar.lzo': 'application/x-tzo', 
    +573      '.tar.xz': 'application/x-xz-compressed-tar', 
    +574      '.tar.z': 'application/x-tarz', 
    +575      '.tbz': 'application/x-bzip-compressed-tar', 
    +576      '.tbz2': 'application/x-bzip-compressed-tar', 
    +577      '.tcl': 'text/x-tcl', 
    +578      '.tex': 'text/x-tex', 
    +579      '.texi': 'text/x-texinfo', 
    +580      '.texinfo': 'text/x-texinfo', 
    +581      '.tga': 'image/x-tga', 
    +582      '.tgz': 'application/x-compressed-tar', 
    +583      '.theme': 'application/x-theme', 
    +584      '.themepack': 'application/x-windows-themepack', 
    +585      '.tif': 'image/tiff', 
    +586      '.tiff': 'image/tiff', 
    +587      '.tk': 'text/x-tcl', 
    +588      '.tlz': 'application/x-lzma-compressed-tar', 
    +589      '.tnef': 'application/vnd.ms-tnef', 
    +590      '.tnf': 'application/vnd.ms-tnef', 
    +591      '.toc': 'application/x-cdrdao-toc', 
    +592      '.torrent': 'application/x-bittorrent', 
    +593      '.tpic': 'image/x-tga', 
    +594      '.tr': 'text/troff', 
    +595      '.ts': 'application/x-linguist', 
    +596      '.tsv': 'text/tab-separated-values', 
    +597      '.tta': 'audio/x-tta', 
    +598      '.ttc': 'application/x-font-ttf', 
    +599      '.ttf': 'application/x-font-ttf', 
    +600      '.ttx': 'application/x-font-ttx', 
    +601      '.txt': 'text/plain', 
    +602      '.txz': 'application/x-xz-compressed-tar', 
    +603      '.tzo': 'application/x-tzo', 
    +604      '.ufraw': 'application/x-ufraw', 
    +605      '.ui': 'application/x-designer', 
    +606      '.uil': 'text/x-uil', 
    +607      '.ult': 'audio/x-mod', 
    +608      '.uni': 'audio/x-mod', 
    +609      '.uri': 'text/x-uri', 
    +610      '.url': 'text/x-uri', 
    +611      '.ustar': 'application/x-ustar', 
    +612      '.vala': 'text/x-vala', 
    +613      '.vapi': 'text/x-vala', 
    +614      '.vcf': 'text/directory', 
    +615      '.vcs': 'text/calendar', 
    +616      '.vct': 'text/directory', 
    +617      '.vda': 'image/x-tga', 
    +618      '.vhd': 'text/x-vhdl', 
    +619      '.vhdl': 'text/x-vhdl', 
    +620      '.viv': 'video/vivo', 
    +621      '.vivo': 'video/vivo', 
    +622      '.vlc': 'audio/x-mpegurl', 
    +623      '.vob': 'video/mpeg', 
    +624      '.voc': 'audio/x-voc', 
    +625      '.vor': 'application/vnd.stardivision.writer', 
    +626      '.vst': 'image/x-tga', 
    +627      '.wav': 'audio/x-wav', 
    +628      '.wax': 'audio/x-ms-asx', 
    +629      '.wb1': 'application/x-quattropro', 
    +630      '.wb2': 'application/x-quattropro', 
    +631      '.wb3': 'application/x-quattropro', 
    +632      '.wbmp': 'image/vnd.wap.wbmp', 
    +633      '.wcm': 'application/vnd.ms-works', 
    +634      '.wdb': 'application/vnd.ms-works', 
    +635      '.wk1': 'application/vnd.lotus-1-2-3', 
    +636      '.wk3': 'application/vnd.lotus-1-2-3', 
    +637      '.wk4': 'application/vnd.lotus-1-2-3', 
    +638      '.wks': 'application/vnd.ms-works', 
    +639      '.wma': 'audio/x-ms-wma', 
    +640      '.wmf': 'image/x-wmf', 
    +641      '.wml': 'text/vnd.wap.wml', 
    +642      '.wmls': 'text/vnd.wap.wmlscript', 
    +643      '.wmv': 'video/x-ms-wmv', 
    +644      '.wmx': 'audio/x-ms-asx', 
    +645      '.wp': 'application/vnd.wordperfect', 
    +646      '.wp4': 'application/vnd.wordperfect', 
    +647      '.wp5': 'application/vnd.wordperfect', 
    +648      '.wp6': 'application/vnd.wordperfect', 
    +649      '.wpd': 'application/vnd.wordperfect', 
    +650      '.wpg': 'application/x-wpg', 
    +651      '.wpl': 'application/vnd.ms-wpl', 
    +652      '.wpp': 'application/vnd.wordperfect', 
    +653      '.wps': 'application/vnd.ms-works', 
    +654      '.wri': 'application/x-mswrite', 
    +655      '.wrl': 'model/vrml', 
    +656      '.wv': 'audio/x-wavpack', 
    +657      '.wvc': 'audio/x-wavpack-correction', 
    +658      '.wvp': 'audio/x-wavpack', 
    +659      '.wvx': 'audio/x-ms-asx', 
    +660      '.x3f': 'image/x-sigma-x3f', 
    +661      '.xac': 'application/x-gnucash', 
    +662      '.xbel': 'application/x-xbel', 
    +663      '.xbl': 'application/xml', 
    +664      '.xbm': 'image/x-xbitmap', 
    +665      '.xcf': 'image/x-xcf', 
    +666      '.xcf.bz2': 'image/x-compressed-xcf', 
    +667      '.xcf.gz': 'image/x-compressed-xcf', 
    +668      '.xhtml': 'application/xhtml+xml', 
    +669      '.xi': 'audio/x-xi', 
    +670      '.xla': 'application/vnd.ms-excel', 
    +671      '.xlc': 'application/vnd.ms-excel', 
    +672      '.xld': 'application/vnd.ms-excel', 
    +673      '.xlf': 'application/x-xliff', 
    +674      '.xliff': 'application/x-xliff', 
    +675      '.xll': 'application/vnd.ms-excel', 
    +676      '.xlm': 'application/vnd.ms-excel', 
    +677      '.xls': 'application/vnd.ms-excel', 
    +678      '.xlsm': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
    +679      '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
    +680      '.xlt': 'application/vnd.ms-excel', 
    +681      '.xlw': 'application/vnd.ms-excel', 
    +682      '.xm': 'audio/x-xm', 
    +683      '.xmf': 'audio/x-xmf', 
    +684      '.xmi': 'text/x-xmi', 
    +685      '.xml': 'application/xml', 
    +686      '.xpm': 'image/x-xpixmap', 
    +687      '.xps': 'application/vnd.ms-xpsdocument', 
    +688      '.xsl': 'application/xml', 
    +689      '.xslfo': 'text/x-xslfo', 
    +690      '.xslt': 'application/xml', 
    +691      '.xspf': 'application/xspf+xml', 
    +692      '.xul': 'application/vnd.mozilla.xul+xml', 
    +693      '.xwd': 'image/x-xwindowdump', 
    +694      '.xyz': 'chemical/x-pdb', 
    +695      '.xz': 'application/x-xz', 
    +696      '.w2p': 'application/w2p', 
    +697      '.z': 'application/x-compress', 
    +698      '.zabw': 'application/x-abiword', 
    +699      '.zip': 'application/zip', 
    +700      '.zoo': 'application/x-zoo', 
    +701      } 
    +702   
    +703   
    +
    704 -def contenttype(filename, default='text/plain'): +
    705 """ +706 Returns the Content-Type string matching extension of the given filename. +707 """ +708 +709 i = filename.rfind('.') +710 if i>=0: +711 default = CONTENT_TYPE.get(filename[i:].lower(),default) +712 j = filename.rfind('.', 0, i) +713 if j>=0: +714 default = CONTENT_TYPE.get(filename[j:].lower(),default) +715 if default.startswith('text/'): +716 default += '; charset=utf-8' +717 return default +
    718 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-module.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-module.html @@ -0,0 +1,667 @@ + + + + + web2py.gluon.contrib.pymysql + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Package pymysql

    source code

    +

    PyMySQL: A pure-Python drop-in replacement for MySQLdb.

    +

    Copyright (c) 2010 PyMySQL contributors

    +

    Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, and + to permit persons to whom the Software is furnished to do so, subject to + the following conditions:

    +

    The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software.

    + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE.

    + +
    +

    Version: + 0.4.None +

    +
    + + + + + + +
    + + + + + +
    Submodules[hide private]
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + DBAPISet +
    +   + + DataError
    + Exception raised for errors that are due to problems with the + processed data like division by zero, numeric value out of range, + etc. +
    +   + + DatabaseError
    + Exception raised for errors that are related to the + database. +
    +   + + Date
    + date(year, month, day) --> date object +
    +   + + Error
    + Exception that is the base class of all other error exceptions + (not Warning). +
    +   + + IntegrityError
    + Exception raised when the relational integrity of the database + is affected, e.g. +
    +   + + InterfaceError
    + Exception raised for errors that are related to the database + interface rather than the database itself. +
    +   + + InternalError
    + Exception raised when the database encounters an internal error, + e.g. +
    +   + + NotSupportedError
    + Exception raised in case a method or database API was used which + is not supported by the database, e.g. +
    +   + + OperationalError
    + Exception raised for errors that are related to the database's + operation and not necessarily under the control of the programmer, + e.g. +
    +   + + ProgrammingError
    + Exception raised for programming errors, e.g. +
    +   + + Time
    + time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> + a time object +
    +   + + Timestamp
    + datetime(year, month, day[, hour[, minute[, second[, + microsecond[,tzinfo]]]]]) +
    +   + + Warning
    + Exception raised for important warnings like data truncations + while inserting, etc. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    Binary(x)
    + Return x as a binary type.
    + source code + +
    + +
    +   + + + + + + +
    Connect(*args, + **kwargs)
    + Connect to the database; see connections.Connection.__init__() for + more information.
    + source code + +
    + +
    +   + + + + + + +
    Connection(*args, + **kwargs)
    + Connect to the database; see connections.Connection.__init__() for + more information.
    + source code + +
    + +
    +   + + + + + + +
    DateFromTicks(ticks) + + +
    + +
    +   + + + + + + +
    TimeFromTicks(ticks) + + +
    + +
    +   + + + + + + +
    TimestampFromTicks(ticks) + + +
    + +
    +   + + + + + + +
    connect(*args, + **kwargs)
    + Connect to the database; see connections.Connection.__init__() for + more information.
    + source code + +
    + +
    +   + + + + + + +
    escape_dict(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_sequence(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_string(value) + source code + +
    + +
    +   + + + + + + +
    get_client_info() + source code + +
    + +
    +   + + + + + + +
    install_as_MySQLdb()
    + After this function is called, any application that imports + MySQLdb or _mysql will unwittingly actually use
    + source code + +
    + +
    +   + + + + + + +
    thread_safe() + source code + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + BINARY = DBAPISet([249, 250, 251, 252]) +
    +   + + DATE = DBAPISet([10, 14]) +
    +   + + DATETIME = DBAPISet([12, 7]) +
    +   + + NULL = 'NULL' +
    +   + + NUMBER = DBAPISet([0, 1, 3, 4, 5, 8, 9, 13]) +
    +   + + ROWID = DBAPISet([]) +
    +   + + STRING = DBAPISet([253, 254, 247]) +
    +   + + TIME = DBAPISet([11]) +
    +   + + TIMESTAMP = DBAPISet([12, 7]) +
    +   + + VERSION = (0, 4, None) +
    +   + + apilevel = '2.0' +
    +   + + paramstyle = 'format' +
    +   + + threadsafety = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + version_info = (1, 2, 2, 'final', 0) +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql-pysrc.html @@ -0,0 +1,302 @@ + + + + + web2py.gluon.contrib.pymysql + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Package web2py.gluon.contrib.pymysql

    +
    +  1  ''' 
    +  2  PyMySQL: A pure-Python drop-in replacement for MySQLdb. 
    +  3   
    +  4  Copyright (c) 2010 PyMySQL contributors 
    +  5   
    +  6  Permission is hereby granted, free of charge, to any person obtaining a copy 
    +  7  of this software and associated documentation files (the "Software"), to deal 
    +  8  in the Software without restriction, including without limitation the rights 
    +  9  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
    + 10  copies of the Software, and to permit persons to whom the Software is 
    + 11  furnished to do so, subject to the following conditions: 
    + 12   
    + 13  The above copyright notice and this permission notice shall be included in 
    + 14  all copies or substantial portions of the Software. 
    + 15   
    + 16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
    + 17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
    + 18  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
    + 19  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
    + 20  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
    + 21  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
    + 22  THE SOFTWARE. 
    + 23   
    + 24  ''' 
    + 25   
    + 26  VERSION = (0, 4, None) 
    + 27   
    + 28  from constants import FIELD_TYPE 
    + 29  from converters import escape_dict, escape_sequence, escape_string 
    + 30  from err import Warning, Error, InterfaceError, DataError, \ 
    + 31       DatabaseError, OperationalError, IntegrityError, InternalError, \ 
    + 32       NotSupportedError, ProgrammingError 
    + 33  from times import Date, Time, Timestamp, \ 
    + 34      DateFromTicks, TimeFromTicks, TimestampFromTicks 
    + 35   
    + 36  import sys 
    + 37   
    + 38  try: 
    + 39      frozenset 
    + 40  except NameError: 
    + 41      from sets import ImmutableSet as frozenset 
    + 42      try: 
    + 43          from sets import BaseSet as set 
    + 44      except ImportError: 
    + 45          from sets import Set as set 
    + 46   
    + 47  threadsafety = 1 
    + 48  apilevel = "2.0" 
    + 49  paramstyle = "format" 
    + 50   
    +
    51 -class DBAPISet(frozenset): +
    52 + 53 +
    54 - def __ne__(self, other): +
    55 if isinstance(other, set): + 56 return super(DBAPISet, self).__ne__(self, other) + 57 else: + 58 return other not in self +
    59 +
    60 - def __eq__(self, other): +
    61 if isinstance(other, frozenset): + 62 return frozenset.__eq__(self, other) + 63 else: + 64 return other in self +
    65 +
    66 - def __hash__(self): +
    67 return frozenset.__hash__(self) +
    68 + 69 + 70 STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING, + 71 FIELD_TYPE.VAR_STRING]) + 72 BINARY = DBAPISet([FIELD_TYPE.BLOB, FIELD_TYPE.LONG_BLOB, + 73 FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.TINY_BLOB]) + 74 NUMBER = DBAPISet([FIELD_TYPE.DECIMAL, FIELD_TYPE.DOUBLE, FIELD_TYPE.FLOAT, + 75 FIELD_TYPE.INT24, FIELD_TYPE.LONG, FIELD_TYPE.LONGLONG, + 76 FIELD_TYPE.TINY, FIELD_TYPE.YEAR]) + 77 DATE = DBAPISet([FIELD_TYPE.DATE, FIELD_TYPE.NEWDATE]) + 78 TIME = DBAPISet([FIELD_TYPE.TIME]) + 79 TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME]) + 80 DATETIME = TIMESTAMP + 81 ROWID = DBAPISet() + 82 +
    83 -def Binary(x): +
    84 """Return x as a binary type.""" + 85 return str(x) +
    86 +
    87 -def Connect(*args, **kwargs): +
    88 """ + 89 Connect to the database; see connections.Connection.__init__() for + 90 more information. + 91 """ + 92 from connections import Connection + 93 return Connection(*args, **kwargs) +
    94 +
    95 -def get_client_info(): # for MySQLdb compatibility +
    96 return '%s.%s.%s' % VERSION + 97 + 98 connect = Connection = Connect + 99 +100 # we include a doctored version_info here for MySQLdb compatibility +101 version_info = (1,2,2,"final",0) +102 +103 NULL = "NULL" +104 +105 __version__ = get_client_info() +106 +
    107 -def thread_safe(): +
    108 return True # match MySQLdb.thread_safe() +
    109 +
    110 -def install_as_MySQLdb(): +
    111 """ +112 After this function is called, any application that imports MySQLdb or +113 _mysql will unwittingly actually use +114 """ +115 sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"] +
    116 +117 __all__ = [ +118 'BINARY', 'Binary', 'Connect', 'Connection', 'DATE', 'Date', +119 'Time', 'Timestamp', 'DateFromTicks', 'TimeFromTicks', 'TimestampFromTicks', +120 'DataError', 'DatabaseError', 'Error', 'FIELD_TYPE', 'IntegrityError', +121 'InterfaceError', 'InternalError', 'MySQLError', 'NULL', 'NUMBER', +122 'NotSupportedError', 'DBAPISet', 'OperationalError', 'ProgrammingError', +123 'ROWID', 'STRING', 'TIME', 'TIMESTAMP', 'Warning', 'apilevel', 'connect', +124 'connections', 'constants', 'converters', 'cursors', 'debug', 'escape', +125 'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info', +126 'paramstyle', 'string_literal', 'threadsafety', 'version_info', +127 +128 "install_as_MySQLdb", +129 +130 "NULL","__version__", +131 ] +132 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.DBAPISet-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.DBAPISet-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.DBAPISet-class.html @@ -0,0 +1,354 @@ + + + + + web2py.gluon.contrib.pymysql.DBAPISet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Class DBAPISet + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class DBAPISet

    source code

    +
    +object --+    
    +         |    
    + frozenset --+
    +             |
    +            DBAPISet
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __eq__(self, + other)
    + x==y
    + source code + +
    + +
    +   + + + + + + +
    __hash__(self)
    + hash(x)
    + source code + +
    + +
    +   + + + + + + +
    __ne__(self, + other)
    + x!=y
    + source code + +
    + +
    +

    Inherited from frozenset: + __and__, + __cmp__, + __contains__, + __ge__, + __getattribute__, + __gt__, + __iter__, + __le__, + __len__, + __lt__, + __new__, + __or__, + __rand__, + __reduce__, + __repr__, + __ror__, + __rsub__, + __rxor__, + __sub__, + __xor__, + copy, + difference, + intersection, + issubset, + issuperset, + symmetric_difference, + union +

    +

    Inherited from object: + __delattr__, + __init__, + __reduce_ex__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __eq__(self, + other) +
    (Equality operator) +

    +
    source code  +
    + + x==y +
    +
    Overrides: + frozenset.__eq__ +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    __hash__(self) +
    (Hashing function) +

    +
    source code  +
    + + hash(x) +
    +
    Overrides: + frozenset.__hash__ +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    __ne__(self, + other) +

    +
    source code  +
    + + x!=y +
    +
    Overrides: + frozenset.__ne__ +
    (inherited documentation)
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-module.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-module.html @@ -0,0 +1,141 @@ + + + + + web2py.gluon.contrib.pymysql.constants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Package constants + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Package constants

    source code

    + + + + + + + +
    + + + + + +
    Submodules[hide private]
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants-pysrc.html @@ -0,0 +1,125 @@ + + + + + web2py.gluon.contrib.pymysql.constants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Package constants + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Package web2py.gluon.contrib.pymysql.constants

    +
    +1   
    +2   
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-module.html @@ -0,0 +1,343 @@ + + + + + web2py.gluon.contrib.pymysql.constants.FIELD_TYPE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Package constants :: + Module FIELD_TYPE + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module FIELD_TYPE

    source code

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + BIT = 16 +
    +   + + BLOB = 252 +
    +   + + CHAR = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + DATE = 10 +
    +   + + DATETIME = 12 +
    +   + + DECIMAL = 0 +
    +   + + DOUBLE = 5 +
    +   + + ENUM = 247 +
    +   + + FLOAT = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + GEOMETRY = 255 +
    +   + + INT24 = 9 +
    +   + + INTERVAL = 247 +
    +   + + LONG = 3 +
    +   + + LONGLONG = 8 +
    +   + + LONG_BLOB = 251 +
    +   + + MEDIUM_BLOB = 250 +
    +   + + NEWDATE = 14 +
    +   + + NEWDECIMAL = 246 +
    +   + + NULL = 6 +
    +   + + SET = 248 +
    +   + + SHORT = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + STRING = 254 +
    +   + + TIME = 11 +
    +   + + TIMESTAMP = 7 +
    +   + + TINY = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + TINY_BLOB = 249 +
    +   + + VARCHAR = 15 +
    +   + + VAR_STRING = 253 +
    +   + + YEAR = 13 +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.constants.FIELD_TYPE-pysrc.html @@ -0,0 +1,165 @@ + + + + + web2py.gluon.contrib.pymysql.constants.FIELD_TYPE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Package constants :: + Module FIELD_TYPE + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.contrib.pymysql.constants.FIELD_TYPE

    +
    + 1   
    + 2   
    + 3  DECIMAL = 0 
    + 4  TINY = 1 
    + 5  SHORT = 2 
    + 6  LONG = 3 
    + 7  FLOAT = 4 
    + 8  DOUBLE = 5 
    + 9  NULL = 6 
    +10  TIMESTAMP = 7 
    +11  LONGLONG = 8 
    +12  INT24 = 9 
    +13  DATE = 10 
    +14  TIME = 11 
    +15  DATETIME = 12 
    +16  YEAR = 13 
    +17  NEWDATE = 14 
    +18  VARCHAR = 15 
    +19  BIT = 16 
    +20  NEWDECIMAL = 246 
    +21  ENUM = 247 
    +22  SET = 248 
    +23  TINY_BLOB = 249 
    +24  MEDIUM_BLOB = 250 
    +25  LONG_BLOB = 251 
    +26  BLOB = 252 
    +27  VAR_STRING = 253 
    +28  STRING = 254 
    +29  GEOMETRY = 255 
    +30   
    +31  CHAR = TINY 
    +32  INTERVAL = ENUM 
    +33   
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-module.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-module.html @@ -0,0 +1,1039 @@ + + + + + web2py.gluon.contrib.pymysql.converters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module converters + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module converters

    source code

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    convert_bit(connection, + field, + b) + source code + +
    + +
    +   + + + + + + +
    convert_characters(connection, + field, + data) + source code + +
    + +
    +   + + + + + + +
    convert_date(connection, + field, + obj)
    + Returns a DATE column as a date object:
    + source code + +
    + +
    +   + + + + + + +
    convert_datetime(connection, + field, + obj)
    + Returns a DATETIME or TIMESTAMP column value as a datetime + object:
    + source code + +
    + +
    +   + + + + + + +
    convert_decimal(connection, + field, + data) + source code + +
    + +
    +   + + + + + + +
    convert_float(connection, + field, + data) + source code + +
    + +
    +   + + + + + + +
    convert_int(connection, + field, + data) + source code + +
    + +
    +   + + + + + + +
    convert_long(connection, + field, + data) + source code + +
    + +
    +   + + + + + + +
    convert_mysql_timestamp(connection, + field, + timestamp)
    + Convert a MySQL TIMESTAMP to a Timestamp object.
    + source code + +
    + +
    +   + + + + + + +
    convert_set(s) + source code + +
    + +
    +   + + + + + + +
    convert_time(connection, + field, + obj)
    + Returns a TIME column as a time object:
    + source code + +
    + +
    +   + + + + + + +
    convert_timedelta(connection, + field, + obj)
    + Returns a TIME column as a timedelta object:
    + source code + +
    + +
    +   + + + + + + +
    escape_None(value) + source code + +
    + +
    +   + + + + + + +
    escape_bool(value) + source code + +
    + +
    +   + + + + + + +
    escape_date(obj) + source code + +
    + +
    +   + + + + + + +
    escape_datetime(obj) + source code + +
    + +
    +   + + + + + + +
    escape_decimal(obj) + source code + +
    + +
    +   + + + + + + +
    escape_dict(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_float(value) + source code + +
    + +
    +   + + + + + + +
    escape_int(value) + source code + +
    + +
    +   + + + + + + +
    escape_item(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_long(value) + source code + +
    + +
    +   + + + + + + +
    escape_object(value) + source code + +
    + +
    +   + + + + + + +
    escape_sequence(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_set(val, + charset) + source code + +
    + +
    +   + + + + + + +
    escape_string(value) + source code + +
    + +
    +   + + + + + + +
    escape_struct_time(obj) + source code + +
    + +
    +   + + + + + + +
    escape_time(obj) + source code + +
    + +
    +   + + + + + + +
    escape_timedelta(obj) + source code + +
    + +
    +   + + + + + + +
    escape_unicode(value) + source code + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + ESCAPE_MAP = {'\x00': '\\0', '\n': '\\n', '\r': '\\r', '\x1a':... +
    +   + + ESCAPE_REGEX = re.compile(r'[\x00\n\r\x1a\'"\\]') +
    +   + + conversions = {0: <function convert_decimal at 0xd3ccf8>, 1: <... +
    +   + + decoders = {0: <function convert_decimal at 0xd3ccf8>, 1: <fun... +
    +   + + encoders = {<type 'bool'>: <function escape_bool at 0xd3c2a8>,... +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    convert_date(connection, + field, + obj) +

    +
    source code  +
    + + Returns a DATE column as a date object: +
    +>>> date_or_None('2007-02-26')
    +datetime.date(2007, 2, 26)
    + Illegal values are returned as None: +
    +>>> date_or_None('2007-02-31') is None
    +True
    +>>> date_or_None('0000-00-00') is None
    +True
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    convert_datetime(connection, + field, + obj) +

    +
    source code  +
    + + Returns a DATETIME or TIMESTAMP column value as a datetime object: +
    +>>> datetime_or_None('2007-02-25 23:06:20')
    +datetime.datetime(2007, 2, 25, 23, 6, 20)
    +>>> datetime_or_None('2007-02-25T23:06:20')
    +datetime.datetime(2007, 2, 25, 23, 6, 20)
    + Illegal values are returned as None: +
    +>>> datetime_or_None('2007-02-31T23:06:20') is None
    +True
    +>>> datetime_or_None('0000-00-00 00:00:00') is None
    +True
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    convert_mysql_timestamp(connection, + field, + timestamp) +

    +
    source code  +
    + +

    Convert a MySQL TIMESTAMP to a Timestamp object.

    + MySQL >= 4.1 returns TIMESTAMP in the same format as DATETIME: +
    +>>> mysql_timestamp_converter('2007-02-25 22:32:17')
    +datetime.datetime(2007, 2, 25, 22, 32, 17)
    + MySQL < 4.1 uses a big string of numbers: +
    +>>> mysql_timestamp_converter('20070225223217')
    +datetime.datetime(2007, 2, 25, 22, 32, 17)
    + Illegal values are returned as None: +
    +>>> mysql_timestamp_converter('2007-02-31 22:32:17') is None
    +True
    +>>> mysql_timestamp_converter('00000000000000') is None
    +True
    +
    +
    +
    +
    + +
    + +
    + + +
    +

    convert_time(connection, + field, + obj) +

    +
    source code  +
    + + Returns a TIME column as a time object: +
    +>>> time_or_None('15:06:17')
    +datetime.time(15, 6, 17)
    + Illegal values are returned as None: +
    +>>> time_or_None('-25:06:17') is None
    +True
    +>>> time_or_None('random crap') is None
    +True
    +

    Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can + accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed + correctly by this function.

    + Also note that MySQL's TIME column corresponds more closely to + Python's timedelta and not time. However if you want TIME columns to be + treated as time-of-day and not a time offset, then you can use set this + function as the converter for FIELD_TYPE.TIME. +
    +
    +
    +
    + +
    + +
    + + +
    +

    convert_timedelta(connection, + field, + obj) +

    +
    source code  +
    + + Returns a TIME column as a timedelta object: +
    +>>> timedelta_or_None('25:06:17')
    +datetime.timedelta(1, 3977)
    +>>> timedelta_or_None('-25:06:17')
    +datetime.timedelta(-2, 83177)
    + Illegal values are returned as None: +
    +>>> timedelta_or_None('random crap') is None
    +True
    + Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can + accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed + correctly by this function. +
    +
    +
    +
    +
    + + + + + + +
    + + + + + +
    Variables Details[hide private]
    +
    + +
    + +
    +

    ESCAPE_MAP

    + +
    +
    +
    +
    Value:
    +
    +{'\x00': '\\0',
    + '''
    +''': '\\n',
    + '\r': '\\r',
    + '\x1a': '\\Z',
    + '"': '\\"',
    + '\'': '\\\'',
    + '\\': '\\\\'}
    +
    +
    +
    +
    +
    + +
    + +
    +

    conversions

    + +
    +
    +
    +
    Value:
    +
    +{0: <function convert_decimal at 0xd3ccf8>,
    + 1: <function convert_int at 0xd3cb90>,
    + 2: <function convert_int at 0xd3cb90>,
    + 3: <function convert_long at 0xd3cc08>,
    + 4: <function convert_float at 0xd3cc80>,
    + 5: <function convert_float at 0xd3cc80>,
    + 7: <function convert_mysql_timestamp at 0xd3c9b0>,
    + 8: <function convert_long at 0xd3cc08>,
    +...
    +
    +
    +
    +
    +
    + +
    + +
    +

    decoders

    + +
    +
    +
    +
    Value:
    +
    +{0: <function convert_decimal at 0xd3ccf8>,
    + 1: <function convert_int at 0xd3cb90>,
    + 2: <function convert_int at 0xd3cb90>,
    + 3: <function convert_long at 0xd3cc08>,
    + 4: <function convert_float at 0xd3cc80>,
    + 5: <function convert_float at 0xd3cc80>,
    + 7: <function convert_mysql_timestamp at 0xd3c9b0>,
    + 8: <function convert_long at 0xd3cc08>,
    +...
    +
    +
    +
    +
    +
    + +
    + +
    +

    encoders

    + +
    +
    +
    +
    Value:
    +
    +{<type 'bool'>: <function escape_bool at 0xd3c2a8>,
    + <type 'float'>: <function escape_float at 0xd3c398>,
    + <type 'int'>: <function escape_object at 0xd3c320>,
    + <type 'list'>: <function escape_sequence at 0xd34c80>,
    + <type 'long'>: <function escape_object at 0xd3c320>,
    + <type 'dict'>: <function escape_dict at 0xd34a28>,
    + <type 'NoneType'>: <function escape_None at 0xd3c500>,
    + <type 'set'>: <function escape_sequence at 0xd34c80>,
    +...
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.converters-pysrc.html @@ -0,0 +1,481 @@ + + + + + web2py.gluon.contrib.pymysql.converters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module converters + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.contrib.pymysql.converters

    +
    +  1  import re 
    +  2  import datetime 
    +  3  import time 
    +  4   
    +  5  from constants import FIELD_TYPE, FLAG 
    +  6  from charset import charset_by_id 
    +  7   
    +  8  try: 
    +  9      set 
    + 10  except NameError: 
    + 11      try: 
    + 12          from sets import BaseSet as set 
    + 13      except ImportError: 
    + 14          from sets import Set as set 
    + 15   
    + 16  ESCAPE_REGEX = re.compile(r"[\0\n\r\032\'\"\\]") 
    + 17  ESCAPE_MAP = {'\0': '\\0', '\n': '\\n', '\r': '\\r', '\032': '\\Z', 
    + 18                '\'': '\\\'', '"': '\\"', '\\': '\\\\'} 
    + 19   
    +
    20 -def escape_item(val, charset): +
    21 if type(val) in [tuple, list, set]: + 22 return escape_sequence(val, charset) + 23 if type(val) is dict: + 24 return escape_dict(val, charset) + 25 if hasattr(val, "decode") and not isinstance(val, unicode): + 26 # deal with py3k bytes + 27 val = val.decode(charset) + 28 encoder = encoders[type(val)] + 29 val = encoder(val) + 30 if type(val) is str: + 31 return val + 32 val = val.encode(charset) + 33 return val +
    34 +
    35 -def escape_dict(val, charset): +
    36 n = {} + 37 for k, v in val.items(): + 38 quoted = escape_item(v, charset) + 39 n[k] = quoted + 40 return n +
    41 +
    42 -def escape_sequence(val, charset): +
    43 n = [] + 44 for item in val: + 45 quoted = escape_item(item, charset) + 46 n.append(quoted) + 47 return tuple(n) +
    48 +
    49 -def escape_set(val, charset): +
    50 val = map(lambda x: escape_item(x, charset), val) + 51 return ','.join(val) +
    52 +
    53 -def escape_bool(value): +
    54 return str(int(value)) +
    55 +
    56 -def escape_object(value): +
    57 return str(value) +
    58 + 59 escape_int = escape_long = escape_object + 60 +
    61 -def escape_float(value): +
    62 return ('%.15g' % value) +
    63 +
    64 -def escape_string(value): +
    65 return ("'%s'" % ESCAPE_REGEX.sub( + 66 lambda match: ESCAPE_MAP.get(match.group(0)), value)) +
    67 +
    68 -def escape_unicode(value): +
    69 return escape_string(value) +
    70 +
    71 -def escape_None(value): +
    72 return 'NULL' +
    73 +
    74 -def escape_timedelta(obj): +
    75 seconds = int(obj.seconds) % 60 + 76 minutes = int(obj.seconds // 60) % 60 + 77 hours = int(obj.seconds // 3600) % 24 + int(obj.days) * 24 + 78 return escape_string('%02d:%02d:%02d' % (hours, minutes, seconds)) +
    79 +
    80 -def escape_time(obj): +
    81 s = "%02d:%02d:%02d" % (int(obj.hour), int(obj.minute), + 82 int(obj.second)) + 83 if obj.microsecond: + 84 s += ".%f" % obj.microsecond + 85 + 86 return escape_string(s) +
    87 +
    88 -def escape_datetime(obj): +
    89 return escape_string(obj.strftime("%Y-%m-%d %H:%M:%S")) +
    90 +
    91 -def escape_date(obj): +
    92 return escape_string(obj.strftime("%Y-%m-%d")) +
    93 +
    94 -def escape_struct_time(obj): +
    95 return escape_datetime(datetime.datetime(*obj[:6])) +
    96 +
    97 -def convert_datetime(connection, field, obj): +
    98 """Returns a DATETIME or TIMESTAMP column value as a datetime object: + 99 +100 >>> datetime_or_None('2007-02-25 23:06:20') +101 datetime.datetime(2007, 2, 25, 23, 6, 20) +102 >>> datetime_or_None('2007-02-25T23:06:20') +103 datetime.datetime(2007, 2, 25, 23, 6, 20) +104 +105 Illegal values are returned as None: +106 +107 >>> datetime_or_None('2007-02-31T23:06:20') is None +108 True +109 >>> datetime_or_None('0000-00-00 00:00:00') is None +110 True +111 +112 """ +113 if not isinstance(obj, unicode): +114 obj = obj.decode(connection.charset) +115 if ' ' in obj: +116 sep = ' ' +117 elif 'T' in obj: +118 sep = 'T' +119 else: +120 return convert_date(connection, field, obj) +121 +122 try: +123 ymd, hms = obj.split(sep, 1) +124 return datetime.datetime(*[ int(x) for x in ymd.split('-')+hms.split(':') ]) +125 except ValueError: +126 return convert_date(connection, field, obj) +
    127 +
    128 -def convert_timedelta(connection, field, obj): +
    129 """Returns a TIME column as a timedelta object: +130 +131 >>> timedelta_or_None('25:06:17') +132 datetime.timedelta(1, 3977) +133 >>> timedelta_or_None('-25:06:17') +134 datetime.timedelta(-2, 83177) +135 +136 Illegal values are returned as None: +137 +138 >>> timedelta_or_None('random crap') is None +139 True +140 +141 Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but +142 can accept values as (+|-)DD HH:MM:SS. The latter format will not +143 be parsed correctly by this function. +144 """ +145 from math import modf +146 try: +147 if not isinstance(obj, unicode): +148 obj = obj.decode(connection.charset) +149 hours, minutes, seconds = tuple([int(x) for x in obj.split(':')]) +150 tdelta = datetime.timedelta( +151 hours = int(hours), +152 minutes = int(minutes), +153 seconds = int(seconds), +154 microseconds = int(modf(float(seconds))[0]*1000000), +155 ) +156 return tdelta +157 except ValueError: +158 return None +
    159 +
    160 -def convert_time(connection, field, obj): +
    161 """Returns a TIME column as a time object: +162 +163 >>> time_or_None('15:06:17') +164 datetime.time(15, 6, 17) +165 +166 Illegal values are returned as None: +167 +168 >>> time_or_None('-25:06:17') is None +169 True +170 >>> time_or_None('random crap') is None +171 True +172 +173 Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but +174 can accept values as (+|-)DD HH:MM:SS. The latter format will not +175 be parsed correctly by this function. +176 +177 Also note that MySQL's TIME column corresponds more closely to +178 Python's timedelta and not time. However if you want TIME columns +179 to be treated as time-of-day and not a time offset, then you can +180 use set this function as the converter for FIELD_TYPE.TIME. +181 """ +182 from math import modf +183 try: +184 hour, minute, second = obj.split(':') +185 return datetime.time(hour=int(hour), minute=int(minute), +186 second=int(second), +187 microsecond=int(modf(float(second))[0]*1000000)) +188 except ValueError: +189 return None +
    190 +
    191 -def convert_date(connection, field, obj): +
    192 """Returns a DATE column as a date object: +193 +194 >>> date_or_None('2007-02-26') +195 datetime.date(2007, 2, 26) +196 +197 Illegal values are returned as None: +198 +199 >>> date_or_None('2007-02-31') is None +200 True +201 >>> date_or_None('0000-00-00') is None +202 True +203 +204 """ +205 try: +206 if not isinstance(obj, unicode): +207 obj = obj.decode(connection.charset) +208 return datetime.date(*[ int(x) for x in obj.split('-', 2) ]) +209 except ValueError: +210 return None +
    211 +
    212 -def convert_mysql_timestamp(connection, field, timestamp): +
    213 """Convert a MySQL TIMESTAMP to a Timestamp object. +214 +215 MySQL >= 4.1 returns TIMESTAMP in the same format as DATETIME: +216 +217 >>> mysql_timestamp_converter('2007-02-25 22:32:17') +218 datetime.datetime(2007, 2, 25, 22, 32, 17) +219 +220 MySQL < 4.1 uses a big string of numbers: +221 +222 >>> mysql_timestamp_converter('20070225223217') +223 datetime.datetime(2007, 2, 25, 22, 32, 17) +224 +225 Illegal values are returned as None: +226 +227 >>> mysql_timestamp_converter('2007-02-31 22:32:17') is None +228 True +229 >>> mysql_timestamp_converter('00000000000000') is None +230 True +231 +232 """ +233 if not isinstance(timestamp, unicode): +234 timestamp = timestamp.decode(connection.charset) +235 +236 if timestamp[4] == '-': +237 return convert_datetime(connection, field, timestamp) +238 timestamp += "0"*(14-len(timestamp)) # padding +239 year, month, day, hour, minute, second = \ +240 int(timestamp[:4]), int(timestamp[4:6]), int(timestamp[6:8]), \ +241 int(timestamp[8:10]), int(timestamp[10:12]), int(timestamp[12:14]) +242 try: +243 return datetime.datetime(year, month, day, hour, minute, second) +244 except ValueError: +245 return None +
    246 +
    247 -def convert_set(s): +
    248 return set(s.split(",")) +
    249 +
    250 -def convert_bit(connection, field, b): +
    251 #b = "\x00" * (8 - len(b)) + b # pad w/ zeroes +252 #return struct.unpack(">Q", b)[0] +253 # +254 # the snippet above is right, but MySQLdb doesn't process bits, +255 # so we shouldn't either +256 return b +
    257 +
    258 -def convert_characters(connection, field, data): +
    259 field_charset = charset_by_id(field.charsetnr).name +260 if field.flags & FLAG.SET: +261 return convert_set(data.decode(field_charset)) +262 if field.flags & FLAG.BINARY: +263 return data +264 +265 if connection.use_unicode: +266 data = data.decode(field_charset) +267 elif connection.charset != field_charset: +268 data = data.decode(field_charset) +269 data = data.encode(connection.charset) +270 else: +271 data = data.decode(connection.charset) +272 return data +
    273 +
    274 -def convert_int(connection, field, data): +
    275 return int(data) +
    276 +
    277 -def convert_long(connection, field, data): +
    278 return long(data) +
    279 +
    280 -def convert_float(connection, field, data): +
    281 return float(data) +
    282 +283 encoders = { +284 bool: escape_bool, +285 int: escape_int, +286 long: escape_long, +287 float: escape_float, +288 str: escape_string, +289 unicode: escape_unicode, +290 tuple: escape_sequence, +291 list:escape_sequence, +292 set:escape_sequence, +293 dict:escape_dict, +294 type(None):escape_None, +295 datetime.date: escape_date, +296 datetime.datetime : escape_datetime, +297 datetime.timedelta : escape_timedelta, +298 datetime.time : escape_time, +299 time.struct_time : escape_struct_time, +300 } +301 +302 decoders = { +303 FIELD_TYPE.BIT: convert_bit, +304 FIELD_TYPE.TINY: convert_int, +305 FIELD_TYPE.SHORT: convert_int, +306 FIELD_TYPE.LONG: convert_long, +307 FIELD_TYPE.FLOAT: convert_float, +308 FIELD_TYPE.DOUBLE: convert_float, +309 FIELD_TYPE.DECIMAL: convert_float, +310 FIELD_TYPE.NEWDECIMAL: convert_float, +311 FIELD_TYPE.LONGLONG: convert_long, +312 FIELD_TYPE.INT24: convert_int, +313 FIELD_TYPE.YEAR: convert_int, +314 FIELD_TYPE.TIMESTAMP: convert_mysql_timestamp, +315 FIELD_TYPE.DATETIME: convert_datetime, +316 FIELD_TYPE.TIME: convert_timedelta, +317 FIELD_TYPE.DATE: convert_date, +318 FIELD_TYPE.SET: convert_set, +319 FIELD_TYPE.BLOB: convert_characters, +320 FIELD_TYPE.TINY_BLOB: convert_characters, +321 FIELD_TYPE.MEDIUM_BLOB: convert_characters, +322 FIELD_TYPE.LONG_BLOB: convert_characters, +323 FIELD_TYPE.STRING: convert_characters, +324 FIELD_TYPE.VAR_STRING: convert_characters, +325 FIELD_TYPE.VARCHAR: convert_characters, +326 #FIELD_TYPE.BLOB: str, +327 #FIELD_TYPE.STRING: str, +328 #FIELD_TYPE.VAR_STRING: str, +329 #FIELD_TYPE.VARCHAR: str +330 } +331 conversions = decoders # for MySQLdb compatibility +332 +333 try: +334 # python version > 2.3 +335 from decimal import Decimal +
    336 - def convert_decimal(connection, field, data): +
    337 return Decimal(data) +
    338 decoders[FIELD_TYPE.DECIMAL] = convert_decimal +339 decoders[FIELD_TYPE.NEWDECIMAL] = convert_decimal +340 +
    341 - def escape_decimal(obj): +
    342 return unicode(obj) +
    343 encoders[Decimal] = escape_decimal +344 +345 except ImportError: +346 pass +347 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DataError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DataError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DataError-class.html @@ -0,0 +1,209 @@ + + + + + web2py.gluon.contrib.pymysql.err.DataError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class DataError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class DataError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          DataError
    +
    + +
    +Exception raised for errors that are due to problems with the + processed data like division by zero, numeric value out of range, + etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DatabaseError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DatabaseError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.DatabaseError-class.html @@ -0,0 +1,215 @@ + + + + + web2py.gluon.contrib.pymysql.err.DatabaseError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class DatabaseError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class DatabaseError



    +
    +              object --+                
    +                       |                
    +exceptions.BaseException --+            
    +                           |            
    +        exceptions.Exception --+        
    +                               |        
    +                      MySQLError --+    
    +                                   |    
    +                               Error --+
    +                                       |
    +                                      DatabaseError
    +
    + +
    Known Subclasses:
    +
    + DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError +
    + +
    +Exception raised for errors that are related to the database.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Error-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Error-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Error-class.html @@ -0,0 +1,210 @@ + + + + + web2py.gluon.contrib.pymysql.err.Error + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class Error + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class Error



    +
    +              object --+            
    +                       |            
    +exceptions.BaseException --+        
    +                           |        
    +        exceptions.Exception --+    
    +                               |    
    +                      MySQLError --+
    +                                   |
    +                                  Error
    +
    + +
    Known Subclasses:
    +
    + DatabaseError, + InterfaceError +
    + +
    +Exception that is the base class of all other error exceptions (not + Warning).

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.IntegrityError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.IntegrityError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.IntegrityError-class.html @@ -0,0 +1,208 @@ + + + + + web2py.gluon.contrib.pymysql.err.IntegrityError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class IntegrityError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class IntegrityError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          IntegrityError
    +
    + +
    +Exception raised when the relational integrity of the database is + affected, e.g. a foreign key check fails, duplicate key, etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InterfaceError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InterfaceError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InterfaceError-class.html @@ -0,0 +1,206 @@ + + + + + web2py.gluon.contrib.pymysql.err.InterfaceError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class InterfaceError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class InterfaceError



    +
    +              object --+                
    +                       |                
    +exceptions.BaseException --+            
    +                           |            
    +        exceptions.Exception --+        
    +                               |        
    +                      MySQLError --+    
    +                                   |    
    +                               Error --+
    +                                       |
    +                                      InterfaceError
    +
    + +
    +Exception raised for errors that are related to the database interface + rather than the database itself.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InternalError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InternalError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.InternalError-class.html @@ -0,0 +1,208 @@ + + + + + web2py.gluon.contrib.pymysql.err.InternalError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class InternalError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class InternalError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          InternalError
    +
    + +
    +Exception raised when the database encounters an internal error, e.g. + the cursor is not valid anymore, the transaction is out of sync, etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.NotSupportedError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.NotSupportedError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.NotSupportedError-class.html @@ -0,0 +1,210 @@ + + + + + web2py.gluon.contrib.pymysql.err.NotSupportedError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class NotSupportedError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class NotSupportedError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          NotSupportedError
    +
    + +
    +Exception raised in case a method or database API was used which is + not supported by the database, e.g. requesting a .rollback() on a + connection that does not support transaction or has transactions turned + off.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.OperationalError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.OperationalError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.OperationalError-class.html @@ -0,0 +1,211 @@ + + + + + web2py.gluon.contrib.pymysql.err.OperationalError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class OperationalError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class OperationalError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          OperationalError
    +
    + +
    +Exception raised for errors that are related to the database's + operation and not necessarily under the control of the programmer, e.g. + an unexpected disconnect occurs, the data source name is not found, a + transaction could not be processed, a memory allocation error occurred + during processing, etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.ProgrammingError-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.ProgrammingError-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.ProgrammingError-class.html @@ -0,0 +1,209 @@ + + + + + web2py.gluon.contrib.pymysql.err.ProgrammingError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class ProgrammingError + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class ProgrammingError



    +
    +              object --+                    
    +                       |                    
    +exceptions.BaseException --+                
    +                           |                
    +        exceptions.Exception --+            
    +                               |            
    +                      MySQLError --+        
    +                                   |        
    +                               Error --+    
    +                                       |    
    +                           DatabaseError --+
    +                                           |
    +                                          ProgrammingError
    +
    + +
    +Exception raised for programming errors, e.g. table not found or + already exists, syntax error in the SQL statement, wrong number of + parameters specified, etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Exception: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Warning-class.html Index: applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Warning-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.contrib.pymysql.err.Warning-class.html @@ -0,0 +1,212 @@ + + + + + web2py.gluon.contrib.pymysql.err.Warning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Package contrib :: + Package pymysql :: + Module err :: + Class Warning + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class Warning



    +
    +              object --+            
    +                       |            
    +exceptions.BaseException --+        
    +                           |        
    +        exceptions.Exception --+    
    +                               |    
    +              exceptions.Warning --+
    +                                   |
    +              object --+           |
    +                       |           |
    +exceptions.BaseException --+       |
    +                           |       |
    +        exceptions.Exception --+   |
    +                               |   |
    +                      MySQLError --+
    +                                   |
    +                                  Warning
    +
    + +
    +Exception raised for important warnings like data truncations while + inserting, etc.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from exceptions.Warning: + __init__, + __new__ +

    +

    Inherited from exceptions.BaseException: + __delattr__, + __getattribute__, + __getitem__, + __getslice__, + __reduce__, + __repr__, + __setattr__, + __setstate__, + __str__ +

    +

    Inherited from object: + __hash__, + __reduce_ex__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from exceptions.BaseException: + args, + message +

    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import-module.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import-module.html @@ -0,0 +1,352 @@ + + + + + web2py.gluon.custom_import + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module custom_import

    source code

    + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + _BaseImporter
    + The base importer. +
    +   + + _DateTrackerImporter
    + An importer tracking the date of the module files and reloading + them when they have changed. +
    +   + + _Web2pyImporter
    + The standard web2py importer. +
    +   + + _Web2pyDateTrackerImporter
    + Like _Web2pyImporter but using a _DateTrackerImporter. +
    + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    custom_import_install(web2py_path) + source code + +
    + +
    +   + + + + + + +
    is_tracking_changes()
    + Returns: + True: neo_importer is tracking changes made to Python source + files.
    + source code + +
    + +
    +   + + + + + + +
    track_changes(track=True)
    + Tell neo_importer to start/stop tracking changes made to Python + modules.
    + source code + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + _web2py_importer = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + _web2py_date_tracker_importer = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + _web2py_path = 1
    + PyMySQL: A pure-Python drop-in replacement for MySQLdb. +
    +   + + _is_tracking_changes = True +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    is_tracking_changes() +

    +
    source code  +
    + + +
    +
    Returns:
    +
    True: neo_importer is tracking changes made to Python source + files. False: neo_import does not reload Python modules.
    +
    +
    +
    + +
    + +
    + + +
    +

    track_changes(track=True) +

    +
    source code  +
    + + Tell neo_importer to start/stop tracking changes made to Python + modules. +
    +
    Parameters:
    +
      +
    • track - True: Start tracking changes. False: Stop tracking + changes.
    • +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import-pysrc.html @@ -0,0 +1,942 @@ + + + + + web2py.gluon.custom_import + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.custom_import

    +
    +  1  #!/usr/bin/env python 
    +  2  # -*- coding: utf-8 -*- 
    +  3   
    +  4  import __builtin__ 
    +  5  import os 
    +  6  import re 
    +  7  import sys 
    +  8  import threading 
    +  9   
    + 10  # Install the new import function: 
    +
    11 -def custom_import_install(web2py_path): +
    12 global _web2py_importer + 13 global _web2py_path + 14 if _web2py_importer: + 15 return # Already installed + 16 _web2py_path = web2py_path + 17 _web2py_importer = _Web2pyImporter(web2py_path) + 18 __builtin__.__import__ = _web2py_importer +
    19 +
    21 """ + 22 @return: True: neo_importer is tracking changes made to Python source + 23 files. False: neo_import does not reload Python modules. + 24 """ + 25 + 26 global _is_tracking_changes + 27 return _is_tracking_changes +
    28 +
    29 -def track_changes(track=True): +
    30 """ + 31 Tell neo_importer to start/stop tracking changes made to Python modules. + 32 @param track: True: Start tracking changes. False: Stop tracking changes. + 33 """ + 34 + 35 global _is_tracking_changes + 36 global _web2py_importer + 37 global _web2py_date_tracker_importer + 38 assert track is True or track is False, "Boolean expected." + 39 if track == _is_tracking_changes: + 40 return + 41 if track: + 42 if not _web2py_date_tracker_importer: + 43 _web2py_date_tracker_importer = \ + 44 _Web2pyDateTrackerImporter(_web2py_path) + 45 __builtin__.__import__ = _web2py_date_tracker_importer + 46 else: + 47 __builtin__.__import__ = _web2py_importer + 48 _is_tracking_changes = track +
    49 + 50 _STANDARD_PYTHON_IMPORTER = __builtin__.__import__ # Keep standard importer + 51 _web2py_importer = None # The standard web2py importer + 52 _web2py_date_tracker_importer = None # The web2py importer with date tracking + 53 _web2py_path = None # Absolute path of the web2py directory + 54 + 55 _is_tracking_changes = False # The tracking mode + 56 +
    57 -class _BaseImporter(object): +
    58 """ + 59 The base importer. Dispatch the import the call to the standard Python + 60 importer. + 61 """ + 62 +
    63 - def begin(self): +
    64 """ + 65 Many imports can be made for a single import statement. This method + 66 help the management of this aspect. + 67 """ +
    68 +
    69 - def __call__(self, name, globals={}, locals={}, fromlist=[], level=-1): +
    70 """ + 71 The import method itself. + 72 """ + 73 return _STANDARD_PYTHON_IMPORTER(name, globals, locals, fromlist, + 74 level) +
    75 +
    76 - def end(self): +
    77 """ + 78 Needed for clean up. + 79 """ +
    80 + 81 +
    82 -class _DateTrackerImporter(_BaseImporter): +
    83 """ + 84 An importer tracking the date of the module files and reloading them when + 85 they have changed. + 86 """ + 87 + 88 _PACKAGE_PATH_SUFFIX = os.path.sep+"__init__.py" + 89 +
    90 - def __init__(self): +
    91 super(_DateTrackerImporter, self).__init__() + 92 self._import_dates = {} # Import dates of the files of the modules + 93 # Avoid reloading cause by file modifications of reload: + 94 self._tl = threading.local() + 95 self._tl._modules_loaded = None +
    96 +
    97 - def begin(self): +
    98 self._tl._modules_loaded = set() +
    99 +
    100 - def __call__(self, name, globals={}, locals={}, fromlist=[], level=-1): +
    101 """ +102 The import method itself. +103 """ +104 +105 call_begin_end = self._tl._modules_loaded == None +106 if call_begin_end: +107 self.begin() +108 +109 try: +110 self._tl.globals = globals +111 self._tl.locals = locals +112 self._tl.level = level +113 +114 # Check the date and reload if needed: +115 self._update_dates(name, fromlist) +116 +117 # Try to load the module and update the dates if it works: +118 result = super(_DateTrackerImporter, self) \ +119 .__call__(name, globals, locals, fromlist, level) +120 # Module maybe loaded for the 1st time so we need to set the date +121 self._update_dates(name, fromlist) +122 return result +123 except Exception, e: +124 raise e # Don't hide something that went wrong +125 finally: +126 if call_begin_end: +127 self.end() +
    128 +
    129 - def _update_dates(self, name, fromlist): +
    130 """ +131 Update all the dates associated to the statement import. A single +132 import statement may import many modules. +133 """ +134 +135 self._reload_check(name) +136 if fromlist: +137 for fromlist_name in fromlist: +138 self._reload_check("%s.%s" % (name, fromlist_name)) +
    139 +
    140 - def _reload_check(self, name): +
    141 """ +142 Update the date associated to the module and reload the module if +143 the file has changed. +144 """ +145 +146 module = sys.modules.get(name) +147 file = self._get_module_file(module) +148 if file: +149 date = self._import_dates.get(file) +150 new_date = None +151 reload_mod = False +152 mod_to_pack = False # Module turning into a package? (special case) +153 try: +154 new_date = os.path.getmtime(file) +155 except: +156 self._import_dates.pop(file, None) # Clean up +157 # Handle module changing in package and +158 #package changing in module: +159 if file.endswith(".py"): +160 # Get path without file ext: +161 file = os.path.splitext(file)[0] +162 reload_mod = os.path.isdir(file) \ +163 and os.path.isfile(file+self._PACKAGE_PATH_SUFFIX) +164 mod_to_pack = reload_mod +165 else: # Package turning into module? +166 file += ".py" +167 reload_mod = os.path.isfile(file) +168 if reload_mod: +169 new_date = os.path.getmtime(file) # Refresh file date +170 if reload_mod or not date or new_date > date: +171 self._import_dates[file] = new_date +172 if reload_mod or (date and new_date > date): +173 if module not in self._tl._modules_loaded: +174 if mod_to_pack: +175 # Module turning into a package: +176 mod_name = module.__name__ +177 del sys.modules[mod_name] # Delete the module +178 # Reload the module: +179 super(_DateTrackerImporter, self).__call__ \ +180 (mod_name, self._tl.globals, self._tl.locals, [], +181 self._tl.level) +182 else: +183 reload(module) +184 self._tl._modules_loaded.add(module) +
    185 +
    186 - def end(self): +
    187 self._tl._modules_loaded = None +
    188 +189 @classmethod +
    190 - def _get_module_file(cls, module): +
    191 """ +192 Get the absolute path file associated to the module or None. +193 """ +194 +195 file = getattr(module, "__file__", None) +196 if file: +197 # Make path absolute if not: +198 #file = os.path.join(cls.web2py_path, file) +199 +200 file = os.path.splitext(file)[0]+".py" # Change .pyc for .py +201 if file.endswith(cls._PACKAGE_PATH_SUFFIX): +202 file = os.path.dirname(file) # Track dir for packages +203 return file +
    204 +
    205 -class _Web2pyImporter(_BaseImporter): +
    206 """ +207 The standard web2py importer. Like the standard Python importer but it +208 tries to transform import statements as something like +209 "import applications.app_name.modules.x". If the import failed, fall back +210 on _BaseImporter. +211 """ +212 +213 _RE_ESCAPED_PATH_SEP = re.escape(os.path.sep) # os.path.sep escaped for re +214 +
    215 - def __init__(self, web2py_path): +
    216 """ +217 @param web2py_path: The absolute path of the web2py installation. +218 """ +219 +220 global DEBUG +221 super(_Web2pyImporter, self).__init__() +222 self.web2py_path = web2py_path +223 self.__web2py_path_os_path_sep = self.web2py_path+os.path.sep +224 self.__web2py_path_os_path_sep_len = len(self.__web2py_path_os_path_sep) +225 self.__RE_APP_DIR = re.compile( +226 self._RE_ESCAPED_PATH_SEP.join( \ +227 ( \ +228 #"^" + re.escape(web2py_path), # Not working with Python 2.5 +229 "^(" + "applications", +230 "[^", +231 "]+)", +232 "", +233 ) )) +
    234 +
    235 - def _matchAppDir(self, file_path): +
    236 """ +237 Does the file in a directory inside the "applications" directory? +238 """ +239 +240 if file_path.startswith(self.__web2py_path_os_path_sep): +241 file_path = file_path[self.__web2py_path_os_path_sep_len:] +242 return self.__RE_APP_DIR.match(file_path) +243 return False +
    244 +
    245 - def __call__(self, name, globals={}, locals={}, fromlist=[], level=-1): +
    246 """ +247 The import method itself. +248 """ +249 +250 self.begin() +251 #try: +252 # if not relative and not from applications: +253 if not name.startswith(".") and level <= 0 \ +254 and not name.startswith("applications.") \ +255 and isinstance(globals, dict): +256 # Get the name of the file do the import +257 caller_file_name = os.path.join(self.web2py_path, \ +258 globals.get("__file__", "")) +259 # Is the path in an application directory? +260 match_app_dir = self._matchAppDir(caller_file_name) +261 if match_app_dir: +262 try: +263 # Get the prefix to add for the import +264 # (like applications.app_name.modules): +265 modules_prefix = \ +266 ".".join((match_app_dir.group(1). \ +267 replace(os.path.sep, "."), "modules")) +268 if not fromlist: +269 # import like "import x" or "import x.y" +270 return self.__import__dot(modules_prefix, name, +271 globals, locals, fromlist, level) +272 else: +273 # import like "from x import a, b, ..." +274 return super(_Web2pyImporter, self) \ +275 .__call__(modules_prefix+"."+name, +276 globals, locals, fromlist, level) +277 except ImportError: +278 pass +279 return super(_Web2pyImporter, self).__call__(name, globals, locals, +280 fromlist, level) +281 #except Exception, e: +282 # raise e # Don't hide something that went wrong +283 #finally: +284 self.end() +
    285 +
    286 - def __import__dot(self, prefix, name, globals, locals, fromlist, +287 level): +
    288 """ +289 Here we will import x.y.z as many imports like: +290 from applications.app_name.modules import x +291 from applications.app_name.modules.x import y +292 from applications.app_name.modules.x.y import z. +293 x will be the module returned. +294 """ +295 +296 result = None +297 for name in name.split("."): +298 new_mod = super(_Web2pyImporter, self).__call__(prefix, globals, +299 locals, [name], level) +300 try: +301 result = result or new_mod.__dict__[name] +302 except KeyError: +303 raise ImportError() +304 prefix += "." + name +305 return result +
    306 +
    307 -class _Web2pyDateTrackerImporter(_Web2pyImporter, _DateTrackerImporter): +
    308 """ +309 Like _Web2pyImporter but using a _DateTrackerImporter. +310 """ +
    311 +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import._BaseImporter-class.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import._BaseImporter-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import._BaseImporter-class.html @@ -0,0 +1,286 @@ + + + + + web2py.gluon.custom_import._BaseImporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import :: + Class _BaseImporter + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class _BaseImporter

    source code

    +
    +object --+
    +         |
    +        _BaseImporter
    +
    + +
    Known Subclasses:
    +
    + _DateTrackerImporter, + _Web2pyImporter +
    + +
    +The base importer. Dispatch the import the call to the standard Python + importer.

    + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    begin(self)
    + Many imports can be made for a single import statement.
    + source code + +
    + +
    +   + + + + + + +
    __call__(self, + name, + globals={}, + locals={}, + fromlist=[], + level=-1)
    + The import method itself.
    + source code + +
    + +
    +   + + + + + + +
    end(self)
    + Needed for clean up.
    + source code + +
    + +
    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __init__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    begin(self) +

    +
    source code  +
    + + Many imports can be made for a single import statement. This method + help the management of this aspect. +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import._DateTrackerImporter-class.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import._DateTrackerImporter-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import._DateTrackerImporter-class.html @@ -0,0 +1,505 @@ + + + + + web2py.gluon.custom_import._DateTrackerImporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import :: + Class _DateTrackerImporter + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class _DateTrackerImporter

    source code

    +
    +   object --+    
    +            |    
    +_BaseImporter --+
    +                |
    +               _DateTrackerImporter
    +
    + +
    Known Subclasses:
    +
    + _Web2pyDateTrackerImporter +
    + +
    +An importer tracking the date of the module files and reloading them + when they have changed.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __init__(self)
    + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature
    + source code + +
    + +
    +   + + + + + + +
    begin(self)
    + Many imports can be made for a single import statement.
    + source code + +
    + +
    +   + + + + + + +
    __call__(self, + name, + globals={}, + locals={}, + fromlist=[], + level=-1)
    + The import method itself.
    + source code + +
    + +
    +   + + + + + + +
    _update_dates(self, + name, + fromlist)
    + Update all the dates associated to the statement import.
    + source code + +
    + +
    +   + + + + + + +
    _reload_check(self, + name)
    + Update the date associated to the module and reload the module if + the file has changed.
    + source code + +
    + +
    +   + + + + + + +
    end(self)
    + Needed for clean up.
    + source code + +
    + +
    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Class Methods[hide private]
    +
    +   + + + + + + +
    _get_module_file(cls, + module)
    + Get the absolute path file associated to the module or None.
    + source code + +
    + +
    + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + _PACKAGE_PATH_SUFFIX = '/__init__.py' +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __init__(self) +
    (Constructor) +

    +
    source code  +
    + + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
    +
    Overrides: + object.__init__ +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    begin(self) +

    +
    source code  +
    + + Many imports can be made for a single import statement. This method + help the management of this aspect. +
    +
    Overrides: + _BaseImporter.begin +
    (inherited documentation)
    + +
    +
    +
    + +
    + +
    + + +
    +

    __call__(self, + name, + globals={}, + locals={}, + fromlist=[], + level=-1) +
    (Call operator) +

    +
    source code  +
    + + The import method itself. +
    +
    Overrides: + _BaseImporter.__call__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    _update_dates(self, + name, + fromlist) +

    +
    source code  +
    + + Update all the dates associated to the statement import. A single + import statement may import many modules. +
    +
    +
    +
    + +
    + +
    + + +
    +

    end(self) +

    +
    source code  +
    + + Needed for clean up. +
    +
    Overrides: + _BaseImporter.end +
    (inherited documentation)
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyDateTrackerImporter-class.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyDateTrackerImporter-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyDateTrackerImporter-class.html @@ -0,0 +1,262 @@ + + + + + web2py.gluon.custom_import._Web2pyDateTrackerImporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import :: + Class _Web2pyDateTrackerImporter + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class _Web2pyDateTrackerImporter

    source code

    +
    +      object --+        
    +               |        
    +   _BaseImporter --+    
    +                   |    
    +     _Web2pyImporter --+
    +                       |
    +      object --+       |
    +               |       |
    +   _BaseImporter --+   |
    +                   |   |
    +_DateTrackerImporter --+
    +                       |
    +                      _Web2pyDateTrackerImporter
    +
    + +
    +Like _Web2pyImporter but using a _DateTrackerImporter.

    + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +

    Inherited from _Web2pyImporter: + __call__, + __init__ +

    +

    Inherited from _Web2pyImporter (private): + _Web2pyImporter__import__dot, + _matchAppDir +

    +

    Inherited from _DateTrackerImporter: + begin, + end +

    +

    Inherited from _DateTrackerImporter (private): + _reload_check, + _update_dates +

    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Class Methods[hide private]
    +
    +

    Inherited from _DateTrackerImporter (private): + _get_module_file +

    +
    + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +

    Inherited from _Web2pyImporter (private): + _RE_ESCAPED_PATH_SEP +

    +

    Inherited from _DateTrackerImporter (private): + _PACKAGE_PATH_SUFFIX +

    +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyImporter-class.html Index: applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyImporter-class.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.custom_import._Web2pyImporter-class.html @@ -0,0 +1,468 @@ + + + + + web2py.gluon.custom_import._Web2pyImporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module custom_import :: + Class _Web2pyImporter + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Class _Web2pyImporter

    source code

    +
    +   object --+    
    +            |    
    +_BaseImporter --+
    +                |
    +               _Web2pyImporter
    +
    + +
    Known Subclasses:
    +
    + _Web2pyDateTrackerImporter +
    + +
    +The standard web2py importer. Like the standard Python importer but it + tries to transform import statements as something like "import + applications.app_name.modules.x". If the import failed, fall back on + _BaseImporter.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Instance Methods[hide private]
    +
    +   + + + + + + +
    __init__(self, + web2py_path)
    + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature
    + source code + +
    + +
    +   + + + + + + +
    _matchAppDir(self, + file_path)
    + Does the file in a directory inside the "applications" + directory?
    + source code + +
    + +
    +   + + + + + + +
    __call__(self, + name, + globals={}, + locals={}, + fromlist=[], + level=-1)
    + The import method itself.
    + source code + +
    + +
    +   + + + + + + +
    __import__dot(self, + prefix, + name, + globals, + locals, + fromlist, + level)
    + Here we will import x.y.z as many imports like: from + applications.app_name.modules import x from + applications.app_name.modules.x import y from + applications.app_name.modules.x.y import z.
    + source code + +
    + +
    +   + + + + + + +
    _Web2pyImporter__import__dot(self, + prefix, + name, + globals, + locals, + fromlist, + level)
    + Here we will import x.y.z as many imports like: from + applications.app_name.modules import x from + applications.app_name.modules.x import y from + applications.app_name.modules.x.y import z.
    + source code + +
    + +
    +

    Inherited from _BaseImporter: + begin, + end +

    +

    Inherited from object: + __delattr__, + __getattribute__, + __hash__, + __new__, + __reduce__, + __reduce_ex__, + __repr__, + __setattr__, + __str__ +

    +
    + + + + + + + + + +
    + + + + + +
    Class Variables[hide private]
    +
    +   + + _RE_ESCAPED_PATH_SEP = '\\/' +
    + + + + + + + + + +
    + + + + + +
    Properties[hide private]
    +
    +

    Inherited from object: + __class__ +

    +
    + + + + + + +
    + + + + + +
    Method Details[hide private]
    +
    + +
    + +
    + + +
    +

    __init__(self, + web2py_path) +
    (Constructor) +

    +
    source code  +
    + + x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
    +
    Parameters:
    +
      +
    • web2py_path - The absolute path of the web2py installation.
    • +
    +
    Overrides: + object.__init__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __call__(self, + name, + globals={}, + locals={}, + fromlist=[], + level=-1) +
    (Call operator) +

    +
    source code  +
    + + The import method itself. +
    +
    Overrides: + _BaseImporter.__call__ +
    +
    +
    +
    + +
    + +
    + + +
    +

    __import__dot(self, + prefix, + name, + globals, + locals, + fromlist, + level) +

    +
    source code  +
    + + Here we will import x.y.z as many imports like: from + applications.app_name.modules import x from + applications.app_name.modules.x import y from + applications.app_name.modules.x.y import z. x will be the module + returned. +
    +
    +
    +
    + +
    + +
    + + +
    +

    _Web2pyImporter__import__dot(self, + prefix, + name, + globals, + locals, + fromlist, + level) +

    +
    source code  +
    + + Here we will import x.y.z as many imports like: from + applications.app_name.modules import x from + applications.app_name.modules.x import y from + applications.app_name.modules.x.y import z. x will be the module + returned. +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.dal-module.html Index: applications/examples/static/epydoc/web2py.gluon.dal-module.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.dal-module.html @@ -0,0 +1,1426 @@ + + + + + web2py.gluon.dal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module dal + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    + +

    Module dal

    source code

    +
    +
    +This file is part of the web2py Web Framework
    +Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu>
    +License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html)
    +
    +Thanks to
    +    * Niall Sweeny <niall.sweeny@fonjax.com> for MS SQL support
    +    * Marcel Leuthi <mluethi@mlsystems.ch> for Oracle support
    +    * Denes
    +    * Chris Clark
    +    * clach05
    +    * Denes Lengyel
    +    * and many others who have contributed to current and previous versions
    +
    +This file contains the DAL support for many relational databases,
    +including:
    +- SQLite
    +- MySQL
    +- Postgres
    +- Oracle
    +- MS SQL
    +- DB2
    +- Interbase
    +- Ingres
    +- SapDB (experimental)
    +- Cubrid (experimental)
    +- CouchDB (experimental)
    +- MongoDB (in progress)
    +- Google:nosql
    +- Google:sql
    +
    +Example of usage:
    +
    +>>> # from dal import DAL, Field
    +
    +### create DAL connection (and create DB if not exists)
    +>>> db=DAL(('mysql://a:b@locahost/x','sqlite://storage.sqlite'),folder=None)
    +
    +### define a table 'person' (create/aster as necessary)
    +>>> person = db.define_table('person',Field('name','string'))
    +
    +### insert a record
    +>>> id = person.insert(name='James')
    +
    +### retrieve it by id
    +>>> james = person(id)
    +
    +### retrieve it by name
    +>>> james = person(name='James')
    +
    +### retrieve it by arbitrary query
    +>>> query = (person.name=='James')&(person.name.startswith('J'))
    +>>> james = db(query).select(person.ALL)[0]
    +
    +### update one record
    +>>> james.update_record(name='Jim')
    +
    +### update multiple records by query
    +>>> db(person.name.like('J%')).update(name='James')
    +1
    +
    +### delete records by query
    +>>> db(person.name.lower()=='jim').delete()
    +0
    +
    +### retrieve multiple records (rows)
    +>>> people = db(person).select(orderby=person.name,groupby=person.name,limitby=(0,100))
    +
    +### further filter them
    +>>> james = people.find(lambda row: row.name=='James').first()
    +>>> print james.id, james.name
    +1 James
    +
    +### check aggrgates
    +>>> counter = person.id.count()
    +>>> print db(person).select(counter).first()(counter)
    +1
    +
    +### delete one record
    +>>> james.delete_record()
    +1
    +
    +### delete (drop) entire database table
    +>>> person.drop()
    +
    +Supported field types:
    +id string text boolean integer double decimal password upload blob time date datetime,
    +
    +Supported DAL URI strings:
    +'sqlite://test.db'
    +'sqlite:memory'
    +'jdbc:sqlite://test.db'
    +'mysql://root:none@localhost/test'
    +'postgres://mdipierro:none@localhost/test'
    +'jdbc:postgres://mdipierro:none@localhost/test'
    +'mssql://web2py:none@A64X2/web2py_test'
    +'mssql2://web2py:none@A64X2/web2py_test' # alternate mappings
    +'oracle://username:password@database'
    +'firebird://user:password@server:3050/database'
    +'db2://DSN=dsn;UID=user;PWD=pass'
    +'firebird://username:password@hostname/database'
    +'firebird_embedded://username:password@c://path'
    +'informix://user:password@server:3050/database'
    +'informixu://user:password@server:3050/database' # unicode informix
    +'google:datastore' # for google app engine datastore
    +'google:sql' # for google app engine with sql (mysql compatible)
    +'teradata://DSN=dsn;UID=user;PWD=pass' # experimental 
    +
    +For more info:
    +help(DAL)
    +help(Field)
    +
    +


    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Classes[hide private]
    +
    +   + + GAEDecimalProperty
    + GAE decimal implementation +
    +   + + ConnectionPool +
    +   + + BaseAdapter +
    +   + + SQLiteAdapter +
    +   + + JDBCSQLiteAdapter +
    +   + + MySQLAdapter +
    +   + + PostgreSQLAdapter +
    +   + + JDBCPostgreSQLAdapter +
    +   + + OracleAdapter +
    +   + + MSSQLAdapter +
    +   + + MSSQL2Adapter +
    +   + + FireBirdAdapter +
    +   + + FireBirdEmbeddedAdapter +
    +   + + InformixAdapter +
    +   + + DB2Adapter +
    +   + + TeradataAdapter +
    +   + + IngresAdapter +
    +   + + IngresUnicodeAdapter +
    +   + + SAPDBAdapter +
    +   + + CubridAdapter +
    +   + + DatabaseStoredFile +
    +   + + UseDatabaseStoredFile +
    +   + + GoogleSQLAdapter +
    +   + + NoSQLAdapter +
    +   + + GAEF +
    +   + + GoogleDatastoreAdapter +
    +   + + CouchDBAdapter +
    +   + + MongoDBAdapter +
    +   + + Row
    + a dictionary that lets you do d['a'] as well as d.a this is only + used to store a Row +
    +   + + SQLCallableList +
    +   + + DAL
    + an instance of this class represents a database connection +
    +   + + SQLALL
    + Helper class providing a comma-separated string having all the + field names (prefixed by table name and '.') +
    +   + + Reference +
    +   + + Table
    + an instance of this class represents a database table +
    +   + + Expression +
    +   + + SQLCustomType
    + allows defining of custom SQL types... +
    +   + + Field
    + an instance of this class represents a database field +
    +   + + Query
    + a query object necessary to define a set. +
    +   + + Set
    + a Set represents a set of records in the database, +the records are identified by the query=Query(...) object. +
    +   + + Rows
    + A wrapper for the return value of a select. +
    +   + + SQLField
    + an instance of this class represents a database field +
    +   + + SQLTable
    + an instance of this class represents a database table +
    +   + + SQLXorable +
    +   + + SQLQuery
    + a query object necessary to define a set. +
    +   + + SQLSet
    + a Set represents a set of records in the database, +the records are identified by the query=Query(...) object. +
    +   + + SQLRows
    + A wrapper for the return value of a select. +
    +   + + SQLStorage
    + a dictionary that lets you do d['a'] as well as d.a this is only + used to store a Row +
    +   + + SQLDB
    + an instance of this class represents a database connection +
    +   + + GQLDB
    + an instance of this class represents a database connection +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Functions[hide private]
    +
    +   + + + + + + +
    DEFAULT() + source code + +
    + +
    +   + + + + + + +
    uuid2int(uuidv) + source code + +
    + +
    +   + + + + + + +
    int2uuid(n) + source code + +
    + +
    +   + + + + + + +
    cleanup(text)
    + validates that the given text is clean: only contains + [0-9a-zA-Z_]
    + source code + +
    + +
    +   + + + + + + +
    sqlhtml_validators(field)
    + Field type validation, using web2py's validators mechanism.
    + source code + +
    + +
    +   + + + + + + +
    bar_escape(item) + source code + +
    + +
    +   + + + + + + +
    bar_encode(items) + source code + +
    + +
    +   + + + + + + +
    bar_decode_integer(value) + source code + +
    + +
    +   + + + + + + +
    bar_decode_string(value) + source code + +
    + +
    +   + + + + + + +
    Row_unpickler(data) + source code + +
    + +
    +   + + + + + + +
    Row_pickler(data) + source code + +
    + +
    +   + + + + + + +
    Reference_unpickler(data) + source code + +
    + +
    +   + + + + + + +
    Reference_pickler(data) + source code + +
    + +
    +   + + + + + + +
    xorify(orderby) + source code + +
    + +
    +   + + + + + + +
    update_record(pack, + a={}) + source code + +
    + +
    +   + + + + + + +
    Rows_unpickler(data) + source code + +
    + +
    +   + + + + + + +
    Rows_pickler(data) + source code + +
    + +
    +   + + + + + + +
    test_all()
    + >>> if len(sys.argv)<2: db = DAL("sqlite://test.db")...
    + source code + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    Variables[hide private]
    +
    +   + + MAXCHARLENGTH = 512 +
    +   + + INFINITY = 32768 +
    +   + + CALLABLETYPES = (<type 'function'>, <type 'function'>, <type '... +
    +   + + have_portalocker = True +
    +   + + have_serializers = True +
    +   + + have_validators = True +
    +   + + logger = logging.getLogger("web2py.dal") +
    +   + + sql_locker = <_RLock(None, 0)> +
    +   + + thread = threading.local() +
    +   + + regex_dbname = re.compile(r'^(\w+)(:\w+)*') +
    +   + + table_field = re.compile(r'^[\w_]+\.[\w_]+$') +
    +   + + regex_content = re.compile(r'(?P<table>[\w-]+)\.(?P<field>[\w-... +
    +   + + regex_cleanup_fn = re.compile(r'[\'"\s;]+') +
    +   + + string_unpack = re.compile(r'(?<!\|)\|(?!\|)') +
    +   + + regex_python_keywords = re.compile(r'^(and|del|from|not|while|... +
    +   + + drivers = ['SQLite3', 'pymysql', 'PostgreSQL'] +
    +   + + is_jdbc = True +
    +   + + INGRES_SEQNAME = 'ii***lineitemsequence' +
    +   + + ADAPTERS = {'couchdb': <class 'web2py.gluon.dal.CouchDBAdapter... +
    +   + + regex_quotes = re.compile(r'\'[^\']*\'') +
    + + + + + + +
    + + + + + +
    Function Details[hide private]
    +
    + +
    + +
    + + +
    +

    sqlhtml_validators(field) +

    +
    source code  +
    + +

    Field type validation, using web2py's validators mechanism.

    + makes sure the content of a field is in line with the declared + fieldtype +
    +
    +
    +
    + +
    + +
    + + +
    +

    test_all() +

    +
    source code  +
    + +
    +
    +
    + >>> if len(sys.argv)<2: db = DAL("sqlite://test.db")
    + >>> if len(sys.argv)>1: db = DAL(sys.argv[1])
    + >>> tmp = db.define_table('users',              Field('stringf', 'string', length=32, required=True),              Field('booleanf', 'boolean', default=False),              Field('passwordf', 'password', notnull=True),              Field('uploadf', 'upload'),              Field('blobf', 'blob'),              Field('integerf', 'integer', unique=True),              Field('doublef', 'double', unique=True,notnull=True),              Field('datef', 'date', default=datetime.date.today()),              Field('timef', 'time'),              Field('datetimef', 'datetime'),              migrate='test_user.table')
    +
    +Insert a field
    +
    + >>> db.users.insert(stringf='a', booleanf=True, passwordf='p', blobf='0A',                       uploadf=None, integerf=5, doublef=3.14,                       datef=datetime.date(2001, 1, 1),                       timef=datetime.time(12, 30, 15),                       datetimef=datetime.datetime(2002, 2, 2, 12, 30, 15))
    + 1
    +
    + Drop the table
    +
    + >>> db.users.drop()
    +
    + Examples of insert, select, update, delete
    +
    + >>> tmp = db.define_table('person',              Field('name'),              Field('birth','date'),              migrate='test_person.table')
    + >>> person_id = db.person.insert(name="Marco",birth='2005-06-22')
    + >>> person_id = db.person.insert(name="Massimo",birth='1971-12-21')
    +
    + commented len(db().select(db.person.ALL))
    + commented 2
    +
    + >>> me = db(db.person.id==person_id).select()[0] # test select
    + >>> me.name
    + 'Massimo'
    + >>> db(db.person.name=='Massimo').update(name='massimo') # test update
    + 1
    + >>> db(db.person.name=='Marco').select().first().delete_record() # test delete
    + 1
    +
    + Update a single record
    +
    + >>> me.update_record(name="Max")
    + >>> me.name
    + 'Max'
    +
    + Examples of complex search conditions
    +
    + >>> len(db((db.person.name=='Max')&(db.person.birth<'2003-01-01')).select())
    + 1
    + >>> len(db((db.person.name=='Max')&(db.person.birth<datetime.date(2003,01,01))).select())
    + 1
    + >>> len(db((db.person.name=='Max')|(db.person.birth<'2003-01-01')).select())
    + 1
    + >>> me = db(db.person.id==person_id).select(db.person.name)[0]
    + >>> me.name
    + 'Max'
    +
    + Examples of search conditions using extract from date/datetime/time
    +
    + >>> len(db(db.person.birth.month()==12).select())
    + 1
    + >>> len(db(db.person.birth.year()>1900).select())
    + 1
    +
    + Example of usage of NULL
    +
    + >>> len(db(db.person.birth==None).select()) ### test NULL
    + 0
    + >>> len(db(db.person.birth!=None).select()) ### test NULL
    + 1
    +
    + Examples of search conditions using lower, upper, and like
    +
    + >>> len(db(db.person.name.upper()=='MAX').select())
    + 1
    + >>> len(db(db.person.name.like('%ax')).select())
    + 1
    + >>> len(db(db.person.name.upper().like('%AX')).select())
    + 1
    + >>> len(db(~db.person.name.upper().like('%AX')).select())
    + 0
    +
    + orderby, groupby and limitby
    +
    + >>> people = db().select(db.person.name, orderby=db.person.name)
    + >>> order = db.person.name|~db.person.birth
    + >>> people = db().select(db.person.name, orderby=order)
    +
    + >>> people = db().select(db.person.name, orderby=db.person.name, groupby=db.person.name)
    +
    + >>> people = db().select(db.person.name, orderby=order, limitby=(0,100))
    +
    + Example of one 2 many relation
    +
    + >>> tmp = db.define_table('dog',               Field('name'),               Field('birth','date'),               Field('owner',db.person),               migrate='test_dog.table')
    + >>> db.dog.insert(name='Snoopy', birth=None, owner=person_id)
    + 1
    +
    + A simple JOIN
    +
    + >>> len(db(db.dog.owner==db.person.id).select())
    + 1
    +
    + >>> len(db().select(db.person.ALL, db.dog.name,left=db.dog.on(db.dog.owner==db.person.id)))
    + 1
    +
    + Drop tables
    +
    + >>> db.dog.drop()
    + >>> db.person.drop()
    +
    + Example of many 2 many relation and Set
    +
    + >>> tmp = db.define_table('author', Field('name'),                            migrate='test_author.table')
    + >>> tmp = db.define_table('paper', Field('title'),                            migrate='test_paper.table')
    + >>> tmp = db.define_table('authorship',            Field('author_id', db.author),            Field('paper_id', db.paper),            migrate='test_authorship.table')
    + >>> aid = db.author.insert(name='Massimo')
    + >>> pid = db.paper.insert(title='QCD')
    + >>> tmp = db.authorship.insert(author_id=aid, paper_id=pid)
    +
    + Define a Set
    +
    + >>> authored_papers = db((db.author.id==db.authorship.author_id)&(db.paper.id==db.authorship.paper_id))
    + >>> rows = authored_papers.select(db.author.name, db.paper.title)
    + >>> for row in rows: print row.author.name, row.paper.title
    + Massimo QCD
    +
    + Example of search condition using  belongs
    +
    + >>> set = (1, 2, 3)
    + >>> rows = db(db.paper.id.belongs(set)).select(db.paper.ALL)
    + >>> print rows[0].title
    + QCD
    +
    + Example of search condition using nested select
    +
    + >>> nested_select = db()._select(db.authorship.paper_id)
    + >>> rows = db(db.paper.id.belongs(nested_select)).select(db.paper.ALL)
    + >>> print rows[0].title
    + QCD
    +
    + Example of expressions
    +
    + >>> mynumber = db.define_table('mynumber', Field('x', 'integer'))
    + >>> db(mynumber.id>0).delete()
    + 0
    + >>> for i in range(10): tmp = mynumber.insert(x=i)
    + >>> db(mynumber.id>0).select(mynumber.x.sum())[0](mynumber.x.sum())
    + 45
    +
    + >>> db(mynumber.x+2==5).select(mynumber.x + 2)[0](mynumber.x + 2)
    + 5
    +
    + Output in csv
    +
    + >>> print str(authored_papers.select(db.author.name, db.paper.title)).strip()
    + author.name,paper.title
    + Massimo,QCD
    +
    + Delete all leftover tables
    +
    + >>> DAL.distributed_transaction_commit(db)
    +
    + >>> db.mynumber.drop()
    + >>> db.authorship.drop()
    + >>> db.author.drop()
    + >>> db.paper.drop()
    + 
    +
    +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + + +
    Variables Details[hide private]
    +
    + +
    + +
    +

    CALLABLETYPES

    + +
    +
    +
    +
    Value:
    +
    +(<type 'function'>,
    + <type 'function'>,
    + <type 'builtin_function_or_method'>,
    + <type 'instancemethod'>,
    + <type 'builtin_function_or_method'>)
    +
    +
    +
    +
    +
    + +
    + +
    +

    regex_content

    + +
    +
    +
    +
    Value:
    +
    +re.compile(r'(?P<table>[\w-]+)\.(?P<field>[\w-]+)\.(?P<uuidkey>[\w-]+)\
    +\.(?P<name>\w+)\.\w+$')
    +
    +
    +
    +
    +
    + +
    + +
    +

    regex_python_keywords

    + +
    +
    +
    +
    Value:
    +
    +re.compile(r'^(and|del|from|not|while|as|elif|global|or|with|assert|el\
    +se|if|pass|yield|break|except|import|print|class|exec|in|raise|continu\
    +e|finally|is|return|def|for|lambda|try)$')
    +
    +
    +
    +
    +
    + +
    + +
    +

    ADAPTERS

    + +
    +
    +
    +
    Value:
    +
    +{'couchdb': <class 'web2py.gluon.dal.CouchDBAdapter'>,
    + 'cubrid': <class 'web2py.gluon.dal.CubridAdapter'>,
    + 'db2': <class 'web2py.gluon.dal.DB2Adapter'>,
    + 'firebird': <class 'web2py.gluon.dal.FireBirdAdapter'>,
    + 'firebird_embedded': <class 'web2py.gluon.dal.FireBirdAdapter'>,
    + 'gae': <class 'web2py.gluon.dal.GoogleDatastoreAdapter'>,
    + 'google:datastore': <class 'web2py.gluon.dal.GoogleDatastoreAdapter'>\
    +,
    +...
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ADDED applications/examples/static/epydoc/web2py.gluon.dal-pysrc.html Index: applications/examples/static/epydoc/web2py.gluon.dal-pysrc.html ================================================================== --- /dev/null +++ applications/examples/static/epydoc/web2py.gluon.dal-pysrc.html @@ -0,0 +1,12344 @@ + + + + + web2py.gluon.dal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Package web2py :: + Package gluon :: + Module dal + + + + + + +
    [hide private]
    [frames] | no frames]
    +
    +

    Source Code for Module web2py.gluon.dal

    +
    +   1  #!/bin/env python 
    +   2  # -*- coding: utf-8 -*- 
    +   3   
    +   4  """ 
    +   5  This file is part of the web2py Web Framework 
    +   6  Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
    +   7  License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 
    +   8   
    +   9  Thanks to 
    +  10      * Niall Sweeny <niall.sweeny@fonjax.com> for MS SQL support 
    +  11      * Marcel Leuthi <mluethi@mlsystems.ch> for Oracle support 
    +  12      * Denes 
    +  13      * Chris Clark 
    +  14      * clach05 
    +  15      * Denes Lengyel 
    +  16      * and many others who have contributed to current and previous versions 
    +  17   
    +  18  This file contains the DAL support for many relational databases, 
    +  19  including: 
    +  20  - SQLite 
    +  21  - MySQL 
    +  22  - Postgres 
    +  23  - Oracle 
    +  24  - MS SQL 
    +  25  - DB2 
    +  26  - Interbase 
    +  27  - Ingres 
    +  28  - SapDB (experimental) 
    +  29  - Cubrid (experimental) 
    +  30  - CouchDB (experimental) 
    +  31  - MongoDB (in progress) 
    +  32  - Google:nosql 
    +  33  - Google:sql 
    +  34   
    +  35  Example of usage: 
    +  36   
    +  37  >>> # from dal import DAL, Field 
    +  38   
    +  39  ### create DAL connection (and create DB if not exists) 
    +  40  >>> db=DAL(('mysql://a:b@locahost/x','sqlite://storage.sqlite'),folder=None) 
    +  41   
    +  42  ### define a table 'person' (create/aster as necessary) 
    +  43  >>> person = db.define_table('person',Field('name','string')) 
    +  44   
    +  45  ### insert a record 
    +  46  >>> id = person.insert(name='James') 
    +  47   
    +  48  ### retrieve it by id 
    +  49  >>> james = person(id) 
    +  50   
    +  51  ### retrieve it by name 
    +  52  >>> james = person(name='James') 
    +  53   
    +  54  ### retrieve it by arbitrary query 
    +  55  >>> query = (person.name=='James')&(person.name.startswith('J')) 
    +  56  >>> james = db(query).select(person.ALL)[0] 
    +  57   
    +  58  ### update one record 
    +  59  >>> james.update_record(name='Jim') 
    +  60   
    +  61  ### update multiple records by query 
    +  62  >>> db(person.name.like('J%')).update(name='James') 
    +  63  1 
    +  64   
    +  65  ### delete records by query 
    +  66  >>> db(person.name.lower()=='jim').delete() 
    +  67  0 
    +  68   
    +  69  ### retrieve multiple records (rows) 
    +  70  >>> people = db(person).select(orderby=person.name,groupby=person.name,limitby=(0,100)) 
    +  71   
    +  72  ### further filter them 
    +  73  >>> james = people.find(lambda row: row.name=='James').first() 
    +  74  >>> print james.id, james.name 
    +  75  1 James 
    +  76   
    +  77  ### check aggrgates 
    +  78  >>> counter = person.id.count() 
    +  79  >>> print db(person).select(counter).first()(counter) 
    +  80  1 
    +  81   
    +  82  ### delete one record 
    +  83  >>> james.delete_record() 
    +  84  1 
    +  85   
    +  86  ### delete (drop) entire database table 
    +  87  >>> person.drop() 
    +  88   
    +  89  Supported field types: 
    +  90  id string text boolean integer double decimal password upload blob time date datetime, 
    +  91   
    +  92  Supported DAL URI strings: 
    +  93  'sqlite://test.db' 
    +  94  'sqlite:memory' 
    +  95  'jdbc:sqlite://test.db' 
    +  96  'mysql://root:none@localhost/test' 
    +  97  'postgres://mdipierro:none@localhost/test' 
    +  98  'jdbc:postgres://mdipierro:none@localhost/test' 
    +  99  'mssql://web2py:none@A64X2/web2py_test' 
    + 100  'mssql2://web2py:none@A64X2/web2py_test' # alternate mappings 
    + 101  'oracle://username:password@database' 
    + 102  'firebird://user:password@server:3050/database' 
    + 103  'db2://DSN=dsn;UID=user;PWD=pass' 
    + 104  'firebird://username:password@hostname/database' 
    + 105  'firebird_embedded://username:password@c://path' 
    + 106  'informix://user:password@server:3050/database' 
    + 107  'informixu://user:password@server:3050/database' # unicode informix 
    + 108  'google:datastore' # for google app engine datastore 
    + 109  'google:sql' # for google app engine with sql (mysql compatible) 
    + 110  'teradata://DSN=dsn;UID=user;PWD=pass' # experimental  
    + 111   
    + 112  For more info: 
    + 113  help(DAL) 
    + 114  help(Field) 
    + 115  """ 
    + 116   
    + 117  ################################################################################### 
    + 118  # this file orly exposes DAL and Field 
    + 119  ################################################################################### 
    + 120   
    + 121  __all__ = ['DAL', 'Field'] 
    + 122  MAXCHARLENGTH = 512 
    + 123  INFINITY = 2**15 # not quite but reasonable default max char length 
    + 124   
    + 125  import re 
    + 126  import sys 
    + 127  import locale 
    + 128  import os 
    + 129  import types 
    + 130  import cPickle 
    + 131  import datetime 
    + 132  import threading 
    + 133  import time 
    + 134  import cStringIO 
    + 135  import csv 
    + 136  import copy 
    + 137  import socket 
    + 138  import logging 
    + 139  import copy_reg 
    + 140  import base64 
    + 141  import shutil 
    + 142  import marshal 
    + 143  import decimal 
    + 144  import struct 
    + 145  import urllib 
    + 146  import hashlib 
    + 147  import uuid 
    + 148  import glob 
    + 149   
    + 150  CALLABLETYPES = (types.LambdaType, types.FunctionType, types.BuiltinFunctionType, 
    + 151                   types.MethodType, types.BuiltinMethodType) 
    + 152   
    + 153   
    + 154  ################################################################################### 
    + 155  # following checks allows running of dal without web2py as a standalone module 
    + 156  ################################################################################### 
    + 157  try: 
    + 158      from utils import web2py_uuid 
    + 159  except ImportError: 
    + 160      import uuid 
    +
    161 - def web2py_uuid(): return str(uuid.uuid4()) +
    162 + 163 try: + 164 import portalocker + 165 have_portalocker = True + 166 except ImportError: + 167 have_portalocker = False + 168 + 169 try: + 170 import serializers + 171 have_serializers = True + 172 except ImportError: + 173 have_serializers = False + 174 + 175 try: + 176 import validators + 177 have_validators = True + 178 except ImportError: + 179 have_validators = False + 180 + 181 logger = logging.getLogger("web2py.dal") + 182 DEFAULT = lambda:0 + 183 + 184 sql_locker = threading.RLock() + 185 thread = threading.local() + 186 + 187 # internal representation of tables with field + 188 # <table>.<field>, tables and fields may only be [a-zA-Z0-0_] + 189 + 190 regex_dbname = re.compile('^(\w+)(\:\w+)*') + 191 table_field = re.compile('^[\w_]+\.[\w_]+$') + 192 regex_content = re.compile('(?P<table>[\w\-]+)\.(?P<field>[\w\-]+)\.(?P<uuidkey>[\w\-]+)\.(?P<name>\w+)\.\w+$') + 193 regex_cleanup_fn = re.compile('[\'"\s;]+') + 194 string_unpack=re.compile('(?<!\|)\|(?!\|)') + 195 regex_python_keywords = re.compile('^(and|del|from|not|while|as|elif|global|or|with|assert|else|if|pass|yield|break|except|import|print|class|exec|in|raise|continue|finally|is|return|def|for|lambda|try)$') + 196 + 197 + 198 + 199 # list of drivers will be built on the fly + 200 # and lists only what is available + 201 drivers = [] + 202 + 203 try: + 204 from new import classobj + 205 from google.appengine.ext import db as gae + 206 from google.appengine.api import namespace_manager, rdbms + 207 from google.appengine.api.datastore_types import Key ### needed for belongs on ID + 208 from google.appengine.ext.db.polymodel import PolyModel + 209 drivers.append('google') + 210 except ImportError: + 211 pass + 212 + 213 if not 'google' in drivers: + 214 + 215 try: + 216 from pysqlite2 import dbapi2 as sqlite3 + 217 drivers.append('pysqlite2') + 218 except ImportError: + 219 try: + 220 from sqlite3 import dbapi2 as sqlite3 + 221 drivers.append('SQLite3') + 222 except ImportError: + 223 logger.debug('no sqlite3 or pysqlite2.dbapi2 driver') + 224 + 225 try: + 226 import contrib.pymysql as pymysql + 227 drivers.append('pymysql') + 228 except ImportError: + 229 logger.debug('no pymysql driver') + 230 + 231 try: + 232 import psycopg2 + 233 drivers.append('PostgreSQL') + 234 except ImportError: + 235 logger.debug('no psycopg2 driver') + 236 + 237 try: + 238 import cx_Oracle + 239 drivers.append('Oracle') + 240 except ImportError: + 241 logger.debug('no cx_Oracle driver') + 242 + 243 try: + 244 import pyodbc + 245 drivers.append('MSSQL/DB2') + 246 except ImportError: + 247 logger.debug('no MSSQL/DB2 driver') + 248 + 249 try: + 250 import kinterbasdb + 251 drivers.append('Interbase') + 252 except ImportError: + 253 logger.debug('no kinterbasdb driver') + 254 + 255 try: + 256 import firebirdsql + 257 drivers.append('Firebird') + 258 except ImportError: + 259 logger.debug('no Firebird driver') + 260 + 261 try: + 262 import informixdb + 263 drivers.append('Informix') + 264 logger.warning('Informix support is experimental') + 265 except ImportError: + 266 logger.debug('no informixdb driver') + 267 + 268 try: + 269 import sapdb + 270 drivers.append('SAPDB') + 271 logger.warning('SAPDB support is experimental') + 272 except ImportError: + 273 logger.debug('no sapdb driver') + 274 + 275 try: + 276 import cubriddb + 277 drivers.append('Cubrid') + 278 logger.warning('Cubrid support is experimental') + 279 except ImportError: + 280 logger.debug('no cubriddb driver') + 281 + 282 try: + 283 from com.ziclix.python.sql import zxJDBC + 284 import java.sql + 285 # Try sqlite jdbc driver from http://www.zentus.com/sqlitejdbc/ + 286 from org.sqlite import JDBC # required by java.sql; ensure we have it + 287 drivers.append('zxJDBC') + 288 logger.warning('zxJDBC support is experimental') + 289 is_jdbc = True + 290 except ImportError: + 291 logger.debug('no zxJDBC driver') + 292 is_jdbc = False + 293 + 294 try: + 295 import ingresdbi + 296 drivers.append('Ingres') + 297 except ImportError: + 298 logger.debug('no Ingres driver') + 299 # NOTE could try JDBC....... + 300 + 301 try: + 302 import couchdb + 303 drivers.append('CouchDB') + 304 except ImportError: + 305 logger.debug('no couchdb driver') + 306 + 307 try: + 308 import pymongo + 309 drivers.append('mongoDB') + 310 except: + 311 logger.debug('no mongoDB driver') + 312 + 313 + 314 if 'google' in drivers: + 315 + 316 is_jdbc = False + 317 +
    318 - class GAEDecimalProperty(gae.Property): +
    319 """ + 320 GAE decimal implementation + 321 """ + 322 data_type = decimal.Decimal + 323 +
    324 - def __init__(self, precision, scale, **kwargs): +
    325 super(GAEDecimalProperty, self).__init__(self, **kwargs) + 326 d = '1.' + 327 for x in range(scale): + 328 d += '0' + 329 self.round = decimal.Decimal(d) +
    330 +
    331 - def get_value_for_datastore(self, model_instance): +
    332 value = super(GAEDecimalProperty, self).get_value_for_datastore(model_instance) + 333 if value: + 334 return str(value) + 335 else: + 336 return None +
    337 +
    338 - def make_value_from_datastore(self, value): +
    339 if value: + 340 return decimal.Decimal(value).quantize(self.round) + 341 else: + 342 return None +
    343 +
    344 - def validate(self, value): +
    345 value = super(GAEDecimalProperty, self).validate(value) + 346 if value is None or isinstance(value, decimal.Decimal): + 347 return value + 348 elif isinstance(value, basestring): + 349 return decimal.Decimal(value) + 350 raise gae.BadValueError("Property %s must be a Decimal or string." % self.name) +
    351 + 352 ################################################################################### + 353 # class that handles connection pooling (all adapters derived form this one) + 354 ################################################################################### + 355 +
    356 -class ConnectionPool(object): +
    357 + 358 pools = {} + 359 + 360 @staticmethod +
    361 - def set_folder(folder): +
    362 thread.folder = folder +
    363 + 364 # ## this allows gluon to commit/rollback all dbs in this thread + 365 + 366 @staticmethod +
    367 - def close_all_instances(action): +
    368 """ to close cleanly databases in a multithreaded environment """ + 369 if not hasattr(thread,'instances'): + 370 return + 371 while thread.instances: + 372 instance = thread.instances.pop() + 373 getattr(instance,action)() + 374 # ## if you want pools, recycle this connection + 375 really = True + 376 if instance.pool_size: + 377 sql_locker.acquire() + 378 pool = ConnectionPool.pools[instance.uri] + 379 if len(pool) < instance.pool_size: + 380 pool.append(instance.connection) + 381 really = False + 382 sql_locker.release() + 383 if really: + 384 getattr(instance,'close')() + 385 return +
    386 +
    387 - def find_or_make_work_folder(self): +
    388 """ this actually does not make the folder. it has to be there """ + 389 if hasattr(thread,'folder'): + 390 self.folder = thread.folder + 391 else: + 392 self.folder = thread.folder = '' + 393 + 394 # Creating the folder if it does not exist + 395 if False and self.folder and not os.path.exists(self.folder): + 396 os.mkdir(self.folder) +
    397 +
    398 - def pool_connection(self, f): +
    399 if not self.pool_size: + 400 self.connection = f() + 401 else: + 402 uri = self.uri + 403 sql_locker.acquire() + 404 if not uri in ConnectionPool.pools: + 405 ConnectionPool.pools[uri] = [] + 406 if ConnectionPool.pools[uri]: + 407 self.connection = ConnectionPool.pools[uri].pop() + 408 sql_locker.release() + 409 else: + 410 sql_locker.release() + 411 self.connection = f() + 412 if not hasattr(thread,'instances'): + 413 thread.instances = [] + 414 thread.instances.append(self) +
    415 + 416 + 417 ################################################################################### + 418 # this is a generic adapter that does nothing; all others are derived form this one + 419 ################################################################################### + 420 +
    421 -class BaseAdapter(ConnectionPool): +
    422 + 423 driver = None + 424 maxcharlength = INFINITY + 425 commit_on_alter_table = False + 426 support_distributed_transaction = False + 427 uploads_in_blob = False + 428 types = { + 429 'boolean': 'CHAR(1)', + 430 'string': 'CHAR(%(length)s)', + 431 'text': 'TEXT', + 432 'password': 'CHAR(%(length)s)', + 433 'blob': 'BLOB', + 434 'upload': 'CHAR(%(length)s)', + 435 'integer': 'INTEGER', + 436 'double': 'DOUBLE', + 437 'decimal': 'DOUBLE', + 438 'date': 'DATE', + 439 'time': 'TIME', + 440 'datetime': 'TIMESTAMP', + 441 'id': 'INTEGER PRIMARY KEY AUTOINCREMENT', + 442 'reference': 'INTEGER REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', + 443 'list:integer': 'TEXT', + 444 'list:string': 'TEXT', + 445 'list:reference': 'TEXT', + 446 } + 447 +
    448 - def integrity_error(self): +
    449 return self.driver.IntegrityError +
    450 +
    451 - def file_exists(self, filename): +
    452 """ + 453 to be used ONLY for files that on GAE may not be on filesystem + 454 """ + 455 return os.path.exists(filename) +
    456 +
    457 - def file_open(self, filename, mode='rb', lock=True): +
    458 """ + 459 to be used ONLY for files that on GAE may not be on filesystem + 460 """ + 461 fileobj = open(filename,mode) + 462 if have_portalocker and lock: + 463 if mode in ('r','rb'): + 464 portalocker.lock(fileobj,portalocker.LOCK_SH) + 465 elif mode in ('w','wb','a'): + 466 portalocker.lock(fileobj,portalocker.LOCK_EX) + 467 else: + 468 fileobj.close() + 469 raise RuntimeError, "Unsupported file_open mode" + 470 return fileobj +
    471 +
    472 - def file_close(self, fileobj, unlock=True): +
    473 """ + 474 to be used ONLY for files that on GAE may not be on filesystem + 475 """ + 476 if fileobj: + 477 if have_portalocker and unlock: + 478 portalocker.unlock(fileobj) + 479 fileobj.close() +
    480 +
    481 - def file_delete(self, filename): +
    482 os.unlink(filename) +
    483 +
    484 - def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', + 485 credential_decoder=lambda x:x, driver_args={}, + 486 adapter_args={}): +
    487 self.db = db + 488 self.dbengine = "None" + 489 self.uri = uri + 490 self.pool_size = pool_size + 491 self.folder = folder + 492 self.db_codec = db_codec + 493 class Dummy(object): + 494 lastrowid = 1 + 495 def __getattr__(self, value): + 496 return lambda *a, **b: [] +
    497 self.connection = Dummy() + 498 self.cursor = Dummy() + 499 +
    500 - def sequence_name(self,tablename): +
    501 return '%s_sequence' % tablename +
    502 +
    503 - def trigger_name(self,tablename): +
    504 return '%s_sequence' % tablename +
    505 + 506 +
    507 - def create_table(self, table, migrate=True, fake_migrate=False, polymodel=None): +
    508 fields = [] + 509 sql_fields = {} + 510 sql_fields_aux = {} + 511 TFK = {} + 512 tablename = table._tablename + 513 sortable = 0 + 514 for field in table: + 515 sortable += 1 + 516 k = field.name + 517 if isinstance(field.type,SQLCustomType): + 518 ftype = field.type.native or field.type.type + 519 elif field.type.startswith('reference'): + 520 referenced = field.type[10:].strip() + 521 constraint_name = self.constraint_name(tablename, field.name) + 522 if hasattr(table,'_primarykey'): + 523 rtablename,rfieldname = referenced.split('.') + 524 rtable = table._db[rtablename] + 525 rfield = rtable[rfieldname] + 526 # must be PK reference or unique + 527 if rfieldname in rtable._primarykey or rfield.unique: + 528 ftype = self.types[rfield.type[:9]] % dict(length=rfield.length) + 529 # multicolumn primary key reference? + 530 if not rfield.unique and len(rtable._primarykey)>1 : + 531 # then it has to be a table level FK + 532 if rtablename not in TFK: + 533 TFK[rtablename] = {} + 534 TFK[rtablename][rfieldname] = field.name + 535 else: + 536 ftype = ftype + \ + 537 self.types['reference FK'] %dict(\ + 538 constraint_name=constraint_name, + 539 table_name=tablename, + 540 field_name=field.name, + 541 foreign_key='%s (%s)'%(rtablename, rfieldname), + 542 on_delete_action=field.ondelete) + 543 else: + 544 # make a guess here for circular references + 545 id_fieldname = referenced in table._db and table._db[referenced]._id.name or 'id' + 546 ftype = self.types[field.type[:9]]\ + 547 % dict(table_name=tablename, + 548 field_name=field.name, + 549 constraint_name=constraint_name, + 550 foreign_key=referenced + ('(%s)' % id_fieldname), + 551 on_delete_action=field.ondelete) + 552 elif field.type.startswith('list:reference'): + 553 ftype = self.types[field.type[:14]] + 554 elif field.type.startswith('decimal'): + 555 precision, scale = map(int,field.type[8:-1].split(',')) + 556 ftype = self.types[field.type[:7]] % \ + 557 dict(precision=precision,scale=scale) + 558 elif not field.type in self.types: + 559 raise SyntaxError, 'Field: unknown field type: %s for %s' % \ + 560 (field.type, field.name) + 561 else: + 562 ftype = self.types[field.type]\ + 563 % dict(length=field.length) + 564 if not field.type.startswith('id') and not field.type.startswith('reference'): + 565 if field.notnull: + 566 ftype += ' NOT NULL' + 567 else: + 568 ftype += self.ALLOW_NULL() + 569 if field.unique: + 570 ftype += ' UNIQUE' + 571 + 572 # add to list of fields + 573 sql_fields[field.name] = dict(sortable=sortable, + 574 type=str(field.type), + 575 sql=ftype) + 576 + 577 if isinstance(field.default,(str,int,float)): + 578 # caveat: sql_fields and sql_fields_aux differ for default values + 579 # sql_fields is used to trigger migrations and sql_fields_aux + 580 # are used for create table + 581 # the reason is that we do not want to trigger a migration simply + 582 # because a default value changes + 583 not_null = self.NOT_NULL(field.default,field.type) + 584 ftype = ftype.replace('NOT NULL',not_null) + 585 sql_fields_aux[field.name] = dict(sql=ftype) + 586 + 587 fields.append('%s %s' % (field.name, ftype)) + 588 other = ';' + 589 + 590 # backend-specific extensions to fields + 591 if self.dbengine == 'mysql': + 592 if not hasattr(table, "_primarykey"): + 593 fields.append('PRIMARY KEY(%s)' % table._id.name) + 594 other = ' ENGINE=InnoDB CHARACTER SET utf8;' + 595 + 596 fields = ',\n '.join(fields) + 597 for rtablename in TFK: + 598 rfields = TFK[rtablename] + 599 pkeys = table._db[rtablename]._primarykey + 600 fkeys = [ rfields[k] for k in pkeys ] + 601 fields = fields + ',\n ' + \ + 602 self.types['reference TFK'] %\ + 603 dict(table_name=tablename, + 604 field_name=', '.join(fkeys), + 605 foreign_table=rtablename, + 606 foreign_key=', '.join(pkeys), + 607 on_delete_action=field.ondelete) + 608 + 609 if hasattr(table,'_primarykey'): + 610 query = '''CREATE TABLE %s(\n %s,\n %s) %s''' % \ + 611 (tablename, fields, self.PRIMARY_KEY(', '.join(table._primarykey)),other) + 612 else: + 613 query = '''CREATE TABLE %s(\n %s\n)%s''' % \ + 614 (tablename, fields, other) + 615 + 616 if self.uri.startswith('sqlite:///'): + 617 path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8' + 618 dbpath = self.uri[9:self.uri.rfind('/')].decode('utf8').encode(path_encoding) + 619 else: + 620 dbpath = self.folder + 621 + 622 if not migrate: + 623 return query + 624 elif self.uri.startswith('sqlite:memory'): + 625 table._dbt = None + 626 elif isinstance(migrate, str): + 627 table._dbt = os.path.join(dbpath, migrate) + 628 else: + 629 table._dbt = os.path.join(dbpath, '%s_%s.table' \ + 630 % (table._db._uri_hash, tablename)) + 631 if table._dbt: + 632 table._loggername = os.path.join(dbpath, 'sql.log') + 633 logfile = self.file_open(table._loggername, 'a') + 634 else: + 635 logfile = None + 636 if not table._dbt or not self.file_exists(table._dbt): + 637 if table._dbt: + 638 logfile.write('timestamp: %s\n' + 639 % datetime.datetime.today().isoformat()) + 640 logfile.write(query + '\n') + 641 if not fake_migrate: + 642 self.create_sequence_and_triggers(query,table) + 643 table._db.commit() + 644 if table._dbt: + 645 tfile = self.file_open(table._dbt, 'w') + 646 cPickle.dump(sql_fields, tfile) + 647 self.file_close(tfile) + 648 if fake_migrate: + 649 logfile.write('faked!\n') + 650 else: + 651 logfile.write('success!\n') + 652 else: + 653 tfile = self.file_open(table._dbt, 'r') + 654 try: + 655 sql_fields_old = cPickle.load(tfile) + 656 except EOFError: + 657 self.file_close(tfile) + 658 self.file_close(logfile) + 659 raise RuntimeError, 'File %s appears corrupted' % table._dbt + 660 self.file_close(tfile) + 661 if sql_fields != sql_fields_old: + 662 self.migrate_table(table, + 663 sql_fields, sql_fields_old, + 664 sql_fields_aux, logfile, + 665 fake_migrate=fake_migrate) + 666 self.file_close(logfile) + 667 return query +
    668 +
    669 - def migrate_table( + 670 self, + 671 table, + 672 sql_fields, + 673 sql_fields_old, + 674 sql_fields_aux, + 675 logfile, + 676 fake_migrate=False, + 677 ): +
    678 tablename = table._tablename + 679 def fix(item): + 680 k,v=item + 681 if not isinstance(v,dict): + 682 v=dict(type='unkown',sql=v) + 683 return k.lower(),v +
    684 ### make sure all field names are lower case to avoid conflicts + 685 sql_fields = dict(map(fix,sql_fields.items())) + 686 sql_fields_old = dict(map(fix,sql_fields_old.items())) + 687 sql_fields_aux = dict(map(fix,sql_fields_aux.items())) + 688 + 689 keys = sql_fields.keys() + 690 for key in sql_fields_old: + 691 if not key in keys: + 692 keys.append(key) + 693 if self.dbengine == 'mssql': + 694 new_add = '; ALTER TABLE %s ADD ' % tablename + 695 else: + 696 new_add = ', ADD ' + 697 + 698 metadata_change = False + 699 sql_fields_current = copy.copy(sql_fields_old) + 700 for key in keys: + 701 query = None + 702 if not key in sql_fields_old: + 703 sql_fields_current[key] = sql_fields[key] + 704 query = ['ALTER TABLE %s ADD %s %s;' % \ + 705 (tablename, key, + 706 sql_fields_aux[key]['sql'].replace(', ', new_add))] + 707 metadata_change = True + 708 elif self.dbengine == 'sqlite': + 709 if key in sql_fields: + 710 sql_fields_current[key] = sql_fields[key] + 711 metadata_change = True + 712 elif not key in sql_fields: + 713 del sql_fields_current[key] + 714 if not self.dbengine in ('firebird',): + 715 query = ['ALTER TABLE %s DROP COLUMN %s;' % (tablename, key)] + 716 else: + 717 query = ['ALTER TABLE %s DROP %s;' % (tablename, key)] + 718 metadata_change = True + 719 elif sql_fields[key]['sql'] != sql_fields_old[key]['sql'] \ + 720 and not isinstance(table[key].type, SQLCustomType) \ + 721 and not (table[key].type.startswith('reference') and \ + 722 sql_fields[key]['sql'].startswith('INT,') and \ + 723 sql_fields_old[key]['sql'].startswith('INT NOT NULL,')): + 724 sql_fields_current[key] = sql_fields[key] + 725 t = tablename + 726 tt = sql_fields_aux[key]['sql'].replace(', ', new_add) + 727 if not self.dbengine in ('firebird',): + 728 query = ['ALTER TABLE %s ADD %s__tmp %s;' % (t, key, tt), + 729 'UPDATE %s SET %s__tmp=%s;' % (t, key, key), + 730 'ALTER TABLE %s DROP COLUMN %s;' % (t, key), + 731 'ALTER TABLE %s ADD %s %s;' % (t, key, tt), + 732 'UPDATE %s SET %s=%s__tmp;' % (t, key, key), + 733 'ALTER TABLE %s DROP COLUMN %s__tmp;' % (t, key)] + 734 else: + 735 query = ['ALTER TABLE %s ADD %s__tmp %s;' % (t, key, tt), + 736 'UPDATE %s SET %s__tmp=%s;' % (t, key, key), + 737 'ALTER TABLE %s DROP %s;' % (t, key), + 738 'ALTER TABLE %s ADD %s %s;' % (t, key, tt), + 739 'UPDATE %s SET %s=%s__tmp;' % (t, key, key), + 740 'ALTER TABLE %s DROP %s__tmp;' % (t, key)] + 741 metadata_change = True + 742 elif sql_fields[key]['type'] != sql_fields_old[key]['type']: + 743 sql_fields_current[key] = sql_fields[key] + 744 metadata_change = True + 745 + 746 if query: + 747 logfile.write('timestamp: %s\n' + 748 % datetime.datetime.today().isoformat()) + 749 table._db['_lastsql'] = '\n'.join(query) + 750 for sub_query in query: + 751 logfile.write(sub_query + '\n') + 752 if not fake_migrate: + 753 self.execute(sub_query) + 754 # caveat. mysql, oracle and firebird do not allow multiple alter table + 755 # in one transaction so we must commit partial transactions and + 756 # update table._dbt after alter table. + 757 if table._db._adapter.commit_on_alter_table: + 758 table._db.commit() + 759 tfile = self.file_open(table._dbt, 'w') + 760 cPickle.dump(sql_fields_current, tfile) + 761 self.file_close(tfile) + 762 logfile.write('success!\n') + 763 else: + 764 logfile.write('faked!\n') + 765 elif metadata_change: + 766 tfile = self.file_open(table._dbt, 'w') + 767 cPickle.dump(sql_fields_current, tfile) + 768 self.file_close(tfile) + 769 + 770 if metadata_change and \ + 771 not (query and self.dbengine in ('mysql','oracle','firebird')): + 772 table._db.commit() + 773 tfile = self.file_open(table._dbt, 'w') + 774 cPickle.dump(sql_fields_current, tfile) + 775 self.file_close(tfile) + 776 +
    777 - def LOWER(self,first): +
    778 return 'LOWER(%s)' % self.expand(first) +
    779 +
    780 - def UPPER(self,first): +
    781 return 'UPPER(%s)' % self.expand(first) +
    782 +
    783 - def EXTRACT(self,first,what): +
    784 return "EXTRACT(%s FROM %s)" % (what, self.expand(first)) +
    785 +
    786 - def AGGREGATE(self,first,what): +
    787 return "%s(%s)" % (what,self.expand(first)) +
    788 +
    789 - def JOIN(self): +
    790 return 'JOIN' +
    791 +
    792 - def LEFT_JOIN(self): +
    793 return 'LEFT JOIN' +
    794 +
    795 - def RANDOM(self): +
    796 return 'Random()' +
    797 +
    798 - def NOT_NULL(self,default,field_type): +
    799 return 'NOT NULL DEFAULT %s' % self.represent(default,field_type) +
    800 +
    801 - def COALESCE_ZERO(self,first): +
    802 return 'COALESCE(%s,0)' % self.expand(first) +
    803 +
    804 - def ALLOW_NULL(self): +
    805 return '' +
    806 +
    807 - def SUBSTRING(self,field,parameters): +
    808 return 'SUBSTR(%s,%s,%s)' % (self.expand(field), parameters[0], parameters[1]) +
    809 +
    810 - def PRIMARY_KEY(self,key): +
    811 return 'PRIMARY KEY(%s)' % key +
    812 +
    813 - def _drop(self,table,mode): +
    814 return ['DROP TABLE %s;' % table] +
    815 +
    816 - def drop(self, table, mode=''): +
    817 if table._dbt: + 818 logfile = self.file_open(table._loggername, 'a') + 819 queries = self._drop(table, mode) + 820 for query in queries: + 821 if table._dbt: + 822 logfile.write(query + '\n') + 823 self.execute(query) + 824 table._db.commit() + 825 del table._db[table._tablename] + 826 del table._db.tables[table._db.tables.index(table._tablename)] + 827 table._db._update_referenced_by(table._tablename) + 828 if table._dbt: + 829 self.file_delete(table._dbt) + 830 logfile.write('success!\n') +
    831 +
    832 - def _insert(self,table,fields): +
    833 keys = ','.join(f.name for f,v in fields) + 834 values = ','.join(self.expand(v,f.type) for f,v in fields) + 835 return 'INSERT INTO %s(%s) VALUES (%s);' % (table, keys, values) +
    836 +
    837 - def insert(self,table,fields): +
    838 query = self._insert(table,fields) + 839 try: + 840 self.execute(query) + 841 except Exception, e: + 842 if isinstance(e,self.integrity_error_class()): + 843 return None + 844 raise e + 845 if hasattr(table,'_primarykey'): + 846 return dict([(k[0].name, k[1]) for k in fields \ + 847 if k[0].name in table._primarykey]) + 848 id = self.lastrowid(table) + 849 if not isinstance(id,int): + 850 return id + 851 rid = Reference(id) + 852 (rid._table, rid._record) = (table, None) + 853 return rid +
    854 +
    855 - def bulk_insert(self,table,items): +
    856 return [self.insert(table,item) for item in items] +
    857 +
    858 - def NOT(self,first): +
    859 return '(NOT %s)' % self.expand(first) +
    860 +
    861 - def AND(self,first,second): +
    862 return '(%s AND %s)' % (self.expand(first),self.expand(second)) +
    863 +
    864 - def OR(self,first,second): +
    865 return '(%s OR %s)' % (self.expand(first),self.expand(second)) +
    866 +
    867 - def BELONGS(self,first,second): +
    868 if isinstance(second,str): + 869 return '(%s IN (%s))' % (self.expand(first),second[:-1]) + 870 elif second==[] or second==(): + 871 return '(0)' + 872 items =','.join(self.expand(item,first.type) for item in second) + 873 return '(%s IN (%s))' % (self.expand(first),items) +
    874 +
    875 - def LIKE(self,first,second): +
    876 return '(%s LIKE %s)' % (self.expand(first),self.expand(second,'string')) +
    877 +
    878 - def STARTSWITH(self,first,second): +
    879 return '(%s LIKE %s)' % (self.expand(first),self.expand(second+'%','string')) +
    880 +
    881 - def ENDSWITH(self,first,second): +
    882 return '(%s LIKE %s)' % (self.expand(first),self.expand('%'+second,'string')) +
    883 +
    884 - def CONTAINS(self,first,second): +
    885 if first.type in ('string','text'): + 886 key = '%'+str(second).replace('%','%%')+'%' + 887 elif first.type.startswith('list:'): + 888 key = '%|'+str(second).replace('|','||').replace('%','%%')+'|%' + 889 return '(%s LIKE %s)' % (self.expand(first),self.expand(key,'string')) +
    890 +
    891 - def EQ(self,first,second=None): +
    892 if second is None: + 893 return '(%s IS NULL)' % self.expand(first) + 894 return '(%s = %s)' % (self.expand(first),self.expand(second,first.type)) +
    895 +
    896 - def NE(self,first,second=None): +
    897 if second is None: + 898 return '(%s IS NOT NULL)' % self.expand(first) + 899 return '(%s <> %s)' % (self.expand(first),self.expand(second,first.type)) +
    900 +
    901 - def LT(self,first,second=None): +
    902 return '(%s < %s)' % (self.expand(first),self.expand(second,first.type)) +
    903 +
    904 - def LE(self,first,second=None): +
    905 return '(%s <= %s)' % (self.expand(first),self.expand(second,first.type)) +
    906 +
    907 - def GT(self,first,second=None): +
    908 return '(%s > %s)' % (self.expand(first),self.expand(second,first.type)) +
    909 +
    910 - def GE(self,first,second=None): +
    911 return '(%s >= %s)' % (self.expand(first),self.expand(second,first.type)) +
    912 +
    913 - def ADD(self,first,second): +
    914 return '(%s + %s)' % (self.expand(first),self.expand(second,first.type)) +
    915 +
    916 - def SUB(self,first,second): +
    917 return '(%s - %s)' % (self.expand(first),self.expand(second,first.type)) +
    918 +
    919 - def MUL(self,first,second): +
    920 return '(%s * %s)' % (self.expand(first),self.expand(second,first.type)) +
    921 +
    922 - def DIV(self,first,second): +
    923 return '(%s / %s)' % (self.expand(first),self.expand(second,first.type)) +
    924 +
    925 - def MOD(self,first,second): +
    926 return '(%s %% %s)' % (self.expand(first),self.expand(second,first.type)) +
    927 +
    928 - def AS(self,first,second): +
    929 return '%s AS %s' % (self.expand(first),second) +
    930 +
    931 - def ON(self,first,second): +
    932 return '%s ON %s' % (self.expand(first),self.expand(second)) +
    933 +
    934 - def INVERT(self,first): +
    935 return '%s DESC' % self.expand(first) +
    936 +
    937 - def COMMA(self,first,second): +
    938 return '%s, %s' % (self.expand(first),self.expand(second)) +
    939 +
    940 - def expand(self,expression,field_type=None): +
    941 if isinstance(expression,Field): + 942 return str(expression) + 943 elif isinstance(expression, (Expression, Query)): + 944 if not expression.second is None: + 945 return expression.op(expression.first, expression.second) + 946 elif not expression.first is None: + 947 return expression.op(expression.first) + 948 else: + 949 return expression.op() + 950 elif field_type: + 951 return self.represent(expression,field_type) + 952 elif isinstance(expression,(list,tuple)): + 953 return ','.join([self.represent(item,field_type) for item in expression]) + 954 else: + 955 return str(expression) +
    956 +
    957 - def alias(self,table,alias): +
    958 """ + 959 given a table object, makes a new table object + 960 with alias name. + 961 """ + 962 other = copy.copy(table) + 963 other['_ot'] = other._tablename + 964 other['ALL'] = SQLALL(other) + 965 other['_tablename'] = alias + 966 for fieldname in other.fields: + 967 other[fieldname] = copy.copy(other[fieldname]) + 968 other[fieldname]._tablename = alias + 969 other[fieldname].tablename = alias + 970 other[fieldname].table = other + 971 table._db[alias] = other + 972 return other +
    973 +
    974 - def _truncate(self,table,mode = ''): +
    975 tablename = table._tablename + 976 return ['TRUNCATE TABLE %s %s;' % (tablename, mode or '')] +
    977 +
    978 - def truncate(self,table,mode= ' '): +
    979 # Prepare functions "write_to_logfile" and "close_logfile" + 980 if table._dbt: + 981 logfile = self.file_open(table._loggername, 'a') + 982 else: + 983 class Logfile(object): + 984 def write(self, value): + 985 pass +
    986 def close(self): + 987 pass + 988 logfile = Logfile() + 989 + 990 try: + 991 queries = table._db._adapter._truncate(table, mode) + 992 for query in queries: + 993 logfile.write(query + '\n') + 994 self.execute(query) + 995 table._db.commit() + 996 logfile.write('success!\n') + 997 finally: + 998 logfile.close() + 999 +
    1000 - def _update(self,tablename,query,fields): +
    1001 if query: +1002 sql_w = ' WHERE ' + self.expand(query) +1003 else: +1004 sql_w = '' +1005 sql_v = ','.join(['%s=%s' % (field.name, self.expand(value,field.type)) for (field,value) in fields]) +1006 return 'UPDATE %s SET %s%s;' % (tablename, sql_v, sql_w) +
    1007 +
    1008 - def update(self,tablename,query,fields): +
    1009 sql = self._update(tablename,query,fields) +1010 self.execute(sql) +1011 try: +1012 return self.cursor.rowcount +1013 except: +1014 return None +
    1015 +
    1016 - def _delete(self,tablename, query): +
    1017 if query: +1018 sql_w = ' WHERE ' + self.expand(query) +1019 else: +1020 sql_w = '' +1021 return 'DELETE FROM %s%s;' % (tablename, sql_w) +
    1022 +
    1023 - def delete(self,tablename,query): +
    1024 sql = self._delete(tablename,query) +1025 ### special code to handle CASCADE in SQLite +1026 db = self.db +1027 table = db[tablename] +1028 if self.dbengine=='sqlite' and table._referenced_by: +1029 deleted = [x[table._id.name] for x in db(query).select(table._id)] +1030 ### end special code to handle CASCADE in SQLite +1031 self.execute(sql) +1032 try: +1033 counter = self.cursor.rowcount +1034 except: +1035 counter = None +1036 ### special code to handle CASCADE in SQLite +1037 if self.dbengine=='sqlite' and counter: +1038 for tablename,fieldname in table._referenced_by: +1039 f = db[tablename][fieldname] +1040 if f.type=='reference '+table._tablename and f.ondelete=='CASCADE': +1041 db(db[tablename][fieldname].belongs(deleted)).delete() +1042 ### end special code to handle CASCADE in SQLite +1043 return counter +
    1044 +
    1045 - def get_table(self,query): +
    1046 tablenames = self.tables(query) +1047 if len(tablenames)==1: +1048 return tablenames[0] +1049 elif len(tablenames)<1: +1050 raise RuntimeError, "No table selected" +1051 else: +1052 raise RuntimeError, "Too many tables selected" +
    1053 +
    1054 - def _select(self, query, fields, attributes): +
    1055 for key in set(attributes.keys())-set(('orderby','groupby','limitby', +1056 'required','cache','left', +1057 'distinct','having', 'join')): +1058 raise SyntaxError, 'invalid select attribute: %s' % key +1059 # ## if not fields specified take them all from the requested tables +1060 new_fields = [] +1061 for item in fields: +1062 if isinstance(item,SQLALL): +1063 new_fields += item.table +1064 else: +1065 new_fields.append(item) +1066 fields = new_fields +1067 tablenames = self.tables(query) +1068 query = self.filter_tenant(query,tablenames) +1069 if not fields: +1070 for table in tablenames: +1071 for field in self.db[table]: +1072 fields.append(field) +1073 else: +1074 for field in fields: +1075 if isinstance(field,basestring) and table_field.match(field): +1076 tn,fn = field.split('.') +1077 field = self.db[tn][fn] +1078 for tablename in self.tables(field): +1079 if not tablename in tablenames: +1080 tablenames.append(tablename) +1081 if len(tablenames) < 1: +1082 raise SyntaxError, 'Set: no tables selected' +1083 sql_f = ', '.join(map(self.expand,fields)) +1084 self._colnames = [c.strip() for c in sql_f.split(', ')] +1085 if query: +1086 sql_w = ' WHERE ' + self.expand(query) +1087 else: +1088 sql_w = '' +1089 sql_o = '' +1090 sql_s = '' +1091 left = attributes.get('left', False) +1092 inner_join = attributes.get('join', False) +1093 distinct = attributes.get('distinct', False) +1094 groupby = attributes.get('groupby', False) +1095 orderby = attributes.get('orderby', False) +1096 having = attributes.get('having', False) +1097 limitby = attributes.get('limitby', False) +1098 if distinct is True: +1099 sql_s += 'DISTINCT' +1100 elif distinct: +1101 sql_s += 'DISTINCT ON (%s)' % distinct +1102 if inner_join: +1103 icommand = self.JOIN() +1104 if not isinstance(inner_join, (tuple, list)): +1105 inner_join = [inner_join] +1106 ijoint = [t._tablename for t in inner_join if not isinstance(t,Expression)] +1107 ijoinon = [t for t in inner_join if isinstance(t, Expression)] +1108 ijoinont = [t.first._tablename for t in ijoinon] +1109 iexcluded = [t for t in tablenames if not t in ijoint + ijoinont] +1110 if left: +1111 join = attributes['left'] +1112 command = self.LEFT_JOIN() +1113 if not isinstance(join, (tuple, list)): +1114 join = [join] +1115 joint = [t._tablename for t in join if not isinstance(t,Expression)] +1116 joinon = [t for t in join if isinstance(t, Expression)] +1117 #patch join+left patch (solves problem with ordering in left joins) +1118 tables_to_merge={} +1119 [tables_to_merge.update(dict.fromkeys(self.tables(t))) for t in joinon] +1120 joinont = [t.first._tablename for t in joinon] +1121 [tables_to_merge.pop(t) for t in joinont if t in tables_to_merge] +1122 important_tablenames = joint + joinont + tables_to_merge.keys() +1123 excluded = [t for t in tablenames if not t in important_tablenames ] +1124 def alias(t): +1125 return str(self.db[t]) +
    1126 if inner_join and not left: +1127 sql_t = ', '.join(alias(t) for t in iexcluded) +1128 for t in ijoinon: +1129 sql_t += ' %s %s' % (icommand, str(t)) +1130 elif not inner_join and left: +1131 sql_t = ', '.join([alias(t) for t in excluded + tables_to_merge.keys()]) +1132 if joint: +1133 sql_t += ' %s %s' % (command, ','.join([t for t in joint])) +1134 for t in joinon: +1135 sql_t += ' %s %s' % (command, str(t)) +1136 elif inner_join and left: +1137 sql_t = ','.join([alias(t) for t in excluded + \ +1138 tables_to_merge.keys() if t in iexcluded ]) +1139 for t in ijoinon: +1140 sql_t += ' %s %s' % (icommand, str(t)) +1141 if joint: +1142 sql_t += ' %s %s' % (command, ','.join([t for t in joint])) +1143 for t in joinon: +1144 sql_t += ' %s %s' % (command, str(t)) +1145 else: +1146 sql_t = ', '.join(alias(t) for t in tablenames) +1147 if groupby: +1148 if isinstance(groupby, (list, tuple)): +1149 groupby = xorify(groupby) +1150 sql_o += ' GROUP BY %s' % self.expand(groupby) +1151 if having: +1152 sql_o += ' HAVING %s' % attributes['having'] +1153 if orderby: +1154 if isinstance(orderby, (list, tuple)): +1155 orderby = xorify(orderby) +1156 if str(orderby) == '<random>': +1157 sql_o += ' ORDER BY %s' % self.RANDOM() +1158 else: +1159 sql_o += ' ORDER BY %s' % self.expand(orderby) +1160 if limitby: +1161 if not orderby and tablenames: +1162 sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%(t,x) for t in tablenames for x in ((hasattr(self.db[t],'_primarykey') and self.db[t]._primarykey) or [self.db[t]._id.name])]) +1163 # oracle does not support limitby +1164 return self.select_limitby(sql_s, sql_f, sql_t, sql_w, sql_o, limitby) +1165 +
    1166 - def select_limitby(self, sql_s, sql_f, sql_t, sql_w, sql_o, limitby): +
    1167 if limitby: +1168 (lmin, lmax) = limitby +1169 sql_o += ' LIMIT %i OFFSET %i' % (lmax - lmin, lmin) +1170 return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o) +
    1171 +
    1172 - def select(self,query,fields,attributes): +
    1173 """ +1174 Always returns a Rows object, even if it may be empty +1175 """ +1176 def response(sql): +1177 self.execute(sql) +1178 return self.cursor.fetchall() +
    1179 sql = self._select(query,fields,attributes) +1180 if attributes.get('cache', None): +1181 (cache_model, time_expire) = attributes['cache'] +1182 del attributes['cache'] +1183 key = self.uri + '/' + sql +1184 key = (key<=200) and key or hashlib.md5(key).hexdigest() +1185 rows = cache_model(key, lambda: response(sql), time_expire) +1186 else: +1187 rows = response(sql) +1188 if isinstance(rows,tuple): +1189 rows = list(rows) +1190 limitby = attributes.get('limitby',None) or (0,) +1191 rows = self.rowslice(rows,limitby[0],None) +1192 return self.parse(rows,self._colnames) +1193 +
    1194 - def _count(self,query,distinct=None): +
    1195 tablenames = self.tables(query) +1196 if query: +1197 sql_w = ' WHERE ' + self.expand(query) +1198 else: +1199 sql_w = '' +1200 sql_t = ','.join(tablenames) +1201 if distinct: +1202 if isinstance(distinct,(list,tuple)): +1203 distinct = xorify(distinct) +1204 sql_d = self.expand(distinct) +1205 return 'SELECT count(DISTINCT %s) FROM %s%s' % (sql_d, sql_t, sql_w) +1206 return 'SELECT count(*) FROM %s%s' % (sql_t, sql_w) +
    1207 +
    1208 - def count(self,query,distinct=None): +
    1209 self.execute(self._count(query,distinct)) +1210 return self.cursor.fetchone()[0] +
    1211 +1212 +
    1213 - def tables(self,query): +
    1214 tables = set() +1215 if isinstance(query, Field): +1216 tables.add(query.tablename) +1217 elif isinstance(query, (Expression, Query)): +1218 if query.first!=None: +1219 tables = tables.union(self.tables(query.first)) +1220 if query.second!=None: +1221 tables = tables.union(self.tables(query.second)) +1222 return list(tables) +
    1223 +
    1224 - def commit(self): +
    1225 return self.connection.commit() +
    1226 +
    1227 - def rollback(self): +
    1228 return self.connection.rollback() +
    1229 +
    1230 - def close(self): +
    1231 return self.connection.close() +
    1232 +
    1233 - def distributed_transaction_begin(self,key): +
    1234 return +
    1235 +
    1236 - def prepare(self,key): +
    1237 self.connection.prepare() +
    1238 +
    1239 - def commit_prepared(self,key): +
    1240 self.connection.commit() +
    1241 +
    1242 - def rollback_prepared(self,key): +
    1243 self.connection.rollback() +
    1244 +
    1245 - def concat_add(self,table): +
    1246 return ', ADD ' +
    1247 +
    1248 - def constraint_name(self, table, fieldname): +
    1249 return '%s_%s__constraint' % (table,fieldname) +
    1250 +
    1251 - def create_sequence_and_triggers(self, query, table, **args): +
    1252 self.execute(query) +
    1253 +
    1254 - def log_execute(self,*a,**b): +
    1255 self.db._lastsql = a[0] +1256 t0 = time.time() +1257 ret = self.cursor.execute(*a,**b) +1258 self.db._timings.append((a[0],time.time()-t0)) +1259 return ret +
    1260 +
    1261 - def execute(self,*a,**b): +
    1262 return self.log_execute(*a, **b) +
    1263 +
    1264 - def represent(self, obj, fieldtype): +
    1265 if isinstance(obj,CALLABLETYPES): +1266 obj = obj() +1267 if isinstance(fieldtype, SQLCustomType): +1268 return fieldtype.encoder(obj) +1269 if isinstance(obj, (Expression, Field)): +1270 return str(obj) +1271 if fieldtype.startswith('list:'): +1272 if not obj: +1273 obj = [] +1274 if not isinstance(obj, (list, tuple)): +1275 obj = [obj] +1276 if isinstance(obj, (list, tuple)): +1277 obj = bar_encode(obj) +1278 if obj is None: +1279 return 'NULL' +1280 if obj == '' and not fieldtype[:2] in ['st', 'te', 'pa', 'up']: +1281 return 'NULL' +1282 r = self.represent_exceptions(obj,fieldtype) +1283 if r != None: +1284 return r +1285 if fieldtype == 'boolean': +1286 if obj and not str(obj)[:1].upper() in ['F', '0']: +1287 return "'T'" +1288 else: +1289 return "'F'" +1290 if fieldtype == 'id' or fieldtype == 'integer': +1291 return str(int(obj)) +1292 if fieldtype.startswith('decimal'): +1293 return str(obj) +1294 elif fieldtype.startswith('reference'): # reference +1295 if fieldtype.find('.')>0: +1296 return repr(obj) +1297 elif isinstance(obj, (Row, Reference)): +1298 return str(obj['id']) +1299 return str(int(obj)) +1300 elif fieldtype == 'double': +1301 return repr(float(obj)) +1302 if isinstance(obj, unicode): +1303 obj = obj.encode(self.db_codec) +1304 if fieldtype == 'blob': +1305 obj = base64.b64encode(str(obj)) +1306 elif fieldtype == 'date': +1307 if isinstance(obj, (datetime.date, datetime.datetime)): +1308 obj = obj.isoformat()[:10] +1309 else: +1310 obj = str(obj) +1311 elif fieldtype == 'datetime': +1312 if isinstance(obj, datetime.datetime): +1313 obj = obj.isoformat()[:19].replace('T',' ') +1314 elif isinstance(obj, datetime.date): +1315 obj = obj.isoformat()[:10]+' 00:00:00' +1316 else: +1317 obj = str(obj) +1318 elif fieldtype == 'time': +1319 if isinstance(obj, datetime.time): +1320 obj = obj.isoformat()[:10] +1321 else: +1322 obj = str(obj) +1323 if not isinstance(obj,str): +1324 obj = str(obj) +1325 try: +1326 obj.decode(self.db_codec) +1327 except: +1328 obj = obj.decode('latin1').encode(self.db_codec) +1329 return "'%s'" % obj.replace("'", "''") +
    1330 +
    1331 - def represent_exceptions(self, obj, fieldtype): +
    1332 return None +
    1333 +
    1334 - def lastrowid(self,table): +
    1335 return None +
    1336 +
    1337 - def integrity_error_class(self): +
    1338 return type(None) +
    1339 +
    1340 - def rowslice(self,rows,minimum=0,maximum=None): +
    1341 """ by default this function does nothing, overload when db does not do slicing """ +1342 return rows +
    1343 +
    1344 - def parse(self, rows, colnames, blob_decode=True): +
    1345 db = self.db +1346 virtualtables = [] +1347 new_rows = [] +1348 for (i,row) in enumerate(rows): +1349 new_row = Row() +1350 for j,colname in enumerate(colnames): +1351 value = row[j] +1352 if not table_field.match(colnames[j]): +1353 if not '_extra' in new_row: +1354 new_row['_extra'] = Row() +1355 new_row['_extra'][colnames[j]] = value +1356 select_as_parser = re.compile("\s+AS\s+(\S+)") +1357 new_column_name = select_as_parser.search(colnames[j]) +1358 if not new_column_name is None: +1359 column_name = new_column_name.groups(0) +1360 setattr(new_row,column_name[0],value) +1361 continue +1362 (tablename, fieldname) = colname.split('.') +1363 table = db[tablename] +1364 field = table[fieldname] +1365 field_type = field.type +1366 if field.type != 'blob' and isinstance(value, str): +1367 try: +1368 value = value.decode(db._db_codec) +1369 except Exception: +1370 pass +1371 if isinstance(value, unicode): +1372 value = value.encode('utf-8') +1373 if not tablename in new_row: +1374 colset = new_row[tablename] = Row() +1375 if tablename not in virtualtables: +1376 virtualtables.append(tablename) +1377 else: +1378 colset = new_row[tablename] +1379 +1380 if isinstance(field_type, SQLCustomType): +1381 colset[fieldname] = field_type.decoder(value) +1382 # field_type = field_type.type +1383 elif not isinstance(field_type, str) or value is None: +1384 colset[fieldname] = value +1385 elif isinstance(field_type, str) and \ +1386 field_type.startswith('reference'): +1387 referee = field_type[10:].strip() +1388 if not '.' in referee: +1389 colset[fieldname] = rid = Reference(value) +1390 (rid._table, rid._record) = (db[referee], None) +1391 else: ### reference not by id +1392 colset[fieldname] = value +1393 elif field_type == 'boolean': +1394 if value == True or str(value)[:1].lower() == 't': +1395 colset[fieldname] = True +1396 else: +1397 colset[fieldname] = False +1398 elif field_type == 'date' \ +1399 and (not isinstance(value, datetime.date)\ +1400 or isinstance(value, datetime.datetime)): +1401 (y, m, d) = map(int, str(value)[:10].strip().split('-')) +1402 colset[fieldname] = datetime.date(y, m, d) +1403 elif field_type == 'time' \ +1404 and not isinstance(value, datetime.time): +1405 time_items = map(int,str(value)[:8].strip().split(':')[:3]) +1406 if len(time_items) == 3: +1407 (h, mi, s) = time_items +1408 else: +1409 (h, mi, s) = time_items + [0] +1410 colset[fieldname] = datetime.time(h, mi, s) +1411 elif field_type == 'datetime'\ +1412 and not isinstance(value, datetime.datetime): +1413 (y, m, d) = map(int,str(value)[:10].strip().split('-')) +1414 time_items = map(int,str(value)[11:19].strip().split(':')[:3]) +1415 if len(time_items) == 3: +1416 (h, mi, s) = time_items +1417 else: +1418 (h, mi, s) = time_items + [0] +1419 colset[fieldname] = datetime.datetime(y, m, d, h, mi, s) +1420 elif field_type == 'blob' and blob_decode: +1421 colset[fieldname] = base64.b64decode(str(value)) +1422 elif field_type.startswith('decimal'): +1423 decimals = int(field_type[8:-1].split(',')[-1]) +1424 if self.dbengine == 'sqlite': +1425 value = ('%.' + str(decimals) + 'f') % value +1426 if not isinstance(value, decimal.Decimal): +1427 value = decimal.Decimal(str(value)) +1428 colset[fieldname] = value +1429 elif field_type.startswith('list:integer'): +1430 if not self.dbengine=='google:datastore': +1431 colset[fieldname] = bar_decode_integer(value) +1432 else: +1433 colset[fieldname] = value +1434 elif field_type.startswith('list:reference'): +1435 if not self.dbengine=='google:datastore': +1436 colset[fieldname] = bar_decode_integer(value) +1437 else: +1438 colset[fieldname] = value +1439 elif field_type.startswith('list:string'): +1440 if not self.dbengine=='google:datastore': +1441 colset[fieldname] = bar_decode_string(value) +1442 else: +1443 colset[fieldname] = value +1444 else: +1445 colset[fieldname] = value +1446 if field_type == 'id': +1447 id = colset[field.name] +1448 colset.update_record = lambda _ = (colset, table, id), **a: update_record(_, a) +1449 colset.delete_record = lambda t = table, i = id: t._db(t._id==i).delete() +1450 for (referee_table, referee_name) in \ +1451 table._referenced_by: +1452 s = db[referee_table][referee_name] +1453 if not referee_table in colset: +1454 # for backward compatibility +1455 colset[referee_table] = Set(db, s == id) +1456 ### add new feature? +1457 ### colset[referee_table+'_by_'+refree_name] = Set(db, s == id) +1458 colset['id'] = id +1459 new_rows.append(new_row) +1460 rowsobj = Rows(db, new_rows, colnames, rawrows=rows) +1461 for tablename in virtualtables: +1462 for item in db[tablename].virtualfields: +1463 try: +1464 rowsobj = rowsobj.setvirtualfields(**{tablename:item}) +1465 except KeyError: +1466 # to avoid breaking virtualfields when partial select +1467 pass +1468 return rowsobj +
    1469 +
    1470 - def filter_tenant(self,query,tablenames): +
    1471 fieldname = self.db._request_tenant +1472 for tablename in tablenames: +1473 table = self.db[tablename] +1474 if fieldname in table: +1475 default = table[fieldname].default +1476 if default!=None: +1477 query = query&(table[fieldname]==default) +1478 return query +
    1479 +1480 ################################################################################### +1481 # List of all the available adapters, they all extend BaseAdapter +1482 ################################################################################### +1483 +
    1484 -class SQLiteAdapter(BaseAdapter): +
    1485 +1486 driver = globals().get('sqlite3',None) +1487 +
    1488 - def EXTRACT(self,field,what): +
    1489 return "web2py_extract('%s',%s)" % (what,self.expand(field)) +
    1490 +1491 @staticmethod +
    1492 - def web2py_extract(lookup, s): +
    1493 table = { +1494 'year': (0, 4), +1495 'month': (5, 7), +1496 'day': (8, 10), +1497 'hour': (11, 13), +1498 'minute': (14, 16), +1499 'second': (17, 19), +1500 } +1501 try: +1502 (i, j) = table[lookup] +1503 return int(s[i:j]) +1504 except: +1505 return None +
    1506 +
    1507 - def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', +1508 credential_decoder=lambda x:x, driver_args={}, +1509 adapter_args={}): +
    1510 self.db = db +1511 self.dbengine = "sqlite" +1512 self.uri = uri +1513 self.pool_size = pool_size +1514 self.folder = folder +1515 self.db_codec = db_codec +1516 self.find_or_make_work_folder() +1517 path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8' +1518 if uri.startswith('sqlite:memory'): +1519 dbpath = ':memory:' +1520 else: +1521 dbpath = uri.split('://')[1] +1522 if dbpath[0] != '/': +1523 dbpath = os.path.join(self.folder.decode(path_encoding).encode('utf8'),dbpath) +1524 if not 'check_same_thread' in driver_args: +1525 driver_args['check_same_thread'] = False +1526 def connect(dbpath=dbpath, driver_args=driver_args): +1527 return self.driver.Connection(dbpath, **driver_args) +
    1528 self.pool_connection(connect) +1529 self.cursor = self.connection.cursor() +1530 self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract) +
    1531 +
    1532 - def _truncate(self,table,mode = ''): +
    1533 tablename = table._tablename +1534 return ['DELETE FROM %s;' % tablename, +1535 "DELETE FROM sqlite_sequence WHERE name='%s';" % tablename] +
    1536 +
    1537 - def lastrowid(self,table): +
    1538 return self.cursor.lastrowid +
    1539 +1540 +
    1541 -class JDBCSQLiteAdapter(SQLiteAdapter): +
    1542 +1543 driver = globals().get('zxJDBC',None) +1544 +
    1545 - def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8', +1546 credential_decoder=lambda x:x, driver_args={}, +1547 adapter_args={}): +
    1548 self.db = db +1549 self.dbengine = "sqlite" +1550 self.uri = uri +1551 self.pool_size = pool_size +1552 self.folder = folder +1553 self.db_codec = db_codec +1554 self.find_or_make_work_folder() +1555 path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8' +1556 if uri.startswith('sqlite:memory'): +1557 dbpath = ':memory:' +1558 else: +1559 dbpath = uri.split('://')[1] +1560 if dbpath[0] != '/': +1561 dbpath = os.path.join(self.folder.decode(path_encoding).encode('utf8'),dbpath) +1562 def connect(dbpath=dbpath,driver_args=driver_args): +1563 return self.driver.connect(java.sql.DriverManager.getConnection('jdbc:sqlite:'+dbpath),**driver_args) +
    1564 self.pool_connection(connect) +1565 self.cursor = self.connection.cursor() +
    1566 # FIXME http://www.zentus.com/sqlitejdbc/custom_functions.html for UDFs +1567 # self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract) +1568 +
    1569 - def execute(self,a): +
    1570 return self.log_execute(a[:-1]) +
    1571 +1572 +
    1573 -class MySQLAdapter(BaseAdapter): +
    1574 +1575 driver = globals().get('pymysql',None) +1576 maxcharlength = 255 +1577 commit_on_alter_table = True +1578 support_distributed_transaction = True +1579 types = { +1580 'boolean': 'CHAR(1)', +1581 'string': 'VARCHAR(%(length)s)', +1582 'text': 'LONGTEXT', +1583 'password': 'VARCHAR(%(length)s)', +1584 'blob': 'LONGBLOB', +1585 'upload': 'VARCHAR(%(length)s)', +1586 'integer': 'INT', +1587 'double': 'DOUBLE', +1588 'decimal': 'NUMERIC(%(precision)s,%(scale)s)', +1589 'date':