Merge ssh://github.com/web2py/web2py
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.6.0-development+timestamp.2013.06.30.10.46.28
|
Version 2.6.0-development+timestamp.2013.07.02.08.33.02
|
||||||
|
|||||||
@@ -458,32 +458,6 @@ def remove_compiled_app():
|
|||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
def delete():
|
|
||||||
""" Object delete handler """
|
|
||||||
app = get_app()
|
|
||||||
filename = '/'.join(request.args)
|
|
||||||
sender = request.vars.sender
|
|
||||||
|
|
||||||
if isinstance(sender, list): # ## fix a problem with Vista
|
|
||||||
sender = sender[0]
|
|
||||||
|
|
||||||
if 'nodelete' in request.vars:
|
|
||||||
redirect(URL(sender, anchor=request.vars.id))
|
|
||||||
elif 'delete' in request.vars:
|
|
||||||
try:
|
|
||||||
full_path = apath(filename, r=request)
|
|
||||||
lineno = count_lines(open(full_path, 'r').read())
|
|
||||||
os.unlink(full_path)
|
|
||||||
log_progress(app, 'DELETE', filename, progress=-lineno)
|
|
||||||
session.flash = T('file "%(filename)s" deleted',
|
|
||||||
dict(filename=filename))
|
|
||||||
except Exception:
|
|
||||||
session.flash = T('unable to delete file "%(filename)s"',
|
|
||||||
dict(filename=filename))
|
|
||||||
redirect(URL(sender, anchor=request.vars.id2))
|
|
||||||
return dict(filename=filename, sender=sender)
|
|
||||||
|
|
||||||
|
|
||||||
def delete():
|
def delete():
|
||||||
""" Object delete handler """
|
""" Object delete handler """
|
||||||
app = get_app()
|
app = get_app()
|
||||||
|
|||||||
@@ -232,8 +232,8 @@ function load_file (url) {
|
|||||||
if (typeof(json['plain_html']) !== undefined) {
|
if (typeof(json['plain_html']) !== undefined) {
|
||||||
if (jQuery('#' + json['id']).length === 0 || json['force'] === true) {
|
if (jQuery('#' + json['id']).length === 0 || json['force'] === true) {
|
||||||
// Create a tab and put the code in it
|
// Create a tab and put the code in it
|
||||||
var tab_header = '<li><a href="#idDefault" data-toggle="tab">filenameDefault<button type="button" class="close">×</button></a></li>'.replace(/idDefault/, json['id']).replace(/filenameDefault/, json['filename'] );
|
var tab_header = '<li><a href="#'+json['id']+'" data-toggle="tab">'+json['filename']+'<button type="button" class="close">×</button></a></li>';
|
||||||
var tab_body = '<div id="idDefault" class="tab-pane fade in " >htmlDefault</div>'.replace(/htmlDefault/, json['plain_html']).replace(/idDefault/, json['id']);
|
var tab_body = '<div id="' + json['id'] + '" class="tab-pane fade in " >' + json['plain_html'] + '</div>';
|
||||||
if (json['force'] === false) {
|
if (json['force'] === false) {
|
||||||
jQuery('#filesTab').append(jQuery(tab_header));
|
jQuery('#filesTab').append(jQuery(tab_header));
|
||||||
jQuery('#myTabContent').append(jQuery(tab_body));
|
jQuery('#myTabContent').append(jQuery(tab_body));
|
||||||
|
|||||||
@@ -71,16 +71,16 @@
|
|||||||
<div class="flash">{{=response.flash or ''}}</div>
|
<div class="flash">{{=response.flash or ''}}</div>
|
||||||
<div class="navbar-inner">
|
<div class="navbar-inner">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{is_mobile=request.user_agent().is_mobile}}
|
||||||
<!-- the next tag is necessary for bootstrap menus, do not remove -->
|
<!-- the next tag is necessary for bootstrap menus, do not remove -->
|
||||||
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse" style="{{='display:none;' if not is_mobile else ''}}">
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
{{=response.logo or ''}}
|
{{=response.logo or ''}}
|
||||||
<ul id="navbar" class="nav pull-right">{{='auth' in globals() and auth.navbar(mode="dropdown") or ''}}</ul>
|
<ul id="navbar" class="nav pull-right">{{='auth' in globals() and auth.navbar(mode="dropdown") or ''}}</ul>
|
||||||
<div class="nav-collapse">
|
<div class="{{='nav-collapse' if is_mobile else 'nav'}}">
|
||||||
{{is_mobile=request.user_agent().is_mobile}}
|
|
||||||
{{if response.menu:}}
|
{{if response.menu:}}
|
||||||
{{=MENU(response.menu, _class='mobile-menu nav' if is_mobile else 'nav',mobile=is_mobile,li_class='dropdown',ul_class='dropdown-menu')}}
|
{{=MENU(response.menu, _class='mobile-menu nav' if is_mobile else 'nav',mobile=is_mobile,li_class='dropdown',ul_class='dropdown-menu')}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|||||||
+1
-1
@@ -377,7 +377,7 @@ def check_new_version(myversion, version_URL):
|
|||||||
version = urlopen(version_URL).read()
|
version = urlopen(version_URL).read()
|
||||||
pversion = parse_version(version)
|
pversion = parse_version(version)
|
||||||
pmyversion = parse_version(myversion)
|
pmyversion = parse_version(myversion)
|
||||||
except Exception,e:
|
except IOError:
|
||||||
import traceback
|
import traceback
|
||||||
print traceback.format_exc()
|
print traceback.format_exc()
|
||||||
return -1, myversion
|
return -1, myversion
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from gluon import current
|
|||||||
DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram)
|
DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram)
|
||||||
|
|
||||||
def MemcacheClient(*a, **b):
|
def MemcacheClient(*a, **b):
|
||||||
if not hasattr(current,'__mc_instance'):
|
if not hasattr(current,'__memcache_client'):
|
||||||
current.__memcache_client = MemcacheClientObj(*a, **b)
|
current.__memcache_client = MemcacheClientObj(*a, **b)
|
||||||
return current.__memcache_client
|
return current.__memcache_client
|
||||||
|
|
||||||
|
|||||||
+7
-10
@@ -1364,7 +1364,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
|
|
||||||
def expand(self, expression, field_type=None):
|
def expand(self, expression, field_type=None):
|
||||||
if isinstance(expression, Field):
|
if isinstance(expression, Field):
|
||||||
out = '%s.%s' % (expression.table, expression.name)
|
out = '%s.%s' % (expression.table._tablename, expression.name)
|
||||||
if field_type == 'string' and not expression.type in (
|
if field_type == 'string' and not expression.type in (
|
||||||
'string','text','json','password'):
|
'string','text','json','password'):
|
||||||
out = 'CAST(%s AS %s)' % (out, self.types['text'])
|
out = 'CAST(%s AS %s)' % (out, self.types['text'])
|
||||||
@@ -6869,11 +6869,8 @@ class Row(object):
|
|||||||
|
|
||||||
def __getitem__(self, k):
|
def __getitem__(self, k):
|
||||||
key=str(k)
|
key=str(k)
|
||||||
_extra = getattr(self, '_extra', None)
|
if key in self.get('_extra',{}):
|
||||||
if _extra:
|
return self._extra[key]
|
||||||
return _extra.get(key)
|
|
||||||
if v:
|
|
||||||
return v
|
|
||||||
m = REGEX_TABLE_DOT_FIELD.match(key)
|
m = REGEX_TABLE_DOT_FIELD.match(key)
|
||||||
if m:
|
if m:
|
||||||
try:
|
try:
|
||||||
@@ -8485,10 +8482,10 @@ class Table(object):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self._ot is not None:
|
if self._ot is not None:
|
||||||
return self._db._adapter.QUOTE_TEMPLATE % self._ot
|
ot = self._db._adapter.QUOTE_TEMPLATE % self._ot
|
||||||
#if 'Oracle' in str(type(self._db._adapter)): # <<< patch
|
if 'Oracle' in str(type(self._db._adapter)):
|
||||||
# return '%s %s' % (self._ot, self._tablename) # <<< patch
|
return '%s %s' % (ot, self._tablename)
|
||||||
#return '%s AS %s' % (self._ot, self._tablename)
|
return '%s AS %s' % (ot, self._tablename)
|
||||||
return self._tablename
|
return self._tablename
|
||||||
|
|
||||||
def _drop(self, mode = ''):
|
def _drop(self, mode = ''):
|
||||||
|
|||||||
+1
-9
@@ -51,18 +51,10 @@ defined_status = {
|
|||||||
505: 'HTTP VERSION NOT SUPPORTED',
|
505: 'HTTP VERSION NOT SUPPORTED',
|
||||||
}
|
}
|
||||||
|
|
||||||
# If web2py is executed with python2.4 we need
|
|
||||||
# to use Exception instead of BaseException
|
|
||||||
|
|
||||||
try:
|
|
||||||
BaseException
|
|
||||||
except NameError:
|
|
||||||
BaseException = Exception
|
|
||||||
|
|
||||||
regex_status = re.compile('^\d{3} \w+$')
|
regex_status = re.compile('^\d{3} \w+$')
|
||||||
|
|
||||||
|
|
||||||
class HTTP(BaseException):
|
class HTTP(Exception):
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
|||||||
+1
-1
@@ -1116,7 +1116,7 @@ class SQLFORM(FORM):
|
|||||||
inp = self.widgets[field_type].widget(field, default)
|
inp = self.widgets[field_type].widget(field, default)
|
||||||
|
|
||||||
xfields.append((row_id, label, inp, comment))
|
xfields.append((row_id, label, inp, comment))
|
||||||
self.custom.dspval[fieldname] = dspval or nbsp
|
self.custom.dspval[fieldname] = dspval if (dspval is not None) else nbsp
|
||||||
self.custom.inpval[
|
self.custom.inpval[
|
||||||
fieldname] = inpval if not inpval is None else ''
|
fieldname] = inpval if not inpval is None else ''
|
||||||
self.custom.widget[fieldname] = inp
|
self.custom.widget[fieldname] = inp
|
||||||
|
|||||||
+10
-15
@@ -4437,7 +4437,9 @@ class Service(object):
|
|||||||
jsonrpc_2 = data.get('jsonrpc')
|
jsonrpc_2 = data.get('jsonrpc')
|
||||||
if jsonrpc_2: #hand over to version 2 of the protocol
|
if jsonrpc_2: #hand over to version 2 of the protocol
|
||||||
return self.serve_jsonrpc2(data)
|
return self.serve_jsonrpc2(data)
|
||||||
id, method, params = data['id'], data['method'], data.get('params', '')
|
id, method, params = data.get('id'), data.get('method'), data.get('params', [])
|
||||||
|
if id is None:
|
||||||
|
return return_error(0, 100, 'missing id')
|
||||||
if not method in methods:
|
if not method in methods:
|
||||||
return return_error(id, 100, 'method "%s" does not exist' % method)
|
return return_error(id, 100, 'method "%s" does not exist' % method)
|
||||||
try:
|
try:
|
||||||
@@ -4450,15 +4452,12 @@ class Service(object):
|
|||||||
return return_response(id, s)
|
return return_response(id, s)
|
||||||
except Service.JsonRpcException, e:
|
except Service.JsonRpcException, e:
|
||||||
return return_error(id, e.code, e.info)
|
return return_error(id, e.code, e.info)
|
||||||
except BaseException:
|
|
||||||
etype, eval, etb = sys.exc_info()
|
|
||||||
code = 100
|
|
||||||
message = '%s: %s' % (etype.__name__, eval)
|
|
||||||
data = request.is_local and traceback.format_tb(etb)
|
|
||||||
return return_error(id, code, message, data)
|
|
||||||
except:
|
except:
|
||||||
etype, eval, etb = sys.exc_info()
|
etype, eval, etb = sys.exc_info()
|
||||||
return return_error(id, 100, 'Exception %s: %s' % (etype, eval))
|
message = '%s: %s' % (etype.__name__, eval)
|
||||||
|
data = request.is_local and traceback.format_tb(etb)
|
||||||
|
logger.warning('jsonrpc exception %s\n%s' % (message, traceback.format_tb(etb)))
|
||||||
|
return return_error(id, 100, message, data)
|
||||||
|
|
||||||
def serve_jsonrpc2(self, data=None, batch_element=False):
|
def serve_jsonrpc2(self, data=None, batch_element=False):
|
||||||
|
|
||||||
@@ -4560,14 +4559,11 @@ class Service(object):
|
|||||||
raise e
|
raise e
|
||||||
except Service.JsonRpcException, e:
|
except Service.JsonRpcException, e:
|
||||||
return return_error(id, e.code, e.info)
|
return return_error(id, e.code, e.info)
|
||||||
except BaseException:
|
|
||||||
etype, eval, etb = sys.exc_info()
|
|
||||||
code = -32099
|
|
||||||
data = '%s: %s\n' % (etype.__name__, eval) + str(request.is_local and traceback.format_tb(etb))
|
|
||||||
return return_error(id, code, data=data)
|
|
||||||
except:
|
except:
|
||||||
etype, eval, etb = sys.exc_info()
|
etype, eval, etb = sys.exc_info()
|
||||||
return return_error(id, -32099, data='Exception %s: %s' % (etype, eval))
|
data = '%s: %s\n' % (etype.__name__, eval) + str(request.is_local and traceback.format_tb(etb))
|
||||||
|
logger.warning('%s: %s\n%s') % (etype.__name__, eval, traceback.format_tb(etb))
|
||||||
|
return return_error(id, -32099, data=data)
|
||||||
|
|
||||||
|
|
||||||
def serve_xmlrpc(self):
|
def serve_xmlrpc(self):
|
||||||
@@ -5214,7 +5210,6 @@ class Wiki(object):
|
|||||||
|
|
||||||
def automenu(self):
|
def automenu(self):
|
||||||
"""adds the menu if not present"""
|
"""adds the menu if not present"""
|
||||||
request = current.request
|
|
||||||
if not self.wiki_menu_items and self.settings.controller and self.settings.function:
|
if not self.wiki_menu_items and self.settings.controller and self.settings.function:
|
||||||
self.wiki_menu_items = self.menu(self.settings.controller,
|
self.wiki_menu_items = self.menu(self.settings.controller,
|
||||||
self.settings.function)
|
self.settings.function)
|
||||||
|
|||||||
+2
-7
@@ -39,11 +39,6 @@ except:
|
|||||||
have_winservice = False
|
have_winservice = False
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
BaseException
|
|
||||||
except NameError:
|
|
||||||
BaseException = Exception
|
|
||||||
|
|
||||||
ProgramName = 'web2py Web Framework'
|
ProgramName = 'web2py Web Framework'
|
||||||
ProgramAuthor = 'Created by Massimo Di Pierro, Copyright 2007-' + str(
|
ProgramAuthor = 'Created by Massimo Di Pierro, Copyright 2007-' + str(
|
||||||
datetime.datetime.now().year)
|
datetime.datetime.now().year)
|
||||||
@@ -53,8 +48,8 @@ ProgramInfo = '''%s
|
|||||||
%s
|
%s
|
||||||
%s''' % (ProgramName, ProgramAuthor, ProgramVersion)
|
%s''' % (ProgramName, ProgramAuthor, ProgramVersion)
|
||||||
|
|
||||||
if not sys.version[:3] in ['2.4', '2.5', '2.6', '2.7']:
|
if not sys.version[:3] in ['2.5', '2.6', '2.7']:
|
||||||
msg = 'Warning: web2py requires Python 2.4, 2.5 (recommended), 2.6 or 2.7 but you are running:\n%s'
|
msg = 'Warning: web2py requires Python 2.5, 2.6 or 2.7 but you are running:\n%s'
|
||||||
msg = msg % sys.version
|
msg = msg % sys.version
|
||||||
sys.stderr.write(msg)
|
sys.stderr.write(msg)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user