CacheRepresenter
This commit is contained in:
+22
-16
@@ -71,6 +71,26 @@ def represent(field, value, record):
|
|||||||
else:
|
else:
|
||||||
raise RuntimeError("field representation must take 1 or 2 args")
|
raise RuntimeError("field representation must take 1 or 2 args")
|
||||||
|
|
||||||
|
class CacheRepresenter(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.cache = {}
|
||||||
|
def __call__(self, field, value, row):
|
||||||
|
cache = self.cache
|
||||||
|
if field not in cache:
|
||||||
|
cache[field] = {}
|
||||||
|
try:
|
||||||
|
nvalue = cache[field][value]
|
||||||
|
except KeyError:
|
||||||
|
try:
|
||||||
|
nvalue = field.represent(value, row)
|
||||||
|
except KeyError:
|
||||||
|
try:
|
||||||
|
nvalue = field.represent(value, row[field.tablename])
|
||||||
|
except KeyError:
|
||||||
|
nvalue = None
|
||||||
|
if isinstance(field, _repr_ref):
|
||||||
|
cache[field][value] = nvalue
|
||||||
|
return nvalue
|
||||||
|
|
||||||
def safe_int(x):
|
def safe_int(x):
|
||||||
try:
|
try:
|
||||||
@@ -2668,7 +2688,7 @@ class SQLFORM(FORM):
|
|||||||
htmltable = TABLE(COLGROUP(*cols), THEAD(head))
|
htmltable = TABLE(COLGROUP(*cols), THEAD(head))
|
||||||
tbody = TBODY()
|
tbody = TBODY()
|
||||||
numrec = 0
|
numrec = 0
|
||||||
repr_cache = {}
|
repr_cache = CacheRepresenter()
|
||||||
for row in rows:
|
for row in rows:
|
||||||
trcols = []
|
trcols = []
|
||||||
id = row[field_id]
|
id = row[field_id]
|
||||||
@@ -2688,21 +2708,7 @@ class SQLFORM(FORM):
|
|||||||
maxlength = maxtextlengths.get(str(field), maxtextlength)
|
maxlength = maxtextlengths.get(str(field), maxtextlength)
|
||||||
if field.represent:
|
if field.represent:
|
||||||
if field.type.startswith('reference'):
|
if field.type.startswith('reference'):
|
||||||
if field not in repr_cache:
|
nvalue = repr_cache(field, value, row)
|
||||||
repr_cache[field] = {}
|
|
||||||
try:
|
|
||||||
nvalue = repr_cache[field][value]
|
|
||||||
except KeyError:
|
|
||||||
try:
|
|
||||||
nvalue = field.represent(value, row)
|
|
||||||
except KeyError:
|
|
||||||
try:
|
|
||||||
nvalue = field.represent(
|
|
||||||
value, row[field.tablename])
|
|
||||||
except KeyError:
|
|
||||||
nvalue = None
|
|
||||||
if isinstance(field, _repr_ref):
|
|
||||||
repr_cache[field][value] = nvalue
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
nvalue = field.represent(value, row)
|
nvalue = field.represent(value, row)
|
||||||
|
|||||||
Reference in New Issue
Block a user