Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13c78fae58 | ||
|
|
91c0a31800 | ||
|
|
277137c8e6 | ||
|
|
4556a355a2 | ||
|
|
7dafb07438 | ||
|
|
b0f6dc4e16 | ||
|
|
1499b19575 | ||
|
|
877b867cef | ||
|
|
837808bd77 | ||
|
|
10a69f4338 | ||
|
|
7bc603f380 | ||
|
|
6c1cc6fc96 |
@@ -30,7 +30,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.6.1-stable+timestamp.'`date +%Y.%m.%d.%H.%M.%S` > VERSION
|
echo 'Version 2.6.3-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.6.1-stable+timestamp.2013.09.12.17.08.08
|
Version 2.6.3-stable+timestamp.2013.09.15.11.59.21
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ if request.function == 'manage':
|
|||||||
auth.requires_membership(manager_role)(lambda: None)()
|
auth.requires_membership(manager_role)(lambda: None)()
|
||||||
menu = False
|
menu = False
|
||||||
elif (request.application == 'admin' and not session.authorized) or \
|
elif (request.application == 'admin' and not session.authorized) or \
|
||||||
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
||||||
redirect(URL('admin', 'default', 'index',
|
redirect(URL('admin', 'default', 'index',
|
||||||
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
||||||
else:
|
else:
|
||||||
@@ -540,30 +540,30 @@ def table_template(table):
|
|||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
subgraphs = dict()
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
if hasattr(db[tablename],'_meta_graphmodel'):
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
meta_graphmodel = db[tablename]._meta_graphmodel
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
else:
|
else:
|
||||||
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
group = meta_graphmodel['group'].replace(' ', '')
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
if not subgraphs.has_key(group):
|
if not subgraphs.has_key(group):
|
||||||
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
else:
|
else:
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
for n, key in enumerate(subgraphs.iterkeys()):
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
name='cluster%d' % n,
|
name='cluster%d' % n,
|
||||||
style='filled',
|
style='filled',
|
||||||
color=subgraphs[key]['meta']['color'],
|
color=subgraphs[key]['meta']['color'],
|
||||||
label=subgraphs[key]['meta']['group'])
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -580,14 +580,14 @@ def bg_graph_model():
|
|||||||
#return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
if not request.args:
|
if not request.args:
|
||||||
return graph.draw(format='png', prog='dot')
|
return graph.draw(format='png', prog='dot')
|
||||||
else:
|
else:
|
||||||
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
if request.args(0) == 'dot':
|
if request.args(0) == 'dot':
|
||||||
return graph.string()
|
return graph.string()
|
||||||
else:
|
else:
|
||||||
return graph.draw(format=request.args(0), prog='dot')
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|
||||||
def manage():
|
def manage():
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ def toggle_breakpoint():
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
session.flash = str(e)
|
session.flash = str(e)
|
||||||
return response.json({'ok': ok, 'lineno': lineno})
|
return response.json({'ok': ok, 'lineno': lineno})
|
||||||
|
|
||||||
def list_breakpoints():
|
def list_breakpoints():
|
||||||
"Return a list of linenumbers for current breakpoints"
|
"Return a list of linenumbers for current breakpoints"
|
||||||
|
|
||||||
@@ -234,4 +234,3 @@ def list_breakpoints():
|
|||||||
session.flash = str(e)
|
session.flash = str(e)
|
||||||
ok = False
|
ok = False
|
||||||
return response.json({'ok': ok, 'breakpoints': breakpoints})
|
return response.json({'ok': ok, 'breakpoints': breakpoints})
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ def safe_write(a, value, b='w'):
|
|||||||
|
|
||||||
def get_app(name=None):
|
def get_app(name=None):
|
||||||
app = name or request.args(0)
|
app = name or request.args(0)
|
||||||
if (app and os.path.exists(apath(app, r=request)) and
|
if (app and os.path.exists(apath(app, r=request)) and
|
||||||
(not MULTI_USER_MODE or is_manager() or
|
(not MULTI_USER_MODE or is_manager() or
|
||||||
db(db.app.name == app)(db.app.owner == auth.user.id).count())):
|
db(db.app.name == app)(db.app.owner == auth.user.id).count())):
|
||||||
return app
|
return app
|
||||||
@@ -108,7 +108,7 @@ def index():
|
|||||||
if session.authorized:
|
if session.authorized:
|
||||||
redirect(send)
|
redirect(send)
|
||||||
elif request.vars.password:
|
elif request.vars.password:
|
||||||
if verify_password(request.vars.password):
|
if verify_password(request.vars.password[:1024]):
|
||||||
session.authorized = True
|
session.authorized = True
|
||||||
login_record(True)
|
login_record(True)
|
||||||
|
|
||||||
@@ -583,11 +583,11 @@ def edit():
|
|||||||
|
|
||||||
# show settings tab and save prefernces
|
# show settings tab and save prefernces
|
||||||
if 'settings' in request.vars:
|
if 'settings' in request.vars:
|
||||||
if request.post_vars: #save new preferences
|
if request.post_vars: #save new preferences
|
||||||
if config.save(request.post_vars.items()):
|
if config.save(request.post_vars.items()):
|
||||||
response.headers["web2py-component-flash"] = T('Preferences saved correctly')
|
response.headers["web2py-component-flash"] = T('Preferences saved correctly')
|
||||||
else:
|
else:
|
||||||
response.headers["web2py-component-flash"] = T('Preferences saved on session only')
|
response.headers["web2py-component-flash"] = T('Preferences saved on session only')
|
||||||
response.headers["web2py-component-command"] = "update_theme('%s'); jQuery('a[href=#editor_settings] button.close').click();" % config.read()['theme']
|
response.headers["web2py-component-command"] = "update_theme('%s'); jQuery('a[href=#editor_settings] button.close').click();" % config.read()['theme']
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ def verify_password(password):
|
|||||||
session.pam_user = None
|
session.pam_user = None
|
||||||
if DEMO_MODE:
|
if DEMO_MODE:
|
||||||
return True
|
return True
|
||||||
elif not 'password' in _config:
|
elif not _config.get('password'):
|
||||||
return False
|
return False
|
||||||
elif _config['password'].startswith('pam_user:'):
|
elif _config['password'].startswith('pam_user:'):
|
||||||
session.pam_user = _config['password'][9:].strip()
|
session.pam_user = _config['password'][9:].strip()
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
theme = web2py
|
||||||
|
|
||||||
|
[editor]
|
||||||
|
theme = night
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
});
|
});
|
||||||
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
||||||
doc.on('click', "input.datetime", function () {
|
doc.on('click', "input.datetime", function () {
|
||||||
var tformat = $(this).data('w2p_datetime_format')
|
var tformat = $(this).data('w2p_datetime_format');
|
||||||
var active = $(this).data('w2p_datetime');
|
var active = $(this).data('w2p_datetime');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
});
|
});
|
||||||
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
||||||
doc.on('click', "input.date", function () {
|
doc.on('click', "input.date", function () {
|
||||||
var tformat = $(this).data('w2p_date_format')
|
var tformat = $(this).data('w2p_date_format');
|
||||||
var active = $(this).data('w2p_date');
|
var active = $(this).data('w2p_date');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ if request.function == 'manage':
|
|||||||
auth.requires_membership(manager_role)(lambda: None)()
|
auth.requires_membership(manager_role)(lambda: None)()
|
||||||
menu = False
|
menu = False
|
||||||
elif (request.application == 'admin' and not session.authorized) or \
|
elif (request.application == 'admin' and not session.authorized) or \
|
||||||
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
||||||
redirect(URL('admin', 'default', 'index',
|
redirect(URL('admin', 'default', 'index',
|
||||||
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
||||||
else:
|
else:
|
||||||
@@ -540,30 +540,30 @@ def table_template(table):
|
|||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
subgraphs = dict()
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
if hasattr(db[tablename],'_meta_graphmodel'):
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
meta_graphmodel = db[tablename]._meta_graphmodel
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
else:
|
else:
|
||||||
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
group = meta_graphmodel['group'].replace(' ', '')
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
if not subgraphs.has_key(group):
|
if not subgraphs.has_key(group):
|
||||||
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
else:
|
else:
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
for n, key in enumerate(subgraphs.iterkeys()):
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
name='cluster%d' % n,
|
name='cluster%d' % n,
|
||||||
style='filled',
|
style='filled',
|
||||||
color=subgraphs[key]['meta']['color'],
|
color=subgraphs[key]['meta']['color'],
|
||||||
label=subgraphs[key]['meta']['group'])
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -580,14 +580,14 @@ def bg_graph_model():
|
|||||||
#return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
if not request.args:
|
if not request.args:
|
||||||
return graph.draw(format='png', prog='dot')
|
return graph.draw(format='png', prog='dot')
|
||||||
else:
|
else:
|
||||||
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
if request.args(0) == 'dot':
|
if request.args(0) == 'dot':
|
||||||
return graph.string()
|
return graph.string()
|
||||||
else:
|
else:
|
||||||
return graph.draw(format=request.args(0), prog='dot')
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|
||||||
def manage():
|
def manage():
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ def get(args):
|
|||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
obj = globals(),get(args[0])
|
obj = globals(),get(args[0])
|
||||||
for k in range(1,len(args)):
|
for k in range(1,len(args)):
|
||||||
obj = getattr(obj,args[k])
|
obj = getattr(obj,args[k])
|
||||||
return obj
|
return obj
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def vars():
|
def vars():
|
||||||
"""the running controller function!"""
|
"""the running controller function!"""
|
||||||
title = '.'.join(request.args)
|
title = '.'.join(request.args)
|
||||||
@@ -27,7 +27,7 @@ def vars():
|
|||||||
d = getattr(obj,'__bases__',None)
|
d = getattr(obj,'__bases__',None)
|
||||||
|
|
||||||
for key in keys:
|
for key in keys:
|
||||||
a = getattr(obj,key,None)
|
a = getattr(obj,key,None)
|
||||||
if a and not isinstance(a,DAL):
|
if a and not isinstance(a,DAL):
|
||||||
doc1 = getattr(a, '__doc__', '')
|
doc1 = getattr(a, '__doc__', '')
|
||||||
t1 = type(a)
|
t1 = type(a)
|
||||||
@@ -38,7 +38,7 @@ def vars():
|
|||||||
else:
|
else:
|
||||||
doc = 'Unkown'
|
doc = 'Unkown'
|
||||||
keys = []
|
keys = []
|
||||||
t = c = d = None
|
t = c = d = None
|
||||||
else:
|
else:
|
||||||
raise HTTP(400)
|
raise HTTP(400)
|
||||||
return dict(
|
return dict(
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
def hello1():
|
def hello1():
|
||||||
""" simple page without template """
|
""" simple page without template """
|
||||||
|
|
||||||
|
|||||||
@@ -179,7 +179,7 @@
|
|||||||
});
|
});
|
||||||
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
||||||
doc.on('click', "input.datetime", function () {
|
doc.on('click', "input.datetime", function () {
|
||||||
var tformat = $(this).data('w2p_datetime_format')
|
var tformat = $(this).data('w2p_datetime_format');
|
||||||
var active = $(this).data('w2p_datetime');
|
var active = $(this).data('w2p_datetime');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
});
|
});
|
||||||
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
||||||
doc.on('click', "input.date", function () {
|
doc.on('click', "input.date", function () {
|
||||||
var tformat = $(this).data('w2p_date_format')
|
var tformat = $(this).data('w2p_date_format');
|
||||||
var active = $(this).data('w2p_date');
|
var active = $(this).data('w2p_date');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ if request.function == 'manage':
|
|||||||
auth.requires_membership(manager_role)(lambda: None)()
|
auth.requires_membership(manager_role)(lambda: None)()
|
||||||
menu = False
|
menu = False
|
||||||
elif (request.application == 'admin' and not session.authorized) or \
|
elif (request.application == 'admin' and not session.authorized) or \
|
||||||
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
(request.application != 'admin' and not gluon.fileutils.check_credentials(request)):
|
||||||
redirect(URL('admin', 'default', 'index',
|
redirect(URL('admin', 'default', 'index',
|
||||||
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
vars=dict(send=URL(args=request.args, vars=request.vars))))
|
||||||
else:
|
else:
|
||||||
@@ -540,30 +540,30 @@ def table_template(table):
|
|||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
subgraphs = dict()
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
if hasattr(db[tablename],'_meta_graphmodel'):
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
meta_graphmodel = db[tablename]._meta_graphmodel
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
else:
|
else:
|
||||||
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
group = meta_graphmodel['group'].replace(' ', '')
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
if not subgraphs.has_key(group):
|
if not subgraphs.has_key(group):
|
||||||
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
else:
|
else:
|
||||||
subgraphs[group]['tables'].append(tablename)
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
for n, key in enumerate(subgraphs.iterkeys()):
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
name='cluster%d' % n,
|
name='cluster%d' % n,
|
||||||
style='filled',
|
style='filled',
|
||||||
color=subgraphs[key]['meta']['color'],
|
color=subgraphs[key]['meta']['color'],
|
||||||
label=subgraphs[key]['meta']['group'])
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -580,14 +580,14 @@ def bg_graph_model():
|
|||||||
#return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
if not request.args:
|
if not request.args:
|
||||||
return graph.draw(format='png', prog='dot')
|
return graph.draw(format='png', prog='dot')
|
||||||
else:
|
else:
|
||||||
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
if request.args(0) == 'dot':
|
if request.args(0) == 'dot':
|
||||||
return graph.string()
|
return graph.string()
|
||||||
else:
|
else:
|
||||||
return graph.draw(format=request.args(0), prog='dot')
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|
||||||
def manage():
|
def manage():
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ def user():
|
|||||||
http://..../[app]/default/user/profile
|
http://..../[app]/default/user/profile
|
||||||
http://..../[app]/default/user/retrieve_password
|
http://..../[app]/default/user/retrieve_password
|
||||||
http://..../[app]/default/user/change_password
|
http://..../[app]/default/user/change_password
|
||||||
http://..../[app]/default/user/manage_users (requires membership in
|
http://..../[app]/default/user/manage_users (requires membership in
|
||||||
use @auth.requires_login()
|
use @auth.requires_login()
|
||||||
@auth.requires_membership('group name')
|
@auth.requires_membership('group name')
|
||||||
@auth.requires_permission('read','table name',record_id)
|
@auth.requires_permission('read','table name',record_id)
|
||||||
|
|||||||
@@ -179,7 +179,7 @@
|
|||||||
});
|
});
|
||||||
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
||||||
doc.on('click', "input.datetime", function () {
|
doc.on('click', "input.datetime", function () {
|
||||||
var tformat = $(this).data('w2p_datetime_format')
|
var tformat = $(this).data('w2p_datetime_format');
|
||||||
var active = $(this).data('w2p_datetime');
|
var active = $(this).data('w2p_datetime');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
});
|
});
|
||||||
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
||||||
doc.on('click', "input.date", function () {
|
doc.on('click', "input.date", function () {
|
||||||
var tformat = $(this).data('w2p_date_format')
|
var tformat = $(this).data('w2p_date_format');
|
||||||
var active = $(this).data('w2p_date');
|
var active = $(this).data('w2p_date');
|
||||||
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
||||||
if(active === undefined) {
|
if(active === undefined) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class MemcacheClient(object):
|
|||||||
value = obj[1] + value
|
value = obj[1] + value
|
||||||
self.client.set(key, (time.time(), value))
|
self.client.set(key, (time.time(), value))
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def incr(self, key, value=1):
|
def incr(self, key, value=1):
|
||||||
return self.increment(key, value)
|
return self.increment(key, value)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
Note: This module is intended as a plugin replacement of pbkdf2.py
|
Note: This module is intended as a plugin replacement of pbkdf2.py
|
||||||
by Armin Ronacher.
|
by Armin Ronacher.
|
||||||
|
|
||||||
Git repository:
|
Git repository:
|
||||||
$ git clone https://github.com/michele-comitini/pbkdf2_ctypes.git
|
$ git clone https://github.com/michele-comitini/pbkdf2_ctypes.git
|
||||||
|
|
||||||
:copyright: Copyright (c) 2013: Michele Comitini <mcm@glisco.it>
|
:copyright: Copyright (c) 2013: Michele Comitini <mcm@glisco.it>
|
||||||
@@ -79,7 +79,7 @@ def openssl_hashlib_to_crypto_map_get(hashfunc):
|
|||||||
crypto_hashfunc.restype = ctypes.c_void_p
|
crypto_hashfunc.restype = ctypes.c_void_p
|
||||||
return crypto_hashfunc()
|
return crypto_hashfunc()
|
||||||
|
|
||||||
|
|
||||||
def openssl_pbkdf2(data, salt, iterations, digest, keylen):
|
def openssl_pbkdf2(data, salt, iterations, digest, keylen):
|
||||||
"""OpenSSL compatibile wrapper
|
"""OpenSSL compatibile wrapper
|
||||||
"""
|
"""
|
||||||
@@ -92,7 +92,7 @@ def openssl_pbkdf2(data, salt, iterations, digest, keylen):
|
|||||||
c_iter = ctypes.c_int(iterations)
|
c_iter = ctypes.c_int(iterations)
|
||||||
c_keylen = ctypes.c_int(keylen)
|
c_keylen = ctypes.c_int(keylen)
|
||||||
c_buff = ctypes.create_string_buffer(keylen)
|
c_buff = ctypes.create_string_buffer(keylen)
|
||||||
|
|
||||||
# PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
|
# PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
|
||||||
# const unsigned char *salt, int saltlen, int iter,
|
# const unsigned char *salt, int saltlen, int iter,
|
||||||
# const EVP_MD *digest,
|
# const EVP_MD *digest,
|
||||||
@@ -102,7 +102,7 @@ def openssl_pbkdf2(data, salt, iterations, digest, keylen):
|
|||||||
ctypes.c_char_p, ctypes.c_int,
|
ctypes.c_char_p, ctypes.c_int,
|
||||||
ctypes.c_int, ctypes.c_void_p,
|
ctypes.c_int, ctypes.c_void_p,
|
||||||
ctypes.c_int, ctypes.c_char_p]
|
ctypes.c_int, ctypes.c_char_p]
|
||||||
|
|
||||||
crypto.PKCS5_PBKDF2_HMAC.restype = ctypes.c_int
|
crypto.PKCS5_PBKDF2_HMAC.restype = ctypes.c_int
|
||||||
err = crypto.PKCS5_PBKDF2_HMAC(c_pass, c_passlen,
|
err = crypto.PKCS5_PBKDF2_HMAC(c_pass, c_passlen,
|
||||||
c_salt, c_saltlen,
|
c_salt, c_saltlen,
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class PDF(object):
|
|||||||
canvas.setLineWidth(4)
|
canvas.setLineWidth(4)
|
||||||
canvas.line(0, -1.25 * cm, 21.7 * cm, -1.25 * cm)
|
canvas.line(0, -1.25 * cm, 21.7 * cm, -1.25 * cm)
|
||||||
canvas.restoreState()
|
canvas.restoreState()
|
||||||
|
|
||||||
canvas.saveState()
|
canvas.saveState()
|
||||||
notes = listify(invoice.get('notes',''))
|
notes = listify(invoice.get('notes',''))
|
||||||
textobject = canvas.beginText(1 * cm, -25 * cm)
|
textobject = canvas.beginText(1 * cm, -25 * cm)
|
||||||
@@ -57,7 +57,7 @@ class PDF(object):
|
|||||||
textobject.textLine('Pag.%s/%s' % (page+1,pages))
|
textobject.textLine('Pag.%s/%s' % (page+1,pages))
|
||||||
canvas.drawText(textobject)
|
canvas.drawText(textobject)
|
||||||
canvas.restoreState()
|
canvas.restoreState()
|
||||||
|
|
||||||
canvas.saveState()
|
canvas.saveState()
|
||||||
business_details = listify(invoice.get('from','FROM:'))
|
business_details = listify(invoice.get('from','FROM:'))
|
||||||
canvas.setFont(self.font_face, 9)
|
canvas.setFont(self.font_face, 9)
|
||||||
@@ -66,13 +66,13 @@ class PDF(object):
|
|||||||
textobject.textLine(line)
|
textobject.textLine(line)
|
||||||
canvas.drawText(textobject)
|
canvas.drawText(textobject)
|
||||||
canvas.restoreState()
|
canvas.restoreState()
|
||||||
|
|
||||||
canvas.saveState()
|
canvas.saveState()
|
||||||
client_info = listify(invoice.get('to','TO:'))
|
client_info = listify(invoice.get('to','TO:'))
|
||||||
textobject = canvas.beginText(1.5 * cm, -2.5 * cm)
|
textobject = canvas.beginText(1.5 * cm, -2.5 * cm)
|
||||||
for line in client_info:
|
for line in client_info:
|
||||||
textobject.textLine(line)
|
textobject.textLine(line)
|
||||||
canvas.drawText(textobject)
|
canvas.drawText(textobject)
|
||||||
canvas.restoreState()
|
canvas.restoreState()
|
||||||
|
|
||||||
textobject = canvas.beginText(1.5 * cm, -6.75 * cm)
|
textobject = canvas.beginText(1.5 * cm, -6.75 * cm)
|
||||||
@@ -86,7 +86,7 @@ class PDF(object):
|
|||||||
data = [invoice_items[0]]
|
data = [invoice_items[0]]
|
||||||
for item in items:
|
for item in items:
|
||||||
data.append([
|
data.append([
|
||||||
self.format_currency(x)
|
self.format_currency(x)
|
||||||
if isinstance(x,float) else x
|
if isinstance(x,float) else x
|
||||||
for x in item])
|
for x in item])
|
||||||
righta = [k for k,v in enumerate(items[0])
|
righta = [k for k,v in enumerate(items[0])
|
||||||
@@ -116,10 +116,10 @@ class PDF(object):
|
|||||||
data = [invoice['totals'][0]]
|
data = [invoice['totals'][0]]
|
||||||
for item in items:
|
for item in items:
|
||||||
data.append([
|
data.append([
|
||||||
self.format_currency(x)
|
self.format_currency(x)
|
||||||
if isinstance(x,float) else x
|
if isinstance(x,float) else x
|
||||||
for x in item])
|
for x in item])
|
||||||
righta = [k for k,v in enumerate(items[0])
|
righta = [k for k,v in enumerate(items[0])
|
||||||
if isinstance(v,(int,float,Decimal))]
|
if isinstance(v,(int,float,Decimal))]
|
||||||
total = self.format_currency(invoice['total'])
|
total = self.format_currency(invoice['total'])
|
||||||
data.append(['']*(len(items[0])-1)+[total])
|
data.append(['']*(len(items[0])-1)+[total])
|
||||||
|
|||||||
@@ -90,13 +90,13 @@ def populate(table, n=None, default=True, compute=False, contents={}):
|
|||||||
can be used in two ways:
|
can be used in two ways:
|
||||||
|
|
||||||
>>> populate(db.tablename, n=100)
|
>>> populate(db.tablename, n=100)
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
>>> for k,row in enumerate(populate(db.tablename)): print row
|
>>> for k,row in enumerate(populate(db.tablename)): print row
|
||||||
"""
|
"""
|
||||||
|
|
||||||
generator = populate_generator(table, default=default,
|
generator = populate_generator(table, default=default,
|
||||||
compute=compute, contents=contents)
|
compute=compute, contents=contents)
|
||||||
if n is not None:
|
if n is not None:
|
||||||
for k,record in enumerate(generator):
|
for k,record in enumerate(generator):
|
||||||
@@ -246,8 +246,8 @@ def populate_generator(table, default=True, compute=False, contents={}):
|
|||||||
record[fieldname] = random.choice(LAST_NAMES)
|
record[fieldname] = random.choice(LAST_NAMES)
|
||||||
elif fieldname.find('username')>=0:
|
elif fieldname.find('username')>=0:
|
||||||
record[fieldname] = random.choice(FIRST_NAMES).lower()+str(random.randint(1000,9999))
|
record[fieldname] = random.choice(FIRST_NAMES).lower()+str(random.randint(1000,9999))
|
||||||
else:
|
else:
|
||||||
record[fieldname] = random.choice(FIRST_NAMES)+' '+random.choice(LAST_NAMES)
|
record[fieldname] = random.choice(FIRST_NAMES)+' '+random.choice(LAST_NAMES)
|
||||||
elif fieldname.find('phone')>=0:
|
elif fieldname.find('phone')>=0:
|
||||||
record[fieldname] = '(%s%s%s) %s%s%s-%s%s%s%s' % (
|
record[fieldname] = '(%s%s%s) %s%s%s-%s%s%s%s' % (
|
||||||
random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'))
|
random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'),random.choice('1234567890'))
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ def run(history, statement, env={}):
|
|||||||
for name, val in statement_module.__dict__.items():
|
for name, val in statement_module.__dict__.items():
|
||||||
if name not in old_globals or represent(val) != old_globals[name]:
|
if name not in old_globals or represent(val) != old_globals[name]:
|
||||||
new_globals[name] = val
|
new_globals[name] = val
|
||||||
|
|
||||||
if True in [isinstance(val, tuple(UNPICKLABLE_TYPES))
|
if True in [isinstance(val, tuple(UNPICKLABLE_TYPES))
|
||||||
for val in new_globals.values()]:
|
for val in new_globals.values()]:
|
||||||
# this statement added an unpicklable global. store the statement and
|
# this statement added an unpicklable global. store the statement and
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class Stripe:
|
|||||||
|
|
||||||
def refund(self, charge_id):
|
def refund(self, charge_id):
|
||||||
params = urllib.urlencode({})
|
params = urllib.urlencode({})
|
||||||
u = urllib.urlopen(self.URL_REFUND % (self.key, charge_id),
|
u = urllib.urlopen(self.URL_REFUND % (self.key, charge_id),
|
||||||
params)
|
params)
|
||||||
return simplejson.loads(u.read())
|
return simplejson.loads(u.read())
|
||||||
|
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ class WebClient(object):
|
|||||||
else:
|
else:
|
||||||
self.method = 'GET' if method=='auto' else method
|
self.method = 'GET' if method=='auto' else method
|
||||||
data = None
|
data = None
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
self.response = opener.open(self.url, data)
|
self.response = opener.open(self.url, data)
|
||||||
self.time = time.time() - t0
|
self.time = time.time() - t0
|
||||||
except urllib2.HTTPError, error:
|
except urllib2.HTTPError, error:
|
||||||
|
|||||||
+26
-30
@@ -234,12 +234,6 @@ except ImportError:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
simplejson = None
|
simplejson = None
|
||||||
|
|
||||||
try:
|
|
||||||
from gluon import validators
|
|
||||||
have_validators = True
|
|
||||||
except (ImportError, SyntaxError):
|
|
||||||
have_validators = False
|
|
||||||
|
|
||||||
LOGGER = logging.getLogger("web2py.dal")
|
LOGGER = logging.getLogger("web2py.dal")
|
||||||
DEFAULT = lambda:0
|
DEFAULT = lambda:0
|
||||||
|
|
||||||
@@ -1085,7 +1079,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
elif not key in sql_fields:
|
elif not key in sql_fields:
|
||||||
del sql_fields_current[key]
|
del sql_fields_current[key]
|
||||||
ftype = sql_fields_old[key]['type']
|
ftype = sql_fields_old[key]['type']
|
||||||
if (self.dbengine in ('postgres',) and
|
if (self.dbengine in ('postgres',) and
|
||||||
ftype.startswith('geometry')):
|
ftype.startswith('geometry')):
|
||||||
geotype, parms = ftype[:-1].split('(')
|
geotype, parms = ftype[:-1].split('(')
|
||||||
schema = parms.split(',')[0]
|
schema = parms.split(',')[0]
|
||||||
@@ -1095,7 +1089,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
elif self.dbengine in ('firebird',):
|
elif self.dbengine in ('firebird',):
|
||||||
query = ['ALTER TABLE %s DROP %s;' % (tablename, key)]
|
query = ['ALTER TABLE %s DROP %s;' % (tablename, key)]
|
||||||
else:
|
else:
|
||||||
query = ['ALTER TABLE %s DROP COLUMN %s;' %
|
query = ['ALTER TABLE %s DROP COLUMN %s;' %
|
||||||
(tablename, key)]
|
(tablename, key)]
|
||||||
metadata_change = True
|
metadata_change = True
|
||||||
elif sql_fields[key]['sql'] != sql_fields_old[key]['sql'] \
|
elif sql_fields[key]['sql'] != sql_fields_old[key]['sql'] \
|
||||||
@@ -1135,9 +1129,9 @@ class BaseAdapter(ConnectionPool):
|
|||||||
self.log('faked!\n', table)
|
self.log('faked!\n', table)
|
||||||
else:
|
else:
|
||||||
self.execute(sub_query)
|
self.execute(sub_query)
|
||||||
# Caveat: mysql, oracle and firebird
|
# Caveat: mysql, oracle and firebird
|
||||||
# do not allow multiple alter table
|
# do not allow multiple alter table
|
||||||
# in one transaction so we must commit
|
# in one transaction so we must commit
|
||||||
# partial transactions and
|
# partial transactions and
|
||||||
# update table._dbt after alter table.
|
# update table._dbt after alter table.
|
||||||
if db._adapter.commit_on_alter_table:
|
if db._adapter.commit_on_alter_table:
|
||||||
@@ -1790,7 +1784,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
return self.connection.rollback()
|
return self.connection.rollback()
|
||||||
|
|
||||||
def close_connection(self):
|
def close_connection(self):
|
||||||
if self.connection:
|
if self.connection:
|
||||||
r = self.connection.close()
|
r = self.connection.close()
|
||||||
self.connection = None
|
self.connection = None
|
||||||
return r
|
return r
|
||||||
@@ -4418,7 +4412,7 @@ class GoogleSQLAdapter(UseDatabaseStoredFile,MySQLAdapter):
|
|||||||
|
|
||||||
def find_driver(self,adapter_args,uri=None):
|
def find_driver(self,adapter_args,uri=None):
|
||||||
self.adapter_args = adapter_args
|
self.adapter_args = adapter_args
|
||||||
self.driver = "google"
|
self.driver = "google"
|
||||||
|
|
||||||
class NoSQLAdapter(BaseAdapter):
|
class NoSQLAdapter(BaseAdapter):
|
||||||
can_select_for_update = False
|
can_select_for_update = False
|
||||||
@@ -5372,7 +5366,7 @@ class MongoDBAdapter(NoSQLAdapter):
|
|||||||
d = datetime.date(2000, 1, 1)
|
d = datetime.date(2000, 1, 1)
|
||||||
# mongodb doesn't has a time object and so it must datetime,
|
# mongodb doesn't has a time object and so it must datetime,
|
||||||
# string or integer
|
# string or integer
|
||||||
return datetime.datetime.combine(d, value)
|
return datetime.datetime.combine(d, value)
|
||||||
elif fieldtype == "blob":
|
elif fieldtype == "blob":
|
||||||
from bson import Binary
|
from bson import Binary
|
||||||
if not isinstance(value, Binary):
|
if not isinstance(value, Binary):
|
||||||
@@ -6872,7 +6866,9 @@ def sqlhtml_validators(field):
|
|||||||
fieldtype
|
fieldtype
|
||||||
"""
|
"""
|
||||||
db = field.db
|
db = field.db
|
||||||
if not have_validators:
|
try:
|
||||||
|
from gluon import validators
|
||||||
|
except ImportError:
|
||||||
return []
|
return []
|
||||||
field_type, field_length = field.type, field.length
|
field_type, field_length = field.type, field.length
|
||||||
if isinstance(field_type, SQLCustomType):
|
if isinstance(field_type, SQLCustomType):
|
||||||
@@ -6938,14 +6934,14 @@ def sqlhtml_validators(field):
|
|||||||
refs = reduce(lambda a,b:a&b, [count(ids[i:i+30]) for i in rx])
|
refs = reduce(lambda a,b:a&b, [count(ids[i:i+30]) for i in rx])
|
||||||
else:
|
else:
|
||||||
refs = db(id.belongs(ids)).select(id)
|
refs = db(id.belongs(ids)).select(id)
|
||||||
return (refs and ', '.join(f(r,x.id) for x in refs) or '')
|
return (refs and ', '.join(f(r,x.id) for x in refs) or '')
|
||||||
field.represent = field.represent or list_ref_repr
|
field.represent = field.represent or list_ref_repr
|
||||||
if hasattr(referenced, '_format') and referenced._format:
|
if hasattr(referenced, '_format') and referenced._format:
|
||||||
requires = validators.IS_IN_DB(db,referenced._id,
|
requires = validators.IS_IN_DB(db,referenced._id,
|
||||||
referenced._format,multiple=True)
|
referenced._format,multiple=True)
|
||||||
else:
|
else:
|
||||||
requires = validators.IS_IN_DB(db,referenced._id,
|
requires = validators.IS_IN_DB(db,referenced._id,
|
||||||
multiple=True)
|
multiple=True)
|
||||||
if field.unique:
|
if field.unique:
|
||||||
requires._and = validators.IS_NOT_IN_DB(db,field)
|
requires._and = validators.IS_NOT_IN_DB(db,field)
|
||||||
if not field.notnull:
|
if not field.notnull:
|
||||||
@@ -8349,10 +8345,10 @@ class Table(object):
|
|||||||
self._id = field
|
self._id = field
|
||||||
for field in fields:
|
for field in fields:
|
||||||
if isinstance(field, (FieldMethod, FieldVirtual)):
|
if isinstance(field, (FieldMethod, FieldVirtual)):
|
||||||
virtual_fields.append(field)
|
virtual_fields.append(field)
|
||||||
elif isinstance(field, Field) and not field.name in fieldnames:
|
elif isinstance(field, Field) and not field.name in fieldnames:
|
||||||
if field.db is not None:
|
if field.db is not None:
|
||||||
field = copy.copy(field)
|
field = copy.copy(field)
|
||||||
include_new(field)
|
include_new(field)
|
||||||
elif isinstance(field, dict) and not field['fieldname'] in fieldnames:
|
elif isinstance(field, dict) and not field['fieldname'] in fieldnames:
|
||||||
include_new(Field(**field))
|
include_new(Field(**field))
|
||||||
@@ -8914,7 +8910,7 @@ class Table(object):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
raise RuntimeError("Unable to parse line:%s field:%s value:'%s'"
|
raise RuntimeError("Unable to parse line:%s field:%s value:'%s'"
|
||||||
% (lineno+1,field,line[i]))
|
% (lineno+1,field,line[i]))
|
||||||
|
|
||||||
if not (id_map or cid is None or id_offset is None or unique_idx):
|
if not (id_map or cid is None or id_offset is None or unique_idx):
|
||||||
csv_id = long(line[cid])
|
csv_id = long(line[cid])
|
||||||
curr_id = self.insert(**dict(items))
|
curr_id = self.insert(**dict(items))
|
||||||
@@ -9613,7 +9609,7 @@ class Field(Expression):
|
|||||||
else:
|
else:
|
||||||
filename = name
|
filename = name
|
||||||
# ## if file is in DB
|
# ## if file is in DB
|
||||||
if isinstance(self_uploadfield, (str, Field)):
|
if isinstance(self_uploadfield, (str, Field)):
|
||||||
return dict(path=None,filename=filename)
|
return dict(path=None,filename=filename)
|
||||||
# ## if file is on filesystem
|
# ## if file is on filesystem
|
||||||
if not path:
|
if not path:
|
||||||
@@ -10422,24 +10418,24 @@ class Rows(object):
|
|||||||
one_result = False
|
one_result = False
|
||||||
if 'one_result' in args:
|
if 'one_result' in args:
|
||||||
one_result = args['one_result']
|
one_result = args['one_result']
|
||||||
|
|
||||||
def build_fields_struct(row, fields, num, groups):
|
def build_fields_struct(row, fields, num, groups):
|
||||||
''' helper function:
|
''' helper function:
|
||||||
'''
|
'''
|
||||||
if num > len(fields)-1:
|
if num > len(fields)-1:
|
||||||
if one_result:
|
if one_result:
|
||||||
return row
|
return row
|
||||||
else:
|
else:
|
||||||
return [row]
|
return [row]
|
||||||
|
|
||||||
key = fields[num]
|
key = fields[num]
|
||||||
value = row[key]
|
value = row[key]
|
||||||
|
|
||||||
if value not in groups:
|
if value not in groups:
|
||||||
groups[value] = build_fields_struct(row, fields, num+1, {})
|
groups[value] = build_fields_struct(row, fields, num+1, {})
|
||||||
else:
|
else:
|
||||||
struct = build_fields_struct(row, fields, num+1, groups[ value ])
|
struct = build_fields_struct(row, fields, num+1, groups[ value ])
|
||||||
|
|
||||||
# still have more grouping to do
|
# still have more grouping to do
|
||||||
if type(struct) == type(dict()):
|
if type(struct) == type(dict()):
|
||||||
groups[value].update()
|
groups[value].update()
|
||||||
@@ -10449,22 +10445,22 @@ class Rows(object):
|
|||||||
# no more grouping, first only on
|
# no more grouping, first only on
|
||||||
else:
|
else:
|
||||||
groups[value] = struct
|
groups[value] = struct
|
||||||
|
|
||||||
return groups
|
return groups
|
||||||
|
|
||||||
if len(fields) == 0:
|
if len(fields) == 0:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
# if select returned no results
|
# if select returned no results
|
||||||
if not self.records:
|
if not self.records:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
grouped_row_group = dict()
|
grouped_row_group = dict()
|
||||||
|
|
||||||
# build the struct
|
# build the struct
|
||||||
for row in self:
|
for row in self:
|
||||||
build_fields_struct(row, fields, 0, grouped_row_group)
|
build_fields_struct(row, fields, 0, grouped_row_group)
|
||||||
|
|
||||||
return grouped_row_group
|
return grouped_row_group
|
||||||
|
|
||||||
def render(self, i=None, fields=None):
|
def render(self, i=None, fields=None):
|
||||||
|
|||||||
+1
-1
@@ -1484,7 +1484,7 @@ class A(DIV):
|
|||||||
if not self['_disable_with']:
|
if not self['_disable_with']:
|
||||||
self['_data-w2p_disable_with'] = 'default'
|
self['_data-w2p_disable_with'] = 'default'
|
||||||
if self['callback'] and not self['_id']:
|
if self['callback'] and not self['_id']:
|
||||||
self['_id'] = web2py_uuid()
|
self['_id'] = web2py_uuid()
|
||||||
if self['delete']:
|
if self['delete']:
|
||||||
self['_data-w2p_remove'] = self['delete']
|
self['_data-w2p_remove'] = self['delete']
|
||||||
if self['target']:
|
if self['target']:
|
||||||
|
|||||||
+4
-4
@@ -453,7 +453,7 @@ def wsgibase(environ, responder):
|
|||||||
serve_controller(request, response, session)
|
serve_controller(request, response, session)
|
||||||
|
|
||||||
except HTTP, http_response:
|
except HTTP, http_response:
|
||||||
|
|
||||||
if static_file:
|
if static_file:
|
||||||
return http_response.to(responder, env=env)
|
return http_response.to(responder, env=env)
|
||||||
|
|
||||||
@@ -470,7 +470,7 @@ def wsgibase(environ, responder):
|
|||||||
# ##################################################
|
# ##################################################
|
||||||
# on success, commit database
|
# on success, commit database
|
||||||
# ##################################################
|
# ##################################################
|
||||||
|
|
||||||
if response.do_not_commit is True:
|
if response.do_not_commit is True:
|
||||||
BaseAdapter.close_all_instances(None)
|
BaseAdapter.close_all_instances(None)
|
||||||
elif response.custom_commit:
|
elif response.custom_commit:
|
||||||
@@ -489,7 +489,7 @@ def wsgibase(environ, responder):
|
|||||||
if request.cid:
|
if request.cid:
|
||||||
http_response.headers.setdefault(
|
http_response.headers.setdefault(
|
||||||
'web2py-component-content', 'replace')
|
'web2py-component-content', 'replace')
|
||||||
|
|
||||||
if request.ajax:
|
if request.ajax:
|
||||||
if response.flash:
|
if response.flash:
|
||||||
http_response.headers['web2py-component-flash'] = \
|
http_response.headers['web2py-component-flash'] = \
|
||||||
@@ -498,7 +498,7 @@ def wsgibase(environ, responder):
|
|||||||
if response.js:
|
if response.js:
|
||||||
http_response.headers['web2py-component-command'] = \
|
http_response.headers['web2py-component-command'] = \
|
||||||
urllib2.quote(response.js.replace('\n',''))
|
urllib2.quote(response.js.replace('\n',''))
|
||||||
|
|
||||||
# ##################################################
|
# ##################################################
|
||||||
# store cookies in headers
|
# store cookies in headers
|
||||||
# ##################################################
|
# ##################################################
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ class TicketStorage(Storage):
|
|||||||
self._store_on_disk(request, ticket_id, ticket_data)
|
self._store_on_disk(request, ticket_id, ticket_data)
|
||||||
|
|
||||||
def _store_in_db(self, request, ticket_id, ticket_data):
|
def _store_in_db(self, request, ticket_id, ticket_data):
|
||||||
self.db._adapter.reconnect()
|
self.db._adapter.reconnect()
|
||||||
try:
|
try:
|
||||||
table = self._get_table(self.db, self.tablename, request.application)
|
table = self._get_table(self.db, self.tablename, request.application)
|
||||||
id = table.insert(ticket_id=ticket_id,
|
id = table.insert(ticket_id=ticket_id,
|
||||||
|
|||||||
+6
-6
@@ -244,15 +244,15 @@ def try_rewrite_on_error(http_response, request, environ, ticket=None):
|
|||||||
url = path_info + '?' + query_string
|
url = path_info + '?' + query_string
|
||||||
message = 'You are being redirected <a href="%s">here</a>'
|
message = 'You are being redirected <a href="%s">here</a>'
|
||||||
return HTTP(303, message % url, Location=url), environ
|
return HTTP(303, message % url, Location=url), environ
|
||||||
elif not environ.get('__ROUTES_ONERROR__', False):
|
elif not environ.get('__ROUTES_ONERROR__', False):
|
||||||
# wsgibase will be called recursively with
|
# wsgibase will be called recursively with
|
||||||
# the routes_onerror path.
|
# the routes_onerror path.
|
||||||
environ['__ROUTES_ONERROR__'] = True # limit recursion
|
environ['__ROUTES_ONERROR__'] = True # limit recursion
|
||||||
path_info = '/' + path_info.lstrip('/')
|
path_info = '/' + path_info.lstrip('/')
|
||||||
environ['PATH_INFO'] = path_info
|
environ['PATH_INFO'] = path_info
|
||||||
environ['QUERY_STRING'] = query_string
|
environ['QUERY_STRING'] = query_string
|
||||||
environ['WEB2PY_STATUS_CODE'] = status
|
environ['WEB2PY_STATUS_CODE'] = status
|
||||||
return None, environ
|
return None, environ
|
||||||
# do nothing!
|
# do nothing!
|
||||||
return http_response, environ
|
return http_response, environ
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -137,12 +137,12 @@ def env(
|
|||||||
|
|
||||||
for k, v in extra_request.items():
|
for k, v in extra_request.items():
|
||||||
request[k] = v
|
request[k] = v
|
||||||
|
|
||||||
path_info = '/%s/%s/%s' % (a, c, f)
|
path_info = '/%s/%s/%s' % (a, c, f)
|
||||||
if request.args:
|
if request.args:
|
||||||
path_info = '%s/%s' % (path_info, '/'.join(request.args))
|
path_info = '%s/%s' % (path_info, '/'.join(request.args))
|
||||||
if request.vars:
|
if request.vars:
|
||||||
vars = ['%s=%s' % (k,v) if v else '%s' % k
|
vars = ['%s=%s' % (k,v) if v else '%s' % k
|
||||||
for (k,v) in request.vars.iteritems()]
|
for (k,v) in request.vars.iteritems()]
|
||||||
path_info = '%s?%s' % (path_info, '&'.join(vars))
|
path_info = '%s?%s' % (path_info, '&'.join(vars))
|
||||||
request.env.path_info = path_info
|
request.env.path_info = path_info
|
||||||
@@ -238,7 +238,7 @@ def run(
|
|||||||
pyfile = os.path.join('applications', a, 'controllers', c + '.py')
|
pyfile = os.path.join('applications', a, 'controllers', c + '.py')
|
||||||
pycfile = os.path.join('applications', a, 'compiled',
|
pycfile = os.path.join('applications', a, 'compiled',
|
||||||
"controllers_%s_%s.pyc" % (c, f))
|
"controllers_%s_%s.pyc" % (c, f))
|
||||||
if ((cronjob and os.path.isfile(pycfile))
|
if ((cronjob and os.path.isfile(pycfile))
|
||||||
or not os.path.isfile(pyfile)):
|
or not os.path.isfile(pyfile)):
|
||||||
exec read_pyc(pycfile) in _env
|
exec read_pyc(pycfile) in _env
|
||||||
elif os.path.isfile(pyfile):
|
elif os.path.isfile(pyfile):
|
||||||
@@ -425,7 +425,7 @@ def execute_from_command_line(argv=None):
|
|||||||
parser = optparse.OptionParser(usage=get_usage())
|
parser = optparse.OptionParser(usage=get_usage())
|
||||||
|
|
||||||
parser.add_option('-S', '--shell', dest='shell', metavar='APPNAME',
|
parser.add_option('-S', '--shell', dest='shell', metavar='APPNAME',
|
||||||
help='run web2py in interactive shell ' +
|
help='run web2py in interactive shell ' +
|
||||||
'or IPython(if installed) with specified appname')
|
'or IPython(if installed) with specified appname')
|
||||||
msg = 'run web2py in interactive shell or bpython (if installed) with'
|
msg = 'run web2py in interactive shell or bpython (if installed) with'
|
||||||
msg += ' specified appname (if app does not exist it will be created).'
|
msg += ' specified appname (if app does not exist it will be created).'
|
||||||
|
|||||||
+1
-1
@@ -434,7 +434,7 @@ class TemplateParser(object):
|
|||||||
# Get the filename; filename looks like ``"template.html"``.
|
# Get the filename; filename looks like ``"template.html"``.
|
||||||
# We need to eval to remove the quotes and get the string type.
|
# We need to eval to remove the quotes and get the string type.
|
||||||
filename = eval(filename, context)
|
filename = eval(filename, context)
|
||||||
|
|
||||||
# Allow empty filename for conditional extend and include directives.
|
# Allow empty filename for conditional extend and include directives.
|
||||||
if not filename:
|
if not filename:
|
||||||
return ''
|
return ''
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class TestRoutes(unittest.TestCase):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
"""
|
"""
|
||||||
# outgoing
|
# outgoing
|
||||||
self.assertEqual(filter_url('http://domain.com/init/default/index',
|
self.assertEqual(filter_url('http://domain.com/init/default/index',
|
||||||
out=True), '/init/default/index')
|
out=True), '/init/default/index')
|
||||||
self.assertEqual(filter_url('http://domain.com/init/default/index/arg1', out=True), '/init/default/index/arg1')
|
self.assertEqual(filter_url('http://domain.com/init/default/index/arg1', out=True), '/init/default/index/arg1')
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class TestWeb(LiveTest):
|
|||||||
|
|
||||||
# check registration and login were successful
|
# check registration and login were successful
|
||||||
client.get('index')
|
client.get('index')
|
||||||
|
|
||||||
# COMMENTED BECAUSE FAILS BUT WHY?
|
# COMMENTED BECAUSE FAILS BUT WHY?
|
||||||
self.assertTrue('Welcome Homer' in client.text)
|
self.assertTrue('Welcome Homer' in client.text)
|
||||||
|
|
||||||
|
|||||||
+13
-13
@@ -921,7 +921,7 @@ class Auth(object):
|
|||||||
username_case_sensitive=True,
|
username_case_sensitive=True,
|
||||||
update_fields = ['email'],
|
update_fields = ['email'],
|
||||||
ondelete="CASCADE",
|
ondelete="CASCADE",
|
||||||
client_side = True,
|
client_side = True,
|
||||||
renew_session_onlogin=True,
|
renew_session_onlogin=True,
|
||||||
renew_session_onlogout=True,
|
renew_session_onlogout=True,
|
||||||
keep_session_onlogin=True,
|
keep_session_onlogin=True,
|
||||||
@@ -1560,8 +1560,8 @@ class Auth(object):
|
|||||||
current_record.replace('_',' ').title())
|
current_record.replace('_',' ').title())
|
||||||
for table in tables:
|
for table in tables:
|
||||||
fieldnames = table.fields()
|
fieldnames = table.fields()
|
||||||
if ('id' in fieldnames and
|
if ('id' in fieldnames and
|
||||||
'modified_on' in fieldnames and
|
'modified_on' in fieldnames and
|
||||||
not current_record in fieldnames):
|
not current_record in fieldnames):
|
||||||
table._enable_record_versioning(
|
table._enable_record_versioning(
|
||||||
archive_db=archive_db,
|
archive_db=archive_db,
|
||||||
@@ -2167,17 +2167,17 @@ class Auth(object):
|
|||||||
elif 'username' in table_user.fields:
|
elif 'username' in table_user.fields:
|
||||||
username = 'username'
|
username = 'username'
|
||||||
else:
|
else:
|
||||||
username = 'email'
|
username = 'email'
|
||||||
settings = self.settings
|
settings = self.settings
|
||||||
if 'username' in table_user.fields or \
|
if 'username' in table_user.fields or \
|
||||||
not settings.login_email_validate:
|
not settings.login_email_validate:
|
||||||
tmpvalidator = IS_NOT_EMPTY(error_message=self.messages.is_empty)
|
tmpvalidator = IS_NOT_EMPTY(error_message=self.messages.is_empty)
|
||||||
if not settings.username_case_sensitive:
|
if not settings.username_case_sensitive:
|
||||||
tmpvalidator = [IS_LOWER(), tmpvalidator]
|
tmpvalidator = [IS_LOWER(), tmpvalidator]
|
||||||
else:
|
else:
|
||||||
tmpvalidator = IS_EMAIL(error_message=self.messages.invalid_email)
|
tmpvalidator = IS_EMAIL(error_message=self.messages.invalid_email)
|
||||||
if not settings.email_case_sensitive:
|
if not settings.email_case_sensitive:
|
||||||
tmpvalidator = [IS_LOWER(), tmpvalidator]
|
tmpvalidator = [IS_LOWER(), tmpvalidator]
|
||||||
old_requires = table_user[username].requires
|
old_requires = table_user[username].requires
|
||||||
table_user[username].requires = tmpvalidator
|
table_user[username].requires = tmpvalidator
|
||||||
|
|
||||||
@@ -2191,7 +2191,7 @@ class Auth(object):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
### use session for federated login
|
### use session for federated login
|
||||||
snext = self.get_vars_next()
|
snext = self.get_vars_next()
|
||||||
if snext:
|
if snext:
|
||||||
session._auth_next = snext
|
session._auth_next = snext
|
||||||
@@ -2414,9 +2414,9 @@ class Auth(object):
|
|||||||
next = cas.logout_url(next)
|
next = cas.logout_url(next)
|
||||||
|
|
||||||
current.session.auth = None
|
current.session.auth = None
|
||||||
current.session.flash = self.messages.logged_out
|
|
||||||
if self.settings.renew_session_onlogout:
|
if self.settings.renew_session_onlogout:
|
||||||
current.session.renew(clear_session=not self.settings.keep_session_onlogout)
|
current.session.renew(clear_session=not self.settings.keep_session_onlogout)
|
||||||
|
current.session.flash = self.messages.logged_out
|
||||||
if not next is None:
|
if not next is None:
|
||||||
redirect(next)
|
redirect(next)
|
||||||
|
|
||||||
@@ -2515,9 +2515,9 @@ class Auth(object):
|
|||||||
captcha.comment, self.settings.formstyle, 'captcha__row')
|
captcha.comment, self.settings.formstyle, 'captcha__row')
|
||||||
|
|
||||||
table_user.registration_key.default = key = web2py_uuid()
|
table_user.registration_key.default = key = web2py_uuid()
|
||||||
if form.accepts(request, session if self.csrf_prevention else None,
|
if form.accepts(request, session if self.csrf_prevention else None,
|
||||||
formname='register',
|
formname='register',
|
||||||
onvalidation=onvalidation,
|
onvalidation=onvalidation,
|
||||||
hideerror=self.settings.hideerror):
|
hideerror=self.settings.hideerror):
|
||||||
description = self.messages.group_description % form.vars
|
description = self.messages.group_description % form.vars
|
||||||
if self.settings.create_user_groups:
|
if self.settings.create_user_groups:
|
||||||
@@ -5858,7 +5858,7 @@ class Wiki(object):
|
|||||||
class Config(object):
|
class Config(object):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
filename,
|
filename,
|
||||||
section,
|
section,
|
||||||
default_values={}
|
default_values={}
|
||||||
):
|
):
|
||||||
@@ -5879,11 +5879,11 @@ class Config(object):
|
|||||||
def save(self, options):
|
def save(self, options):
|
||||||
for option, value in options:
|
for option, value in options:
|
||||||
self.config.set(self.section, option, value)
|
self.config.set(self.section, option, value)
|
||||||
try:
|
try:
|
||||||
self.config.write(open(self.filename, 'w'))
|
self.config.write(open(self.filename, 'w'))
|
||||||
result = True
|
result = True
|
||||||
except:
|
except:
|
||||||
current.session['settings_%s' % self.section] = dict(self.config.items(self.section))
|
current.session['settings_%s' % self.section] = dict(self.config.items(self.section))
|
||||||
result = False
|
result = False
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -310,7 +310,7 @@ def is_loopback_ip_address(ip=None, addrinfo=None):
|
|||||||
if not isinstance(ip, basestring):
|
if not isinstance(ip, basestring):
|
||||||
return False
|
return False
|
||||||
# IPv4 or IPv6-embedded IPv4 or IPv4-compatible IPv6
|
# IPv4 or IPv6-embedded IPv4 or IPv4-compatible IPv6
|
||||||
if ip.count('.') == 3:
|
if ip.count('.') == 3:
|
||||||
return ip.lower().startswith(('127', '::127', '0:0:0:0:0:0:127',
|
return ip.lower().startswith(('127', '::127', '0:0:0:0:0:0:127',
|
||||||
'::ffff:127', '0:0:0:0:0:ffff:127'))
|
'::ffff:127', '0:0:0:0:0:ffff:127'))
|
||||||
return ip == '::1' or ip == '0:0:0:0:0:0:0:1' # IPv6 loopback
|
return ip == '::1' or ip == '0:0:0:0:0:0:0:1' # IPv6 loopback
|
||||||
@@ -322,7 +322,7 @@ def getipaddrinfo(host):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return [addrinfo for addrinfo in socket.getaddrinfo(host, None)
|
return [addrinfo for addrinfo in socket.getaddrinfo(host, None)
|
||||||
if (addrinfo[0] == socket.AF_INET or
|
if (addrinfo[0] == socket.AF_INET or
|
||||||
addrinfo[0] == socket.AF_INET6)
|
addrinfo[0] == socket.AF_INET6)
|
||||||
and isinstance(addrinfo[4][0], basestring)]
|
and isinstance(addrinfo[4][0], basestring)]
|
||||||
except socket.error:
|
except socket.error:
|
||||||
|
|||||||
+5
-2
@@ -2890,7 +2890,8 @@ class CRYPT(object):
|
|||||||
key=None,
|
key=None,
|
||||||
digest_alg='pbkdf2(1000,20,sha512)',
|
digest_alg='pbkdf2(1000,20,sha512)',
|
||||||
min_length=0,
|
min_length=0,
|
||||||
error_message='too short', salt=True):
|
error_message='too short', salt=True,
|
||||||
|
max_length=1024):
|
||||||
"""
|
"""
|
||||||
important, digest_alg='md5' is not the default hashing algorithm for
|
important, digest_alg='md5' is not the default hashing algorithm for
|
||||||
web2py. This is only an example of usage of this function.
|
web2py. This is only an example of usage of this function.
|
||||||
@@ -2901,10 +2902,12 @@ class CRYPT(object):
|
|||||||
self.key = key
|
self.key = key
|
||||||
self.digest_alg = digest_alg
|
self.digest_alg = digest_alg
|
||||||
self.min_length = min_length
|
self.min_length = min_length
|
||||||
|
self.max_length = max_length
|
||||||
self.error_message = error_message
|
self.error_message = error_message
|
||||||
self.salt = salt
|
self.salt = salt
|
||||||
|
|
||||||
def __call__(self, value):
|
def __call__(self, value):
|
||||||
|
value = value and value[:self.max_length]
|
||||||
if len(value) < self.min_length:
|
if len(value) < self.min_length:
|
||||||
return ('', translate(self.error_message))
|
return ('', translate(self.error_message))
|
||||||
return (LazyCrypt(self, value), None)
|
return (LazyCrypt(self, value), None)
|
||||||
@@ -3495,7 +3498,7 @@ class IS_IPV6(Validator):
|
|||||||
('2001::8ffa:fe22:b3af', None)
|
('2001::8ffa:fe22:b3af', None)
|
||||||
>>> IS_IPV6(subnets='invalidsubnet')('2001::8ffa:fe22:b3af')
|
>>> IS_IPV6(subnets='invalidsubnet')('2001::8ffa:fe22:b3af')
|
||||||
('2001::8ffa:fe22:b3af', 'invalid subnet provided')
|
('2001::8ffa:fe22:b3af', 'invalid subnet provided')
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|||||||
+2
-2
@@ -176,7 +176,7 @@ class Web2pyCronService(Web2pyService):
|
|||||||
from gluon.settings import global_settings
|
from gluon.settings import global_settings
|
||||||
from gluon.fileutils import abspath
|
from gluon.fileutils import abspath
|
||||||
from os.path import exists, join
|
from os.path import exists, join
|
||||||
|
|
||||||
self.log('web2py Cron service starting')
|
self.log('web2py Cron service starting')
|
||||||
if not self.chdir():
|
if not self.chdir():
|
||||||
return
|
return
|
||||||
@@ -186,7 +186,7 @@ class Web2pyCronService(Web2pyService):
|
|||||||
opt_mod = self._exe_args_
|
opt_mod = self._exe_args_
|
||||||
options = __import__(opt_mod, [], [], '')
|
options = __import__(opt_mod, [], [], '')
|
||||||
logpath = abspath(join(options.folder, "logging.conf"))
|
logpath = abspath(join(options.folder, "logging.conf"))
|
||||||
|
|
||||||
if exists(logpath):
|
if exists(logpath):
|
||||||
logging.config.fileConfig(logpath)
|
logging.config.fileConfig(logpath)
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user