-----------------
* Add CSRF support thanks for Damon
* Add multiple lines comment tag `{{ }}` support to template
* Improve makeproject project template, add .gitignore and local_settings.ini
* Refactor `call_view()` so that fix the soap view function will invoke
`__begin__` or `__end__` twice bug.
* Refactor Functions, and Decorators, add parent class Finder. Also you can import
from `uliweb`
* Replace class type judgement with `inspect.isclass()`
* Fix `--version` command argument process bug.
* Improve `import_mod_attr`, and make it can receive object parameter
* Add `handler()` function to Dispatcher, and it'll return an instance of `DispatcherHandler`
and it provide `get`, `post`, `delete`, .etc, restful api, and you can invoke
them to execute an url, for example:
from uliweb import application
handler = application.handler()
r = handler.get('/index')
r is response object
* Add `client_from_application()` to uliweb/utils/test.py
* Add `dispatcher_cls` and `dispatcher_kwargs` to `make_application` and
`make_simple_applicatin`, so you can pass difference Disptacher class
which provided by `uliweb/core/SimpleFrame.py`.
* Add `PUT` and `PATCH` judgement to csrf middleware.
* Fix template.py for multiple times extending the same template file bug
* Expose `filename_convert()` function from upload app
* Add `get_uuid()` function to utils/common.py
* Fix `get_collection_name()` bug
* Fix json bug, when dealing with `0x00-0x1f`
* Add generic app, so user can use `functions.ListView`
* Add fieldset support for BootstrapLayout
* Change generic.py `json_body` to `json_result`, add `.f` attributes to DetailView object
* Change IntField build class to Number, so the html code will be `<input type="number"/>`
* Change DateTimeField html creation with UTC to no UTC.
* Fix `GET` and `POST` bind to same url but with different method will be replaced bug
* Fix `u"""` and `u'''` bug in pyini process
* Skip empty templates directories when startup
* Module of template_plugins can be configured in settings.ini
* Add `df` parameter to common.copy_dir processor callback function
* Remove `return`, `continue`, `break` unindent process, so only `pass` will unindent used
* Add `generic` command, you can use it to create scafold of List, Add, View, Edit, Delete,
it support angularjs, html, easyui theme.
* Add `Builder` class to html.py, then refactor `generic.DetailView` , so you can use
`{{<< view.body}}` to get the body result but not the whole paragraph.
* Add `kwargs` to ORM get, filter, and also add `for_update` method to Result, so.
you can do select with for update lock, for example:
Model.get(Model.c.id==id, for_update=True)
Model.filter(condition).for_update().filter(condition)
* generic ListView and SimpleListView can get value of page and rows from request,
so if you pass these variables in the GET or POST, you don't need to parse them
and then pass them to ListView or SimpleListView, you can just skip them, ListView
and SimpleListView will parse them automatically
* `Result.for_update` can receive an argument, default it `True`, and string also
can be accpeted, please see the sqlalchemy doc http://docs.sqlalchemy.org/en/latest/core/expression_api.html for details.
* Add secretkey app, when you installed this app, you can execute cmd:
uliweb makekey
to create a secretkey file, which will be locate in current directory by default. Then:
from uliweb import functions
des = functions.get_cipher()
d = des.encrypt('hello')
des.descrypt(d)
* Remove pagecache app
* Add `safe_unicode` and `safe_str` support i18n LazyString class
* Refactor generic.ListView and generic.SimpleListView output, the table will be
and Builder object, so you can:
table.begine
table.colgroup
table.head
table.body
table.end
* Add `get_input()` to command.py, you can use it to get a value from command line
if an option is not given
* Remove APP_LAYOUT functionality, and it can be replaced with
settings.APP_LAYOUTS.get('messages', 'layout.html')
so you can still config app's layout template in settings.ini. Another way is
to replace app's layout template in a new app with the same filename, and then
install it after the original app in `INSTALLED_APPS`.