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.
Files changed (26) hide show
  1. odoo/addons/base_tier_validation/README.rst +19 -2
  2. odoo/addons/base_tier_validation/__manifest__.py +2 -1
  3. odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +119 -3
  4. odoo/addons/base_tier_validation/i18n/es.po +155 -16
  5. odoo/addons/base_tier_validation/i18n/es_MX.po +124 -4
  6. odoo/addons/base_tier_validation/i18n/fr.po +124 -4
  7. odoo/addons/base_tier_validation/i18n/it.po +124 -4
  8. odoo/addons/base_tier_validation/i18n/nl_NL.po +124 -4
  9. odoo/addons/base_tier_validation/i18n/sv.po +124 -4
  10. odoo/addons/base_tier_validation/i18n/tr.po +124 -4
  11. odoo/addons/base_tier_validation/i18n/zh_CN.po +124 -4
  12. odoo/addons/base_tier_validation/models/__init__.py +1 -0
  13. odoo/addons/base_tier_validation/models/tier_validation.py +113 -4
  14. odoo/addons/base_tier_validation/models/tier_validation_exception.py +91 -0
  15. odoo/addons/base_tier_validation/readme/CONFIGURE.rst +17 -1
  16. odoo/addons/base_tier_validation/readme/CONTRIBUTORS.rst +1 -0
  17. odoo/addons/base_tier_validation/security/ir.model.access.csv +2 -0
  18. odoo/addons/base_tier_validation/static/description/index.html +18 -2
  19. odoo/addons/base_tier_validation/tests/test_tier_validation.py +54 -0
  20. odoo/addons/base_tier_validation/tests/tier_validation_tester.py +2 -0
  21. odoo/addons/base_tier_validation/views/tier_definition_view.xml +1 -0
  22. odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml +112 -0
  23. {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
  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}/RECORD +26 -24
  25. {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
  26. {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/tier_validation.py:0
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 "The operation is under validation."
583
- msgstr "该操作正在审批中。"
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,6 +1,7 @@
1
1
  # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
2
2
 
3
3
  from . import tier_definition
4
+ from . import tier_validation_exception
4
5
  from . import tier_review
5
6
  from . import tier_validation
6
7
  from . import res_users
@@ -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 ["message_follower_ids", "access_token"]
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
- raise ValidationError(_("The operation is under validation."))
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._get_under_validation_exceptions()
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 this module, you need to:
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.
@@ -7,3 +7,4 @@
7
7
  * Saran Lim. <saranl@ecosoft.co.th>
8
8
  * Evan Soh <evan.soh@omnisoftsolution.com>
9
9
  * Manuel Regidor <manuel.regidor@sygel.es>
10
+ * Eduardo de Miguel <edu@moduon.team>
@@ -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:1de1f7153efbd73020d8b6c2bf1c5167c7402be8ed14cabf91211a1c4c9a10ad
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&amp;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 this module, you need to:</p>
415
+ <p>To configure Tier Validations, you need to:</p>
416
416
  <ol class="arabic simple">
417
417
  <li>Go to <em>Settings &gt; Technical &gt; Tier Validations &gt; 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 &gt; Technical &gt; Tier Validations &gt; 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. &lt;<a class="reference external" href="mailto:saranl&#64;ecosoft.co.th">saranl&#64;ecosoft.co.th</a>&gt;</li>
565
580
  <li>Evan Soh &lt;<a class="reference external" href="mailto:evan.soh&#64;omnisoftsolution.com">evan.soh&#64;omnisoftsolution.com</a>&gt;</li>
566
581
  <li>Manuel Regidor &lt;<a class="reference external" href="mailto:manuel.regidor&#64;sygel.es">manuel.regidor&#64;sygel.es</a>&gt;</li>
582
+ <li>Eduardo de Miguel &lt;<a class="reference external" href="mailto:edu&#64;moduon.team">edu&#64;moduon.team</a>&gt;</li>
567
583
  </ul>
568
584
  </div>
569
585
  <div class="section" id="maintainers">