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.

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