From 13ddb59da9509a24ca2d4131fb79c871720b03f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAudrey?= <“auva@odoo.com”> Date: Tue, 13 Feb 2024 13:19:06 +0100 Subject: [PATCH] [ADD] Studio: approval rules task-3553095 closes odoo/documentation#10029 Signed-off-by: Audrey Vandromme (auva) --- content/applications/studio.rst | 16 +++- .../applications/studio/approval_rules.rst | 73 ++++++++++++++++++ .../approval_rules/approvals-awaiting.png | Bin 0 -> 4061 bytes .../approval_rules/approvals-button.png | Bin 0 -> 7029 bytes 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 content/applications/studio/approval_rules.rst create mode 100644 content/applications/studio/approval_rules/approvals-awaiting.png create mode 100644 content/applications/studio/approval_rules/approvals-button.png diff --git a/content/applications/studio.rst b/content/applications/studio.rst index 604d096cc..48e40d2b9 100644 --- a/content/applications/studio.rst +++ b/content/applications/studio.rst @@ -13,19 +13,27 @@ Studio studio/models_modules_apps studio/automated_actions studio/pdf_reports + studio/approval_rules Studio is a toolbox that allows you to customize Odoo without coding knowledge. For example, you -can, on any app, add or modify: +can, in any app, add or modify: - :doc:`Fields ` - :doc:`Views ` - :doc:`Models ` - :doc:`Automated actions ` - :doc:`PDF reports ` -- Approval rules +- :doc:`Approval rules ` - Security rules -Or you can :doc:`build an app from scratch `. +You can also :doc:`build an app from scratch `. + +.. _studio/access: + +To access Studio, navigate to the app and model you want to modify, then click the **Toggle Studio** +button, or vice versa. + +To close Studio, click :guilabel:`Close` in the upper right corner. .. seealso:: - - `Odoo Tutorials: Studio `_ + `Odoo Tutorials: Studio `_ diff --git a/content/applications/studio/approval_rules.rst b/content/applications/studio/approval_rules.rst new file mode 100644 index 000000000..0a04e2272 --- /dev/null +++ b/content/applications/studio/approval_rules.rst @@ -0,0 +1,73 @@ +============== +Approval rules +============== + +Studio approval rules are used to automate approval processes for actions. They allow you to define +the criteria for when an approval is required before an action can be performed using a button. + +Configuration +============= + +To add approval rules, proceed as follows: + +#. :ref:`Open Studio ` and switch to the required :doc:`view `. +#. Select the button for which you want to add approval rules. +#. In the :guilabel:`Properties` tab on the left, enable the :guilabel:`Set approval rules` + feature. +#. Specify the :guilabel:`Approval Group` to limit the approval permission to a specific user + group. +#. Define the :guilabel:`Responsible` user to create an activity for a specific user when an + approval is requested from them. +#. Add a :guilabel:`Description` to be displayed in the :ref:`Approval dialog `. +#. Enable :guilabel:`Limit approver to this rule` to require approvers to be different users (when + there are multiple approval rules). + +Optionally, you can also add conditions for the approval rule to be applied by clicking the +:icon:`fa-filter` (:guilabel:`filter`) icon next to the :guilabel:`Approval Group` field. + +Click :guilabel:`Add an approval rule` to add another rule. + +Click the :icon:`fa-trash` (:guilabel:`trash`) icon next to the :guilabel:`Approval group` field to +delete the approval rule. + +.. tip:: + You can create :ref:`user groups ` specifically for approvals. + +.. _approval-rules/use: + +Use +=== + +Once approval rules have been defined for a button: + +- A **user avatar** icon is displayed next to the button's label for each approval rule that has + been defined. + + .. image:: approval_rules/approvals-button.png + :alt: Confirm button with approval for purchase orders + +- When an unauthorized user clicks the button, an error message is displayed in the top-right corner + and an activity is created for the user specified in the :guilabel:`Responsible` field. +- Only users from the group defined in the :guilabel:`Approval Group` field are allowed to approve + or reject the action. + +Authorized users can: + +- approve and perform the action by clicking the button; +- approve the action and allow another user to perform it by clicking the **user avatar** icon next + to the button's label, then clicking the :icon:`fa-check` (:guilabel:`Approve`) button in the + dialog that opens. +- reject the action by clicking the **user avatar** icon next to the button's label, then clicking + the :icon:`fa-times` (:guilabel:`Reject`) button in the dialog that opens. + +.. image:: approval_rules/approvals-awaiting.png + :alt: Approval dialog + +.. tip:: + - The user who approved/rejected the action can revoke their decision by clicking the **user + avatar** icon next to the button's label, then clicking the :icon:`fa-undo` + (:guilabel:`Revoke`) button. + - Approvals are tracked in the record's chatter. An approval entry is also created every time + a Studio approval-related action is performed. To access the approval entries, :doc:`activate + the developer mode ` and go to :menuselection:`Settings + --> Technical --> Studio Approval Entries`. diff --git a/content/applications/studio/approval_rules/approvals-awaiting.png b/content/applications/studio/approval_rules/approvals-awaiting.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c6b526d9773d9dfa77248a6aeb13a1926b860c GIT binary patch literal 4061 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 P00000NkvXXu0mjffloC5 literal 0 HcmV?d00001 diff --git a/content/applications/studio/approval_rules/approvals-button.png b/content/applications/studio/approval_rules/approvals-button.png new file mode 100644 index 0000000000000000000000000000000000000000..d24b939e13c30870219650ac0b10c6c8704a3fbf GIT binary patch literal 7029 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 literal 0 HcmV?d00001