Exemplo n.º 1
0
def handle_resource(dbname, resource_name, primary_key):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # The design pattern is that the primary key comes in in the form value1_value2_value3
        key_columns = primary_key.split(key_delimiter)

        # Merge dbname and resource names to form the dbschema.tablename element for the resource.
        # This should probably occur in the data service and not here.
        resource = dbname + "." + resource_name


        if request.method == 'GET':
            # Look for the fields=f1,f2, ... argument in the query parameters.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            # Call the data service layer.
            result = ds.get_by_primary_key(resource, key_columns, field_list=field_list)

            if result:
                result = process_result(result, dbname, resource_name, primary_key)
                result = {'data': result}
                result = compute_links(result)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data, status=200, mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

            if result:
                # We managed to find a row. Return JSON data and 200
                result_data = json.dumps(result, default=str)
                resp = Response(result_data, status=200, mimetype='application/json')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        elif request.method == 'DELETE':
            result = ds.delete(resource, key_columns)
            if result and result > 0:
                resp = Response("OK", status=200, mimetype='text/plain')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        elif request.method == 'PUT':
            new_r = request.get_json()
            result = ds.update(resource, key_columns, new_r)
            if result and result == 1:
                resp = Response("OK UPDATED", status=200, mimetype="text/plain")

        else:
            resp = Response("I don't recognize this method", status = 422, mimetype="text/plain")

    except Exception as e:
        # We need a better overall approach to generating correct errors.
        utils.debug_message("Something awful happened, e = ", e)

    return resp
