source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/CHANGELOG

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 65.8 KB
Line 
1## 2.19.0
2- new command line options (Thanks Paolo Pastori)
3
4OLD NAME                   NEW NAME
5==================         ==================
6--debug                     --log_level
7--nogui                     --no_gui
8--ssl_private_key           --server_key
9--ssl_certificate           --server_cert
10--minthreads                --min_threads
11--maxthreads                --max_threads
12--profiler                  --profiler_dir
13--run-cron                  --with_cron
14--softcron                  --soft_cron
15--cron                      --cron_run
16--cronjob *                 --cron_job *
17--test                      --run_doctests
18                            --add_options
19                            --interface
20                            --crontab
21
22## 2.18.1-2.18.5
23- pydal 19.04
24- made template its own module (Yet Another Template Language)
25- improved python 3.4-3.7 support
26- better regular expressions
27- bug fixes
28
29## 2.17.1-2
30- pydal 18.08
31- many small bug fixes
32
33## 2.16.1
34- pydal 17.11
35- bootstrap 4
36- better welcome examples
37- many bug fixes
38
39## 2.15.1-4
40- pydal 17.08
41- dropped support for python 2.6
42- dropped web shell
43- experimental python 3 support
44- experimental authapi for service login
45- allow ajax file uploads
46- more tests
47- more pep8 compliance
48- d3.js model visulization
49- improved scheduler
50- is_email support for internationalized Domain Names
51- improved used of cookies with CookieJar
52- SQLFORM.grid(showblobs=True)
53- import JS events (added w2p.componentBegin event)
54- added support for CASv3
55- allow first_name and last_name placeholders in verify_email message
56- added three-quote support in markmin
57- updated pg8000 driver (but we still recommend psycopg2)
58- compiled views use . separator not _ separator (must recompile code)
59- better serbian, french, and catalan translations
60- speed improvements (refactor of compileapp and pyc caching)
61- removed web shell (never worked as intended)
62- allow Expose(..., follow_symlink_out=False).
63- Updated fpdf to latest version
64- JWT support
65- import fabfile for remote deployment
66- scheduler new feature: you can now specify intervals with cron
67- gluon/* removed from sys.path. Applications relying on statements like e.g.
68  "from storage import Storage"
69  will need to be rewritten with
70  "from gluon.storage import Storage"
71- tests can only be run with the usual web2py.py --run_system_tests OR with
72  python -m unittest -v gluon.tests on the root dir
73- jQuery 3.2.1
74- PyDAL 17.07 including:
75  allow jsonb support for postgres
76  correctly configure adapters that need connection for configuration
77  better caching
78  updated IMAP adapter methods to new API
79  experimental suport for joinable subselects
80  improved Teradata support
81  improved mongodb support
82  overall refactoring
83  experimental support for Google Cloud SQL v2
84  new pymysql driver
85
86## 2.14.6
87
88- Increased test coverage (thanks Richard)
89- Fixed some newly discovered security issues in admin:
90  CSRF vulnerability in admin that allows disabling apps
91  Brute force password attack vulnerability in admin
92  (thanks Narendra and Leonel)
93
94## 2.14.1-5
95
96- fixed two major security issues that caused the examples app to leak information
97- new Auth(…,host_names=[…]) to prevent host header injection
98- improved scheduler
99- pep8 enhancements
100- many bug fixes
101- restored GAE support that was broken in 2.13.*
102- improved fabfile for deployment
103- refactored examples with stupid.css
104- new JWT implementation (experimental)
105- new gluon.contrib.redis_scheduler
106- myconf.get
107- LDAP groups (experimental)
108- .flash -> .w2p_flash
109- Updated feedparser.py 5.2.1
110- Updated jQuery 1.12.2
111- welcome app now checks for version number
112- Redis improvements. New syntax:
113
114    BEFORE:
115    from gluon.contrib.redis_cache import RedisCache
116    cache.redis = RedisCache('localhost:6379',db=None, debug=True)
117
118    NOW:
119    from gluon.contrib.redis_utils import RConn
120    from gluon.contrib.redis_cache import RedisCache
121    rconn = RConn()
122    # or RConn(host='localhost', port=6379,
123    # db=0, password=None, socket_timeout=None,
124    # socket_connect_timeout=None, .....)
125    # exactly as a redis.StrictRedis instance
126    cache.redis = RedisCache(redis_conn=rconn, debug=True)
127
128    BEFORE:
129    from gluon.contrib.redis_session import RedisSession
130    sessiondb = RedisSession('localhost:6379',db=0, session_expiry=False)
131    session.connect(request, response, db = sessiondb)
132
133    NOW:
134    from gluon.contrib.redis_utils import RConn
135    from gluon.contrib.redis_session import RedisSession
136    rconn = RConn()
137    sessiondb = RedisSession(redis_conn=rconn, session_expiry=False)
138    session.connect(request, response, db = sessiondb)
139
140Many thanks to Richard and Simone for their work and dedication.
141
142## 2.13.*
143
144- fixed a security issue in request_reset_password
145- added fabfile.py
146- fixed oauth2 renew token, thanks dokime7
147- fixed add_membership, del_membership, add_membership IntegrityError (when auth.enable_record_versioning)
148- allow passing unicode to template render
149- allow IS_NOT_IN_DB to work with custom primarykey, thanks timmyborg
150- allow HttpOnly cookies
151- french pluralizaiton rules, thanks Mathieu Clabaut
152- fixed bug in redirect to cas service, thanks Fernando González
153- allow deploying to pythonanywhere from the web2py admin that you're running locally, thanks Leonel
154- better tests
155- many more bug fixes
156
157## 2.12.1-3
158
159- security fix: Validate for open redirect everywhere, not just in login()
160- allow to pack invidual apps and selected files as packed exe files
161- allow bulk user registration with default bulk_register_enabled=False
162- allow unsorted multiword query in grid search
163- better MongoDB support with newer pyDAL
164- enable <app>/appadmin/manage/auth by default for user admin
165- allow mail.settings.server='logging:filename' to log emails to a file
166- better caching logic
167- fixed order of confirm-password field
168- TLS support in ldap
169- prettydate can do UTC
170- jquery 1.11.3
171- bootstrap 3.3.5
172- moved to codecov and enabled appveyor
173- many bug fixes
174
175## 2.11.1
176
177- Many small but significative improvements and bug fixes
178
179## 2.10.1-2.10.2
180
181- welcome app defaults to Bootstrap 3
182- DAL -> pyDAL (thanks Giovanni, Niphlod, Paolo)
183  - new modular dal
184  - fixed problems with GAE support
185  - moved to full NDB support
186  - improved connection pooling logic
187- optional cache.ram.max_ram_utilization = 90 (experimental)
188- improved cache.disk logic (thanks Niphlod and Leonel)
189- lots of pep8 improvements, thanks Richard
190- added support for email attchments when auth.settings.server='gae'
191- fixed app.yaml.example for GAE
192- fixed many small issues
193- many many more tests (thanks Giovanni, Niphlod, Paolo)
194- upgrading static libraries (bootstrap, codemirror, jquery, etc)
195
196## 2.9.12
197
198- Tornado HTTPS support, thanks Diego
199- Modular DAL, thanks Giovanni
200- Added coverage support, thanks Niphlod
201- More tests, thanks Niphlod and Paolo Valleri
202- Added support for show_if in readonly sqlform, thanks Paolo
203- Improved scheduler, thanks Niphlod
204- Email timeout support
205- Made web2py's custom_import work with circular imports, thanks Jack Kuan
206- Added Portuguese, Catalan, and Burmese translations
207- Allow map_hyphen to work for application names, thanks Tim Nyborg
208- New module appconfig.py, thanks Niphlod
209- Added geospatial support to Teradata adaptor, thanks Andrew Willimott
210- Many bug fixes
211
212
213
214## 2.9.6 - 2.9.10
215
216- fixed support of GAE + SQL
217- fixed a typo in the license of some login_methods code. It is now LGPL consistently with the rest of the web2py code. This change applied to all previous web2py versions.
218- support for SAML2 (with pysaml2)
219- Sphinx documentation (thanks Niphlod)
220- improved scheduler (thanks Niphlod)
221- increased security
222- better cache.disk (thanks Leonel)
223- sessions are stored in subfolders for speed
224- postgres support for "INSERT ... RETURING ..."
225- ldap support for Certificate Authority (thanks Maggs and Shane)
226- improved support for S/Mime X.509 (thanks Gyuris)
227- better welcome app
228- support for Collection+JSON Hypermedia API (RESTful self documenting API)
229- jQuery 1.11
230- codemirror 4.0.3
231- markdown2 2.2.3
232- memcache 1.53
233- support for the new janrain API
234- new "web2py.py -G config" to make GAE configuration easier
235- many small bug fixes
236
237## 2.9.1 - 2.9.5
238
239- many small but important bug fixes
240- jquery 1.11
241- codemirror 3.21, thanks Paolo Valleri
242- fixed security issue with sessions in database, thanks Nathan Humphreys
243- fixed security issue with persistant data in session, thanks Kiran
244- fixed security issue with redirect after expired login, thanks André Kablu
245- cleaner DAL and rname integration, thanks niphlod and Michele
246- added mongodb and imap tests for dal, thanks Alan
247- NoSQL dal tests, thanks Alan
248- better docstrings, thanks Niphlod
249- allow URL(...,language=...) with parametric router, thanks Jonathan
250- allow non-expiration of gae-memcache, thanks crimsoncantab
251- MARKMIN(...,_class='...'), thanks Luca
252- better transliteration in building slugs
253- autolink emails
254- new Janrain API, thanks PeterQ2
255- enable admin app for GAE (experimental), thanks Alan
256- many bug fixes
257- invalidate function in web2py.js, thanks Paolo
258- DAL(...,adapter_args=dict(engine='MyISAM'))
259- todolist panel in admin editor, thanks Paolo Valleri
260
261## 2.8.1
262
263- no more winservice (use nssm instead)
264- better imap support in DAL
265- db().select().as_tree()
266- bootstrap 2.3.2
267- codemirror 3.19
268- improved  mongoDB support, thanks Alan
269- support for wiki custom render function
270- Wiki(...groups=['x','y']) allows bypassing default permissions
271- fixed websocket_messaging.py to support newer Tornado
272- NDB support for GAE, thanks Quint
273- fixed major concurrecy issue with MEMDB
274- blocked generic.jsonp for security reasons
275- many bug fixes, thanks Niphlod, Michele, Anthony, Tim, and many others.
276
277## 2.7.1 - 2.7.4
278
279- jQuery 1.10.2
280- codemirror 3.18, thanks Paolo
281- namespaces in T("Welcome", ns="namespace"), thanks jamarcer (experimental)
282- more Auth options, thanks Charles
283- more admin configuration, thanks Roberto
284- new gluon.contrib.strip.StripeForm for PCI compliant payments
285- webclient can hendle lists, thanks Yair
286- allows SQLFORM.grid(...,ignore_common_filters=True)
287- more translations, thanks Vladyslav
288- better session2trash.py, works with scheduler, thanks niphlod
289- fixed problem with ENABLED/DISABLED
290- many bug fixes, thanks niphlod, michele, anthony, roberto, tim, and others
291
292## 2.6.1 - 2.6.4
293
294Attention all users: For pre 2.6 applications to work with web2py >=2.6, you must copy static/js/web2py.js, controllers/appadmin.py, and views/appadmin.html from the welcome app to your own apps (all of them).
295
296Attention production users: The updated handlers and examples are in handlers/ and examples/. The updated ones will not override the existing ones. To use the new ones it is not sufficient to upgrade web2py, you also need to copy the desired handler/example in the root web2py/ folder.
297
298Attention MySQL users: The length of string fields changed from 255 to 512 bytes. If you have migrations enabled this will trigger a large migration. To prevent it, first set migrate_enabled=False, upgrade, check everything is ok, then add length=255 to your string Fields, then re-enable migrations with migrate_enabled=True if needed.
299
300- better directory structure: handlers/ extras/ examples/
301- better MongoDb support, thanks Alan
302- better Admin editor interface, thanks Paolo, Roberto (codemirror 3), and Lightdot
303- better layout.html and web2py_bootstrap.css, thanks Paolo
304- refactored web2py.js makes code more readable, thanks Niphlod
305- compute fields can depend on other compute(d) fields
306- more functions in appadmin (/manage/auth), thanks Anthony
307- support for CAST in SQL generation
308- new API jQuery('#component').reload()
309- new API rows.render()
310- new API table.field.referent, table._references
311- new API db(...).validate_and_update(...)
312- new API Wiki(..., force_render=True) renders the page source again instead of using cached
313- Wiki now automatically parses named component arguments @{f:a=1,b='twp',c=variable}
314- auth.get_or_create_user(login=False)
315- auth = Auth(crsf_protection = False) prevents creating sessions in login/register forms.
316- enable multiple renderers in wiki, thanks Alan
317- log messages from Auth are no longer translated (for speed and readability)
318- update jQuery mobile to 1.3.1
319- reduced memory footprint by conditionally loading Tk
320- faster pbkdf2 uses OpenSSL, thanks Michele
321- many speed improvements, thanks Michele
322- better session logic, prevents false positive when detecting session changes.
323- scripts/import_static.py converts a static site to a web2py app (experimental)
324- support for new http error code 451
325- profiler saves dump in dir, thanks Niphlod
326- upgraded pyfpdf, thanks Mariano
327- gluon/contrib/pdfinvoice.py for generating PDF invoices (assumes reportlab)
328- no more double submission of forms (even without crsf protection), thanks Niphlod
329- speedup for define_table, thanks Michele
330- settings.cfg to admin, thanks Paolo
331- many bugs fixed, thanks Niphlod, Michele, Roberto, Jonathan, and many others
332- 2.6,3 specifically fixed a possible DoS vulnerability
333- 2.6.4 specifically fixes major problem introduced in 2.6.1 with session logic
334
335## 2.5.2
336
337- Web editor with tabs, thanks ilvalle
338
339## 2.5.1
340
341- New style virtual fields in grid
342- Conditional fields (experimental) ``db.table.field.show_if = db.table.otherfield==True`` or ``db.table.field.show_if = db.table.otherfiel.contains(values)``
343- auth.settings.manager_group_role="manager" enables http://.../app/appadmin/auth_manage and http://.../app/appadmin/manage for members of the "manager" group. (also experimental)
344- support for POST variables in DELETE
345- Fixed memory leak when using the TAG helper
346
347
348## 2.4.7
349
350- pypy support, thanks Niphlod
351- more bug fixes
352- ...
353
354## 2.4.6
355
356- better tests
357- new ANY_OF and IS_IPV6 validators
358- new custom save option
359- many small bug fixes
360
361## 2.4.5
362
363- travis.ci integration (thanks Marc Abramowitz and Niphlod). Passes all tests (thanks Niplod).
364- IS_DATE and IS_DATETIME can specify timezone
365
366## 2.4.1- 2.4.3
367
368- 2D GEO API: geoPoint, getLine, geoPolygon
369- support for 'json' field type in DAL
370- schema export with db.as_json/as_xml, thanks Alan
371- graph representation of models
372- support for semantic versioning
373- new bootstrap based admin, thanks Paolo
374- improved scheduler (and change in scheduler field names), thanks Niphlod
375- graphviz support added to adm, thanks Jose
376- on_failure in grid
377- db.table.field.abs()
378- better wiki
379- geoPoint, getLine, geoPolygon
380- better reporting of 500 ajax errors
381- better grid
382- improved/fixed mongodb support
383- improved parse_as_rest(patterns=...), thanks Denes
384- improved IMAP DAL support, thanks Alan
385- improved security when cookies in sessions
386- Row.as_xml, as_json, as_dict, as_yaml thanks Alan
387- smarter custom_import
388- setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh
389- added support for motor and pulsar servers, thanks Niphlod
390- added json-rpc2 support
391- added pypyodbc.py driver
392- allow auth.settings.ondelete='CASCADE'
393- new syntax IS_EXPR(lambda value: ...
394- using google for QR codes (although Graph API will be deprecated in 2015)
395- upgraded fpdf to 1.7.1
396- bug fixes (including issues with calendar.js and archive tables)
397
398## 2.3.1 - 2.3.2
399
400- new virtual fields syntax:
401  ``db.define_table('person',Field('name'),Field.Virtual('namey',lambda row: row.person.name+'y'))``
402- db.thing(name='Cohen',_orderby=db.thing.name), thanks Yair
403- made many modules Python 3.3 friendly (compile but not tested)
404- better welcome css, thanks Paolo
405- jQuery 1.8.3
406- Bootstrap 2.2.2
407- Modernizr 2.6.2 (custom full options)
408- integration with analyitics.js (0.2.0)
409- better scheduler, thanks Niphlod
410- page and media preview in wiki, thanks Niphlod
411- create new auth.wiki page from slug model, thanks Nico
412- conditional menus with auth.wiki(menugroups=['wiki_editor'])
413- better security in grid/smartgrid
414- allow LOADing multiple grids, thanks Niphlod
415- auth.settings.login_onfail, thanks Yair
416- better handling of session files for speed
417- added heroku support (experimental)
418- added rocket support for IPV6, thanks Chirs Winebrinner
419- more customizable menus with MENU(li_first, li_last..)
420- added support for paymentech (gluon/contrib/paymentech.py)
421- fixed broken cron
422- fixed possible xss with share.js
423- many bug fixes. Closed more than 50 tickets since 2.2.1
424
425## 2.2.1
426
427- session.connect(cookie_key='secret', compression_level=9) stores sessions in cookies
428- T.is_writable = False prevents T from dynamically updating langauge files
429- all code is more PEP8 compliant
430- better custom_importer behaviour (now works per app, is smalled and faster)
431- fixed some bugs
432- upgraded feedparser.py and rss2.py
433- codemirror has autoresize
434
435## 2.1.0
436
437- overall faster web2py
438- when apps are deleted, a w2p copy is left in deposit folder
439- change in cron (it is now disabled by default). removed -N option and introduced -Y.
440- faster web2py_uuid() and request initialization logic, thanks Michele
441- static asset management, thanks Niphlod
442- improved mobile admin
443- request.requires_https and Auth(secure=True), thanks Yarin and Niphlod
444- better custom_import (works per app and is faster), thanks Michele
445- redis_sesssion.py, thanks Niphlod
446- allow entropy computation in IS_STRONG and web2py.js, thanks Jonathan and Niphlod
447- fixed many aith.wiki problems
448- support for auth.wiki(render='html')
449- better welcome layout, thanks Paolo
450- db.define_table(...,redefine=True)
451- DAL, Row, and Rows object can now be pickled/unpickled, thanks to zombie DAL.
452- admin uses codemirror
453- allow syntax auth = Auth(db).define_tables()
454- better auth.wiki with preview, thanks Alan
455- better auth.impersonate, thanks Alan
456- upgraded jQuery 1.8
457- upgraded Bootstrap 2.1
458- fixed problem with dropbox_account.py
459- many fixes to cache.ram, cache.disk, memcache and gae_memcache
460- cache.with_prefix(cache.ram,'prefix')
461- db.table.field.epoch() counts seconds from epoch
462- DAL support for SQL CASE, example: db().select(...query.case('true','false))
463- DAL(...,do_connect=False) allows faking connections
464- DAL(...,auto_import=True) now retieves some fiel attributes
465- mail can specify a sender: mail.send(...,sender='Mr X <%(sender)s>')
466- renamed gluon/contrib/comet_messaging.py -> gluon/contrib/websocket_messaging.py
467
468## 2.0.1-11
469
470### DAL Improvements
471
472- Support for DAL(lazy_tables=True) and db.define_table(on_define=lambda table:), thanks Jonathan
473- db(...).select(cacheable=True) make select 30% faster
474- db(...).select(cache=(cache.ram,3600)) now caches parsed data 100x faster
475- db(...).count(cache=(cache.ram,3600)) now supported
476- MongoDB support in DAL (experimental), thanks Mark Breedveld
477- geodal and spatialite, thanks Denes and Fran (experimental)
478- db.mytable._before_insert, _after_insert, _before_update, _after_update, _before_delete. _after_delete (list of callbacks)
479- db(...).update_naive(...) same as update but ignores table._before_update and table._after_update
480- DAL BIGINT support and DAL(...,bigint_id=True)
481- IS_IN_DB(..., distinct=True)
482- new syntax: db.mytable.insert(myuploadfield=open(....)), thank you Iceberg
483- db(...).select(db.mytable.myfield.count(distinct=True))
484- db(db.a)._update(name=db(db.b.a==db.a.id).nested_select(db.b.id))
485- db.mytable.myfield.filter_in, filter_out
486- db.mytable._enable_record_versioning(db) adds versioning to this table
487- teradata adapter, thanks Andrew Willimott
488- experimental Sybase Adapter
489- added db.table.field.avg()
490- Support for Google App Engine projections, thanks Christian
491- Field(... 'upload', default=path) now accepts a path to a local file as default value, if user does not upload a file. Relative path looks inside current application folder, thanks Marin
492- executesql(...,fields=,columns=) allows parsing of results in Rows, thanks Anthony
493- Rows.find(lambda row: bool(), limitby=(0,1))
494
495### Auth improvements
496
497- auth.enable_record_versioning(db)  adds full versioning to all tables
498- @auth.requires_login(otherwise=URL(...))
499- auth supports salt and compatible with third party data, thanks Dave Stoll
500- CRYPT now defaults to pbkdf2(1000,20,sha1)
501- Built-in wiki with menu, tags, search, media, permissions. def index: return auth.wiki()
502- auth.settings.everybody_group_id
503- allow storage of uploads on any PyFileSystem (including amazon)
504
505### Form improvements
506
507- FORM.confirm('Are you sure?',{'Back':URL(...)})
508- SQLFORM.smartdictform(dict)
509- form.add_button(value,link)
510- SQLFORM.grid(groupby='...')
511- fixed security issue with SQLFORM.grid and SQLFORM.smartgrid
512- more export options in SQLFORM.grid and SQLFORM.smartgrid (html, xml, csv, ...)
513
514### Admin improvements
515
516- new admin pages: manage_students, bulk_regsiter, and progress reports
517- increased security in admin against CSRF
518- experimental Git integration
519- experimental OpenShift deployment
520- multi-language pluralization engine
521- ace text web editor in admin
522- Ukrainian translations, thanks Vladyslav Kozlovskyy
523- Romanian translation for welcome, thanks ionel
524- support for mercurial 2.6, thanks Vlad
525
526### Scheduler Improvements (thanks to niphlod, ykessler, dhx, toomim)
527
528- web2py.py -K myapp -X starts the myapp scheduler alongside the webserver
529- tasks are marked EXPIRED (if stop_time passed)
530- functions with no result don't end up in scheduler_run
531- more options: web2py.py -E -b -L
532- scheduler can now handle 10k tasks with 20 concurrent workers and with no issues
533- new params:
534    tasks can be found in the environment (no need to define the tasks parameter)
535    max_empty_runs kills the workers automatically if no new tasks are found in queue (nice for "spikes" of processing power)
536    discard_results to completely discard the results (if you don't need the output of the task)
537    utc_time enables datetime calculations with UTC time
538- scheduler_task changes:
539    task_name is no longer required (filled automatically with function_name if found empty)
540    uuid makes easy to coordinate scheduler_task maintenance (filled automatically if not provided)
541    stop_time has no default (previously was today+1)
542    retry_failed to requeue automatically failed tasks
543    sync_output refreshes automatically the output (nice to report percentages)
544- workers can be:
545    DISABLED (put to sleep and do nothing if not sending the heartbeat every 30 seconds)
546    TERMINATE (complete the current task and then die)
547    KILL (kill ASAP)
548
549### Other Improvements
550
551- gluon/contrib/webclient.py makes it easy to create functional tests for app
552- DIV(..).elements(...replace=...), thanks Anthony
553- new layout based on Twitter Bootstrap
554- New generic views: generic.ics (Mac Mail Calendar) and generic.map (Google Maps)
555- request.args(0,default=0, cast=int, otherwise=URL(...)), thanks Anthony
556- redirect(...,type='auto') will be handled properly in ajax responses
557- routes in can redirect outside with routes_in=[('/path','303->http://..')]
558- better memcache support
559- improved spreadsheet, thanks Alan
560- new internationalization engine, thanks Vladyslav
561- pluralization engine, thanks Vladyslav
562- new markmin with support for nested lists, <i>, <em>, autolinks, thanks Vladyslav
563- new syntax: {{=BR()*5}}
564- gluon.cache.lazy_cache decorator allows caching functions in modules
565- .coffee and .less support in response.files, thanks Sam Sheftel
566- ldap certificate support
567- pg8000 postgresql driver support (experimental)
568- @cache('%(name)s%(args)s%(vars)s',5) and cache.autokey
569- added tox.ini, thanks Marc
570- web2py.py --run_system_tests, thanks Marc Abramowitz
571- html.py (and web2py helpers) can be used without web2py dependencies
572- new fpdf, thanks Mariano
573
574
575## 1.99.5-1.99.7
576- admin in Russian (Bulat), Japanese (Omi) and Slovenian (Robert Valentak)
577- included web-based debugger (experimental, thanks Mariano)
578- def index(): return dict(a=gluon.tools.Expose(folder))
579- db.table.field.like(...,case_sensitive=False) (thanks Floyd)
580- db.table.field.regexp(...) for sqlite and postgres
581- db(...,ignore_common_filters=True)
582- db(db.dog_id.belongs(db.dogs.owner=='james')).select()
583- db(...).select().group_by_value(db.table.field) (thanks Yair)
584- db = DAL('imap://user:password@server:port') support (thanks Alan Etkin)
585- db = DAL('teradata://DSN=dsn;UID=user;PWD=pass; DATABASE=database') (thanks Adrew Willmott)
586- db = DAL('mongodb://127.0.0.1:5984/db') (experimental, thanks Mark Breedveld)
587- db = DAL('cubrid')  (experimental)
588- db = DAL('postgres:pg8000:...') and DAL('postgres:psycopg2:...')
589- pg8000 now ships with web2py (thanks Mariano)
590- reponse.delimiters = ('\\[','\\]') (thanks Denes)
591- auth.user_groups stores user groups
592- auth.is_impersonating()
593- populate can now deal with computed fields (thanks Tsvi Mostovicz)
594- new rediscache (thanks niphold)
595- sync languages capability (thanks Yair)
596- improved markmin auto-links
597- improved ldap support (thanks Omi)
598- added TimeCollector (thanks Caleb)
599- better cpdb.py (thanks pasxidis)
600- conditional menu items (reponse.menu=[(title,bool,link,[],condition)]
601- scripts/services/service.py (thanks Ross)
602- gluon/contrib/login_methods/browserid_account.py (thanks Pai)
603- gluon/contrib/htmlmin.py for html minimization (thanks kerncece)
604- web2py_component has timeout parameter, thanks Alan
605- 100's of small bug fixes and small improvements
606
607## 1.99.4
608Improved mobile admin, thanks Angelo
609Improved examples page, thanks Anthony
610fixed a SQLCustomField bug
611
612## 1.99.3
613This is a major revision in peparation for web2py 2.0
614- moved to GitHub and abandoned Lanchpad
615- new web site layout, thanks Anthony
616- new welcome app using skeleton, thanks Anthony
617- jQuery 1.7.1
618- modernizr 2.0.6 (customized)
619- ``define_table('thing', singluar='thing',plural='things')``
620- CAS 1.0 and 2.0 compliant, thanks Olivier
621- fixed validate_and_insert and validate_and_update, thanks Anthony
622- ``request.user_agent().is_mobile`` etc., thanks Ross and Angelo
623- better router, thanks Jonathan
624- app on/off buttons
625- support for dropbox_login
626- improved markmin recognizes qr code, supports auto audio/video/embed
627- ``response.optimize_css = 'concat,minify,inline'``, thanks Ross
628- ``response.optimize_js = 'concat,minify,inline'`` thanks Ross
629- ``db.define_table(...,common_filter=query)``, thanks Yair
630- ``db(...,ignore_common_filter=True)``
631- support for stripe payments
632- support for DowCommerce payments, thanks Dave
633- experimental PyPy support
634- experimental mongodb support, thanks Mark
635- tickets in db now accessible from admin, thanks Niphlod
636
637
638
639
640## 1.99.1-1.99.2
641- gluon/contrib/simplejsonrpc.py
642- gluon/contrib/redis_cache.py
643- support for A(name,callback=url,target='id',delete='tr')
644- support for A(name,component=url,target='id',delete='tr')
645- new pip installer, thanks Chris Steel
646- isapiwsgihandler.py
647- dal expression.coalesce(*options)
648- gluon/contrib/simplejsonrpc.py, thanks Mariano
649- expire_sessions.py respects expiration time, thanks iceberg
650- addressed this issue: http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/
651- x509 support (thanks Michele)
652- form.process() and for.validate()
653- rocket upgrade (1.2.4)
654- jQuery upgrade (1.6.3)
655- new syntax rows[i]('tablename.fieldname')
656- new query syntax field.contains(list,all=True or False)
657- new SQLFORM.grid and SQLFORM.smartgrid (should replace crud.search and crud.select)
658- support for natural language queries (english only) in SQLFORM.grid
659- support for computed columns and additional links in SQLFORM.grid
660- new style virtual fields (experimental): db.table.field=Field.Lazy(...)
661- request.utcnow
662- cleaner/simpler welcome/models/db.py and welcome layout.html
663- response.include_meta() and response.include_files(), thanks Denes
664- dal auto-reconnect on time-out connections
665- COL and COLGROUP helpers
666- addresed OWASP #10, thanks Anthony and Eric
667- auth.settings.login_after_registration=True
668- detection of mobile devices and @mobilize helper (view.mobile.html), thanks Angelo
669- experimental gluon/scheduler.py
670- scripts/make_min_web2py.py
671- crud.search has more options, thanks Denes
672- many bug fixes (thanks Jonathan, Michele, Fran and others)
673
674## 1.98.1-1.98.2
675- fixed some problems with LOAD(ajax=False), thanks Anthony
676- jquery 1.6.2
677- gevent.pywsgi adds ssl support, thanks Vasile
678- import/export of blobs are base64 encoded
679- max number of login attemts in admin, thanks Ross
680- fixed joins with alias tables
681- new field.custom_delete attribute
682- removed resctions on large 'text fields, thanks Martin
683- field.represent = lambda value,record: .... (record is optional)
684- FORM.validate() and FORM.process(), thanks Bruno
685- faster visrtualfields, thanks Howsec
686- mail has ssl support separate from tls, thanks Eric
687- TAG objects are now pickable
688- new CAT tag for no tags
689- request.user_agent(), thanks Ross
690- fixed fawps support
691- SQLFORM(...,separator=': ') now customizable
692- many small bug fixes
693
694## 1.97.1
695- validate_and_update, thanks Bruno
696- fixed problem with new custom import, thanks Mart
697- fixed pyamf 0.6, thanks Alexei and Nickd
698- fixed "+ =" bug in wizard
699- fixed problem with allowed_patterns
700- fixed problems with LOAD and vars and ajax
701- closed lots of google code tickets
702- checkboxes should now work with list:string
703- web2py works on Android, thanks Corne Dickens
704- new cpdb.py, thanks Mart
705- improved translation (frech in particuler), thanks Pierre
706- improved cas_auth.py, thanks Sergio
707- IS_DATE and IS_DATETIME validators now work with native types
708- better description of --shell, thanks Anthony
709- extra SQLTABLE columns, thanks Martin
710- fixed toolbar conflics, thanks Simon
711- GAE password shows with ****
712
713## 1.96.2-1.96.4
714- bug fixes
715
716## 1.96.1
717
718- "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.
719- conditional models in
720  models/<controller>/a.py and models/<controller>/<function>/a.py
721- from mymodule import *, looks for mymodule in applications/thisapp/modules first and then in sys.path. No more need for local_import. Thanks Pierre.
722- 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.
723
724- all applications have cas 2.0 provider at http://.../user/cas/login
725- all applications can delegate to login to external provider Auth(...,cas_provider='http://.../other_app/default/user/cas')
726- A(...,callback=URL(...),larget='id') does Ajax
727- URL(...,user_signature=True), LOAD(...,user_signature=True) can sign urls and @auth.requires_signature() will check the signature for any decorated action.
728
729- DAL(...,migrate_enabled=False) to disable all migrations
730- DAL(...,fake_migrate_all=True) to rebuild all corrupted metadata
731- new DAL metadata format (databases/*.table)
732- DAL(...,adapter_arg={}) allows support for alternate drivers
733- DAL now allows circular table defintions
734- DAL(..,auto_import=True) automatically imports tables from metadata without need to db.define_table(...)s.
735- new alterante syntax for inner joins: db(...).select(join=...)
736- experimental cubrid database support
737- DAL 'request_tenant' fields are special, the altomatically filer all records based on their default value.
738- db._common_fields.append(Field('owner')) allows to add fields to ALL tables
739- DAL ignores repeated fields with same names
740
741- web2py_ajax.html is more modular, thanks Anthony
742- request.is_local
743- request.is_http
744- new sessions2trash.py thanks Jim Karsten
745- corrupted cache files are automatically deleted
746- new simpler API gluon.contrib.AuthorizeNet.procss(...)
747- fixed recaptcha (as they released new API)
748- messages in validators have default internationalization
749- No more Auth(globals(),db), just Auth(db). Same for Crud and Service.
750- scripts/access.wsgi allows apache+mod_wsgi to delegate authentication of any URL to any web2py app
751- json now supports T(...)
752- scripts/setup-web2py-nginx-uwsgi-ubuntu.sh
753- web2py HTTP responses now set: "X-Powered-By: web2py", thanks Bruno
754- mostly fixed generic.pdf. You can view any page in PDF if you have pdflatex installed or if your html follows the pyfpdf convention.
755- 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()
756- {{=response.toolbar()}} to help you debug applications
757- web based shell now supports object modifications (but no redefinitions of non-serializable types)
758- jQuery 1.6.1
759- Lots of bug fixes
760
761
762## 1.95.1
763- Google MySQL support (experimental)
764- pip support, thanks lifeeth
765- better setup_exe.py, thanks meredyk
766- importved pyfpdf
767- domain check in email_auth.py, thanks Gyuris
768- added change_password_onvalidation and change_password_onaccept
769- DAL(...,migrate_enabled=True)
770- login_methods/loginza.py, thanks Vladimir
771- bpython shell support, thanks Arun
772- request.uuid and response.uuid (for a future toolbar)
773- db._timings contains database query timing info
774- efficient db(...).isempty()
775- setup-web2py-nginx-uwsgi-ubuntu.sh
776- Many bug fixes, thanks Jonathan
777
778## 1.94.6
779- fixed a number of minor bugs including adding some missing files
780- better session handling on session._unlock(..), thanks Jonathan
781- added experimental pip support, thanks Lifeeth
782- added experimental SAP DB support
783
784## 1.94.5
785- fixed a major bug with session introdued in 1.94.1
786
787## 1.94.4
788- removed debug print statement that caused problems on GAE and mod_wsgi
789
790## 1.94.3
791- fixed major bug in auth redirection
792
793## 1.94.2
794- reverted wrong behavior of auth.requires(condition) in 1.94.1
795
796## 1.94.1
797- moderniz 1.17
798- web2py no longer saves session if no change, this makes it up up to 10x faster for simple actions
799- experimental REST API
800- better support for MSSQL NOT NULL
801- small bug fixes
802
803## 1.93.1-2
804- support for multiple interfaces, thanks Jonathan
805- jquery 1.5.1
806- simplejson 2.1.3
807- customizable simplejson
808- leaner app.yaml
809- css3 buttons in welcome
810- android support (experimental)
811- Field(':hidden'), Field('.readonly'), Field('name=value')
812- combined expressions print db.data.body.len().sum()
813- wizard can download plugins
814- better json serilization (object.custom_json)
815- better xml serialization (object.custom_xml)
816- better formstyle support
817- better comet_messaging.py (needs more testing)
818- many bug fixes
819
820## 1.92.1
821- much improved routing (thanks Jonathan)
822- Expression.__mod__ (thanks Denes)
823- admin has MULTI_USER_MODE (admin/models/0.py)
824- support for count(distinct=...)
825- has_permissions(...,group_id)
826- IS_MATCH(...,strict=True)
827- URL(...,scheme=,host=,port=), thanks Jonathan
828- admin in Afrikaans, thanks Caleb
829- auth.signature (experimental)
830- many other bug fixes
831
832## 1.91.6
833- web2py comet via gluon/contrib/comet_messaging.py (html5 websockets) experimental
834- fixed problem with services (broken in 1.91.5), thanks Vollrath
835- customizable uploadwidget, thanks Fran
836- fixed problem with mail unicode support, thanks Richard
837- fixed problem with linkto=None and references fields in SQLTABLE, thanks villas
838- no more upgrade button on windows since does not work
839- better remember-me login, thanks Martin Weissenboeck
840- support for recatcha options
841- support for GAE namespaces via DAL('gae://namespace')
842- new rocket (1.2.2), thanks Tim
843- many other bug fixes and improvements (thanks Jonathan)
844
845## 1.91.2-1.91.5
846- fixed a problem with deplyment on GAE
847- other new dal bug fixes
848
849## 1.91.1
850- LICENSE CHANGE FROM GPLv2 to LGPLv3
851- URL(...,hash_vars=...) allows to specify which vars need to be signed
852- fixed bug with aliasing in new DAL
853
854## 1.90.6
855- fix issue with pickling new dal Row and Rows.
856
857## 1.90.5
858- set poll = False in rocket because of poll python thread bug often unfixed, thanks Jonathan
859- fixes issue with crud and reCaptcha
860
861## 1.90.2-4
862- pymysql no longer requires ssl (if not used)
863- fixed bug with virtualfields
864- fixed bug in truncate (new dal)
865- fixed bug in select with alternate primary key (new dal)
866- fixed bug with IS_IN_DB and self refences (also new dal)
867
868## 1.90.1
869- new DAL (complete rewrite of the web2py DAL is more modular)
870- rewrite has fail safe reload, thanks Jonathan
871- better CAS with v2 support, thanks Olivier ROCH VILATO
872- better markmin2latex
873- session.connect(separate=True) to handle many session files, thanks huaiyu wang
874- changed bahvior of impersonate (more secure, can generate form or used as API)
875- new rocket, thanks Tim
876- new pyfpdf
877- no more old style classes
878- experimental couchdb support in new dal (only insert, select, update by id)
879- mysql support out of the box via pymysql
880- SQLITABLE(...,headers='labels') thanks Bruno
881- optional: digitally signed URLs, thanks Brian Meredyk
882- minor bug fixes
883
884## 1.89.1-.5
885- new admin layout (thanks Branko Vukelic)
886- new admin search
887- new admin language selector (thanks Yair)
888- new Welcome app (thanks Martin Mulone)
889- better wizard
890- admin support for DEMO_MODE=True
891- admin exposes GAE deployment button (always)
892- MENU support None links (thanks Michael Wolfe)
893- web2py.py -J for running cron (thanks Jonathan Lundell)
894- fixed ~db.table.id on GAE (thanks MicLee)
895- service.jsonrpc supports service.JsonRpcException (thanks Matt)
896- bug fixes
897
898## 1.88.1-2
899- better list: string support, thanks Bob
900- jquery 1.4.3
901- scripts/autoroutes.py
902- new admin wizard
903- added retrieve_username to navbar (if username)
904- internal rewrite for arbitrary paths (abspath), thanks Jonathan
905- populate support for list: and decimal, thanks Chirstian
906- markmin2latex has extra attribute
907- better mercual admin allows list of files, versions and retrieve
908- new error report system, thanks Thadeus and Selecta
909- SQLFORM.accepts(detect_record_change).record_changed
910- fixed cron for bytecode compiled apps, thanks Álvaro J. Iradier Muro
911- other bugs fixes and pep8 compliant fixes
912
913## 1.87.3
914- fixed a major bug introduced in 1.87.1 that prevents appadmin from working for new apps created with 1.87.1-2.
915- upgraded to clockpick 1.28, thanks villas
916
917## 1.87.1-2
918- new layout for examples, thanks Bruno and Martin
919- admin allow ``DEMO_MODE=True`` and ``FILTER_APPS=['welcome']``
920- fixed a possible problem with CRON and paths
921
922
923## 1.86.3
924- Error reporting on save, thanks Mariano
925recalled
926
927## 1.86.1-1.86.3
928- markmin2latex
929- markmin2pdf
930- fixed some bugs
931- Storage getfirst, getlast, getall by Kevin and Nathan
932- db(db.table), db(db.table.id) both suported and equivalent to db(db.table.id>0)
933- postresql ssl support
934- less un-necessary logging and warnings on GAE
935- IS_DECIMAL_IN_RANGE and IS_FLOAT_IN_RANGE support dot="," (dot="." is default)
936- on_failed_authorization can be a function, thanks Niphold
937- gluon/contrib/login_methods/cas_auth.py for integration between CAS and Auth.
938
939## 1.85.1-3
940- fixed some bugs
941- added pyfpdf, thank Mariano
942
943## 1.84.1-4
944- flash now stays put in the top right corner
945- improved behavior for URL and T objects
946- new app level logging with logging.conf (thanks Jonathan)
947- improved OpenID (thanks Michele)
948- web2py_ajax handles prepend, append, hide (thanks Juris)
949- web2py_ajax also handels pre-validation of decimal fields
950- ru-ru translation (thanks Michele)
951- sk-sk translation (thanks Julius)
952- migrations save .table only if changed and after each ALTER TABLE (no more mysql inconsistencies)
953- fixed bugs in SQLCustomField, Field(default=...), IS_IMAGE, IS_DECIMAL_IN_RANGE and a few more.
954- Better validators (IS_DECIMAL_IN_RANGE, IS_INT_IN_RANGE, etc) thanks Jonatham
955- Polymmodel support on GAE
956- Experimental ListWidget
957- moved DAL and routes to thread.local (thanks Jonathan, again)
958- scripts/extract_mysql_models.py, thanks Falko Krause and Ron McOuat
959- scripts/dbsessions2trash.py, thanks Scott
960
961## 1.83.2
962- mostly cleanup
963
964## 1.83.1
965- New error reporting mechanism (thanks Mariano)
966- New routing system with app level routing (thanks Jonathan)
967- Integrated GAE appstat and GAE precompilation (thanks Scott)
968- New Field types "list:string", "list:integer", "list:reference"
969- request.cid, request.ajax, A(cid=request.cid), response.js
970
971## 1.82.1
972- request.ajax to detect if action is called via ajax, tahnks Jonathan and David Mako
973- more captcha options, thanks Vidul
974- openid and oauth2 thanks Michele and Keith
975- better PluginManager and load components
976- new template system, thanks Thadeus
977- new db.table(id,[field=value]) and db.table(query) syntax
978- URL('index') (no more r=request), thanks Thadeus
979- mail.send(message='<html>...</html>', ....)
980- DAL([....]) for load balancing
981- @service.soap(...) with mysimplesoap, thanks Mariano
982- hideerror
983
984## 1.81.5
985- 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).
986
987## 1.81.4
988- Fixed gluon.tools to work work with load and base.css to nowrap labels
989
990## 1.81.3
991- fixed bug in label names in formstyle
992- fixed id names in admin test.html page
993
994## 1.81.2
995- fixed bug in Auth
996
997## 1.81.1
998- rpx (janrain) support out of the box, allows login with Facebook, MySpace, etc. Thanks Mr Freeze
999- Increased security (escape  single and double quotes, thanks Craig"
1000- Fixed a bug with db.table.field.uploadseparate=True and autodelete
1001- New welcome app with superfish and jQuery 1.4.2
1002- Deleted openwysiwyg from admin
1003- In XML and xmlescape quote defaults to True. Both ' and " are escaped. Thanks Craig Younkins
1004
1005## 1.80.1
1006- MARKMIN helper (no backward compatibility promise yet)
1007- self._last_reference, thanks Dave (no backward compatibility promise yet)
1008- IS_EQUAL_TO
1009- zh-tw and better internationalization page, thanks Daniel Lin and Iceberg
1010- better crud.search, thanks MrFreeze
1011- Rocket interfaces, thanks Nik Klever
1012- db.table.field.uploadseparate=True, thanks Gyuris
1013- SCOPE_IDENITY for MSSQL, thanks Jose
1014- fixed email attachment issue, thanks Bob_in_Comox
1015- fixed problem with groupby and IS_IN_DB
1016- other bug fixes
1017- new implementation for local_import
1018- ajax(..,...,null)
1019- fixed Chrome bug in calendar.js, thanks Iceberg
1020- experimental scrips/web2py-setup-fedora.sh
1021- generic.load, thanks Iceberg
1022
1023## 1.79.2
1024- solved simplejson imcompatibility problem
1025
1026## 1.79.1
1027- x509 emails, thanks Gyuris
1028- attachment and html in Mail on GAE, thanks PanosJee
1029- fixed docstring in SQLTABLE, thanks aabelyakov
1030- TAG(html) parese html into helpers (experimental, still some problems with unicode, , thanks RobertVa for unicode help)
1031- DIV.elements(find=re.compile(....))
1032- DIV.flatten()
1033- DIV.elements('....') supports jQuery syntax in '....'
1034- better it-it.py and it.py, thanks Marcello Della Longa
1035- Many Bug fixes:
1036- improved support for DAL and joins in postgresql/oracle, thanks Nico de Groot
1037- bux fixex in html.py, thanks Ian
1038- fixed an issue with registration_key==None, thanks Jay Kelkar
1039- fixed bug in gql.py, thanks NoNoNo
1040- fixed problem with multiple and checkboxes, thanks MIchael Howden
1041- fixed bug in gae, thanks NoNoNo
1042- restored 2.4 compatibility, thanks Paolo Gasparello
1043- auth.update() when pictures in profile
1044- formstyle can be a function, thanks Howden
1045- escape in sanitizer, thanks Howes
1046- add missing settings, thanks Hamdy
1047- find and exclude return empty Rows instead of [], thanks iceberg
1048- simplejson 2.1.1 should fix compatibility problems
1049- added sms_utils and Authorize.net in contrib
1050
1051## 1.78.3
1052- reverted temporarily to old template system because of backward compatibility issues
1053
1054## 1.78.1
1055- new template system allows {{block name}}{{end}}, thanks Thadeus
1056- fixed mime headers in emails, included PGP in emails, thanks Gyuris
1057- automatic database retry connect when pooling and lost connections
1058- OPTGROUP helper, thanks Iceberg
1059- web2py_ajax_trap captures all form submissions, thank you Skiros
1060- multicolumn checkwidget and arbitrary chars in multiple is_in_set, thanks hy
1061- Québécois for welcome, thanks Chris
1062- crud.search(), thanks Mr Freeze
1063- DAL(...migrate,fake_migrate), thanks Thadeus
1064
1065## 1.77.3
1066- some cleanup of code in compileapp
1067
1068## 1.77.2
1069- fixed x-index in calendar
1070## 1.77.1
1071- Replaced CherryPy with Rocket web server, thanks Tim
1072- CacheOnDisk allows to specify a folder
1073- IS_DATE/DATETIME can handle any year since 0
1074- SQLTABLE(...,headers='fieldname:capitalize')
1075- Field().with_alias, thanks Nathan and Mengu
1076- has_membership(group=...,role=...), thank Jonathan
1077- db.define_table(username=True), thanks Jonathan
1078- gluon.tools.prettydate
1079- can specify hostname in routes_out (same syntax as routes in), thanks Martin
1080- db.table.bulk_insert([...records...]) now works on GAE, thanks Jon
1081- IS_EMAIL validates on 'localhost', thanks Jonathan
1082- welcome/views/layout.html uses ez.css, thanks Yarko
1083- mail attachments support utf8, thanks szimszon
1084- works with PyPy, thanks Joe
1085- better Firebird support, thanks Jose
1086- better Oracle support, thanks Gabriele
1087- cron supports days of week
1088- SQLFORM(...,formstyle="table3cols") or "table2cols" or "divs" or "ul"
1089- crud.settings.formstyle
1090- web2py.py -f folder allows to specify locations of applications, thanks Iceberg
1091- better/faster regex in template works in Jython
1092- fixed lots of small bugs
1093
1094## 1.76.5
1095- Fixed a typo in auth that created some registration problems
1096
1097## 1.76.4
1098- SQLTABLE(db(db.auth_user.id>0).select(),headers='fieldname:capitalize')
1099- Oracle limitby improved (thanks Sergey)
1100- fixed migrations in Firebird, thanks Jose Jachuf
1101- gluon/contrib/login_methods/linkedin_account.py (to be tested)
1102
1103## 1.76.2-1.76.3
1104- major fix in cron (will I ever get this 100% right?)
1105- fix in delete for GAE
1106- auth.settings.login_captcha and auth.settings.register_captcha
1107- crud.settings.create_captcha and  crud.settings.update_captcha
1108- automatic update button in admin
1109
1110## 1.76.1
1111- editarea 0.8.2 + zencoding
1112- new (better) cron locking meachnism
1113- no storing session cookies on session.forget(), thank you Alvaro
1114- routes_apps_raw allows disabling of request.args validation, thanks Jonathan and Denes
1115- fixed problem with edit_languages ad multiple tabs, thanks Iceberg
1116- crud captcha, thanks you Nathan
1117- softcron disabled by default in wsgihandler and fcgihandler
1118
1119## 1.75.5
1120- fixed behaviour with languages.py, thanks Iceberg
1121- added chinese (thanks Iceberg) and Hungarian (thanks Gyuris)
1122- fixed problem with GAE deleted by id (thanks what_ho)
1123- fixed bug in LOAD with custom views, thanks vhang
1124- improved IS_IN_SET takes iterator, dict, list and list of tuples, thanks Iceberg
1125- Auth(...,controller='default')
1126- Fixed major bug in parsing repeated request.vars, thanks Ben
1127- IS_DATE and IS_DATETIME can now handle any 0<year
1128- allow to disable editarea onload, thanks Alex
1129
1130## 1.75.4
1131- customizable BEAUTIFY, thanks John
1132
1133## 1.75.3
1134- added support for PAM authentican for apps and for admin
1135- INTRODUCED MAJOR BUG IN BEAUTIFY (upgrade to 1.75.4) IMMEDIATELY
1136
1137## 1.75.2
1138- fetch supports cache
1139- curd.update(....,onaccept=crud.archive) magic
1140- new UUID mechnism fixes session conflicts with cloned machine in cloud
1141- allow to upload app and overwrite existing old ones, thanks Jonathan
1142- print gluon.tools.prettydate(request.now,T), thanks Richard
1143
1144## 1.75.1
1145- better cron
1146- better fetch
1147- logging of email failures
1148- new web2py.fedora.sh
1149- new setup-web2py-ubuntu.sh
1150- experimental autocomplete
1151- menus work on IE6
1152
1153## 1.74.9
1154- IS_IN_SET(((0,'label0'),(1,'label1'))), thanks Falko Krause
1155- SQLFORM(...).accpets stores True or False in boolean types no None, thanks Frederik Wagner
1156- SQLFORM.factory(...,table_name='no_table'), thanks Thedeus
1157- jQuery 1.4.1
1158- Fixed major problem with internationalization of multiple languages.
1159- Fixed a serius security issue with login
1160- Possibly fixed some issues with cron
1161
1162## 1.74.8
1163- IS_SLUG, thanks Gustavo and Jonathan
1164- web2py.py -nogui, thanks Jeff Bauer
1165- solved a problem with jython, thanks Tim Farrel
1166- login has "remember be option", thanks Piotr Banasziewicz
1167- fixed problem with keepvalue in update forms, thanks Miguel Lopez
1168
1169## 1.74.7
1170- request_password_reset and password reset verification
1171- python web2py.py -S app -M -R script.py -A arg1 arg2 arg3
1172- T("%(a)s") % dict(a="hello")
1173
1174## 1.74.6
1175- bug fixes
1176- IS_IN_DB(...,_and=IS_NOT_IN_DB)
1177- Smaller populate, thanks Piotr
1178- better slicing of fields, thanks Michael Fig
1179- Cache stats, thanks Thadeus
1180- Better gql.py
1181- IS_IN_DB and IS_IN_SET default to zero='', no longer zero=None
1182
1183## 1.74.5
1184- bug fixes
1185- restored python 2.4 support,thanks ont.rif
1186- support for native types on Google App Engine
1187- cache.ram usage statictics, thanks Thadus
1188- no more auth manu in scaffolding
1189- no more spash screen with -Q
1190- fixed doctest in html.py, thanks Anand Vaidya
1191- export_to_csv_file has represent, thanks Thadeus
1192
1193## 1.74.2-4
1194- Fix bugs including including unicode in emails and blobs on GAE
1195
1196## 1.74.1
1197- Moved to mercurial
1198- Default validators use the new define_table(....,format='...')
1199- New get_vars and post_vars compatible in 2.5 and 2.6 (thanks Tim)
1200- Major rewrite of gql.py extends DAL syntax on GAE
1201- No more *.w2p, welcome.w2p is create automatically, base apps are always upgraded
1202- export_to_csv(delimiter = ',', quotechar = '"', quoting = csv.QUOTE_MINIMAL), thanks Thadeus
1203
1204## 1.73.1
1205- Fixed problem with storage and comparison of Row objects
1206- Fixed problem with mail on GAE
1207- Fixed problem with T in IS_DATE(TIME) error_message and format
1208- Rows[i].delete_record()
1209- Even better support for legacy databases
1210- Experimantal support for non UTF8 encoding in DB
1211- Better IPV4 (thanks Thandeus)
1212- T.current_languages default to 'en' and new T.set_current_languages(...) (thanks Yarko)
1213- INPUT(...,hideerror=False) used to fix rare chechbox widget problem
1214- Admin allows change of admin password
1215- New gluon/contrib/populate.py
1216- Size of input/textarea set by CSS no more by jQuery  (thanks Iceberg)
1217- Customizable CSV  (thanks Thandeus)
1218- More bug fixed (thanks Thandeus)
1219- Better regex for template fixed Jython problem (thank Jonathan)
1220
1221## 1.72.1 - 1.72.3
1222- Better support for legacy databases
1223
1224## 1.71.1
1225- Complete rewrite of Rows
1226- renamed DALStorage->Rows, DALRef->Reference
1227- Experimental serializarion of Row and Rows (get serialized to dict and list of dict)
1228- DAL(...,folder) and template.render(content=, context=) make it more modular
1229
1230## 1.70.1
1231- Fixed bug with Rows.as_list and DALRef
1232- Added Rows.as_dict (thanks Mr Freeze and Thedeus)
1233- Added request.wsgi (thanks hcvst) allows running wsgi apps under web2py and applying wegi middleware to regular web2py actions that return strings.
1234- Experimental distributed transactions between postgresql, mysql and firebird
1235- Finally local_import is here!
1236
1237## 1.69.1
1238- Fixed a bug introduced in 1.68 about inserting unicode in DAL
1239- Fixed other small bugs
1240- Better support for legacy databases (thank Denes)
1241- response.meta replaces response.author, response.keywords, response.description
1242- response.files stets dependes in plugins
1243- better admin for packing/unpacking plugins
1244- reference fiels nor evaluate to DALRef with lazy evaluation (cool, thanks Mr Freeze)
1245- can insert a record in place of a reference
1246- record[e] instead of record._extra[e] (tentatively!)
1247- record.update_record() with no args
1248- rows.find()  (thanks Mr Freeze)
1249- rows.exclude()
1250- rows.sort()
1251- rows[:]
1252
1253## 1.68.2
1254- Fixing bug with admin and missing crontab
1255- Fixing bug with rewrite.load on GAE (thanks Willian Wang)
1256
1257## 1.68.1
1258- New official markdown with security fix
1259- rows.first()
1260- rows.last()
1261- New cron
1262- New hindi and spanish translation
1263- cached uploads allow for progress bars (thanks AndCycle)
1264- ingres support (thanks Chris)
1265- legacy database support for db2, mssql with non-int primary keys (thanks Denes)
1266- default setting of content-type (this may cause strange behavior in old apps when downloading images)
1267- IS_UPPER and IS_LOWER works with unicode
1268- CLENUP not takes regex of allowed/now allowed chartares
1269- New rewrite.py allows dynamic routes
1270- Better error messages for IS_INT_* and IS_FLOAT_*
1271
1272## 1.67.2
1273- Security fix in markdown
1274
1275## 1.67.1
1276- Bux fixed
1277
1278## 1.67.0
1279- Python 2.4 support (again)
1280- New layout for welcome
1281- changed defauld field sizes to 512
1282- Field(uploadfolder="...")
1283- appadmin works on GAE (again, somehting got broken at some point)
1284- new wsgiserver 3.2.0 should fix recurrent broken download problems
1285
1286## 1.66
1287- new doctypes
1288- form.vars.newfilename
1289- new HTML and XHTML helpers
1290- better IS_LENGTH
1291
1292## 1.65.13
1293- request.url (thanks Jonathan)
1294- restored uploadfield_newfilename
1295- new examples layout nad logo (thanks Mateusz)
1296
1297## 1.65.12
1298- lables in auth auto-translate (thanks Alvaro)
1299- better ldap_auth (thanks Fran)
1300- auth chacks locally for blocked accounts even for alternate login methods (thanks Fran)
1301
1302## 1.65.11
1303- Fixed a sqlhtml bug with image upload
1304
1305## 1.65.3-10
1306- Fixed some small bugs and typos in the docstrings
1307- Fixed AMF3 support
1308
1309## 1.65.2
1310- Fixed some small auth bugs
1311- Field.store(...)
1312
1313## 1.65.1
1314- spreadsheet
1315- shell history, thanks sherdim
1316- crontab editor, thanks Angelo
1317- gluon/contrib/login_methods/cas_auth.py (thanks Hans)
1318- DAL(...) instead of SQLDB(...)
1319- DAL('gae') instead of GQLDB()
1320- Field instead of SQLField
1321- (the old syntax still works)
1322
1323## 1.65
1324- reST docstrings for Sphinx, thanks Hans
1325- gluon/conrtib/login_methods/gae_google_account.py for google CAS login on GAE, thanks Hans
1326- fixed problem with Auth and Firebird 'password' issue
1327- new auth.settings.create_user_groups
1328- tickets stored on datastore on GAE and also logged, thanks Hans
1329- imporved IS_LENGTH with max and min, thanks Mateusz
1330- improved IS_EMAIL with filters, thanks Mateusz
1331- new IS_IMAGE checks for format and size, thanks Mateusz
1332- new IS_IPV4, thanks Mateusz
1333
1334## 1.64.4
1335- Som bug fixes
1336- Informix Support
1337- response.render(stream)
1338- SQLFORM.factory
1339- SQLFORM.widgets.radio and SQLFORM.widgets.checkboxes
1340
1341## 1.64.3
1342- Some bug fixes
1343
1344## 1.64.2
1345- New IS_COMPLEX validator, thank Mr. Freeze
1346- Experimental Informix support
1347- Autologin on registration
1348
1349## 1.64
1350- Models 2-3 times faster (thanks Alexey)
1351- Better LDAP support
1352- Works with Jython (including sqlite and postgresql with zxJDBC):
1353
1354-   download jython-2.5rc3.jar
1355-   download qlite-jdbc-3.6.14.2.jar
1356-   java -jar jython-xxx.jar
1357-   export CLASSPATH=$CLASSPATH:/Users/mdipierro/jython2.5rc3/sqlite-jdbc-3.6.14.2.jar
1358-   cd web2py
1359-   ../jython2.5rc3/jython web2py.py
1360
1361## 1.63.5
1362- You can do jQuery.noConflict() without breaking web2py_ajax
1363- Wigets can have attributes (thanks Hans)
1364- Lots of internal cleanup and better code reusage (thanks Hans)
1365
1366## 1.63-1.63.4
1367- no more import gluon.
1368- support for generic.xxx
1369- simplejson can handle datetime date and time
1370
1371## 1.62
1372- SQLFORMS and crud now show readble fields
1373- Better WingIDE support
1374- Languages are automatically translated
1375- T.force and lazyT works better, optional T.lazy=False
1376- gluon.storage.Messages are now translated without T
1377- if routes.py then request.env.web2py_original_uri
1378- db.table.field.isattachment = True
1379- internationalizaiton of admin by Yair
1380- admin.py by Alvaro
1381- new MENU helper
1382- new w2p file format
1383- new welcome app with auth, service and crud turned on
1384
1385## 1.61
1386- fixed some typos
1387- auth.add_permissions(0,....) 0 indicates group of current user
1388- crud.update has deletable=True or False
1389- fixed issue with GAE detection -> gluon.settings.web2py_runtime -> request
1390
1391## 1.59-1.60
1392- fixed lots of small bugs
1393- routes_in can filter by http_host
1394
1395## 1.58
1396- Fixed some CRON bugs
1397- Fixed a bug with new ajax edit
1398- Experimental DB2 support in DAL
1399- Customizable font size in admin edit page
1400- New welcome/models/db.py shows how to memcache sessions on GAE with MEMDB
1401- More expressive titles in admin
1402- DB2 support. Thanks Denes!
1403
1404## 1.57
1405- New ajax edit with keepalive (no longer logged out when editing code)
1406- Fixed conflict resolution page.
1407- Removed /user/bin/python from models/controllers
1408
1409## 1.56.1-1.56.4
1410- fixing lots of small bugs with tool and languages
1411- jquery.1.3.2
1412
1413##
1414
1415- One more feature in trunk....
1416
1417-     db.define_table('image',SQLField('file','upload'))
1418
1419-     db.image.file.authorize=lambda row: True or False
1420
1421- then controller
1422-     def download(): return response.download(request,db)
1423- id' is now a hidden field sqlform
1424- gql references converted to long
1425- admin login has autofocus
1426- new notation proposed by Robin, db.table[id]
1427- new UploadWidget shows images
1428- new generic.html shows request, response, session
1429- new LEGEND helper (thanks Marcus)
1430- fixed doctests in sql (thanks Robin)
1431- new notation for DB
1432
1433- record=db.table[id]
1434- db.table[id]=dict(...)
1435- del db.table[id]
1436
1437- request.env.web2py_version
1438- new class gluon.storage.Settings has lock_keys, lock_values
1439- jquery 1.3.1
1440- PEP8 compliance
1441- new examples application
1442- runs on jython (no database drivers yet, thanks Phyo)
1443- fixed bugs in tests
1444- passes all unittest but test_rewite (not sure it should pass that one)
1445
1446- 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)
1447- db.define_table('mytable',db.Field('somefield'),timestamp)
1448Example:
1449``
1450timestamp=SQLTable(None,'timestamp',
1451             SQLField('created_on','datetime',
1452                          writable=False,
1453                          default=request.now),
1454             SQLField('modified_on','datetime',
1455                          writable=False,
1456                          default=request.now,update=request.now))
1457``
1458and use it in all your tables
1459- form=SQLFORM(db.circle,request.args[-1])
1460- and you get a create form if the URL ends in /0, you get an update
1461- form if the URL ends in /[valid_record_id]
1462make a display form in two possible ways:
1463- form=SQLFORM(db.circle,record,readonly=True)
1464- form=SQLFORM(db.circle,record_id,readonly=True)
1465make an update form in two possible ways:
1466- form=SQLFORM(db.circle,record)
1467- form=SQLFORM(db.circle,record_id)
1468make a create form in two possible ways:
1469- form=SQLFORM(db.circle)
1470- form=SQLFORM(db.circle,0)
1471make a form that automatically computes area
1472- pi=3.1415
1473- form=SQLFOM(db.circle)
1474- if form.accepts(request.vars,
1475- onvalidation=lambda form: form.vars.area=pi*form.vars.radius**2): ...
1476make the radius appear in bold in display and table
1477- db.circle.radius.represent=lambda value: B(value)
1478automatically timestamp when record is modified
1479- db.circle.modified_on.update=request.now
1480automatically timestamp when record cretaed
1481- db.circle.modified_on.default=request.now
1482do not show now in display forms
1483- db.circle.modified_on.readable=False
1484do not show area in create/edit forms
1485- db.circle.area.writable=False
1486add a comment in the forms
1487- db.circle.area.comment="(this is a comment)"
1488
1489## 1.56
1490- Now you can do:
1491``
1492db.define_table('cirlce',
1493    db.Field('radius','double'),
1494    db.Field('area','double'),
1495    db.Field('modified_on','datetime'))
1496``
1497
1498## 1.55
1499- rowcount
1500- fixed bug when IS_IN_DB involved multiple fields on GAE
1501- T.set_current_languages
1502- better unittests
1503- response.custom_commit and response.custom_rollback
1504- you can next cache calls (like cache a controller that caches a select). Thanks Iceberg
1505- db(....id==None).select() no longer returns an error but an empty SQLRows on GAE
1506- db(...).delete(delete_uploads=True) and SQLFORM.accepts(....delete_uploads=True) will delete all referenced uploaded files
1507- DIV.element and DIV.update
1508- sqlrows.json()
1509- SQLFORM.widgets
1510- URL(r=request,args=0)
1511- IS_IN_DB(...,multiple=True) for Many2Many (sort of)
1512- In URL(...,f) f is url encoded
1513- In routes_in=[['a/b/c/','a/b/c/?var=value']]
1514- simplejson 2.0.7
1515
1516
1517## 1.54
1518- fixed minor bugs
1519
1520## 1.53
1521- On GAE upload data goes automatically in datastore (blob created automatically)
1522- New appadmin runs on GAE (most of it, not all)
1523- Martin Hufsky patch allow slicing of fields in DAL expressions
1524
1525## 1.52
1526- Fixed a minor bug with _extra[key] and key not str.
1527- check for upgrade via ajax
1528
1529## 1.51
1530- Fixed more bugs introduced in 1.49 (sql _extra and html select)
1531- support for sqlite:memory:
1532
1533## 1.50
1534- Fixed some bugs introduced in 1.49
1535
1536## 1.49
1537- fixed a bug with taskbar widget, thanks Mark
1538- fixed a bug with form.latest
1539- made many DIV methods private (_)
1540
1541
1542## 1.43-1.48
1543- html.py rewrite (better support for custom forms) (Bill Ferrett)
1544- new stickers in examples (thanks Mateusz)
1545- on windows can run in taskbar (Mark Larsen)
1546- in admin|edit page link to edit|controller (Nathan Freeze)
1547- better error codes and routes_onerror (Timothy Farrell)
1548- DAL support for groupy and having
1549- DAL support for expressions instead of values
1550- DAL has experimental Informix support
1551- fixed bug with non-printable chars in DAL
1552- 'text' fields limited to 2**16 (to avoid mysql problems)
1553- widget has -quiet and -debug (Attila Csipa)
1554- web2py_session uses BLOB instead of TEXT
1555- improved IS_URL
1556- Runs with python 2.6 (Tim)
1557- On GAE uses GAE for static files (Robin)
1558
1559
1560## 1.42
1561- fixed security issue by removing slash escape in mysql
1562- removed random everywhere
1563- use uuid for session and tickets
1564- use http_x_forward_for to figure out the client causing a ticket
1565- use longtext and longblob for mysql
1566- main now really catches all exceptions
1567- no more warnings on GAE
1568
1569## web2py 1.31-1.41
1570- some bug fixes, mostly better appengine support
1571- mssql support
1572- firebird support
1573- widgets support
1574- connection pools
1575
1576## web2py 1.30
1577- added flv to contenttype
1578- added support for appengine
1579
1580## web2py 1.29
1581- Now selet mutliple works with get, so does is IS_LENGTH
1582- Added IS_LIST_OF
1583- fixed problem with admin from windows and localhost
1584
1585## web2py 1.28
1586- fixed bug with belongs, faster sql.py
1587- included jquery.js
1588- minor aestetical fixes
1589- sortable.js is gone
1590
1591## web2py 1.27
1592- IS_NULL_OR now works will all fields
1593- admin creates paths to static files
1594- wsgiserver options are passed to HttpServer
1595- faking limitby for oracle to make appadmin work
1596- all objects inherit from object
1597- fixed bug in app names with .
1598- fixed bug in created RestrictedError object on windows
1599- shell is now in gluon and accessible via web2py.py
1600
1601## web2py 1.26
1602- added shell.py (thanks Limodou!)
1603- added memcache support
1604
1605## web2py 1.22-1.25
1606- fixed minor bugs, added IS_NULL_OR
1607
1608## web2py 1.21
1609- replaced paste.httpserver with cherrypy.wsgi server
1610- temporary sessions are no longer saved
1611- widget has [stop] button and graph
1612- logging is done by main by appfactory
1613- fixed a bug in sql belongs
1614
1615## web2py 1.20
1616- new IFRAME, LABEL, FIELDSET validators
1617- P(..cr2br=True) option
1618- FORM and SQLFORM have hidden=dict(...) option for REST
1619- testing framework.
1620- improved examples pages
1621
1622## web2py 1.19
1623- minor typos
1624
1625## web2py v1.18
1626- removed vulnerability in accept_languages and session_id
1627- Minor bug fixes. Typos and cleanup cache. Textarea now clears.
1628- Support for PyAMF.
1629- T returns a class, not a string
1630- new template parser (faster?)
1631- got rid of sintaxhighlighter in favor of server side CODE
1632- fix problem with cacheondisk locking
1633- fix 'None' instead of NULL in IS_NOT_IN_DB (I think)
1634- gluon.contrib.markdown
1635- notnull and unique in SQLField now supported (tested on sqlite mysql and postgresql)
1636- Storage now has __getstate__ and __setstate__ needed for pickling.
1637- session files are now locked to make it work better with asynchronous requests
1638- cxoracle should work, apart for limitby
1639- .../examples is now mapped to .../examples/default/index etc.
1640- .../init is now mapped to .../welcome if init is not present
1641
1642## web2py v1.17
1643- I posted v1.16 too soon. v1.17 was released after 1h to fix some bugs.
1644
1645## web2py v1.16
1646- yes we changed the name! Turns out Gluon was trademarked by somebody else.
1647- Although we are not infringing the trademark since this is a non-commercial
1648- product we could have run into some issues. So we have been professional
1649- and changed the name to web2py.
1650- Now SQLFORMs and FORM can have a formname and multiple forms are allowed
1651- per page.
1652- A new examples/default/index page.
1653- web2py.py instead of runme.py
1654- mysql sets utf8 encoding.
1655- input integer field values are automatically converted int().
1656
1657## Gluon v1.15
1658- New try:... except. in gluon/main.py for when sessions cannot be saved
1659- Now validator/formatter method allows IS_DATE('%d/%m/%Y')
1660
1661## Gluon v1.14
1662- Fixed a bug fix in URLs
1663
1664## Gluon v1.13
1665- (this is one of the biggest revisions ever)
1666- Improved sql.py has support MySQL, cxOracle (experimental), extract, like and better testing
1667- SQLDB.tables and SQLTable.fields are now SQLCalableList objects
1668- Fixed bug with editing integer fields storing zero
1669- Admin interface now says "insert new [tablename]" and display insert, select or update properly in the title.
1670- Added a cache mechamism. Works for data, controllers, views and SQLRows.
1671- 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.
1672- Now you can put modules in applications/[anyapp]/modules and import them with
1673- import applications.[anyapp].modules.[module] as [module]
1674- Fixed problem with init
1675- New applications/examples/controller/global.py controller for docs.
1676
1677## Gluon v1.12
1678- in sql.py
1679- handles NULL values properly
1680- unicode support (data always stored in utf-8)
1681- 'date' -> datetime.date ,'time' -> datetime.time, 'datetime' -> datetime.datetime, 'boolean' -> True/False
1682- most types have default validators
1683- SQLField(...,required=True) option.
1684- SQLRows has __str__ that serializes in CSV and xml() that serializes in HTML
1685- SQLTable has import_from_csv_file(...)
1686- gluon.simplejson for AJAX
1687- in validators.py
1688- IS_IN_DB(db,..) -  db can be an SQLSet or an SQLDB
1689- better error messages
1690- in admin
1691- new import/export in csv, update and delete interface.
1692- in appadmin
1693- edit form allows to keep stored encrypted password
1694- in main.py
1695- http://host not defaults to http://host/init/default/index
1696- New third party modules
1697- gluon.simplejson(.dumps, .loads)
1698- gluon.pyrtf(.dumps)
1699- gluon.rss2(.dumps)
1700
1701## Gluon v1.11
1702- appadmin allows to keep or delete uploaded files
1703
1704## Gluon v1.10
1705- fixed concurrency problems with SQLDB._instances and SQLDB._folders, now use lock
1706- now, by default, edit SQLFORMs retain uploaded files
1707
1708## Gluon v1.9
1709- allow "count(*)" in select
1710- db.execute()
1711- fixed problem with continue and return in template
1712- removed try: ... except in sql.py
1713- fixed '\t'
1714
1715## Gluon v1.8
1716- no more chdir (thread unsafe)
1717- no more sys.stdout (thread unsafe)
1718- response.body is StringIO()
1719- admin/default/site informs about upgrade
1720- response.locker (optional)
1721
1722## Gluon v1.5
1723- <form> -> <form method="post"> in errors.html
1724- replace('//','////') in sub in template.py
1725
1726## Gluon v1.4
1727- 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.
1728- IS_IN_DB displays "label (id)"
1729- it can upload files without extension
1730- migration is now optional (define_table has migrate=False option)
1731
1732## Gluon v1.3
1733- added IS_IN_DB, IS_NOT_IN_DB and updated examples accordingly
1734
1735## Gluon v1.1 -> v1.2
1736- fixed some typos in examples
1737- IS_IN_SET now supports labels
1738- cleanup in sql.py does not cleanup, just checks valid field and table names
1739
1740## Gluon v1.0 -> v1.1
1741- bug in sqlhtml with JOINS queries
1742
1743## EWF v1.7 -> Gluon v1.0
1744- Name change
1745- Improved layout.html
1746
1747## EWF v1.6 -> v1.7
1748- in paths replace '\' with '/' to fix problem with windows paths
1749- using limitby in database administration
1750- replaced mime/miltupart with multipart/form-data to fix a windows problem
1751
1752## EWF v1.5 -> v1.6  (2007)
1753- load and save .py in ascii, avoids problem with LF+CR on windows
1754- added path.join in compileapp, fixed problem with Windows compileapp
Note: See TracBrowser for help on using the repository browser.