def get_tunneling(request): if request.method == "GET": method = request.GET.pop("_m", "GET") request.method = method if method in ["POST", "PUT", "PATCH"]: get_params = request.GET.mixed() valid_params = drop_reserved_params(get_params) request.body = six.b(json.dumps(valid_params)) request.content_type = "application/json" request._tunneled_get = True return handler(request)
def get_tunneling(request): if request.method == 'GET': method = request.GET.pop('_m', 'GET') request.method = method if method in ['POST', 'PUT', 'PATCH']: get_params = request.GET.mixed() valid_params = drop_reserved_params(get_params) request.body = six.b(json.dumps(valid_params)) request.content_type = 'application/json' request._tunneled_get = True return handler(request)
def get_collection(cls, **params): """ Query collection and return results. Notes: * Before validating that only model fields are present in params, reserved params, query params and all params starting with double underscore are dropped. * Params which have value "_all" are dropped. * When ``_count`` param is used, objects count is returned before applying offset and limit. :param bool _strict: If True ``params`` are validated to contain only fields defined on model, exception is raised if invalid fields are present. When False - invalid fields are dropped. Defaults to ``True``. :param bool _item_request: Indicates whether it is a single item request or not. When True and DataError happens on DB request, JHTTPNotFound is raised. JHTTPBadRequest is raised when False. Defaults to ``False``. :param list _sort: Field names to sort results by. If field name is prefixed with "-" it is used for "descending" sorting. Otherwise "ascending" sorting is performed by that field. Defaults to an empty list in which case sorting is not performed. :param list _fields: Names of fields which should be included or excluded from results. Fields to excluded should be prefixed with "-". Defaults to an empty list in which case all fields are returned. :param int _limit: Number of results per page. Defaults to None in which case all results are returned. :param int _page: Number of page. In conjunction with ``_limit`` is used to calculate results offset. Defaults to None in which case it is ignored. Params ``_page`` and ``_start` are mutually exclusive. :param int _start: Results offset. If provided ``_limit`` and ``_page`` params are ignored when calculating offset. Defaults to None. Params ``_page`` and ``_start`` are mutually exclusive. If not offset-related params are provided, offset equals to 0. :param Query query_set: Existing queryset. If provided, all queries are applied to it instead of creating new queryset. Defaults to None. :param _count: When provided, only results number is returned as integer. :param _explain: When provided, query performed(SQL) is returned as a string instead of query results. :param bool _raise_on_empty: When True JHTTPNotFound is raised if query returned no results. Defaults to False in which case error is just logged and empty query results are returned. :returns: Query results as ``sqlalchemy.orm.query.Query`` instance. May be sorted, offset, limited. :returns: Dict of {'field_name': fieldval}, when ``_fields`` param is provided. :returns: Number of query results as an int when ``_count`` param is provided. :returns: String representing query ran when ``_explain`` param is provided. :raises JHTTPNotFound: When ``_raise_on_empty=True`` and no results found. :raises JHTTPNotFound: When ``_item_request=True`` and ``sqlalchemy.exc.DataError`` exception is raised during DB query. Latter exception is raised when querying DB with an identifier of a wrong type. E.g. when querying Int field with a string. :raises JHTTPBadRequest: When ``_item_request=False`` and ``sqlalchemy.exc.DataError`` exception is raised during DB query. :raises JHTTPBadRequest: When ``sqlalchemy.exc.InvalidRequestError`` or ``sqlalchemy.exc.IntegrityError`` errors happen during DB query. """ log.debug('Get collection: {}, {}'.format(cls.__name__, params)) params.pop('__confirmation', False) _strict = params.pop('_strict', True) _item_request = params.pop('_item_request', False) _sort = _split(params.pop('_sort', [])) _fields = _split(params.pop('_fields', [])) _limit = params.pop('_limit', None) _page = params.pop('_page', None) _start = params.pop('_start', None) query_set = params.pop('query_set', None) _count = '_count' in params params.pop('_count', None) _explain = '_explain' in params params.pop('_explain', None) _raise_on_empty = params.pop('_raise_on_empty', False) if query_set is None: query_set = Session().query(cls) # Remove any __ legacy instructions from this point on params = dictset({ key: val for key, val in params.items() if not key.startswith('__') }) iterables_exprs, params = cls._pop_iterables(params) params = drop_reserved_params(params) if _strict: _check_fields = [ f.strip('-+') for f in list(params.keys()) + _fields + _sort ] cls.check_fields_allowed(_check_fields) else: params = cls.filter_fields(params) process_lists(params) process_bools(params) # If param is _all then remove it params.pop_by_values('_all') try: query_set = query_set.filter_by(**params) # Apply filtering by iterable expressions for expr in iterables_exprs: query_set = query_set.from_self().filter(expr) _total = query_set.count() if _count: return _total # Filtering by fields has to be the first thing to do on # the query_set! query_set = cls.apply_fields(query_set, _fields) query_set = cls.apply_sort(query_set, _sort) if _limit is not None: _start, _limit = process_limit(_start, _page, _limit) query_set = query_set.offset(_start).limit(_limit) if not query_set.count(): msg = "'%s(%s)' resource not found" % (cls.__name__, params) if _raise_on_empty: raise JHTTPNotFound(msg) else: log.debug(msg) except DataError as ex: if _item_request: msg = "'{}({})' resource not found".format( cls.__name__, params) raise JHTTPNotFound(msg, explanation=ex.message) else: raise JHTTPBadRequest(str(ex), extra={'data': ex}) except (InvalidRequestError, ) as ex: raise JHTTPBadRequest(str(ex), extra={'data': ex}) query_sql = str(query_set).replace('\n', '') if _explain: return query_sql log.debug('get_collection.query_set: %s (%s)', cls.__name__, query_sql) if _fields: query_set = cls.add_field_names(query_set, _fields) query_set._nefertari_meta = dict(total=_total, start=_start, fields=_fields) return query_set
def get_collection(cls, **params): """ Query collection and return results. Notes: * Before validating that only model fields are present in params, reserved params, query params and all params starting with double underscore are dropped. * Params which have value "_all" are dropped. * When ``_count`` param is used, objects count is returned before applying offset and limit. :param bool __strict: If True ``params`` are validated to contain only fields defined on model, exception is raised if invalid fields are present. When False - invalid fields are dropped. Defaults to ``True``. :param bool _item_request: Indicates whether it is a single item request or not. When True and DataError happens on DB request, JHTTPNotFound is raised. JHTTPBadRequest is raised when False. Defaults to ``False``. :param list _sort: Field names to sort results by. If field name is prefixed with "-" it is used for "descending" sorting. Otherwise "ascending" sorting is performed by that field. Defaults to an empty list in which case sorting is not performed. :param list _fields: Names of fields which should be included or excluded from results. Fields to excluded should be prefixed with "-". Defaults to an empty list in which case all fields are returned. :param int _limit: Number of results per page. Defaults to None in which case all results are returned. :param int _page: Number of page. In conjunction with ``_limit`` is used to calculate results offset. Defaults to None in which case it is ignored. Params ``_page`` and ``_start` are mutually exclusive. :param int _start: Results offset. If provided ``_limit`` and ``_page`` params are ignored when calculating offset. Defaults to None. Params ``_page`` and ``_start`` are mutually exclusive. If not offset-related params are provided, offset equals to 0. :param Query query_set: Existing queryset. If provided, all queries are applied to it instead of creating new queryset. Defaults to None. :param _count: When provided, only results number is returned as integer. :param _explain: When provided, query performed(SQL) is returned as a string instead of query results. :param bool __raise_on_empty: When True JHTTPNotFound is raised if query returned no results. Defaults to False in which case error is just logged and empty query results are returned. :returns: Query results as ``sqlalchemy.orm.query.Query`` instance. May be sorted, offset, limited. :returns: Dict of {'field_name': fieldval}, when ``_fields`` param is provided. :returns: Number of query results as an int when ``_count`` param is provided. :returns: String representing query ran when ``_explain`` param is provided. :raises JHTTPNotFound: When ``__raise_on_empty=True`` and no results found. :raises JHTTPNotFound: When ``_item_request=True`` and ``sqlalchemy.exc.DataError`` exception is raised during DB query. Latter exception is raised when querying DB with an identifier of a wrong type. E.g. when querying Int field with a string. :raises JHTTPBadRequest: When ``_item_request=False`` and ``sqlalchemy.exc.DataError`` exception is raised during DB query. :raises JHTTPBadRequest: When ``sqlalchemy.exc.InvalidRequestError`` or ``sqlalchemy.exc.IntegrityError`` errors happen during DB query. """ log.debug('Get collection: {}, {}'.format(cls.__name__, params)) params.pop('__confirmation', False) __strict = params.pop('__strict', True) _item_request = params.pop('_item_request', False) _sort = _split(params.pop('_sort', [])) _fields = _split(params.pop('_fields', [])) _limit = params.pop('_limit', None) _page = params.pop('_page', None) _start = params.pop('_start', None) query_set = params.pop('query_set', None) _count = '_count' in params params.pop('_count', None) _explain = '_explain' in params params.pop('_explain', None) __raise_on_empty = params.pop('__raise_on_empty', False) if query_set is None: query_set = Session().query(cls) # Remove any __ legacy instructions from this point on params = dictset({ key: val for key, val in params.items() if not key.startswith('__') }) iterables_exprs, params = cls._pop_iterables(params) params = drop_reserved_params(params) if __strict: _check_fields = [ f.strip('-+') for f in list(params.keys()) + _fields + _sort] cls.check_fields_allowed(_check_fields) else: params = cls.filter_fields(params) process_lists(params) process_bools(params) # If param is _all then remove it params.pop_by_values('_all') try: query_set = query_set.filter_by(**params) # Apply filtering by iterable expressions for expr in iterables_exprs: query_set = query_set.from_self().filter(expr) _total = query_set.count() if _count: return _total # Filtering by fields has to be the first thing to do on # the query_set! query_set = cls.apply_fields(query_set, _fields) query_set = cls.apply_sort(query_set, _sort) if _limit is not None: _start, _limit = process_limit(_start, _page, _limit) query_set = query_set.offset(_start).limit(_limit) if not query_set.count(): msg = "'%s(%s)' resource not found" % (cls.__name__, params) if __raise_on_empty: raise JHTTPNotFound(msg) else: log.debug(msg) except DataError as ex: if _item_request: msg = "'{}({})' resource not found".format( cls.__name__, params) raise JHTTPNotFound(msg, explanation=ex.message) else: raise JHTTPBadRequest(str(ex), extra={'data': ex}) except (InvalidRequestError,) as ex: raise JHTTPBadRequest(str(ex), extra={'data': ex}) query_sql = str(query_set).replace('\n', '') if _explain: return query_sql log.debug('get_collection.query_set: %s (%s)', cls.__name__, query_sql) if _fields: query_set = cls.add_field_names(query_set, _fields) query_set._nefertari_meta = dict( total=_total, start=_start, fields=_fields) return query_set
def get_collection(cls, **params): """ Params may include '_limit', '_page', '_sort', '_fields'. Returns paginated and sorted query set. Raises JHTTPBadRequest for bad values in params. """ log.debug('Get collection: {}, {}'.format(cls.__name__, params)) params.pop('__confirmation', False) _strict = params.pop('_strict', True) _item_request = params.pop('_item_request', False) _sort = _split(params.pop('_sort', [])) _fields = _split(params.pop('_fields', [])) _limit = params.pop('_limit', None) _page = params.pop('_page', None) _start = params.pop('_start', None) query_set = params.pop('query_set', None) _count = '_count' in params params.pop('_count', None) _explain = '_explain' in params params.pop('_explain', None) _raise_on_empty = params.pop('_raise_on_empty', False) if query_set is None: query_set = cls.objects # Remove any __ legacy instructions from this point on params = dictset({ key: val for key, val in params.items() if not key.startswith('__') }) params = drop_reserved_params(params) if _strict: _check_fields = [ f.strip('-+') for f in list(params.keys()) + _fields + _sort] cls.check_fields_allowed(_check_fields) else: params = cls.filter_fields(params) process_lists(params) process_bools(params) # If param is _all then remove it params.pop_by_values('_all') try: query_set = query_set(**params) _total = query_set.count() if _count: return _total # Filtering by fields has to be the first thing to do on the # query_set! query_set = cls.apply_fields(query_set, _fields) query_set = cls.apply_sort(query_set, _sort) if _limit is not None: _start, _limit = process_limit(_start, _page, _limit) query_set = query_set[_start:_start+_limit] if not query_set.count(): msg = "'%s(%s)' resource not found" % (cls.__name__, params) if _raise_on_empty: raise JHTTPNotFound(msg) else: log.debug(msg) except mongo.ValidationError as ex: if _item_request: msg = "'%s(%s)' resource not found" % (cls.__name__, params) raise JHTTPNotFound(msg, explanation=ex.message) else: raise JHTTPBadRequest(str(ex), extra={'data': ex}) except mongo.InvalidQueryError as ex: raise JHTTPBadRequest(str(ex), extra={'data': ex}) if _explain: return query_set.explain() log.debug('get_collection.query_set: %s(%s)', cls.__name__, query_set._query) query_set._nefertari_meta = dict( total=_total, start=_start, fields=_fields) return query_set