Skip to content


Subversion checkout URL

You can clone with
Download ZIP
GlobaLeaks web2py fork
Python JavaScript Other
Tree: 75f84697c3

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.



To start web2py there is NO NEED to install it. Just unzip and do:

> python

Thats is it!!!

## web2py file structure

start web2py with:

        Makefile                   ## make all and make app                  ## the startup script (*)              ## 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               ## used by py2app to make OSX executable               ## used by py2app to make Winows executble             ## 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

## 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 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
- <form> -> <form method="post"> in errors.html
- replace('//','////') in sub in

## Gluon v1.8
- no more chdir (thread unsafe)
- no more sys.stdout (thread unsafe)
- response.body is StringIO()
- admin/default/site informs about upgrade
- (optional)

## Gluon v1.9
- allow "count(*)" in select
- db.execute()
- fixed problem with continue and return in template
- removed try: ... except in
- 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 
- handles NULL values properly
- unicode support (data always stored in utf-8)
- '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
- 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
- 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 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.
- now uses a request.folder absolute path when not 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/ controller for docs.

## Gluon v1.14
- Fixed a bug fix in URLs

## Gluon v1.15
- New try:... except. in gluon/ 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.
- instead of
- 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 (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 1.28
- fixed bug with belongs, faster
- 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
- 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( 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
-"(this is a comment)"

##  do not show area in create/edit forms

-  ##  do not show now in display forms

##  automatically timestamp when record cretaed

##  automatically timestamp when record is modified

##  make the radius appear in bold in display and table
- value: B(value)

##  make a form that automatically computes area
- pi=3.1415
- form=SQLFOM(
- 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(
- form=SQLFORM(,0)

##  make an update form in two possible ways:
- form=SQLFORM(,record)
- form=SQLFORM(,record_id)

##  make a display form in two possible ways:
- form=SQLFORM(,record,readonly=True)
- form=SQLFORM(,record_id,readonly=True)

##  so now you can do...

- form=SQLFORM(,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,
-                 ,
-             SQLField('modified_on','datetime',
-                           writable=False,
-                 ,

## 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,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 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

## 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/ 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
- are now translated without T
- if then request.env.web2py_original_uri
- db.table.field.isattachment = True
- internationalizaiton of admin by Yair
- 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
- 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-
-   java -jar jython-xxx.jar
-   export CLASSPATH=$CLASSPATH:/Users/mdipierro/jython2.5rc3/sqlite-jdbc-
-   cd web2py
-   ../jython2.5rc3/jython

## 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
- and SQLFORM.widgets.checkboxes

## 1.65
- reST docstrings for Sphinx, thanks Hans
- gluon/conrtib/login_methods/ 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/ (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

## 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 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.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/
- 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 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, 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
- 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 -S app -M -R -A arg1 arg2 arg3
- T("%(a)s") % dict(a="hello")

## 1.74.8
- IS_SLUG, thanks Gustavo and Jonathan
- -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
- new
- 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,T), thanks Richard

## 1.75.3
- added support for PAM authentican for apps and for admin

## 1.75.4
- customizable BEAUTIFY, thanks John

## 1.75.5
- fixed behaviour with, 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 0<year
- allow to disable editarea onload, thanks Alex

## 1.76.1
- editarea 0.8.2 + zencoding
- new (better) cron locking meachnism
- no storing session cookies on session.forget(), thank you Alvaro
- routes_apps_raw allows disabling of request.args validation, thanks Jonathan and Denes
- fixed problem with edit_languages ad multiple tabs, thanks Iceberg
- crud captcha, thanks you Nathan
- softcron disabled by default in wsgihandler and fcgihandler

## 1.76.2-1.76.3
- major fix in cron (will I ever get this 100% right?)
- fix in delete for GAE
- auth.settings.login_captcha and auth.settings.register_captcha
- crud.settings.create_captcha and  crud.settings.update_captcha
- automatic update button in admin 

## 1.76.4
- SQLTABLE(db(>0).select(),headers='fieldname:capitalize')
- Oracle limitby improved (thanks Sergey)
- fixed migrations in Firebird, thanks Jose Jachuf
- gluon/contrib/login_methods/ (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
- 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
- -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
-, 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 and, thanks Marcello Della Longa
- Many Bug fixes:
- improved support for DAL and joins in postgresql/oracle, thanks Nico de Groot
- bux fixex in, thanks Ian
- fixed an issue with registration_key==None, thanks Jay Kelkar
- fixed bug in, 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 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)
- zh-tw and better internationalization page, thanks Daniel Lin and Iceberg
- better, 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/
- 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 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='<html>...</html>', ....)
- 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/, thanks Falko Krause and Ron McOuat 
- scripts/, 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( both suported and equivalent to db(>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/ for integration between CAS and Auth.

## 1.86.3
- Error reporting on save, thanks Mariano

## 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/
- 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)
- -J for running cron (thanks Jonathan Lundell)
- fixed 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
- 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/ (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/
- 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
- wizard can download plugins
- better json serilization (object.custom_json)
- better xml serialization (object.custom_xml)
- better formstyle support
- better (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, thanks meredyk
- importved pyfpdf
- domain check in, thanks Gyuris
- added change_password_onvalidation and change_password_onaccept
- DAL(...,migrate_enabled=True)
- login_methods/, 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()
- 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/<controller>/ and models/<controller>/<function>/
- 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 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/
- 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, thanks Mart
- improved translation (frech in particuler), thanks Pierre
- improved, 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/
- gluon/contrib/
- 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
- dal expression.coalesce(*options)
- gluon/contrib/, thanks Mariano
- respects expiration time, thanks iceberg
- addressed this issue:
- 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 and
- 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/ 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 (, thanks Angelo
- experimental gluon/
- scripts/
- has more options, thanks Denes
- many bug fixes (thanks Jonathan, Michele, Fran and others)
Something went wrong with that request. Please try again.