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'])
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
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