## 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-1.98.2 - 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 ## 1.99.1 - gluon/contrib/simplejsonrpc.py - gluon/contrib/redis_cache.py - support for A(name,callback=url,target='id',delete='tr') - support for A(name,component=url,target='id',delete='tr') - new pip installer, thanks Chris Steel - isapiwsgihandler.py - dal expression.coalesce(*options) - gluon/contrib/simplejsonrpc.py, thanks Mariano - expire_sessions.py respects expiration time, thanks iceberg - addressed this issue: http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/ - x509 support (thanks Michele) - form.process() and for.validate() - rocket upgrade (1.2.4) - jQuery upgrade (1.6.3) - new syntax rows[i]('tablename.fieldname') - new query syntax field.contains(list,all=True or False) - new SQLFORM.grid and SQLFORM.smartgrid (should replace crud.search and crud.select) - support for natural language queries (english only) in SQLFORM.grid - support for computed columns and additional links in SQLFORM.grid - new style virtual fields (experimental): db.table.field=Field.Lazy(...) - request.utcnow - cleaner/simpler welcome/models/db.py and welcome layout.html - response.include_meta() and response.include_files(), thanks Denes - dal auto-reconnect on time-out connections - COL and COLGROUP helpers - addresed OWASP #10, thanks Anthony and Eric - auth.settings.login_after_registration=True - detection of mobile devices and @mobilize helper (view.mobile.html), thanks Angelo - experimental gluon/scheduler.py - scripts/make_min_web2py.py - crud.search has more options, thanks Denes - many bug fixes (thanks Jonathan, Michele, Fran and others)