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.
- 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 +162 -18
- 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.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.dist-info}/RECORD +19 -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}/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.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
|
7
|
+
"Project-Id-Version: Odoo Server 16.0\n"
|
8
8
|
"Report-Msgid-Bugs-To: \n"
|
9
|
-
"
|
10
|
-
"
|
11
|
-
"
|
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:
|
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 "
|
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 "
|
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/
|
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 "
|
603
|
-
|
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 "
|
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,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
|