def get_requests(): """ Retrieve paginated details for requests. :param int page: the page number to retrieve. Defaults to 1 :param int per_page: the amount of items on each page. Defaults to 20. Ignored if value exceeds configuration's CACHITO_MAX_PER_PAGE. :rtype: flask.Response """ # Check if the user is filtering requests by state state = flask.request.args.get('state') # Default verbose flag to False verbose = str_to_bool(flask.request.args.get('verbose', False)) max_per_page = flask.current_app.config['CACHITO_MAX_PER_PAGE'] # The call to `paginate` will inspect the current HTTP request for the # pagination parameters `page` and `per_page`. query = Request.query if state: if state not in RequestStateMapping.get_state_names(): states = ':'.join(RequestStateMapping.get_state_names()) raise ValidationError( f'{state} is not a valid request state. Valid states are: {states}' ) state_int = RequestStateMapping.__members__[state].value query = query.join(RequestState, Request.request_state_id == RequestState.id) query = query.filter(RequestState.state == state_int) pagination_query = query.paginate(max_per_page=max_per_page) requests = pagination_query.items response = { 'items': [request.to_json(verbose=verbose) for request in requests], 'meta': pagination_metadata(pagination_query, verbose=verbose), } return flask.jsonify(response)
def get_requests(): """ Retrieve paginated details for requests. :rtype: flask.Response """ # Check if the user is filtering requests by state state = flask.request.args.get("state") # Default verbose flag to False verbose = str_to_bool(flask.request.args.get("verbose", False)) max_per_page = flask.current_app.config["CACHITO_MAX_PER_PAGE"] # The call to `paginate` will inspect the current HTTP request for the # pagination parameters `page` and `per_page`. query = Request.query.order_by(Request.id.desc()) if state: if state not in RequestStateMapping.get_state_names(): states = ", ".join(RequestStateMapping.get_state_names()) raise ValidationError( f"{state} is not a valid request state. Valid states are: {states}" ) state_int = RequestStateMapping.__members__[state].value query = query.join(RequestState, Request.request_state_id == RequestState.id) query = query.filter(RequestState.state == state_int) try: per_page = int(flask.request.args.get("per_page", 10)) except ValueError: per_page = 10 pagination_query = query.paginate(per_page=per_page, max_per_page=max_per_page) requests = pagination_query.items query_params = {} if state: query_params["state"] = state if verbose: query_params["verbose"] = verbose response = { "items": [request.to_json(verbose=verbose) for request in requests], "meta": pagination_metadata(pagination_query, **query_params), } return flask.jsonify(response)
def get_requests(): """ Retrieve paginated details for requests. :rtype: flask.Response """ # Check if the user is filtering requests by state state = flask.request.args.get("state") # Default verbose flag to False verbose = str_to_bool(flask.request.args.get("verbose", False)) max_per_page = flask.current_app.config["CACHITO_MAX_PER_PAGE"] # The call to `paginate` will inspect the current HTTP request for the # pagination parameters `page` and `per_page`. query = Request.query.order_by(Request.id.desc()) if state: if state not in RequestStateMapping.get_state_names(): states = ", ".join(RequestStateMapping.get_state_names()) raise ValidationError( f"{state} is not a valid request state. Valid states are: {states}" ) state_int = RequestStateMapping.__members__[state].value query = query.join(RequestState, Request.request_state_id == RequestState.id) query = query.filter(RequestState.state == state_int) repo = flask.request.args.get("repo") if repo: query = query.filter(Request.repo == repo) ref = flask.request.args.get("ref") if ref: if not is_request_ref_valid(ref): raise ValidationError(f"{ref} is not a valid ref.") query = query.filter(Request.ref == ref) pkg_managers = flask.request.args.getlist("pkg_manager") if pkg_managers: pkg_manager_ids = [] for name in pkg_managers: if not name: # Ignore if pkg_manager= presents in the querystring continue pkg_manager: PackageManager = PackageManager.get_by_name(name) if pkg_manager is None: raise ValidationError( f"Cachito does not have package manager {name}.") pkg_manager_ids.append(pkg_manager.id) if pkg_manager_ids: query = (query.join(PackageManager, Request.pkg_managers).filter( PackageManager.id.in_(pkg_manager_ids)).group_by( Request.id).having( func.count(PackageManager.id) == len(pkg_manager_ids))) try: per_page = int(flask.request.args.get("per_page", 10)) except ValueError: per_page = 10 pagination_query = query.paginate(per_page=per_page, max_per_page=max_per_page) requests = pagination_query.items query_params = {} if state: query_params["state"] = state if verbose: query_params["verbose"] = verbose response = { "items": [request.to_json(verbose=verbose) for request in requests], "meta": pagination_metadata(pagination_query, **query_params), } return flask.jsonify(response)