odoo-addon-base-tier-validation 16.0.1.6.1.7__py3-none-any.whl → 16.0.2.0.0__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 (19) 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 +162 -18
  5. odoo/addons/base_tier_validation/models/__init__.py +1 -0
  6. odoo/addons/base_tier_validation/models/tier_validation.py +113 -4
  7. odoo/addons/base_tier_validation/models/tier_validation_exception.py +91 -0
  8. odoo/addons/base_tier_validation/readme/CONFIGURE.rst +17 -1
  9. odoo/addons/base_tier_validation/readme/CONTRIBUTORS.rst +1 -0
  10. odoo/addons/base_tier_validation/security/ir.model.access.csv +2 -0
  11. odoo/addons/base_tier_validation/static/description/index.html +18 -2
  12. odoo/addons/base_tier_validation/tests/test_tier_validation.py +54 -0
  13. odoo/addons/base_tier_validation/tests/tier_validation_tester.py +2 -0
  14. odoo/addons/base_tier_validation/views/tier_definition_view.xml +1 -0
  15. odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml +112 -0
  16. {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.dist-info}/METADATA +20 -3
  17. {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.dist-info}/RECORD +19 -17
  18. {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.dist-info}/WHEEL +0 -0
  19. {odoo_addon_base_tier_validation-16.0.1.6.1.7.dist-info → odoo_addon_base_tier_validation-16.0.2.0.0.dist-info}/top_level.txt +0 -0
@@ -4,17 +4,18 @@
4
4
  #
5
5
  msgid ""
6
6
  msgstr ""
7
- "Project-Id-Version: Odoo Server 13.0\n"
7
+ "Project-Id-Version: Odoo Server 16.0\n"
8
8
  "Report-Msgid-Bugs-To: \n"
9
- "PO-Revision-Date: 2024-02-14 19:37+0000\n"
10
- "Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
11
- "Language-Team: none\n"
9
+ "POT-Creation-Date: 2024-06-27 08:13+0000\n"
10
+ "PO-Revision-Date: 2024-06-27 10:19+0200\n"
11
+ "Last-Translator: \n"
12
+ "Language-Team: \n"
12
13
  "Language: es\n"
13
14
  "MIME-Version: 1.0\n"
14
15
  "Content-Type: text/plain; charset=UTF-8\n"
15
16
  "Content-Transfer-Encoding: 8bit\n"
16
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
- "X-Generator: Weblate 4.17\n"
17
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
+ "X-Generator: Poedit 3.4.4\n"
18
19
 
19
20
  #. module: base_tier_validation
20
21
  #. odoo-javascript
@@ -60,6 +61,11 @@ msgstr ""
60
61
  " <b>validada</b>\n"
61
62
  " !"
62
63
 
64
+ #. module: base_tier_validation
65
+ #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form
66
+ msgid "<span class=\"oe_edit_only\">Model</span>"
67
+ msgstr "<span class=\"oe_edit_only\">Modelo</span>"
68
+
63
69
  #. module: base_tier_validation
64
70
  #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form
65
71
  msgid "<span class=\"oe_edit_only\">Name</span>"
@@ -168,6 +174,17 @@ msgstr "Aprobado"
168
174
  msgid "Archived"
169
175
  msgstr "Archivado"
170
176
 
177
+ #. module: base_tier_validation
178
+ #. odoo-python
179
+ #: code:addons/base_tier_validation/models/tier_validation_exception.py:0
180
+ #, python-format
181
+ msgid ""
182
+ "At least one of these fields must be checked! Write under Validation, Write "
183
+ "after Validation"
184
+ msgstr ""
185
+ "¡Al menos uno de estos campos debe estar marcado! Escribir en Validación, "
186
+ "Escribir después de Validación"
187
+
171
188
  #. module: base_tier_validation
172
189
  #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass
173
190
  #: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass
@@ -222,18 +239,26 @@ msgstr "Comentarios"
222
239
  #. module: base_tier_validation
223
240
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id
224
241
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id
242
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id
243
+ #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
225
244
  msgid "Company"
