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', ), ))
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
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
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