R-2.9.12
This commit is contained in:
@@ -1,3 +1,21 @@
|
|||||||
|
## 2.9.12
|
||||||
|
|
||||||
|
- Tornado HTTPS support, thanks Diego
|
||||||
|
- Modular DAL, thanks Giovanni
|
||||||
|
- Added coverage support, thanks Niphlod
|
||||||
|
- More tests, thanks Niphlod and Paolo Valleri
|
||||||
|
- Added support for show_if in readonly sqlform, thanks Paolo
|
||||||
|
- Improved scheduler, thanks Niphlod
|
||||||
|
- Email timeout support
|
||||||
|
- Made web2py's custom_import work with circular imports, thanks Jack Kuan
|
||||||
|
- Added Portuguese, Catalan, and Burmese translations
|
||||||
|
- Allow map_hyphen to work for application names, thanks Tim Nyborg
|
||||||
|
- New module appconfig.py, thanks Niphlod
|
||||||
|
- Added geospatial support to Teradata adaptor, thanks Andrew Willimott
|
||||||
|
- Many bug fixes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 2.9.6 - 2.9.10
|
## 2.9.6 - 2.9.10
|
||||||
|
|
||||||
- fixed support of GAE + SQL
|
- fixed support of GAE + SQL
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ update:
|
|||||||
echo "remember that pymysql was tweaked"
|
echo "remember that pymysql was tweaked"
|
||||||
src:
|
src:
|
||||||
### Use semantic versioning
|
### Use semantic versioning
|
||||||
echo 'Version 2.9.12-beta+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
|
echo 'Version 2.9.12-stable+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
|
||||||
### rm -f all junk files
|
### rm -f all junk files
|
||||||
make clean
|
make clean
|
||||||
### clean up baisc apps
|
### clean up baisc apps
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
Version 2.9.12-beta+timestamp.2015.01.15.09.58.09
|
Version 2.9.12-stable+timestamp.2015.01.17.00.07.04
|
||||||
|
|||||||
@@ -1278,7 +1278,7 @@ def create_file():
|
|||||||
path = abspath(request.vars.location)
|
path = abspath(request.vars.location)
|
||||||
else:
|
else:
|
||||||
if request.vars.dir:
|
if request.vars.dir:
|
||||||
request.vars.location += request.vars.dir + '/'
|
request.vars.location += request.vars.dir + '/'
|
||||||
app = get_app(name=request.vars.location.split('/')[0])
|
app = get_app(name=request.vars.location.split('/')[0])
|
||||||
path = apath(request.vars.location, r=request)
|
path = apath(request.vars.location, r=request)
|
||||||
filename = re.sub('[^\w./-]+', '_', request.vars.filename)
|
filename = re.sub('[^\w./-]+', '_', request.vars.filename)
|
||||||
@@ -1434,36 +1434,36 @@ def create_file():
|
|||||||
""" % URL('edit', args=[app,request.vars.dir,filename])
|
""" % URL('edit', args=[app,request.vars.dir,filename])
|
||||||
return ''
|
return ''
|
||||||
else:
|
else:
|
||||||
redirect(request.vars.sender + anchor)
|
redirect(request.vars.sender + anchor)
|
||||||
|
|
||||||
|
|
||||||
def listfiles(app, dir, regexp='.*\.py$'):
|
def listfiles(app, dir, regexp='.*\.py$'):
|
||||||
files = sorted(
|
files = sorted(
|
||||||
listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp))
|
listdir(apath('%(app)s/%(dir)s/' % {'app':app, 'dir':dir}, r=request), regexp))
|
||||||
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
||||||
return files
|
return files
|
||||||
|
|
||||||
def editfile(path,file,vars={}, app = None):
|
def editfile(path,file,vars={}, app = None):
|
||||||
args=(path,file) if 'app' in vars else (app,path,file)
|
args=(path,file) if 'app' in vars else (app,path,file)
|
||||||
url = URL('edit', args=args, vars=vars)
|
url = URL('edit', args=args, vars=vars)
|
||||||
return A(file, _class='editor_filelink', _href=url, _style='word-wrap: nowrap;')
|
return A(file, _class='editor_filelink', _href=url, _style='word-wrap: nowrap;')
|
||||||
|
|
||||||
def files_menu():
|
def files_menu():
|
||||||
app = request.vars.app or 'welcome'
|
app = request.vars.app or 'welcome'
|
||||||
dirs=[{'name':'models', 'reg':'.*\.py$'},
|
dirs=[{'name':'models', 'reg':'.*\.py$'},
|
||||||
{'name':'controllers', 'reg':'.*\.py$'},
|
{'name':'controllers', 'reg':'.*\.py$'},
|
||||||
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
{'name':'views', 'reg':'[\w/\-]+(\.\w+)+$'},
|
||||||
{'name':'modules', 'reg':'.*\.py$'},
|
{'name':'modules', 'reg':'.*\.py$'},
|
||||||
{'name':'static', 'reg': '[^\.#].*'},
|
{'name':'static', 'reg': '[^\.#].*'},
|
||||||
{'name':'private', 'reg':'.*\.py$'}]
|
{'name':'private', 'reg':'.*\.py$'}]
|
||||||
result_files = []
|
result_files = []
|
||||||
for dir in dirs:
|
for dir in dirs:
|
||||||
result_files.append(TAG[''](LI(dir['name'], _class="nav-header component", _onclick="collapse('" + dir['name'] + "_files');"),
|
result_files.append(TAG[''](LI(dir['name'], _class="nav-header component", _onclick="collapse('" + dir['name'] + "_files');"),
|
||||||
LI(UL(*[LI(editfile(dir['name'], f, dict(id=dir['name'] + f.replace('.','__')), app), _style="overflow:hidden", _id=dir['name']+"__"+f.replace('.','__'))
|
LI(UL(*[LI(editfile(dir['name'], f, dict(id=dir['name'] + f.replace('.','__')), app), _style="overflow:hidden", _id=dir['name']+"__"+f.replace('.','__'))
|
||||||
for f in listfiles(app, dir['name'], regexp=dir['reg'])],
|
for f in listfiles(app, dir['name'], regexp=dir['reg'])],
|
||||||
_class="nav nav-list small-font"),
|
_class="nav nav-list small-font"),
|
||||||
_id=dir['name'] + '_files', _style="display: none;")))
|
_id=dir['name'] + '_files', _style="display: none;")))
|
||||||
return dict(result_files = result_files)
|
return dict(result_files = result_files)
|
||||||
|
|
||||||
def upload_file():
|
def upload_file():
|
||||||
""" File uploading handler """
|
""" File uploading handler """
|
||||||
@@ -1941,4 +1941,3 @@ def install_plugin():
|
|||||||
T('unable to install plugin "%s"', filename)
|
T('unable to install plugin "%s"', filename)
|
||||||
redirect(URL(f="plugins", args=[app,]))
|
redirect(URL(f="plugins", args=[app,]))
|
||||||
return dict(form=form, app=app, plugin=plugin, source=source)
|
return dict(form=form, app=app, plugin=plugin, source=source)
|
||||||
|
|
||||||
|
|||||||
@@ -47,5 +47,3 @@ if 'adminLanguage' in request.cookies and not (request.cookies['adminLanguage']
|
|||||||
#set static_version
|
#set static_version
|
||||||
from gluon.settings import global_settings
|
from gluon.settings import global_settings
|
||||||
response.static_version = global_settings.web2py_version.split('-')[0]
|
response.static_version = global_settings.web2py_version.split('-')[0]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,4 +34,3 @@ else:
|
|||||||
URL(_a, 'default', f='logout')))
|
URL(_a, 'default', f='logout')))
|
||||||
response.menu.append((T('Debug'), False,
|
response.menu.append((T('Debug'), False,
|
||||||
URL(_a, 'debug', 'interact')))
|
URL(_a, 'debug', 'interact')))
|
||||||
|
|
||||||
|
|||||||
@@ -14,4 +14,3 @@ def stateWidget(field, value, data={'on-label':'Enabled', 'off-label':'Disabled'
|
|||||||
jQuery(".make-bootstrap-switch input[name='%s']").parent().bootstrapSwitch();
|
jQuery(".make-bootstrap-switch input[name='%s']").parent().bootstrapSwitch();
|
||||||
""" % fieldName)
|
""" % fieldName)
|
||||||
return DIV(div, script)
|
return DIV(div, script)
|
||||||
|
|
||||||
|
|||||||
@@ -340,4 +340,3 @@ example_policies = {
|
|||||||
'DELETE':{'query':None},
|
'DELETE':{'query':None},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -252,4 +252,3 @@ class IMAP4(object):
|
|||||||
return Connection()
|
return Connection()
|
||||||
|
|
||||||
IMAP4_SSL = IMAP4
|
IMAP4_SSL = IMAP4
|
||||||
|
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ jQuery(function(){
|
|||||||
<label class="control-label">Card Number</label>
|
<label class="control-label">Card Number</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<input type="text" size="20" data-stripe="number"
|
<input type="text" size="20" data-stripe="number"
|
||||||
placeholder="4242424242424242"/>
|
placeholder="4242424242424242"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ jQuery(function(){
|
|||||||
<label class="control-label">CVC</label>
|
<label class="control-label">CVC</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<input type="text" size="4" style="width:80px" data-stripe="cvc"
|
<input type="text" size="4" style="width:80px" data-stripe="cvc"
|
||||||
placeholder="XXX"/>
|
placeholder="XXX"/>
|
||||||
<a href="http://en.wikipedia.org/wiki/Card_Verification_Code" target="_blank">What is this?</a>
|
<a href="http://en.wikipedia.org/wiki/Card_Verification_Code" target="_blank">What is this?</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -209,10 +209,10 @@ jQuery(function(){
|
|||||||
<label class="control-label">Expiration</label>
|
<label class="control-label">Expiration</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<input type="text" size="2" style="width:40px" data-stripe="exp-month"
|
<input type="text" size="2" style="width:40px" data-stripe="exp-month"
|
||||||
placeholder="MM"/>
|
placeholder="MM"/>
|
||||||
/
|
/
|
||||||
<input type="text" size="4" style="width:80px" data-stripe="exp-year"
|
<input type="text" size="4" style="width:80px" data-stripe="exp-year"
|
||||||
placeholder="YYYY"/>
|
placeholder="YYYY"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
Developed by Massimo Di Pierro
|
Developed by Massimo Di Pierro
|
||||||
Released under the web2py license (LGPL)
|
Released under the web2py license (LGPL)
|
||||||
|
|||||||
@@ -2703,4 +2703,3 @@ class Rows(object):
|
|||||||
# for consistent naming yet backwards compatible
|
# for consistent naming yet backwards compatible
|
||||||
as_csv = __str__
|
as_csv = __str__
|
||||||
json = as_json
|
json = as_json
|
||||||
|
|
||||||
|
|||||||
@@ -1406,4 +1406,3 @@ class TestQuotesByDefault(unittest.TestCase):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
tearDownModule()
|
tearDownModule()
|
||||||
|
|
||||||
|
|||||||
@@ -6169,4 +6169,3 @@ class Config(object):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
doctest.testmod()
|
doctest.testmod()
|
||||||
|
|
||||||
|
|||||||
@@ -350,4 +350,3 @@ def getipaddrinfo(host):
|
|||||||
and isinstance(addrinfo[4][0], basestring)]
|
and isinstance(addrinfo[4][0], basestring)]
|
||||||
except socket.error:
|
except socket.error:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|||||||
@@ -110,4 +110,3 @@ def main():
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|||||||
@@ -218,4 +218,3 @@ class LinuxService(ServiceBase):
|
|||||||
else:
|
else:
|
||||||
cmd = env['update-rc.d']
|
cmd = env['update-rc.d']
|
||||||
return [cmd, self.name, 'remove']
|
return [cmd, self.name, 'remove']
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user