def render(self, field, key, value, REQUEST): rendered_items = self.render_items(field, key, value, REQUEST) extra=field.get_value('extra') kw = {'name': key, 'css_class': field.get_value('css_class'), 'size': field.get_value('size'), 'contents': string.join(rendered_items, "\n"), 'extra': extra} if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) return render_element('select', **kw)
def render_hidden(self, field, key, value, REQUEST): """Renders this widget as a hidden field. """ try: extra = field.get_value('extra') except KeyError: # In case extra is not defined as in DateTimeWidget extra = '' kw = {'type': "hidden", 'name': key, 'value': value, 'extra': extra} if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) return render_element("input", **kw)
def generate_field_html_id(self, key=None, validation=0): """Generate the html id used to render the field in the form. The id is generated as follows: the `key` param is prefixed with the name of the form the field is in and then sanitized to be an xml id addressable by css (i.e. [._ :] converted to '-' Note that if a field's "extra" parameter has an ID attribute in it, the value of the ID attribute is used rather than the generated one described above. This is for backward compatibility. The `key` param is useful for subfields (e.g. DateTime). The DateTimeWidget's render function needs to compute the subfield_key, and pass it into this function, since the subfield does not know what field it is a part of. Widgets can add this as the 'ID' attribute of rendered elements. The presentation layer can use this id in <label> tags, however using the 'html_id' property is preferred.""" #if the 'extra' parameter has an ID attribute in it, use the value # of the ID if self.has_value('extra'): res = id_value_re.search(self.get_value('extra')) if res: return res.group(1) #generate the key if one wasn't passed in if not key: key = self.generate_field_key(validation) #if the field is acquisition wrapped, has a Form as a parent # and the form's `name` attribute != the default of 'form', # prefix it to the id, to add 'uniqueness'. #NOTE: subfields of datetime are not acquisition wrapped, # so this does not work for them. name = None if hasattr(self,'aq_parent'): #name is an attribute of Formulator.Form, but not all # formulator fields have Forms as parents. An example # is a SilvaMetadata element. Fields of metadata elements # have a field_record = metadata name, which is part of the # key parent = self.aq_parent #in case a form is not acquisition wrapped # (e.g. like in the tests) if hasattr(parent, 'aq_explicit'): name = getattr(parent.aq_explicit,'name',None) else: name = getattr(parent, 'name', None) if name is not None and name != 'form': key = '%s%s'%(name,key) return key_to_id_re.sub('-',key)
def render_items(self, field, key, value, REQUEST): # get items items = field.get_value('items') # check if we want to select first item if not value and field.get_value('first_item') and len(items) > 0: if is_sequence(items[0]): text, value = items[0] else: value = items[0] css_class = field.get_value('css_class') extra_item = field.get_value('extra_item') field_html_id = None if not extra_item or not id_value_re.search(extra_item): field_html_id = field.generate_field_html_id(key) # if we run into multiple items with same value, we select the # first one only (for now, may be able to fix this better later) selected_found = 0 rendered_items = [] index = 0 for item in items: index += 1 if is_sequence(item): item_text, item_value = item else: item_text = item item_value = item item_id = field_html_id and field_html_id + str(index) or None if item_value == value and not selected_found: rendered_item = self.render_selected_item(item_text, item_value, key, css_class, extra_item, item_id) selected_found = 1 else: rendered_item = self.render_item(item_text, item_value, key, css_class, extra_item, item_id) rendered_items.append(rendered_item) return rendered_items
def render(self, field, key, value, REQUEST): rendered_items = self.render_items(field, key, value, REQUEST) extra = field.get_value('extra') kw = { 'name': key, 'css_class': field.get_value('css_class'), 'size': field.get_value('size'), 'contents': string.join(rendered_items, "\n"), 'extra': extra } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) return render_element('select', **kw)
def render(self, field, key, value, REQUEST): width = field.get_value('width') height = field.get_value('height') extra=field.get_value('extra') css_class = field.get_value('css_class') kw = {'name': key, 'css_class': css_class, 'cols': width, 'rows': height, 'contents': cgi.escape(value)} if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) contents = render_element("textarea", **kw) return render_element("div", contents=contents, css_class=css_class)
def render(self, field, key, value, REQUEST): """Render checkbox. """ extra = field.get_value('extra') kw = {'type': "checkbox", 'name': key, 'css_class': field.get_value('css_class'), 'extra': extra } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) if value: kw['checked']=None return render_element("input", **kw)
def render(self, field, key, value, REQUEST): """Render checkbox. """ extra = field.get_value('extra') kw = { 'type': "checkbox", 'name': key, 'css_class': field.get_value('css_class'), 'extra': extra } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) if value: kw['checked'] = None return render_element("input", **kw)
def render_hidden(self, field, key, value, REQUEST): """Renders this widget as a hidden field. """ try: extra = field.get_value('extra') except KeyError: # In case extra is not defined as in DateTimeWidget extra = '' kw = {'type': "hidden", 'name': key, 'value': value, 'extra': extra } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) return render_element("input", **kw)
def render(self, field, key, value, REQUEST): width = field.get_value('width') height = field.get_value('height') extra = field.get_value('extra') css_class = field.get_value('css_class') kw = { 'name': key, 'css_class': css_class, 'cols': width, 'rows': height, 'contents': cgi.escape(value) } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) contents = render_element("textarea", **kw) return render_element("div", contents=contents, css_class=css_class)
def render_items(self, field, key, value, REQUEST): # get items items = field.get_value('items') # check if we want to select first item if not value and field.get_value('first_item') and len(items) > 0: if is_sequence(items[0]): text, value = items[0] else: value = items[0] css_class = field.get_value('css_class') extra_item = field.get_value('extra_item') field_html_id = None if not extra_item or not id_value_re.search(extra_item): field_html_id = field.generate_field_html_id(key) # if we run into multiple items with same value, we select the # first one only (for now, may be able to fix this better later) selected_found = 0 rendered_items = [] index = 0 for item in items: index += 1 if is_sequence(item): item_text, item_value = item else: item_text = item item_value = item item_id = field_html_id and field_html_id + str(index) or None if item_value == value and not selected_found: rendered_item = self.render_selected_item( item_text, item_value, key, css_class, extra_item, item_id) selected_found = 1 else: rendered_item = self.render_item(item_text, item_value, key, css_class, extra_item, item_id) rendered_items.append(rendered_item) return rendered_items
def render(self, field, key, value, REQUEST): """Render text input field. """ extra=field.get_value('extra') kw = {'type': "file", 'name': key, 'css_class': field.get_value('css_class'), 'value': value, 'size': field.get_value('display_width'), 'extra': extra} if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) display_maxwidth = field.get_value('display_maxwidth') or 0 if display_maxwidth > 0: kw['maxlength'] = display_maxwidth return render_element("input", **kw)
def render(self, field, key, value, REQUEST): """Render text input field. """ extra = field.get_value('extra') kw = { 'type': "file", 'name': key, 'css_class': field.get_value('css_class'), 'value': value, 'size': field.get_value('display_width'), 'extra': extra } if not extra or not id_value_re.search(extra): kw['id'] = field.generate_field_html_id(key) display_maxwidth = field.get_value('display_maxwidth') or 0 if display_maxwidth > 0: kw['maxlength'] = display_maxwidth return render_element("input", **kw)