def get(self): view_map = self.VIEW_MAP list_view = view_map[u'_all_'] view = partial(list_view, self.db) results = [ i['value'] for i in view() ] data = { 'data': results } return data
def __new__(mcs, name, bases, dct): schema = dct.get('schema') validators = dct.get('validators', {}) for method in ('post', 'put'): if method in dct: continue try: _validators = validators.get(method, None) except AttributeError: _validators = validators view_fn = lambda request: {'valid': True} if _validators: _view = view(schema=schema, validators=_validators)(view_fn) else: _view = view(schema=schema)(view_fn) dct[method] = _view return super(ResourceValidatorMetaclass, mcs).__new__( mcs, name, bases, dct)
def get(self): params = {} pparams = {} fields = self.request.params.get('opt_fields', '') if fields: fields = set(fields.split(self.LIST_SEP)) if not self.disable_opt_fields_filter: fields &= set(self.FIELDS) limit = self.request.params.get('limit', '') if limit: params['limit'] = limit pparams['limit'] = limit limit = int(limit) if limit.isdigit() and ( 100 if fields else 1000) >= int(limit) > 0 else 100 descending = bool(self.request.params.get('descending')) offset = self.request.params.get('offset', '') if descending: params['descending'] = 1 else: pparams['descending'] = 1 feed = self.request.params.get('feed', '') view_map = self.FEED.get(feed, self.VIEW_MAP) changes = view_map is self.CHANGES_VIEW_MAP if feed and feed in self.FEED: params['feed'] = feed pparams['feed'] = feed mode = self.request.params.get('mode', '') if mode and mode in view_map: params['mode'] = mode pparams['mode'] = mode view_limit = limit + 1 if offset else limit if changes: if offset: view_offset = decrypt(self.server.uuid, self.db.name, offset) if view_offset and view_offset.isdigit(): view_offset = int(view_offset) else: self.request.errors.add('params', 'offset', 'Offset expired/invalid') self.request.errors.status = 404 raise error_handler(self.request.errors) if not offset: view_offset = 'now' if descending else 0 else: if offset: view_offset = offset else: view_offset = '9' if descending else '' list_view = view_map.get(mode, view_map[u'']) view_kwargs = dict(limit=view_limit, startkey=view_offset, descending=descending) if self.update_after: view_kwargs.update({'stale': 'update_after'}) view = partial(list_view, self.db, **view_kwargs) if fields: params['opt_fields'] = pparams['opt_fields'] = self.LIST_SEP.join( fields) view_fields = fields | {'dateModified', 'id'} if fields.issubset(set(self.FIELDS)): if changes: results = [(dict([ (i, j) for i, j in x.value.items() + [('id', x.id)] if i in view_fields ]), x.key) for x in view()] else: results = [(dict([(i, j) for i, j in x.value.items() + [('id', x.id), ('dateModified', x.key)] if i in view_fields]), x.key) for x in view()] else: results = [(self.serialize_func(self.request, x.doc, view_fields), x.key) for x in view(include_docs=True)] else: results = [({ 'id': i.id, 'dateModified': i.value['dateModified'] } if changes else { 'id': i.id, 'dateModified': i.key }, i.key) for i in view()] if results: params['offset'], pparams['offset'] = results[-1][1], results[0][1] if offset and view_offset == results[0][1]: results = results[1:] elif offset and view_offset != results[0][1]: results = results[:limit] params['offset'], pparams['offset'] = results[-1][ 1], view_offset results = [i[0] for i in results] if changes: params['offset'] = encrypt(self.server.uuid, self.db.name, params['offset']) pparams['offset'] = encrypt(self.server.uuid, self.db.name, pparams['offset']) else: params['offset'] = offset pparams['offset'] = offset data = { 'data': results, 'next_page': { "offset": params['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=params), "uri": self.request.route_url(self.object_name_for_listing, _query=params) } } if descending or offset: data['prev_page'] = { "offset": pparams['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=pparams), "uri": self.request.route_url(self.object_name_for_listing, _query=pparams) } return data
def get(self): params = {} pparams = {} fields = self.request.params.get("opt_fields", "") if fields: fields = set(fields.split(self.LIST_SEP)) & set(self.FIELDS) limit = self.request.params.get("limit", "") if limit: params["limit"] = limit pparams["limit"] = limit limit = int(limit) if limit.isdigit() and (100 if fields else 1000) >= int(limit) > 0 else 100 descending = bool(self.request.params.get("descending")) offset = self.request.params.get("offset", "") if descending: params["descending"] = 1 else: pparams["descending"] = 1 feed = self.request.params.get("feed", "") view_map = self.FEED.get(feed, self.VIEW_MAP) changes = view_map is self.CHANGES_VIEW_MAP if feed and feed in self.FEED: params["feed"] = feed pparams["feed"] = feed mode = self.request.params.get("mode", "") if mode and mode in view_map: params["mode"] = mode pparams["mode"] = mode view_limit = limit + 1 if offset else limit if changes: if offset: view_offset = decrypt(self.server.uuid, self.db.name, offset) if view_offset and view_offset.isdigit(): view_offset = int(view_offset) else: self.request.errors.add("url", "offset", "Offset expired/invalid") self.request.errors.status = 404 raise error_handler(self.request) if not offset: view_offset = "now" if descending else 0 else: if offset: view_offset = offset else: view_offset = "9" if descending else "" list_view = view_map.get(mode, view_map[""]) if self.update_after: view = partial( list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending, stale="update_after" ) else: view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending) if fields: params["opt_fields"] = pparams["opt_fields"] = self.LIST_SEP.join(fields) view_fields = fields | {"dateModified", "id"} if changes: results = [ ( dict( (i, j) for i, j in list(x.value.items()) + [('id', x.id)] if i in view_fields ), x.key ) for x in view() ] else: results = [ ( dict( [ (i, j) for i, j in list(x.value.items()) + [("id", x.id), ("dateModified", x.key)] if i in view_fields ] ), x.key, ) for x in view() ] else: results = [ ( {"id": i.id, "dateModified": i.value["dateModified"]} if changes else {"id": i.id, "dateModified": i.key}, i.key, ) for i in view() ] if results: params["offset"], pparams["offset"] = results[-1][1], results[0][1] if offset and view_offset == results[0][1]: results = results[1:] elif offset and view_offset != results[0][1]: results = results[:limit] params["offset"], pparams["offset"] = results[-1][1], view_offset results = [i[0] for i in results] if changes: params["offset"] = encrypt(self.server.uuid, self.db.name, params["offset"]).decode() pparams["offset"] = encrypt(self.server.uuid, self.db.name, pparams["offset"]).decode() else: params["offset"] = offset pparams["offset"] = offset data = { "data": results, "next_page": { "offset": params["offset"], "path": self.request.route_path(self.object_name_for_listing, _query=params), "uri": self.request.route_url(self.object_name_for_listing, _query=params), }, } if descending or offset: data["prev_page"] = { "offset": pparams["offset"], "path": self.request.route_path(self.object_name_for_listing, _query=pparams), "uri": self.request.route_url(self.object_name_for_listing, _query=pparams), } return data
def get(self): params = {} pparams = {} fields = self.request.params.get('opt_fields', '') if fields: params['opt_fields'] = fields pparams['opt_fields'] = fields fields = fields.split(',') view_fields = fields + ['dateModified', 'id'] limit = self.request.params.get('limit', '') if limit: params['limit'] = limit pparams['limit'] = limit limit = int(limit) if limit.isdigit() and (100 if fields else 1000) >= int(limit) > 0 else 100 descending = bool(self.request.params.get('descending')) offset = self.request.params.get('offset', '') if descending: params['descending'] = 1 else: pparams['descending'] = 1 feed = self.request.params.get('feed', '') view_map = self.FEED.get(feed, self.VIEW_MAP) changes = view_map is self.CHANGES_VIEW_MAP if feed and feed in self.FEED: params['feed'] = feed pparams['feed'] = feed mode = self.request.params.get('mode', '') if mode and mode in view_map: params['mode'] = mode pparams['mode'] = mode view_limit = limit + 1 if offset else limit if changes: if offset: view_offset = decrypt(self.server.uuid, self.db.name, offset) if view_offset and view_offset.isdigit(): view_offset = int(view_offset) else: self.request.errors.add('params', 'offset', 'Offset expired/invalid') self.request.errors.status = 404 raise error_handler(self.request.errors) if not offset: view_offset = 'now' if descending else 0 else: if offset: view_offset = offset else: view_offset = '9' if descending else '' list_view = view_map.get(mode, view_map[u'']) if self.update_after: view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending, stale='update_after') else: view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending) if fields: if not changes and set(fields).issubset(set(self.FIELDS)): results = [ (dict([(i, j) for i, j in x.value.items() + [('id', x.id), ('dateModified', x.key)] if i in view_fields]), x.key) for x in view() ] elif changes and set(fields).issubset(set(self.FIELDS)): results = [ (dict([(i, j) for i, j in x.value.items() + [('id', x.id)] if i in view_fields]), x.key) for x in view() ] elif fields: self.LOGGER.info('Used custom fields for {} list: {}'.format(self.object_name_for_listing, ','.join(sorted(fields))), extra=context_unpack(self.request, {'MESSAGE_ID': self.log_message_id})) results = [ (self.serialize_func(self.request, i[u'doc'], view_fields), i.key) for i in view(include_docs=True) ] else: results = [ ({'id': i.id, 'dateModified': i.value['dateModified']} if changes else {'id': i.id, 'dateModified': i.key}, i.key) for i in view() ] if results: params['offset'], pparams['offset'] = results[-1][1], results[0][1] if offset and view_offset == results[0][1]: results = results[1:] elif offset and view_offset != results[0][1]: results = results[:limit] params['offset'], pparams['offset'] = results[-1][1], view_offset results = [i[0] for i in results] if changes: params['offset'] = encrypt(self.server.uuid, self.db.name, params['offset']) pparams['offset'] = encrypt(self.server.uuid, self.db.name, pparams['offset']) else: params['offset'] = offset pparams['offset'] = offset data = { 'data': results, 'next_page': { "offset": params['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=params), "uri": self.request.route_url(self.object_name_for_listing, _query=params) } } if descending or offset: data['prev_page'] = { "offset": pparams['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=pparams), "uri": self.request.route_url(self.object_name_for_listing, _query=pparams) } return data
def get(self): params = {} pparams = {} fields = self.request.params.get('opt_fields', '') if fields: params['opt_fields'] = fields pparams['opt_fields'] = fields fields = fields.split(',') view_fields = fields + ['dateModified', 'id'] limit = self.request.params.get('limit', '') if limit: params['limit'] = limit pparams['limit'] = limit limit = int(limit) if limit.isdigit() and ( 100 if fields else 1000) >= int(limit) > 0 else 100 descending = bool(self.request.params.get('descending')) offset = self.request.params.get('offset', '') if descending: params['descending'] = 1 else: pparams['descending'] = 1 feed = self.request.params.get('feed', '') view_map = self.FEED.get(feed, self.VIEW_MAP) changes = view_map is self.CHANGES_VIEW_MAP if feed and feed in self.FEED: params['feed'] = feed pparams['feed'] = feed mode = self.request.params.get('mode', '') if mode and mode in view_map: params['mode'] = mode pparams['mode'] = mode view_limit = limit + 1 if offset else limit if changes: if offset: view_offset = decrypt(self.server.uuid, self.db.name, offset) if view_offset and view_offset.isdigit(): view_offset = int(view_offset) else: self.request.errors.add('params', 'offset', 'Offset expired/invalid') self.request.errors.status = 404 raise error_handler(self.request.errors) if not offset: view_offset = 'now' if descending else 0 else: if offset: view_offset = offset else: view_offset = '9' if descending else '' list_view = view_map.get(mode, view_map[u'']) if self.update_after: view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending, stale='update_after') else: view = partial(list_view, self.db, limit=view_limit, startkey=view_offset, descending=descending) if fields: if not changes and set(fields).issubset(set(self.FIELDS)): results = [(dict([(i, j) for i, j in x.value.items() + [('id', x.id), ('dateModified', x.key)] if i in view_fields]), x.key) for x in view()] elif changes and set(fields).issubset(set(self.FIELDS)): results = [(dict([(i, j) for i, j in x.value.items() + [('id', x.id)] if i in view_fields]), x.key) for x in view()] elif fields: self.LOGGER.info('Used custom fields for {} list: {}'.format( self.object_name_for_listing, ','.join(sorted(fields))), extra=context_unpack( self.request, {'MESSAGE_ID': self.log_message_id})) results = [(self.serialize_func(self.request, i[u'doc'], view_fields), i.key) for i in view(include_docs=True)] else: results = [({ 'id': i.id, 'dateModified': i.value['dateModified'] } if changes else { 'id': i.id, 'dateModified': i.key }, i.key) for i in view()] if results: params['offset'], pparams['offset'] = results[-1][1], results[0][1] if offset and view_offset == results[0][1]: results = results[1:] elif offset and view_offset != results[0][1]: results = results[:limit] params['offset'], pparams['offset'] = results[-1][ 1], view_offset results = [i[0] for i in results] if changes: params['offset'] = encrypt(self.server.uuid, self.db.name, params['offset']) pparams['offset'] = encrypt(self.server.uuid, self.db.name, pparams['offset']) else: params['offset'] = offset pparams['offset'] = offset data = { 'data': results, 'next_page': { "offset": params['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=params), "uri": self.request.route_url(self.object_name_for_listing, _query=params) } } if descending or offset: data['prev_page'] = { "offset": pparams['offset'], "path": self.request.route_path(self.object_name_for_listing, _query=pparams), "uri": self.request.route_url(self.object_name_for_listing, _query=pparams) } return data
def restricted_view(**kw): """ A Cornice view that handles restricted resources. """ if 'permission' not in kw: kw['permission'] = 'authenticated' return view(**kw)
def json_view(**kw): """ A Cornice view that expects 'application/json' as content-type. """ kw['content_type'] = 'application/json' return view(**kw)