- {{is_mobile=request.user_agent().is_mobile}}
+
{{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')}}
{{pass}}
diff --git a/gluon/admin.py b/gluon/admin.py
index 8801d44b..abaaf319 100644
--- a/gluon/admin.py
+++ b/gluon/admin.py
@@ -377,7 +377,7 @@ def check_new_version(myversion, version_URL):
version = urlopen(version_URL).read()
pversion = parse_version(version)
pmyversion = parse_version(myversion)
- except Exception,e:
+ except IOError:
import traceback
print traceback.format_exc()
return -1, myversion
diff --git a/gluon/contrib/memcache/__init__.py b/gluon/contrib/memcache/__init__.py
index 9f85ec57..a2a095dd 100644
--- a/gluon/contrib/memcache/__init__.py
+++ b/gluon/contrib/memcache/__init__.py
@@ -15,7 +15,7 @@ from gluon import current
DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram)
def MemcacheClient(*a, **b):
- if not hasattr(current,'__mc_instance'):
+ if not hasattr(current,'__memcache_client'):
current.__memcache_client = MemcacheClientObj(*a, **b)
return current.__memcache_client
diff --git a/gluon/dal.py b/gluon/dal.py
index a678c820..22db9a76 100644
--- a/gluon/dal.py
+++ b/gluon/dal.py
@@ -1364,7 +1364,7 @@ class BaseAdapter(ConnectionPool):
def expand(self, expression, field_type=None):
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 (
'string','text','json','password'):
out = 'CAST(%s AS %s)' % (out, self.types['text'])
@@ -6869,11 +6869,8 @@ class Row(object):
def __getitem__(self, k):
key=str(k)
- _extra = getattr(self, '_extra', None)
- if _extra:
- return _extra.get(key)
- if v:
- return v
+ if key in self.get('_extra',{}):
+ return self._extra[key]
m = REGEX_TABLE_DOT_FIELD.match(key)
if m:
try:
@@ -8485,10 +8482,10 @@ class Table(object):
def __str__(self):
if self._ot is not None:
- return self._db._adapter.QUOTE_TEMPLATE % self._ot
- #if 'Oracle' in str(type(self._db._adapter)): # <<< patch
- # return '%s %s' % (self._ot, self._tablename) # <<< patch
- #return '%s AS %s' % (self._ot, self._tablename)
+ ot = self._db._adapter.QUOTE_TEMPLATE % self._ot
+ if 'Oracle' in str(type(self._db._adapter)):
+ return '%s %s' % (ot, self._tablename)
+ return '%s AS %s' % (ot, self._tablename)
return self._tablename
def _drop(self, mode = ''):
diff --git a/gluon/http.py b/gluon/http.py
index fd429f9d..dda977b5 100644
--- a/gluon/http.py
+++ b/gluon/http.py
@@ -51,18 +51,10 @@ defined_status = {
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+$')
-class HTTP(BaseException):
+class HTTP(Exception):
def __init__(
self,
diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py
index 26720803..5db36e7c 100644
--- a/gluon/sqlhtml.py
+++ b/gluon/sqlhtml.py
@@ -1116,7 +1116,7 @@ class SQLFORM(FORM):
inp = self.widgets[field_type].widget(field, default)
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[
fieldname] = inpval if not inpval is None else ''
self.custom.widget[fieldname] = inp
diff --git a/gluon/tools.py b/gluon/tools.py
index e2e2bd09..592de93c 100644
--- a/gluon/tools.py
+++ b/gluon/tools.py
@@ -4437,7 +4437,9 @@ class Service(object):
jsonrpc_2 = data.get('jsonrpc')
if jsonrpc_2: #hand over to version 2 of the protocol
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:
return return_error(id, 100, 'method "%s" does not exist' % method)
try:
@@ -4450,15 +4452,12 @@ class Service(object):
return return_response(id, s)
except Service.JsonRpcException, e:
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:
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):
@@ -4560,14 +4559,11 @@ class Service(object):
raise e
except Service.JsonRpcException, e:
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:
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):
@@ -5214,7 +5210,6 @@ class Wiki(object):
def automenu(self):
"""adds the menu if not present"""
- request = current.request
if not self.wiki_menu_items and self.settings.controller and self.settings.function:
self.wiki_menu_items = self.menu(self.settings.controller,
self.settings.function)
diff --git a/gluon/widget.py b/gluon/widget.py
index cbd0a3f7..7049af95 100644
--- a/gluon/widget.py
+++ b/gluon/widget.py
@@ -39,11 +39,6 @@ except:
have_winservice = False
-try:
- BaseException
-except NameError:
- BaseException = Exception
-
ProgramName = 'web2py Web Framework'
ProgramAuthor = 'Created by Massimo Di Pierro, Copyright 2007-' + str(
datetime.datetime.now().year)
@@ -53,8 +48,8 @@ ProgramInfo = '''%s
%s
%s''' % (ProgramName, ProgramAuthor, ProgramVersion)
-if not sys.version[:3] in ['2.4', '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'
+if not sys.version[:3] in ['2.5', '2.6', '2.7']:
+ msg = 'Warning: web2py requires Python 2.5, 2.6 or 2.7 but you are running:\n%s'
msg = msg % sys.version
sys.stderr.write(msg)