[Erp5-report] r20006 - /erp5/trunk/products/ERP5Form/OOoChart.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Mar 18 19:05:10 CET 2008


Author: nicolas
Date: Tue Mar 18 19:05:10 2008
New Revision: 20006

URL: http://svn.erp5.org?rev=20006&view=rev
Log:
Perform OOoChart:
 - Add Dynamics properties
 - Multiple Charts (Pie, Bar, Line)
 - Convertible (png, pdf, jpg, odf, gif, ...)
Works done by Thibaut Deheunynck

Modified:
    erp5/trunk/products/ERP5Form/OOoChart.py

Modified: erp5/trunk/products/ERP5Form/OOoChart.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/OOoChart.py?rev=20006&r1=20005&r2=20006&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/OOoChart.py (original)
+++ erp5/trunk/products/ERP5Form/OOoChart.py Tue Mar 18 19:05:10 2008
@@ -31,85 +31,195 @@
 from Products.Formulator.DummyField import fields
 from Products.Formulator.Field import ZMIField
 from Selection import Selection
+from Globals import get_request
+from Products.ERP5OOo.Document.OOoDocument import STANDARD_IMAGE_FORMAT_LIST
+
+from Globals import DTMLFile
+
+
 
 from zLOG import LOG
-
-# XXX This should be move to preferences - just as for image
-defaultdisplays = {'thumbnail' : (128,128),
-                   'xsmall'    : (200,200),
-                   'small'     : (320,320),
-                   'medium'    : (480,480),
-                   'large'     : (768,768),
-                   'xlarge'    : (1024,1024)
-                  }
 
 class OOoChartWidget(Widget.Widget):
   """
   This class is capabale of producing ODF
   charts based on data obtained through a
   listbox.
+  Some properties are useless
+  http://books.evc-cit.info/odbook/ch08.html#chart-plot-area-example
+    - mean-value
+    - error-margin
+    - error-upper-limit
+    - error-lower-limit
+    - error-category
+    - error-percentage
+    - chart-japanese-candle-stick and stock-with-volume,chart:stock-updown-bars. These attributs are used with a chart:stock
   """
+  
   property_names = list(Widget.Widget.property_names)
-
   # Default has no meaning in OOoChart.
   property_names.remove('default')
-
+  
   form_id = fields.StringField(
-                                'form_id',
-                                title='Form ID',
-                                description= \
-                                  "ID of the master form.",
-                                default="",
-                                required=1)
+                              'form_id',
+                              title='Form ID',
+                              description= \
+                                "ID of the master form.",
+                              default="",
+                              required=1)
   property_names.append('form_id')
 
   field_id = fields.StringField(
-                                'field_id',
-                                title='Field ID',
-                                description= \
-                                  "ID of the listbox in the master form.",
-                                default="",
-                                required=1)
+                              'field_id',
+                              title='Field ID',
+                              description= \
+                                "ID of the listbox in the master form.",
+                              default="",
+                              required=1)
   property_names.append('field_id')
 
-  image_display = fields.StringField('image_display',
-                              title='Image Display',
+  image_display = fields.ListField('image_display',
+                            title='Image Display',
+                            description=(
+          "Render size of this chart in HTML mode."),
+                            default='medium',
+                                  items=[('thumbnail','thumbnail'),
+                                        ('xsmall', 'xsmall'),
+                                        ('small', 'small'),
+                                        ('medium', 'medium'),
+                                        ('large', 'large'),
+                                        ('xlarge', 'xlarge'),
+                                        ],
+                                  size=1)
+  property_names.append('image_display')
+
+  image_format = fields.StringField('image_format',
+                            title='Image Format',
+                            description=(
+    "The format in which the chart should be converted to."),
+                            default='png',
+                            required=0)
+  property_names.append('image_format')
+
+  ooo_template = fields.StringField('ooo_template',
+                              title='OOo Template',
+                              description=('The ID of a OOo Page Template'
+                                          ' to render the ListBox'),
+                              default='ERP5Site_viewChart',
+                              required=0)
+  property_names.append('ooo_template')
+
+
+  chart_type = fields.ListField('chart_type',
+                                  title='Chart type',
+                                  description=('Type of the Chart'),
+                                  default='chart:bar',
+                                  items=[('bar', 'chart:bar'),
+                                        ('circle', 'chart:circle'),
+                                        ('line', 'chart:line'),
+                                        ],
+                                  size=0)
+  property_names.append('chart_type')
+
+
+  colour_column_list = fields.ListTextAreaField('colour_column_list',
+                              title="Data Colour",
                               description=(
-           "Render size of this chart in HTML mode."),
-                              default='large',
+    "A list of colours for each data associated to a column."),
+                              default=[],
                               required=1)
