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.2 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. from psycopg2 import IntegrityError
  5. from odoo import api, fields, models
  6. class ExternalIdMixin(models.AbstractModel):
  7. _name = "external.id.mixin"
  8. _description = "External ID Mixin"
  9. _sql_constraints = [
  10. (
  11. "_api_external_id_uniq",
  12. "unique(_api_external_id)",
  13. "API External ID must be unique!",
  14. )
  15. ]
  16. # do not access directly, always use get_api_external_id method
  17. _api_external_id = fields.Integer(
  18. string="External ID", index=True, required=False
  19. )
  20. external_id_sequence_id = fields.Many2one(
  21. comodel_name="ir.sequence",
  22. string="External ID Sequence",
  23. required=False,
  24. )
  25. first_api_export_date = fields.Datetime(
  26. string="First API Export Date", required=False
  27. )
  28. last_api_export_date = fields.Datetime(
  29. string="Last API Export Date", required=False
  30. )
  31. # only used to display and hide "Generate external ID" button
  32. external_id_generated = fields.Boolean(
  33. string="External ID Generated", default=False, required=False
  34. )
  35. @api.multi
  36. def set_external_sequence(self):
  37. self.ensure_one()
  38. code = "%s.external.id" % self._name
  39. Sequence = self.env["ir.sequence"]
  40. # check if code was created for that model
  41. sequence = Sequence.search([("code", "=", code)])
  42. if not sequence:
  43. sequence = Sequence.sudo().create(
  44. {"name": code, "code": code, "number_next": 100}
  45. )
  46. self.sudo().write({"external_id_sequence_id": sequence.id})
  47. return True
  48. @api.multi
  49. def get_api_external_id(self):
  50. self.ensure_one()
  51. if not self.external_id_sequence_id:
  52. self.set_external_sequence()
  53. if not self._api_external_id:
  54. # pass already allocated ids
  55. n = 100
  56. while True:
  57. try:
  58. next_id = self.external_id_sequence_id._next()
  59. self.sudo().write(
  60. {
  61. "_api_external_id": next_id,
  62. "external_id_generated": True,
  63. }
  64. )
  65. break
  66. except IntegrityError as e:
  67. if n > 0:
  68. continue
  69. else:
  70. raise e
  71. return self._api_external_id
  72. class ResPartner(models.Model):
  73. _name = "res.partner"
  74. _inherit = ["res.partner", "external.id.mixin"]
  75. class AccountAccount(models.Model):
  76. _name = "account.account"
  77. _inherit = ["account.account", "external.id.mixin"]
  78. class AccountJournal(models.Model):
  79. _name = "account.journal"
  80. _inherit = ["account.journal", "external.id.mixin"]
  81. class AccountInvoice(models.Model):
  82. _name = "account.invoice"
  83. _inherit = ["account.invoice", "external.id.mixin"]
  84. class AccountPayment(models.Model):
  85. _name = "account.payment"
  86. _inherit = ["account.payment", "external.id.mixin"]
  87. class ProductTemplate(models.Model):
  88. _name = "product.template"
  89. _inherit = ["product.template", "external.id.mixin"]