GadgetField.py 4.29 KB
Newer Older
1 2 3 4
from Products.Formulator.Field import ZMIField
from Products.Formulator import Widget
from Products.Formulator.DummyField import fields
from Products.Formulator import Validator
5
from zLOG import LOG, ERROR
6
from cStringIO import StringIO
7
from json import dumps
8

9
class GadgetWidget(Widget.Widget):
10
  """
11
  A widget that displays a renderjs gadget
12
  """
13
  property_names = Widget.Widget.property_names + \
14
       ['gadget_url', 'js_sandbox', 'extra', 'renderjs_extra']
15 16

  default = Widget.TextWidget.default
17

18 19 20 21 22 23 24
  renderjs_extra = fields.ListTextAreaField('renderjs_extra',
                          title="RenderJS extra",
                                 description=(
        "More parameters passed to the renderJS's render method."),
                                 default=[],
                                 required=0)

25 26 27
  gadget_url = fields.StringField('gadget_url',
                         title='Gadget Url',
                         description=("The url of the html page containing the \
28 29 30 31
                                      gadget"),
                         default='',
                         required=0)

32 33 34 35 36
  js_sandbox = fields.StringField('js_sandbox',
                          title='Gadget Sandbox',
                          description=("Gadget sandbox"),
                          default='',
                          required=0)
37

38
  def render(self, field, key, value, REQUEST, render_prefix=None):
39
    return self.render_view(field, value, REQUEST, render_prefix, key)
40

41
  def render_view(self, field, value, REQUEST=None, render_prefix=None, key=None):
42 43 44 45
    kw = {
      'data-gadget-sandbox': field.get_value('js_sandbox'),
      'data-gadget-url': field.get_value('gadget_url'),
      'data-gadget-value': value,
46
      'data-gadget-renderjs-extra': dumps(dict(field.get_value('renderjs_extra')))
47 48 49 50
    }
    if key is not None:
      kw['data-gadget-editable'] = key
    return Widget.render_element("div", extra=field.get_value('extra'), **kw)
51

52
  def get_javascript_list(self, field, REQUEST=None):
53 54 55 56 57 58 59 60 61 62 63 64
     """
     Returns list of javascript needed by the widget
     """
     js_list = ['rsvp.js', 'renderjs.js', 'erp5_gadgetfield.js']
     result = []
     try:
       for js_file in js_list:
         result.append(field.restrictedTraverse(js_file).absolute_url())
     except KeyError:
       LOG('keyError:', ERROR, 'Error Value: %s' % js_file)
       return []
     return result
65

66 67
class GadgetFieldValidator(Validator.Validator):

68 69 70 71
    property_names = Validator.Validator.property_names + [
      'data_url',
      'validator_field_id'
    ]
72 73 74 75 76 77 78

    data_url = fields.CheckBoxField('data_url',
                                title='Data Url',
                                description=(
                                  "Checked if gadget return data url."),
                                default=0)

79 80
    validator_field_id = fields.StringField(
      'validator_field_id',
81 82
      title='Validator Field ID',
      description= "ID of the validator field.",
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
      default="",
      display_width=40,
      required=0
    )

    message_names = Validator.Validator.message_names + ['no_validator']

    no_validator = 'Does not support this operation.'

    def getValidatorField(self, field):
      """Get an external validator field located in the same form.
      """
      field_id = field.id
      validator_field_id = field.get_value('validator_field_id')
      if validator_field_id:
        if field.aq_parent.has_field(validator_field_id,
                                     include_disabled=1):
          return field.aq_parent.get_field(validator_field_id,
                                           include_disabled=1)
      return None

104
    def validate(self, field, key, REQUEST):
105 106 107 108 109 110
      validator_field = self.getValidatorField(field)
      if validator_field is None:
        # not editable if no validator
        self.raise_error('no_validator', field)
      else:
        value = validator_field._validate_helper(key, REQUEST)
111 112 113 114 115
        if value is not None:
          if field.get_value('data_url'):
            value=value.split(",")[1]
            return StringIO(value.decode('base64'))
          return value
116 117 118


GadgetWidgetInstance = GadgetWidget()
119
GadgetFieldValidatorInstance = GadgetFieldValidator()
120 121 122 123 124

class GadgetField(ZMIField):
    meta_type = "GadgetField"

    widget = GadgetWidgetInstance
125
    validator = GadgetFieldValidatorInstance