odoo-addon-base-tier-validation 17.0.2.2.1__py3-none-any.whl → 17.0.2.3.0.2__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 (28) hide show
  1. odoo/addons/base_tier_validation/README.rst +66 -68
  2. odoo/addons/base_tier_validation/__manifest__.py +2 -1
  3. odoo/addons/base_tier_validation/data/cron_data.xml +17 -0
  4. odoo/addons/base_tier_validation/data/mail_data.xml +18 -0
  5. odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +42 -1
  6. odoo/addons/base_tier_validation/i18n/es.po +50 -3
  7. odoo/addons/base_tier_validation/i18n/es_MX.po +50 -3
  8. odoo/addons/base_tier_validation/i18n/fr.po +51 -3
  9. odoo/addons/base_tier_validation/i18n/it.po +57 -4
  10. odoo/addons/base_tier_validation/i18n/nl_NL.po +50 -3
  11. odoo/addons/base_tier_validation/i18n/sv.po +50 -3
  12. odoo/addons/base_tier_validation/i18n/tr.po +50 -3
  13. odoo/addons/base_tier_validation/i18n/zh_CN.po +50 -3
  14. odoo/addons/base_tier_validation/models/res_users.py +5 -3
  15. odoo/addons/base_tier_validation/models/tier_definition.py +39 -0
  16. odoo/addons/base_tier_validation/models/tier_review.py +40 -0
  17. odoo/addons/base_tier_validation/models/tier_validation.py +37 -13
  18. odoo/addons/base_tier_validation/security/ir.model.access.csv +1 -1
  19. odoo/addons/base_tier_validation/static/description/index.html +11 -13
  20. odoo/addons/base_tier_validation/tests/__init__.py +1 -0
  21. odoo/addons/base_tier_validation/tests/common.py +1 -1
  22. odoo/addons/base_tier_validation/tests/test_tier_validation.py +11 -0
  23. odoo/addons/base_tier_validation/tests/test_tier_validation_reminder.py +46 -0
  24. odoo/addons/base_tier_validation/views/tier_definition_view.xml +2 -0
  25. {odoo_addon_base_tier_validation-17.0.2.2.1.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.2.dist-info}/METADATA +67 -69
  26. {odoo_addon_base_tier_validation-17.0.2.2.1.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.2.dist-info}/RECORD +28 -26
  27. {odoo_addon_base_tier_validation-17.0.2.2.1.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.2.dist-info}/WHEEL +0 -0
  28. {odoo_addon_base_tier_validation-17.0.2.2.1.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.2.dist-info}/top_level.txt +0 -0
@@ -38,6 +38,10 @@ class TierDefinition(models.Model):
38
38
  ("field", "Field in related record"),
39
39
  ],
40
40
  )
41
+ allow_write_for_reviewer = fields.Boolean(
42
+ string="Allow Write For Reviewers",
43
+ default=False,
44
+ )
41
45
  reviewer_id = fields.Many2one(comodel_name="res.users", string="Reviewer")
42
46
  reviewer_group_id = fields.Many2one(
43
47
  comodel_name="res.groups", string="Reviewer group"
@@ -90,6 +94,11 @@ class TierDefinition(models.Model):
90
94
  "to this definition are restarted.",
91
95
  )
92
96
  has_comment = fields.Boolean(string="Comment", default=False)
97
+ notify_reminder_delay = fields.Integer(
98
+ string="Send reminder message on pending reviews",
99
+ help="Number of days after which a message must be posted to remind about "
100
+ "pending validation (0 = no reminder)",
101
+ )
93
102
  approve_sequence = fields.Boolean(
94
103
  string="Approve by sequence",
95
104
  default=False,
@@ -113,3 +122,33 @@ class TierDefinition(models.Model):
113
122
  .sudo()
114
123
  .search([("model", "=", rec.model), ("relation", "=", "res.users")])
115
124
  )
