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.

103 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. self.sudo().write(
  49. {
  50. "_api_external_id": self.external_id_sequence_id._next()
  51. }
  52. )
  53. break
  54. except IntegrityError as e:
  55. if n > 0:
  56. continue
  57. else:
  58. raise e
  59. return self._api_external_id
  60. class ResPartner(models.Model):
  61. _name = "res.partner"
  62. _inherit = ["res.partner", "external.id.mixin"]
  63. class SubscriptionRequest(models.Model):
  64. _name = "subscription.request"
  65. _inherit = ["subscription.request", "external.id.mixin"]
  66. class AccountAccount(models.Model):
  67. _name = "account.account"
  68. _inherit = ["account.account", "external.id.mixin"]
  69. class AccountJournal(models.Model):
  70. _name = "account.journal"
  71. _inherit = ["account.journal", "external.id.mixin"]
  72. class AccountInvoice(models.Model):
  73. _name = "account.invoice"
  74. _inherit = ["account.invoice", "external.id.mixin"]
  75. class AccountPayment(models.Model):
  76. _name = "account.payment"
  77. _inherit = ["account.payment", "external.id.mixin"]
  78. class ProductTemplate(models.Model):
  79. _name = "product.template"
  80. _inherit = ["product.template", "external.id.mixin"]