+1
-1
@@ -115,7 +115,7 @@ class AuthAPI(object):
|
||||
if auth.last_visit and auth.last_visit + delta > now:
|
||||
self.user = auth.user
|
||||
# this is a trick to speed up sessions to avoid many writes
|
||||
if (now - auth.last_visit).seconds > (auth.expiration / 10):
|
||||
if (now - auth.last_visit).seconds > (auth.expiration // 10):
|
||||
auth.last_visit = now
|
||||
else:
|
||||
self.user = None
|
||||
|
||||
@@ -45,7 +45,7 @@ class RESIZE(object):
|
||||
background = Image.new('RGBA', (self.nx, self.ny), (255, 255, 255, 0))
|
||||
background.paste(
|
||||
img,
|
||||
((self.nx - img.size[0]) / 2, (self.ny - img.size[1]) / 2))
|
||||
((self.nx - img.size[0]) // 2, (self.ny - img.size[1]) // 2))
|
||||
background.save(s, 'JPEG', quality=self.quality)
|
||||
else:
|
||||
img.save(s, 'JPEG', quality=self.quality)
|
||||
|
||||
+2
-2
@@ -415,10 +415,10 @@ def fix_newlines(path):
|
||||
|\r|
|
||||
)''')
|
||||
for filename in listdir(path, '.*\.(py|html)$', drop=False):
|
||||
rdata = read_file(filename, 'rb')
|
||||
rdata = read_file(filename, 'r')
|
||||
wdata = regex.sub('\n', rdata)
|
||||
if wdata != rdata:
|
||||
write_file(filename, wdata, 'wb')
|
||||
write_file(filename, wdata, 'w')
|
||||
|
||||
|
||||
def copystream(
|
||||
|
||||
+3
-1
@@ -11,7 +11,7 @@ HTTP statuses helpers
|
||||
"""
|
||||
|
||||
import re
|
||||
from gluon._compat import iteritems
|
||||
from gluon._compat import iteritems, unicodeT
|
||||
|
||||
__all__ = ['HTTP', 'redirect']
|
||||
|
||||
@@ -122,6 +122,8 @@ class HTTP(Exception):
|
||||
if env.get('request_method', '') == 'HEAD':
|
||||
return ['']
|
||||
elif isinstance(body, (str, bytes, bytearray)):
|
||||
if isinstance(body, unicodeT):
|
||||
body = body.encode('utf-8')
|
||||
return [body]
|
||||
elif hasattr(body, '__iter__'):
|
||||
return body
|
||||
|
||||
+7
-4
@@ -405,7 +405,7 @@ class RadioWidget(OptionsWidget):
|
||||
cols = attributes.get('cols', 1)
|
||||
totals = len(options)
|
||||
mods = totals % cols
|
||||
rows = totals / cols
|
||||
rows = totals // cols
|
||||
if mods:
|
||||
rows += 1
|
||||
|
||||
@@ -471,7 +471,7 @@ class CheckboxesWidget(OptionsWidget):
|
||||
cols = attributes.get('cols', 1)
|
||||
totals = len(options)
|
||||
mods = totals % cols
|
||||
rows = totals / cols
|
||||
rows = totals // cols
|
||||
if mods:
|
||||
rows += 1
|
||||
|
||||
@@ -684,9 +684,10 @@ class AutocompleteWidget(object):
|
||||
urlvars = request.vars
|
||||
urlvars[default_var] = 1
|
||||
self.url = URL(args=request.args, vars=urlvars)
|
||||
self.callback()
|
||||
self.run_callback = True
|
||||
else:
|
||||
self.url = request
|
||||
self.run_callback = False
|
||||
|
||||
def callback(self):
|
||||
if self.keyword in self.request.vars:
|
||||
@@ -759,6 +760,8 @@ class AutocompleteWidget(object):
|
||||
raise HTTP(200, '')
|
||||
|
||||
def __call__(self, field, value, **attributes):
|
||||
if self.run_callback:
|
||||
self.callback()
|
||||
default = dict(
|
||||
_type='text',
|
||||
value=(value is not None and str(value)) or '',
|
||||
@@ -1916,7 +1919,7 @@ class SQLFORM(FORM):
|
||||
if 'table_name' in attributes:
|
||||
del attributes['table_name']
|
||||
|
||||
return SQLFORM(DAL(None).define_table(table_name, *fields),
|
||||
return SQLFORM(DAL(None).define_table(table_name, *[field.clone() for field in fields]),
|
||||
**attributes)
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import unittest
|
||||
import datetime
|
||||
|
||||
from gluon.fileutils import parse_version
|
||||
from gluon.fileutils import parse_version, fix_newlines
|
||||
|
||||
|
||||
class TestFileUtils(unittest.TestCase):
|
||||
@@ -22,3 +23,6 @@ class TestFileUtils(unittest.TestCase):
|
||||
# Semantic Beta
|
||||
rtn = parse_version('Version 2.14.1-beta+timestamp.2016.03.21.22.35.26')
|
||||
self.assertEqual(rtn, (2, 14, 1, 'beta', datetime.datetime(2016, 3, 21, 22, 35, 26)))
|
||||
|
||||
def test_fix_newlines(self):
|
||||
fix_newlines(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
+6
-6
@@ -1762,7 +1762,7 @@ class Auth(AuthAPI):
|
||||
if auth.last_visit and auth.last_visit + delta > now:
|
||||
self.user = auth.user
|
||||
# this is a trick to speed up sessions to avoid many writes
|
||||
if (now - auth.last_visit).seconds > (auth.expiration / 10):
|
||||
if (now - auth.last_visit).seconds > (auth.expiration // 10):
|
||||
auth.last_visit = now
|
||||
else:
|
||||
self.user = None
|
||||
@@ -5531,15 +5531,15 @@ def prettydate(d, T=lambda x: x, utc=False):
|
||||
else:
|
||||
suffix = ' ago'
|
||||
if dt.days >= 2 * 365:
|
||||
return T('%d years' + suffix) % int(dt.days / 365)
|
||||
return T('%d years' + suffix) % int(dt.days // 365)
|
||||
elif dt.days >= 365:
|
||||
return T('1 year' + suffix)
|
||||
elif dt.days >= 60:
|
||||
return T('%d months' + suffix) % int(dt.days / 30)
|
||||
return T('%d months' + suffix) % int(dt.days // 30)
|
||||
elif dt.days >= 27: # 4 weeks ugly
|
||||
return T('1 month' + suffix)
|
||||
elif dt.days >= 14:
|
||||
return T('%d weeks' + suffix) % int(dt.days / 7)
|
||||
return T('%d weeks' + suffix) % int(dt.days // 7)
|
||||
elif dt.days >= 7:
|
||||
return T('1 week' + suffix)
|
||||
elif dt.days > 1:
|
||||
@@ -5547,11 +5547,11 @@ def prettydate(d, T=lambda x: x, utc=False):
|
||||
elif dt.days == 1:
|
||||
return T('1 day' + suffix)
|
||||
elif dt.seconds >= 2 * 60 * 60:
|
||||
return T('%d hours' + suffix) % int(dt.seconds / 3600)
|
||||
return T('%d hours' + suffix) % int(dt.seconds // 3600)
|
||||
elif dt.seconds >= 60 * 60:
|
||||
return T('1 hour' + suffix)
|
||||
elif dt.seconds >= 2 * 60:
|
||||
return T('%d minutes' + suffix) % int(dt.seconds / 60)
|
||||
return T('%d minutes' + suffix) % int(dt.seconds // 60)
|
||||
elif dt.seconds >= 60:
|
||||
return T('1 minute' + suffix)
|
||||
elif dt.seconds > 1:
|
||||
|
||||
+6
-6
@@ -156,12 +156,12 @@ def get_digest(value):
|
||||
raise ValueError("Invalid digest algorithm: %s" % value)
|
||||
|
||||
DIGEST_ALG_BY_SIZE = {
|
||||
128 / 4: 'md5',
|
||||
160 / 4: 'sha1',
|
||||
224 / 4: 'sha224',
|
||||
256 / 4: 'sha256',
|
||||
384 / 4: 'sha384',
|
||||
512 / 4: 'sha512',
|
||||
128 // 4: 'md5',
|
||||
160 // 4: 'sha1',
|
||||
224 // 4: 'sha224',
|
||||
256 // 4: 'sha256',
|
||||
384 // 4: 'sha384',
|
||||
512 // 4: 'sha512',
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -2767,7 +2767,7 @@ class LazyCrypt(object):
|
||||
else:
|
||||
digest_alg, key = self.crypt.digest_alg, ''
|
||||
if self.crypt.salt:
|
||||
if self.crypt.salt:
|
||||
if self.crypt.salt is True:
|
||||
salt = str(web2py_uuid()).replace('-', '')[-16:]
|
||||
else:
|
||||
salt = self.crypt.salt
|
||||
|
||||
Reference in New Issue
Block a user