125
+
126
+ def _get_review_needing_reminder(self):
127
+ """Return all the reviews that have the reminder setup."""
128
+ self.ensure_one()
129
+ if not self.notify_reminder_delay:
130
+ return self.env["tier.review"]
131
+ review_date = fields.Datetime.subtract(
132
+ fields.Datetime.now(), days=self.notify_reminder_delay
133
+ )
134
+ return self.env["tier.review"].search(
135
+ [
136
+ ("definition_id", "=", self.id),
137
+ ("status", "in", ["waiting", "pending"]),
138
+ "|",
139
+ "&",
140
+ ("create_date", "<", review_date),
141
+ ("last_reminder_date", "=", False),
142
+ ("last_reminder_date", "<", review_date),
143
+ ],
144
+ limit=1,
145
+ )
146
+
147
+ def _cron_send_review_reminder(self):
148
+ definition_with_reminder = self.env["tier.definition"].search(
149
+ [("notify_reminder_delay", ">", 0)]
150
+ )
151
+ for record in definition_with_reminder:
152
+ review_to_remind = record._get_review_needing_reminder()
153
+ if review_to_remind:
154
+ review_to_remind._send_review_reminder()
@@ -1,11 +1,15 @@
1
1
  # Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com)
2
2
  # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
3
 
4
+ import logging
5
+
4
6
  import pytz
5
7
 
6
8
  from odoo import _, api, fields, models
7
9
  from odoo.exceptions import ValidationError
8
10
 
11
+ _logger = logging.getLogger(__name__)
12
+
9
13
 
10
14
  class TierReview(models.Model):
11
15
  _name = "tier.review"
@@ -65,6 +69,7 @@ class TierReview(models.Model):
65
69
  approve_sequence_bypass = fields.Boolean(
66
70
  related="definition_id.approve_sequence_bypass", readonly=True
67
71
  )
72
+ last_reminder_date = fields.Datetime(readonly=True)
68
73
 
69
74
  @api.depends("status")
70
75
  def _compute_display_status(self):
@@ -159,3 +164,38 @@ class TierReview(models.Model):
159
164
  """Method to call and reuse abstract notification method"""
160
165
  resource = self.env[self.model].browse(self.res_id)
161
166
  resource._notify_review_available(review_ids)
167
+
168
+ def _get_reminder_notification_subtype(self):
169
+ return "base_tier_validation.mt_tier_validation_reminder"
170
+
171
+ def _get_reminder_activity_type(self):
172
+ return "base_tier_validation.mail_act_tier_validation_reminder"
173
+
174
+ def _notify_review_reminder_body(self):
175
+ delay = (fields.Datetime.now() - self.create_date).days
176
+ return _("A review has been requested %s days ago.") % (delay)
177
+
178
+ def _send_review_reminder(self):
179
+ record = self.env[self.model].browse(self.res_id)
180
+ # Only schedule activity if reviewer is a single user and model has activities
181
+ if len(self.reviewer_ids) == 1 and hasattr(record, "activity_ids"):
182
+ self._schedule_review_reminder_activity(record)
183
+ elif hasattr(record, "message_post"):
184
+ self._notify_review_reminder(record)
185
+ else:
186
+ msg = "Could not send reminder for record %s" % record
187
+ _logger.exception(msg)
188
+ self.last_reminder_date = fields.Datetime.now()
189
+
190
+ def _notify_review_reminder(self, record):
191
+ record.message_post(
192
+ subtype_xmlid=self._get_reminder_notification_subtype(),
193
+ body=self._notify_review_reminder_body(),
194
+ )
195
+
196
+ def _schedule_review_reminder_activity(self, record):
197
+ record.activity_schedule(
198
+ act_type_xmlid=self._get_reminder_activity_type(),
199
+ note=self._notify_review_reminder_body(),
200
+ user_id=self.reviewer_ids.id,
201
+ )
@@ -128,19 +128,25 @@ class TierValidation(models.AbstractModel):
128
128
  def _search_validated(self, operator, value):
129
129
  assert operator in ("=", "!="), "Invalid domain operator"
130
130
  assert value in (True, False), "Invalid domain value"
131
- pos = self.search(
132
- [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)]
133
- ).filtered(lambda r: r.validated == value)
134
- return [("id", "in", pos.ids)]
131
+ pos = self.search([(self._state_field, "in", self._state_from)]).filtered(
132
+ lambda r: r.validated
133
+ )
134
+ if value:
135
+ return [("id", "in", pos.ids)]
136
+ else:
137
+ return [("id", "not in", pos.ids)]
135
138
 
136
139
  @api.model
137
140
  def _search_rejected(self, operator, value):
138
141
  assert operator in ("=", "!="), "Invalid domain operator"
