GadgetField.py 2.79 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 8 9

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

15 16 17
  gadget_url = fields.StringField('gadget_url',
                         title='Gadget Url',
                         description=("The url of the html page containing the \
18 19 20 21
                                      gadget"),
                         default='',
                         required=0)

22 23 24 25 26
  js_sandbox = fields.StringField('js_sandbox',
                          title='Gadget Sandbox',
                          description=("Gadget sandbox"),
                          default='',
                          required=0)
27

28 29
  def render(self, field, key, value, REQUEST, render_prefix=None):
      return self.render_view(field, value, REQUEST, render_prefix, key)
30

31
  def render_view(self, field, value, REQUEST=None, render_prefix=None, key=None):
32 33 34 35 36 37 38 39 40
    kw = {
      'data-gadget-sandbox': field.get_value('js_sandbox'),
      'data-gadget-scope': field.id,
      'data-gadget-url': field.get_value('gadget_url'),
      'data-gadget-value': value,
    }
    if key is not None:
      kw['data-gadget-editable'] = key
    return Widget.render_element("div", extra=field.get_value('extra'), **kw)
41

42
  def get_javascript_list(self, field, REQUEST=None):
43 44 45 46 47 48 49 50 51 52 53 54
     """
     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
55

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
class GadgetFieldValidator(Validator.Validator):

    property_names = Validator.Validator.property_names + ['data_url']

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

    def validate(self, field, key, REQUEST):
        value = REQUEST.get(key, None)
        if value is not None:
          if field.get_value('data_url'):
            value=value.split(",")[1]
            return StringIO(value.decode('base64'))
          return value
73 74 75


GadgetWidgetInstance = GadgetWidget()
76
GadgetFieldValidatorInstance = GadgetFieldValidator()
77 78 79 80 81

class GadgetField(ZMIField):
    meta_type = "GadgetField"

    widget = GadgetWidgetInstance
82
    validator = GadgetFieldValidatorInstance