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)
Exemple #2
0
    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
Exemple #3
0
    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))
Exemple #4
0
    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
Exemple #5
0
 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)))
Exemple #6
0
 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))
Exemple #7
0
 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)
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #10
0
    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
Exemple #11
0
    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
Exemple #12
0
    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
Exemple #13
0
    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
Exemple #18
0
    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
Exemple #19
0
    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))
Exemple #22
0
    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"])
Exemple #23
0
    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'])
Exemple #25
0
    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)
Exemple #26
0
    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)
Exemple #30
0
    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