def test_serialize(self):
        desB = IDeserializer(schema.Object(schema=ITestObjectB))
        serA = ISerializer(schema.Object(schema=ITestObjectA))
        serB = ISerializer(schema.Object(schema=ITestObjectB))

        obj = TestObjectA()
        obj.fish = u"haddock"
        self.assertEqual(serA(obj, None), dict(
            _class="transmogrify.dexterity.tests.testconverters_object.TestObjectA",
            fish=u"haddock",
        ))

        # Recurse into attributes
        filestore = {}
        obj = desB(dict(
            title=u'A hairy section',
            cowtent=dict(data=u'Some nice text', contenttype='scroll/dead-sea'),
            _class="transmogrify.dexterity.tests.testconverters_object.TestObjectB",
        ), filestore, None)
        self.assertEqual(serB(obj, filestore), dict(
            _class="transmogrify.dexterity.tests.testconverters_object.TestObjectB",
            title=u'A hairy section',
            cowtent=dict(
                file='_field_cowtent_cowtent',
                encoding='utf-8',
                contenttype='scroll/dead-sea',
            ),
        ))
Esempio n. 2
0
 def __call__(self, value, filestore, extra=None):
     field = self.field
     if field.value_type is not None:
         serializer = ISerializer(self.field.value_type)
     else:
         serializer = DefaultSerializer()
     return [serializer(v, filestore, str(i)) for i, v in enumerate(value)]
def export_file(result, header_mapping, request=None):
    if not result:
        return None

    if request is None:
        request = getRequest()

    csv_file = StringIO.StringIO()
    writer = csv.writer(csv_file, delimiter=",", dialect="excel", quotechar='"')
    columns = [d['header'] for d in header_mapping]
    writer.writerow(columns)
    for row in result:
        items = []
        if getattr(row, 'getObject', None):
            obj = row.getObject()
        else:
            obj = row
        for d in header_mapping:
            fieldid = d['field']
            if obj is None:
                items.append(row(fieldid))
                continue
            if fieldid == '_path':
                path = obj.getPhysicalPath()
                virtual_path = request.physicalPathToVirtualPath(path)
                items.append('/'.join(virtual_path))
                continue
            elif fieldid == '_url':
                items.append(obj.absolute_url())
                continue

            value = ""
            for schemata in iterSchemata(obj):
                if fieldid not in schemata:
                    continue
                field = schemata[fieldid]

                try:
                    value = field.get(schemata(obj))
                except AttributeError:
                    continue
                if value is field.missing_value:
                    continue
                serializer = ISerializer(field)
                value = serializer(value, {})
                break
            value = value and value.encode('utf-8')
            items.append(value)

#        log.debug(items)
        writer.writerow(items)
    csv_attachment = csv_file.getvalue()
    csv_file.close()
    return csv_attachment
Esempio n. 4
0
 def __call__(self, value, filestore, extra=''):
     out = {
         "_class":
         "%s.%s" % (
             value.__class__.__module__,
             value.__class__.__name__,
         )
     }
     for k in self.field.schema:
         serializer = ISerializer(self.field.schema[k])
         out[k] = serializer(getattr(value, k), filestore, extra + k)
     return out
Esempio n. 5
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            # not enough info
            if not pathkey:
                yield item
                continue

            path = item[pathkey]
            # Skip the Plone site object itself
            if not path:
                yield item
                continue

            obj = self.context.unrestrictedTraverse(path.encode().lstrip('/'),
                                                    None)

            if not IDexterityContent.providedBy(obj):
                # Path doesn't exist
                # obj can not only be None, but also the value of an attribute,
                # which is returned by traversal.
                yield item
                continue

            uuid = IUUID(obj, None)
            if uuid is not None:
                item['plone.uuid'] = uuid

            files = item.setdefault(self.fileskey, {})

            # get all fields for this obj
            for schemata in iterSchemata(obj):
                for name, field in getFieldsInOrder(schemata):
                    try:
                        value = field.get(schemata(obj))
                    except AttributeError:
                        continue
                    if value is field.missing_value:
                        continue
                    serializer = ISerializer(field)
                    item[name] = serializer(value, files)

            yield item
 def _serializer(self, field_type):
     if field_type is not None:
             return ISerializer(field_type)
     return DefaultSerializer()
def export_file(result, header_mapping, request=None):
    if not result:
        return None

    if request is None:
        request = getRequest()

    transforms = api.portal.get_tool('portal_transforms')
    catalog = api.portal.get_tool("portal_catalog")

    data = []
    for row in result:
        items_dict = dict()
        if getattr(row, 'getObject', None):
            obj = row.getObject()
        else:
            obj = row
        for d in header_mapping:
            fieldid = d['field']
            if obj is None:
                items_dict[d['header']] = row(fieldid)
                continue
            if fieldid == '_path':
                path = obj.getPhysicalPath()
                virtual_path = request.physicalPathToVirtualPath(path)
                items_dict[d['header']] = (
                    '/'.join(virtual_path)).decode('utf-8')
                continue
            elif fieldid == '_url':
                items_dict[d['header']] = (obj.absolute_url()).decode('utf-8')
                continue

            value = ""
            for schemata in iterSchemata(obj):
                if fieldid not in schemata:
                    continue
                field = schemata[fieldid]

                try:
                    value = field.get(schemata(obj))
                except AttributeError:
                    continue
                if value is field.missing_value:
                    continue
                if IRichTextValue.providedBy(value):
                    # Convert to plain text
                    value = transforms.convertTo(target_mimetype='text/plain',
                                                 orig=value.raw_encoded,
                                                 encoding=value.encoding,
                                                 mimetype=value.mimeType)
                    value = safe_unicode(value.getData())
                    break

                if IList.providedBy(field):
                    # Check if items in list point to objects and use titles
                    # instead
                    names = []
                    for item_id in value:
                        # Loop through choices
                        query = dict(id=item_id)
                        results = catalog(**query)
                        if results:
                            names.append(results[0].Title)
                    if names:
                        value = names
                    value = ', '.join(value)
                    break

                if INamed.providedBy(value):
                    # Image, file field
                    value = u'{0}/@@download/{1}'.format(row.getURL(), fieldid)
                    break

                serializer = ISerializer(field)
                value = serializer(value, {})
                break

            # Added due to an ascii error related to csv export. We convert to
            # unicode as unicodecsv requires unicode
            value = safe_unicode(value)

            items_dict[d['header']] = value

        data.append(items_dict)

    dataset = tablib.Dataset()
    dataset.dict = data

    return dataset