Beispiel #1
0
    def get(self, id_: str, path: str) -> Response:
        """
        GET object with id = id_ from the database.

        :param id_ : Item ID
        :param path : Path for Item ( Specified in APIDoc @id)
        """
        id_ = str(id_)
        auth_response = check_authentication_response()
        if isinstance(auth_response, Response):
            return auth_response

        class_type = get_doc().collections[path]["collection"].class_.title

        if checkClassOp(class_type, "GET"):
            # Check if class_type supports GET operation
            try:
                # Try getting the Item based on ID and Class type
                response = crud.get(id_,
                                    class_type,
                                    api_name=get_api_name(),
                                    session=get_session())

                return set_response_headers(
                    jsonify(hydrafy(response, path=path)))

            except (ClassNotFound, InstanceNotFound) as e:
                status_code, message = e.get_HTTP()
                return set_response_headers(jsonify(message),
                                            status_code=status_code)
        abort(405)
Beispiel #2
0
    def delete(self, id_: str, path: str) -> Response:
        """Delete object with id=id_ from database."""
        id_ = str(id_)
        auth_response = check_authentication_response()
        if isinstance(auth_response, Response):
            return auth_response

        class_type = get_doc().collections[path]["collection"].class_.title

        if checkClassOp(class_type, "DELETE"):
            # Check if class_type supports PUT operation
            try:
                # Delete the Item with ID == id_
                crud.delete(id_, class_type, session=get_session())
                response = {
                    "message":
                    "Object with ID {} successfully deleted".format(id_)
                }
                return set_response_headers(jsonify(response))

            except (ClassNotFound, InstanceNotFound) as e:
                status_code, message = e.get_HTTP()
                return set_response_headers(jsonify(message),
                                            status_code=status_code)

        abort(405)
Beispiel #3
0
    def delete(self, path, int_list):
        """
        To delete multiple objects
        :param path: endpoints
        :param int_list: Optional String containing ',' separated ID's
        :return:
        """
        auth_response = check_authentication_response()
        if isinstance(auth_response, Response):
            return auth_response
        class_type = get_doc().collections[path]["collection"].class_.title

        if checkClassOp(class_type, "DELETE"):
            # Check if class_type supports PUT operation
            try:
                # Delete the Item with ID == id_
                crud.delete_multiple(int_list,
                                     class_type,
                                     session=get_session())
                response = {
                    "message":
                    "Object with ID {} successfully deleted".format(
                        int_list.split(','))
                }
                return set_response_headers(jsonify(response))

            except (ClassNotFound, InstanceNotFound) as e:
                status_code, message = e.get_HTTP()
                return set_response_headers(jsonify(message),
                                            status_code=status_code)

        abort(405)
Beispiel #4
0
    def put(self, id_: str, path: str) -> Response:
        """Add new object_ optional <id_> parameter using HTTP PUT.

        :param id_ - ID of Item to be updated
        :param path - Path for Item type( Specified in APIDoc @id) to be updated
        """
        id_ = str(id_)
        auth_response = check_authentication_response()
        if isinstance(auth_response, Response):
            return auth_response

        class_type = get_doc().collections[path]["collection"].class_.title
        if checkClassOp(class_type, "PUT"):
            # Check if class_type supports PUT operation
            object_ = json.loads(request.data.decode('utf-8'))
            obj_type = getType(class_type, "PUT")
            # Load new object and type
            if validObject(object_) and object_["@type"] == obj_type:
                    try:
                        # Add the object with given ID
                        object_id = crud.insert(object_=object_, id_=id_, session=get_session())
                        headers_ = [{"Location": "{}{}/{}/{}".format(
                                get_hydrus_server_url(), get_api_name(), path, object_id)}]
                        response = {
                            "message": "Object with ID {} successfully added".format(object_id)}
                        return set_response_headers(
                            jsonify(response), headers=headers_, status_code=201)
                    except (ClassNotFound, InstanceExists, PropertyNotFound) as e:
                        status_code, message = e.get_HTTP()
                        return set_response_headers(jsonify(message), status_code=status_code)
            else:
                return set_response_headers(jsonify({400: "Data is not valid"}), status_code=400)
        else:
            abort(405)
Beispiel #5
0
    def post(self, id_: str, path: str) -> Response:
        """Update object of type<path> at ID<id_> with new object_ using HTTP POST.

        :param id_ - ID of Item to be updated
        :param path - Path for Item type( Specified in APIDoc @id)
        """
        id_ = str(id_)
        auth_response = check_authentication_response()
        if isinstance(auth_response, Response):
            return auth_response

        class_type = get_doc().collections[path]["collection"].class_.title

        if checkClassOp(class_type, "POST"):
            # Check if class_type supports POST operation
            object_ = json.loads(request.data.decode('utf-8'))
            obj_type = getType(class_type, "POST")
            # Load new object and type
            if validObject(object_):
                if object_["@type"] == obj_type:
                    try:
                        # Update the right ID if the object is valid and matches
                        # type of Item
                        object_id = crud.update(object_=object_,
                                                id_=id_,
                                                type_=object_["@type"],
                                                session=get_session(),
                                                api_name=get_api_name())
                        headers_ = [{
                            "Location":
                            "{}/{}/{}".format(get_hydrus_server_url(),
                                              get_api_name(), path, object_id)
                        }]
                        response = {
                            "message":
                            "Object with ID {} successfully updated".format(
                                object_id)
                        }
                        return set_response_headers(jsonify(response),
                                                    headers=headers_)

                    except (ClassNotFound, InstanceNotFound, InstanceExists,
                            PropertyNotFound) as e:
                        status_code, message = e.get_HTTP()
                        return set_response_headers(jsonify(message),
                                                    status_code=status_code)

            return set_response_headers(jsonify({400: "Data is not valid"}),
                                        status_code=400)

        abort(405)
