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
Exemple #2
0
    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
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #7
0
def restricted_view(**kw):
    """ A Cornice view that handles restricted resources.
    """
    if 'permission' not in kw:
        kw['permission'] = 'authenticated'
    return view(**kw)
Exemple #8
0
def json_view(**kw):
    """ A Cornice view that expects 'application/json' as content-type.
    """
    kw['content_type'] = 'application/json'
    return view(**kw)
Exemple #9
0
def json_view(**kw):
    """ A Cornice view that expects 'application/json' as content-type.
    """
    kw['content_type'] = 'application/json'
    return view(**kw)
Exemple #10
0
def restricted_view(**kw):
    """ A Cornice view that handles restricted resources.
    """
    if 'permission' not in kw:
        kw['permission'] = 'authenticated'
    return view(**kw)