226
245
  msgstr "Compañía"
227
246
 
228
247
  #. module: base_tier_validation
229
248
  #: model:ir.model,name:base_tier_validation.model_res_config_settings
230
249
  msgid "Config Settings"
231
- msgstr "Configuración de Ajustes"
250
+ msgstr "Opciones de configuración"
251
+
252
+ #. module: base_tier_validation
253
+ #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
254
+ msgid "Create a new Validation Exception!"
255
+ msgstr "¡Crea una nueva Excepción de Validación!"
232
256
 
233
257
  #. module: base_tier_validation
234
258
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid
235
259
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid
236
260
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid
261
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid
237
262
  msgid "Created by"
238
263
  msgstr "Creado por"
239
264
 
@@ -241,6 +266,7 @@ msgstr "Creado por"
241
266
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date
242
267
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date
243
268
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date
269
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date
244
270
  msgid "Created on"
245
271
  msgstr "Creado en"
246
272
 
@@ -268,6 +294,7 @@ msgstr "Descripción"
268
294
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name
269
295
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name
270
296
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name
297
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name
271
298
  msgid "Display Name"
272
299
  msgstr "Nombre mostrado"
273
300
 
@@ -298,6 +325,11 @@ msgstr "Hecho Por"
298
325
  msgid "Field in related record"
299
326
  msgstr "Campo en el registro relacionado"
300
327
 
328
+ #. module: base_tier_validation
329
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids
330
+ msgid "Fields"
331
+ msgstr "Campos"
332
+
301
333
  #. module: base_tier_validation
302
334
  #. odoo-python
303
335
  #: code:addons/base_tier_validation/models/tier_review.py:0
@@ -319,8 +351,9 @@ msgstr "Ha comentado"
319
351
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id
320
352
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id
321
353
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id
354
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id
322
355
  msgid "ID"
323
- msgstr "ID"
356
+ msgstr ""
324
357
 
325
358
  #. module: base_tier_validation
326
359
  #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create
@@ -337,6 +370,8 @@ msgid ""
337
370
  "If set, reviewers will be notified by email when a review related to this "
338
371
  "definition is accepted."
339
372
  msgstr ""
373
+ "Si está establecido, los revisores serán notificados por email cuando una "
374
+ "revisión relativa a ésta definición es aceptada."
340
375
 
341
376
  #. module: base_tier_validation
342
377
  #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected
@@ -344,6 +379,8 @@ msgid ""
344
379
  "If set, reviewers will be notified by email when a review related to this "
345
380
  "definition is rejected."
346
381
  msgstr ""
382
+ "Si está establecido, los revisores serán notificados por email cuando una "
383
+ "revisión relativa a ésta definición es rechazada."
347
384
 
348
385
  #. module: base_tier_validation
349
386
  #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted
@@ -351,11 +388,24 @@ msgid ""
351
388
  "If set, reviewers will be notified by email when a reviews related to this "
352
389
  "definition are restarted."
353
390
  msgstr ""
391
+ "Si está establecido, los revisores serán notificados por email cuando una "
392
+ "revisión relativa a ésta definición se ha reiniciado."
393
+
394
+ #. module: base_tier_validation
395
+ #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
396
+ msgid "It's fully validated"
397
+ msgstr "Completamente Validado"
398
+
399
+ #. module: base_tier_validation
400
+ #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
401
+ msgid "It's in the validation process"
402
+ msgstr "Está en proceso de Validación"
354
403
 
355
404
  #. module: base_tier_validation
356
405
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update
357
406
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update
358
407
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update
408
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update
359
409
  msgid "Last Modified on"
360
410
  msgstr "Última modificación en"
361
411
 
@@ -363,6 +413,7 @@ msgstr "Última modificación en"
363
413
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid
364
414
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid
365
415
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid
416
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid
366
417
  msgid "Last Updated by"
367
418
  msgstr "Última actualización de"
368
419
 
@@ -370,11 +421,14 @@ msgstr "Última actualización de"
370
421
  #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date
371
422
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date
372
423
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date
424
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date
373
425
  msgid "Last Updated on"
