odoo-addon-base-tier-validation 16.0.1.6.1.7__py3-none-any.whl → 16.0.2.0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odoo/addons/base_tier_validation/README.rst +19 -2
- odoo/addons/base_tier_validation/__manifest__.py +2 -1
- odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +119 -3
- odoo/addons/base_tier_validation/i18n/es.po +155 -16
- odoo/addons/base_tier_validation/i18n/es_MX.po +124 -4
- odoo/addons/base_tier_validation/i18n/fr.po +124 -4
- odoo/addons/base_tier_validation/i18n/it.po +124 -4
- odoo/addons/base_tier_validation/i18n/nl_NL.po +124 -4
- odoo/addons/base_tier_validation/i18n/sv.po +124 -4
- odoo/addons/base_tier_validation/i18n/tr.po +124 -4
- odoo/addons/base_tier_validation/i18n/zh_CN.po +124 -4
- odoo/addons/base_tier_validation/models/__init__.py +1 -0
- odoo/addons/base_tier_validation/models/tier_validation.py +113 -4
- odoo/addons/base_tier_validation/models/tier_validation_exception.py +91 -0
- odoo/addons/base_tier_validation/readme/CONFIGURE.rst +17 -1
- odoo/addons/base_tier_validation/readme/CONTRIBUTORS.rst +1 -0
- odoo/addons/base_tier_validation/security/ir.model.access.csv +2 -0
- odoo/addons/base_tier_validation/static/description/index.html +18 -2
- odoo/addons/base_tier_validation/tests/test_tier_validation.py +54 -0
- odoo/addons/base_tier_validation/tests/tier_validation_tester.py +2 -0
- odoo/addons/base_tier_validation/views/tier_definition_view.xml +1 -0
- odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml +112 -0
- {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.1.dist-info}/METADATA +20 -3
- {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.1.dist-info}/RECORD +26 -24
- {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.1.dist-info}/WHEEL +0 -0
- {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.1.dist-info}/top_level.txt +0 -0
@@ -49,6 +49,11 @@ msgid ""
|
|
49
49
|
" !"
|
50
50
|
msgstr ""
|
51
51
|
|
52
|
+
#. module: base_tier_validation
|
53
|
+
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form
|
54
|
+
msgid "<span class=\"oe_edit_only\">Model</span>"
|
55
|
+
msgstr ""
|
56
|
+
|
52
57
|
#. module: base_tier_validation
|
53
58
|
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form
|
54
59
|
msgid "<span class=\"oe_edit_only\">Name</span>"
|
@@ -156,6 +161,15 @@ msgstr "已批准"
|
|
156
161
|
msgid "Archived"
|
157
162
|
msgstr ""
|
158
163
|
|
164
|
+
#. module: base_tier_validation
|
165
|
+
#. odoo-python
|
166
|
+
#: code:addons/base_tier_validation/models/tier_validation_exception.py:0
|
167
|
+
#, python-format
|
168
|
+
msgid ""
|
169
|
+
"At least one of these fields must be checked! Write under Validation, Write "
|
170
|
+
"after Validation"
|
171
|
+
msgstr ""
|
172
|
+
|
159
173
|
#. module: base_tier_validation
|
160
174
|
#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass
|
161
175
|
#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass
|
@@ -182,8 +196,8 @@ msgid "Cancel"
|
|
182
196
|
msgstr "取消"
|
183
197
|
|
184
198
|
#. module: base_tier_validation
|
185
|
-
#. odoo-python
|
186
199
|
#. odoo-javascript
|
200
|
+
#. odoo-python
|
187
201
|
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
188
202
|
#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0
|
189
203
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment
|
@@ -207,6 +221,8 @@ msgstr "审批意见"
|
|
207
221
|
#. module: base_tier_validation
|
208
222
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id
|
209
223
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id
|
224
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id
|
225
|
+
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
|
210
226
|
msgid "Company"
|
211
227
|
msgstr "公司"
|
212
228
|
|
@@ -215,10 +231,16 @@ msgstr "公司"
|
|
215
231
|
msgid "Config Settings"
|
216
232
|
msgstr ""
|
217
233
|
|
234
|
+
#. module: base_tier_validation
|
235
|
+
#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
|
236
|
+
msgid "Create a new Validation Exception!"
|
237
|
+
msgstr ""
|
238
|
+
|
218
239
|
#. module: base_tier_validation
|
219
240
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid
|
220
241
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid
|
221
242
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid
|
243
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid
|
222
244
|
msgid "Created by"
|
223
245
|
msgstr "创建人"
|
224
246
|
|
@@ -226,6 +248,7 @@ msgstr "创建人"
|
|
226
248
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date
|
227
249
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date
|
228
250
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date
|
251
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date
|
229
252
|
msgid "Created on"
|
230
253
|
msgstr "创建时间"
|
231
254
|
|
@@ -253,6 +276,7 @@ msgstr "说明"
|
|
253
276
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name
|
254
277
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name
|
255
278
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name
|
279
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name
|
256
280
|
msgid "Display Name"
|
257
281
|
msgstr "显示名称"
|
258
282
|
|
@@ -283,6 +307,11 @@ msgstr "审批人"
|
|
283
307
|
msgid "Field in related record"
|
284
308
|
msgstr ""
|
285
309
|
|
310
|
+
#. module: base_tier_validation
|
311
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids
|
312
|
+
msgid "Fields"
|
313
|
+
msgstr ""
|
314
|
+
|
286
315
|
#. module: base_tier_validation
|
287
316
|
#. odoo-python
|
288
317
|
#: code:addons/base_tier_validation/models/tier_review.py:0
|
@@ -304,6 +333,7 @@ msgstr "含审批意见"
|
|
304
333
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id
|
305
334
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id
|
306
335
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id
|
336
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id
|
307
337
|
msgid "ID"
|
308
338
|
msgstr "ID"
|
309
339
|
|
@@ -335,10 +365,21 @@ msgid ""
|
|
335
365
|
"definition are restarted."
|
336
366
|
msgstr ""
|
337
367
|
|
368
|
+
#. module: base_tier_validation
|
369
|
+
#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
|
370
|
+
msgid "It's fully validated"
|
371
|
+
msgstr ""
|
372
|
+
|
373
|
+
#. module: base_tier_validation
|
374
|
+
#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
|
375
|
+
msgid "It's in the validation process"
|
376
|
+
msgstr ""
|
377
|
+
|
338
378
|
#. module: base_tier_validation
|
339
379
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update
|
340
380
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update
|
341
381
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update
|
382
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update
|
342
383
|
msgid "Last Modified on"
|
343
384
|
msgstr "最近修改时间"
|
344
385
|
|
@@ -346,6 +387,7 @@ msgstr "最近修改时间"
|
|
346
387
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid
|
347
388
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid
|
348
389
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid
|
390
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid
|
349
391
|
msgid "Last Updated by"
|
350
392
|
msgstr "最近更新人"
|
351
393
|
|
@@ -353,11 +395,14 @@ msgstr "最近更新人"
|
|
353
395
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date
|
354
396
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date
|
355
397
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date
|
398
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date
|
356
399
|
msgid "Last Updated on"
|
357
400
|
msgstr "最近更新时间"
|
358
401
|
|
359
402
|
#. module: base_tier_validation
|
360
403
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model
|
404
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id
|
405
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name
|
361
406
|
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search
|
362
407
|
msgid "Model"
|
363
408
|
msgstr "模型"
|
@@ -418,6 +463,13 @@ msgstr ""
|
|
418
463
|
msgid "Notify Reviewers on Restarted"
|
419
464
|
msgstr ""
|
420
465
|
|
466
|
+
#. module: base_tier_validation
|
467
|
+
#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
|
468
|
+
msgid ""
|
469
|
+
"Once created, you can decide which fields you want to be editable when the "
|
470
|
+
"record:"
|
471
|
+
msgstr ""
|
472
|
+
|
421
473
|
#. module: base_tier_validation
|
422
474
|
#. odoo-python
|
423
475
|
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
@@ -577,10 +629,13 @@ msgstr "状态"
|
|
577
629
|
|
578
630
|
#. module: base_tier_validation
|
579
631
|
#. odoo-python
|
580
|
-
#: code:addons/base_tier_validation/models/
|
632
|
+
#: code:addons/base_tier_validation/models/tier_validation_exception.py:0
|
633
|
+
#: model:ir.model.constraint,message:base_tier_validation.constraint_tier_validation_exception_model_company_under_after_unique
|
581
634
|
#, python-format
|
582
|
-
msgid "
|
583
|
-
|
635
|
+
msgid ""
|
636
|
+
"The model already exists for this company with this Write Validation "
|
637
|
+
"configuration!"
|
638
|
+
msgstr ""
|
584
639
|
|
585
640
|
#. module: base_tier_validation
|
586
641
|
#. odoo-python
|
@@ -653,6 +708,18 @@ msgstr "多层级审批(抽象)"
|
|
653
708
|
msgid "Tier Validation Accepted Notification"
|
654
709
|
msgstr "多层级审批(抽象)"
|
655
710
|
|
711
|
+
#. module: base_tier_validation
|
712
|
+
#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action
|
713
|
+
#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception
|
714
|
+
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form
|
715
|
+
msgid "Tier Validation Exception"
|
716
|
+
msgstr ""
|
717
|
+
|
718
|
+
#. module: base_tier_validation
|
719
|
+
#: model:ir.model,name:base_tier_validation.model_tier_validation_exception
|
720
|
+
msgid "Tier Validation Exceptions"
|
721
|
+
msgstr ""
|
722
|
+
|
656
723
|
#. module: base_tier_validation
|
657
724
|
#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected
|
658
725
|
#, fuzzy
|
@@ -696,6 +763,11 @@ msgstr ""
|
|
696
763
|
msgid "User"
|
697
764
|
msgstr ""
|
698
765
|
|
766
|
+
#. module: base_tier_validation
|
767
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids
|
768
|
+
msgid "Valid Model Field"
|
769
|
+
msgstr ""
|
770
|
+
|
699
771
|
#. module: base_tier_validation
|
700
772
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids
|
701
773
|
msgid "Valid Reviewer Field"
|
@@ -756,11 +828,59 @@ msgstr "审批"
|
|
756
828
|
msgid "Without validation"
|
757
829
|
msgstr ""
|
758
830
|
|
831
|
+
#. module: base_tier_validation
|
832
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation
|
833
|
+
msgid "Write after Validation"
|
834
|
+
msgstr ""
|
835
|
+
|
836
|
+
#. module: base_tier_validation
|
837
|
+
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
|
838
|
+
msgid "Write after validation"
|
839
|
+
msgstr ""
|
840
|
+
|
841
|
+
#. module: base_tier_validation
|
842
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation
|
843
|
+
msgid "Write under Validation"
|
844
|
+
msgstr ""
|
845
|
+
|
846
|
+
#. module: base_tier_validation
|
847
|
+
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
|
848
|
+
msgid "Write under validation"
|
849
|
+
msgstr ""
|
850
|
+
|
851
|
+
#. module: base_tier_validation
|
852
|
+
#. odoo-python
|
853
|
+
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
854
|
+
#, python-format
|
855
|
+
msgid ""
|
856
|
+
"You are not allowed to write those fields after validation.\n"
|
857
|
+
"- %(not_allowed_fields)s\n"
|
858
|
+
"\n"
|
859
|
+
"Only those fields can be modified:\n"
|
860
|
+
"- %(allowed_fields)s"
|
861
|
+
msgstr ""
|
862
|
+
|
863
|
+
#. module: base_tier_validation
|
864
|
+
#. odoo-python
|
865
|
+
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
866
|
+
#, python-format
|
867
|
+
msgid ""
|
868
|
+
"You are not allowed to write those fields under validation.\n"
|
869
|
+
"- %(not_allowed_fields)s\n"
|
870
|
+
"\n"
|
871
|
+
"Only those fields can be modified:\n"
|
872
|
+
"- %(allowed_fields)s"
|
873
|
+
msgstr ""
|
874
|
+
|
759
875
|
#. module: base_tier_validation
|
760
876
|
#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form
|
761
877
|
msgid "e.g. Tier Validation for..."
|
762
878
|
msgstr "例如:审批层级用于..."
|
763
879
|
|
880
|
+
#, python-format
|
881
|
+
#~ msgid "The operation is under validation."
|
882
|
+
#~ msgstr "该操作正在审批中。"
|
883
|
+
|
764
884
|
#~ msgid "Tier"
|
765
885
|
#~ msgstr "层级"
|
766
886
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com)
|
2
|
+
# Copyright 2024 Moduon Team (https://www.moduon.team)
|
2
3
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
3
4
|
|
4
5
|
import json
|
@@ -11,6 +12,8 @@ from odoo.exceptions import ValidationError
|
|
11
12
|
from odoo.osv.expression import OR
|
12
13
|
from odoo.tools.misc import frozendict
|
13
14
|
|
15
|
+
BASE_EXCEPTION_FIELDS = ["message_follower_ids", "access_token"]
|
16
|
+
|
14
17
|
|
15
18
|
class TierValidation(models.AbstractModel):
|
16
19
|
_name = "tier.validation"
|
@@ -238,10 +241,43 @@ class TierValidation(models.AbstractModel):
|
|
238
241
|
else:
|
239
242
|
return self
|
240
243
|
|
244
|
+
@api.model
|
245
|
+
def _get_validation_exceptions(self, extra_domain=None, add_base_exceptions=True):
|
246
|
+
"""Return Tier Validation Exception field names that matchs custom domain."""
|
247
|
+
exception_fields = (
|
248
|
+
self.env["tier.validation.exception"]
|
249
|
+
.search(
|
250
|
+
[
|
251
|
+
("model_name", "=", self._name),
|
252
|
+
("company_id", "in", [False] + self.env.company.ids),
|
253
|
+
*(extra_domain or []),
|
254
|
+
]
|
255
|
+
)
|
256
|
+
.mapped("field_ids.name")
|
257
|
+
)
|
258
|
+
if add_base_exceptions:
|
259
|
+
exception_fields = list(set(exception_fields + BASE_EXCEPTION_FIELDS))
|
260
|
+
return exception_fields
|
261
|
+
|
262
|
+
@api.model
|
263
|
+
def _get_all_validation_exceptions(self):
|
264
|
+
"""Extend for more field exceptions to be written when on the entire
|
265
|
+
validation process."""
|
266
|
+
return self._get_validation_exceptions()
|
267
|
+
|
241
268
|
@api.model
|
242
269
|
def _get_under_validation_exceptions(self):
|
243
|
-
"""Extend for more field exceptions."""
|
244
|
-
return
|
270
|
+
"""Extend for more field exceptions to be written under validation."""
|
271
|
+
return self._get_validation_exceptions(
|
272
|
+
extra_domain=[("allowed_to_write_under_validation", "=", True)]
|
273
|
+
)
|
274
|
+
|
275
|
+
@api.model
|
276
|
+
def _get_after_validation_exceptions(self):
|
277
|
+
"""Extend for more field exceptions to be written after validation."""
|
278
|
+
return self._get_validation_exceptions(
|
279
|
+
extra_domain=[("allowed_to_write_after_validation", "=", True)]
|
280
|
+
)
|
245
281
|
|
246
282
|
def _check_allow_write_under_validation(self, vals):
|
247
283
|
"""Allow to add exceptions for fields that are allowed to be written
|
@@ -252,6 +288,35 @@ class TierValidation(models.AbstractModel):
|
|
252
288
|
return False
|
253
289
|
return True
|
254
290
|
|
291
|
+
def _check_allow_write_after_validation(self, vals):
|
292
|
+
"""Allow to add exceptions for fields that are allowed to be written
|
293
|
+
even when the record is after validation."""
|
294
|
+
exceptions = self._get_after_validation_exceptions()
|
295
|
+
for val in vals:
|
296
|
+
if val not in exceptions:
|
297
|
+
return False
|
298
|
+
return True
|
299
|
+
|
300
|
+
def _get_fields_to_write_validation(self, vals, records_exception_function):
|
301
|
+
"""Not allowed fields to write when validation depending on the given function."""
|
302
|
+
exceptions = records_exception_function()
|
303
|
+
not_allowed_fields = []
|
304
|
+
for val in vals:
|
305
|
+
if val not in exceptions:
|
306
|
+
not_allowed_fields.append(val)
|
307
|
+
if not not_allowed_fields:
|
308
|
+
return []
|
309
|
+
|
310
|
+
not_allowed_field_names, allowed_field_names = [], []
|
311
|
+
for fld_name, fld_data in self.fields_get(
|
312
|
+
not_allowed_fields + exceptions
|
313
|
+
).items():
|
314
|
+
if fld_name in not_allowed_fields:
|
315
|
+
not_allowed_field_names.append(fld_data["string"])
|
316
|
+
else:
|
317
|
+
allowed_field_names.append(fld_data["string"])
|
318
|
+
return allowed_field_names, not_allowed_field_names
|
319
|
+
|
255
320
|
def write(self, vals):
|
256
321
|
for rec in self:
|
257
322
|
if rec._check_state_conditions(vals):
|
@@ -273,6 +338,7 @@ class TierValidation(models.AbstractModel):
|
|
273
338
|
"one record."
|
274
339
|
)
|
275
340
|
)
|
341
|
+
# Write under validation
|
276
342
|
if (
|
277
343
|
rec.review_ids
|
278
344
|
and getattr(rec, self._state_field) in self._state_from
|
@@ -281,7 +347,50 @@ class TierValidation(models.AbstractModel):
|
|
281
347
|
and not rec._check_allow_write_under_validation(vals)
|
282
348
|
and not rec._context.get("skip_validation_check")
|
283
349
|
):
|
284
|
-
|
350
|
+
(
|
351
|
+
allowed_fields,
|
352
|
+
not_allowed_fields,
|
353
|
+
) = rec._get_fields_to_write_validation(
|
354
|
+
vals, rec._get_under_validation_exceptions
|
355
|
+
)
|
356
|
+
raise ValidationError(
|
357
|
+
_(
|
358
|
+
"You are not allowed to write those fields under validation.\n"
|
359
|
+
"- %(not_allowed_fields)s\n\n"
|
360
|
+
"Only those fields can be modified:\n- %(allowed_fields)s"
|
361
|
+
)
|
362
|
+
% {
|
363
|
+
"not_allowed_fields": "\n- ".join(not_allowed_fields),
|
364
|
+
"allowed_fields": "\n- ".join(allowed_fields),
|
365
|
+
}
|
366
|
+
)
|
367
|
+
|
368
|
+
# Write after validation. Check only if Tier Validation Exception is created
|
369
|
+
if (
|
370
|
+
rec._get_validation_exceptions(add_base_exceptions=False)
|
371
|
+
and rec.validation_status == "validated"
|
372
|
+
and getattr(rec, self._state_field)
|
373
|
+
in (self._state_to + [self._cancel_state])
|
374
|
+
and not rec._check_allow_write_after_validation(vals)
|
375
|
+
and not rec._context.get("skip_validation_check")
|
376
|
+
):
|
377
|
+
(
|
378
|
+
allowed_fields,
|
379
|
+
not_allowed_fields,
|
380
|
+
) = rec._get_fields_to_write_validation(
|
381
|
+
vals, rec._get_after_validation_exceptions
|
382
|
+
)
|
383
|
+
raise ValidationError(
|
384
|
+
_(
|
385
|
+
"You are not allowed to write those fields after validation.\n"
|
386
|
+
"- %(not_allowed_fields)s\n\n"
|
387
|
+
"Only those fields can be modified:\n- %(allowed_fields)s"
|
388
|
+
)
|
389
|
+
% {
|
390
|
+
"not_allowed_fields": "\n- ".join(not_allowed_fields),
|
391
|
+
"allowed_fields": "\n- ".join(allowed_fields),
|
392
|
+
}
|
393
|
+
)
|
285
394
|
if rec._allow_to_remove_reviews(vals):
|
286
395
|
rec.mapped("review_ids").unlink()
|
287
396
|
return super(TierValidation, self).write(vals)
|
@@ -637,7 +746,7 @@ class TierValidation(models.AbstractModel):
|
|
637
746
|
all_models[model] = res["models"][model]
|
638
747
|
new_node = etree.fromstring(new_arch)
|
639
748
|
node.append(new_node)
|
640
|
-
excepted_fields = self.
|
749
|
+
excepted_fields = self._get_all_validation_exceptions()
|
641
750
|
for node in doc.xpath("//field[@name][not(ancestor::field)]"):
|
642
751
|
if node.attrib.get("name") in excepted_fields:
|
643
752
|
continue
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# Copyright 2024 Moduon Team (https://www.moduon.team)
|
2
|
+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
3
|
+
|
4
|
+
from odoo import _, api, exceptions, fields, models
|
5
|
+
|
6
|
+
from .tier_validation import BASE_EXCEPTION_FIELDS
|
7
|
+
|
8
|
+
|
9
|
+
class TierValidationException(models.Model):
|
10
|
+
_name = "tier.validation.exception"
|
11
|
+
_description = "Tier Validation Exceptions"
|
12
|
+
_rec_name = "model_name"
|
13
|
+
|
14
|
+
@api.model
|
15
|
+
def _get_tier_validation_model_names(self):
|
16
|
+
return self.env["tier.definition"]._get_tier_validation_model_names()
|
17
|
+
|
18
|
+
model_id = fields.Many2one(
|
19
|
+
comodel_name="ir.model",
|
20
|
+
string="Model",
|
21
|
+
required=True,
|
22
|
+
ondelete="cascade",
|
23
|
+
domain=lambda self: [("model", "in", self._get_tier_validation_model_names())],
|
24
|
+
)
|
25
|
+
model_name = fields.Char(
|
26
|
+
related="model_id.model",
|
27
|
+
string="Model",
|
28
|
+
store=True,
|
29
|
+
readonly=True,
|
30
|
+
index=True,
|
31
|
+
)
|
32
|
+
field_ids = fields.Many2many(
|
33
|
+
comodel_name="ir.model.fields",
|
34
|
+
string="Fields",
|
35
|
+
domain="[('id', 'in', valid_model_field_ids)]",
|
36
|
+
required=True,
|
37
|
+
)
|
38
|
+
valid_model_field_ids = fields.One2many(
|
39
|
+
comodel_name="ir.model.fields",
|
40
|
+
compute="_compute_valid_model_field_ids",
|
41
|
+
)
|
42
|
+
company_id = fields.Many2one(
|
43
|
+
comodel_name="res.company",
|
44
|
+
string="Company",
|
45
|
+
default=lambda self: self.env.company,
|
46
|
+
)
|
47
|
+
allowed_to_write_under_validation = fields.Boolean(
|
48
|
+
string="Write under Validation",
|
49
|
+
default=True,
|
50
|
+
)
|
51
|
+
allowed_to_write_after_validation = fields.Boolean(
|
52
|
+
string="Write after Validation",
|
53
|
+
default=True,
|
54
|
+
)
|
55
|
+
|
56
|
+
@api.depends("model_id")
|
57
|
+
def _compute_valid_model_field_ids(self):
|
58
|
+
for record in self:
|
59
|
+
record.valid_model_field_ids = self.env["ir.model.fields"].search(
|
60
|
+
[
|
61
|
+
("model", "=", record.model_name),
|
62
|
+
("name", "not in", BASE_EXCEPTION_FIELDS),
|
63
|
+
]
|
64
|
+
)
|
65
|
+
|
66
|
+
@api.constrains(
|
67
|
+
"allowed_to_write_under_validation", "allowed_to_write_after_validation"
|
68
|
+
)
|
69
|
+
def _check_allowed_to_write(self):
|
70
|
+
if (
|
71
|
+
not self.allowed_to_write_under_validation
|
72
|
+
and not self.allowed_to_write_after_validation
|
73
|
+
):
|
74
|
+
raise exceptions.ValidationError(
|
75
|
+
_(
|
76
|
+
"At least one of these fields must be checked! "
|
77
|
+
"Write under Validation, Write after Validation"
|
78
|
+
)
|
79
|
+
)
|
80
|
+
|
81
|
+
_sql_constraints = [
|
82
|
+
(
|
83
|
+
"model_company_under_after_unique",
|
84
|
+
"unique(model_id, company_id, "
|
85
|
+
"allowed_to_write_under_validation, allowed_to_write_after_validation)",
|
86
|
+
_(
|
87
|
+
"The model already exists for this company with this "
|
88
|
+
"Write Validation configuration!"
|
89
|
+
),
|
90
|
+
)
|
91
|
+
]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
To configure
|
1
|
+
To configure Tier Validations, you need to:
|
2
2
|
|
3
3
|
#. Go to *Settings > Technical > Tier Validations > Tier Definition*.
|
4
4
|
#. Create as many tiers as you want for any model having tier validation
|
@@ -9,3 +9,19 @@ To configure this module, you need to:
|
|
9
9
|
* If check *Notify Reviewers on Creation*, all possible reviewers will be notified by email when this definition is triggered.
|
10
10
|
* If check *Comment*, reviewers can comment after click Validate or Reject.
|
11
11
|
* If check *Approve by sequence*, reviewers is forced to review by specified sequence.
|
12
|
+
|
13
|
+
|
14
|
+
To configure Tier Validation Exceptions, you need to:
|
15
|
+
|
16
|
+
#. Go to *Settings > Technical > Tier Validations > Tier Validation Exceptions*.
|
17
|
+
#. Create as many tiers validation exceptions as you want for any model
|
18
|
+
having tier validation functionality.
|
19
|
+
#. Add desired fields to be checked in *Fields*.
|
20
|
+
#. You must check *Write under Validation*, *Write after Validation* or both.
|
21
|
+
|
22
|
+
**Note:**
|
23
|
+
|
24
|
+
* If you don't create any exception, the Validated record will be readonly and cannot be modified.
|
25
|
+
* If check *Write under Validation*, records will be able to be modified only in the defined fields when the Validation process is ongoing.
|
26
|
+
* If check *Write after Validation*, records will be able to be modified only in the defined fields when the Validation process is finished.
|
27
|
+
* If check *Write after Validation* and *Write under Validation*, records will be able to be modified defined fields always.
|
@@ -3,3 +3,5 @@ access_tier_review,access.tier.review,model_tier_review,,1,1,1,1
|
|
3
3
|
access_tier_definition_all,tier.definition.all,model_tier_definition,,1,0,0,0
|
4
4
|
access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_system,1,1,1,1
|
5
5
|
access_comment_wizard,access.comment.wizard,model_comment_wizard,,1,1,1,1
|
6
|
+
access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,,1,0,0,0
|
7
|
+
access_tier_validation_exceptions_settings,tier.validation.exceptions,model_tier_validation_exception,base.group_system,1,1,1,1
|
@@ -366,7 +366,7 @@ ul.auto-toc {
|
|
366
366
|
!! This file is generated by oca-gen-addon-readme !!
|
367
367
|
!! changes will be overwritten. !!
|
368
368
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
369
|
-
!! source digest: sha256:
|
369
|
+
!! source digest: sha256:96dd88954cc47c46ce173ae508cecc92f6ce9faaddfe344d79f21dc67cbd4ed4
|
370
370
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
371
371
|
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Mature" src="https://img.shields.io/badge/maturity-Mature-brightgreen.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-ux/tree/16.0/base_tier_validation"><img alt="OCA/server-ux" src="https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_tier_validation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
372
372
|
<p>Validating some operations is a common need across different areas in a company
|
@@ -412,7 +412,7 @@ development.</p>
|
|
412
412
|
</div>
|
413
413
|
<div class="section" id="configuration">
|
414
414
|
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
|
415
|
-
<p>To configure
|
415
|
+
<p>To configure Tier Validations, you need to:</p>
|
416
416
|
<ol class="arabic simple">
|
417
417
|
<li>Go to <em>Settings > Technical > Tier Validations > Tier Definition</em>.</li>
|
418
418
|
<li>Create as many tiers as you want for any model having tier validation
|
@@ -424,6 +424,21 @@ functionality.</li>
|
|
424
424
|
<li>If check <em>Comment</em>, reviewers can comment after click Validate or Reject.</li>
|
425
425
|
<li>If check <em>Approve by sequence</em>, reviewers is forced to review by specified sequence.</li>
|
426
426
|
</ul>
|
427
|
+
<p>To configure Tier Validation Exceptions, you need to:</p>
|
428
|
+
<ol class="arabic simple">
|
429
|
+
<li>Go to <em>Settings > Technical > Tier Validations > Tier Validation Exceptions</em>.</li>
|
430
|
+
<li>Create as many tiers validation exceptions as you want for any model
|
431
|
+
having tier validation functionality.</li>
|
432
|
+
<li>Add desired fields to be checked in <em>Fields</em>.</li>
|
433
|
+
<li>You must check <em>Write under Validation</em>, <em>Write after Validation</em> or both.</li>
|
434
|
+
</ol>
|
435
|
+
<p><strong>Note:</strong></p>
|
436
|
+
<ul class="simple">
|
437
|
+
<li>If you don’t create any exception, the Validated record will be readonly and cannot be modified.</li>
|
438
|
+
<li>If check <em>Write under Validation</em>, records will be able to be modified only in the defined fields when the Validation process is ongoing.</li>
|
439
|
+
<li>If check <em>Write after Validation</em>, records will be able to be modified only in the defined fields when the Validation process is finished.</li>
|
440
|
+
<li>If check <em>Write after Validation</em> and <em>Write under Validation</em>, records will be able to be modified defined fields always.</li>
|
441
|
+
</ul>
|
427
442
|
</div>
|
428
443
|
<div class="section" id="known-issues-roadmap">
|
429
444
|
<h1><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h1>
|
@@ -564,6 +579,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
|
564
579
|
<li>Saran Lim. <<a class="reference external" href="mailto:saranl@ecosoft.co.th">saranl@ecosoft.co.th</a>></li>
|
565
580
|
<li>Evan Soh <<a class="reference external" href="mailto:evan.soh@omnisoftsolution.com">evan.soh@omnisoftsolution.com</a>></li>
|
566
581
|
<li>Manuel Regidor <<a class="reference external" href="mailto:manuel.regidor@sygel.es">manuel.regidor@sygel.es</a>></li>
|
582
|
+
<li>Eduardo de Miguel <<a class="reference external" href="mailto:edu@moduon.team">edu@moduon.team</a>></li>
|
567
583
|
</ul>
|
568
584
|
</div>
|
569
585
|
<div class="section" id="maintainers">
|