mirror of
https://github.com/OCA/knowledge.git
synced 2025-07-25 18:08:42 -06:00
[MIG] document_page_approval: Migration to 11.0
This commit is contained in:
parent
fd7e96c9e0
commit
bcc398f222
@ -34,7 +34,7 @@ To use this module, you need to:
|
|||||||
|
|
||||||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
||||||
:alt: Try me on Runbot
|
:alt: Try me on Runbot
|
||||||
:target: https://runbot.odoo-community.org/runbot/118/10.0
|
:target: https://runbot.odoo-community.org/runbot/118/11.0
|
||||||
|
|
||||||
Known issues / Roadmap
|
Known issues / Roadmap
|
||||||
======================
|
======================
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Document Page Approval',
|
'name': 'Document Page Approval',
|
||||||
'version': '10.0.2.0.0',
|
'version': '11.0.1.0.0',
|
||||||
"author": "Savoir-faire Linux, Odoo Community Association (OCA)",
|
"author": "Savoir-faire Linux, Odoo Community Association (OCA)",
|
||||||
"website": "http://www.savoirfairelinux.com",
|
"website": "http://www.savoirfairelinux.com",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
@ -15,7 +14,6 @@
|
|||||||
],
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'data/email_template.xml',
|
'data/email_template.xml',
|
||||||
'workflows/document_page_approval.xml',
|
|
||||||
'views/document_page_approval.xml',
|
'views/document_page_approval.xml',
|
||||||
'security/document_page_security.xml',
|
'security/document_page_security.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
@ -27,4 +25,5 @@
|
|||||||
],
|
],
|
||||||
'post_init_hook': 'post_init_hook',
|
'post_init_hook': 'post_init_hook',
|
||||||
'uninstall_hook': 'uninstall_hook',
|
'uninstall_hook': 'uninstall_hook',
|
||||||
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2018 Ivan Todorovich (<ivan.todorovich@gmail.com>)
|
# Copyright 2018 Ivan Todorovich (<ivan.todorovich@gmail.com>)
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2018 Ivan Todorovich <ivan.todorovich@gmail.com>
|
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
|
||||||
|
|
||||||
|
|
||||||
def migrate(cr, version): # pragma: no cover
|
|
||||||
# Set all pre-existing pages history to approved
|
|
||||||
cr.execute("""
|
|
||||||
UPDATE document_page_history
|
|
||||||
SET state='approved',
|
|
||||||
approved_uid=create_uid,
|
|
||||||
approved_date=create_date
|
|
||||||
WHERE state IS NULL
|
|
||||||
""")
|
|
@ -1,2 +1 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from . import document_page_approval, document_page_history_workflow
|
from . import document_page_approval, document_page_history_workflow
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
@ -123,7 +122,7 @@ class DocumentPageApproval(models.Model):
|
|||||||
@api.multi
|
@api.multi
|
||||||
def _create_history(self, vals):
|
def _create_history(self, vals):
|
||||||
res = super(DocumentPageApproval, self)._create_history(vals)
|
res = super(DocumentPageApproval, self)._create_history(vals)
|
||||||
res.signal_workflow('document_page_auto_confirm')
|
res.document_page_auto_confirm()
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def action_changes_pending_approval(self):
|
def action_changes_pending_approval(self):
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
@ -6,6 +5,7 @@ from datetime import datetime
|
|||||||
from odoo.tools.translate import _
|
from odoo.tools.translate import _
|
||||||
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
from odoo import api, fields, models
|
from odoo import api, fields, models
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageHistoryWorkflow(models.Model):
|
class DocumentPageHistoryWorkflow(models.Model):
|
||||||
@ -21,6 +21,7 @@ class DocumentPageHistoryWorkflow(models.Model):
|
|||||||
('cancelled', 'Cancelled')],
|
('cancelled', 'Cancelled')],
|
||||||
'Status',
|
'Status',
|
||||||
readonly=True,
|
readonly=True,
|
||||||
|
default='draft'
|
||||||
)
|
)
|
||||||
|
|
||||||
approved_date = fields.Datetime(
|
approved_date = fields.Datetime(
|
||||||
@ -42,7 +43,7 @@ class DocumentPageHistoryWorkflow(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
am_i_approver = fields.Boolean(
|
am_i_approver = fields.Boolean(
|
||||||
related='page_id.am_i_approver'
|
compute='_compute_am_i_approver'
|
||||||
)
|
)
|
||||||
|
|
||||||
page_url = fields.Text(
|
page_url = fields.Text(
|
||||||
@ -53,8 +54,27 @@ class DocumentPageHistoryWorkflow(models.Model):
|
|||||||
@api.multi
|
@api.multi
|
||||||
def page_approval_draft(self):
|
def page_approval_draft(self):
|
||||||
"""Set a change request as draft"""
|
"""Set a change request as draft"""
|
||||||
|
if self.filtered(lambda r: r.state not in [
|
||||||
|
'cancelled', 'approved']):
|
||||||
|
raise UserError(_("It's not cancelled or approved"))
|
||||||
|
if self.filtered(lambda r:
|
||||||
|
r.state == 'approved' and not self.am_i_approver):
|
||||||
|
raise UserError(_("You are not an appover to reset to draft"))
|
||||||
self.write({'state': 'draft'})
|
self.write({'state': 'draft'})
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def document_page_auto_confirm(self):
|
||||||
|
"""Automatic Transitions for change requests created directly from
|
||||||
|
documents
|
||||||
|
"""
|
||||||
|
if self.filtered(lambda r: r.state != 'draft'):
|
||||||
|
raise UserError(_("It's not in draft state"))
|
||||||
|
to_approve = self.filtered(lambda r: r.is_approval_required)
|
||||||
|
to_approve.write({'state': 'to approve'})
|
||||||
|
approved = (self - to_approve)
|
||||||
|
approved.write({'state': 'approved'})
|
||||||
|
approved.mapped('page_id')._compute_history_head()
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def page_approval_to_approve(self):
|
def page_approval_to_approve(self):
|
||||||
"""Set a change request as to approve"""
|
"""Set a change request as to approve"""
|
||||||
@ -117,11 +137,18 @@ class DocumentPageHistoryWorkflow(models.Model):
|
|||||||
for rec in self:
|
for rec in self:
|
||||||
rec.am_i_owner = (rec.create_uid == self.env.user)
|
rec.am_i_owner = (rec.create_uid == self.env.user)
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def _compute_am_i_approver(self):
|
||||||
|
"""check if current user is a approver"""
|
||||||
|
for rec in self:
|
||||||
|
rec.am_i_approver = rec.page_id.can_user_approve_this_page(
|
||||||
|
self.env.user)
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _compute_page_url(self):
|
def _compute_page_url(self):
|
||||||
"""Compute the page url."""
|
"""Compute the page url."""
|
||||||
for page in self:
|
for page in self:
|
||||||
base_url = self.env['ir.config_parameter'].get_param(
|
base_url = self.env['ir.config_parameter'].sudo().get_param(
|
||||||
'web.base.url',
|
'web.base.url',
|
||||||
default='http://localhost:8069'
|
default='http://localhost:8069'
|
||||||
)
|
)
|
||||||
|
@ -1,2 +1 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from . import test_document_page_approval
|
from . import test_document_page_approval
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from odoo.tests import common
|
from odoo.tests import common
|
||||||
|
|
||||||
|
|
||||||
@ -23,7 +22,7 @@ class TestDocumentPageApproval(common.TransactionCase):
|
|||||||
self.page2 = self.page_obj.create({
|
self.page2 = self.page_obj.create({
|
||||||
'name': 'This page requires approval',
|
'name': 'This page requires approval',
|
||||||
'parent_id': self.category2.id,
|
'parent_id': self.category2.id,
|
||||||
'content': 'This content will require approval'
|
'content': 'This content will require approval',
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_approval_required(self):
|
def test_approval_required(self):
|
||||||
@ -48,7 +47,7 @@ class TestDocumentPageApproval(common.TransactionCase):
|
|||||||
self.assertTrue(chreq.am_i_approver)
|
self.assertTrue(chreq.am_i_approver)
|
||||||
|
|
||||||
# approve
|
# approve
|
||||||
chreq.signal_workflow('page_approval_approve')
|
chreq.page_approval_approved()
|
||||||
self.assertEqual(chreq.state, 'approved')
|
self.assertEqual(chreq.state, 'approved')
|
||||||
self.assertEqual(chreq.content, page.content)
|
self.assertEqual(chreq.content, page.content)
|
||||||
|
|
||||||
@ -59,7 +58,7 @@ class TestDocumentPageApproval(common.TransactionCase):
|
|||||||
('page_id', '=', page.id),
|
('page_id', '=', page.id),
|
||||||
('state', '!=', 'approved')
|
('state', '!=', 'approved')
|
||||||
])[0]
|
])[0]
|
||||||
chreq.signal_workflow('page_approval_approve')
|
chreq.page_approval_approved()
|
||||||
self.assertEqual(page.content, 'New content')
|
self.assertEqual(page.content, 'New content')
|
||||||
|
|
||||||
def test_change_request_auto_approve(self):
|
def test_change_request_auto_approve(self):
|
||||||
@ -75,7 +74,7 @@ class TestDocumentPageApproval(common.TransactionCase):
|
|||||||
self.history_obj.search([
|
self.history_obj.search([
|
||||||
('page_id', '=', page.id),
|
('page_id', '=', page.id),
|
||||||
('state', '!=', 'approved')
|
('state', '!=', 'approved')
|
||||||
]).signal_workflow('page_approval_approve')
|
]).page_approval_approved()
|
||||||
|
|
||||||
# new change request from scrath
|
# new change request from scrath
|
||||||
chreq = self.history_obj.create({
|
chreq = self.history_obj.create({
|
||||||
@ -89,25 +88,25 @@ class TestDocumentPageApproval(common.TransactionCase):
|
|||||||
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
||||||
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
||||||
|
|
||||||
chreq.signal_workflow('page_approval_to_approve')
|
chreq.page_approval_to_approve()
|
||||||
self.assertEqual(chreq.state, 'to approve')
|
self.assertEqual(chreq.state, 'to approve')
|
||||||
self.assertNotEqual(page.content, chreq.content)
|
self.assertNotEqual(page.content, chreq.content)
|
||||||
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
||||||
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
||||||
|
|
||||||
chreq.signal_workflow('page_approval_cancel')
|
chreq.page_approval_cancelled()
|
||||||
self.assertEqual(chreq.state, 'cancelled')
|
self.assertEqual(chreq.state, 'cancelled')
|
||||||
self.assertNotEqual(page.content, chreq.content)
|
self.assertNotEqual(page.content, chreq.content)
|
||||||
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
||||||
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
||||||
|
|
||||||
chreq.signal_workflow('page_approval_reopen')
|
chreq.page_approval_draft()
|
||||||
self.assertEqual(chreq.state, 'draft')
|
self.assertEqual(chreq.state, 'draft')
|
||||||
self.assertNotEqual(page.content, chreq.content)
|
self.assertNotEqual(page.content, chreq.content)
|
||||||
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
self.assertNotEqual(page.approved_date, chreq.approved_date)
|
||||||
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
self.assertNotEqual(page.approved_uid, chreq.approved_uid)
|
||||||
|
|
||||||
chreq.signal_workflow('page_approval_approve')
|
chreq.page_approval_approved()
|
||||||
self.assertEqual(chreq.state, 'approved')
|
self.assertEqual(chreq.state, 'approved')
|
||||||
self.assertEqual(page.content, chreq.content)
|
self.assertEqual(page.content, chreq.content)
|
||||||
self.assertEqual(page.approved_date, chreq.approved_date)
|
self.assertEqual(page.approved_date, chreq.approved_date)
|
||||||
|
@ -10,19 +10,19 @@
|
|||||||
<sheet position="before">
|
<sheet position="before">
|
||||||
<header>
|
<header>
|
||||||
<!-- draft -> to approve -->
|
<!-- draft -> to approve -->
|
||||||
<button name="page_approval_to_approve" string="Send to Review" class="oe_highlight"
|
<button name="page_approval_to_approve" type="object" string="Send to Review" state="draft" class="oe_highlight"
|
||||||
attrs="{'invisible':['|','|',('is_approval_required','=',False),('am_i_owner','=',False),('state', 'not in', ['draft'])]}"/>
|
attrs="{'invisible':['|','|',('is_approval_required','=',False),('am_i_owner','=',False),('state', 'not in', ['draft'])]}"/>
|
||||||
<!-- approve if i am approver -->
|
<!-- approve if i am approver -->
|
||||||
<button name="page_approval_approve" string="Approve" class="oe_highlight"
|
<button name="page_approval_approved" type="object" string="Approve" state="to aprrove" class="oe_highlight"
|
||||||
attrs="{'invisible':['|','|',('is_approval_required','=',False),('am_i_approver','=',False),('state','not in',['draft','to approve'])]}"/>
|
attrs="{'invisible':['|','|',('is_approval_required','=',False),('am_i_approver','=',False),('state','not in',['draft','to approve'])]}"/>
|
||||||
<!-- approve if it's not required and i am owner -->
|
<!-- approve if it's not required and i am owner -->
|
||||||
<button name="page_approval_approve" string="Approve" class="oe_highlight"
|
<button name="page_approval_approved" type="object" string="Approve" class="oe_highlight"
|
||||||
attrs="{'invisible':['|','|',('is_approval_required','=',True),('am_i_owner','=',False),('state','not in',['draft', 'to approve'])]}"/>
|
attrs="{'invisible':['|','|',('is_approval_required','=',True),('am_i_owner','=',False),('state','not in',['draft', 'to approve'])]}"/>
|
||||||
<!-- cancel if i am owner or approver -->
|
<!-- cancel if i am owner or approver -->
|
||||||
<button name="page_approval_cancel" string="Cancel"
|
<button name="page_approval_cancelled" type="object" string="Cancel"
|
||||||
attrs="{'invisible':['|','&',('am_i_owner','=',False),('am_i_approver','=',False),('state','not in',['draft','to approve'])]}"/>
|
attrs="{'invisible':['|','&',('am_i_owner','=',False),('am_i_approver','=',False),('state','not in',['draft','to approve'])]}"/>
|
||||||
<!-- reopen if i am owner or approver -->
|
<!-- reopen if i am owner or approver -->
|
||||||
<button name="page_approval_reopen" string="Back to draft"
|
<button name="page_approval_draft" type="object" string="Back to draft" state="cancelled"
|
||||||
attrs="{'invisible':['|','&',('am_i_owner','=',False),('am_i_approver','=',False),('state','not in',['cancelled'])]}"/>
|
attrs="{'invisible':['|','&',('am_i_owner','=',False),('am_i_approver','=',False),('state','not in',['cancelled'])]}"/>
|
||||||
<field name="am_i_owner" invisible="1"/>
|
<field name="am_i_owner" invisible="1"/>
|
||||||
<field name="am_i_approver" invisible="1"/>
|
<field name="am_i_approver" invisible="1"/>
|
||||||
|
@ -1,104 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<record model="workflow" id="wkf_document_page_history_aproval">
|
|
||||||
<field name="name">document.page.history.aproval.wkf</field>
|
|
||||||
<field name="osv">document.page.history</field>
|
|
||||||
<field name="on_create">True</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.activity" id="act_draft">
|
|
||||||
<field name="wkf_id" ref="wkf_document_page_history_aproval" />
|
|
||||||
<field name="flow_start">True</field>
|
|
||||||
<field name="name">draft</field>
|
|
||||||
<field name="kind">function</field>
|
|
||||||
<field name="action">page_approval_draft()</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.activity" id="act_to_approve">
|
|
||||||
<field name="wkf_id" ref="wkf_document_page_history_aproval" />
|
|
||||||
<field name="name">to approve</field>
|
|
||||||
<field name="kind">function</field>
|
|
||||||
<field name="action">page_approval_to_approve()</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.activity" id="act_approved">
|
|
||||||
<field name="wkf_id" ref="wkf_document_page_history_aproval" />
|
|
||||||
<field name="name">approved</field>
|
|
||||||
<field name="kind">function</field>
|
|
||||||
<field name="action">page_approval_approved()</field>
|
|
||||||
<field name="flow_stop">True</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.activity" id="act_cancelled">
|
|
||||||
<field name="wkf_id" ref="wkf_document_page_history_aproval" />
|
|
||||||
<field name="name">cancelled</field>
|
|
||||||
<field name="kind">function</field>
|
|
||||||
<field name="action">page_approval_cancelled()</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Transitions -->
|
|
||||||
<record model="workflow.transition" id="tdr">
|
|
||||||
<field name="act_from" ref="act_draft"/>
|
|
||||||
<field name="act_to" ref="act_to_approve"/>
|
|
||||||
<field name="condition">am_i_owner</field>
|
|
||||||
<field name="signal">page_approval_to_approve</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tda">
|
|
||||||
<field name="act_from" ref="act_draft"/>
|
|
||||||
<field name="act_to" ref="act_approved"/>
|
|
||||||
<field name="condition">am_i_approver</field>
|
|
||||||
<field name="signal">page_approval_approve</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tra">
|
|
||||||
<field name="act_from" ref="act_to_approve"/>
|
|
||||||
<field name="act_to" ref="act_approved"/>
|
|
||||||
<field name="condition">am_i_approver</field>
|
|
||||||
<field name="signal">page_approval_approve</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tad">
|
|
||||||
<field name="act_from" ref="act_approved"/>
|
|
||||||
<field name="act_to" ref="act_draft"/>
|
|
||||||
<field name="condition">am_i_approver</field>
|
|
||||||
<field name="signal">edit</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tdc">
|
|
||||||
<field name="act_from" ref="act_draft"/>
|
|
||||||
<field name="act_to" ref="act_cancelled"/>
|
|
||||||
<field name="condition">am_i_owner</field>
|
|
||||||
<field name="signal">page_approval_cancel</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="trc">
|
|
||||||
<field name="act_from" ref="act_to_approve"/>
|
|
||||||
<field name="act_to" ref="act_cancelled"/>
|
|
||||||
<field name="condition">am_i_owner or am_i_approver</field>
|
|
||||||
<field name="signal">page_approval_cancel</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tcd">
|
|
||||||
<field name="act_from" ref="act_cancelled"/>
|
|
||||||
<field name="act_to" ref="act_draft"/>
|
|
||||||
<field name="condition">am_i_owner or am_i_approver</field>
|
|
||||||
<field name="signal">page_approval_reopen</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Automatic Transitions for change requests created directly from documents -->
|
|
||||||
<record model="workflow.transition" id="tda_auto">
|
|
||||||
<field name="act_from" ref="act_draft"/>
|
|
||||||
<field name="act_to" ref="act_approved"/>
|
|
||||||
<field name="condition">not is_approval_required</field>
|
|
||||||
<field name="signal">document_page_auto_confirm</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="workflow.transition" id="tdr_auto">
|
|
||||||
<field name="act_from" ref="act_draft"/>
|
|
||||||
<field name="act_to" ref="act_to_approve"/>
|
|
||||||
<field name="condition">is_approval_required</field>
|
|
||||||
<field name="signal">document_page_auto_confirm</field>
|
|
||||||
</record>
|
|
||||||
</odoo>
|
|
Loading…
Reference in New Issue
Block a user