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.

104 lines
2.9 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. @api.multi
  26. def set_external_sequence(self):
  27. self.ensure_one()
  28. code = "%s.external.id" % self._name
  29. Sequence = self.env["ir.sequence"]
  30. # check if code was created for that model
  31. sequence = Sequence.search([("code", "=", code)])
  32. if not sequence:
  33. sequence = Sequence.sudo().create(
  34. {"name": code, "code": code, "number_next": 100}
  35. )
  36. self.sudo().write({"external_id_sequence_id": sequence.id})
  37. return True
  38. @api.multi
  39. def get_api_external_id(self):
  40. self.ensure_one()
  41. if not self.external_id_sequence_id:
  42. self.set_external_sequence()
  43. if not self._api_external_id:
  44. # pass already allocated ids
  45. n = 100
  46. while True:
  47. try:
  48. next_id = self.external_id_sequence_id._next()
  49. self.sudo().write(
  50. {
  51. "_api_external_id": next_id
  52. }
  53. )
  54. break
  55. except IntegrityError as e:
  56. if n > 0:
  57. continue
  58. else:
  59. raise e
  60. return self._api_external_id
  61. class ResPartner(models.Model):
  62. _name = "res.partner"
  63. _inherit = ["res.partner", "external.id.mixin"]
  64. class SubscriptionRequest(models.Model):
  65. _name = "subscription.request"
  66. _inherit = ["subscription.request", "external.id.mixin"]
  67. class AccountAccount(models.Model):
  68. _name = "account.account"
  69. _inherit = ["account.account", "external.id.mixin"]
  70. class AccountJournal(models.Model):
  71. _name = "account.journal"
  72. _inherit = ["account.journal", "external.id.mixin"]
  73. class AccountInvoice(models.Model):
  74. _name = "account.invoice"
  75. _inherit = ["account.invoice", "external.id.mixin"]
  76. class AccountPayment(models.Model):
  77. _name = "account.payment"
  78. _inherit = ["account.payment", "external.id.mixin"]
  79. class ProductTemplate(models.Model):
  80. _name = "product.template"
  81. _inherit = ["product.template", "external.id.mixin"]