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.

84 lines
2.5 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 NotFound
  8. from odoo import _, api, fields, models
  9. _logger = logging.getLogger(__name__)
  10. class EMCBackend(models.Model):
  11. _name = "emc.backend"
  12. _description = "EMC Backend"
  13. name = fields.Char(string="Name", required=True)
  14. location = fields.Char(string="Location")
  15. api_key = fields.Char(string="API Key")
  16. description = fields.Text(string="Description", required=False)
  17. active = fields.Boolean(string="active", default=True)
  18. @api.multi
  19. def http_get(self, url, params=None, headers=None):
  20. self.ensure_one()
  21. headers = self._add_api_key(headers)
  22. if url.startswith("/"):
  23. url = self.location + url
  24. return requests.get(url, params=params, headers=headers)
  25. @api.multi
  26. def http_get_content(self, url, params=None, headers=None):
  27. self.ensure_one()
  28. response = self.http_get(url, params=params, headers=headers)
  29. if response.status_code == 200:
  30. content = response.content.decode("utf-8")
  31. return json.loads(content)
  32. else:
  33. # todo handle different codes (at least 404, 403, 500)
  34. raise NotFound(
  35. _("request returned status code %s" % response.status_code)
  36. )
  37. @api.multi
  38. def http_post(self, url, data, headers=None):
  39. self.ensure_one()
  40. headers = self._add_api_key(headers)
  41. if url.startswith("/"):
  42. url = self.location + url
  43. return requests.post(url, json=data, headers=headers)
  44. @api.multi
  45. def _add_api_key(self, headers):
  46. self.ensure_one()
  47. key_dict = {"API-KEY": self.api_key}
  48. if headers:
  49. headers.update(key_dict)
  50. else:
  51. headers = key_dict
  52. return headers
  53. @api.multi
  54. def action_ping(self):
  55. self.ensure_one()
  56. url = self.location + "/api/ping/test"
  57. try:
  58. response = requests.get(url)
  59. except Exception as e:
  60. _logger.error(e)
  61. raise Warning(_("Failed to connect to backend: %s" % str(e)))
  62. if response.status_code == 200:
  63. content = json.loads(response.content.decode("utf-8"))
  64. raise Warning(_("Success: %s") % content["message"])
  65. else:
  66. raise Warning(
  67. _("Failed to connect to backend: %s" % str(response.content))
  68. )