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.
@@ -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:f66a6423b1055e1fd357661ea6165ca35a45086b86b4bb7d7f165500bf957a97
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
 
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Base Tier Validation",
5
5
  "summary": "Implement a validation process based on tiers.",
6
- "version": "17.0.2.1.2",
6
+ "version": "17.0.2.2.0",
7
7
  "development_status": "Mature",
8
8
  "maintainers": ["LoisRForgeFlow"],
9
9
  "category": "Tools",
@@ -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 getattr(rec, self._state_field)
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[self._state_field]
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 getattr(self, self._state_field) in self._state_from
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):
@@ -13,3 +13,4 @@
13
13
  - Eduardo de Miguel \<<edu@moduon.team>\>
14
14
  - [XCG Consulting](https://xcg-consulting.fr):
15
15
  - Houzéfa Abbasbhay
16
+ - Stefan Rijnhart \<<stefan@opener.amsterdam>\>
@@ -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:f66a6423b1055e1fd357661ea6165ca35a45086b86b4bb7d7f165500bf957a97
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&amp;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 &lt;<a class="reference external" href="mailto:stefan&#64;opener.amsterdam">stefan&#64;opener.amsterdam</a>&gt;</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
- (TierValidationTester, TierValidationTester2, TierDefinition)
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
- # Access record:
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
- cls.env["ir.model.access"].create(
50
- {
51
- "name": "access.tester2",
52
- "model_id": cls.tester_model_2.id,
53
- "perm_read": 1,
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
- # Define views to avoid automatic views with all fields.
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.assertTrue(self.test_user_1.get_reviews({"res_ids": review.ids}))
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.1.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:f66a6423b1055e1fd357661ea6165ca35a45086b86b4bb7d7f165500bf957a97
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=byryeO7xRWxuAAWzsMdLdzhjRqgThVBJM7Mzvlt8CN0,8628
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=-zSDv2kPPaigdPk2XfPVsrgG1Js0UpmB5J1wNxIKtcQ,1658
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=JhUZ0NxJ9EPwpkJ-mvsNTrE1avQncGNKqAF-xFxokEo,2638
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=ahNgJJAfULCescQrih72IPvGbzpBrdr7iPL9IAiY6oY,32943
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=DJp09K9mooM4Qy1fPUVPjAU02fUNudXVeTRzA2gxOoA,616
23
- odoo/addons/base_tier_validation/readme/DESCRIPTION.md,sha256=nFbYOx89EsI26v6NJF9d-Wm-X2YtHduSRlV5Euk3WWc,651
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=VNG2i-bVPQtUAJbO5YtIC0x69nMBpUxjvqrF272f-wo,23191
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=9KAJHlWXLj9TDX2ZM_J5WhDC53jTojRiObPKxc4bcFI,5211
39
- odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=t4FQSrDPCP9JpwcIvCXFqNhzEezqFmb73e-5xbEDuTY,40830
40
- odoo/addons/base_tier_validation/tests/tier_validation_tester.py,sha256=3usFbhfDhlKIWbVu--3qsbsm52B6RwTP4zy244dY1yk,1757
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.1.2.dist-info/METADATA,sha256=UnNgzSyraZF3AycUDQfMGQc322qryTKoi9nJrtOeeLw,9224
49
- odoo_addon_base_tier_validation-17.0.2.1.2.dist-info/WHEEL,sha256=8Rd4enx1PCuyDWP4SABqO5Fv8rpaknqp3VzjoFFLa6c,83
50
- odoo_addon_base_tier_validation-17.0.2.1.2.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
51
- odoo_addon_base_tier_validation-17.0.2.1.2.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: Whool 1.0.1
2
+ Generator: Whool 1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5