Add a group that is allowed to cancel done shipments and moves

Closes #13899
This commit is contained in:
Cédric Krier
2026-02-11 10:41:09 +01:00
parent c0396ab1db
commit 9d871c8244
4 changed files with 46 additions and 8 deletions
+1
View File
@@ -1,3 +1,4 @@
* Add a group that is allowed to cancel done shipments and moves
Version 7.8.0 - 2025-12-15 Version 7.8.0 - 2025-12-15
-------------------------- --------------------------
+7 -2
View File
@@ -18,7 +18,7 @@ from trytond.model import (
from trytond.model.exceptions import AccessError from trytond.model.exceptions import AccessError
from trytond.modules.product import price_digits, round_price from trytond.modules.product import price_digits, round_price
from trytond.pool import Pool from trytond.pool import Pool
from trytond.pyson import Bool, Eval, If, TimeDelta from trytond.pyson import Bool, Eval, Id, If, TimeDelta
from trytond.tools import cached_property, grouped_slice, reduce_ids from trytond.tools import cached_property, grouped_slice, reduce_ids
from trytond.transaction import Transaction, without_check_access from trytond.transaction import Transaction, without_check_access
@@ -464,7 +464,12 @@ class Move(Workflow, ModelSQL, ModelView):
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': ~Eval('state').in_(['draft', 'assigned']), 'invisible': (
(Eval('state') == 'cancelled')
| ((Eval('state') == 'done')
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'readonly': Eval('shipment') | Eval('_parent_shipment'), 'readonly': Eval('shipment') | Eval('_parent_shipment'),
'depends': ['state', 'shipment'], 'depends': ['state', 'shipment'],
}, },
+30 -6
View File
@@ -511,7 +511,12 @@ class ShipmentIn(
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': Eval('state').in_(['cancelled', 'done']), 'invisible': (
(Eval('state') == 'cancelled')
| ((Eval('state') == 'done')
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'depends': ['state'], 'depends': ['state'],
}, },
'draft': { 'draft': {
@@ -914,7 +919,12 @@ class ShipmentInReturn(
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': Eval('state').in_(['cancelled', 'done']), 'invisible': (
(Eval('state') == 'cancelled')
| ((Eval('state') == 'done')
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'depends': ['state'], 'depends': ['state'],
}, },
'draft': { 'draft': {
@@ -1314,7 +1324,12 @@ class ShipmentOut(
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': Eval('state').in_(['cancelled', 'done']), 'invisible': (
(Eval('state') == 'cancelled')
| ((Eval('state') == 'done')
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'depends': ['state'], 'depends': ['state'],
}, },
'draft': { 'draft': {
@@ -1984,7 +1999,12 @@ class ShipmentOutReturn(
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': Eval('state').in_(['cancelled', 'done']), 'invisible': (
(Eval('state') == 'cancelled')
| ((Eval('state') == 'done')
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'depends': ['state'], 'depends': ['state'],
}, },
'draft': { 'draft': {
@@ -2489,8 +2509,12 @@ class ShipmentInternal(
)) ))
cls._buttons.update({ cls._buttons.update({
'cancel': { 'cancel': {
'invisible': Eval('state').in_( 'invisible': (
['cancelled', 'shipped', 'done']), (Eval('state') == 'cancelled')
| (Eval('state').in_(['shipped', 'done'])
& ~Id('stock',
'group_stock_cancellation').in_(
Eval('context', {}).get('groups', [])))),
'depends': ['state'], 'depends': ['state'],
}, },
'draft': { 'draft': {
+8
View File
@@ -14,6 +14,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Stock Force Assignment</field> <field name="name">Stock Force Assignment</field>
<field name="parent" ref="group_stock"/> <field name="parent" ref="group_stock"/>
</record> </record>
<record model="res.group" id="group_stock_cancellation">
<field name="name">Stock Cancellation</field>
<field name="parent" ref="group_stock"/>
</record>
<record model="res.user-res.group" <record model="res.user-res.group"
id="user_admin_group_stock_admin"> id="user_admin_group_stock_admin">
<field name="user" ref="res.user_admin"/> <field name="user" ref="res.user_admin"/>
@@ -29,6 +33,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="user" ref="res.user_admin"/> <field name="user" ref="res.user_admin"/>
<field name="group" ref="group_stock_force_assignment"/> <field name="group" ref="group_stock_force_assignment"/>
</record> </record>
<record model="res.user-res.group" id="user_admin_group_stock_cancellation">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_stock_cancellation"/>
</record>
<record model="ir.ui.icon" id="stock_icon"> <record model="ir.ui.icon" id="stock_icon">
<field name="name">tryton-stock</field> <field name="name">tryton-stock</field>