custom import fixes
This commit is contained in:
1 parent
66dd7d4337
commit
6dd9af61fd
4 files changed
+78
-60
No files matched your search
@@ -1 +1 @@
|
|||||||
Version 2.1.0 (2012-10-13 14:36:14) dev
|
Version 2.1.0 (2012-10-14 16:40:34) dev
|
||||||
+11
-19
@@ -13,7 +13,7 @@ NAIVE_IMPORTER = __builtin__.__import__
|
|||||||
TRACK_CHANGES = False
|
TRACK_CHANGES = False
|
||||||
INVALID_MODULES = set(sys.modules.keys()).union(('','gluon','applications','custom_import'))
|
INVALID_MODULES = set(sys.modules.keys()).union(('','gluon','applications','custom_import'))
|
||||||
|
|
||||||
# backward compatibility API
|
# backward compatibility API
|
||||||
def custom_import_install():
|
def custom_import_install():
|
||||||
__builtin__.__import__ = custom_importer
|
__builtin__.__import__ = custom_importer
|
||||||
|
|
||||||
@@ -22,17 +22,14 @@ def track_changes(track=True):
|
|||||||
global TRACK_CHANGES
|
global TRACK_CHANGES
|
||||||
TRACK_CHANGES = track
|
TRACK_CHANGES = track
|
||||||
|
|
||||||
def is_tracking_changes():
|
def is_tracking_changes():
|
||||||
return TRACK_CHANGES
|
return TRACK_CHANGES
|
||||||
|
|
||||||
class CustomImportException(ImportError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
|
def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
|
||||||
"""
|
"""
|
||||||
The web2py custom importer. Like the standard Python importer but it
|
The web2py custom importer. Like the standard Python importer but it
|
||||||
tries to transform import statements as something like
|
tries to transform import statements as something like
|
||||||
"import applications.app_name.modules.x".
|
"import applications.app_name.modules.x".
|
||||||
If the import failed, fall back on naive_importer
|
If the import failed, fall back on naive_importer
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -46,8 +43,7 @@ def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
|
|||||||
if hasattr(current,'request') \
|
if hasattr(current,'request') \
|
||||||
and level<=0 \
|
and level<=0 \
|
||||||
and not name.split('.')[0] in INVALID_MODULES \
|
and not name.split('.')[0] in INVALID_MODULES \
|
||||||
and isinstance(globals, dict):
|
and isinstance(globals, dict):
|
||||||
import_tb = None
|
|
||||||
try:
|
try:
|
||||||
items = current.request.folder.split(os.path.sep)
|
items = current.request.folder.split(os.path.sep)
|
||||||
if not items[-1]: items = items[:-1]
|
if not items[-1]: items = items[:-1]
|
||||||
@@ -56,26 +52,22 @@ def custom_importer(name, globals=None, locals=None, fromlist=None, level=-1):
|
|||||||
# import like "import x" or "import x.y"
|
# import like "import x" or "import x.y"
|
||||||
result = None
|
result = None
|
||||||
for itemname in name.split("."):
|
for itemname in name.split("."):
|
||||||
|
new_mod = base_importer(
|
||||||
|
modules_prefix, globals,locals, [itemname], level)
|
||||||
|
try:
|
||||||
|
result = result or new_mod.__dict__[itemname]
|
||||||
|
except KeyError, e:
|
||||||
|
raise ImportError, 'Cannot import module %s' % str(e)
|
||||||
modules_prefix += "." + itemname
|
modules_prefix += "." + itemname
|
||||||
base_importer(
|
|
||||||
modules_prefix, globals,locals, [], level)
|
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
# import like "from x import a, b, ..."
|
# import like "from x import a, b, ..."
|
||||||
pname = modules_prefix + "." + name
|
pname = modules_prefix + "." + name
|
||||||
return base_importer(pname, globals, locals, fromlist, level)
|
return base_importer(pname, globals, locals, fromlist, level)
|
||||||
except ImportError, e1:
|
except ImportError, e1:
|
||||||
import_tb = sys.exc_info()[2]
|
pass # the module does not exist
|
||||||
try:
|
|
||||||
return NAIVE_IMPORTER(name,globals,locals,fromlist,level)
|
|
||||||
except ImportError, e3:
|
|
||||||
raise ImportError, e1, import_tb.tb_next # there an import error in the module
|
|
||||||
except Exception, e2:
|
except Exception, e2:
|
||||||
raise e2 # there is an error in the module
|
raise e2 # there is an error in the module
|
||||||
finally:
|
|
||||||
if import_tb:
|
|
||||||
import_tb = None
|
|
||||||
|
|
||||||
return NAIVE_IMPORTER(name,globals,locals,fromlist,level)
|
return NAIVE_IMPORTER(name,globals,locals,fromlist,level)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+52
-37
@@ -835,6 +835,9 @@ class BaseAdapter(ConnectionPool):
|
|||||||
|
|
||||||
# add to list of fields
|
# add to list of fields
|
||||||
sql_fields[field_name] = dict(
|
sql_fields[field_name] = dict(
|
||||||
|
length=field.length,
|
||||||
|
unique=field.unique,
|
||||||
|
notnull=field.notnull,
|
||||||
sortable=sortable,
|
sortable=sortable,
|
||||||
type=str(field_type),
|
type=str(field_type),
|
||||||
sql=ftype)
|
sql=ftype)
|
||||||
@@ -1645,25 +1648,25 @@ class BaseAdapter(ConnectionPool):
|
|||||||
return list(tables)
|
return list(tables)
|
||||||
|
|
||||||
def commit(self):
|
def commit(self):
|
||||||
return self.connection.commit()
|
if self.connection: return self.connection.commit()
|
||||||
|
|
||||||
def rollback(self):
|
def rollback(self):
|
||||||
return self.connection.rollback()
|
if self.connection: return self.connection.rollback()
|
||||||
|
|
||||||
def close_connection(self):
|
def close_connection(self):
|
||||||
return self.connection.close()
|
if self.connection: return self.connection.close()
|
||||||
|
|
||||||
def distributed_transaction_begin(self, key):
|
def distributed_transaction_begin(self, key):
|
||||||
return
|
return
|
||||||
|
|
||||||
def prepare(self, key):
|
def prepare(self, key):
|
||||||
self.connection.prepare()
|
if self.connection: self.connection.prepare()
|
||||||
|
|
||||||
def commit_prepared(self, key):
|
def commit_prepared(self, key):
|
||||||
self.connection.commit()
|
if self.connection: self.connection.commit()
|
||||||
|
|
||||||
def rollback_prepared(self, key):
|
def rollback_prepared(self, key):
|
||||||
self.connection.rollback()
|
if self.connection: self.connection.rollback()
|
||||||
|
|
||||||
def concat_add(self, table):
|
def concat_add(self, table):
|
||||||
return ', ADD '
|
return ', ADD '
|
||||||
@@ -1675,6 +1678,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
self.execute(query)
|
self.execute(query)
|
||||||
|
|
||||||
def log_execute(self, *a, **b):
|
def log_execute(self, *a, **b):
|
||||||
|
if not self.connection: return None
|
||||||
command = a[0]
|
command = a[0]
|
||||||
if self.db._debug:
|
if self.db._debug:
|
||||||
LOGGER.debug('SQL: %s' % command)
|
LOGGER.debug('SQL: %s' % command)
|
||||||
@@ -2035,7 +2039,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
###################################################################################
|
###################################################################################
|
||||||
|
|
||||||
class SQLiteAdapter(BaseAdapter):
|
class SQLiteAdapter(BaseAdapter):
|
||||||
drivers = ('sqlite3','sqlite2')
|
drivers = ('sqlite2','sqlite3')
|
||||||
|
|
||||||
can_select_for_update = None # support ourselves with BEGIN TRANSACTION
|
can_select_for_update = None # support ourselves with BEGIN TRANSACTION
|
||||||
|
|
||||||
@@ -2071,7 +2075,7 @@ class SQLiteAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "sqlite"
|
self.dbengine = "sqlite"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
self.pool_size = 0
|
self.pool_size = 0
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2130,11 +2134,11 @@ class SpatiaLiteAdapter(SQLiteAdapter):
|
|||||||
|
|
||||||
def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8',
|
def __init__(self, db, uri, pool_size=0, folder=None, db_codec ='UTF-8',
|
||||||
credential_decoder=IDENTITY, driver_args={},
|
credential_decoder=IDENTITY, driver_args={},
|
||||||
adapter_args={}, srid=4326):
|
adapter_args={}, do_connect=True, srid=4326):
|
||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "spatialite"
|
self.dbengine = "spatialite"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
self.pool_size = 0
|
self.pool_size = 0
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2239,7 +2243,7 @@ class JDBCSQLiteAdapter(SQLiteAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "sqlite"
|
self.dbengine = "sqlite"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2341,7 +2345,7 @@ class MySQLAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "mysql"
|
self.dbengine = "mysql"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2467,7 +2471,7 @@ class PostgreSQLAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "postgres"
|
self.dbengine = "postgres"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2693,7 +2697,7 @@ class JDBCPostgreSQLAdapter(PostgreSQLAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "postgres"
|
self.dbengine = "postgres"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2818,7 +2822,7 @@ class OracleAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "oracle"
|
self.dbengine = "oracle"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -2974,7 +2978,7 @@ class MSSQLAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "mssql"
|
self.dbengine = "mssql"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3171,7 +3175,7 @@ class SybaseAdapter(MSSQLAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "sybase"
|
self.dbengine = "sybase"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3301,7 +3305,7 @@ class FireBirdAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "firebird"
|
self.dbengine = "firebird"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3360,7 +3364,7 @@ class FireBirdEmbeddedAdapter(FireBirdAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "firebird"
|
self.dbengine = "firebird"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3467,7 +3471,7 @@ class InformixAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "informix"
|
self.dbengine = "informix"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3569,7 +3573,7 @@ class DB2Adapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "db2"
|
self.dbengine = "db2"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3632,7 +3636,7 @@ class TeradataAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "teradata"
|
self.dbengine = "teradata"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3713,7 +3717,7 @@ class IngresAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "ingres"
|
self.dbengine = "ingres"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3849,7 +3853,7 @@ class SAPDBAdapter(BaseAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "sapdb"
|
self.dbengine = "sapdb"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -3892,7 +3896,7 @@ class CubridAdapter(MySQLAdapter):
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.dbengine = "cubrid"
|
self.dbengine = "cubrid"
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args,uri)
|
if do_connect: self.find_driver(adapter_args,uri)
|
||||||
self.pool_size = pool_size
|
self.pool_size = pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -4697,7 +4701,7 @@ class CouchDBAdapter(NoSQLAdapter):
|
|||||||
adapter_args={}, do_connect=True):
|
adapter_args={}, do_connect=True):
|
||||||
self.db = db
|
self.db = db
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
self.dbengine = 'couchdb'
|
self.dbengine = 'couchdb'
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
db['_lastsql'] = ''
|
db['_lastsql'] = ''
|
||||||
@@ -4858,7 +4862,7 @@ class MongoDBAdapter(NoSQLAdapter):
|
|||||||
adapter_args={}, do_connect=True):
|
adapter_args={}, do_connect=True):
|
||||||
self.db = db
|
self.db = db
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
|
|
||||||
m=None
|
m=None
|
||||||
try:
|
try:
|
||||||
@@ -5465,7 +5469,7 @@ class IMAPAdapter(NoSQLAdapter):
|
|||||||
|
|
||||||
self.db = db
|
self.db = db
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.find_driver(adapter_args)
|
if do_connect: self.find_driver(adapter_args)
|
||||||
self.pool_size=pool_size
|
self.pool_size=pool_size
|
||||||
self.folder = folder
|
self.folder = folder
|
||||||
self.db_codec = db_codec
|
self.db_codec = db_codec
|
||||||
@@ -6673,7 +6677,7 @@ class DAL(object):
|
|||||||
decode_credentials=False, driver_args=None,
|
decode_credentials=False, driver_args=None,
|
||||||
adapter_args=None, attempts=5, auto_import=False,
|
adapter_args=None, attempts=5, auto_import=False,
|
||||||
bigint_id=False,debug=False,lazy_tables=False,
|
bigint_id=False,debug=False,lazy_tables=False,
|
||||||
db_uid=None):
|
db_uid=None, do_connect=True):
|
||||||
"""
|
"""
|
||||||
Creates a new Database Abstraction Layer instance.
|
Creates a new Database Abstraction Layer instance.
|
||||||
|
|
||||||
@@ -6739,10 +6743,15 @@ class DAL(object):
|
|||||||
raise SyntaxError, "Error in URI '%s' or database not supported" % self._dbname
|
raise SyntaxError, "Error in URI '%s' or database not supported" % self._dbname
|
||||||
# notice that driver args or {} else driver_args
|
# notice that driver args or {} else driver_args
|
||||||
# defaults to {} global, not correct
|
# defaults to {} global, not correct
|
||||||
args = (self,uri,pool_size,folder,
|
kwargs = dict(db=self,uri=uri,
|
||||||
db_codec, credential_decoder,
|
pool_size=pool_size,
|
||||||
driver_args or {}, adapter_args or {})
|
folder=folder,
|
||||||
self._adapter = ADAPTERS[self._dbname](*args)
|
db_codec=db_codec,
|
||||||
|
credential_decoder=credential_decoder,
|
||||||
|
driver_args=driver_args or {},
|
||||||
|
adapter_args=adapter_args or {},
|
||||||
|
do_connect=do_connect)
|
||||||
|
self._adapter = ADAPTERS[self._dbname](**kwargs)
|
||||||
if bigint_id:
|
if bigint_id:
|
||||||
types = ADAPTERS[self._dbname].types
|
types = ADAPTERS[self._dbname].types
|
||||||
self._adapter.types = copy.copy(types) # copy so multiple DAL() possible
|
self._adapter.types = copy.copy(types) # copy so multiple DAL() possible
|
||||||
@@ -6763,8 +6772,9 @@ class DAL(object):
|
|||||||
if not connected:
|
if not connected:
|
||||||
raise RuntimeError, "Failure to connect, tried %d times:\n%s" % (attempts, tb)
|
raise RuntimeError, "Failure to connect, tried %d times:\n%s" % (attempts, tb)
|
||||||
else:
|
else:
|
||||||
args = (self,'None',0,folder,db_codec)
|
self._adapter = BaseAdapter(db=self,pool_size=0,
|
||||||
self._adapter = BaseAdapter(*args)
|
uri='None',folder=folder,
|
||||||
|
db_codec=db_codec)
|
||||||
migrate = fake_migrate = False
|
migrate = fake_migrate = False
|
||||||
adapter = self._adapter
|
adapter = self._adapter
|
||||||
self._uri_hash = hashlib.md5(adapter.uri).hexdigest()
|
self._uri_hash = hashlib.md5(adapter.uri).hexdigest()
|
||||||
@@ -6791,7 +6801,12 @@ class DAL(object):
|
|||||||
try:
|
try:
|
||||||
sql_fields = cPickle.load(tfile)
|
sql_fields = cPickle.load(tfile)
|
||||||
name = filename[len(pattern)-7:-6]
|
name = filename[len(pattern)-7:-6]
|
||||||
mf = [(value['sortable'],Field(key,type=value['type'])) \
|
mf = [(value['sortable'],
|
||||||
|
Field(key,
|
||||||
|
type=value['type'],
|
||||||
|
length=value.get('length',None),
|
||||||
|
notnull=value.get('notnull',False),
|
||||||
|
unique=value.get('unique',False))) \
|
||||||
for key, value in sql_fields.iteritems()]
|
for key, value in sql_fields.iteritems()]
|
||||||
mf.sort(lambda a,b: cmp(a[0],b[0]))
|
mf.sort(lambda a,b: cmp(a[0],b[0]))
|
||||||
self.define_table(name,*[item[1] for item in mf],
|
self.define_table(name,*[item[1] for item in mf],
|
||||||
|
|||||||
+14
-3
@@ -1627,6 +1627,7 @@ class Auth(object):
|
|||||||
urlbase = settings.cas_provider,
|
urlbase = settings.cas_provider,
|
||||||
actions=actions,
|
actions=actions,
|
||||||
maps=maps)
|
maps=maps)
|
||||||
|
return self
|
||||||
|
|
||||||
def log_event(self, description, vars=None, origin='auth'):
|
def log_event(self, description, vars=None, origin='auth'):
|
||||||
"""
|
"""
|
||||||
@@ -4603,7 +4604,7 @@ class Wiki(object):
|
|||||||
Field('can_edit', 'list:string',
|
Field('can_edit', 'list:string',
|
||||||
writable=perms,readable=perms,
|
writable=perms,readable=perms,
|
||||||
default=[Wiki.everybody]),
|
default=[Wiki.everybody]),
|
||||||
Field('changelog'),
|
Field('changelog'),
|
||||||
Field('html','text',compute=render,
|
Field('html','text',compute=render,
|
||||||
readable=False, writable=False),
|
readable=False, writable=False),
|
||||||
auth.signature],
|
auth.signature],
|
||||||
@@ -4625,8 +4626,17 @@ class Wiki(object):
|
|||||||
|
|
||||||
# define only non-existent tables
|
# define only non-existent tables
|
||||||
for key, value in table_definitions:
|
for key, value in table_definitions:
|
||||||
|
args = []
|
||||||
if not key in db.tables():
|
if not key in db.tables():
|
||||||
db.define_table(key, *value['args'], **value['vars'])
|
# look for wiki_ extra fields in auth.settings
|
||||||
|
extra_fields = auth.settings.extra_fields
|
||||||
|
if extra_fields:
|
||||||
|
if key in extra_fields:
|
||||||
|
if extra_fields[key]:
|
||||||
|
for field in extra_fields[key]:
|
||||||
|
args.append(field)
|
||||||
|
args += value['args']
|
||||||
|
db.define_table(key, *args, **value['vars'])
|
||||||
|
|
||||||
def update_tags_insert(page,id,db=db):
|
def update_tags_insert(page,id,db=db):
|
||||||
for tag in page.tags or []:
|
for tag in page.tags or []:
|
||||||
@@ -4789,15 +4799,16 @@ class Wiki(object):
|
|||||||
$(function() {
|
$(function() {
|
||||||
if (!$('#wiki_page_body').length) return;
|
if (!$('#wiki_page_body').length) return;
|
||||||
var pagecontent = $('#wiki_page_body');
|
var pagecontent = $('#wiki_page_body');
|
||||||
|
pagecontent.css('font-family', 'Monaco,Menlo,Consolas,"Courier New",monospace');
|
||||||
var prevbutton = $('<button class="btn nopreview">Preview</button>');
|
var prevbutton = $('<button class="btn nopreview">Preview</button>');
|
||||||
var preview = $('<div id="preview"></div>').hide();
|
var preview = $('<div id="preview"></div>').hide();
|
||||||
var table = $('form');
|
var table = $('form');
|
||||||
prevbutton.insertBefore(table);
|
prevbutton.insertBefore(table);
|
||||||
|
preview.insertBefore(table);
|
||||||
prevbutton.on('click', function(e) {
|
prevbutton.on('click', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (prevbutton.hasClass('nopreview')) {
|
if (prevbutton.hasClass('nopreview')) {
|
||||||
prevbutton.addClass('preview').removeClass('nopreview').html('Edit Source');
|
prevbutton.addClass('preview').removeClass('nopreview').html('Edit Source');
|
||||||
preview.insertBefore(table);
|
|
||||||
web2py_ajax_page('post', '%(url)s', {body : $('#wiki_page_body').val()}, 'preview');
|
web2py_ajax_page('post', '%(url)s', {body : $('#wiki_page_body').val()}, 'preview');
|
||||||
table.fadeOut('medium', function() {preview.fadeIn()});
|
table.fadeOut('medium', function() {preview.fadeIn()});
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in new issue
Block a user