From 98cb4719dbe90dbe980be4ad98f22fe155c2dae1 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Tue, 22 Nov 2016 15:05:22 +0100 Subject: [PATCH] [REM] workflow: Remove workflow engine, documentation and tests --- addons/point_of_sale/models/pos_order.py | 3 - addons/purchase/models/mail_mail.py | 2 +- addons/purchase/models/purchase.py | 1 - addons/web/controllers/main.py | 5 - addons/web/static/src/js/framework/data.js | 7 - addons/web/static/src/js/framework/model.js | 13 - addons/web/static/src/js/framework/view.js | 2 - .../models/crm_lead.py | 1 - doc/api_integration.rst | 122 ----- doc/howtos/backend.rst | 84 --- doc/howtos/backend/exercise-state-workflow | 102 ---- .../backend/exercise-state-workflow-actions | 64 --- .../backend/exercise-state-workflow-automatic | 19 - doc/howtos/backend/series | 3 - doc/reference.rst | 1 - doc/reference/actions.rst | 15 - doc/reference/data.rst | 10 - doc/reference/guidelines.rst | 1 - doc/reference/mixins.rst | 3 - doc/reference/security.rst | 6 - doc/reference/views.rst | 4 - doc/reference/workflow/Makefile | 20 - doc/reference/workflow/join.dot | 10 - doc/reference/workflow/join.png | Bin 2687 -> 0 bytes doc/reference/workflow/join.svg | 36 -- doc/reference/workflow/order_0.dot | 9 - doc/reference/workflow/order_0.png | Bin 12078 -> 0 bytes doc/reference/workflow/order_0.svg | 48 -- doc/reference/workflow/order_1.dot | 11 - doc/reference/workflow/order_1.png | Bin 20662 -> 0 bytes doc/reference/workflow/order_1.svg | 66 --- doc/reference/workflow/split.dot | 10 - doc/reference/workflow/split.png | Bin 2694 -> 0 bytes doc/reference/workflow/split.svg | 36 -- doc/reference/workflows.rst | 328 ----------- odoo/__init__.py | 1 - odoo/addons/base/__init__.py | 1 - odoo/addons/base/__manifest__.py | 1 - odoo/addons/base/ir/ir_actions.py | 57 +- odoo/addons/base/ir/ir_actions.xml | 19 - odoo/addons/base/ir/ir_model.py | 18 - odoo/addons/base/ir/ir_ui_view.py | 26 - odoo/addons/base/security/ir.model.access.csv | 10 - odoo/addons/base/tests/test_ir_actions.py | 104 ---- odoo/addons/base/workflow/__init__.py | 4 - odoo/addons/base/workflow/workflow.py | 185 ------- odoo/addons/base/workflow/workflow_report.py | 204 ------- odoo/addons/base/workflow/workflow_view.xml | 370 ------------- odoo/addons/test_workflow/__init__.py | 4 - odoo/addons/test_workflow/__manifest__.py | 12 - odoo/addons/test_workflow/data.xml | 517 ------------------ odoo/addons/test_workflow/ir.model.access.csv | 15 - odoo/addons/test_workflow/models.py | 81 --- odoo/addons/test_workflow/tests/__init__.py | 5 - .../test_workflow/tests/test_workflow.py | 121 ---- odoo/conf/deprecation.py | 1 - odoo/models.py | 49 -- odoo/netsvc.py | 11 +- odoo/release.py | 2 +- odoo/service/model.py | 12 +- odoo/tools/convert.py | 20 - odoo/tools/translate.py | 1 - odoo/tools/yaml_import.py | 38 -- odoo/tools/yaml_tag.py | 14 - odoo/workflow/__init__.py | 83 --- odoo/workflow/helpers.py | 21 - odoo/workflow/instance.py | 117 ---- odoo/workflow/service.py | 96 ---- odoo/workflow/workitem.py | 314 ----------- 69 files changed, 7 insertions(+), 3569 deletions(-) delete mode 100644 doc/howtos/backend/exercise-state-workflow delete mode 100644 doc/howtos/backend/exercise-state-workflow-actions delete mode 100644 doc/howtos/backend/exercise-state-workflow-automatic delete mode 100644 doc/reference/workflow/Makefile delete mode 100644 doc/reference/workflow/join.dot delete mode 100644 doc/reference/workflow/join.png delete mode 100644 doc/reference/workflow/join.svg delete mode 100644 doc/reference/workflow/order_0.dot delete mode 100644 doc/reference/workflow/order_0.png delete mode 100644 doc/reference/workflow/order_0.svg delete mode 100644 doc/reference/workflow/order_1.dot delete mode 100644 doc/reference/workflow/order_1.png delete mode 100644 doc/reference/workflow/order_1.svg delete mode 100644 doc/reference/workflow/split.dot delete mode 100644 doc/reference/workflow/split.png delete mode 100644 doc/reference/workflow/split.svg delete mode 100644 doc/reference/workflows.rst delete mode 100644 odoo/addons/base/workflow/__init__.py delete mode 100644 odoo/addons/base/workflow/workflow.py delete mode 100644 odoo/addons/base/workflow/workflow_report.py delete mode 100644 odoo/addons/base/workflow/workflow_view.xml delete mode 100644 odoo/addons/test_workflow/__init__.py delete mode 100644 odoo/addons/test_workflow/__manifest__.py delete mode 100644 odoo/addons/test_workflow/data.xml delete mode 100644 odoo/addons/test_workflow/ir.model.access.csv delete mode 100644 odoo/addons/test_workflow/models.py delete mode 100644 odoo/addons/test_workflow/tests/__init__.py delete mode 100644 odoo/addons/test_workflow/tests/test_workflow.py delete mode 100644 odoo/workflow/__init__.py delete mode 100644 odoo/workflow/helpers.py delete mode 100644 odoo/workflow/instance.py delete mode 100644 odoo/workflow/service.py delete mode 100644 odoo/workflow/workitem.py diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 4731d30afb1..e7a77f74cec 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -463,9 +463,6 @@ class PosOrder(models.Model): new_invoice.with_context(local_context).sudo().compute_taxes() order.sudo().write({'state': 'invoiced'}) - # this workflow signal didn't exist on account.invoice -> should it have been 'invoice_open' ? (and now method .action_invoice_open()) - # shouldn't the created invoice be marked as paid, seing the customer paid in the POS? - # new_invoice.sudo().signal_workflow('validate') if not Invoice: return {} diff --git a/addons/purchase/models/mail_mail.py b/addons/purchase/models/mail_mail.py index 433ff1d66a5..4764a7595d9 100644 --- a/addons/purchase/models/mail_mail.py +++ b/addons/purchase/models/mail_mail.py @@ -14,5 +14,5 @@ class MailMail(models.Model): if mail_sent and mail.model == 'purchase.order': purchase_order = self.env['purchase.order'].browse(mail.res_id) if purchase_order.state == 'draft': - self.env['purchase.order'].signal_workflow([mail.res_id], 'send_rfq') + purchase_order.state = 'sent' return super(MailMail, self)._postprocess_sent_message(mail_sent=mail_sent) diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 1d3eb8bfa08..dd96a1a499b 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -304,7 +304,6 @@ class PurchaseOrder(models.Model): @api.multi def print_quotation(self): - self.write({'state': "sent"}) return self.env['report'].get_action(self, 'purchase.report_purchasequotation') @api.multi diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index d8c9c0d237e..0ec27efc27b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -868,11 +868,6 @@ class DataSet(http.Controller): return clean_action(action) return False - @http.route('/web/dataset/exec_workflow', type='json', auth="user") - def exec_workflow(self, model, id, signal): - request.session.check_security() - return request.env[model].browse(id).signal_workflow(signal)[id] - @http.route('/web/dataset/resequence', type='json', auth="user") def resequence(self, model, ids, field='sequence', offset=0): """ Re-sequences a number of records in the model, by their ids diff --git a/addons/web/static/src/js/framework/data.js b/addons/web/static/src/js/framework/data.js index c160ebaf539..1d4258019ae 100644 --- a/addons/web/static/src/js/framework/data.js +++ b/addons/web/static/src/js/framework/data.js @@ -548,9 +548,6 @@ var DataSet = Class.extend(mixins.PropertiesMixin, { name_create: function(name, context) { return this._model.call('name_create', [name], {context: this.get_context(context)}); }, - exec_workflow: function (id, signal) { - return this._model.exec_workflow(id, signal); - }, get_context: function(request_context) { return this._model.context(request_context); }, @@ -940,10 +937,6 @@ var BufferedDataSet = DataSetStatic.extend({ this.evict_record(args[0][0]); return this._super(method, args); }, - exec_workflow: function (id, signal) { - this.evict_record(id); - return this._super(id, signal); - }, alter_ids: function(n_ids, options) { var dirty = !_.isEqual(this.ids, n_ids); this._super(n_ids, options); diff --git a/addons/web/static/src/js/framework/model.js b/addons/web/static/src/js/framework/model.js index dd516bb61ba..377ff1a1757 100644 --- a/addons/web/static/src/js/framework/model.js +++ b/addons/web/static/src/js/framework/model.js @@ -54,19 +54,6 @@ var Model = Class.extend({ kwargs: kwargs }, options); }, - /** - * Executes a signal on the designated workflow, on the bound OpenERP model - * - * @param {Number} id workflow identifier - * @param {String} signal signal to trigger on the workflow - */ - exec_workflow: function (id, signal) { - return session.rpc('/web/dataset/exec_workflow', { - model: this.name, - id: id, - signal: signal - }); - }, }); return Model; diff --git a/addons/web/static/src/js/framework/view.js b/addons/web/static/src/js/framework/view.js index ded3ba10bb7..76382f605d6 100644 --- a/addons/web/static/src/js/framework/view.js +++ b/addons/web/static/src/js/framework/view.js @@ -127,8 +127,6 @@ var View = Widget.extend({ active_ids: dataset.ids, active_id: record_id })).then(handler); - } else { - return dataset.exec_workflow(record_id, action_data.name).then(handler); } }, do_show: function () { diff --git a/addons/website_crm_partner_assign/models/crm_lead.py b/addons/website_crm_partner_assign/models/crm_lead.py index fe2f42e156b..4d85d3d661c 100644 --- a/addons/website_crm_partner_assign/models/crm_lead.py +++ b/addons/website_crm_partner_assign/models/crm_lead.py @@ -217,7 +217,6 @@ class CrmLead(models.Model): @api.multi def update_lead_portal(self, values): - # YTI FIXME : Use the standard workflow defined in crm_activity self.check_access_rights('write') for lead in self: if values['date_action'] == '': diff --git a/doc/api_integration.rst b/doc/api_integration.rst index a0f26d39343..1345915d797 100644 --- a/doc/api_integration.rst +++ b/doc/api_integration.rst @@ -1295,128 +1295,6 @@ activated as actual fields on the model. } ] -Workflow manipulations ----------------------- - -:ref:`reference/workflows` can be moved along by sending them *signals*. -Instead of using the top-level ``execute_kw``, signals are sent using -``exec_workflow``. - -Signals are sent to a specific record, and possibly trigger a transition on -the workflow instance associated with the record. - -.. container:: doc-aside - - .. warning:: this example needs ``account`` module installed - - .. switcher:: - - .. code-block:: python - - client = models.execute_kw( - db, uid, password, - 'res.partner', 'search_read', - [[('customer', '=', True)]], - {'limit': 1, 'fields': [ - 'property_account_receivable_id', - 'property_payment_term_id', - 'property_account_position_id'] - })[0] - invoice_id = models.execute_kw( - db, uid, password, - 'account.invoice', 'create', [{ - 'partner_id': client['id'], - 'account_id': client['property_account_receivable_id'][0], - 'invoice_line_ids': [(0, False, {'name': "AAA"})] - }]) - - models.exec_workflow( - db, uid, password, 'account.invoice', 'invoice_open', invoice_id) - - .. code-block:: php - - $client = $models->execute_kw( - $db, $uid, $password, - 'res.partner', 'search_read', - array(array(array('customer', '=', true))), - array( - 'limit' => 1, - 'fields' => array( - 'property_account_receivable_id', - 'property_payment_term_id', - 'property_account_position_id' - )))[0]; - $invoice_id = $models->execute_kw( - $db, $uid, $password, - 'account.invoice', 'create', array(array( - 'partner_id' => $client['id'], - 'account_id' => $client['property_account_receivable_id'][0], - 'invoice_line_ids' => array(array(0, false, array('name' => "AAA"))) - ))); - - $models->exec_workflow( - $db, $uid, $password, - 'account.invoice', 'invoice_open', - $invoice_id); - - .. code-block:: ruby - - client = models.execute_kw( - db, uid, password, - 'res.partner', 'search_read', - [[['customer', '=', true]]], - {limit: 1, fields: %w(property_account_receivable_id property_payment_term_id property_account_position_id)} - )[0] - invoice_id = models.execute_kw( - db, uid, password, - 'account.invoice', 'create', [{ - partner_id: client['id'], - account_id: client['property_account_receivable_id'][0], - invoice_line_ids: [[0, false, {name: "AAA"}]] - }]) - - models.exec_workflow( - db, uid, password, - 'account.invoice', 'invoice_open', invoice_id) - - .. code-block:: java - - final Map c = (Map) - ((Object[])models.execute("execute_kw", asList( - db, uid, password, - "res.partner", "search_read", - asList( - asList( - asList("customer", "=", true))), - new HashMap() {{ - put("limit", 1); - put("fields", asList( - "property_account_receivable_id", - "property_payment_term_id", - "property_account_position_id" - )); - }} - )))[0]; - final Integer invoice_id = (Integer)models.execute( - "execute_kw", asList( - db, uid, password, - "account.invoice", "create", - asList(new HashMap() {{ - put("partner_id", c.get("id")); - put("account_id", ((Object[])c.get("property_account_receivable_id"))[0]); - put("invoice_line_ids", asList( - asList(0, false, new HashMap() {{ - put("name", "AAA"); - }}) - )); - }}) - )); - - models.execute( - "exec_workflow", asList( - db, uid, password, - "account.invoice", "invoice_open", invoice_id)); - Report printing --------------- diff --git a/doc/howtos/backend.rst b/doc/howtos/backend.rst index a19e9376b9e..8c67eedecb1 100644 --- a/doc/howtos/backend.rst +++ b/doc/howtos/backend.rst @@ -1230,90 +1230,6 @@ Kanban views define the structure of each card as a mix of form elements .. patch:: -Workflows -========= - -Workflows are models associated to business objects describing their dynamics. -Workflows are also used to track processes that evolve over time. - -.. exercise:: Almost a workflow - - Add a ``state`` field to the *Session* model. It will be used to define - a workflow-ish. - - A sesion can have three possible states: Draft (default), Confirmed and - Done. - - In the session form, add a (read-only) field to - visualize the state, and buttons to change it. The valid transitions are: - - * Draft -> Confirmed - * Confirmed -> Draft - * Confirmed -> Done - * Done -> Draft - - .. only:: solutions - - #. Add a new ``state`` field - #. Add state-transitioning methods, those can be called from view - buttons to change the record's state - #. And add the relevant buttons to the session's form view - - .. patch:: - -Workflows may be associated with any object in Odoo, and are entirely -customizable. Workflows are used to structure and manage the lifecycles of -business objects and documents, and define transitions, triggers, etc. with -graphical tools. Workflows, activities (nodes or actions) and transitions -(conditions) are declared as XML records, as usual. The tokens that navigate -in workflows are called workitems. - -.. warning:: - - A workflow associated with a model is only created when the - model's records are created. Thus there is no workflow instance - associated with session instances created before the workflow's - definition - -.. exercise:: Workflow - - Replace the ad-hoc *Session* workflow by a real workflow. Transform the - *Session* form view so its buttons call the workflow instead of the - model's methods. - - .. only:: solutions - - .. patch:: - - .. tip:: - - In order to check if instances of the workflow are correctly - created alongside sessions, go to :menuselection:`Settings --> - Technical --> Workflows --> Instances` - - - -.. exercise:: Automatic transitions - - Automatically transition sessions from *Draft* to *Confirmed* when more - than half the session's seats are reserved. - - .. only:: solutions - - .. patch:: - -.. exercise:: Server actions - - Replace the Python methods for synchronizing session state by - server actions. - - Both the workflow and the server actions could have been created entirely - from the UI. - - .. only:: solutions - - .. patch:: - Security ======== diff --git a/doc/howtos/backend/exercise-state-workflow b/doc/howtos/backend/exercise-state-workflow deleted file mode 100644 index d97dce1b1ea..00000000000 --- a/doc/howtos/backend/exercise-state-workflow +++ /dev/null @@ -1,102 +0,0 @@ -# HG changeset patch -# Parent c72382bf0c5794135fa318f6ba59899b2277d8c5 -# Parent 82f902dbb7aab4d3ddd9caaa9170536afa9d274d - -diff --git a/openacademy/__manifest__.py b/openacademy/__manifest__.py ---- a/openacademy/__manifest__.py -+++ b/openacademy/__manifest__.py -@@ -29,6 +29,7 @@ - 'templates.xml', - 'views/openacademy.xml', - 'views/partner.xml', -+ 'views/session_workflow.xml', - ], - # only loaded in demonstration mode - 'demo': [ -diff --git a/openacademy/models.py b/openacademy/models.py ---- a/openacademy/models.py -+++ b/openacademy/models.py -@@ -70,7 +70,7 @@ class Session(models.Model): - ('draft', "Draft"), - ('confirmed', "Confirmed"), - ('done', "Done"), -- ], default='draft') -+ ]) - - @api.multi - def action_draft(self): -diff --git a/openacademy/views/openacademy.xml b/openacademy/views/openacademy.xml ---- a/openacademy/views/openacademy.xml -+++ b/openacademy/views/openacademy.xml -@@ -97,13 +97,13 @@ - -
-
--