You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.6 KiB

  1. # Copyright 2020 Coop IT Easy SCRL fs
  2. # Robin Keunen <robin@coopiteasy.be>
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. import json
  5. import logging
  6. import requests
  7. from werkzeug.exceptions import BadRequest, InternalServerError, NotFound
  8. from odoo import _, api, fields, models
  9. from odoo.exceptions import AccessDenied
  10. _logger = logging.getLogger(__name__)
  11. class EMCBackend(models.Model):
  12. _name = "emc.backend"
  13. _description = "EMC Backend"
  14. name = fields.Char(string="Name", required=True)
  15. location = fields.Char(string="Location")
  16. api_key = fields.Char(string="API Key")
  17. description = fields.Text(string="Description", required=False)
  18. active = fields.Boolean(string="active", default=True)
  19. @api.multi
  20. def http_get(self, url, params=None, headers=None):
  21. self.ensure_one()
  22. headers = self._add_api_key(headers)
  23. if url.startswith("/"):
  24. url = self.location + url
  25. return requests.get(url, params=params, headers=headers)
  26. def _process_response(self, response):
  27. if response.status_code == 200:
  28. content = response.content.decode("utf-8")
  29. return json.loads(content)
  30. elif response.status_code == 400:
  31. content = response.content.decode("utf-8")
  32. raise BadRequest(
  33. _(
  34. "request returned status code %s with message %s"
  35. % (response.status_code, content)
  36. )
  37. )
  38. elif response.status_code == 403:
  39. raise AccessDenied(
  40. _("You are not allowed to access this resource")
  41. )
  42. elif response.status_code == 404:
  43. raise NotFound(
  44. _("Resource not found %s on server" % response.status_code)
  45. )
  46. else: # 500 et al.
  47. content = response.content.decode("utf-8")
  48. raise InternalServerError(
  49. _(
  50. "request returned status code %s with message %s"
  51. % (response.status_code, content)
  52. )
  53. )
  54. @api.multi
  55. def http_get_content(self, url, params=None, headers=None):
  56. self.ensure_one()
  57. response = self.http_get(url, params=params, headers=headers)
  58. return self._process_response(response)
  59. @api.multi
  60. def http_post(self, url, data, headers=None):
  61. self.ensure_one()
  62. headers = self._add_api_key(headers)
  63. if url.startswith("/"):
  64. url = self.location + url
  65. return requests.post(url, json=data, headers=headers)
  66. def http_post_content(self, url, data, headers=None):
  67. self.ensure_one()
  68. response = self.http_post(url, data, headers=headers)
  69. return self._process_response(response)
  70. @api.multi
  71. def _add_api_key(self, headers):
  72. self.ensure_one()
  73. key_dict = {"API-KEY": self.api_key}
  74. if headers:
  75. headers.update(key_dict)
  76. else:
  77. headers = key_dict
  78. return headers
  79. @api.multi
  80. def action_ping(self):
  81. self.ensure_one()
  82. url = self.location + "/api/ping/test"
  83. try:
  84. response = requests.get(url)
  85. except Exception as e:
  86. _logger.error(e)
  87. raise Warning(_("Failed to connect to backend: %s" % str(e)))
  88. if response.status_code == 200:
  89. content = json.loads(response.content.decode("utf-8"))
  90. raise Warning(_("Success: %s") % content["message"])
  91. else:
  92. raise Warning(
  93. _("Failed to connect to backend: %s" % str(response.content))
  94. )