diff --git a/CHANGELOG b/CHANGELOG index c938f9c9..be6ae228 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,1014 +1,36 @@ -## EWF v1.5 -> v1.6 (2007) -- 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.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) ## 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. @@ -1096,36 +118,1014 @@ recalled - 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) +## 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.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.94.5 +- fixed a major bug with session introdued in 1.94.1 + +## 1.94.4 +- removed debug print statement that caused problems on GAE and mod_wsgi + +## 1.94.3 +- fixed major bug in auth redirection + +## 1.94.2 +- reverted wrong behavior of auth.requires(condition) in 1.94.1 + +## 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.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.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.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.91.2-1.91.5 +- fixed a problem with deplyment on GAE +- other new dal bug fixes + +## 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.90.6 +- fix issue with pickling new dal Row and Rows. + +## 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.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.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.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.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.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.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.86.3 +- Error reporting on save, thanks Mariano +recalled + +## 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.85.1-3 +- fixed some bugs +- added pyfpdf, thank Mariano + +## 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.83.2 +- mostly cleanup + +## 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.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.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.81.4 +- Fixed gluon.tools to work work with load and base.css to nowrap labels + +## 1.81.3 +- fixed bug in label names in formstyle +- fixed id names in admin test.html page + +## 1.81.2 +- fixed bug in Auth + +## 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.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.79.2 +- solved simplejson imcompatibility problem + +## 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.78.3 +- reverted temporarily to old template system because of backward compatibility issues + +## 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.77.3 +- some cleanup of code in compileapp + +## 1.77.2 +- fixed x-index in calendar +## 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.76.5 +- Fixed a typo in auth that created some registration problems + +## 1.76.4 +- SQLTABLE(db(db.auth_user.id>0).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.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.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.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 0Rows, 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.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.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.68.2 +- Fixing bug with admin and missing crontab +- Fixing bug with rewrite.load on GAE (thanks Willian Wang) + +## 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.67.2 +- Security fix in markdown + +## 1.67.1 +- Bux fixed + +## 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.66 +- new doctypes +- form.vars.newfilename +- new HTML and XHTML helpers +- better IS_LENGTH + +## 1.65.13 +- request.url (thanks Jonathan) +- restored uploadfield_newfilename +- new examples layout nad logo (thanks Mateusz) + +## 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.11 +- Fixed a sqlhtml bug with image upload + +## 1.65.3-10 +- Fixed some small bugs and typos in the docstrings +- Fixed AMF3 support + +## 1.65.2 +- Fixed some small auth bugs +- Field.store(...) + +## 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 +- 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.64.4 +- Som bug fixes +- Informix Support +- response.render(stream) +- SQLFORM.factory +- SQLFORM.widgets.radio and SQLFORM.widgets.checkboxes + +## 1.64.3 +- Some bug fixes + +## 1.64.2 +- New IS_COMPLEX validator, thank Mr. Freeze +- Experimental Informix support +- Autologin on registration + +## 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.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.63-1.63.4 +- no more import gluon. +- support for generic.xxx +- simplejson can handle datetime date and time + +## 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.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.59-1.60 +- fixed lots of small bugs +- routes_in can filter by http_host + +## 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.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.56.1-1.56.4 +- fixing lots of small bugs with tool and languages +- jquery.1.3.2 + +## + +- 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) + +## ## ## and use it in all your tables + +- db.define_table('mytable',db.Field('somefield'),timestamp) + +## 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)) + +## 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] + +## make a display form in two possible ways: +- form=SQLFORM(db.circle,record,readonly=True) +- form=SQLFORM(db.circle,record_id,readonly=True) + +## make an update form in two possible ways: +- form=SQLFORM(db.circle,record) +- form=SQLFORM(db.circle,record_id) + +## make a create form in two possible ways: +- form=SQLFORM(db.circle) +- form=SQLFORM(db.circle,0) + +## 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 the radius appear in bold in display and table +- db.circle.radius.represent=lambda value: B(value) + +## automatically timestamp when record is modified +- db.circle.modified_on.update=request.now + +## automatically timestamp when record cretaed +- db.circle.modified_on.default=request.now + +## do not show now in display forms +- db.circle.modified_on.readable=False + +## do not show area in create/edit forms +- db.circle.area.writable=False + +- ## add a comment in the forms +- db.circle.area.comment="(this is a comment)" + +## 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: + +## 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.54 +- fixed minor bugs + +## 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.52 +- Fixed a minor bug with _extra[key] and key not str. +- check for upgrade via ajax + +## 1.51 +- Fixed more bugs introduced in 1.49 (sql _extra and html select) +- support for sqlite:memory: + +## 1.50 +- Fixed some bugs introduced in 1.49 + +## 1.49 +- fixed a bug with taskbar widget, thanks Mark +- fixed a bug with form.latest +- made many DIV methods private (_) + + +## 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.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 + +## web2py 1.31-1.41 +- some bug fixes, mostly better appengine support +- mssql support +- firebird support +- widgets support +- connection pools + +## web2py 1.30 +- added flv to contenttype +- added support for appengine + +## 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.28 +- fixed bug with belongs, faster sql.py +- included jquery.js +- minor aestetical fixes +- sortable.js is gone + +## 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.26 +- added shell.py (thanks Limodou!) +- added memcache support + +## web2py 1.22-1.25 +- fixed minor bugs, added IS_NULL_OR + +## 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.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.19 +- minor typos + +## 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 v1.17 +- I posted v1.16 too soon. v1.17 was released after 1h to fix some bugs. + +## 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(). + +## 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') + +## Gluon v1.14 +- Fixed a bug fix in URLs + +## 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.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.11 +- appadmin allows to keep or delete uploaded files + +## 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.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.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.5 +- -> in errors.html +- replace('//','////') in sub in template.py + +## 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.3 +- added IS_IN_DB, IS_NOT_IN_DB and updated examples accordingly + +## 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.0 -> v1.1 +- bug in sqlhtml with JOINS queries + +## EWF v1.7 -> Gluon v1.0 +- Name change +- Improved layout.html + +## 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.5 -> v1.6 (2007) +- load and save .py in ascii, avoids problem with LF+CR on windows +- added path.join in compileapp, fixed problem with Windows compileapp + diff --git a/VERSION b/VERSION index 682a00c5..5d1f5d99 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.3 (2011-11-23 16:45:50) dev +Version 1.99.3 (2011-11-23 16:55:49) dev