71 lines
3 KiB
Python
71 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, })
|