def test_parse_range_header(self):
     from pyramid_skosprovider.utils import parse_range_header
     headers = [
         {
             'header': 'items=0-19',
             'result': {
                 'start': 0,
                 'number': 20,
                 'finish': 19
             }
         }, {
             'header': 'items:0-19',
             'result': False
         }, {
             'header': 'test',
             'result': False
         }, {
             'header': 'items=t-t',
             'result': False
         }, {
             'header': 'items=10-0',
             'result': {
                 'start': 10,
                 'finish': 10,
                 'number': 1
             }
         }]
     for header in headers:
         res = parse_range_header(header['header'])
         self.assertEqual(res, header['result'])
 def test_parse_range_header(self):
     from pyramid_skosprovider.utils import parse_range_header
     headers = [{
         'header': 'items=0-19',
         'result': {
             'start': 0,
             'number': 20,
             'finish': 19
         }
     }, {
         'header': 'items:0-19',
         'result': False
     }, {
         'header': 'test',
         'result': False
     }, {
         'header': 'items=t-t',
         'result': False
     }, {
         'header': 'items=10-0',
         'result': {
             'start': 10,
             'finish': 10,
             'number': 1
         }
     }]
     for header in headers:
         res = parse_range_header(header['header'])
         self.assertEqual(res, header['result'])
Example #3
0
    def get_conceptscheme_concepts(self):
        scheme_id = self.request.matchdict['scheme_id']
        provider = self.skos_registry.get_provider(scheme_id)
        if not provider:
            return HTTPNotFound()
        query = {}
        mode = self.request.params.get('mode', 'default')
        sort = self.request.params.get('sort', None)
        label = self.request.params.get('label', None)
        postprocess = False
        if mode == 'dijitFilteringSelect' and label == '':
            concepts = []
        else:
            if label not in [None, '*', '']:
                if mode == 'dijitFilteringSelect' and '*' in label:
                    postprocess = True
                    query['label'] = label.replace('*', '')
                else:
                    query['label'] = label
            type = self.request.params.get('type', None)
            if type in ['concept', 'collection']:
                query['type'] = type
            coll = self.request.params.get('collection', None)
            if coll is not None:
                query['collection'] = {'id': coll, 'depth': 'all'}
            concepts = provider.find(query)
        # We need to refine results further
        if postprocess:
            if label.startswith('*') and label.endswith('*'):
                concepts = [c for c in concepts if label[1:-1] in c['label']]
            elif label.endswith('*'):
                concepts = [c for c in concepts if c['label'].startswith(label[0:-1])]
            elif label.startswith('*'):
                concepts = [c for c in concepts if c['label'].endswith(label[1:])]

        #Result sorting
        if sort:
            sort_desc = (sort[0:1] == '-')
            sort = sort[1:] if sort[0:1] in ['-', '+'] else sort
            sort = sort.strip() # dojo store does not encode '+'
            if (len(concepts) > 0) and (sort in concepts[0]):
                concepts.sort(key=lambda concept: concept[sort], reverse=sort_desc)

        # Result paging
        paging_data = False
        if 'Range' in self.request.headers:
            paging_data = parse_range_header(self.request.headers['Range'])
        count = len(concepts)
        if not paging_data:
            paging_data = {
                'start': 0,
                'finish': count - 1 if count > 0 else 0,
                'number': count
            }
        cslice = concepts[paging_data['start']:paging_data['finish']+1]
        self.request.response.headers[ascii_native_('Content-Range')] = \
            ascii_native_('items %d-%d/%d' % (
                paging_data['start'], paging_data['finish'], count
            ))
        return cslice
Example #4
0
 def _page_results(self, concepts):
     # Result paging
     paging_data = False
     if 'Range' in self.request.headers:
         paging_data = parse_range_header(self.request.headers['Range'])
     count = len(concepts)
     if not paging_data:
         paging_data = {
             'start': 0,
             'finish': count - 1 if count > 0 else 0,
             'number': count
         }
     cslice = concepts[paging_data['start']:paging_data['finish']+1]
     self.request.response.headers[ascii_native_('Content-Range')] = \
         ascii_native_('items %d-%d/%d' % (
             paging_data['start'], paging_data['finish'], count
         ))
     return cslice
 def _page_results(self, concepts):
     # Result paging
     paging_data = False
     if 'Range' in self.request.headers:
         paging_data = parse_range_header(self.request.headers['Range'])
     count = len(concepts)
     if not paging_data:
         paging_data = {
             'start': 0,
             'finish': count - 1 if count > 0 else 0,
             'number': count
         }
     cslice = concepts[paging_data['start']:paging_data['finish'] + 1]
     self.request.response.headers[ascii_native_('Content-Range')] = \
         ascii_native_('items %d-%d/%d' % (
             paging_data['start'], paging_data['finish'], count
         ))
     return cslice