52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
from odoo import models, fields, api
|
|
|
|
|
|
class IncrementingSequenceMixin(models.AbstractModel):
|
|
_name = "incrementing.sequence.mixin"
|
|
_description = "Incrementing Sequence Mixin"
|
|
_order = "sequence, id asc"
|
|
|
|
def __init_subclass__(cls, **kwargs):
|
|
super().__init_subclass__(**kwargs)
|
|
if "incrementing.sequence.mixin" in cls._inherit:
|
|
if not hasattr(cls, "_sequence_group"):
|
|
raise ValueError(
|
|
f"Model {cls._name} inheriting from incrementing.sequence.mixin must define a '_sequence_group' attribute."
|
|
)
|
|
|
|
sequence = fields.Integer()
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
res = super().create(vals_list)
|
|
for rec in res:
|
|
if rec.sequence == 0:
|
|
group_field = getattr(rec, "_sequence_group")
|
|
group_field_data = getattr(rec, group_field)
|
|
if hasattr(group_field_data, "id"):
|
|
group_field_data = group_field_data.id
|
|
group = self.env[rec._name].search(
|
|
[(group_field, "=", group_field_data)]
|
|
)
|
|
else:
|
|
group = None
|
|
max_seq = max(group.mapped("sequence")) if group else 0
|
|
rec.sequence = max_seq + 1
|
|
return res
|
|
|
|
def _default_sequence(self):
|
|
group_field = getattr(self, "_sequence_group")
|
|
group_field_data = getattr(self, group_field)
|
|
if hasattr(group_field_data, "id"):
|
|
group_field_data = group_field_data.id
|
|
group = self.env[self._name].search([(group_field, "=", group_field_data)])
|
|
else:
|
|
group = None
|
|
max_seq = max(group.mapped("sequence")) if group else 0
|
|
# Don't recalculate if already set
|
|
for rec in self.filtered(lambda r: r.sequence == 0):
|
|
max_seq += 1
|
|
rec.sequence = max_seq
|
|
|
|
def _inverse_sequence(self):
|
|
pass
|