Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)