From 3c753ff30880aa4da06c705904d8bddb9a365a53 Mon Sep 17 00:00:00 2001 From: Jean-Paul Smets <jp@nexedi.com> Date: Tue, 7 Mar 2006 23:51:13 +0000 Subject: [PATCH] Initial upload of draft ZPyChart field git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@6030 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Form/ZPyChart.py | 179 +++++++++++++++++++++++++++++++++++ product/ERP5Form/__init__.py | 3 + 2 files changed, 182 insertions(+) create mode 100755 product/ERP5Form/ZPyChart.py diff --git a/product/ERP5Form/ZPyChart.py b/product/ERP5Form/ZPyChart.py new file mode 100755 index 0000000000..680f8dbc60 --- /dev/null +++ b/product/ERP5Form/ZPyChart.py @@ -0,0 +1,179 @@ +############################################################################## +# +# Copyright (c) 2003 Nexedi SARL and Contributors. All Rights Reserved. +# Sebastien Robin <seb@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from Products.Formulator import Widget +from Products.Formulator import Widget, Validator +from Products.Formulator.DummyField import fields +from Products.Formulator.Field import ZMIField +from Selection import Selection + +from Products.PythonScripts.PythonScript import PythonScript +import pychart + +from zLOG import LOG + +class ZPyChartWidget(Widget.Widget): + """ + A widget to generate pychart charts in multiple formats + + Chart definition is defined in a script. Some parameters + are defined through Web UI. Web UI parameters are intended + to be specialised through Proxy fields. + """ + property_names = Widget.Widget.property_names+\ + [ 'selection_name', + 'data_method', + 'chart_title', + 'x_title', + 'y_title',] + + default = fields.StringField('default', + title='Default', + description=( + "Default value of the text in the widget."), + default="", + required=0) + + selection_name = fields.StringField('selection_name', + title='Selection Name', + description=('The name of the selection to store' + 'params of selection'), + default='', + required=0) + + data_method = fields.StringField('data_method', + title='Data Method', + description=('The method wich returns data'), + default='', + required=0) + + chart_title = fields.StringField('chart_title', + title='Chart Title', + description=('The Title on the top of the chart'), + default='', + required=0) + + x_title = fields.StringField('x_title', + title='X Title', + description=('The Title for the X axis'), + default='', + required=0) + + y_title = fields.StringField('y_title', + title='Y Title', + description=('The Title for the Y axis'), + default='', + required=0) + + def render(self, field, key, value, REQUEST): + """ + Here, we just generate tags which will later call download + """ + # Get standard parameters + selection_name = field.get_value('selection_name') + chart_title = field.get_value('chart_title') + data_method = field.get_value('data_method') + x_title = field.get_value('x_title') + y_title = field.get_value('y_title') + + # Retrieve the data and set the selection if data_method is not None + if data_method: + if hasattr(here, data_method): + data_method = getattr(here,data_method) + # Retrieve selection + here = REQUEST.get('here', self) + selection = here.portal_selections.getSelectionFor(selection_name, REQUEST=REQUEST) + # Define the new selection data_method + selection.edit(method_id = data_method) # XXX This is probably wrong + + # Return an image field + return """<img src="%s/download?selection_name=%s&chart_title=%s&data_method=%s&x_title=%s&y_title=%s"/>""" % (self.absolute_url(), selection_name, chart_title, data_method, x_title, y_title) + +ZPyChartWidgetInstance = ZPyChartWidget() + +class ZPyChartValidator(Validator.Validator): + property_names = Validator.Validator.property_names + + def validate(self, field, key, REQUEST): + result = {} + return result + +ZPyChartValidatorInstance = ZPyChartValidator() + +class ZPyChart(ZMIField, PythonScript): + """ + A hybrid between a field and a script + + TODO: + - implement XML I/O of script + - make tabs nicer + """ + + meta_type = "ZPyChart" + + manage_options = ZMIField.manage_options + PythonScript.manage_options + + widget = ZPyChartWidgetInstance + validator = ZPyChartValidatorInstance + + def __init__(self, id, **kw): + ZMIField.__init__(self, id, **kw) + PythonScript.__init__(self, id) + + def download(self, selection_name=None, data_method=None, **kw): + """ + This is where we actually render the chart. The main interest + of doing like this is to accelerate initial rendering + + TODO: + - add minimal security here + - implement all pychart options (PNG, PS, SVG, etc.) + - implement all standard parameters + """ + # Get the applicable selection + selection = self.portal_selections.getSelectionFor(selection_name, REQUEST=REQUEST) + + # If selection is None, create a new one + if selection is None: + selection = Selection() + + # Get the data method if defined + if data_method is not None: + data_method = getattr(here, data_method, None) + + # This is the default data, this is just in the case there is not method given + if data_method is None: + data = selection() + else: + data = selection(data_method=data_method) + + # Now call the script - XXX implement bindings properly here + output = self._exec(here=self, pychart=pychart, data=data) + + # And return result + return output diff --git a/product/ERP5Form/__init__.py b/product/ERP5Form/__init__.py index d892e18b18..e298eb02f7 100755 --- a/product/ERP5Form/__init__.py +++ b/product/ERP5Form/__init__.py @@ -44,6 +44,7 @@ import Form, FSForm, ListBox, MatrixBox, SelectionTool import ZGDChart, PDFTemplate, Report, PDFForm, ParallelListField import PlanningBox, POSBox, FormBox, EditorField, ProxyField import RelationField, ImageField, MultiRelationField +import ZPyChart import PreferenceTool from Products.Formulator.FieldRegistry import FieldRegistry @@ -80,6 +81,8 @@ def initialize( context ): content_classes = content_classes) # Initialise ERP5Form Formulator + FieldRegistry.registerField(ZPyChart.ZPyChart, + 'www/StringField.gif') FieldRegistry.registerField(ProxyField.ProxyField, 'www/StringField.gif') FieldRegistry.registerField(EditorField.EditorField, -- 2.30.9