Browse Source

Add pagination support

* Simplify error handling for all methods
pull/345/head
drpsyko101 9 months ago
parent
commit
fa298553b4
  1. 108
      rest_api_odoo/controllers/main.py
  2. 10
      rest_api_odoo/static/description/index.html

108
rest_api_odoo/controllers/main.py

@ -70,6 +70,7 @@ class RestApi(http.Controller):
def generate_response(self, method, **query): def generate_response(self, method, **query):
"""This function is used to generate the response based on the type """This function is used to generate the response based on the type
of request and the parameters given""" of request and the parameters given"""
try:
model = query.pop("model") model = query.pop("model")
option = request.env["connection.api"].search( option = request.env["connection.api"].search(
[("model_id", "=", model)], limit=1 [("model_id", "=", model)], limit=1
@ -102,30 +103,23 @@ class RestApi(http.Controller):
if not (value_type == "binary"): if not (value_type == "binary"):
fields.append(field) fields.append(field)
if not option: if not option:
return Response( raise NotImplementedError("No Record Created for the model. ")
json.dumps(
{
"message": f"No Record Created for the model. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=403,
)
if method == "GET": if method == "GET":
if not option.is_get: if not option.is_get:
return Response( raise NameError()
json.dumps( limit = 0
{ if query.get("limit"):
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record." limit = int(str(query.get("limit")))
} offset = 0
), if query.get("offset"):
status=405, offset = int(str(query.get("offset")))
)
domains = [] domains = []
for key, value in query.items(): for key, value in query.items():
if not (key == "limit" or key == "offset"):
domains.append((key, "=", self.simplest_type(value))) domains.append((key, "=", self.simplest_type(value)))
partner_records = request.env[str(model_name)].search_read( partner_records = request.env[str(model_name)].search_read(
domain=domains, fields=fields domains, fields, limit=limit, offset=offset
) )
return Response( return Response(
@ -133,94 +127,57 @@ class RestApi(http.Controller):
) )
if method == "POST": if method == "POST":
if not option.is_post: if not option.is_post:
return Response( raise NotImplementedError()
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
if not data or "values" not in data: if not data or "values" not in data:
return Response(json.dumps({"message": "No Data Provided"}), status=403) raise ValueError("No Data Provided")
try:
data = json.loads(request.httprequest.data) data = json.loads(request.httprequest.data)
new_resource = request.env[str(model_name)].create(data["values"]) new_resource = request.env[str(model_name)].create(data["values"])
partner_records = request.env[str(model_name)].search_read( partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", new_resource.id)], fields=fields [("id", "=", new_resource.id)], fields
) )
return Response( return Response(
json.dumps({"new_record": self.sanitize_records(partner_records)}), json.dumps({"new_record": self.sanitize_records(partner_records)}),
status=201, status=201,
) )
except Exception:
return Response(
json.dumps({"message": "Invalid JSON Data"}), status=403
)
if method == "PUT": if method == "PUT":
if not option.is_put: if not option.is_put:
return Response( raise NotImplementedError()
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
if "id" not in query: if "id" not in query:
return Response(json.dumps({"message": "No ID Provided"}), status=403) raise ValueError("No ID Provided")
if not data or "values" not in data: if not data or "values" not in data:
return Response(json.dumps({"message": "No Data Provided"}), status=403) raise ValueError("No Data Provided")
resource_id = str(query.get("id")) resource_id = str(query.get("id"))
resource = request.env[str(model_name)].browse(int(resource_id)) resource = request.env[str(model_name)].browse(int(resource_id))
if not resource.exists(): if not resource.exists():
return Response( raise ValueError("Resource not found")
json.dumps({"message": "Resource not found"}), status=404
)
try:
data = json.loads(request.httprequest.data) data = json.loads(request.httprequest.data)
resource.write(data["values"]) resource.write(data["values"])
partner_records = request.env[str(model_name)].search_read( partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", resource.id)], fields=fields [("id", "=", resource.id)], fields
) )
return Response( return Response(
json.dumps( json.dumps(
{"updated_record": self.sanitize_records(partner_records)} {"updated_record": self.sanitize_records(partner_records)}
) )
) )
except Exception:
return Response(
json.dumps({"message": "Invalid JSON value(s) passed"}),
status=403,
)
if method == "DELETE": if method == "DELETE":
if not option.is_delete: if not option.is_delete:
return Response( raise NotImplementedError()
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
if "id" not in query: if "id" not in query:
return Response(json.dumps({"message": "No ID Provided"}), status=403) raise ValueError("No ID Provided")
resource_id = str(query.get("id")) resource_id = str(query.get("id"))
resource = request.env[str(model_name)].browse(int(resource_id)) resource = request.env[str(model_name)].browse(int(resource_id))
if not resource.exists(): if not resource.exists():
return Response( raise ValueError("Resource not found")
json.dumps({"message": "Resource not found"}), status=404
)
partner_records = request.env[str(model_name)].search_read( partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", resource.id)], fields=fields [("id", "=", resource.id)], fields
) )
resource.unlink() resource.unlink()
return Response( return Response(
@ -234,7 +191,22 @@ class RestApi(http.Controller):
) )
# If not using any method above, simply return an error # If not using any method above, simply return an error
return Response(json.dumps({"message": "Method not allowed"}), status=405) raise NotImplementedError()
except ValueError as e:
return Response(json.dumps({"message": e.args[0]}), status=403)
except NotImplementedError as e:
return Response(
json.dumps(
{
"message": f"Method not allowed. {e.args[0]}Please contact your admininstrator to enable {method} method for {model_display_name or 'this'} record."
}
),
status=405,
)
except Exception:
return Response(
json.dumps({"message": "Internal server error"}), status=500
)
@http.route( @http.route(
["/send_request"], ["/send_request"],
@ -290,7 +262,7 @@ class RestApi(http.Controller):
datas = json.dumps( datas = json.dumps(
{"Status": "auth successful", "User": user.name, "api-key": api_key} {"Status": "auth successful", "User": user.name, "api-key": api_key}
) )
return Response(datas, status=200) return Response(datas)
except Exception: except Exception:
return Response( return Response(
json.dumps({"message": "wrong login credentials"}), status=401 json.dumps({"message": "wrong login credentials"}), status=401

10
rest_api_odoo/static/description/index.html

@ -323,11 +323,15 @@
<li>The format for GET method will be like this - <code>http://cybrosys:8016/send_request?model=res.partner&Id=10.</code> <li>The format for GET method will be like this - <code>http://cybrosys:8016/send_request?model=res.partner&Id=10.</code>
</li> </li>
<li>We can specify the fields inside the JSON data, and it will <li>We can specify the fields inside the JSON data, and it will
be like this - <code>{"fields": ["name", "email"]}</code>.</li> be like this - <code>{"fields": ["name", "email"]}</code>.
If no fields are passed , it will returns just the record's ID.
To get all of the fields, set the fields to wildcard - <code>{"fields": ["*"]}</code>.
Pagination can also be used by adding <code>{"limit": 10, "offset": 0}</code>
to the query parameter above.
</li>
<li>This is the format of api response - <code>{"records": [{"id": <li>This is the format of api response - <code>{"records": [{"id":
10, "email": "deco.addict82@example.com", "name": "Deco 10, "email": "deco.addict82@example.com", "name": "Deco
Addict"}]}</code>. If no fields are passed , it will returns Addict"}]}</code>.
just the record's ID. To get all of the fields, set the fields to wildcard - <code>{"fields": ["*"]}</code>.
</li> </li>
</ul> </ul>

Loading…
Cancel
Save