From 510f1c920cedcdddadc7b633fffe77880433ccb5 Mon Sep 17 00:00:00 2001 From: Massimo Di Pierro Date: Sat, 7 Apr 2012 18:33:44 -0500 Subject: [PATCH] SQLFORM.smartdictform --- VERSION | 2 +- gluon/sqlhtml.py | 46 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 3a57ec80..53eeb91d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.7 (2012-04-07 16:56:18) dev +Version 1.99.7 (2012-04-07 18:31:34) dev diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 3f2a4391..b67c5804 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -19,11 +19,13 @@ from html import XML, SPAN, TAG, A, DIV, CAT, UL, LI, TEXTAREA, BR, IMG, SCRIPT from html import FORM, INPUT, LABEL, OPTION, SELECT, MENU from html import TABLE, THEAD, TBODY, TR, TD, TH, STYLE from html import URL, truncate_string -from dal import DAL, Table, Row, CALLABLETYPES, smart_query +from dal import DAL, Field, Table, Row, CALLABLETYPES, smart_query from storage import Storage from utils import md5_hash -from validators import IS_EMPTY_OR, IS_NOT_EMPTY, IS_LIST_OF +from validators import IS_EMPTY_OR, IS_NOT_EMPTY, IS_LIST_OF, IS_DATE, \ + IS_DATETIME, IS_INT_IN_RANGE, IS_FLOAT_IN_RANGE +import datetime import urllib import re import cStringIO @@ -1022,7 +1024,7 @@ class SQLFORM(FORM): request_vars, session=None, formname='%(tablename)s/%(record_id)s', - keepvalues=False, + keepvalues=True, onvalidation=None, dbio=True, hideerror=False, @@ -1292,6 +1294,44 @@ class SQLFORM(FORM): self.accepted = ret return ret + AUTOTYPES = { + type(''): ('string', None), + type(True): ('boolean', None), + type(1): ('integer', IS_INT_IN_RANGE(-1e12,+1e12)), + type(1.0): ('double', IS_INT_IN_RANGE(-1e12,+1e12)), + type([]): ('list:string', None), + type(datetime.date.today()): ('date', IS_DATE()), + type(datetime.datetime.today()): ('datetime', IS_DATETIME()) + } + + @staticmethod + def dictform(dictionary,**kwargs): + fields = [] + for key,value in sorted(dictionary.items()): + t, requires = SQLFORM.AUTOTYPES.get(type(value),(None,None)) + if t: + fields.append(Field(key,t,requires=requires, + default=value)) + return SQLFORM.factory(*fields,**kwargs) + + @staticmethod + def smartdictform(session,name,filename=None,query=None,**kwargs): + import os + if not name in session: + if query: + session[name] = db(query).select().first().as_dict() + elif os.path.exists(filename): + env = {'datetime':datetime} + session[name] = eval(open(filename).read(),{},env) + form = SQLFORM.dictform(session[name]) + if form.process().accepted: + session[name].update(form.vars) + if query: + db(query).update(**form.vars) + else: + open(filename,'w').write(repr(session[name])) + return form + @staticmethod def factory(*fields, **attributes): """