def updateWidgets(self): self.label = self.request.get('form.widgets.config') config = _load_config(self.request.get('form.widgets.config')) section = None for section_id in config.keys(): tmp = config[section_id] if tmp.get('blueprint', '') in SOURCE_SECTIONS: section = tmp break if not section: raise Exception("Source section not found.") # Omit some fields depending on the selected source if section['blueprint'] == 'collective.jsonmigrator.catalogsource': self.fields = self.fields.omit('remote_path', 'remote_crawl_depth', 'remote_skip_path') elif section['blueprint'] == 'collective.jsonmigrator.remotesource': self.fields = self.fields.omit('catalog_path', 'catalog_query') # Fill in default values from the transmogrifier config file for option, value in section.items(): field = self.fields.get(option.replace('-', '_')) if field: field = field.field value = value.decode('utf8') if IFromUnicode.providedBy(field): field.default = field.fromUnicode(value) elif IList.providedBy(field): field.default = [ field.value_type.fromUnicode(v) for v in value.split() ] super(JSONMigratorRun, self).updateWidgets() self.widgets['config'].mode = interfaces.HIDDEN_MODE
def migrate_saved_data(ploneformgen, easyform): for data_adapter in ploneformgen.objectValues('FormSaveDataAdapter'): actions = get_actions(easyform) action = actions.get(data_adapter.getId()) schema = get_schema(easyform) if ISaveData.providedBy(action): cols = data_adapter.getColumnNames() for idx, row in enumerate(data_adapter.getSavedFormInput()): if len(row) != len(cols): logger.warning( 'Number of columns does not match. Skipping row %s in ' 'data adapter %s/%s', idx, '/'.join(easyform.getPhysicalPath()), data_adapter.getId()) continue data = {} for key, value in zip(cols, row): field = schema.get(key) value = value.decode('utf8') if IFromUnicode.providedBy(field): value = field.fromUnicode(value) elif IDatetime.providedBy(field) and value: value = DateTime(value).asdatetime() elif IDate.providedBy(field) and value: value = DateTime(value).asdatetime().date() elif ISet.providedBy(field): try: value = set(literal_eval(value)) except ValueError: pass elif INamedBlobFileField.providedBy(field): value = None data[key] = value action.addDataRow(data)
def updateWidgets(self): config = _load_config(self.request.get("form.widgets.config")) section = None for section_id in config.keys(): tmp = config[section_id] if tmp.get("blueprint", "") in SOURCE_SECTIONS: section = tmp break if not section: raise Exception("Source section not found.") # Omit some fields depending on the selected source if section["blueprint"] == "collective.jsonmigrator.catalogsource": self.fields = self.fields.omit("remote_path", "remote_crawl_depth", "remote_skip_path") elif section["blueprint"] == "collective.jsonmigrator.remotesource": self.fields = self.fields.omit("catalog_path", "catalog_query") # Fill in default values from the transmogrifier config file for option, value in section.items(): field = self.fields.get(option.replace("-", "_")) if field: field = field.field value = value.decode("utf8") if IFromUnicode.providedBy(field): field.default = field.fromUnicode(value) elif IList.providedBy(field): field.default = [field.value_type.fromUnicode(v) for v in value.split()] super(JSONMigratorRun, self).updateWidgets() self.widgets["config"].mode = interfaces.HIDDEN_MODE
def test_unicode(self): field = IContent2['rich'] self.assertTrue(IFromUnicode.providedBy(field)) value = field.from_string("A plain text string") self.assertEqual(value.mimeType, 'text/plain') self.assertEqual(value.outputMimeType, 'text/x-uppercase') self.assertEqual(value.raw, 'A plain text string') self.assertEqual(value.raw_encoded, b'A plain text string')
def test_unicode(self): field = IContent2['rich'] self.assertTrue(IFromUnicode.providedBy(field)) value = field.from_string("A plain text string") self.assertEqual(value.mimeType, 'text/plain') self.assertEqual(value.outputMimeType, 'text/x-uppercase') self.assertEqual(value.raw, 'A plain text string') self.assertEqual(value.raw_encoded, b'A plain text string')
def from_unicode(self, field, value): # XXX: Bool incorrectly omits to declare that it implements # IFromUnicode, even though it does. import zope.schema if IFromUnicode.providedBy(field) or isinstance(field, zope.schema.Bool): return field.fromUnicode(value) else: return self.field_typecast(field, value)
def __init__(self, field, widget): super().__init__(field, widget) if not IFromUnicode.providedBy(field): field_name = '' if field.__name__: field_name = '``%s`` ' % field.__name__ raise TypeError( 'Field %s of type ``%s`` must provide ``IFromUnicode``.' % (field_name, type(field).__name__))
def _toFieldValue(self, input): if self.convert_missing_value and input == self._missing: value = self.context.missing_value else: assert IFromUnicode.providedBy(self.context) try: value = self.context.fromUnicode(input) except ValueError, v: raise ConversionError(_("Invalid link"), v)
def _toFieldValue(self, input): if self.convert_missing_value and input == self._missing: value = self.context.missing_value else: assert IFromUnicode.providedBy(self.context) try: value = self.context.fromUnicode(input) except ValueError, v: raise ConversionError(_("Invalid link"), v)
def from_unicode(self, field, value): import zope.schema if IFromUnicode.providedBy(field) or \ isinstance(field, zope.schema.Bool): if type(field) == zope.schema.Int and len(value) == 0: return None try: return field.fromUnicode(value) except ConstraintNotSatisfied: if type(field) == Choice and \ ISource.providedBy(field.source): if value in self._already_raised: return value else: self._already_raised.append(value) raise MissingObjectException(value) raise else: return self.field_typecast(field, value)
def from_unicode(self, field, value): import zope.schema if IFromUnicode.providedBy(field) or \ isinstance(field, zope.schema.Bool): if type(field) == zope.schema.Int and len(value) == 0: return None try: return field.fromUnicode(value) except ConstraintNotSatisfied: if type(field) == Choice and \ ISource.providedBy(field.source): if value in self._already_raised: return value else: self._already_raised.append(value) raise MissingObjectException(value) raise else: return self.field_typecast(field, value)
def contentPermissionHandler( _context, permission, category, managepermission, for_=None, class_=None, provides=(), **kwargs): if permission == 'zope.Public': raise ConfigurationError('zope.Public permission is not allowed.') provides = list(provides) provides.append(category) PermissionClass = PermissionType( permission, category, managepermission, class_, provides) # set default values for iface in provides: verifyClass(iface, PermissionClass) for fname, field in schema.getFields(iface).items(): if fname in kwargs: if not IFromUnicode.providedBy(field): raise ConfigurationError("Can't convert value", fname) setattr(PermissionClass, fname, field.fromUnicode(kwargs[fname])) else: if field.required and not hasattr(PermissionClass, fname): raise ConfigurationError("Required field is missing", fname) if not hasattr(PermissionClass, fname): setattr(PermissionClass, fname, field.default) # set up permissions required = {} for iface in provides + [IContentPermission]: for iname in iface: required[iname] = managepermission defineChecker(PermissionClass, Checker(required)) # register adapters adapter(_context, (PermissionClass,), category, (for_,), name=permission) adapter(_context, (PermissionClass,), IContentPermission, (for_,), name=permission)
def create_content(self, *args, **kwargs): """Create content and return its UID""" # XXX: Because kwargs are only supported with robotframework >= 2.8.3, # we must parse them here to support robotframework < 2.8.3. for arg in [x for x in args if '=' in x]: name, value = arg.split('=', 1) kwargs[name] = value assert 'type' in kwargs, u"Keyword arguments must include 'type'." portal = getSite() if 'container' in kwargs: pc = getToolByName(portal, 'portal_catalog') uid_or_path = kwargs.pop('container') uid_results =\ pc.unrestrictedSearchResults(UID=uid_or_path) path_results = \ pc.unrestrictedSearchResults( path={'query': uid_or_path.rstrip('/'), 'depth': 0}) container =\ (uid_results or path_results)[0]._unrestrictedGetObject() else: container = portal # Pre-fill Image-types with random content if kwargs.get('type') == 'Image' and not 'image' in kwargs: import random import StringIO from PIL import ( Image, ImageDraw ) img = Image.new('RGB', (random.randint(320, 640), random.randint(320, 640))) draw = ImageDraw.Draw(img) draw.rectangle(((0, 0), img.size), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) del draw kwargs['image'] = StringIO.StringIO() img.save(kwargs['image'], 'PNG') kwargs['image'].seek(0) id_ = kwargs.pop('id', None) type_ = kwargs.pop('type') content = None if HAS_DEXTERITY: # The title attribute for Dexterity types needs to be unicode if 'title' in kwargs and isinstance(kwargs['title'], str): kwargs['title'] = kwargs['title'].decode('utf-8') from plone.dexterity.interfaces import IDexterityFTI from plone.dexterity.utils import createContentInContainer try: getUtility(IDexterityFTI, name=type_) content = createContentInContainer(container, type_, **kwargs) if id_ is not None and content.id != id_: container.manage_renameObject(content.id, id_) except ComponentLookupError: pass if HAS_DEXTERITY and content: # For dexterity-types, we need a second pass to fill all fields # using their widgets to get e.g. RichText-values created # correctly. fti = getUtility(IDexterityFTI, name=type_) schema = fti.lookupSchema() fields = {} for name in schema: fields[name] = schema[name] for schema in getAdditionalSchemata(portal_type=type_): for name in schema: fields[name] = schema[name] for name, field in fields.items(): widget = queryMultiAdapter((field, getRequest()), IFieldWidget) if widget and name in kwargs: if not IFromUnicode.providedBy(field): value = kwargs[name] elif isinstance(kwargs[name], unicode): value = kwargs[name] else: value = unicode(str(kwargs[name]), 'utf-8', errors='ignore') converter = IDataConverter(widget) dm = queryMultiAdapter((content, field), IDataManager) if dm: dm.set(converter.toFieldValue(value)) if content is None: if id_ is None: normalizer = queryUtility(IURLNormalizer) id_ = normalizer.normalize(kwargs['title']) # It must be Archetypes based content: content = container[container.invokeFactory(type_, id_, **kwargs)] content.processForm() return IUUID(content)
def create_content(self, *args, **kwargs): """Create content and return its UID""" disableCSRFProtection() # XXX: Because kwargs are only supported with robotframework >= 2.8.3, # we must parse them here to support robotframework < 2.8.3. for arg in [x for x in args if '=' in x]: name, value = arg.split('=', 1) kwargs[name] = value assert 'type' in kwargs, u"Keyword arguments must include 'type'." portal_type = kwargs.get('type') portal = getSite() if 'container' in kwargs: pc = getToolByName(portal, 'portal_catalog') uid_or_path = kwargs.pop('container') uid_results =\ pc.unrestrictedSearchResults(UID=uid_or_path) path_results = \ pc.unrestrictedSearchResults( path={'query': uid_or_path.rstrip('/'), 'depth': 0}) container =\ (uid_results or path_results)[0]._unrestrictedGetObject() else: container = portal # if we create 'file' and 'image' kwargs entries, they should not be # used to create the content but be set afterwards create_kwargs = {} create_kwargs.update(kwargs) if HAS_DEXTERITY: if portal_type in ('File', ) and 'file' not in kwargs: pdf_file = os.path.join(os.path.dirname(__file__), 'content', u'file.pdf') value = NamedBlobFile(data=open(pdf_file, 'r').read(), contentType='application/pdf', filename=u'file.pdf') kwargs['file'] = value if portal_type in ('Image', 'News Item') and 'image' not in kwargs: prefill_image_types(portal, kwargs) id_ = kwargs.pop('id', None) type_ = kwargs.pop('type') content = None if HAS_DEXTERITY: # The title attribute for Dexterity types needs to be unicode if 'title' in kwargs and isinstance(kwargs['title'], str): kwargs['title'] = kwargs['title'].decode('utf-8') from plone.dexterity.interfaces import IDexterityFTI from plone.dexterity.utils import createContentInContainer try: getUtility(IDexterityFTI, name=type_) content = createContentInContainer(container, type_, **create_kwargs) if id_ is not None and content.id != id_: container.manage_renameObject(content.id, id_) except ComponentLookupError: pass if HAS_DEXTERITY and content: # For dexterity-types, we need a second pass to fill all fields # using their widgets to get e.g. RichText-values created # correctly. fti = getUtility(IDexterityFTI, name=type_) schema = fti.lookupSchema() fields = {} for name in schema: fields[name] = schema[name] for schema in getAdditionalSchemata(portal_type=type_): for name in schema: fields[name] = schema[name] for name, field in fields.items(): widget = queryMultiAdapter((field, getRequest()), IFieldWidget) if widget and name in kwargs: if not IFromUnicode.providedBy(field): value = kwargs[name] elif isinstance(kwargs[name], unicode): value = kwargs[name] else: value = unicode(str(kwargs[name]), 'utf-8', errors='ignore') converter = IDataConverter(widget) dm = queryMultiAdapter((content, field), IDataManager) if dm: dm.set(converter.toFieldValue(value)) if content is None: if id_ is None: normalizer = queryUtility(IURLNormalizer) id_ = normalizer.normalize(kwargs['title']) # It must be Archetypes based content: content = container[container.invokeFactory(type_, id_, **kwargs)] content.processForm() return IUUID(content)
def create_content(self, *args, **kwargs): """Create content and return its UID""" disableCSRFProtection() # XXX: Because kwargs are only supported with robotframework >= 2.8.3, # we must parse them here to support robotframework < 2.8.3. for arg in [x for x in args if '=' in x]: name, value = arg.split('=', 1) kwargs[name] = value assert 'type' in kwargs, u"Keyword arguments must include 'type'." portal_type = kwargs.get('type') portal = getSite() if 'container' in kwargs: pc = getToolByName(portal, 'portal_catalog') uid_or_path = kwargs.pop('container') uid_results =\ pc.unrestrictedSearchResults(UID=uid_or_path) path_results = \ pc.unrestrictedSearchResults( path={'query': uid_or_path.rstrip('/'), 'depth': 0}) container =\ (uid_results or path_results)[0]._unrestrictedGetObject() else: container = portal # if we create 'file' and 'image' kwargs entries, they should not be # used to create the content but be set afterwards create_kwargs = {} create_kwargs.update(kwargs) if HAS_DEXTERITY: if portal_type in ('File', ) and 'file' not in kwargs: pdf_file = os.path.join( os.path.dirname(__file__), 'content', u'file.pdf') value = NamedBlobFile( data=open(pdf_file, 'r').read(), contentType='application/pdf', filename=u'file.pdf' ) kwargs['file'] = value if portal_type in ('Image', 'News Item') and 'image' not in kwargs: prefill_image_types(portal, kwargs) id_ = kwargs.pop('id', None) type_ = kwargs.pop('type') content = None if HAS_DEXTERITY: # The title attribute for Dexterity types needs to be unicode if 'title' in kwargs and isinstance(kwargs['title'], str): kwargs['title'] = kwargs['title'].decode('utf-8') from plone.dexterity.interfaces import IDexterityFTI from plone.dexterity.utils import createContentInContainer try: getUtility(IDexterityFTI, name=type_) content = createContentInContainer( container, type_, **create_kwargs) if id_ is not None and content.id != id_: container.manage_renameObject(content.id, id_) except ComponentLookupError: pass if HAS_DEXTERITY and content: # For dexterity-types, we need a second pass to fill all fields # using their widgets to get e.g. RichText-values created # correctly. fti = getUtility(IDexterityFTI, name=type_) schema = fti.lookupSchema() fields = {} for name in schema: fields[name] = schema[name] for schema in getAdditionalSchemata(portal_type=type_): for name in schema: fields[name] = schema[name] for name, field in fields.items(): widget = queryMultiAdapter((field, getRequest()), IFieldWidget) if widget and name in kwargs: if not IFromUnicode.providedBy(field): value = kwargs[name] elif isinstance(kwargs[name], unicode): value = kwargs[name] else: value = unicode(str(kwargs[name]), 'utf-8', errors='ignore') converter = IDataConverter(widget) dm = queryMultiAdapter((content, field), IDataManager) if dm: dm.set(converter.toFieldValue(value)) if content is None: if id_ is None: normalizer = queryUtility(IURLNormalizer) id_ = normalizer.normalize(kwargs['title']) # It must be Archetypes based content: content = container[container.invokeFactory(type_, id_, **kwargs)] content.processForm() return IUUID(content)
iface = _context.resolve(tp) except Exception, err: pass if iface is not None: provides.append(iface) kwargs['type'] = type kwargs['name'] = name kwargs['permission'] = permission # convert kwargs for iface in provides: for fname, field in schema.getFields(iface).items(): if fname in kwargs: if not IFromUnicode.providedBy(field): raise ConfigurationError("Can't convert value", fname) setattr(new_class, fname, field.fromUnicode(kwargs[fname])) else: if field.required and not hasattr(new_class, fname): raise ConfigurationError("Required field is missing", fname) if not hasattr(new_class, fname): setattr(new_class, fname, field.default) # add IPagelet to provides if name: inProvides = False for iface in provides: if IPagelet.isOrExtends(iface) and not IPageletType.providedBy(iface):
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)