diff --git a/VERSION b/VERSION
index e9cf101e..7da240bd 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-Version 2.5.1-stable+timestamp.2013.06.11.08.00.05
+Version 2.5.1-stable+timestamp.2013.06.13.15.20.01
diff --git a/applications/admin/controllers/appadmin.py b/applications/admin/controllers/appadmin.py
index 07e9163d..101e231b 100644
--- a/applications/admin/controllers/appadmin.py
+++ b/applications/admin/controllers/appadmin.py
@@ -16,8 +16,6 @@ try:
except ImportError:
pgv = None
-response.subtitle = 'Database Administration (appadmin)'
-
# ## critical --- make a copy of the environment
global_env = copy.copy(globals())
@@ -37,14 +35,26 @@ if request.env.http_x_forwarded_for or request.is_https:
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
raise HTTP(200, T('appadmin is disabled because insecure channel'))
-if request.function in ('auth_manage','manage') and 'auth' in globals():
- auth.requires_membership(auth.settings.manager_group_role)(lambda: None)()
+if request.function == 'manage':
+ if not 'auth' in globals() or not request.args:
+ redirect(URL(request.controller, 'index'))
+ if request.args(0) == 'auth':
+ manager_action = dict(role=auth.settings.auth_manager_role,
+ heading=T('Manage Access Control'),
+ tables=[auth.settings.table_user,
+ auth.settings.table_group,
+ auth.settings.table_permission])
+ else:
+ manager_action = auth.settings.manager_actions.get(request.args(0), None)
+ manager_role = manager_action.get('role', None) if manager_action else None
+ auth.requires_membership(manager_role)(lambda: None)()
menu = False
elif (request.application == 'admin' and not session.authorized) or \
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
redirect(URL('admin', 'default', 'index',
vars=dict(send=URL(args=request.args, vars=request.vars))))
else:
+ response.subtitle = 'Database Administration (appadmin)'
menu = True
ignore_rw = True
@@ -580,34 +590,40 @@ def bg_graph_model():
def graph_model():
return dict(databases=databases, pgv=pgv)
-def auth_manage():
- tablename = request.args(0)
- if not tablename or not tablename in auth.db.tables:
- return dict()
- table = auth.db[tablename]
- formname = '%s_grid' % tablename
- if tablename == auth.settings.table_user_name:
+def manage():
+ tables = manager_action['tables']
+ if isinstance(tables[0], str):
+ db = manager_action.get('db', auth.db)
+ db = globals()[db] if isinstance(db, str) else db
+ tables = [db[table] for table in tables]
+ if request.extension != 'load':
+ return dict(heading=manager_action.get('heading',
+ T('Manage %(action)s') % dict(action=request.args(0).replace('_', ' ').title())),
+ tablenames=[table._tablename for table in tables])
+ table = tables[request.args(1, cast=int)]
+ formname = '%s_grid' % table._tablename
+ linked_tables = orderby = None
+
+ if request.args(0) == 'auth':
+ auth.settings.table_group._id.readable = \
+ auth.settings.table_membership._id.readable = \
+ auth.settings.table_permission._id.readable = False
auth.settings.table_user._plural = T('Users')
- auth.settings.table_membership._plural = T('Roles')
- auth.settings.table_membership._id.readable = False
+ auth.settings.table_group._plural = T('Roles')
+ auth.settings.table_membership._plural = T('Memberships')
auth.settings.table_membership.user_id.label = T('User')
auth.settings.table_membership.group_id.label = T('Role')
- grid = SQLFORM.smartgrid(table, args=request.args[:1], user_signature=True,
- linked_tables=[auth.settings.table_membership_name],
- maxtextlength=1000, formname=formname)
- else:
- table._id.readable = False
+ auth.settings.table_permission._plural = T('Permissions')
auth.settings.table_permission.group_id.label = T('Role')
auth.settings.table_permission.name.label = T('Permission')
- orderby = 'role' if table == auth.settings.table_group_name else 'group_id'
- grid = SQLFORM.grid(table, args=request.args[:1], orderby=table[orderby],
- user_signature=True, maxtextlength=1000, formname=formname)
- return grid if request.extension=='load' else dict(grid=grid)
+ if table == auth.settings.table_user:
+ linked_tables=[auth.settings.table_membership_name]
+ elif table == auth.settings.table_group:
+ orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
+ elif table == auth.settings.table_permission:
+ orderby = 'group_id'
-def manage():
- tablename = request.args(0)
- if tablename in auth.db.tables:
- grid = SQLFORM.smartgrid(auth.db[tablename], args=request.args[:1])
- else:
- return dict()
- return grid if request.extension=='load' else dict(grid=grid)
+ grid = SQLFORM.smartgrid(table, args=request.args[:2], user_signature=True,
+ orderby=orderby, linked_tables=linked_tables,
+ maxtextlength=1000, formname=formname)
+ return grid
diff --git a/applications/admin/views/appadmin.html b/applications/admin/views/appadmin.html
index 2678e573..5de90dc8 100644
--- a/applications/admin/views/appadmin.html
+++ b/applications/admin/views/appadmin.html
@@ -248,37 +248,21 @@
{{pass}}
{{pass}}
-{{if request.function == 'auth_manage':}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_user_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_group_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_permission_name,ajax=True)}}
-
-
-{{elif request.function == 'manage':}}
-
- {{for tablename in auth.db.tables:}}
-
- {{=LOAD(f='manage.load', args=tablename,ajax=True)}}
+ {{for k, tablename in enumerate(tablenames):}}
+
+ {{=LOAD(f='manage.load', args=[request.args(0), k], ajax=True)}}
{{pass}}
diff --git a/applications/examples/controllers/appadmin.py b/applications/examples/controllers/appadmin.py
index 07e9163d..101e231b 100644
--- a/applications/examples/controllers/appadmin.py
+++ b/applications/examples/controllers/appadmin.py
@@ -16,8 +16,6 @@ try:
except ImportError:
pgv = None
-response.subtitle = 'Database Administration (appadmin)'
-
# ## critical --- make a copy of the environment
global_env = copy.copy(globals())
@@ -37,14 +35,26 @@ if request.env.http_x_forwarded_for or request.is_https:
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
raise HTTP(200, T('appadmin is disabled because insecure channel'))
-if request.function in ('auth_manage','manage') and 'auth' in globals():
- auth.requires_membership(auth.settings.manager_group_role)(lambda: None)()
+if request.function == 'manage':
+ if not 'auth' in globals() or not request.args:
+ redirect(URL(request.controller, 'index'))
+ if request.args(0) == 'auth':
+ manager_action = dict(role=auth.settings.auth_manager_role,
+ heading=T('Manage Access Control'),
+ tables=[auth.settings.table_user,
+ auth.settings.table_group,
+ auth.settings.table_permission])
+ else:
+ manager_action = auth.settings.manager_actions.get(request.args(0), None)
+ manager_role = manager_action.get('role', None) if manager_action else None
+ auth.requires_membership(manager_role)(lambda: None)()
menu = False
elif (request.application == 'admin' and not session.authorized) or \
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
redirect(URL('admin', 'default', 'index',
vars=dict(send=URL(args=request.args, vars=request.vars))))
else:
+ response.subtitle = 'Database Administration (appadmin)'
menu = True
ignore_rw = True
@@ -580,34 +590,40 @@ def bg_graph_model():
def graph_model():
return dict(databases=databases, pgv=pgv)
-def auth_manage():
- tablename = request.args(0)
- if not tablename or not tablename in auth.db.tables:
- return dict()
- table = auth.db[tablename]
- formname = '%s_grid' % tablename
- if tablename == auth.settings.table_user_name:
+def manage():
+ tables = manager_action['tables']
+ if isinstance(tables[0], str):
+ db = manager_action.get('db', auth.db)
+ db = globals()[db] if isinstance(db, str) else db
+ tables = [db[table] for table in tables]
+ if request.extension != 'load':
+ return dict(heading=manager_action.get('heading',
+ T('Manage %(action)s') % dict(action=request.args(0).replace('_', ' ').title())),
+ tablenames=[table._tablename for table in tables])
+ table = tables[request.args(1, cast=int)]
+ formname = '%s_grid' % table._tablename
+ linked_tables = orderby = None
+
+ if request.args(0) == 'auth':
+ auth.settings.table_group._id.readable = \
+ auth.settings.table_membership._id.readable = \
+ auth.settings.table_permission._id.readable = False
auth.settings.table_user._plural = T('Users')
- auth.settings.table_membership._plural = T('Roles')
- auth.settings.table_membership._id.readable = False
+ auth.settings.table_group._plural = T('Roles')
+ auth.settings.table_membership._plural = T('Memberships')
auth.settings.table_membership.user_id.label = T('User')
auth.settings.table_membership.group_id.label = T('Role')
- grid = SQLFORM.smartgrid(table, args=request.args[:1], user_signature=True,
- linked_tables=[auth.settings.table_membership_name],
- maxtextlength=1000, formname=formname)
- else:
- table._id.readable = False
+ auth.settings.table_permission._plural = T('Permissions')
auth.settings.table_permission.group_id.label = T('Role')
auth.settings.table_permission.name.label = T('Permission')
- orderby = 'role' if table == auth.settings.table_group_name else 'group_id'
- grid = SQLFORM.grid(table, args=request.args[:1], orderby=table[orderby],
- user_signature=True, maxtextlength=1000, formname=formname)
- return grid if request.extension=='load' else dict(grid=grid)
+ if table == auth.settings.table_user:
+ linked_tables=[auth.settings.table_membership_name]
+ elif table == auth.settings.table_group:
+ orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
+ elif table == auth.settings.table_permission:
+ orderby = 'group_id'
-def manage():
- tablename = request.args(0)
- if tablename in auth.db.tables:
- grid = SQLFORM.smartgrid(auth.db[tablename], args=request.args[:1])
- else:
- return dict()
- return grid if request.extension=='load' else dict(grid=grid)
+ grid = SQLFORM.smartgrid(table, args=request.args[:2], user_signature=True,
+ orderby=orderby, linked_tables=linked_tables,
+ maxtextlength=1000, formname=formname)
+ return grid
diff --git a/applications/examples/views/appadmin.html b/applications/examples/views/appadmin.html
index 2678e573..5de90dc8 100644
--- a/applications/examples/views/appadmin.html
+++ b/applications/examples/views/appadmin.html
@@ -248,37 +248,21 @@
{{pass}}
{{pass}}
-{{if request.function == 'auth_manage':}}
-
{{=T('Manage Access Control')}}
+{{if request.function == 'manage':}}
+{{labels = ['Users', 'Roles', 'Permissions'] if request.args(0) == 'auth' else [name.replace('_', ' ').title() for name in tablenames]}}
+
{{=heading}}
-
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_user_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_group_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_permission_name,ajax=True)}}
-
-
-{{elif request.function == 'manage':}}
-
{{=T('Manage Access Control')}}
-
- {{for k,tablename in enumerate(auth.db.tables):}}
- - {{=tablename}}
+ {{for k, tablename in enumerate(tablenames):}}
+ -
+ {{=labels[k]}}
+
{{pass}}
- {{for tablename in auth.db.tables:}}
-
- {{=LOAD(f='manage.load', args=tablename,ajax=True)}}
+ {{for k, tablename in enumerate(tablenames):}}
+
+ {{=LOAD(f='manage.load', args=[request.args(0), k], ajax=True)}}
{{pass}}
diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py
index 07e9163d..101e231b 100644
--- a/applications/welcome/controllers/appadmin.py
+++ b/applications/welcome/controllers/appadmin.py
@@ -16,8 +16,6 @@ try:
except ImportError:
pgv = None
-response.subtitle = 'Database Administration (appadmin)'
-
# ## critical --- make a copy of the environment
global_env = copy.copy(globals())
@@ -37,14 +35,26 @@ if request.env.http_x_forwarded_for or request.is_https:
elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"):
raise HTTP(200, T('appadmin is disabled because insecure channel'))
-if request.function in ('auth_manage','manage') and 'auth' in globals():
- auth.requires_membership(auth.settings.manager_group_role)(lambda: None)()
+if request.function == 'manage':
+ if not 'auth' in globals() or not request.args:
+ redirect(URL(request.controller, 'index'))
+ if request.args(0) == 'auth':
+ manager_action = dict(role=auth.settings.auth_manager_role,
+ heading=T('Manage Access Control'),
+ tables=[auth.settings.table_user,
+ auth.settings.table_group,
+ auth.settings.table_permission])
+ else:
+ manager_action = auth.settings.manager_actions.get(request.args(0), None)
+ manager_role = manager_action.get('role', None) if manager_action else None
+ auth.requires_membership(manager_role)(lambda: None)()
menu = False
elif (request.application == 'admin' and not session.authorized) or \
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
redirect(URL('admin', 'default', 'index',
vars=dict(send=URL(args=request.args, vars=request.vars))))
else:
+ response.subtitle = 'Database Administration (appadmin)'
menu = True
ignore_rw = True
@@ -580,34 +590,40 @@ def bg_graph_model():
def graph_model():
return dict(databases=databases, pgv=pgv)
-def auth_manage():
- tablename = request.args(0)
- if not tablename or not tablename in auth.db.tables:
- return dict()
- table = auth.db[tablename]
- formname = '%s_grid' % tablename
- if tablename == auth.settings.table_user_name:
+def manage():
+ tables = manager_action['tables']
+ if isinstance(tables[0], str):
+ db = manager_action.get('db', auth.db)
+ db = globals()[db] if isinstance(db, str) else db
+ tables = [db[table] for table in tables]
+ if request.extension != 'load':
+ return dict(heading=manager_action.get('heading',
+ T('Manage %(action)s') % dict(action=request.args(0).replace('_', ' ').title())),
+ tablenames=[table._tablename for table in tables])
+ table = tables[request.args(1, cast=int)]
+ formname = '%s_grid' % table._tablename
+ linked_tables = orderby = None
+
+ if request.args(0) == 'auth':
+ auth.settings.table_group._id.readable = \
+ auth.settings.table_membership._id.readable = \
+ auth.settings.table_permission._id.readable = False
auth.settings.table_user._plural = T('Users')
- auth.settings.table_membership._plural = T('Roles')
- auth.settings.table_membership._id.readable = False
+ auth.settings.table_group._plural = T('Roles')
+ auth.settings.table_membership._plural = T('Memberships')
auth.settings.table_membership.user_id.label = T('User')
auth.settings.table_membership.group_id.label = T('Role')
- grid = SQLFORM.smartgrid(table, args=request.args[:1], user_signature=True,
- linked_tables=[auth.settings.table_membership_name],
- maxtextlength=1000, formname=formname)
- else:
- table._id.readable = False
+ auth.settings.table_permission._plural = T('Permissions')
auth.settings.table_permission.group_id.label = T('Role')
auth.settings.table_permission.name.label = T('Permission')
- orderby = 'role' if table == auth.settings.table_group_name else 'group_id'
- grid = SQLFORM.grid(table, args=request.args[:1], orderby=table[orderby],
- user_signature=True, maxtextlength=1000, formname=formname)
- return grid if request.extension=='load' else dict(grid=grid)
+ if table == auth.settings.table_user:
+ linked_tables=[auth.settings.table_membership_name]
+ elif table == auth.settings.table_group:
+ orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
+ elif table == auth.settings.table_permission:
+ orderby = 'group_id'
-def manage():
- tablename = request.args(0)
- if tablename in auth.db.tables:
- grid = SQLFORM.smartgrid(auth.db[tablename], args=request.args[:1])
- else:
- return dict()
- return grid if request.extension=='load' else dict(grid=grid)
+ grid = SQLFORM.smartgrid(table, args=request.args[:2], user_signature=True,
+ orderby=orderby, linked_tables=linked_tables,
+ maxtextlength=1000, formname=formname)
+ return grid
diff --git a/applications/welcome/views/appadmin.html b/applications/welcome/views/appadmin.html
index 2678e573..5de90dc8 100644
--- a/applications/welcome/views/appadmin.html
+++ b/applications/welcome/views/appadmin.html
@@ -248,37 +248,21 @@
{{pass}}
{{pass}}
-{{if request.function == 'auth_manage':}}
-
{{=T('Manage Access Control')}}
+{{if request.function == 'manage':}}
+{{labels = ['Users', 'Roles', 'Permissions'] if request.args(0) == 'auth' else [name.replace('_', ' ').title() for name in tablenames]}}
+
{{=heading}}
-
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_user_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_group_name,ajax=True)}}
-
-
- {{=LOAD(f='auth_manage.load', args=auth.settings.table_permission_name,ajax=True)}}
-
-
-{{elif request.function == 'manage':}}
-
{{=T('Manage Access Control')}}
-
- {{for k,tablename in enumerate(auth.db.tables):}}
- - {{=tablename}}
+ {{for k, tablename in enumerate(tablenames):}}
+ -
+ {{=labels[k]}}
+
{{pass}}
- {{for tablename in auth.db.tables:}}
-
- {{=LOAD(f='manage.load', args=tablename,ajax=True)}}
+ {{for k, tablename in enumerate(tablenames):}}
+
+ {{=LOAD(f='manage.load', args=[request.args(0), k], ajax=True)}}
{{pass}}
diff --git a/applications/welcome/views/layout.html b/applications/welcome/views/layout.html
index 1b910514..3a99857b 100644
--- a/applications/welcome/views/layout.html
+++ b/applications/welcome/views/layout.html
@@ -67,7 +67,7 @@
-
+
{{=response.flash or ''}}
diff --git a/gluon/contrib/AuthorizeNet.py b/gluon/contrib/AuthorizeNet.py
index da882d08..aa7e1c6c 100755
--- a/gluon/contrib/AuthorizeNet.py
+++ b/gluon/contrib/AuthorizeNet.py
@@ -3,7 +3,7 @@ AIM class to credit card payment with authorize.net
Fork of authnet code written by John Conde
http://www.johnconde.net/blog/integrate-the-authorizenet-aim-api-with-python-3-2/
-Unkown license, assuming public domain
+Unknown license, assuming public domain
Modifed by Massimo Di Pierro
diff --git a/gluon/contrib/DowCommerce.py b/gluon/contrib/DowCommerce.py
index d06b088f..21e1ce09 100644
--- a/gluon/contrib/DowCommerce.py
+++ b/gluon/contrib/DowCommerce.py
@@ -3,7 +3,7 @@ DowCommerce class to process credit card payments with DowCommerce.com
Modifications to support Dow Commerce API from code originally written by John Conde
http://www.johnconde.net/blog/integrate-the-authorizenet-aim-api-with-python-3-2/
-Unkown license, assuming public domain
+Unknown license, assuming public domain
Modifed by Dave Stoll dave.stoll@gmail.com
diff --git a/gluon/contrib/memdb.py b/gluon/contrib/memdb.py
index 382739e8..6396cfe2 100644
--- a/gluon/contrib/memdb.py
+++ b/gluon/contrib/memdb.py
@@ -236,7 +236,7 @@ class Table(DALStorage):
field.name))
elif not field.type in self._db._translator\
or not self._db._translator[field.type]:
- raise SyntaxError('Field: unkown field type %s' % field.type)
+ raise SyntaxError('Field: unknown field type %s' % field.type)
self._tableobj = self._db.client
return None
diff --git a/gluon/dal.py b/gluon/dal.py
index 4f169cf3..9289442d 100644
--- a/gluon/dal.py
+++ b/gluon/dal.py
@@ -1007,7 +1007,7 @@ class BaseAdapter(ConnectionPool):
def fix(item):
k,v=item
if not isinstance(v,dict):
- v=dict(type='unkown',sql=v)
+ v=dict(type='unknown',sql=v)
return k.lower(),v
# make sure all field names are lower case to avoid
# migrations because of case cahnge
@@ -9176,7 +9176,7 @@ class SQLCustomType(object):
class FieldVirtual(object):
def __init__(self, name, f=None, ftype='string',label=None,table_name=None):
# for backward compatibility
- (self.name, self.f) = (name, f) if f else ('unkown', name)
+ (self.name, self.f) = (name, f) if f else ('unknown', name)
self.type = ftype
self.label = label or self.name.capitalize().replace('_',' ')
self.represent = lambda v,r:v
@@ -9194,7 +9194,7 @@ class FieldVirtual(object):
class FieldMethod(object):
def __init__(self, name, f=None, handler=None):
# for backward compatibility
- (self.name, self.f) = (name, f) if f else ('unkown', name)
+ (self.name, self.f) = (name, f) if f else ('unknown', name)
self.handler = handler
def list_represent(x,r=None):
diff --git a/gluon/serializers.py b/gluon/serializers.py
index 88e72a78..4b92e47b 100644
--- a/gluon/serializers.py
+++ b/gluon/serializers.py
@@ -130,7 +130,7 @@ def csv(value):
def ics(events, title=None, link=None, timeshift=0, calname=True,
**ignored):
import datetime
- title = title or '(unkown)'
+ title = title or '(unknown)'
if link and not callable(link):
link = lambda item, prefix=link: prefix.replace(
'[id]', str(item['id']))
diff --git a/gluon/tools.py b/gluon/tools.py
index e84f0b9e..fb46e796 100644
--- a/gluon/tools.py
+++ b/gluon/tools.py
@@ -878,7 +878,8 @@ class Auth(object):
alternate_requires_registration=False,
create_user_groups="user_%(id)s",
everybody_group_id=None,
- manager_group_role=None,
+ manager_actions={},
+ auth_manager_role=None,
login_captcha=None,
register_captcha=None,
retrieve_username_captcha=None,