Exemplo n.º 2
0
def handle_collection(dbname, resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # Form the compound resource names dbschema.table_name
        if request.args.get("children"):
            return handle_children(dbname, resource_name, request.args)

        resource = dbname + "." + resource_name

        if request.method == "GET":
            # Get the field list if it exists.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            limit = request.args.get("limit", "10")
            offset = request.args.get("offset", "0")
            order_by = request.args.get("order_by", None)

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            tmp = None
            for k, v in request.args.items():
                if (not k == "fields") and (not k == "limit") and (not k == "offset") and \
                        (not k == "order_by"):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Find by template.
            result = ds.get_by_template(resource, tmp, field_list=field_list, limit=limit, offset=offset, \
                                        order_by=order_by)

            if result:
                result = {"data": result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == "POST":
            print(request)
            new_r = request.get_json()
            result = ds.create(resource, new_r)
            if result and result == 1:
                resp = Response("CREATED", status=201, mimetype="text/plain")
    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 3
0
def handle_children(dbname, resource_name, params):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # Form the compound resource names dbschema.table_name
        resource = dbname + "." + resource_name

        if request.method == "GET":
            # Get the field list if it exists.
            field_list = params.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            limit = params.get("limit", "10")
            offset = params.get("offset", "0")
            order_by = params.get("order_by", None)

            conditions = params.get("children", None).split(",")
            tmp = {}
            children = []
            for elem in conditions:
                if "=" not in elem:
                    children.append(elem.lower())
                else:
                    elem = elem.split("=")
                    tmp[elem[0]] = elem[1].lower()

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            # tmp = None
            # for k,v in params.items():
            #     if (not k == "fields") and (not k == "limit") and (not k == "offset") and \
            #             (not k == "order_by"):
            #         if tmp is None:
            #             tmp = {}
            #         tmp[k] = v

            # Find by template.
            result = ds.get_by_join(resource, children, tmp, field_list=field_list, limit=limit, offset=offset, \
                                        order_by=order_by)

            if result:
                result = {"data":result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data, status=200, mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 4
0
def handle_resource(dbname, resource_name, primary_key):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # The design pattern is that the primary key comes in in the form value1_value2_value3
        key_columns = primary_key.split(key_delimiter)

        # Merge dbname and resource names to form the dbschema.tablename element for the resource.
        # This should probably occur in the data service and not here.
        resource = dbname + "." + resource_name

        if request.method == "GET":
            # Look for the fields=f1,f2, ... argument in the query parameters.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")
            # Call the data service layer.
            result = ds.get_by_primary_key(resource, key_columns, field_list=field_list)
            if result:
                # We managed to find a row. Return JSON data and 200
                result_data = json.dumps(result, default=str)
                resp = Response(result_data, status=200, mimetype='application/json')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        elif request.method == "DELETE":
            result = ds.delete(resource, key_columns)
            if result and result >= 1:
                resp = Response("OK", status=200, mimetype='text/plain')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        else:
            resp = Response("I am a teapot thath will not PUT", status=422, mimetype='text/plain')

        # if result:
        #     # We managed to find a row. Return JSON data and 200
        #     result_data = json.dumps(result, default=str)
        #     resp = Response(result_data, status=200, mimetype='application/json')
        # else:
        #     # We did not get an exception and we did not get data, therefore this is 404 not found.
        #     resp = Response("Not found", status=404, mimetype="text/plain")
    except Exception as e:
        # We need a better overall approach to generating correct errors.
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 5
0
def handle_children(dbname, resource_name, params):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # Form the compound resource names dbschema.table_name
        resource = dbname + "." + resource_name

        if request.method == "GET":
            # Get the field list if it exists.
            field_list = params.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            limit = params.get("limit", "10")
            offset = params.get("offset", "0")
            order_by = params.get("order_by", None)

            children = params.get("children", None).split(",")
            tmp = {}

            for k, v in params.items():
                if (not k == "fields") and (not k == "limit") and (not k == "offset") and \
                        (not k == "order_by") and (not k == "children"):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            result = ds.get_by_join(resource, children, tmp, field_list=field_list, limit=limit, offset=offset, \
                                        order_by=order_by)

            if result:
                result = {"data": result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 6
0
def handle_collection(dbname, resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # Form the compound resource names dbschema.table_name
        resource = dbname + "." + resource_name

        # Get the field list if it exists.
        field_list = request.args.get('fields', None)
        if field_list is not None:
            field_list = field_list.split(",")

        # The query string is of the form ?f1=v1&f2=v2& ...
        # This maps to a query template of the form { "f1" : "v1", ... }
        # We need to ignore the fields parameters.
        tmp = None
        for k, v in request.args.items():
            if not k == 'fields':
                if tmp is None:
                    tmp = {}
                tmp[k] = v

        # Find by template.
        result = ds.get_by_template(resource, tmp, field_list=field_list)

        if result:
            result_data = json.dumps(result, default=str)
            resp = Response(result_data,
                            status=200,
                            mimetype='application/json')
        else:
            resp = Response("Not found", status=404, mimetype="text/plain")
    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 7
0
def handle_tables(dbname, resource_name, resource_name2, primary_key):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:
        key_columns = primary_key.split(key_delimiter)
        # Form the compound resource names dbschema.table_name
        # resource = dbname + "." + resource_name
        # resource2 = dbname + "." + resource_name2

        if request.method == "GET":
            # Get the field list if it exists.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            limit = request.args.get("limit", "10")
            offset = request.args.get("offset", "0")
            order_by = request.args.get("order_by", None)

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            tmp = None
            for k, v in request.args.items():
                if (not k == "fields") and (not k == "limit") and (not k == "offset") and \
                        (not k == "order_by"):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Find by template.
            join_paths = ds.get_join_column_mapping(dbname, resource_name,
                                                    dbname, resource_name2)

            if join_paths:
                columns = join_paths[list(join_paths.keys())[0]]["MAP"][0]
                referenced_table_name = columns["REFERENCED_TABLE_NAME"]
                referenced_column_name = columns["REFERENCED_COLUMN_NAME"]
                table_name = columns["TABLE_NAME"]
                column_name = columns["COLUMN_NAME"]

                referenced_row = ds.get_by_primary_key(dbname +"."+ referenced_table_name, key_columns, \
                                                       field_list=None, commit=True)
                tmp[column_name] = referenced_row[column_name]
                result = ds.get_by_template(dbname +"."+ table_name, tmp, \
                            field_list=field_list, limit=limit, offset=offset, order_by=order_by, commit=True)

                result = {"data": result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == "POST":
            join_paths = ds.get_join_column_mapping(dbname, resource_name,
                                                    dbname, resource_name2)

            if join_paths:
                columns = join_paths[list(join_paths.keys())[0]]["MAP"][0]
                referenced_table_name = columns["REFERENCED_TABLE_NAME"]
                referenced_column_name = columns["REFERENCED_COLUMN_NAME"]
                table_name = columns["TABLE_NAME"]
                column_name = columns["COLUMN_NAME"]
                new_r = request.get_json()
                referenced_row = ds.get_by_primary_key(dbname + "." +
                                                       referenced_table_name,
                                                       key_columns,
                                                       field_list=None,
                                                       commit=True)
                new_r[column_name] = referenced_row[column_name]

                result = ds.create(dbname + "." + table_name, new_r)
                if result and result == 1:
                    resp = Response("CREATED",
                                    status=201,
                                    mimetype="text/plain")

            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 8
0
def handle_collection(dbname, resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")
    result = None
    e = None
    #context = get_context()

    try:

        # Form the compound resource names dbschema.table_name
        #children = context.get("children", None)
        #if children is not None:
            #resp = handle_path(dbname, resource_name, context)
        #else:
        resource = dbname + "." + resource_name
            #tmp = context.get("query_params", None)
            #field_list = context.get("field", None)


        if request.method == 'GET':

            children = request.args.get('children', None)
            if children is None:
                # Get the field list if it exists.
                field_list = request.args.get('fields', None)
                if field_list is not None:
                    field_list = field_list.split(",")

                order_by = request.args.get('order_by', None)
                limit = request.args.get('limit', None)
                offset = request.args.get('offset', None)

                # The query string is of the form ?f1=v1&f2=v2& ...
                # This maps to a query template of the form { "f1" : "v1", ... }
                # We need to ignore the fields parameters.
                tmp = None
                for k,v in request.args.items():
                    if (not k == 'fields') and (not k == 'limit') and (not k == 'offset') and (not k == 'order_by'):
                        if tmp is None:
                            tmp = {}
                        tmp[k] = v

                # Find by template
                result = ds.get_by_template(resource, tmp, field_list=field_list, limit = limit, offset = offset,
                                            order_by = order_by)

                if result:
                    #result = process_result(result[0],dbname,resource_name)
                    result = {'data': result}
                    result = compute_links(result, limit, offset)
                    result_data = json.dumps(result, default=str)
                    resp = Response(result_data, status=200, mimetype='application/json')
                else:
                    resp = Response("Not found", status=404, mimetype="text/plain")
            else:
                result = _get_with_join(dbname, resource_name)
                if result:
                    result_data=json.dumps(result, default=str)
                    resp = Response(result_data, status=200, mimetype='application/json')
                else:
                    resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == 'POST':
            new_r = request.get_json()
            result = ds.create(resource, new_r)
            if result and result == 1:
                resp = Response("CREATED", status=201, mimetype="text/plain")

    except Exception as e:
        utils.debug_message("Something awful happened, e = ", e)

    return resp
Exemplo n.º 9
0
def handle_resource2(dbname, resource_name, primary_key, resource_name2):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # The design pattern is that the primary key comes in in the form value1_value2_value3
        key_columns = primary_key.split(key_delimiter)

        # Merge dbname and resource names to form the dbschema.tablename element for the resource.
        # This should probably occur in the data service and not here.
        resource = dbname + "." + resource_name
        resource2 = dbname + "." + resource_name2


        if request.method == 'GET':
            # Look for the fields=f1,f2, ... argument in the query parameters.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                f_list = field_list.split(",")

            tmp = None
            for k, v in request.args.items():
                if (not k == 'fields') and (not k == 'limit') and (not k == 'offset') and (not k == 'order_by'):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Call the data service layer.
            result = query_join(resource, resource2, field_list, tmp, key_columns, resource_name, resource_name2)
            if result:
                #result = process_result(result, dbname, resource_name, primary_key)
                result = {'data': result}
                result = compute_links(result)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data, status=200, mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == 'POST':
            new_r = request.get_json()

            p_tbl = ds.get_data_table(resource)
            p_key_columns = p_tbl._get_primary_key_columns()
            tbl2 = ds.get_data_table(resource2)

            #exist = p_tbl.find_by_primary_key(key_columns)
            #if exist >0:

            q = "INSERT INTO "+ resource_name2 + " ( "
            keys = []
            values = []
            for k,v in new_r.items():
                keys.append(k)
                values.append(v)
            f_k = tbl2.get_refer_keys()
            f_k_self = tbl2._get_foreign_key_columns()

            clauses =[]
            for k,v in f_k.items():
                if k == resource:
                    keys = [f_k_self[resource]] + keys
                    for i,va in enumerate(p_key_columns):
                        if va == v:
                            add_key = key_columns[i]
                    clause = "(SELECT "+v +" FROM "+resource+" WHERE "+v + ' = "{0}" ) '.format(add_key)
                    clauses.append(clause)

            key_clause = ",".join(keys) + " ) "
            clauses_ = ",".join(clauses)
            q += key_clause
            q += " VALUES ("
            q += clauses_
            length = len(values)
            for i in range(length):
                q += ',"{0}"'.format(values[i])
            q += ")"

            cursor = p_tbl._cnx.cursor()
            r = cursor.execute(q)
            if r > 0:
                resp = Response("CREATED", status=201, mimetype="text/plain")
            else:
                resp = Response("NOT FOUND IN PARENT TABLE", status=404, mimetype='text/plain')

        # new_r = request.get_json()
            # resource_list1 = {}
            # resource_list2 = {}
            # main_tbl = ds.get_data_table(resource)
            # key_cols = main_tbl._get_primary_key_columns()
            # for i in range(len(key_cols)):
            #     resource_list1[key_cols[i]] = key_columns[i]
            # side_tbl = ds.get_data_table(resource2)
            # # side_key_cols = side_tbl._get_foreign_key_columns()
            # # for i in range(len(side_key_cols)):
            # #     if side_key_cols[i] in set(key_cols):
            # #         resource_list2[side_key_cols[i]] = resource_list1[side_key_cols[i]]
            # refer_keys = side_tbl.get_refer_keys()
            # f_keys = side_tbl._get_foreign_key_columns()
            # for i in range(len(key_cols)):
            #     for k,v in refer_keys.items():
            #         if resource == k  and v == key_cols[i]:
            #             resource_list2[f_keys[k]] = key_columns[i]
            #
            # for k,v in new_r.items():
            #     kk = k.split(".")
            #     if kk[0] == resource_name and kk[1] not in set(key_cols):
            #         resource_list1[k]=v
            #     elif kk[0] == resource_name2:
            #         resource_list2[k]=v
            # result1 = ds.create(resource, resource_list1)
            # result2 = ds.create(resource2, resource_list2)
            # if (result1 + result2) > 1:
            #     resp = Response("CREATED", status=201, mimetype="text/plain")
            # else:
            #     resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        else:
            resp = Response("CAN ONLY GET OR POST", status = 422, mimetype="text/plain")

    except Exception as e:
        # We need a better overall approach to generating correct errors.
        utils.debug_message("Something awful happened, e = ", e)

    #resp['header']=get_context()
    #resp['header']['Location'] = get_location(dbname, resource_name, key_columns)
    return resp
Exemplo n.º 10
0
def handle_path_resource(dbname, resource_name, primary_key,
                         sub_resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:
        result = None
        _default_offset = 10
        _default_limit = 10
        key_columns = primary_key.split(key_delimiter)

        # Merge dbname and resource names to form the dbschema.tablename element for the resource.

        resource = dbname + "." + resource_name
        sub_resource = dbname + "." + sub_resource_name

        if request.method == 'GET':
            field_list = request.args.get('fields', None)
            children_list = request.args.get('children', None)

            if field_list is not None:
                field_list = field_list.split(",")

            limit = request.args.get('limit', _default_limit)
            offset = request.args.get('offset', _default_offset)
            order_by = request.args.get('order_by', None)
            # Call the data service layer.
            result = ds.get_by_path_key(resource,
                                        primary_key,
                                        sub_resource,
                                        field_list=field_list,
                                        limit=limit,
                                        offset=offset,
                                        order_by=order_by)

            if result:
                # We managed to find a row. Return JSON data and 200
                result = {'data': result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response('NOT FOUND', status=404, mimetype='text/plain')

        elif request.method == 'POST':

            new_r = request.json
            result = ds.insert_by_path(resource, key_columns, sub_resource,
                                       new_r)
            if result is not None:
                location = get_location(dbname, sub_resource, new_r)
                resp = Response('Created', status=200, mimetype='text/plain')
                resp.headers['Location'] = location
            else:
                resp = Response('NOT created',
                                status=404,
                                mimetype='text/plain')

    except Exception as e:

        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 11
0
def handle_collection(dbname, resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # Form the compound resource names dbschema.table_name
        resource = dbname + "." + resource_name
        _default_offset = 10
        _default_limit = 10
        if request.method == 'GET':

            # Get the field list if it exists.
            field_list = request.args.get('fields', None)
            children_list = request.args.get('children', None)

            if field_list is not None:
                field_list = field_list.split(",")
            if children_list is not None:
                children_list = children_list.split(",")

            limit = request.args.get('limit', _default_limit)
            offset = request.args.get('offset', _default_offset)
            order_by = request.args.get('order_by', None)

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            tmp = None
            for k, v in request.args.items():
                if (not k == 'fields') and (not k == 'limit') and (
                        not k == 'offset') and (not k == 'order_by') and (
                            not k == 'children'):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Find by template.
            if children_list is None:
                result = ds.get_by_template(resource,
                                            tmp,
                                            field_list=field_list)

            else:
                result = ds.get_by_q_from_h(resource, children_list, tmp,
                                            field_list)

            if result:
                result = {'data': result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")
        elif request.method == 'POST':
            new_r = request.get_json()
            result = ds.create(resource, new_r)
            if result and result == 1:
                resp = Response("created", status=201, mimetype="text/plain")

    except Exception as e:
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 12
0
def handle_collection(dbname, resource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:
        resource = dbname + "." + resource_name

        if request.method == 'GET':
            # Form the compound resource names dbschema.table_name

            # Get the field list if it exists.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            # for queries of type 127.0.0.1:5000/api/lahman2017/batting?teamID=BOS&limit=10
            limit = min(int(request.args.get('limit', 10)), 10)
            offset = request.args.get('offset', 0)
            order_by = request.args.get('order_by', None)
            children = request.args.get('children', None)

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            tmp = None
            for k, v in request.args.items():
                if (not k == 'fields') and (not k == 'limit') and (not k=='offset') and \
                    (not k == 'order_by') and (not k == 'children'):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Find by template
            result = ds.get_by_template(resource,
                                        tmp,
                                        field_list=field_list,
                                        limit=limit,
                                        offset=offset,
                                        order_by=order_by,
                                        children=children)

            if result:
                result = {"data": result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == 'POST':
            new_r = request.get_json()
            k = result = ds.create(resource, new_r)

            if k:
                location = get_location(dbname, resource_name, k)
                resp = Response("CREATED", status=201, mimetype="text/plain")
                resp.headers['Location'] = location

    except Exception as e:
        resp = Response("STATUS 422 " + str(e),
                        status=422,
                        mimetype="text/plain")
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 13
0
def handle_path_resource(dbname, resource_name, primary_key, subresource_name):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:
        resource = dbname + "." + resource_name
        subresource = dbname + "." + subresource_name
        ##make args mutable
        request.args = request.args.copy()
        actual_key = ds.get_key(resource)
        keys_input = primary_key.split('_')
        if len(keys_input) != len(actual_key):
            raise ValueError("Wrong key length please try " + actual_key)

        benchmark_row = ds.get_by_primary_key(resource, keys_input)

        if request.method == 'GET':
            # Form the compound resource names dbschema.table_name

            foreign_key = ds.get_foreign_key(resource, subresource)
            for k, v in foreign_key.items():
                map = v['MAP'][0]
                request.args[map['REFERENCED_COLUMN_NAME']] = benchmark_row[0][
                    map['COLUMN_NAME']]

            # Get the field list if it exists.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")

            # for queries of type 127.0.0.1:5000/api/lahman2017/batting?teamID=BOS&limit=10
            limit = min(int(request.args.get('limit', 10)), 10)
            offset = request.args.get('offset', 0)
            order_by = request.args.get('order_by', None)
            children = request.args.get('children', None)

            # The query string is of the form ?f1=v1&f2=v2& ...
            # This maps to a query template of the form { "f1" : "v1", ... }
            # We need to ignore the fields parameters.
            tmp = None
            for k, v in request.args.items():
                if (not k == 'fields') and (not k == 'limit') and (not k=='offset') and \
                    (not k == 'order_by') and (not k == 'children'):
                    if tmp is None:
                        tmp = {}
                    tmp[k] = v

            # Find by template
            result = ds.get_by_template(subresource,
                                        tmp,
                                        field_list=field_list,
                                        limit=limit,
                                        offset=offset,
                                        order_by=order_by,
                                        children=children)

            if result:
                result = {"data": result}
                result = compute_links(result, limit, offset)
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("Not found", status=404, mimetype="text/plain")

        elif request.method == 'POST':

            actual_key = ds.get_key(resource)
            keys_input = primary_key.split('_')
            if len(keys_input) != len(actual_key):
                raise ValueError("Wrong key length please try " + actual_key)

            new_r = request.get_json()

            foreign_key = ds.get_foreign_key(resource, subresource)
            for k, v in foreign_key.items():
                map = v['MAP'][0]
                new_r[map['COLUMN_NAME']] = benchmark_row[0][
                    map['REFERENCED_COLUMN_NAME']]
            ####Might need to handle multiple keys here
            k = result = ds.create(subresource, new_r)
            if k:
                location = get_location(dbname, subresource_name, k)
                resp = Response("CREATED", status=201, mimetype="text/plain")
                resp.headers['Location'] = location

    except Exception as e:
        resp = Response("STATUS 422 " + str(e),
                        status=422,
                        mimetype="text/plain")
        utils.debug_message("Something awlful happened, e = ", e)

    return resp
Exemplo n.º 14
0
def handle_resource(dbname, resource_name, primary_key):

    resp = Response("Internal server error", status=500, mimetype="text/plain")

    try:

        # The design pattern is that the primary key comes in in the form value1_value2_value3
        key_columns = primary_key.split(key_delimiter)

        # Merge dbname and resource names to form the dbschema.tablename element for the resource.
        # This should probably occur in the data service and not here.
        resource = dbname + "." + resource_name

        if request.method == 'GET':
            # Look for the fields=f1,f2, ... argument in the query parameters.
            field_list = request.args.get('fields', None)
            if field_list is not None:
                field_list = field_list.split(",")
            # Call the data service layer.
            result = ds.get_by_primary_key(resource,
                                           key_columns,
                                           field_list=field_list)
            if result:
                # We managed to find a row. Return JSON data and 200
                result = {"data": result}
                result_data = json.dumps(result, default=str)
                resp = Response(result_data,
                                status=200,
                                mimetype='application/json')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        elif request.method == 'DELETE':
            result = ds.delete_by_key(resource, key_columns)
            if result and result >= 1:
                resp = Response("OK", status=200, mimetype='text/plain')
            else:
                resp = Response("NOT FOUND", status=404, mimetype='text/plain')

        #@TODO DO THIS UPDATE ROW BASED ON KEY
        elif request.method == 'PUT':
            check = ds.get_by_primary_key(resource, key_columns)
            ###Create if result is None
            if check is None:
                resp = Response("NOT FOUND", status=404, mimetype="text/plain")
            ###Update if result is not None
            else:
                new_r = request.get_json()
                result = ds.update_by_key(resource, key_columns, new_r)
                if (not result is None) and (result == 1):
                    resp = Response("UPDATED",
                                    status=201,
                                    mimetype="text/plain")
                if (not result is None) and (result == 0):
                    resp = Response(
                        "UPDATED BUT YOU ENTERED THE SAME VALUES. NONE CHANGED ",
                        status=201,
                        mimetype="text/plain")

        else:
            result = Response(
                "Unimplmented method type please try GET, PUT, or DELETE",
                status=500,
                mimetype="text/plain")
            return result

    except Exception as e:
        resp = Response("STATUS 422 " + str(e),
                        status=422,
                        mimetype="text/plain")
        utils.debug_message("Something awlful happened, e = ", e)

    return resp