~fabricematrat/charmworld/redirect-charm

« back to all changes in this revision

Viewing changes to charmworld/views/api/__init__.py

  • Committer: Tarmac
  • Author(s): Brad Crittenden
  • Date: 2014-10-16 14:02:32 UTC
  • mfrom: (517.1.3 bug-1379397)
  • Revision ID: tarmac-20141016140232-dyls640scsvdz0a3
Add 'start' parameter to API search.

The start is the zero-based index into the search results.  It can be used
in conjunction with limit.

https://codereview.appspot.com/158010043/

R=jcsackett. Fixes: https://bugs.launchpad.net/bugs/1379397.

Approved by Juju Gui Bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
    BUNDLE,
38
38
    CHARM,
39
39
    InvalidCharmType,
 
40
    InvalidStart,
40
41
    NegativeLimit,
41
42
)
42
43
from charmworld.utils import (
716
717
    def _search(self, limit=None, name=None, series=None, owner=None,
717
718
                provides=None, requires=None, type_=None, provider=None,
718
719
                scope=None, categories=None, text=None, autocomplete=False,
719
 
                doctype=None, min_score=None):
 
720
                doctype=None, min_score=None, start=None):
720
721
        """Search for charms and bundles matching parameters.
721
722
 
722
723
        :limit: A query limit.  (The max number of results.)  Dispatched as a
724
725
        :min_score: The minimum score for filtering.  Dispatched as a
725
726
           list of numeric characters representing a float, e.g. ['1.1'].
726
727
        """
 
728
 
 
729
        def _check_scalar(value):
 
730
            if value is not None and len(value) > 1:
 
731
                raise ValueError()
 
732
 
727
733
        autocomplete = autocomplete == ['true']
728
734
        params = dict((key, value) for key, value in locals().items()
729
735
                      if key in ('series', 'owner', 'name', 'categories'))
734
740
        params['i_provides'] = provides
735
741
        params['i_requires'] = requires
736
742
        filters = dict(item for item in params.items() if item[1] is not None)
 
743
        for name in ('limit', 'start'):
 
744
            try:
 
745
                _check_scalar(locals()[name])
 
746
            except ValueError:
 
747
                return json_response(
 
748
                    406,
 
749
                    {
 
750
                        'type': 'multiple_values',
 
751
                        'parameter': name,
 
752
                    })
737
753
        if limit is not None:
738
 
            if len(limit) > 1:
739
 
                return json_response(406, {
740
 
                                     'type': 'multiple_values',
741
 
                                     'parameter': 'limit'})
742
754
            limit = int(limit[0])
 
755
        if start is not None:
 
756
            start = int(start[0])
743
757
        try:
744
758
            results = self.request.index_client.api_search(
745
759
                text[0], filters, type_, limit, autocomplete=autocomplete,
746
 
                doctype=doctype, min_score=min_score)
 
760
                doctype=doctype, min_score=min_score, start=start)
747
761
        except InvalidCharmType as e:
748
762
            return json_response(406, {
749
763
                                 'type': 'unsupported_value',
753
767
            return json_response(406, {
754
768
                                 'type': 'negative_value',
755
769
                                 'parameter': 'limit'})
 
770
        except InvalidStart:
 
771
            return json_response(406, {
 
772
                                 'type': 'invalid_value',
 
773
                                 'parameter': 'start'})
756
774
        return {'result': self._item_results(results)}
757
775
 
758
776
    def _item_results(self, items):