139
142
  assert value in (True, False), "Invalid domain value"
140
- pos = self.search(
141
- [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)]
142
- ).filtered(lambda r: r.rejected == value)
143
- return [("id", "in", pos.ids)]
143
+ pos = self.search([(self._state_field, "in", self._state_from)]).filtered(
144
+ lambda r: r.rejected
145
+ )
146
+ if value:
147
+ return [("id", "in", pos.ids)]
148
+ else:
149
+ return [("id", "not in", pos.ids)]
144
150
 
145
151
  @api.model
146
152
  def _search_reviewer_ids(self, operator, value):
@@ -304,7 +310,13 @@ class TierValidation(models.AbstractModel):
304
310
 
305
311
  def _check_allow_write_under_validation(self, vals):
306
312
  """Allow to add exceptions for fields that are allowed to be written
307
- even when the record is under validation."""
313
+ or for reviewers for all fields, even when the record is under
314
+ validation."""
315
+ if (
316
+ all(self.review_ids.mapped("definition_id.allow_write_for_reviewer"))
317
+ and self.env.user in self.reviewer_ids
318
+ ):
319
+ return True
308
320
  exceptions = self._get_under_validation_exceptions()
309
321
  for val in vals:
310
322
  if val not in exceptions:
@@ -341,6 +353,15 @@ class TierValidation(models.AbstractModel):
341
353
  allowed_field_names.append(fld_data["string"])
342
354
  return allowed_field_names, not_allowed_field_names
343
355
 
356
+ def _check_tier_state_transition(self, vals):
357
+ """
358
+ Check we are in origin state and not destination state
359
+ """
360
+ self.ensure_one()
361
+ return getattr(self, self._state_field) in self._state_from and vals.get(
362
+ self._state_field
363
+ ) not in (self._state_to + [self._cancel_state])
364
+
344
365
  def write(self, vals):
345
366
  self._tier_validation_check_state_on_write(vals)
346
367
  self._tier_validation_check_write_allowed(vals)
@@ -382,11 +403,16 @@ class TierValidation(models.AbstractModel):
382
403
  reviews = rec.request_validation()
383
404
  rec._validate_tier(reviews)
384
405
  if not self._calc_reviews_validated(reviews):
406
+ pending_reviews = reviews.filtered(
407
+ lambda r: r.status == "pending"
408
+ ).mapped("name")
385
409
  raise ValidationError(
386
410
  _(
387
411
  "This action needs to be validated for at least "
388
- "one record. \nPlease request a validation."
412
+ "one record. Reviews pending:\n - %s "
413
+ "\nPlease request a validation."
389
414
  )
415
+ % "\n - ".join(pending_reviews)
390
416
  )
391
417
  if rec.review_ids and not rec.validated:
392
418
  raise ValidationError(
@@ -401,9 +427,7 @@ class TierValidation(models.AbstractModel):
401
427
  # Write under validation
402
428
  if (
403
429
  rec.review_ids
404
- and getattr(rec, self._state_field) in self._state_from
405
- and vals.get(self._state_field)
406
- not in (self._state_to + [self._cancel_state])
430
+ and rec._check_tier_state_transition(vals)
407
431
  and not rec._check_allow_write_under_validation(vals)
408
432
  and not rec._context.get("skip_validation_check")
409
433
  ):
@@ -5,7 +5,7 @@ access_tier_review_group_portal,access_tier_review_group_portal,model_tier_revie
5
5
  access_tier_definition_group_portal,access_tier_definition_group_portal,model_tier_definition,base.group_portal,1,0,0,0
6
6
  access_tier_review,access.tier.review,model_tier_review,base.group_user,1,1,1,1
7
7
  access_tier_definition_all,tier.definition.all,model_tier_definition,base.group_user,1,0,0,0
8
- access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_system,1,1,1,1
8
+ access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_erp_manager,1,1,1,1
9
9
  access_comment_wizard,access.comment.wizard,model_comment_wizard,base.group_user,1,1,1,1
10
10
  access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,,1,0,0,0
11
11
  access_tier_validation_exceptions_settings,tier.validation.exceptions,model_tier_validation_exception,base.group_system,1,1,1,1
@@ -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:1d286dc389232f0cc60fd6012ae72c5eaf918284c9e7ef73da914cd6691cf822
370
+ !! source digest: sha256:9d45fb0cb0dd64489508d2963bbd948c59b466f16618469b6e86e3d606511aeb
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
@@ -433,8 +433,8 @@ functionality.</li>
433
433
  be notified by email when this definition is triggered.</li>
434
434
  <li>If check <em>Notify reviewers on reaching pending</em> if you want to send a
435
435
  notification when pending status is reached. This is usefull in a
436
- approve by sequence scenario to only notify reviewers when it is
437
- their turn in the sequence.</li>
436
+ approve by sequence scenario to only notify reviewers when it is their
437
+ turn in the sequence.</li>
438
438
  <li>If check <em>Comment</em>, reviewers can comment after click Validate or
439
439
  Reject.</li>
440
440
  <li>If check <em>Approve by sequence</em>, reviewers is forced to review by
@@ -455,12 +455,10 @@ both.</li>
455
455
  <ul class="simple">
456
456
  <li>If you don’t create any exception, the Validated record will be
457
457
  readonly and cannot be modified.</li>
458
- <li>If check <em>Write under Validation</em>, records will be able to be
459
- modified only in the defined fields when the Validation process is
460
- ongoing.</li>
461
- <li>If check <em>Write after Validation</em>, records will be able to be
462
- modified only in the defined fields when the Validation process is
463
- finished.</li>
458
+ <li>If check <em>Write under Validation</em>, records will be able to be modified
459
+ only in the defined fields when the Validation process is ongoing.</li>
460
+ <li>If check <em>Write after Validation</em>, records will be able to be modified
461
+ only in the defined fields when the Validation process is finished.</li>
464
462
  <li>If check <em>Write after Validation</em> and <em>Write under Validation</em>,
465
463
  records will be able to be modified defined fields always.</li>
466
464
  </ul>
@@ -471,8 +469,8 @@ records will be able to be modified defined fields always.</li>
471
469
  improvement will be very valuable.</p>
472
470
  <ul>
473
471
  <li><p class="first"><strong>Issue:</strong></p>
474
- <p>When using approve_sequence option in any tier.definition there can
475
- be inconsistencies in the systray notifications.</p>
472
+ <p>When using approve_sequence option in any tier.definition there can be
473
+ inconsistencies in the systray notifications.</p>
476
474
  <p><strong>Description:</strong></p>
477
475
  <p>Field can_review in tier.review is used to filter out, in the systray
478
476
  notifications, the reviews a user can approve. This can_review field
@@ -504,8 +502,8 @@ to validate.</p>
504
502
  <h2><a class="toc-backref" href="#toc-entry-6">13.0.1.2.2 (2020-08-30)</a></h2>
505
503
  <p>Fixes:</p>
506
504
  <ul class="simple">
507
- <li>When using approve_sequence option in any tier.definition there can
508
- be inconsistencies in the systray notifications</li>
505
+ <li>When using approve_sequence option in any tier.definition there can be
506
+ inconsistencies in the systray notifications</li>
509
507
  <li>When using approve_sequence, still not approve only the needed
510
508
  sequence, but also other sequence for the same approver</li>
511
509
  </ul>
@@ -2,3 +2,4 @@
2
2
 
3
3
  from . import common
4
4
  from . import test_tier_validation
5
+ from . import test_tier_validation_reminder
@@ -96,7 +96,7 @@ class CommonTierValidation(common.TransactionCase):
96
96
 
97
97
  # Create tier definitions:
98
98
  cls.tier_def_obj = cls.env["tier.definition"]
99
- cls.tier_def_obj.create(
99
+ cls.tier_definition = cls.tier_def_obj.create(
100
100
  {
101
101
  "model_id": cls.tester_model.id,
102
102
  "review_type": "individual",
@@ -999,6 +999,17 @@ class TierTierValidation(CommonTierValidation):
999
999
  self.assertFalse(self.test_record_computed.review_ids)
1000
1000
  self.test_record_computed.invalidate_recordset()
1001
1001
 
1002
+ def test_27_allow_write_for_reviewers(self):
1003
+ reviews = self.test_record.with_user(self.test_user_2.id).request_validation()
1004
+ record = self.test_record.with_user(self.test_user_1.id)
1005
+ record.invalidate_recordset()
1006
+ with self.assertRaises(ValidationError):
1007
+ record.with_user(self.test_user_1.id).write({"test_field": 0.3})
1008
+ reviews.definition_id.with_user(self.test_user_1.id).write(
1009
+ {"allow_write_for_reviewer": True}
1010
+ )
1011
+ record.with_user(self.test_user_1.id).write({"test_field": 0.3})
1012
+
1002
1013
 
1003
1014
  @tagged("at_install")
1004
1015
  class TierTierValidationView(CommonTierValidation):
@@ -0,0 +1,46 @@
1
+ # Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com)
2
+ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
3
+
4
+ from freezegun import freeze_time
5
+
6
+ from odoo import fields
7
+ from odoo.tests.common import tagged
8
+
9
+ from .common import CommonTierValidation
10
+
11
+
12
+ @tagged("post_install", "-at_install")
13
+ class TierTierValidation(CommonTierValidation):
14
+ def test_validation_reminder(self):
15
+ """Check the posting of reminder to reviews."""
16
+ tier_definition = self.tier_definition
17
+ tier_definition.notify_reminder_delay = 3
18
+
19
+ # Request a review today
20
+ self.test_record.with_user(self.test_user_2.id).request_validation()
21
+ review = self.env["tier.review"].search(
22
+ [("definition_id", "=", tier_definition.id)]
23
+ )
24
+ self.assertTrue(review)
25
+ self.assertEqual(review.last_reminder_date, False)
26
+
27
+ # 2 days later no reminder should be posted
28
+ in_2_days = fields.Datetime.add(fields.Datetime.now(), days=2)
29
+ with freeze_time(in_2_days):
30
+ tier_definition._cron_send_review_reminder()
31
+ self.assertEqual(review.last_reminder_date, False)
32
+ # 4 days later first reminder
33
+ in_4_days = fields.Datetime.add(fields.Datetime.now(), days=4)
34
+ with freeze_time(in_4_days):
35
+ self.tier_definition._cron_send_review_reminder()
36
+ self.assertEqual(review.last_reminder_date, in_4_days)
37
+ # 5 days later no new reminder
38
+ in_6_days = fields.Datetime.add(fields.Datetime.now(), days=6)
39
+ with freeze_time(in_6_days):
40
+ self.tier_definition._cron_send_review_reminder()
41
+ self.assertEqual(review.last_reminder_date, in_4_days)
42
+ # 9 days later second reminder
43
+ in_9_days = fields.Datetime.add(fields.Datetime.now(), days=9)
44
+ with freeze_time(in_9_days):
45
+ self.tier_definition._cron_send_review_reminder()
46
+ self.assertEqual(review.last_reminder_date, in_9_days)
@@ -55,6 +55,7 @@
55
55
  <field name="model_id" options="{'no_create': True}" />
56
56
  <field name="model" invisible="1" />
57
57
  <field name="review_type" />
58
+ <field name="allow_write_for_reviewer" />
58
59
  <field
59
60
  name="reviewer_id"
60
61
  invisible="review_type != 'individual'"
@@ -117,6 +118,7 @@
117
118
  <field name="notify_on_rejected" />
118
119
  <field name="notify_on_restarted" />
119
120
  <field name="has_comment" />
121
+ <field name="notify_reminder_delay" />
120
122
  </group>
121
123
  </group>
122
124
  </page>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-base_tier_validation
3
- Version: 17.0.2.2.1
3
+ Version: 17.0.2.3.0.2
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:1d286dc389232f0cc60fd6012ae72c5eaf918284c9e7ef73da914cd6691cf822
26
+ !! source digest: sha256:9d45fb0cb0dd64489508d2963bbd948c59b466f16618469b6e86e3d606511aeb
27
27
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28
28
 
29
29
  .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
@@ -82,16 +82,16 @@ To configure this module, you need to:
82
82
 
83
83
  **Note:**
84
84
 
85
- - If check *Notify Reviewers on Creation*, all possible reviewers will
86
- be notified by email when this definition is triggered.
87
- - If check *Notify reviewers on reaching pending* if you want to send a
88
- notification when pending status is reached. This is usefull in a
89
- approve by sequence scenario to only notify reviewers when it is
90
- their turn in the sequence.
91
- - If check *Comment*, reviewers can comment after click Validate or
92
- Reject.
93
- - If check *Approve by sequence*, reviewers is forced to review by
94
- specified sequence.
85
+ - If check *Notify Reviewers on Creation*, all possible reviewers will
86
+ be notified by email when this definition is triggered.
87
+ - If check *Notify reviewers on reaching pending* if you want to send a
88
+ notification when pending status is reached. This is usefull in a
89
+ approve by sequence scenario to only notify reviewers when it is their
90
+ turn in the sequence.
91
+ - If check *Comment*, reviewers can comment after click Validate or
92
+ Reject.
93
+ - If check *Approve by sequence*, reviewers is forced to review by
94
+ specified sequence.
95
95
 
96
96
  To configure Tier Validation Exceptions, you need to:
97
97
 
@@ -106,16 +106,14 @@ To configure Tier Validation Exceptions, you need to:
106
106
 
107
107
  **Note:**
108
108
 
109
- - If you don't create any exception, the Validated record will be
110
- readonly and cannot be modified.
111
- - If check *Write under Validation*, records will be able to be
112
- modified only in the defined fields when the Validation process is
113
- ongoing.
114
- - If check *Write after Validation*, records will be able to be
115
- modified only in the defined fields when the Validation process is
116
- finished.
117
- - If check *Write after Validation* and *Write under Validation*,
118
- records will be able to be modified defined fields always.
109
+ - If you don't create any exception, the Validated record will be
110
+ readonly and cannot be modified.
111
+ - If check *Write under Validation*, records will be able to be modified
112
+ only in the defined fields when the Validation process is ongoing.
113
+ - If check *Write after Validation*, records will be able to be modified
114
+ only in the defined fields when the Validation process is finished.
115
+ - If check *Write after Validation* and *Write under Validation*,
116
+ records will be able to be modified defined fields always.
119
117
 
120
118
  Known issues / Roadmap
121
119
  ======================
@@ -123,25 +121,25 @@ Known issues / Roadmap
123
121
  This is the list of known issues for this module. Any proposal for
124
122
  improvement will be very valuable.
125
123
 
126
- - **Issue:**
124
+ - **Issue:**
127
125
 
128
- When using approve_sequence option in any tier.definition there can
129
- be inconsistencies in the systray notifications.
126
+ When using approve_sequence option in any tier.definition there can be
127
+ inconsistencies in the systray notifications.
130
128
 
131
- **Description:**
129
+ **Description:**
132
130
 
133
- Field can_review in tier.review is used to filter out, in the systray
134
- notifications, the reviews a user can approve. This can_review field
135
- is updated **in the database** in method review_user_count, this can
136
- make it very inconsistent for databases with a lot of users and
137
- recurring updates that can change the expected behavior.
131
+ Field can_review in tier.review is used to filter out, in the systray
132
+ notifications, the reviews a user can approve. This can_review field
133
+ is updated **in the database** in method review_user_count, this can
134
+ make it very inconsistent for databases with a lot of users and
135
+ recurring updates that can change the expected behavior.
138
136
 
139
- - **Migration to 15.0:**
137
+ - **Migration to 15.0:**
140
138
 
141
- The parameter \_tier_validation_manual_config will become False, on
142
- 14.0, the default value is True, as the change is applied after the
143
- migration. In order to use the new behavior we need to modify the
144
- value on our expected model.
139
+ The parameter \_tier_validation_manual_config will become False, on
140
+ 14.0, the default value is True, as the change is applied after the
141
+ migration. In order to use the new behavior we need to modify the
142
+ value on our expected model.
145
143
 
146
144
  Changelog
147
145
  =========
@@ -163,69 +161,69 @@ Migrated to Odoo 14.
163
161
 
164
162
  Fixes:
165
163
 
166
- - When using approve_sequence option in any tier.definition there can
167
- be inconsistencies in the systray notifications
168
- - When using approve_sequence, still not approve only the needed
169
- sequence, but also other sequence for the same approver
164
+ - When using approve_sequence option in any tier.definition there can be
165
+ inconsistencies in the systray notifications
166
+ - When using approve_sequence, still not approve only the needed
167
+ sequence, but also other sequence for the same approver
170
168
 
171
169
  12.0.3.3.1 (2019-12-02)
172
170
  -----------------------
173
171
 
174
172
  Fixes:
175
173
 
176
- - Show comment on Reviews Table.
177
- - Edit notification with approve_sequence.
174
+ - Show comment on Reviews Table.
175
+ - Edit notification with approve_sequence.
178
176
 
179
177
  12.0.3.3.0 (2019-11-27)
180
178
  -----------------------
181
179
 
182
180
  New features:
183
181
 
184
- - Add comment on Reviews Table.
185
- - Approve by sequence.
182
+ - Add comment on Reviews Table.
183
+ - Approve by sequence.
186
184
 
187
185
  12.0.3.2.1 (2019-11-26)
188
186
  -----------------------
189
187
 
190
188
  Fixes:
191
189
 
192
- - Remove message_subscribe_users
190
+ - Remove message_subscribe_users
193
191
 
194
192
  12.0.3.2.0 (2019-11-25)
195
193
  -----------------------
196
194
 
197
195
  New features:
198
196
 
199
- - Notify reviewers
197
+ - Notify reviewers
200
198
 
201
199
  12.0.3.1.0 (2019-07-08)
202
200
  -----------------------
203
201
 
204
202
  Fixes:
205
203
 
206
- - Singleton error
204
+ - Singleton error
207
205
 
208
206
  12.0.3.0.0 (2019-12-02)
209
207
  -----------------------
210
208
 
211
209
  Fixes:
212
210
 
213
- - Edit Reviews Table
211
+ - Edit Reviews Table
214
212
 
215
213
  12.0.2.1.0 (2019-05-29)
216
214
  -----------------------
217
215
 
218
216
  Fixes:
219
217
 
220
- - Edit drop-down style width and position
218
+ - Edit drop-down style width and position
221
219
 
222
220
  12.0.2.0.0 (2019-05-28)
223
221
  -----------------------
224
222
 
225
223
  New features:
226
224
 
227
- - Pass parameters as functions.
228
- - Add Systray.
225
+ - Pass parameters as functions.
226
+ - Add Systray.
229
227
 
230
228
  12.0.1.0.0 (2019-02-18)
231
229
  -----------------------
@@ -268,24 +266,24 @@ Authors
268
266
  Contributors
269
267
  ------------
270
268
 
271
- - Lois Rilo <lois.rilo@forgeflow.com>
272
- - Naglis Jonaitis <naglis@versada.eu>
273
- - Adrià Gil Sorribes <adria.gil@forgeflow.com>
274
- - Pimolnat Suntian <pimolnats@ecosoft.co.th>
275
- - Pedro Gonzalez <pedro.gonzalez@pesol.es>
276
- - Kitti U. <kittiu@ecosoft.co.th>
277
- - Saran Lim. <saranl@ecosoft.co.th>
278
- - Carlos Lopez <celm1990@gmail.com>
279
- - Javier Colmeiro <javier.colmeiro@braintec.com>
280
- - bosd
281
- - Evan Soh <evan.soh@omnisoftsolution.com>
282
- - Manuel Regidor <manuel.regidor@sygel.es>
283
- - Eduardo de Miguel <edu@moduon.team>
284
- - `XCG Consulting <https://xcg-consulting.fr>`__:
285
-
286
- - Houzéfa Abbasbhay
287
-
288
- - Stefan Rijnhart <stefan@opener.amsterdam>
269
+ - Lois Rilo <lois.rilo@forgeflow.com>
270
+ - Naglis Jonaitis <naglis@versada.eu>
271
+ - Adrià Gil Sorribes <adria.gil@forgeflow.com>
272
+ - Pimolnat Suntian <pimolnats@ecosoft.co.th>
273
+ - Pedro Gonzalez <pedro.gonzalez@pesol.es>
274
+ - Kitti U. <kittiu@ecosoft.co.th>
275
+ - Saran Lim. <saranl@ecosoft.co.th>
276
+ - Carlos Lopez <celm1990@gmail.com>
277
+ - Javier Colmeiro <javier.colmeiro@braintec.com>
278
+ - bosd
279
+ - Evan Soh <evan.soh@omnisoftsolution.com>
280
+ - Manuel Regidor <manuel.regidor@sygel.es>
281
+ - Eduardo de Miguel <edu@moduon.team>
282
+ - `XCG Consulting <https://xcg-consulting.fr>`__:
283
+
284
+ - Houzéfa Abbasbhay
285
+
286
+ - Stefan Rijnhart <stefan@opener.amsterdam>
289
287
 
290
288
  Maintainers
291
289
  -----------