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):
"""This function is used to generate the response based on the type
of request and the parameters given"""
try:
model = query.pop("model")
option = request.env["connection.api"].search(
[("model_id", "=", model)], limit=1
@ -102,30 +103,23 @@ class RestApi(http.Controller):
if not (value_type == "binary"):
fields.append(field)
if not option:
return Response(
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,
)
raise NotImplementedError("No Record Created for the model. ")
if method == "GET":
if not option.is_get:
return Response(
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
raise NameError()
limit = 0
if query.get("limit"):
limit = int(str(query.get("limit")))
offset = 0
if query.get("offset"):
offset = int(str(query.get("offset")))
domains = []
for key, value in query.items():
if not (key == "limit" or key == "offset"):
domains.append((key, "=", self.simplest_type(value)))
partner_records = request.env[str(model_name)].search_read(
domain=domains, fields=fields
domains, fields, limit=limit, offset=offset
)
return Response(
@ -133,94 +127,57 @@ class RestApi(http.Controller):
)
if method == "POST":
if not option.is_post:
return Response(
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
raise NotImplementedError()
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)
new_resource = request.env[str(model_name)].create(data["values"])
partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", new_resource.id)], fields=fields
[("id", "=", new_resource.id)], fields
)
return Response(
json.dumps({"new_record": self.sanitize_records(partner_records)}),
status=201,
)
except Exception:
return Response(
json.dumps({"message": "Invalid JSON Data"}), status=403
)
if method == "PUT":
if not option.is_put:
return Response(
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
raise NotImplementedError()
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:
return Response(json.dumps({"message": "No Data Provided"}), status=403)
raise ValueError("No Data Provided")
resource_id = str(query.get("id"))
resource = request.env[str(model_name)].browse(int(resource_id))
if not resource.exists():
return Response(
json.dumps({"message": "Resource not found"}), status=404
)
raise ValueError("Resource not found")
try:
data = json.loads(request.httprequest.data)
resource.write(data["values"])
partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", resource.id)], fields=fields
[("id", "=", resource.id)], fields
)
return Response(
json.dumps(
{"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 not option.is_delete:
return Response(
json.dumps(
{
"message": f"Method not allowed. Please contact your admininstrator to enable {method} method for {model_display_name} record."
}
),
status=405,
)
raise NotImplementedError()
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 = request.env[str(model_name)].browse(int(resource_id))
if not resource.exists():
return Response(
json.dumps({"message": "Resource not found"}), status=404
)
raise ValueError("Resource not found")
partner_records = request.env[str(model_name)].search_read(
domain=[("id", "=", resource.id)], fields=fields
[("id", "=", resource.id)], fields
)
resource.unlink()
return Response(
@ -234,7 +191,22 @@ class RestApi(http.Controller):
)
# 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(
["/send_request"],
@ -290,7 +262,7 @@ class RestApi(http.Controller):
datas = json.dumps(
{"Status": "auth successful", "User": user.name, "api-key": api_key}
)
return Response(datas, status=200)
return Response(datas)
except Exception:
return Response(
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>
<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":
10, "email": "deco.addict82@example.com", "name": "Deco
Addict"}]}</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>.
Addict"}]}</code>.
</li>
</ul>

Loading…
Cancel
Save