odoo-addon-base-tier-validation 17.0.2.1.2__py3-none-any.whl → 17.0.2.2.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 +9 -1
- odoo/addons/base_tier_validation/__manifest__.py +1 -1
- odoo/addons/base_tier_validation/models/res_users.py +0 -16
- odoo/addons/base_tier_validation/models/tier_validation.py +44 -4
- odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md +1 -0
- odoo/addons/base_tier_validation/readme/DESCRIPTION.md +5 -0
- odoo/addons/base_tier_validation/static/description/index.html +7 -1
- odoo/addons/base_tier_validation/tests/common.py +43 -24
- odoo/addons/base_tier_validation/tests/test_tier_validation.py +30 -5
- odoo/addons/base_tier_validation/tests/tier_validation_tester.py +54 -0
- {odoo_addon_base_tier_validation-17.0.2.1.2.dist-info → odoo_addon_base_tier_validation-17.0.2.2.0.dist-info}/METADATA +10 -2
- {odoo_addon_base_tier_validation-17.0.2.1.2.dist-info → odoo_addon_base_tier_validation-17.0.2.2.0.dist-info}/RECORD +14 -14
- {odoo_addon_base_tier_validation-17.0.2.1.2.dist-info → odoo_addon_base_tier_validation-17.0.2.2.0.dist-info}/WHEEL +1 -1
- {odoo_addon_base_tier_validation-17.0.2.1.2.dist-info → odoo_addon_base_tier_validation-17.0.2.2.0.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ Base Tier Validation
|
|
7
7
|
!! This file is generated by oca-gen-addon-readme !!
|
8
8
|
!! changes will be overwritten. !!
|
9
9
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
10
|
-
!! source digest: sha256:
|
10
|
+
!! source digest: sha256:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
|
11
11
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
12
12
|
|
13
13
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
|
@@ -44,6 +44,12 @@ See
|
|
44
44
|
`purchase_tier_validation <https://github.com/OCA/purchase-workflow>`__
|
45
45
|
as an example of implementation.
|
46
46
|
|
47
|
+
Additionally, if your state field is a (stored) computed field, you need
|
48
|
+
to set ``_tier_validation_state_field_is_computed`` to ``True`` in your
|
49
|
+
model Python file, and you will want to add the dependent fields of the
|
50
|
+
compute method in ``_get_after_validation_exceptions`` and
|
51
|
+
``_get_under_validation_exceptions``.
|
52
|
+
|
47
53
|
**Table of contents**
|
48
54
|
|
49
55
|
.. contents::
|
@@ -264,6 +270,8 @@ Contributors
|
|
264
270
|
|
265
271
|
- Houzéfa Abbasbhay
|
266
272
|
|
273
|
+
- Stefan Rijnhart <stefan@opener.amsterdam>
|
274
|
+
|
267
275
|
Maintainers
|
268
276
|
-----------
|
269
277
|
|
@@ -45,19 +45,3 @@ class Users(models.Model):
|
|
45
45
|
"pending_count": len(records),
|
46
46
|
}
|
47
47
|
return list(user_reviews.values())
|
48
|
-
|
49
|
-
@api.model
|
50
|
-
def get_reviews(self, data):
|
51
|
-
review_obj = self.env["tier.review"].with_context(lang=self.env.user.lang)
|
52
|
-
res = review_obj.search_read([("id", "in", data.get("res_ids"))])
|
53
|
-
for r in res:
|
54
|
-
# Get the translated status value.
|
55
|
-
r["display_status"] = dict(
|
56
|
-
review_obj.fields_get("status")["status"]["selection"]
|
57
|
-
).get(r.get("status"))
|
58
|
-
# Convert to datetime timezone
|
59
|
-
if r["reviewed_date"]:
|
60
|
-
r["reviewed_date"] = fields.Datetime.context_timestamp(
|
61
|
-
self, r["reviewed_date"]
|
62
|
-
)
|
63
|
-
return res
|
@@ -5,6 +5,7 @@
|
|
5
5
|
from ast import literal_eval
|
6
6
|
|
7
7
|
from lxml import etree
|
8
|
+
from psycopg2.extensions import AsIs
|
8
9
|
|
9
10
|
from odoo import _, api, fields, models
|
10
11
|
from odoo.exceptions import ValidationError
|
@@ -19,6 +20,7 @@ class TierValidation(models.AbstractModel):
|
|
19
20
|
|
20
21
|
_tier_validation_buttons_xpath = "/form/header/button[last()]"
|
21
22
|
_tier_validation_manual_config = True
|
23
|
+
_tier_validation_state_field_is_computed = False
|
22
24
|
|
23
25
|
_state_field = "state"
|
24
26
|
_state_from = ["draft"]
|
@@ -340,6 +342,39 @@ class TierValidation(models.AbstractModel):
|
|
340
342
|
return allowed_field_names, not_allowed_field_names
|
341
343
|
|
342
344
|
def write(self, vals):
|
345
|
+
self._tier_validation_check_state_on_write(vals)
|
346
|
+
self._tier_validation_check_write_allowed(vals)
|
347
|
+
self._tier_validation_check_write_remove_reviews(vals)
|
348
|
+
return super().write(vals)
|
349
|
+
|
350
|
+
def _write(self, vals):
|
351
|
+
if self._tier_validation_state_field_is_computed:
|
352
|
+
self._tier_validation_check_state_on_write(vals)
|
353
|
+
self._tier_validation_check_write_remove_reviews(vals)
|
354
|
+
return super()._write(vals)
|
355
|
+
|
356
|
+
def _tier_validation_get_current_state_value(self):
|
357
|
+
"""Get the current value from the cache or the database.
|
358
|
+
|
359
|
+
If the field is set in a computed method, the value in the cache will
|
360
|
+
already be the updated value, so we need to revert to the raw data.
|
361
|
+
"""
|
362
|
+
self.ensure_one()
|
363
|
+
if self._tier_validation_state_field_is_computed and isinstance(self.id, int):
|
364
|
+
self.env.cr.execute(
|
365
|
+
"select %(field)s from %(table)s where id = %(res_id)s",
|
366
|
+
{
|
367
|
+
"field": AsIs(self._state_field),
|
368
|
+
"table": AsIs(self._table),
|
369
|
+
"res_id": self.id,
|
370
|
+
},
|
371
|
+
)
|
372
|
+
rows = self.env.cr.fetchall()
|
373
|
+
if rows:
|
374
|
+
return rows[0][0]
|
375
|
+
return self[self._state_field]
|
376
|
+
|
377
|
+
def _tier_validation_check_state_on_write(self, vals):
|
343
378
|
for rec in self:
|
344
379
|
if rec._check_state_conditions(vals):
|
345
380
|
if rec.need_validation:
|
@@ -360,6 +395,9 @@ class TierValidation(models.AbstractModel):
|
|
360
395
|
"one record."
|
361
396
|
)
|
362
397
|
)
|
398
|
+
|
399
|
+
def _tier_validation_check_write_allowed(self, vals):
|
400
|
+
for rec in self:
|
363
401
|
# Write under validation
|
364
402
|
if (
|
365
403
|
rec.review_ids
|
@@ -391,7 +429,7 @@ class TierValidation(models.AbstractModel):
|
|
391
429
|
if (
|
392
430
|
rec._get_validation_exceptions(add_base_exceptions=False)
|
393
431
|
and rec.validation_status == "validated"
|
394
|
-
and
|
432
|
+
and rec._tier_validation_get_current_state_value()
|
395
433
|
in (self._state_to + [self._cancel_state])
|
396
434
|
and not rec._check_allow_write_after_validation(vals)
|
397
435
|
and not rec._context.get("skip_validation_check")
|
@@ -413,9 +451,11 @@ class TierValidation(models.AbstractModel):
|
|
413
451
|
"allowed_fields": "\n- ".join(allowed_fields),
|
414
452
|
}
|
415
453
|
)
|
454
|
+
|
455
|
+
def _tier_validation_check_write_remove_reviews(self, vals):
|
456
|
+
for rec in self:
|
416
457
|
if rec._allow_to_remove_reviews(vals):
|
417
458
|
rec.mapped("review_ids").unlink()
|
418
|
-
return super().write(vals)
|
419
459
|
|
420
460
|
def _allow_to_remove_reviews(self, values):
|
421
461
|
"""Method for deciding whether the elimination of revisions is necessary."""
|
@@ -423,7 +463,7 @@ class TierValidation(models.AbstractModel):
|
|
423
463
|
state_to = values.get(self._state_field)
|
424
464
|
if not state_to:
|
425
465
|
return False
|
426
|
-
state_from = self
|
466
|
+
state_from = self._tier_validation_get_current_state_value()
|
427
467
|
# If you change to _cancel_state
|
428
468
|
if state_to in (self._cancel_state):
|
429
469
|
return True
|
@@ -435,7 +475,7 @@ class TierValidation(models.AbstractModel):
|
|
435
475
|
def _check_state_from_condition(self):
|
436
476
|
return self.env.context.get("skip_check_state_condition") or (
|
437
477
|
self._state_field in self._fields
|
438
|
-
and
|
478
|
+
and self._tier_validation_get_current_state_value() in self._state_from
|
439
479
|
)
|
440
480
|
|
441
481
|
def _check_state_conditions(self, vals):
|
@@ -12,3 +12,8 @@ some development.
|
|
12
12
|
|
13
13
|
See [purchase_tier_validation](https://github.com/OCA/purchase-workflow)
|
14
14
|
as an example of implementation.
|
15
|
+
|
16
|
+
Additionally, if your state field is a (stored) computed field, you need to
|
17
|
+
set `_tier_validation_state_field_is_computed` to `True` in your model Python
|
18
|
+
file, and you will want to add the dependent fields of the compute method
|
19
|
+
in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`.
|
@@ -367,7 +367,7 @@ ul.auto-toc {
|
|
367
367
|
!! This file is generated by oca-gen-addon-readme !!
|
368
368
|
!! changes will be overwritten. !!
|
369
369
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
370
|
-
!! source digest: sha256:
|
370
|
+
!! source digest: sha256:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
|
371
371
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
372
372
|
<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/17.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-17-0/server-ux-17-0-base_tier_validation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
373
373
|
<p>Validating some operations is a common need across different areas in a
|
@@ -382,6 +382,11 @@ some development.</p>
|
|
382
382
|
<p>See
|
383
383
|
<a class="reference external" href="https://github.com/OCA/purchase-workflow">purchase_tier_validation</a>
|
384
384
|
as an example of implementation.</p>
|
385
|
+
<p>Additionally, if your state field is a (stored) computed field, you need
|
386
|
+
to set <tt class="docutils literal">_tier_validation_state_field_is_computed</tt> to <tt class="docutils literal">True</tt> in your
|
387
|
+
model Python file, and you will want to add the dependent fields of the
|
388
|
+
compute method in <tt class="docutils literal">_get_after_validation_exceptions</tt> and
|
389
|
+
<tt class="docutils literal">_get_under_validation_exceptions</tt>.</p>
|
385
390
|
<p><strong>Table of contents</strong></p>
|
386
391
|
<div class="contents local topic" id="contents">
|
387
392
|
<ul class="simple">
|
@@ -618,6 +623,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
|
618
623
|
<li>Houzéfa Abbasbhay</li>
|
619
624
|
</ul>
|
620
625
|
</li>
|
626
|
+
<li>Stefan Rijnhart <<a class="reference external" href="mailto:stefan@opener.amsterdam">stefan@opener.amsterdam</a>></li>
|
621
627
|
</ul>
|
622
628
|
</div>
|
623
629
|
<div class="section" id="maintainers">
|
@@ -19,14 +19,21 @@ class CommonTierValidation(common.TransactionCase):
|
|
19
19
|
TierDefinition,
|
20
20
|
TierValidationTester,
|
21
21
|
TierValidationTester2,
|
22
|
+
TierValidationTesterComputed,
|
22
23
|
)
|
23
24
|
|
24
25
|
cls.loader.update_registry(
|
25
|
-
(
|
26
|
+
(
|
27
|
+
TierValidationTester,
|
28
|
+
TierValidationTester2,
|
29
|
+
TierValidationTesterComputed,
|
30
|
+
TierDefinition,
|
31
|
+
)
|
26
32
|
)
|
27
33
|
|
28
34
|
cls.test_model = cls.env[TierValidationTester._name]
|
29
35
|
cls.test_model_2 = cls.env[TierValidationTester2._name]
|
36
|
+
cls.test_model_computed = cls.env[TierValidationTesterComputed._name]
|
30
37
|
|
31
38
|
cls.tester_model = cls.env["ir.model"].search(
|
32
39
|
[("model", "=", "tier.validation.tester")]
|
@@ -34,34 +41,32 @@ class CommonTierValidation(common.TransactionCase):
|
|
34
41
|
cls.tester_model_2 = cls.env["ir.model"].search(
|
35
42
|
[("model", "=", "tier.validation.tester2")]
|
36
43
|
)
|
37
|
-
|
38
|
-
|
39
|
-
cls.env["ir.model.access"].create(
|
40
|
-
{
|
41
|
-
"name": "access.tester",
|
42
|
-
"model_id": cls.tester_model.id,
|
43
|
-
"perm_read": 1,
|
44
|
-
"perm_write": 1,
|
45
|
-
"perm_create": 1,
|
46
|
-
"perm_unlink": 1,
|
47
|
-
}
|
44
|
+
cls.tester_model_computed = cls.env["ir.model"].search(
|
45
|
+
[("model", "=", "tier.validation.tester.computed")]
|
48
46
|
)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
"perm_write": 1,
|
55
|
-
"perm_create": 1,
|
56
|
-
"perm_unlink": 1,
|
57
|
-
}
|
47
|
+
|
48
|
+
models = (
|
49
|
+
cls.tester_model,
|
50
|
+
cls.tester_model_2,
|
51
|
+
cls.tester_model_computed,
|
58
52
|
)
|
53
|
+
for model in models:
|
54
|
+
# Access record:
|
55
|
+
cls.env["ir.model.access"].create(
|
56
|
+
{
|
57
|
+
"name": f"access {model.name}",
|
58
|
+
"model_id": model.id,
|
59
|
+
"perm_read": 1,
|
60
|
+
"perm_write": 1,
|
61
|
+
"perm_create": 1,
|
62
|
+
"perm_unlink": 1,
|
63
|
+
}
|
64
|
+
)
|
59
65
|
|
60
|
-
|
61
|
-
for model in cls.test_model._name, cls.test_model_2._name:
|
66
|
+
# Define views to avoid automatic views with all fields.
|
62
67
|
cls.env["ir.ui.view"].create(
|
63
68
|
{
|
64
|
-
"model": model,
|
69
|
+
"model": model.model,
|
65
70
|
"name": f"Demo view for {model}",
|
66
71
|
"arch": """<form>
|
67
72
|
<header>
|
@@ -103,6 +108,7 @@ class CommonTierValidation(common.TransactionCase):
|
|
103
108
|
|
104
109
|
cls.test_record = cls.test_model.create({"test_field": 1.0})
|
105
110
|
cls.test_record_2 = cls.test_model_2.create({"test_field": 1.0})
|
111
|
+
cls.test_record_computed = cls.test_model_computed.create({"test_field": 1.0})
|
106
112
|
|
107
113
|
cls.tier_def_obj.create(
|
108
114
|
{
|
@@ -142,6 +148,19 @@ class CommonTierValidation(common.TransactionCase):
|
|
142
148
|
}
|
143
149
|
)
|
144
150
|
|
151
|
+
cls.tier_def_obj.create(
|
152
|
+
{
|
153
|
+
"model_id": cls.tester_model_computed.id,
|
154
|
+
"review_type": "individual",
|
155
|
+
"reviewer_id": cls.test_user_1.id,
|
156
|
+
"definition_domain": "[]",
|
157
|
+
"approve_sequence": True,
|
158
|
+
"notify_on_pending": False,
|
159
|
+
"sequence": 20,
|
160
|
+
"name": "Definition for computed model",
|
161
|
+
}
|
162
|
+
)
|
163
|
+
|
145
164
|
@classmethod
|
146
165
|
def tearDownClass(cls):
|
147
166
|
cls.loader.restore_registry()
|
@@ -417,9 +417,7 @@ class TierTierValidation(CommonTierValidation):
|
|
417
417
|
# Request validation
|
418
418
|
review = test_record.with_user(self.test_user_2).request_validation()
|
419
419
|
self.assertTrue(review)
|
420
|
-
self.
|
421
|
-
self.assertTrue(self.test_user_1.review_ids)
|
422
|
-
test_record.invalidate_model()
|
420
|
+
self.env.invalidate_all()
|
423
421
|
self.assertTrue(test_record.review_ids)
|
424
422
|
# Used by front-end
|
425
423
|
count = self.test_user_1.with_user(self.test_user_1).review_user_count()
|
@@ -475,8 +473,6 @@ class TierTierValidation(CommonTierValidation):
|
|
475
473
|
self.assertEqual(len(records), 1)
|
476
474
|
review = self.test_record.with_user(self.test_user_2.id).request_validation()
|
477
475
|
self.assertTrue(review)
|
478
|
-
self.assertTrue(self.test_user_1.get_reviews({"res_ids": review.ids}))
|
479
|
-
self.assertTrue(self.test_user_1.review_ids)
|
480
476
|
self.test_record.with_user(self.test_user_1.id).request_validation()
|
481
477
|
|
482
478
|
def test_18_test_review_by_res_users_field(self):
|
@@ -974,6 +970,35 @@ class TierTierValidation(CommonTierValidation):
|
|
974
970
|
)
|
975
971
|
self.assertEqual(self.test_record.test_validation_field, 4)
|
976
972
|
|
973
|
+
def test_26_computed_state_field(self):
|
974
|
+
"""Test the regular flow on a model where state is a computed field"""
|
975
|
+
# The record cannot be confirmed without validation
|
976
|
+
with self.assertRaisesRegex(
|
977
|
+
ValidationError,
|
978
|
+
"This action needs to be validated",
|
979
|
+
):
|
980
|
+
with self.env.cr.savepoint():
|
981
|
+
self.test_record_computed.action_confirm()
|
982
|
+
# Flush manually to trigger the _write
|
983
|
+
self.test_record_computed.flush_recordset()
|
984
|
+
self.assertEqual(self.test_record_computed.state, "draft")
|
985
|
+
# The validation is performed
|
986
|
+
self.test_record_computed.request_validation()
|
987
|
+
self.test_record_computed.invalidate_recordset()
|
988
|
+
self.assertEqual(self.test_record_computed.review_ids.status, "waiting")
|
989
|
+
self.test_record_computed.with_user(self.test_user_1).validate_tier()
|
990
|
+
self.test_record_computed.invalidate_recordset()
|
991
|
+
self.assertEqual(self.test_record_computed.review_ids.status, "approved")
|
992
|
+
# After validation, the record can be confirmed
|
993
|
+
self.test_record_computed.action_confirm()
|
994
|
+
self.test_record_computed.flush_recordset()
|
995
|
+
self.assertEqual(self.test_record_computed.state, "confirmed")
|
996
|
+
# After cancelling, the reviews are removed
|
997
|
+
self.test_record_computed.action_cancel()
|
998
|
+
self.test_record_computed.flush_recordset()
|
999
|
+
self.assertFalse(self.test_record_computed.review_ids)
|
1000
|
+
self.test_record_computed.invalidate_recordset()
|
1001
|
+
|
977
1002
|
|
978
1003
|
@tagged("at_install")
|
979
1004
|
class TierTierValidationView(CommonTierValidation):
|
@@ -48,6 +48,59 @@ class TierValidationTester2(models.Model):
|
|
48
48
|
self.write({"state": "confirmed"})
|
49
49
|
|
50
50
|
|
51
|
+
class TierValidationTesterComputed(models.Model):
|
52
|
+
_name = "tier.validation.tester.computed"
|
53
|
+
_description = "Tier Validation Tester Computed"
|
54
|
+
_inherit = ["tier.validation"]
|
55
|
+
_tier_validation_manual_config = False
|
56
|
+
_tier_validation_state_field_is_computed = True
|
57
|
+
|
58
|
+
confirmed = fields.Boolean()
|
59
|
+
cancelled = fields.Boolean()
|
60
|
+
state = fields.Selection(
|
61
|
+
selection=[
|
62
|
+
("draft", "Draft"),
|
63
|
+
("confirmed", "Confirmed"),
|
64
|
+
("cancel", "Cancel"),
|
65
|
+
],
|
66
|
+
compute="_compute_state",
|
67
|
+
store=True,
|
68
|
+
)
|
69
|
+
test_field = fields.Float()
|
70
|
+
test_validation_field = fields.Float()
|
71
|
+
user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users")
|
72
|
+
|
73
|
+
@api.model
|
74
|
+
def _get_after_validation_exceptions(self):
|
75
|
+
return super()._get_after_validation_exceptions() + [
|
76
|
+
"confirmed",
|
77
|
+
"cancelled",
|
78
|
+
]
|
79
|
+
|
80
|
+
@api.model
|
81
|
+
def _get_under_validation_exceptions(self):
|
82
|
+
return super()._get_under_validation_exceptions() + [
|
83
|
+
"confirmed",
|
84
|
+
"cancelled",
|
85
|
+
]
|
86
|
+
|
87
|
+
@api.depends("confirmed", "cancelled")
|
88
|
+
def _compute_state(self):
|
89
|
+
for rec in self:
|
90
|
+
if rec.cancelled:
|
91
|
+
rec.state = "cancel"
|
92
|
+
elif rec.confirmed:
|
93
|
+
rec.state = "confirmed"
|
94
|
+
else:
|
95
|
+
rec.state = "draft"
|
96
|
+
|
97
|
+
def action_confirm(self):
|
98
|
+
self.write({"confirmed": True})
|
99
|
+
|
100
|
+
def action_cancel(self):
|
101
|
+
self.write({"cancelled": True})
|
102
|
+
|
103
|
+
|
51
104
|
class TierDefinition(models.Model):
|
52
105
|
_inherit = "tier.definition"
|
53
106
|
|
@@ -56,4 +109,5 @@ class TierDefinition(models.Model):
|
|
56
109
|
res = super()._get_tier_validation_model_names()
|
57
110
|
res.append("tier.validation.tester")
|
58
111
|
res.append("tier.validation.tester2")
|
112
|
+
res.append("tier.validation.tester.computed")
|
59
113
|
return res
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odoo-addon-base_tier_validation
|
3
|
-
Version: 17.0.2.
|
3
|
+
Version: 17.0.2.2.0
|
4
4
|
Requires-Python: >=3.10
|
5
5
|
Requires-Dist: odoo>=17.0a,<17.1dev
|
6
6
|
Summary: Implement a validation process based on tiers.
|
@@ -23,7 +23,7 @@ Base Tier Validation
|
|
23
23
|
!! This file is generated by oca-gen-addon-readme !!
|
24
24
|
!! changes will be overwritten. !!
|
25
25
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
26
|
-
!! source digest: sha256:
|
26
|
+
!! source digest: sha256:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
|
27
27
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
28
28
|
|
29
29
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
|
@@ -60,6 +60,12 @@ See
|
|
60
60
|
`purchase_tier_validation <https://github.com/OCA/purchase-workflow>`__
|
61
61
|
as an example of implementation.
|
62
62
|
|
63
|
+
Additionally, if your state field is a (stored) computed field, you need
|
64
|
+
to set ``_tier_validation_state_field_is_computed`` to ``True`` in your
|
65
|
+
model Python file, and you will want to add the dependent fields of the
|
66
|
+
compute method in ``_get_after_validation_exceptions`` and
|
67
|
+
``_get_under_validation_exceptions``.
|
68
|
+
|
63
69
|
**Table of contents**
|
64
70
|
|
65
71
|
.. contents::
|
@@ -280,6 +286,8 @@ Contributors
|
|
280
286
|
|
281
287
|
- Houzéfa Abbasbhay
|
282
288
|
|
289
|
+
- Stefan Rijnhart <stefan@opener.amsterdam>
|
290
|
+
|
283
291
|
Maintainers
|
284
292
|
-----------
|
285
293
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
odoo/addons/base_tier_validation/README.rst,sha256=
|
1
|
+
odoo/addons/base_tier_validation/README.rst,sha256=8EoPEhqkz8qegBjVSc3jayDbtatcBwCEMGb0QA3l1pw,8989
|
2
2
|
odoo/addons/base_tier_validation/__init__.py,sha256=rKfzYX9RhkkCxgh2f0PJLYN45Kw8T8-fwxw1pbjLuug,108
|
3
|
-
odoo/addons/base_tier_validation/__manifest__.py,sha256
|
3
|
+
odoo/addons/base_tier_validation/__manifest__.py,sha256=E-B2x0048zLnlAJDair744INsYOYXU5fPbVUjPAYExE,1658
|
4
4
|
odoo/addons/base_tier_validation/data/mail_data.xml,sha256=UKzkLT8rYrFuThdp43v7nLW5SOco4vvIIAhbB_IAQZs,1414
|
5
5
|
odoo/addons/base_tier_validation/i18n/base_tier_validation.pot,sha256=kMrxSb-JBx09Ips79-X6pyC0yPsc-fEQ8W_1Zv9z1wM,31554
|
6
6
|
odoo/addons/base_tier_validation/i18n/es.po,sha256=foXNBuNeOITckWNhyRzAi_MnAAcH0TL17il_MM2x2xc,37396
|
@@ -13,20 +13,20 @@ odoo/addons/base_tier_validation/i18n/tr.po,sha256=vNq0HkHCwi9WL5fihgHtGY1aZFChx
|
|
13
13
|
odoo/addons/base_tier_validation/i18n/zh_CN.po,sha256=i0DqtQ8l-Rz8MvCRN7tY8rrESkZAT6OzTUzF1fnhyVM,33449
|
14
14
|
odoo/addons/base_tier_validation/models/__init__.py,sha256=X8c8CFM5eOXyIErFr7xsaGDBPZMBSKE2v4W-_2h9B2s,250
|
15
15
|
odoo/addons/base_tier_validation/models/res_config_settings.py,sha256=xMdQiCfU5p7Z5puKcSRvJihLpI9ulyVFUd_QJjAOuwc,619
|
16
|
-
odoo/addons/base_tier_validation/models/res_users.py,sha256=
|
16
|
+
odoo/addons/base_tier_validation/models/res_users.py,sha256=rpXM9gCB1sIdFYU032VPJh6v3BWRAiwnmXi8Ukuk8CY,1985
|
17
17
|
odoo/addons/base_tier_validation/models/tier_definition.py,sha256=I-HeOZopA1n-bISs28XDeAosUrTnhL_mp_TB3awb2w0,4168
|
18
18
|
odoo/addons/base_tier_validation/models/tier_review.py,sha256=vuR832VVM-ZUDm-4j9zK1BSNnL0JfesxBSLyhW4Zia8,6754
|
19
|
-
odoo/addons/base_tier_validation/models/tier_validation.py,sha256
|
19
|
+
odoo/addons/base_tier_validation/models/tier_validation.py,sha256=-ipA8E1C8VUIiCPfok9_ARyKVJuNbrGCi6daKpFEXuI,34585
|
20
20
|
odoo/addons/base_tier_validation/models/tier_validation_exception.py,sha256=9H_FbTF04IyB2u6a82UAdIPmv_MUcFKmLNVl7UOM1lg,2882
|
21
21
|
odoo/addons/base_tier_validation/readme/CONFIGURE.md,sha256=MuyVCH75T0_3Rtrkl7RUg7XzxjoU7zUkbPWv84_a-XU,1709
|
22
|
-
odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md,sha256=
|
23
|
-
odoo/addons/base_tier_validation/readme/DESCRIPTION.md,sha256=
|
22
|
+
odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md,sha256=QM71L1RKrzDEgNvfgXjNAoWy3dMxH5k26HhcrrpdYRs,664
|
23
|
+
odoo/addons/base_tier_validation/readme/DESCRIPTION.md,sha256=SJukiMB1jvhcY8zrM6BLWCJrLJtMUPAg7dzzmJbyv18,958
|
24
24
|
odoo/addons/base_tier_validation/readme/HISTORY.md,sha256=P8GfoUhYG7QGIpa8Z0L67E3YEeZBFQCwpDXnt5WG-DY,1332
|
25
25
|
odoo/addons/base_tier_validation/readme/ROADMAP.md,sha256=HRRQQuOlSeOF5yfqG0KuANnvrde8y6Suz2pbrXB1OyU,864
|
26
26
|
odoo/addons/base_tier_validation/security/ir.model.access.csv,sha256=g6B58IuYYqxD54e9I9vyre7mD74tkpauqTqMAH4Oey0,1134
|
27
27
|
odoo/addons/base_tier_validation/security/tier_validation_security.xml,sha256=eWFwz-osHgYFmVoEVzOSboO9oqUMtQ8oygyaz0os50Y,806
|
28
28
|
odoo/addons/base_tier_validation/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
|
29
|
-
odoo/addons/base_tier_validation/static/description/index.html,sha256=
|
29
|
+
odoo/addons/base_tier_validation/static/description/index.html,sha256=2qCIPdp8qgLXIgE28YkGxdGhf2Bg8X8UIna5hXV8t60,23769
|
30
30
|
odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js,sha256=MNfjKSg-9h3JfeXiYlf15SAdVHjj3aUvedj0BqVvJrk,2254
|
31
31
|
odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml,sha256=_wIy5Gv2VUJEXD5_FGphx1J19-Y8uzFlWryuPqlIh8c,2798
|
32
32
|
odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js,sha256=MDWUp2ozeRdBoLeCfTcOnD-bKnk3yF6pHwtTAnsLZmg,1090
|
@@ -35,9 +35,9 @@ odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_r
|
|
35
35
|
odoo/addons/base_tier_validation/static/src/js/services/tier_review_service.esm.js,sha256=E4xNh1WmnofpFt88EYYCGcDWyP53S2Mt450QawcrsCM,972
|
36
36
|
odoo/addons/base_tier_validation/templates/tier_validation_templates.xml,sha256=VI6kY0V6nVSz6KQ9GRxY_9TZkRrJgzBzsl9xFKtA__Y,3620
|
37
37
|
odoo/addons/base_tier_validation/tests/__init__.py,sha256=3z2_lQ9JiDSFDam4p24qDw5j02iaPb4m2naxv9DkbGA,122
|
38
|
-
odoo/addons/base_tier_validation/tests/common.py,sha256=
|
39
|
-
odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=
|
40
|
-
odoo/addons/base_tier_validation/tests/tier_validation_tester.py,sha256=
|
38
|
+
odoo/addons/base_tier_validation/tests/common.py,sha256=iqVkPTebb6oKgapgFeNwORgR_0-vO2Ttd0WA6-Ggd_A,5944
|
39
|
+
odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=UIrjZBY8x9Ch6BYKXjy_YN4PLZL0HG_GMyUzM5Cb8YI,42106
|
40
|
+
odoo/addons/base_tier_validation/tests/tier_validation_tester.py,sha256=m25QbB9-9Goxx1Fiz0qwsVO3WPL6jrtMlGDW6VQbLik,3345
|
41
41
|
odoo/addons/base_tier_validation/views/res_config_settings_views.xml,sha256=5HbrsAVaXRoQNX7utIQ_EzZrqzKnwBrV9uHsi-PHb9M,2640
|
42
42
|
odoo/addons/base_tier_validation/views/tier_definition_view.xml,sha256=FHpO2tW8FYKQffayERVlQEJH_ip8baZ7nC1NcFDsP7Y,7635
|
43
43
|
odoo/addons/base_tier_validation/views/tier_review_view.xml,sha256=tPzmpz-kbQwOOtJrAcsTJEP9bJLcfzWAITCpI86kZU4,966
|
@@ -45,7 +45,7 @@ odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml,sha256
|
|
45
45
|
odoo/addons/base_tier_validation/wizard/__init__.py,sha256=52q6-LAjYeJ1Vu5ahon_jnhds9VsoJvYaQCiZc82WKw,95
|
46
46
|
odoo/addons/base_tier_validation/wizard/comment_wizard.py,sha256=gj7zCcpe47-2ifxSRlE6okQ1wtq5Ok3JBVg2CtN0ZIU,879
|
47
47
|
odoo/addons/base_tier_validation/wizard/comment_wizard_view.xml,sha256=9XFTqrNwDCZH2IEX3HutaznSkBYk-6RERXzUDwObz4I,979
|
48
|
-
odoo_addon_base_tier_validation-17.0.2.
|
49
|
-
odoo_addon_base_tier_validation-17.0.2.
|
50
|
-
odoo_addon_base_tier_validation-17.0.2.
|
51
|
-
odoo_addon_base_tier_validation-17.0.2.
|
48
|
+
odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/METADATA,sha256=F7EkdnIaCarHU6vG3jNJJidOdIyPQwOUdWRMJLTj_8A,9585
|
49
|
+
odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
|
50
|
+
odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
|
51
|
+
odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/RECORD,,
|