def _set_default_configuration(self): defaults = {} tile_type = getUtility(ITileType, name=self.tile.__name__) fields = getFieldNamesInOrder(tile_type.schema) for name, field in getFieldsInOrder(tile_type.schema): order = unicode(fields.index(name)) # default configuration attributes for all fields defaults[name] = {'order': order, 'visibility': u'on'} if name == 'css_class': # css_class, set default defaults[name] = field.default if ITextLine.providedBy(field): # field is TextLine, we should add 'htmltag' defaults[name]['htmltag'] = u'h2' elif INamedBlobImageField.providedBy(field): # field is an image, we should add 'position' and 'imgsize' defaults[name]['position'] = u'left' defaults[name]['imgsize'] = u'mini 200:200' elif IInt.providedBy(field): defaults[name][name] = field.default elif IDatetime.providedBy(field): # field is Datetime, we should add 'format' defaults[name]['format'] = 'datetime' return defaults
def setTextField(obj, fieldname, text): text = six.text_type(text) obj_base = aq_base(obj) if getattr(obj_base, "Schema", None): # Archetypes field = obj_base.getField(fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return field.set(obj, text) else: # Dexterity field = getField(obj_base, fieldname) if field is None: logger.warn("Field %s not found for %s", fieldname, obj.getId()) return if IRichText.providedBy(field): # Get mimetype from old value. old = field.get(obj) if old is None: text = RichTextValue(text) else: text = RichTextValue(text, old.mimeType, old.outputMimeType) if ITuple.providedBy(field) and ITextLine.providedBy(field.value_type): text = tuple(text.split("\n")) setattr(field.interface(obj), field.__name__, text)
def _getTextFields(self, obj): # Get all text fields, except ones that are handled separately. text_fields = [] if getattr(aq_base(obj), 'Schema', None): # Archetypes for field in obj.Schema().values(): if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS: continue if not ITextField.providedBy(field): continue text_fields.append(field) elif HAS_DEXTERITY: # Dexterity for schemata in iterSchemata(obj): fields = getFieldsInOrder(schemata) for name, field in fields: if name in CUSTOM_HANDLED_TEXT_FIELDS: continue if IRichText.providedBy(field): text_fields.append(field) continue # ITextLine inherits from IText. # We want to replace in texts, but not textlines. # Maybe this can be made configurable. if ITextLine.providedBy(field): continue if not IText.providedBy(field): continue text_fields.append(field) return text_fields
def _set_default_configuration(self): defaults = {} tile_type = getUtility(ITileType, name=self.tile.__name__) fields = getFieldNamesInOrder(tile_type.schema) for name, field in getFieldsInOrder(tile_type.schema): order = unicode(fields.index(name)) # default configuration attributes for all fields defaults[name] = {"order": order, "visibility": u"on"} if name == "css_class": # css_class, set default defaults[name] = field.default if ITextLine.providedBy(field): # field is TextLine, we should add 'htmltag' defaults[name]["htmltag"] = u"h2" elif INamedBlobImageField.providedBy(field): # field is an image, we should add 'position' and 'imgsize' defaults[name]["position"] = u"left" defaults[name]["imgsize"] = u"mini 200:200" elif IInt.providedBy(field): defaults[name][name] = field.default elif IDatetime.providedBy(field): # field is Datetime, we should add 'format' defaults[name]["format"] = "datetime" return defaults
def htmlIDs(self): ids = [] fields = self._ce_fields.items() for name, field in fields: if ITextLine.providedBy(field) or IText.providedBy(field): ids.append('form-widgets-%s' % name) elif IRichText.providedBy(field): ids.append('form.widgets.%s' % name) # Talk about uniformity ;) return ids
def _ce_fields(self): field_dict = {} for schemata in iterSchemata(self.context): for name, field in getFieldsInOrder(schemata): if ITextLine.providedBy(field) or \ IText.providedBy(field) or \ IRichText.providedBy(field): field_dict[name] = field return field_dict
def clean_field(self, organization, fieldname, field): if ITextLine.providedBy(field): setattr(organization, fieldname, "") elif ITuple.providedBy(field): setattr(organization, fieldname, []) elif IBool.providedBy(field): setattr(organization, fieldname, False) elif IRichText.providedBy(field): richvalue = RichTextValue("", 'text/html', 'text/html') setattr(organization, fieldname, richvalue) else: logger("[Error] Field '%s' type is not recognised. " %(fieldname), "Field cannot be cleaned before sync.") return organization
def getTextFields(obj): include_textline_fields = settings().include_textline_fields include_lines_fields = settings().include_lines_fields text_fields = [] if HAS_ARCHETYPES and getattr(aq_base(obj), "Schema", None): # Archetypes for field in obj.Schema().values(): if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS: continue if include_textline_fields and IStringField.providedBy(field): text_fields.append(field) continue if ITextField.providedBy(field): text_fields.append(field) if include_lines_fields and ILinesField.providedBy(field): text_fields.append(field) elif HAS_DEXTERITY: # Dexterity for schemata in iterSchemata(obj): fields = getFieldsInOrder(schemata) for name, field in fields: if name in CUSTOM_HANDLED_TEXT_FIELDS: continue if IRichText.providedBy(field): text_fields.append(field) continue # ITextLine inherits from IText. # That we want to replace in texts, but not textlines # is by configuration. if not include_textline_fields and ITextLine.providedBy(field): continue if IText.providedBy(field): text_fields.append(field) if (include_lines_fields and ITuple.providedBy(field) and ITextLine.providedBy(field.value_type)): text_fields.append(field) return text_fields
def update(self): """ Checks if we have Modified errors and renders split view with display widgets for db values and normal for input """ super(DiffEditForm, self).update() for error in self.errors: if error.__class__ == Modified: # Set flag that form is in diff mode if not self.diff: self.diff=True if self.diff: # Set last timestamp which we store in hidden field because # document may be modified during diff and from.timestamp field # contains old value self.last_timestamp = self.context.timestamp for widget in self.widgets: try: value = widget.getInputValue() except: value = "" # Get widget's field form_field = self.form_fields.get(widget.context.__name__) field = form_field.field.bind(self.context) # Form display widget for our field if form_field.custom_widget is not None: display_widget = form_field.custom_widget( field, self.request) else: display_widget = component.getMultiAdapter( (field, self.request), IDisplayWidget) # If field is Text or TextLine we display HTML diff if IText.providedBy(field) or ITextLine.providedBy(field): if value: diff_val = textDiff(field.get(self.context), value) else: diff_val = "" display_widget = component.getMultiAdapter( (field, self.request), IDiffDisplayWidget) display_widget.setRenderedValue(diff_val) else: display_widget.setRenderedValue(field.get(self.context)) display_widget.name = widget.name + ".diff.display" # Add display - input widgets pair to list of diff widgets self.diff_widgets.append((widget, display_widget))
def update(self): """ Checks if we have Modified errors and renders split view with display widgets for db values and normal for input """ super(DiffEditForm, self).update() for error in self.errors: if error.__class__ == Modified: # Set flag that form is in diff mode if not self.diff: self.diff = True if self.diff: # Set last timestamp which we store in hidden field because # document may be modified during diff and from.timestamp field # contains old value self.last_timestamp = self.context.timestamp for widget in self.widgets: try: value = widget.getInputValue() except: value = "" # Get widget's field form_field = self.form_fields.get(widget.context.__name__) field = form_field.field.bind(self.context) # Form display widget for our field if form_field.custom_widget is not None: display_widget = form_field.custom_widget( field, self.request) else: display_widget = component.getMultiAdapter( (field, self.request), IDisplayWidget) # If field is Text or TextLine we display HTML diff if IText.providedBy(field) or ITextLine.providedBy(field): if value: diff_val = textDiff(field.get(self.context), value) else: diff_val = "" display_widget = component.getMultiAdapter( (field, self.request), IDiffDisplayWidget) display_widget.setRenderedValue(diff_val) else: display_widget.setRenderedValue(field.get(self.context)) display_widget.name = widget.name + ".diff.display" # Add display - input widgets pair to list of diff widgets self.diff_widgets.append((widget, display_widget))
def theme_options(self): data = {} for name in self.schema.names(): field = self.schema[name] if not IField.providedBy(field): continue value = getattr(self.settings, name, None) if value == None: continue name = name.replace(self.theme + '_', '', 1) if IBool.providedBy(field): data[name] = jsbool(value) elif IChoice.providedBy(field) or ITextLine.providedBy(field): data[name] = '"' + value + '"' elif IInt.providedBy(field) or IFloat.providedBy(field): data[name] = str(value) return data
def get_default_value_by_schema(self, field): type_field = " " if IRelationList.providedBy(field): type_field = [] elif "ListField" in str(field): type_field = [] self.datagrids[field.__name__] = False elif IChoice.providedBy(field): type_field = " " elif ITextLine.providedBy(field): type_field = " " elif IList.providedBy(field): type_field = [] elif IText.providedBy(field): type_field = " " elif IRichText.providedBy(field): type_field = " " else: type_field = " " return type_field
def get_fieldtype_by_schema(self, field): type_field = "" if IRelationList.providedBy(field): type_field = "relation" elif "ListField" in str(field): type_field = "datagridfield" self.datagrids[field.__name__] = False elif IChoice.providedBy(field): type_field = "choice" elif ITextLine.providedBy(field): type_field = "text" elif IList.providedBy(field): type_field = "list" elif IText.providedBy(field): type_field = "text" elif IRichText.providedBy(field): type_field = "text" else: type_field = "unknown" return type_field
def get_attribute_values(request, record, attribute_map): values = {} vocabularies = get_vocabularies(request, attribute_map) for header, field in attribute_map.items(): downloaded = download_field_from_url(field, record[header]) if downloaded is not False: values[field.__name__] = downloaded continue if IDate.providedBy(field): if not record[header]: values[field.__name__] = None else: values[field.__name__] = parse_date(record[header]) continue if IDatetime.providedBy(field): if not record[header]: values[field.__name__] = None else: values[field.__name__] = parse_datetime(record[header]) continue if IURI.providedBy(field): if not record[header].strip(): values[field.__name__] = None continue if IList.providedBy(field): if ITextLine.providedBy(field.value_type): values[field.__name__] = convert_to_list(record[header]) continue if ISet.providedBy(field): if IChoice.providedBy(field.value_type): values[field.__name__] = set(convert_to_list(record[header])) continue if IChoice.providedBy(field): if not record[header].strip(): values[field.__name__] = None else: vocabulary = vocabularies[header] if record[header].lower() not in vocabulary: raise ContentImportError( _( u'The ${name} column contains the ' u'unknown value ${value}', mapping=dict(name=header, value=record[header]) ) ) values[field.__name__] = vocabulary[record[header].lower()] continue assert IFromUnicode.providedBy(field), """ {} does not support fromUnicode """.format(field) try: values[field.__name__] = field.fromUnicode(record[header]) if isinstance(values[field.__name__], basestring): values[field.__name__] = values[field.__name__].strip() if isinstance(field, Text): values[field.__name__] = values[field.__name__].replace( '<br />', '\n' ) except ValidationError, e: raise ContentImportError(e.doc(), colname=header) except ValueError, e: raise ContentImportError(e.message, colname=header)
options = {'ignoreURLParams': True} for name, field in \ schema.getFields(IShibbolethLoginPortlet).iteritems(): if name.startswith('eds_'): value = getattr(self.data, name) if value and ITALESTextLine.providedBy(field): value = self._execute_expression(value) options[name[4:]] = value return json.dumps(options) # Customise field display length form_fields = form.Fields(IShibbolethLoginPortlet) for name, field in schema.getFields(IShibbolethLoginPortlet).iteritems(): if ITextLine.providedBy(field): form_fields[name].custom_widget = LongTextWidget # NOTE: If this portlet does not have any configurable parameters, you can # inherit from NullAddForm and remove the form_fields variable. class AddForm(base.AddForm): """Portlet add form. This is registered in configure.zcml. The form_fields variable tells zope.formlib which fields to display. The create() method actually constructs the assignment that is being added. """ form_fields = form_fields schema = IShibbolethLoginPortlet
options = {'ignoreURLParams': True} for name, field in \ schema.getFields(IShibbolethLoginPortlet).iteritems(): if name.startswith('eds_'): value = getattr(self.data, name) if value and ITALESTextLine.providedBy(field): value = self._execute_expression(value) options[name[4:]] = value return json.dumps(options) # Customise field display length form_fields = form.Fields(IShibbolethLoginPortlet) for name, field in schema.getFields(IShibbolethLoginPortlet).iteritems(): if ITextLine.providedBy(field): form_fields[name].custom_widget = LongTextWidget # NOTE: If this portlet does not have any configurable parameters, you can # inherit from NullAddForm and remove the form_fields variable. class AddForm(base.AddForm): """Portlet add form. This is registered in configure.zcml. The form_fields variable tells zope.formlib which fields to display. The create() method actually constructs the assignment that is being added. """ form_fields = form_fields def create(self, data):