374
426
  msgstr "Última actualización en"
375
427
 
376
428
  #. module: base_tier_validation
377
429
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model
430
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id
431
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name
378
432
  #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search
379
433
  msgid "Model"
380
434
  msgstr "Modelo"
@@ -418,7 +472,7 @@ msgstr "No hay revisiones a realizar."
418
472
  #. module: base_tier_validation
419
473
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted
420
474
  msgid "Notify Reviewers on Accepted"
421
- msgstr ""
475
+ msgstr "Notificar revisores cuando se Acepta"
422
476
 
423
477
  #. module: base_tier_validation
424
478
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create
@@ -428,12 +482,21 @@ msgstr "Notificar a los revisores en la creación"
428
482
  #. module: base_tier_validation
429
483
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected
430
484
  msgid "Notify Reviewers on Rejected"
431
- msgstr ""
485
+ msgstr "Notificar revisores cuando se Rechaza"
432
486
 
433
487
  #. module: base_tier_validation
434
488
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted
435
489
  msgid "Notify Reviewers on Restarted"
490
+ msgstr "Notificar revisores cuando se Reinicia"
491
+
492
+ #. module: base_tier_validation
493
+ #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
494
+ msgid ""
495
+ "Once created, you can decide which fields you want to be editable when the "
496
+ "record:"
436
497
  msgstr ""
498
+ "Una vez creada, puedes decidir qué campos quieres que sean editables en el "
499
+ "registro:"
437
500
 
438
501
  #. module: base_tier_validation
439
502
  #. odoo-python
@@ -465,6 +528,7 @@ msgstr ""
465
528
  #. module: base_tier_validation
466
529
  #. odoo-javascript
467
530
  #: code:addons/base_tier_validation/static/src/xml/systray.xml:0
531
+ #: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending
468
532
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending
469
533
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending
470
534
  #, python-format
@@ -483,6 +547,7 @@ msgstr "Rechazar"
483
547
 
484
548
  #. module: base_tier_validation
485
549
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected
550
+ #: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected
486
551
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected
487
552
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected
488
553
  msgid "Rejected"
@@ -577,7 +642,6 @@ msgstr "Revisiones"
577
642
  #. odoo-javascript
578
643
  #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0
579
644
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence
580
- #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence
581
645
  #, python-format
582
646
  msgid "Sequence"
583
647
  msgstr "Secuencia"
@@ -597,10 +661,15 @@ msgstr "Estado"
597
661
 
598
662
  #. module: base_tier_validation
599
663
  #. odoo-python
600
- #: code:addons/base_tier_validation/models/tier_validation.py:0
664
+ #: code:addons/base_tier_validation/models/tier_validation_exception.py:0
665
+ #: model:ir.model.constraint,message:base_tier_validation.constraint_tier_validation_exception_model_company_under_after_unique
601
666
  #, python-format
602
- msgid "The operation is under validation."
603
- msgstr "Esta operación está en proceso de validación."
667
+ msgid ""
668
+ "The model already exists for this company with this Write Validation "
669
+ "configuration!"
670
+ msgstr ""
671
+ "¡El modelo ya existe para la misma compañía con esta configuración de "
672
+ "Escritura de Validación!"
604
673
 
605
674
  #. module: base_tier_validation
606
675
  #. odoo-python
@@ -634,6 +703,11 @@ msgstr ""
634
703
  "Esta acción necesita ser validada para algún registro.\n"
635
704
  "Por favor, solicita una validación."
636
705
 
706
+ #. module: base_tier_validation
707
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence
708
+ msgid "Tier"
709
+ msgstr "Secuencia"
710
+
637
711
  #. module: base_tier_validation
638
712
  #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action
639
713
  #: model:ir.model,name:base_tier_validation.model_tier_definition
@@ -672,6 +746,18 @@ msgstr "Validaciones de Nivel (abstracto)"
672
746
  msgid "Tier Validation Accepted Notification"
673
747
  msgstr "Notificación de Validación de Nivel Aceptada"
674
748
 
