bemade-addons/bemade_document_versions/models/document.py
2023-09-28 16:44:08 -04:00

70 lines
3 KiB
Python

from odoo import models, fields, _, api, Command
from odoo.exceptions import ValidationError
class Document(models.Model):
_inherit = ['documents.document']
current_revision_id = fields.Many2one('documents.revision', 'Current Revision')
revision_ids = fields.One2many('documents.revision', 'document_id')
revision_sequence = fields.Many2one('documents.revision.sequence', 'document_id',
'Revision Sequence', )
track_revisions = fields.Boolean(default=False)
# set copy=False for number_next
number_next = fields.Integer(string='Next Number', required=True, default=1,
copy=False, help="Next number of this sequence")
@api.constrains('revision_ids', 'revision_sequence', 'track_revisions')
def constrain_revisions(self):
for rec in self:
revision_fields = [rec.revision_ids, rec.revision_sequence,
rec.track_revisions]
if any(revision_fields) and not all(revision_fields):
raise ValidationError(_('A revision sequence must be selected to track'
' revisions.'))
def write(self, vals):
super().write(vals)
if self.track_revisions and 'track_revisions' in vals \
and not vals['track_revisions']:
raise ValidationError(_('Revision tracking cannot be disabled after it has'
'been turned on for a document.'))
self._check_revision_fields()
@api.model_create_multi
def create(self, vals):
res = super().create(vals)
for rec in res:
rec._check_revision_fields()
return res
def _check_revision_fields(self):
""" Helper method to check that all three fields `track_revisions`,
`revisions_sequence` and `revision_ids` are properly set if any one of them is set.
:return: None
"""
self.ensure_one()
revision_fields = [self.revision_ids, self.revision_sequence,
self.track_revisions]
if any(revision_fields) and not all(revision_fields):
self._set_up_revisions()
def _set_up_revisions(self):
"""
Helper method to set up revisions, no matter how we got into tracking them.
:return: None
"""
self.ensure_one()
self.track_revisions = True # may already be true, but no matter
self.revision_sequence = self.revision_sequence or self.env.ref(
'bemade_document_versions.document_revision_sequence_default')
self.revision_ids = self.revision_ids or Command.set(
[self._create_first_revision()])
def _create_first_revision(self):
"""
Creates a new documents.revision record to associate to this Document
:return: a single, new documents.revision record
"""
self.ensure_one()
return self.env['documents.revision'].create({'document_id': self.id, })