-  property_names.append('image_display')
-
-  image_format = fields.StringField('image_format',
-                              title='Image Format',
-                              description=(
-      "The format in which the chart should be converted to."),
-                              default='png',
-                              required=0)
-  property_names.append('image_format')
-
-  ooo_template = fields.StringField('ooo_template',
-                                title='OOo Template',
-                                description=('The ID of a OOo Page Template'
-                                            ' to render the ListBox'),
-                                default='',
+  property_names.append('colour_column_list')
+
+  # vertical ="true"
+  chart_position = fields.ListField('chart_position',
+                                   title='Bar(s) Position',
+                                   description=('Render the bar in horizontal position or vertical position'),
+                                   default='true',
+                                   items=[('horizontal', 'true'),
+                                          ('vertical', 'false'),
+                                          ],
+                                   size=0)
+  property_names.append('chart_position')
+  
+  #legend of the chart or not
+  chart_legend = fields.CheckBoxField('chart_legend',
+                                         title='Chart Legend',
+                                         description=('Show Chart Legend or no'),
+                                         default=1,
+                                         required=0)
+  property_names.append('chart_legend')
+  
+  
+  position_legend = fields.ListField('position_legend',
+                                       title='Position Legend',
+                                       description=('Legend Position according to the graph'),
+                                       default='end',
+                                       items=[('bottom', 'bottom'),
+                                              ('end', 'end'),
+                                              ('start', 'start'),
+                                              ('top', 'top'),
+                                              ],
+                                       size=1)
+  property_names.append('position_legend')
+
+  #legend of the chart or not
+  chart_title_or_no = fields.CheckBoxField('chart_title_or_no',
+                                         title='Title Graph',
+                                         description=('Show Title on Graph or no '),
+                                         default=1,
+                                         required=0)
+  property_names.append('chart_title_or_no')
+  
+  #grid or not
+  grid_graph = fields.CheckBoxField('grid_graph',
+                                         title=' grid graph',
+                                         description=('Show Grid or no'),
+                                         default=1,
+                                         required=0)
+  property_names.append('grid_graph')
+  
+  
+  grid_size = fields.ListField('grid_size',
+                                   title='Grid Size',
+                                   description=('Render a big grid size or a small grid size'),
+                                   default='major',
+                                   items=[('major', 'major'),
+                                          ('minor', 'minor'),
+                                          ],
+                                   size=0)
+  property_names.append('grid_size')
+  
+  
+  user_data_title = fields.StringField('user_data_title',
+                                title="User Column ID For X-axis",
+                                description=(
+      "Column ID choose by user to define the X-axes."),
                                 required=0)
-  property_names.append('ooo_template')
-
-  colour_column_list = fields.ListTextAreaField('colour_column_list',
-                                title="Data Colour",
+  property_names.append('user_data_title')
+
+  user_column_id_list = fields.ListTextAreaField('user_column_id_list',
+                                title="User Column ID List",
                                 description=(
-      "A list of colours for each data associated to a column."),
+      "A list of columns ID choose by user to draw the graph."),
                                 default=[],
-                                required=1)
-  property_names.append('colour_column_list')
-
-  chart_japanese_candle_stick = fields.CheckBoxField('chart_japanese_candle_stick',
-                              title='Japanese Candle Stick',
-                              description=('XXX Unknown'),
+                                required=0)
+  property_names.append('user_column_id_list')
+
+
+  chart_stacked = fields.CheckBoxField('chart_stacked',
+                              title='stacked bars ',
+                              description=('stacked bars or not'),
                               default=0,
                               required=0)
-  property_names.append('chart_japanese_candle_stick')
+  property_names.append('chart_stacked')
+
+  #connect-bars="false"
+  connect_bars = fields.CheckBoxField('connect_bars',
+                                      title='Connect Bars',
+                                      description=(''),
+                                      default=0,
+                                      required=0)
+  property_names.append('connect_bars')
 
 
   chart_three_dimensional = fields.CheckBoxField('chart_three_dimensional',
@@ -119,82 +229,112 @@
                               required=0)
   property_names.append('chart_three_dimensional')
 
-  chart_mean_value = fields.CheckBoxField('chart_mean_value',
-                              title='Chart Mean Value',
-                              description=('XXX Unknown'),
+  #deep="false"
+  deep = fields.CheckBoxField('deep',
+                              title='Deep',
+                              description=('Deep'),
                               default=0,
                               required=0)
-  property_names.append('chart_mean_value')
-
-
-#"""
-#chart:japanese-candle-stick="false" chart:stock-with-volume="false" chart:three-dimensional="false" chart:deep="false" chart:lines="false" chart:interpolation="none" chart:symbol-type="none" chart:vertical="true" chart:lines-used="0" chart:connect-bars="false" chart:series-source="columns" chart:mean-value="false" chart:error-margin="0" chart:error-lower-limit="0" chart:error-upper-limit="0" chart:error-category="none" chart:error-percentage="0" chart:regression-type="none" chart:data-label-number="none" chart:data-label-text="false" chart:data-label-symbol="false"/>
-#"""
-
-  default = fields.TextAreaField('default',
-                                title='Default',
-                                description=(
-      "Default value of the text in the widget."),
-                                default="",
-                                width=20, height=3,
-                                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_style = fields.StringField('chart_style',
-                              title='Chart Style',
-                              description=('The kind of Chart we want'),
-                              default='bar_3d',
-                              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)
-
-  default_params = fields.ListTextAreaField('default_params',
-                              title="Default Parameters",
-                              description=(
-      "Default Parameters for the List Method."),
-                              default=[],
-                              required=0)
-
-  bg_transparent = fields.CheckBoxField('bg_transparent',
-                              title='Transparent Background',
-                              description=('Allows to set the background transparent'),
-                              default='',
-                              required=0)
+  property_names.append('deep')
+  
+  # sector_pie_offset Default:0
+  sector_pie_offset = fields.IntegerField('sector_pie_offset',
+                                        title='Sector Pie Offset',
+                                        description=(''),
+                                        default=0,
+                                        required=0)
+  property_names.append('sector_pie_offset')
+  
+
+
+  #interpolation="none", cubic-spline, b-spline
+  interpolation = fields.ListField('interpolation',
+                                   title='Interpolation',
+                                   description=(''),
+                                   default='none',
+                                   items=[('none', 'none'),
+                                          ('cubic-spline', 'cubic-spline'),
+                                          ('b-spline', 'b-spline')],
+                                   size=1)
+  property_names.append('interpolation')
+
+  #symbol-type="none", automatic
+  symbol_type = fields.ListField('symbol_type',
+                                 title='Symbol Type',
+                                 description=(''),
+                                 default='none',
+                                 items=[('none', 'none'),
+                                        ('automatic', 'automatic'),],
+                                 size=1)
+  property_names.append('symbol_type')
+
+  #lines-used="0" 
+  lines_used = fields.ListField('lines_used',
+                                title='Lines Used',
+                                description=(''),
+                                default='0',
+                                items=[('0', '0'),
+                                       ('1', '1')],
+                                size=1)
+  property_names.append('lines_used')
+
+  
+  #series-source=columns or rows
+  series_source = fields.ListField('series_source',
+                                   title='Series Source',
+                                   description=(''),
+                                   default='columns',
+                                   items=[('columns', 'columns'),
+                                          ('rows', 'rows'),],
+                                   size=1)
+  property_names.append('series_source')
+
+  #regression-type="none" linear logarithmic exponential power
+  regression_type = fields.ListField('regression_type',
+                                     title='Regression Type',
+                                     description=(''),
+                                     default='none',
+                                     items=[('none', 'none'),
+                                            ('linear', 'linear'),
+                                            ('logarithmic', 'logarithmic'),
+                                            ('exponential', 'exponential'),
+                                            ('power', 'power')],
+                                     size=1)
+  property_names.append('regression_type')
+
+  #data-label-number="none" value percentage
+  data_label_number = fields.ListField('data_label_number',
+                                       title='Data-Label-Number',
+                                       description=(''),
+                                       default='none',
+                                       items=[('none', 'none'),
+                                              ('value', 'value'),
+                                              ('percentage', 'percentage')],
+                                       size=1)
+  property_names.append('data_label_number')
+
+  #data-label-text="false"
+  data_label_text = fields.CheckBoxField('data_label_text',
+                                         title='Data Label Text',
+                                         description=(''),
+                                         default=0,
+                                         required=0)
+  property_names.append('data_label_text')
+
+  #data-label-symbol="false"
+  data_label_symbol = fields.CheckBoxField('data_label_symbol',
+                                           title='Data Label Symbol',
+                                           description=(''),
+                                           default=0,
+                                           required=0)
+  property_names.append('data_label_symbol')
 
   def render_view(self, field, value, REQUEST=None, render_format='html'):
     """
       Render a Chart in read-only.
     """
     if REQUEST is None: REQUEST=get_request()
-    return self.render(field, key, value, REQUEST, render_format=render_format)
+    return self.render(field, key,  value, REQUEST, render_format=render_format)
 
   def render(self, field, key, value, REQUEST, render_format='html'):
 
@@ -211,58 +351,127 @@
                          render the chart using that format.
     """
     title = field.get_value('title')
-
-    # Update the render format based on REQUEST parameters
-    render_format = getattr(REQUEST, 'render_format', render_format)
-    if render_format == 'html':
-      css_class = field.get_value('css_class')
-      format = field.get_value('image_format')
-      display = field.get_value('image_display')
-      alternate_name = field.get_value('alternate_name')
-      main_content = """\
-<div class="OOoChartContent">
-  <img class="%s" src="%s?render_format=%s&display=%s" title="%s" alt="%s"/">
-</div>""" % (css_class, field.absolute_url(), format, display, title, alternate_name)
-      return main_content
+    alternate_name = field.get_value('alternate_name')
 
     # Find the applicable context
     form = field.aq_parent
     here = getattr(form, 'aq_parent', REQUEST)
 
+    # Update the render format based on REQUEST parameters
+    render_format = getattr(REQUEST, 'render_format', render_format)
+
+    UrlIconOOo='%s/misc_/ERP5OOo/OOo.png' % here.ERP5Site_getAbsoluteUrl()
+    UrlIconPdf='%s/misc_/ERP5Form/PDF.png' % here.ERP5Site_getAbsoluteUrl()
+
+    if render_format == 'html' :
+      css_class = field.get_value('css_class')
+      format = field.get_value('image_format')
+      if format == '':
+        format='png'
+      display = field.get_value('image_display')
+      if format in STANDARD_IMAGE_FORMAT_LIST:
+        main_content = '''<div class="OOoChartContent">
+          <img class="%s" src="%s?render_format=%s&display=%s" title="%s" alt="%s"/">
+          </div>''' % (css_class, field.absolute_url(), format, display, title, alternate_name)
+        return main_content
+
+      if format == 'raw':
+        main_content = '''<div class="OOoChartContent">
+          <a href="%s?render_format=&display=%s"><img src="%s" alt="OOo"/></a></div>
+          ''' % (field.absolute_url(), display, UrlIconOOo)
+        return main_content
+      if format == 'pdf':
+        main_content = '''<div class="OOoChartContent">
+          <a href="%s?render_format=pdf&display=%s"><img src="%s" alt="PDF" /></a>
+          </div>''' % (field.absolute_url(), display, UrlIconPdf)
+        return main_content
+
+    # Find the applicable context
+    form = field.aq_parent
+    here = getattr(form, 'aq_parent', REQUEST)
+
     def stringBoolean(value):
       return str(bool(value)).lower()
 
     # Build the parameters
     extra_argument_dict = dict(
+      chart_form_id = field.get_value('form_id'),
+      chart_field_id = field.get_value('field_id'),
       chart_title = field.get_value('title'),
+      chart_type = field.get_value('chart_type'),
       colour_column_dict = dict(field.get_value('colour_column_list')),
+      user_column_id_dict = dict(field.get_value('user_column_id_list')),
+      user_data_title= field.get_value('user_data_title'),
+      chart_position = field.get_value('chart_position'),
+      chart_legend = stringBoolean(field.get_value('chart_legend')),
+      chart_title_or_no = stringBoolean(field.get_value('chart_title_or_no')),
+      grid_graph = stringBoolean(field.get_value('grid_graph')),
+      grid_size=field.get_value('grid_size'),
       chart_three_dimensional = stringBoolean(field.get_value('chart_three_dimensional')),
       chart_japanese_candle_stick = stringBoolean(field.get_value('chart_japanese_candle_stick')),
+      deep = stringBoolean(field.get_value('deep')),
+      chart_percentage = stringBoolean(field.get_value('chart_percentage')),
+      chart_stacked = stringBoolean(field.get_value('chart_stacked')),
+      sector_pie_offset = field.get_value('sector_pie_offset'),
+      interpolation = field.get_value('interpolation'),
+      symbol_type = field.get_value('symbol_type'),
+      lines_used = field.get_value('lines_used'),
+      connect_bars = stringBoolean(field.get_value('connect_bars')),
+      series_source = field.get_value('series_source'),
+      stock_with_volume =stringBoolean(field.get_value('stock_with_volume')),
+      mean_value = stringBoolean(field.get_value('mean_value')),
+      error_margin = field.get_value('error_margin'),
+      error_lower_limit = field.get_value('error_lower_limit'),
+      error_upper_limit = field.get_value('error_upper_limit'),
+      error_category = field.get_value('error_category'),
+      error_percentage = field.get_value('error_percentage'),
+      regression_type = field.get_value('regression_type'),
+      data_label_number = field.get_value('data_label_number'),
+      data_label_text = stringBoolean(field.get_value('data_label_text')),
+      data_label_symbol = stringBoolean(field.get_value('data_label_symbol')),
+      position_legend=field.get_value('position_legend'),
     )
-    LOG('extra_argument_dict', 0, repr(extra_argument_dict))
+
     for k, v in extra_argument_dict.items():
       if REQUEST.get(k) is None:
         REQUEST.form[k] = v
 
+
+
+    method_id = field.get_value('ooo_template')
     # Find the page template
-    method_id = field.get_value('ooo_template')
     ooo_template = getattr(here, method_id)
 
     # Render the chart
-    if render_format == 'raw':
-      return ooo_template()
     return ooo_template(format=render_format)
 
+
+
+
+class OOoChartValidator(Validator.Validator):
+  """
+  """
+  property_names = ['enabled']
+
+  enabled = fields.CheckBoxField('enabled',
+                                 title="Enabled",
+                                 description=(
+"""If a field is not enabled, it will considered to be not
+in the form during rendering or validation. Be careful
+when you change this state dynamically (in the TALES tab):
+a user could submit a field that since got disabled, or
+get a validation error as a field suddenly got enabled that
+wasn't there when the form was drawn."""),
+                                  default=1)
+
+  def validate(self, field, key, REQUEST):
+    return {}
+
+
 OOoChartWidgetInstance = OOoChartWidget()
-
-class OOoChartValidator(Validator.Validator):
-  property_names = Validator.Validator.property_names
-
-  def validate(self, field, key, REQUEST):
-    result = {}
-    return result
-
 OOoChartValidatorInstance = OOoChartValidator()
+
+
 
 class OOoChart(ZMIField):
     meta_type = "OOoChart"




More information about the Erp5-report mailing list