From 72e830694df534563e8b3d0f41d913cb63de15d6 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Mon, 25 Jun 2012 14:35:10 -0500 Subject: [PATCH] improved spreadsheet, issue 860, thanks Alan --- VERSION | 2 +- gluon/contrib/spreadsheet.py | 741 ++++++++++++++++++++++++++++++++--- 2 files changed, 678 insertions(+), 65 deletions(-) diff --git a/VERSION b/VERSION index 7c1c59b3..5124d553 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.0 (2012-06-25 14:31:49) dev +Version 2.00.0 (2012-06-25 14:35:08) dev diff --git a/gluon/contrib/spreadsheet.py b/gluon/contrib/spreadsheet.py index 902eea5f..09a00e34 100644 --- a/gluon/contrib/spreadsheet.py +++ b/gluon/contrib/spreadsheet.py @@ -1,43 +1,21 @@ +# -*- coding: utf-8 -*- + """ Developed by Massimo Di Pierro, optional component of web2py, GPL2 license. """ + import re import pickle import copy - +import simplejson def quote(text): return str(text).replace('\\', '\\\\').replace("'", "\\'") class Node: - """ - Example:: - - # controller - from gluon.contrib.spreadsheet import Sheet - - def callback(): - return cache.ram('sheet1', lambda: None, None).process(request) - - def index(): - sheet = cache.ram('sheet1', - lambda: Sheet(10, 10, URL(r=request, f='callback')), 0) - #sheet.cell('r0c3', value='=r0c0+r0c1+r0c2', readonly=True) - return dict(sheet=sheet) - - # view - {{extend 'layout.html'}} - {{=sheet}} - - or insert invidivual cells via - - {{=sheet.nodes['r0c0']}} - - """ - def __init__(self, name, value, url='.', readonly=False, active=True, - onchange=None): + onchange=None, **kwarg): self.url = url self.name = name self.value = str(value) @@ -49,7 +27,7 @@ class Node: self.onchange = onchange self.size = 4 self.locked = False - + def xml(self): return """", + "text", + readable=False, writable=False, + formname="")) + # submit button label + form.elements("input [type=submit]").attributes["_value"] = \ + T("Update database") + form.elements("textarea")[0].attributes["_style"] = "display: none;" + + w2p_spreadsheet_update_script = SCRIPT(''' + jQuery( + function(){ + jQuery("").submit(function(){ + jQuery("[name=]").val(JSON.stringify( + w2p_spreadsheet_data) + ); + }); + } + ); + ''') + + # retrieve changes + if form.process().accepted: + data = form.vars. + changes = Sheet.updated(data) + + # Do db I/O: + for table, rows in changes.iteritems(): + for row, values in rows.iteritems(): + db[table][row].update_record(**values) + + # the action view should expose {{=form}}, {{=sheet}}, {{=myscript}} + return dict(form=form, sheet=sheet, + myscript=w2p_spreadseet_update_script) + + Second method: Sending data updates with .ajax() + + -spreadsheet page's view: + + {{ + =INPUT(_type="button", _value="update data", + _id="w2p_spreadsheet_update_data") + }} + + {{=SCRIPT(''' + jQuery(function(){ + jQuery("#w2p_spreadsheet_update_data").click( + function(){ + jQuery.ajax({url: "%s", + type: "POST", + data: + {data: + JSON.stringify(w2p_spreadsheet_data)} + } + ); + } + ); + }); + ''' % URL(c="default", f="modified"))}} + + -controller: modified function + def modified(): + data = request.vars.data + changes = Sheet.updated(data) + # (for db I/O see first method) + return "ok" + + + Third method: + When creating a Sheet instance, pass a kwarg update_button=