From 2a245d36f4e4d43d7b2251d73811497239b21a51 Mon Sep 17 00:00:00 2001 From: Nik Klever Date: Sat, 5 Sep 2015 14:38:32 +0200 Subject: [PATCH 1/3] If in any of the form fields are unicode strings entered as input, the unicode characters in these strings are lost in self.vars. This conditions sets it back to the original input. Might be, that this should be done at another place, but it works. --- gluon/sqlhtml.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 49fe24c4..ba7bf702 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1668,6 +1668,9 @@ class SQLFORM(FORM): elif field.type == 'double': if value is not None: fields[fieldname] = safe_float(value) + elif field.type in ('string', 'text'): + if fieldname in self.request_vars: + fields[fieldname] = self.request_vars[fieldname] for fieldname in self.vars: if fieldname != 'id' and fieldname in self.table.fields\ From 65c87386c12513bbcf32674861ead171260c95ed Mon Sep 17 00:00:00 2001 From: Nik Klever Date: Sat, 5 Sep 2015 14:57:55 +0200 Subject: [PATCH 2/3] Labels should get their information from the render function of the records. --- gluon/validators.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gluon/validators.py b/gluon/validators.py index 10dc5b7f..299c49df 100644 --- a/gluon/validators.py +++ b/gluon/validators.py @@ -578,9 +578,9 @@ class IS_IN_DB(Validator): records = self.dbset(table).select(table.ALL, **dd) self.theset = [str(r[self.kfield]) for r in records] if isinstance(self.label, str): - self.labels = [self.label % r for r in records] + self.labels = [self.label % r for r in records.render()] else: - self.labels = [self.label(r) for r in records] + self.labels = [self.label(r) for r in records.render] def options(self, zero=True): self.build_set() From bc267ce17be1ee4be9b9868b7ee057dcc0d50a93 Mon Sep 17 00:00:00 2001 From: Nik Klever Date: Sat, 5 Sep 2015 15:01:02 +0200 Subject: [PATCH 3/3] Added Column- and Row-Headers to be more flexible with the headers of the spreadsheet. Added also a boolean "select" parameter for the sheet.cell function which allows to use a HTML select tag instead of an input tag for this cell. --- gluon/contrib/spreadsheet.py | 38 ++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/gluon/contrib/spreadsheet.py b/gluon/contrib/spreadsheet.py index 40663d81..3f3f9377 100644 --- a/gluon/contrib/spreadsheet.py +++ b/gluon/contrib/spreadsheet.py @@ -16,7 +16,7 @@ def quote(text): class Node: def __init__(self, name, value, url='.', readonly=False, active=True, - onchange=None, **kwarg): + onchange=None, select=False, size=4, **kwarg): self.url = url self.name = name self.value = str(value) @@ -26,11 +26,21 @@ class Node: self.readonly = readonly self.active = active self.onchange = onchange - self.size = 4 + self.size = size self.locked = False + self.select = value if select and not isinstance(value, str) else False def xml(self): - return """ @@ -391,7 +401,8 @@ class Sheet: def __init__(self, rows, cols, url='.', readonly=False, active=True, onchange=None, value=None, data=None, - headers=None, update_button="", **kwarg): + headers=None, update_button="", c_headers=None, + r_headers=None, **kwarg): """ Arguments: @@ -425,6 +436,9 @@ class Sheet: self.tr_attributes = {} self.td_attributes = {} + self.c_headers = c_headers + self.r_headers = r_headers + self.data = data self.readonly = readonly @@ -505,7 +519,7 @@ class Sheet: self.environment[name] = obj def cell(self, key, value, readonly=False, active=True, - onchange=None, **kwarg): + onchange=None, select=False, **kwarg): """ key is the name of the cell value is the initial value of the cell. It can be a formula "=1+3" @@ -528,7 +542,7 @@ class Sheet: value = value(r, c) node = Node(key, value, self.url, readonly, active, - onchange, **kwarg) + onchange, select=select, **kwarg) self.nodes[key] = node self[key] = value @@ -781,11 +795,19 @@ class Sheet: gluon.html.TH, gluon.html.BR, gluon.html.SCRIPT) regex = re.compile('r\d+c\d+') - header = TR(TH(), *[TH('c%s' % c) + if not self.c_headers: + header = TR(TH(), *[TH('c%s' % c) for c in range(self.cols)]) + else: + header = TR(TH(), *[TH('%s' % c) + for c in self.c_headers]) + rows = [] for r in range(self.rows): - tds = [TH('r%s' % r), ] + if not self.r_headers: + tds = [TH('r%s' % r), ] + else: + tds = [TH('%s' % self.r_headers[r]), ] for c in range(self.cols): key = 'r%sc%s' % (r, c) attributes = {"_class": "w2p_spreadsheet_col_%s" %