def test_last_link_contained(self): items = list(range(1, 26)) self.request.form['b_size'] = 10 batch = HypermediaBatch(self.request, items) self.assertDictContainsSubset({'last': 'http://nohost?b_start=20'}, batch.links)
def __call__(self, metadata_fields=(), fullobjects=False): batch = HypermediaBatch(self.request, self.lazy_resultset) results = {} results['@id'] = batch.canonical_url results['items_total'] = batch.items_total if batch.links: results['batching'] = batch.links results['items'] = [] for brain in batch: if fullobjects: result = getMultiAdapter( (brain.getObject(), self.request), ISerializeToJson)( include_items=False) else: result = getMultiAdapter( (brain, self.request), ISerializeToJsonSummary)() # Merge additional metadata into the summary we already have if metadata_fields: metadata = getMultiAdapter( (brain, self.request), ISerializeToJson)(metadata_fields=metadata_fields) result.update(metadata) results['items'].append(result) return results
def test_prev_link_omitted_on_first_page(self): items = list(range(1, 26)) self.request.form["b_size"] = 10 batch = HypermediaBatch(self.request, items) self.assertSetEqual(set(["@id", "first", "next", "last"]), set(batch.links))
def __call__(self, version=None, include_items=True): folder_metadata = super(SerializeFolderToJson, self).__call__(version=version) folder_metadata.update({"is_folderish": True}) result = folder_metadata include_items = self.request.form.get("include_items", include_items) include_items = boolean_value(include_items) if include_items: query = self._build_query() catalog = getToolByName(self.context, "portal_catalog") brains = catalog(query) batch = HypermediaBatch(self.request, brains) if not self.request.form.get("fullobjects"): result["@id"] = batch.canonical_url result["items_total"] = batch.items_total if batch.links: result["batching"] = batch.links if "fullobjects" in list(self.request.form): result["items"] = getMultiAdapter( (brains, self.request), ISerializeToJson )(fullobjects=True)["items"] else: result["items"] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def test_custom_batch_size(self): items = range(1, 26) self.request.form['b_size'] = 5 batch = HypermediaBatch(self.request, items) # Batch size should be customizable via request self.assertEqual( 5, len(list(batch)))
def test_default_batch_start(self): items = range(1, 26) self.request.form['b_size'] = 10 batch = HypermediaBatch(self.request, items) # Batch should start on first item by default self.assertEqual( range(1, 11), list(batch))
def test_items_total(self): items = range(1, 26) self.request.form['b_size'] = 10 batch = HypermediaBatch(self.request, items) # items_total should be total number of items in the sequence self.assertEqual( 25, batch.items_total)
def __call__(self): query = self._build_query() catalog = getToolByName(self.context, 'portal_catalog') brains = catalog(query) batch = HypermediaBatch(self.request, brains) result = { # '@context': 'http://www.w3.org/ns/hydra/context.jsonld', '@id': batch.canonical_url, 'id': self.context.id, '@type': 'Plone Site', 'parent': {}, } result['items_total'] = batch.items_total if batch.links: result['batching'] = batch.links result['items'] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def __call__(self, version=None, include_items=True): result = super().__call__(version=version) include_items = self.request.form.get("include_items", include_items) include_items = boolean_value(include_items) if include_items: results = self.context.results(batch=False) batch = HypermediaBatch(self.request, results) if not self.request.form.get("fullobjects"): result["@id"] = batch.canonical_url result["items_total"] = batch.items_total if batch.links: result["batching"] = batch.links if "fullobjects" in list(self.request.form): result["items"] = [ getMultiAdapter((brain.getObject(), self.request), ISerializeToJson)() for brain in batch ] else: result["items"] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def __call__(self): records = self.registry.records # Batch keys, because that is a simple BTree batch = HypermediaBatch(self.request, records.keys()) results = {} results['@id'] = batch.canonical_url results['items_total'] = batch.items_total if batch.links: results['batching'] = batch.links def make_item(key): record = records[key] schema = getMultiAdapter( (record.field, record, self.request), IJsonSchemaProvider ) data = { 'name': key, 'value': self.registry[key] } __traceback_info__ = (record, record.field, schema) data['schema'] = { 'properties': schema.get_schema(), } return data results['items'] = [make_item(key) for key in batch] return results
def __call__(self, version=None): version = 'current' if version is None else version if version != 'current': return {} query = self._build_query() catalog = getToolByName(self.context, 'portal_catalog') brains = catalog(query) batch = HypermediaBatch(self.request, brains) result = { # '@context': 'http://www.w3.org/ns/hydra/context.jsonld', '@id': batch.canonical_url, 'id': self.context.id, '@type': 'Plone Site', 'title': self.context.Title(), 'parent': {}, 'is_folderish': True } # Insert expandable elements result.update(expandable_elements(self.context, self.request)) result['items_total'] = batch.items_total if batch.links: result['batching'] = batch.links result['items'] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def _include_items(self, obj, include_items): """ """ result = {} include_items = self._get_param("include_items", include_items) if include_items: query = self._build_query() catalog = getToolByName(self.context, "portal_catalog") brains = catalog(query) batch = HypermediaBatch(self.request, brains) result["items_total"] = batch.items_total if batch.links: result["batching"] = batch.links if "fullobjects" in list(self.request.form): result["items"] = getMultiAdapter( (brains, self.request), ISerializeToJson)(fullobjects=True)["items"] else: result["items"] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def test_next_link_contained_if_necessary(self): items = list(range(1, 26)) self.request.form["b_size"] = 10 batch = HypermediaBatch(self.request, items) self.assertDictContainsSubset({"next": "http://nohost?b_start=10"}, batch.links)
def __call__(self, version=None, include_items=True): folder_metadata = super(SerializeFolderToJson, self).__call__(version=version) folder_metadata.update({'is_folderish': True}) result = folder_metadata include_items = self.request.form.get('include_items', include_items) include_items = boolean_value(include_items) if include_items: query = self._build_query() catalog = getToolByName(self.context, 'portal_catalog') brains = catalog(query) batch = HypermediaBatch(self.request, brains) if not self.request.form.get('fullobjects'): result['@id'] = batch.canonical_url result['items_total'] = batch.items_total if batch.links: result['batching'] = batch.links result['items'] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return result
def test_custom_batch_start(self): items = range(1, 26) self.request.form['b_size'] = 10 self.request.form['b_start'] = 5 batch = HypermediaBatch(self.request, items) # Batch start should be customizable via request self.assertEqual(range(6, 16), list(batch))
def test_prev_link_omitted_on_first_page(self): items = range(1, 26) self.request.form['b_size'] = 10 batch = HypermediaBatch(self.request, items) self.assertSetEqual(set(['@id', 'first', 'next', 'last']), set(batch.links.keys()))
def reply(self): name = self.request.form.get('name') start = self.request.form.get('b_start', '0') rows = self.request.form.get('b_size', '25') try: start = int(start) rows = int(rows) except ValueError: start = 0 rows = 25 sort_on = self.request.form.get('sort_on', DEFAULT_SORT_INDEX) sort_on = FIELDS.get(sort_on, (None, DEFAULT_SORT_INDEX))[2] sort_order = self.request.form.get('sort_order', 'descending') term = self.request.form.get('search', '').strip() columns = self.request.form.get('columns', []) filters = self.request.form.get('filters', {}) facets = self.request.form.get('facets', []) if not isinstance(filters, record): filters = {} depth = self.request.form.get('depth', -1) try: depth = int(depth) except ValueError: depth = -1 items, facet_counts = self.results(name, term, columns, start, rows, sort_on, sort_order, filters, depth, facets) batch = HypermediaBatch(self.request, items) res = {} res['@id'] = batch.canonical_url res['items_total'] = batch.items_total res['b_start'] = start res['b_size'] = rows if batch.links: res['batching'] = batch.links res['items'] = [] for item in items[start:start + rows]: res['items'].append(create_list_item(item, columns)) facets = dict((field, dict((facet, { "count": count }) for facet, count in facets.items())) for field, facets in facet_counts.items()) if facet_counts: for field, facets in facet_counts.items(): transform = FACET_TRANSFORMS.get(field) for facet, count in facets.items(): facets[facet] = {"count": count} if transform: facets[facet]['label'] = transform(facet) res['facets'] = facet_counts return res
def __call__(self, fullobjects=False): batch = HypermediaBatch(self.request, self.lazy_resultset) results = {} results["@id"] = batch.canonical_url results["items_total"] = batch.items_total links = batch.links if links: results["batching"] = links results["items"] = [] for brain in batch: if fullobjects: try: result = getMultiAdapter( (brain.getObject(), self.request), ISerializeToJson)(include_items=False) except KeyError: # Guard in case the brain returned refers to an object that doesn't # exists because it failed to uncatalog itself or the catalog has # stale cataloged objects for some reason log.warning( "Brain getObject error: {} doesn't exist anymore". format(brain.getPath())) else: result = getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() results["items"].append(result) return results
def __call__(self, version=None, include_items=True): collection_metadata = super(SerializeCollectionToJson, self).__call__( version=version ) brains = self.context.results(batch=False) batch = HypermediaBatch(self.request, brains) results = collection_metadata if not self.request.form.get("fullobjects"): results["@id"] = batch.canonical_url results["items_total"] = batch.items_total if batch.links: results["batching"] = batch.links if "fullobjects" in list(self.request.form): results["items"] = [ getMultiAdapter((brain.getObject(), self.request), ISerializeToJson)() for brain in batch ] else: results["items"] = [ getMultiAdapter((brain, self.request), ISerializeToJsonSummary)() for brain in batch ] return results
def test_next_link_contained_if_necessary(self): items = range(1, 26) self.request.form['b_size'] = 10 batch = HypermediaBatch(self.request, items) self.assertDictContainsSubset({'next': 'http://nohost?b_start=10'}, batch.links)
def test_custom_start_and_size_can_be_combined(self): items = range(1, 26) self.request.form['b_size'] = 5 self.request.form['b_start'] = 5 batch = HypermediaBatch(self.request, items) # Should be able to combine custom batch start and size self.assertListEqual(range(6, 11), list(batch))
def test_batch_start_never_drops_below_zero(self): items = list(range(1, 26)) # Start in the middle of what would otherwise be the first batch self.request.form["b_size"] = 10 self.request.form["b_start"] = 5 batch = HypermediaBatch(self.request, items) self.assertEqual("http://nohost?b_start=0", batch.links["prev"])
def test_next_link_omitted_on_last_page(self): items = list(range(1, 26)) # Start on last page self.request.form["b_size"] = 10 self.request.form["b_start"] = 20 batch = HypermediaBatch(self.request, items) self.assertSetEqual({"@id", "first", "prev", "last"}, set(batch.links))
def test_batch_start_never_drops_below_zero(self): items = range(1, 26) # Start in the middle of what would otherwise be the first batch self.request.form['b_size'] = 10 self.request.form['b_start'] = 5 batch = HypermediaBatch(self.request, items) self.assertEquals('http://nohost?b_start=0', batch.links['prev'])
def test_current_batch_url(self): items = list(range(1, 26)) self.request.form["b_size"] = 10 self.request["ACTUAL_URL"] = "http://nohost" self.request["QUERY_STRING"] = "b_size=10&b_start=20" batch = HypermediaBatch(self.request, items) self.assertEqual("http://nohost?b_size=10&b_start=20", batch.current_batch_url)
def test_prev_link_contained_if_necessary(self): items = list(range(1, 26)) # Start on third page self.request.form["b_size"] = 10 self.request.form["b_start"] = 20 batch = HypermediaBatch(self.request, items) self.assertDictContainsSubset({"prev": "http://nohost?b_start=10"}, batch.links)
def test_prev_link_contained_if_necessary(self): items = range(1, 26) # Start on third page self.request.form['b_size'] = 10 self.request.form['b_start'] = 20 batch = HypermediaBatch(self.request, items) self.assertDictContainsSubset({'prev': 'http://nohost?b_start=10'}, batch.links)
def test_next_link_omitted_on_last_page(self): items = range(1, 26) # Start on last page self.request.form['b_size'] = 10 self.request.form['b_start'] = 20 batch = HypermediaBatch(self.request, items) self.assertSetEqual(set(['@id', 'first', 'prev', 'last']), set(batch.links.keys()))
def test_current_batch_url(self): items = range(1, 26) self.request.form['b_size'] = 10 self.request['ACTUAL_URL'] = 'http://nohost' self.request['QUERY_STRING'] = 'b_size=10&b_start=20' batch = HypermediaBatch(self.request, items) self.assertEqual('http://nohost?b_size=10&b_start=20', batch.current_batch_url)
def reply(self): result = {} batch = HypermediaBatch(self.request, self._data()) result['items'] = self._create_items(batch) result['items_total'] = batch.items_total if batch.links: result['batching'] = batch.links return result