コード例 #1
0
def get_saved_searches_by_id(saved_search_id):
  """Get a saved search by ID.

  Endpoint returning saved search JSON representation by it's ID. Request
  should contain saved search ID. If there isn't any saved search with provided
  ID, 404 status code and "No saved search with id <id> found" message will be
  returned.

  Args:
    saved_search_id (int): ID of saved search to look for.

  Returns:
    Flask Response object containing JSON representation of saved search or
    error message if saved search was not found.
  """
  saved_search = SavedSearch.query.filter(
      SavedSearch.id == saved_search_id
  ).first()

  if saved_search:
    response_data = {
        SavedSearch.__name__: saved_search
    }

    return json_success_response(response_data)
  return make_error_response(
      "No saved search with id {} found".format(
          saved_search_id,
      ),
      404,
      force_json=True,
  )
コード例 #2
0
def delete_saved_search(saved_search_id):
  """Delete saved search by ID.

  Endpoint deleting saved search by it's ID. Request should contain saved
  search ID. If saved search is successfully deleted, it's ID will be returned.
  If there isn't any saved search with provided ID, 404 status code and
  "No saved search with id <id> found for current user" message will be
  returned.

  Args:
    saved_search_id (int): ID of saved search to delete

  Returns:
    Flask Response object containing ID of deleted saved search or error
    message if saved search is not found.
  """
  user = login.get_current_user(use_external_user=False)

  saved_search = user.saved_searches.filter(
      SavedSearch.id == saved_search_id
  ).first()

  if not saved_search:
    return make_error_response(
        "No saved search with id {} found for current user".format(
            saved_search_id,
        ),
        404,
        force_json=True,
    )

  db.session.delete(saved_search)
  db.session.commit()

  return json_success_response({"deleted": saved_search_id})
コード例 #3
0
def create_saved_search():
  """Create a saved search.

  Endpoint creating saved search with provided parameters. Request payload
  should contain saved search `name`, `search_type` and `object_type`. Also it
  could contain saved search `filters`. If there will any error during saved
  search creation, 400 status code and corresponding error will be returned.

  Returns:
    Flask Response object containing JSON representation of created saved
    search or error message if error occurred.
  """
  user = login.get_current_user(use_external_user=False)

  data = request.get_json()

  try:
    search = SavedSearch(
        data.get("name"),
        data.get("object_type"),
        user,
        data.get("search_type"),
        data.get("filters"),
    )
  except ValidationError as error:
    return make_error_response(error.message, 400, force_json=True)

  user.saved_searches.append(search)
  db.session.commit()

  return json_success_response(search)
コード例 #4
0
  def handle_model_clone(cls, query):
    """Process cloning of objects.

    Args:
        query: Dict with parameters for cloning procedure. It should have
            following structure:
            {
              "sourceObjectIds": [1, 2],
              "destination": {"type": "Audit", "id": 2},  # optional
              "mappedObjects":[]  # optional
            }.

    Returns:
        Response with status code 200 in case of success and 400 if provided
        parameters are invalid.
    """
    source_objs, destination, mapped_types = cls._parse_query(query)

    clonned_objs = {}
    for source_obj in source_objs:
      if (
          not permissions.is_allowed_read_for(source_obj) or
          not permissions.is_allowed_create(
              source_obj.type, source_obj.id, destination.context_id
          )
      ):
        raise exceptions.Forbidden()
      clonned_objs[source_obj] = cls._copy_obj(source_obj, destination)

    for target, mapped_obj in cls._collect_mapped(source_objs, mapped_types):
      clonned_objs[mapped_obj] = cls._copy_obj(mapped_obj, target)

    cls._set_parent_context(clonned_objs.values(), destination)
    db.session.flush()

    for source, clonned in clonned_objs.items():
      cls._clone_cads(source, clonned)

    if clonned_objs:
      db.session.add(log_event(db.session, flush=False))
    db.session.commit()

    from ggrc.query import views
    collections = []
    if cls.RETURN_OBJ_JSON:
      for obj in clonned_objs:
        collections.append(
            views.build_collection_representation(cls, obj.log_json())
        )
    return views.json_success_response(collections, datetime.datetime.utcnow())
コード例 #5
0
def get_saved_searches_by_type(object_type):
    user = login.get_current_user(use_external_user=False)

    db_query_result = user.saved_searches.filter(
        SavedSearch.object_type == object_type).order_by(
            SavedSearch.created_at.desc()).offset(
                request.args.get("offset")).limit(
                    request.args.get("limit")).all()

    response_data = {
        "object_name": SavedSearch.__name__,
        "count": len(db_query_result),
        "total": user.saved_searches.count(),
        "values": db_query_result,
    }

    return json_success_response(response_data)
コード例 #6
0
def delete_saved_search(saved_search_id):
    user = login.get_current_user(use_external_user=False)

    saved_search = user.saved_searches.filter(
        SavedSearch.id == saved_search_id).first()

    if not saved_search:
        return make_error_response(
            "No saved search with id {} found for current user".format(
                saved_search_id, ),
            404,
            force_json=True,
        )

    db.session.delete(saved_search)
    db.session.commit()

    return json_success_response({"deleted": saved_search_id})
コード例 #7
0
def create_saved_search():
    user = login.get_current_user(use_external_user=False)

    data = request.get_json()

    try:
        search = SavedSearch(
            data.get("query"),
            data.get("name"),
            data.get("object_type"),
            user,
        )
    except ValidationError as error:
        return make_error_response(error.message, 400, force_json=True)

    user.saved_searches.append(search)
    db.session.commit()

    return json_success_response(search)
コード例 #8
0
def get_saved_searches_by_type(search_type):
  """Get saved searches by type.

  Endpoint returning saved searches JSON representation by their type. Request
  should contain saved search type and can include offset and limit parameters.
  If there isn't any saved searches with provided type, empty response will be
  returned.

  Args:
    search_type (str): Type of saved search.

  Returns:
    Flask Response object with object_name, count, total and values as payload.
  """
  user = login.get_current_user(use_external_user=False)
  all_objects = user.saved_searches.filter(
      SavedSearch.search_type == search_type
  )
  if search_type == SavedSearch.ADVANCED_SEARCH or \
      (search_type == SavedSearch.GLOBAL_SEARCH and
          "object_type" in request.args):
    all_objects = all_objects.filter(
        SavedSearch.object_type == request.args.get("object_type")
    )
  db_query_result = all_objects.order_by(
      SavedSearch.created_at.desc()
  ).offset(
      request.args.get("offset")
  ).limit(
      request.args.get("limit")
  ).all()

  response_data = {
      "object_name": SavedSearch.__name__,
      "count": len(db_query_result),
      "total": all_objects.count(),
      "values": db_query_result,
  }

  return json_success_response(response_data)