def test_multiple_query_items_included_in_marshall_results(self): portal = self.layer['portal'] login(portal, 'admin') query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'News Item', },{ 'i': 'Title', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Test News Item', }] portal.invokeFactory("Collection", "collection", query=query, title="New Collection") collection = portal['collection'] rfc822 = collection.manage_FTPget() data = parseRFC822(rfc822) self.assertIn('query0_i', data[0]) self.assertIn('query0_o', data[0]) self.assertIn('query0_v', data[0]) self.assertIn('query1_i', data[0]) self.assertIn('query1_o', data[0]) self.assertIn('query1_v', data[0]) self.assertEqual(data[0]['query0_i'], query[0]['i']) self.assertEqual(data[0]['query0_o'], query[0]['o']) self.assertEqual(data[0]['query0_v'], query[0]['v']) self.assertEqual(data[0]['query1_i'], query[1]['i']) self.assertEqual(data[0]['query1_o'], query[1]['o']) self.assertEqual(data[0]['query1_v'], query[1]['v'])
def demarshall(self, instance, data, **kwargs): # We don't want to pass file forward. if 'file' in kwargs: if not data: # TODO Yuck! Shouldn't read the whole file, never. # OTOH, if you care about large files, you should be # using the PrimaryFieldMarshaller or something # similar. data = kwargs['file'].read() del kwargs['file'] headers, body = parseRFC822(data) query = {} for k, v in headers.items(): if not k.startswith("query"): continue else: index = int(k[5]) sub_key = k.split("_")[1] query_part = query.get(index, {}) query_part[sub_key] = v query[index] = query_part del headers[k] query = [facet[1] for facet in sorted(query.items())] header = formatRFC822Headers(headers.items()) data = '%s\n\n%s' % (header, body) try: return RFC822Marshaller.demarshall(self, instance, data, **kwargs) finally: instance.query = query
def demarshall(self, instance, data, **kwargs): # We don't want to pass file forward. if 'file' in kwargs: if not data: # TODO Yuck! Shouldn't read the whole file, never. # OTOH, if you care about large files, you should be # using the PrimaryFieldMarshaller or something # similar. data = kwargs['file'].read() del kwargs['file'] headers, body = parseRFC822(data) query = {} for k, v in headers.items(): if not k.startswith("query"): continue else: index = int(k[5]) sub_key = k.split("_")[1] query_part = query.get(index, {}) query_part[sub_key] = v query[index] = query_part del headers[k] query = [facet[1] for facet in sorted(query.items())] header = formatRFC822Headers(headers.items()) data = '%s\n\n%s' % (header, body) try: return RFC822Marshaller.demarshall(self, instance, data, **kwargs) finally: instance.query = query
def test_multiple_query_items_included_in_marshall_results(self): portal = self.layer['portal'] login(portal, 'admin') query = [{ 'i': 'portal_type', 'o': 'plone.app.querystring.operation.string.is', 'v': 'News Item', }, { 'i': 'Title', 'o': 'plone.app.querystring.operation.string.is', 'v': 'Test News Item', }] portal.invokeFactory("Collection", "collection", query=query, title="New Collection") collection = portal['collection'] rfc822 = collection.manage_FTPget() data = parseRFC822(rfc822) self.assertIn('query0_i', data[0]) self.assertIn('query0_o', data[0]) self.assertIn('query0_v', data[0]) self.assertIn('query1_i', data[0]) self.assertIn('query1_o', data[0]) self.assertIn('query1_v', data[0]) self.assertEqual(data[0]['query0_i'], query[0]['i']) self.assertEqual(data[0]['query0_o'], query[0]['o']) self.assertEqual(data[0]['query0_v'], query[0]['v']) self.assertEqual(data[0]['query1_i'], query[1]['i']) self.assertEqual(data[0]['query1_o'], query[1]['o']) self.assertEqual(data[0]['query1_v'], query[1]['v'])
def marshall(self, instance, **kwargs): content_type, length, data = RFC822Marshaller.marshall(self, instance, **kwargs) headers, body = parseRFC822(data) headers = headers.items() for i, query in enumerate(instance.query): for key, value in query.items(): if isinstance(value, list): value = "\n".join(value) header_key = 'query%d_%s' % (i, key) headers.append((header_key, value)) header = formatRFC822Headers(headers) data = '%s\n\n%s' % (header, body) length = len(data) return (content_type, length, data)
def marshall(self, instance, **kwargs): content_type, length, data = RFC822Marshaller.marshall(self, instance, **kwargs) headers, body = parseRFC822(data) headers = headers.items() for i, query in enumerate(instance.query): for key, value in query.items(): if isinstance(value, list): value = "\n".join(value) header_key = 'query%d_%s' % (i, key) headers.append((header_key, value)) header = formatRFC822Headers(headers) data = '%s\n\n%s' % (header, body) length = len(data) return (content_type, length, data)