Beispiel #6
0
def items_delete_response(path: str, int_list="") -> Response:
    """
    Handles DELETE operation to insert multiple items.

    :param path: Path for Item Collection
    :type path: str
    :param int_list: Optional String containing ',' separated ID's
    :type int_list: List
    :return: Appropriate response for the DELETE operation on multiple items.
    :rtype: Response
    """
    _, parsed_classes = get_collections_and_parsed_classes()
    if path in parsed_classes:
        class_type = getType(path, "DELETE")

    if checkClassOp(class_type, "DELETE"):
        # Check if class_type supports PUT operation
        try:
            # Delete the Item with ID == id_
            crud.delete_multiple(int_list, class_type, session=get_session())
            method = "DELETE"
            path_url = f"{get_hydrus_server_url()}{get_api_name()}/{path}"
            last_job_id = crud.get_last_modification_job_id(session=get_session())
            id_list = int_list.split(',')
            for item in id_list:
                resource_url = path_url + item
                new_job_id = crud.insert_modification_record(method,
                                                             resource_url,
                                                             session=get_session())
                send_sync_update(socketio=socketio, new_job_id=new_job_id,
                                 last_job_id=last_job_id, method=method,
                                 resource_url=resource_url)
                last_job_id = new_job_id
            status_description = f"Objects with ID {id_list} successfully deleted"
            status = HydraStatus(code=200,
                                 title="Objects successfully deleted",
                                 desc=status_description)
            return set_response_headers(jsonify(status.generate()))

        except (ClassNotFound, InstanceNotFound) as e:
            error = e.get_HTTP()
            return error_response(error)

    abort(405)
Beispiel #7
0
 def put(self, id_: str, path: str) -> Response:
     """
     Add new object_ optional <id_> parameter using HTTP PUT.
     :param id_ - ID of Item to be updated
     :param path - Path for Item type( Specified in APIDoc @id) to be updated
     """
     id_ = str(id_)
     collections, parsed_classes = get_collections_and_parsed_classes()
     is_collection = False
     if path in parsed_classes:
         class_path = path
     if path in collections:
         item_class = collections[path]["collection"]
         class_path = item_class.path
         is_collection = True
     if checkClassOp(class_path, "PUT"):
         return items_put_check_support(id_, class_path, path,
                                        is_collection)
     abort(405)
Beispiel #8
0
 def post(self, id_: str, path: str) -> Response:
     """
     Update object of type<path> at ID<id_> with new object_ using HTTP POST.
     :param id_ - ID of Item to be updated
     :param path - Path for Item type( Specified in APIDoc @id)
     """
     id_ = str(id_)
     collections, parsed_classes = get_collections_and_parsed_classes()
     is_collection = False
     if path in parsed_classes:
         class_path = path
     if path in collections:
         item_class = collections[path]["collection"]
         class_path = item_class.path
         is_collection = True
     object_ = json.loads(request.data.decode('utf-8'))
     if checkClassOp(class_path, "POST") and check_writeable_props(
             class_path, object_):
         return items_post_check_support(id_, object_, class_path, path,
                                         is_collection)
     abort(405)
Beispiel #9
0
 def delete(self, id_: str, path: str) -> Response:
     """
     Delete object with id=id_ from database.
     :param id_ - ID of Item to be deleted
     :param path - Path for Item type( Specified in APIDoc @id) to be deleted
     """
     id_ = str(id_)
     collections, parsed_classes = get_collections_and_parsed_classes()
     is_collection = False
     if path in parsed_classes:
         class_path = path
         class_type = parsed_classes[path]['class'].title
     if path in collections:
         item_class = collections[path]["collection"]
         class_type = item_class.name
         # Get path of the collection-class
         class_path = item_class.path
         is_collection = True
     if checkClassOp(class_path, "DELETE"):
         return items_delete_check_support(id_, class_type, path,
                                           is_collection)
     abort(405)
Beispiel #10
0
 def get(self, id_: str, path: str) -> Response:
     """
     GET object with id = id_ from the database.
     :param id_ : Item ID
     :param path : Path for Item ( Specified in APIDoc @id)
     :return : object with id=id_
     """
     id_ = str(id_)
     collections, parsed_classes = get_collections_and_parsed_classes()
     is_collection = False
     if path in parsed_classes:
         class_path = path
         class_type = parsed_classes[path]['class'].title
     if path in collections:
         item_class = collections[path]["collection"]
         class_type = item_class.name
         # Get path of the collection-class
         class_path = item_class.path
         is_collection = True
     if checkClassOp(class_path, "GET"):
         return items_get_check_support(id_, class_type, class_path, path,
                                        is_collection)
     abort(405)