fixing merge issue
This commit is contained in:
@@ -74,8 +74,10 @@ def log_progress(app, mode='EDIT', filename=None, progress=0):
|
|||||||
def safe_open(a, b):
|
def safe_open(a, b):
|
||||||
if (DEMO_MODE or is_gae) and ('w' in b or 'a' in b):
|
if (DEMO_MODE or is_gae) and ('w' in b or 'a' in b):
|
||||||
class tmp:
|
class tmp:
|
||||||
|
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
pass
|
pass
|
||||||
return tmp()
|
return tmp()
|
||||||
@@ -208,6 +210,7 @@ def site():
|
|||||||
file_or_appurl = 'file' in request.vars or 'appurl' in request.vars
|
file_or_appurl = 'file' in request.vars or 'appurl' in request.vars
|
||||||
|
|
||||||
class IS_VALID_APPNAME(object):
|
class IS_VALID_APPNAME(object):
|
||||||
|
|
||||||
def __call__(self, value):
|
def __call__(self, value):
|
||||||
if not re.compile('^\w+$').match(value):
|
if not re.compile('^\w+$').match(value):
|
||||||
return (value, T('Invalid application name'))
|
return (value, T('Invalid application name'))
|
||||||
@@ -353,6 +356,7 @@ def pack():
|
|||||||
session.flash = T('internal error: %s', e)
|
session.flash = T('internal error: %s', e)
|
||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
|
|
||||||
|
|
||||||
def pack_plugin():
|
def pack_plugin():
|
||||||
app = get_app()
|
app = get_app()
|
||||||
if len(request.args) == 2:
|
if len(request.args) == 2:
|
||||||
@@ -368,7 +372,6 @@ def pack_plugin():
|
|||||||
redirect(URL('plugin', args=request.args))
|
redirect(URL('plugin', args=request.args))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def pack_exe(app, base, filenames=None):
|
def pack_exe(app, base, filenames=None):
|
||||||
import urllib
|
import urllib
|
||||||
import zipfile
|
import zipfile
|
||||||
@@ -397,10 +400,20 @@ def pack_exe(app, base, filenames=None):
|
|||||||
def pack_custom():
|
def pack_custom():
|
||||||
app = get_app()
|
app = get_app()
|
||||||
base = apath(app, r=request)
|
base = apath(app, r=request)
|
||||||
if request.post_vars.file:
|
|
||||||
|
|
||||||
|
def ignore(fs):
|
||||||
|
return [f for f in fs if not (
|
||||||
|
f[:1] in '#' or f.endswith('~') or f.endswith('.bak'))]
|
||||||
|
files = {}
|
||||||
|
for (r, d, f) in os.walk(base):
|
||||||
|
files[r] = {'folders': ignore(d), 'files': ignore(f)}
|
||||||
|
|
||||||
|
if request.post_vars.file:
|
||||||
|
valid_set = set(os.path.relpath(os.path.join(r, f), base) for r in files for f in files[r]['files'])
|
||||||
files = request.post_vars.file
|
files = request.post_vars.file
|
||||||
files = [files] if not isinstance(files, list) else files
|
files = [files] if not isinstance(files, list) else files
|
||||||
|
files = [file for file in files if file in valid_set]
|
||||||
|
|
||||||
if request.post_vars.doexe is None:
|
if request.post_vars.doexe is None:
|
||||||
fname = 'web2py.app.%s.w2p' % app
|
fname = 'web2py.app.%s.w2p' % app
|
||||||
try:
|
try:
|
||||||
@@ -417,12 +430,7 @@ def pack_custom():
|
|||||||
redirect(URL(args=request.args))
|
redirect(URL(args=request.args))
|
||||||
else:
|
else:
|
||||||
return pack_exe(app, base, files)
|
return pack_exe(app, base, files)
|
||||||
def ignore(fs):
|
|
||||||
return [f for f in fs if not (
|
|
||||||
f[:1] in '#' or f.endswith('~') or f.endswith('.bak'))]
|
|
||||||
files = {}
|
|
||||||
for (r,d,f) in os.walk(base):
|
|
||||||
files[r] = {'folders':ignore(d),'files':ignore(f)}
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
@@ -546,6 +554,7 @@ def enable():
|
|||||||
safe_open(filename, 'wb').write('disabled: True\ntime-disabled: %s' % request.now)
|
safe_open(filename, 'wb').write('disabled: True\ntime-disabled: %s' % request.now)
|
||||||
return SPAN(T('Enable'), _style='color:red')
|
return SPAN(T('Enable'), _style='color:red')
|
||||||
|
|
||||||
|
|
||||||
def peek():
|
def peek():
|
||||||
""" Visualize object code """
|
""" Visualize object code """
|
||||||
app = get_app(request.vars.app)
|
app = get_app(request.vars.app)
|
||||||
@@ -764,8 +773,8 @@ def edit():
|
|||||||
view = request.args[3].replace('.html', '')
|
view = request.args[3].replace('.html', '')
|
||||||
view_link = URL(request.args[0], request.args[2], view)
|
view_link = URL(request.args[0], request.args[2], view)
|
||||||
elif filetype == 'python' and request.args[1] == 'controllers':
|
elif filetype == 'python' and request.args[1] == 'controllers':
|
||||||
## it's a controller file.
|
# it's a controller file.
|
||||||
## Create links to all of the associated view files.
|
# Create links to all of the associated view files.
|
||||||
app = get_app()
|
app = get_app()
|
||||||
viewname = os.path.splitext(request.args[2])[0]
|
viewname = os.path.splitext(request.args[2])[0]
|
||||||
viewpath = os.path.join(app, 'views', viewname)
|
viewpath = os.path.join(app, 'views', viewname)
|
||||||
@@ -820,12 +829,14 @@ def edit():
|
|||||||
else:
|
else:
|
||||||
return response.json(file_details)
|
return response.json(file_details)
|
||||||
|
|
||||||
|
|
||||||
def todolist():
|
def todolist():
|
||||||
""" Returns all TODO of the requested app
|
""" Returns all TODO of the requested app
|
||||||
"""
|
"""
|
||||||
app = request.vars.app or ''
|
app = request.vars.app or ''
|
||||||
app_path = apath('%(app)s' % {'app': app}, r=request)
|
app_path = apath('%(app)s' % {'app': app}, r=request)
|
||||||
dirs = ['models', 'controllers', 'modules', 'private']
|
dirs = ['models', 'controllers', 'modules', 'private']
|
||||||
|
|
||||||
def listfiles(app, dir, regexp='.*\.py$'):
|
def listfiles(app, dir, regexp='.*\.py$'):
|
||||||
files = sorted(listdir(apath('%(app)s/%(dir)s/' % {'app': app, 'dir': dir}, r=request), regexp))
|
files = sorted(listdir(apath('%(app)s/%(dir)s/' % {'app': app, 'dir': dir}, r=request), regexp))
|
||||||
files = [x.replace(os.path.sep, '/') for x in files if not x.endswith('.bak')]
|
files = [x.replace(os.path.sep, '/') for x in files if not x.endswith('.bak')]
|
||||||
@@ -850,6 +861,7 @@ def todolist():
|
|||||||
|
|
||||||
return {'todo': output, 'app': app}
|
return {'todo': output, 'app': app}
|
||||||
|
|
||||||
|
|
||||||
def editor_sessions():
|
def editor_sessions():
|
||||||
config = Config(os.path.join(request.folder, 'settings.cfg'),
|
config = Config(os.path.join(request.folder, 'settings.cfg'),
|
||||||
section='editor_sessions', default_values={})
|
section='editor_sessions', default_values={})
|
||||||
@@ -866,6 +878,7 @@ def editor_sessions():
|
|||||||
|
|
||||||
return response.render('default/editor_sessions.html', {'editor_sessions': preferences})
|
return response.render('default/editor_sessions.html', {'editor_sessions': preferences})
|
||||||
|
|
||||||
|
|
||||||
def resolve():
|
def resolve():
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
@@ -1298,6 +1311,7 @@ def plugin():
|
|||||||
languages=languages,
|
languages=languages,
|
||||||
crontab=crontab)
|
crontab=crontab)
|
||||||
|
|
||||||
|
|
||||||
def create_file():
|
def create_file():
|
||||||
""" Create files handler """
|
""" Create files handler """
|
||||||
if request.vars and not request.vars.token == session.token:
|
if request.vars and not request.vars.token == session.token:
|
||||||
@@ -1473,11 +1487,13 @@ def listfiles(app, dir, regexp='.*\.py$'):
|
|||||||
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
files = [x.replace('\\', '/') for x in files if not x.endswith('.bak')]
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
||||||
def editfile(path, file, vars={}, app=None):
|
def editfile(path, file, vars={}, app=None):
|
||||||
args = (path, file) if 'app' in vars else (app, path, file)
|
args = (path, file) if 'app' in vars else (app, path, file)
|
||||||
url = URL('edit', args=args, vars=vars)
|
url = URL('edit', args=args, vars=vars)
|
||||||
return A(file, _class='editor_filelink', _href=url, _style='word-wrap: nowrap;')
|
return A(file, _class='editor_filelink', _href=url, _style='word-wrap: nowrap;')
|
||||||
|
|
||||||
|
|
||||||
def files_menu():
|
def files_menu():
|
||||||
app = request.vars.app or 'welcome'
|
app = request.vars.app or 'welcome'
|
||||||
dirs = [{'name': 'models', 'reg': '.*\.py$'},
|
dirs = [{'name': 'models', 'reg': '.*\.py$'},
|
||||||
@@ -1495,6 +1511,7 @@ def files_menu():
|
|||||||
_id=dir['name'] + '_files', _style="display: none;")))
|
_id=dir['name'] + '_files', _style="display: none;")))
|
||||||
return dict(result_files=result_files)
|
return dict(result_files=result_files)
|
||||||
|
|
||||||
|
|
||||||
def upload_file():
|
def upload_file():
|
||||||
""" File uploading handler """
|
""" File uploading handler """
|
||||||
if request.vars and not request.vars.token == session.token:
|
if request.vars and not request.vars.token == session.token:
|
||||||
@@ -1867,7 +1884,7 @@ def bulk_register():
|
|||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
### Begin experimental stuff need fixes:
|
# Begin experimental stuff need fixes:
|
||||||
# 1) should run in its own process - cannot os.chdir
|
# 1) should run in its own process - cannot os.chdir
|
||||||
# 2) should not prompt user at console
|
# 2) should not prompt user at console
|
||||||
# 3) should give option to force commit and not reuqire manual merge
|
# 3) should give option to force commit and not reuqire manual merge
|
||||||
@@ -1934,6 +1951,7 @@ def git_push():
|
|||||||
redirect(URL('site'))
|
redirect(URL('site'))
|
||||||
return dict(app=app, form=form)
|
return dict(app=app, form=form)
|
||||||
|
|
||||||
|
|
||||||
def plugins():
|
def plugins():
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
from serializers import loads_json
|
from serializers import loads_json
|
||||||
@@ -1948,6 +1966,7 @@ def plugins():
|
|||||||
session.plugins = []
|
session.plugins = []
|
||||||
return dict(plugins=session.plugins["results"], app=request.args(0))
|
return dict(plugins=session.plugins["results"], app=request.args(0))
|
||||||
|
|
||||||
|
|
||||||
def install_plugin():
|
def install_plugin():
|
||||||
app = request.args(0)
|
app = request.args(0)
|
||||||
source = request.vars.source
|
source = request.vars.source
|
||||||
|
|||||||
@@ -210,6 +210,8 @@ class TestValidators(unittest.TestCase):
|
|||||||
costanza_id = db.person.insert(name='costanza')
|
costanza_id = db.person.insert(name='costanza')
|
||||||
rtn = IS_IN_DB(db, 'person.id', '%(name)s')(george_id)
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s')(george_id)
|
||||||
self.assertEqual(rtn, (george_id, None))
|
self.assertEqual(rtn, (george_id, None))
|
||||||
|
rtn = IS_IN_DB(db, 'person.name', '%(name)s')('george')
|
||||||
|
self.assertEqual(rtn, ('george', None))
|
||||||
rtn = IS_IN_DB(db, db.person, '%(name)s')(george_id)
|
rtn = IS_IN_DB(db, db.person, '%(name)s')(george_id)
|
||||||
self.assertEqual(rtn, (george_id, None))
|
self.assertEqual(rtn, (george_id, None))
|
||||||
rtn = IS_IN_DB(db(db.person.id > 0), db.person, '%(name)s')(george_id)
|
rtn = IS_IN_DB(db(db.person.id > 0), db.person, '%(name)s')(george_id)
|
||||||
@@ -222,6 +224,8 @@ class TestValidators(unittest.TestCase):
|
|||||||
self.assertEqual(rtn, (george_id + costanza_id, 'oops'))
|
self.assertEqual(rtn, (george_id + costanza_id, 'oops'))
|
||||||
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True)([george_id, costanza_id])
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True)([george_id, costanza_id])
|
||||||
self.assertEqual(rtn, ([george_id, costanza_id], None))
|
self.assertEqual(rtn, ([george_id, costanza_id], None))
|
||||||
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True, error_message='oops')("I'm not even an id")
|
||||||
|
self.assertEqual(rtn, (["I'm not even an id"], 'oops'))
|
||||||
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True, delimiter=',')('%d,%d' % (george_id, costanza_id))
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True, delimiter=',')('%d,%d' % (george_id, costanza_id))
|
||||||
self.assertEqual(rtn, (('%d,%d' % (george_id, costanza_id)).split(','), None))
|
self.assertEqual(rtn, (('%d,%d' % (george_id, costanza_id)).split(','), None))
|
||||||
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=(1, 3), delimiter=',')('%d,%d' % (george_id, costanza_id))
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=(1, 3), delimiter=',')('%d,%d' % (george_id, costanza_id))
|
||||||
@@ -232,6 +236,17 @@ class TestValidators(unittest.TestCase):
|
|||||||
self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')])
|
self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')])
|
||||||
rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True)
|
rtn = IS_IN_DB(db, db.person.id, db.person.name, error_message='oops', sort=True).options(zero=True)
|
||||||
self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')])
|
self.assertEqual(rtn, [('', ''), ('%d' % costanza_id, 'costanza'), ('%d' % george_id, 'george')])
|
||||||
|
# Test using the set it made for options
|
||||||
|
vldtr = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops')
|
||||||
|
vldtr.options()
|
||||||
|
rtn = vldtr('george')
|
||||||
|
self.assertEqual(rtn, ('george', None))
|
||||||
|
rtn = vldtr('jerry')
|
||||||
|
self.assertEqual(rtn, ('jerry', 'oops'))
|
||||||
|
vldtr = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops', multiple=True)
|
||||||
|
vldtr.options()
|
||||||
|
rtn = vldtr(['george', 'costanza'])
|
||||||
|
self.assertEqual(rtn, (['george', 'costanza'], None))
|
||||||
# Test it works with self reference
|
# Test it works with self reference
|
||||||
db.define_table('category',
|
db.define_table('category',
|
||||||
Field('parent_id', 'reference category', requires=IS_EMPTY_OR(IS_IN_DB(db, 'category.id', '%(name)s'))),
|
Field('parent_id', 'reference category', requires=IS_EMPTY_OR(IS_IN_DB(db, 'category.id', '%(name)s'))),
|
||||||
@@ -243,14 +258,31 @@ class TestValidators(unittest.TestCase):
|
|||||||
self.assertFalse(list(ret.errors))
|
self.assertFalse(list(ret.errors))
|
||||||
rtn = IS_IN_DB(db, 'category.id', '%(name)s')(ret.id)
|
rtn = IS_IN_DB(db, 'category.id', '%(name)s')(ret.id)
|
||||||
self.assertEqual(rtn, (ret.id, None))
|
self.assertEqual(rtn, (ret.id, None))
|
||||||
|
# Test _and
|
||||||
|
vldtr = IS_IN_DB(db, 'person.name', '%(name)s', error_message='oops', _and=IS_LENGTH(maxsize=7, error_message='bad'))
|
||||||
|
rtn = vldtr('george')
|
||||||
|
self.assertEqual(rtn, ('george', None))
|
||||||
|
rtn = vldtr('costanza')
|
||||||
|
self.assertEqual(rtn, ('costanza', 'bad'))
|
||||||
|
rtn = vldtr('jerry')
|
||||||
|
self.assertEqual(rtn, ('jerry', 'oops'))
|
||||||
|
vldtr.options() # test theset with _and
|
||||||
|
rtn = vldtr('jerry')
|
||||||
|
self.assertEqual(rtn, ('jerry', 'oops'))
|
||||||
|
# Test auto_add
|
||||||
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', error_message='oops')('jerry')
|
||||||
|
self.assertEqual(rtn, ('jerry', 'oops'))
|
||||||
|
rtn = IS_IN_DB(db, 'person.id', '%(name)s', auto_add=True)('jerry')
|
||||||
|
self.assertEqual(rtn, (3, None))
|
||||||
db.person.drop()
|
db.person.drop()
|
||||||
db.category.drop()
|
db.category.drop()
|
||||||
|
|
||||||
def test_IS_NOT_IN_DB(self):
|
def test_IS_NOT_IN_DB(self):
|
||||||
from gluon.dal import DAL, Field
|
from gluon.dal import DAL, Field
|
||||||
db = DAL('sqlite:memory')
|
db = DAL('sqlite:memory')
|
||||||
db.define_table('person', Field('name'))
|
db.define_table('person', Field('name'), Field('nickname'))
|
||||||
db.person.insert(name='george')
|
db.person.insert(name='george')
|
||||||
|
db.person.insert(name='costanza', nickname='T Bone')
|
||||||
rtn = IS_NOT_IN_DB(db, 'person.name', error_message='oops')('george')
|
rtn = IS_NOT_IN_DB(db, 'person.name', error_message='oops')('george')
|
||||||
self.assertEqual(rtn, ('george', 'oops'))
|
self.assertEqual(rtn, ('george', 'oops'))
|
||||||
rtn = IS_NOT_IN_DB(db, 'person.name', error_message='oops', allowed_override=['george'])('george')
|
rtn = IS_NOT_IN_DB(db, 'person.name', error_message='oops', allowed_override=['george'])('george')
|
||||||
@@ -261,6 +293,17 @@ class TestValidators(unittest.TestCase):
|
|||||||
self.assertEqual(rtn, ('jerry', None))
|
self.assertEqual(rtn, ('jerry', None))
|
||||||
rtn = IS_NOT_IN_DB(db, 'person.name')(u'jerry')
|
rtn = IS_NOT_IN_DB(db, 'person.name')(u'jerry')
|
||||||
self.assertEqual(rtn, ('jerry', None))
|
self.assertEqual(rtn, ('jerry', None))
|
||||||
|
rtn = IS_NOT_IN_DB(db(db.person.id > 0), 'person.name')(u'jerry')
|
||||||
|
self.assertEqual(rtn, ('jerry', None))
|
||||||
|
rtn = IS_NOT_IN_DB(db, db.person, error_message='oops')(1)
|
||||||
|
self.assertEqual(rtn, ('1', 'oops'))
|
||||||
|
vldtr = IS_NOT_IN_DB(db, 'person.name', error_message='oops')
|
||||||
|
vldtr.set_self_id({'name': 'costanza', 'nickname': 'T Bone'})
|
||||||
|
rtn = vldtr('george')
|
||||||
|
self.assertEqual(rtn, ('george', 'oops'))
|
||||||
|
rtn = vldtr('costanza')
|
||||||
|
self.assertEqual(rtn, ('costanza', None))
|
||||||
|
|
||||||
db.person.drop()
|
db.person.drop()
|
||||||
|
|
||||||
def test_IS_INT_IN_RANGE(self):
|
def test_IS_INT_IN_RANGE(self):
|
||||||
@@ -485,6 +528,9 @@ class TestValidators(unittest.TestCase):
|
|||||||
self.assertEqual(rtn, ('localguy@localhost', 'Enter a valid email address'))
|
self.assertEqual(rtn, ('localguy@localhost', 'Enter a valid email address'))
|
||||||
rtn = IS_EMAIL(forced='^.*\.edu(|\..*)$')('localguy@example.edu')
|
rtn = IS_EMAIL(forced='^.*\.edu(|\..*)$')('localguy@example.edu')
|
||||||
self.assertEqual(rtn, ('localguy@example.edu', None))
|
self.assertEqual(rtn, ('localguy@example.edu', None))
|
||||||
|
# test for not a string at all
|
||||||
|
rtn = IS_EMAIL(error_message='oops')(42)
|
||||||
|
self.assertEqual(rtn, (42, 'oops'))
|
||||||
|
|
||||||
def test_IS_LIST_OF_EMAILS(self):
|
def test_IS_LIST_OF_EMAILS(self):
|
||||||
emails = ['localguy@localhost', '_Yosemite.Sam@example.com']
|
emails = ['localguy@localhost', '_Yosemite.Sam@example.com']
|
||||||
@@ -560,16 +606,20 @@ class TestValidators(unittest.TestCase):
|
|||||||
# Test timezone is removed and value is properly converted
|
# Test timezone is removed and value is properly converted
|
||||||
#
|
#
|
||||||
# https://github.com/web2py/web2py/issues/1094
|
# https://github.com/web2py/web2py/issues/1094
|
||||||
|
|
||||||
class DummyTimezone(datetime.tzinfo):
|
class DummyTimezone(datetime.tzinfo):
|
||||||
|
|
||||||
ONE = datetime.timedelta(hours=1)
|
ONE = datetime.timedelta(hours=1)
|
||||||
|
|
||||||
def utcoffset(self, dt):
|
def utcoffset(self, dt):
|
||||||
return DummyTimezone.ONE
|
return DummyTimezone.ONE
|
||||||
|
|
||||||
def tzname(self, dt):
|
def tzname(self, dt):
|
||||||
return "UTC+1"
|
return "UTC+1"
|
||||||
|
|
||||||
def dst(self, dt):
|
def dst(self, dt):
|
||||||
return DummyTimezone.ONE
|
return DummyTimezone.ONE
|
||||||
|
|
||||||
def localize(self, dt, is_dst=False):
|
def localize(self, dt, is_dst=False):
|
||||||
return dt.replace(tzinfo=self)
|
return dt.replace(tzinfo=self)
|
||||||
v = IS_DATETIME(format="%Y-%m-%d %H:%M", error_message="oops", timezone=DummyTimezone())
|
v = IS_DATETIME(format="%Y-%m-%d %H:%M", error_message="oops", timezone=DummyTimezone())
|
||||||
@@ -814,6 +864,7 @@ class TestValidators(unittest.TestCase):
|
|||||||
|
|
||||||
def test_IS_IMAGE(self):
|
def test_IS_IMAGE(self):
|
||||||
class DummyImageFile(object):
|
class DummyImageFile(object):
|
||||||
|
|
||||||
def __init__(self, filename, ext, width, height):
|
def __init__(self, filename, ext, width, height):
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
import struct
|
import struct
|
||||||
@@ -873,10 +924,10 @@ class TestValidators(unittest.TestCase):
|
|||||||
rtn = IS_IMAGE(error_message='oops')(img)
|
rtn = IS_IMAGE(error_message='oops')(img)
|
||||||
self.assertEqual(rtn, (img, 'oops'))
|
self.assertEqual(rtn, (img, 'oops'))
|
||||||
|
|
||||||
|
|
||||||
def test_IS_UPLOAD_FILENAME(self):
|
def test_IS_UPLOAD_FILENAME(self):
|
||||||
import cgi
|
import cgi
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
|
|
||||||
def gen_fake(filename):
|
def gen_fake(filename):
|
||||||
formdata_file_data = """
|
formdata_file_data = """
|
||||||
---123
|
---123
|
||||||
|
|||||||
Reference in New Issue
Block a user