749
+ #. module: base_tier_validation
750
+ #: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action
751
+ #: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception
752
+ #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form
753
+ msgid "Tier Validation Exception"
754
+ msgstr "Excepción de Validación del Tier"
755
+
756
+ #. module: base_tier_validation
757
+ #: model:ir.model,name:base_tier_validation.model_tier_validation_exception
758
+ msgid "Tier Validation Exceptions"
759
+ msgstr "Excepciones de Validación del Tier"
760
+
675
761
  #. module: base_tier_validation
676
762
  #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected
677
763
  msgid "Tier Validation Rejected Notification"
@@ -712,7 +798,12 @@ msgstr "Para hacer por"
712
798
  #. module: base_tier_validation
713
799
  #: model:ir.model,name:base_tier_validation.model_res_users
714
800
  msgid "User"
715
- msgstr "usuario"
801
+ msgstr "Usuario"
802
+
803
+ #. module: base_tier_validation
804
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids
805
+ msgid "Valid Model Field"
806
+ msgstr ""
716
807
 
717
808
  #. module: base_tier_validation
718
809
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids
@@ -731,6 +822,7 @@ msgstr "Validar Rechazar"
731
822
 
732
823
  #. module: base_tier_validation
733
824
  #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated
825
+ #: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated
734
826
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated
735
827
  msgid "Validated"
736
828
  msgstr "Validado"
@@ -770,14 +862,66 @@ msgid "Validations"
770
862
  msgstr "Validaciones"
771
863
 
772
864
  #. module: base_tier_validation
865
+ #: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no
773
866
  #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no
774
867
  msgid "Without validation"
775
868
  msgstr "Sin validación"
776
869
 
870
+ #. module: base_tier_validation
871
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation
872
+ msgid "Write after Validation"
873
+ msgstr "Escritura tras Validación"
874
+
875
+ #. module: base_tier_validation
876
+ #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
877
+ msgid "Write after validation"
878
+ msgstr "Escritura tras validación"
879
+
880
+ #. module: base_tier_validation
881
+ #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation
882
+ msgid "Write under Validation"
883
+ msgstr "Escritura mientras Validación"
884
+
885
+ #. module: base_tier_validation
886
+ #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search
887
+ msgid "Write under validation"
888
+ msgstr "Escritura mientras validación"
889
+
890
+ #. module: base_tier_validation
891
+ #. odoo-python
892
+ #: code:addons/base_tier_validation/models/tier_validation.py:0
893
+ #, python-format
894
+ msgid ""
895
+ "You are not allowed to write those fields after validation.\n"
896
+ "- %(not_allowed_fields)s\n"
897
+ "\n"
898
+ "Only those fields can be modified:\n"
899
+ "- %(allowed_fields)s"
900
+ msgstr ""
901
+ "No puedes escribir estos campos tras una validación.\n"
902
+ "- %(not_allowed_fields)s\n"
903
+ "\n"
904
+ "Solo estos campos pueden ser modificados:\n"
905
+ "- %(allowed_fields)s"
906
+
907
+ #. module: base_tier_validation
908
+ #. odoo-python
909
+ #: code:addons/base_tier_validation/models/tier_validation.py:0
910
+ #, python-format
911
+ msgid ""
912
+ "You are not allowed to write those fields under validation.\n"
913
+ "- %(not_allowed_fields)s\n"
914
+ "\n"
915
+ "Only those fields can be modified:\n"
916
+ "- %(allowed_fields)s"
917
+ msgstr ""
918
+ "No puedes escribir estos campos mientras está validándose.\n"
919
+ "- %(not_allowed_fields)s\n"
920
+ "\n"
921
+ "Solo estos campos pueden ser modificados:\n"
922
+ "- %(allowed_fields)s"
923
+
777
924
  #. module: base_tier_validation
778
925
  #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form
779
926
  msgid "e.g. Tier Validation for..."
780
927
  msgstr "ej. Validación de Nivel por..."
781
-
782
- #~ msgid "Tier"
783
- #~ msgstr "Nivel"
@@ -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