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.
- odoo/addons/base_tier_validation/README.rst +66 -68
- odoo/addons/base_tier_validation/__manifest__.py +2 -1
- odoo/addons/base_tier_validation/data/cron_data.xml +17 -0
- odoo/addons/base_tier_validation/data/mail_data.xml +18 -0
- odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +42 -1
- odoo/addons/base_tier_validation/i18n/es.po +50 -3
- odoo/addons/base_tier_validation/i18n/es_MX.po +50 -3
- odoo/addons/base_tier_validation/i18n/fr.po +51 -3
- odoo/addons/base_tier_validation/i18n/it.po +57 -4
- odoo/addons/base_tier_validation/i18n/nl_NL.po +50 -3
- odoo/addons/base_tier_validation/i18n/sv.po +50 -3
- odoo/addons/base_tier_validation/i18n/tr.po +50 -3
- odoo/addons/base_tier_validation/i18n/zh_CN.po +50 -3
- odoo/addons/base_tier_validation/models/res_users.py +5 -3
- odoo/addons/base_tier_validation/models/tier_definition.py +39 -0
- odoo/addons/base_tier_validation/models/tier_review.py +40 -0
- odoo/addons/base_tier_validation/models/tier_validation.py +37 -13
- odoo/addons/base_tier_validation/security/ir.model.access.csv +1 -1
- odoo/addons/base_tier_validation/static/description/index.html +11 -13
- odoo/addons/base_tier_validation/tests/__init__.py +1 -0
- odoo/addons/base_tier_validation/tests/common.py +1 -1
- odoo/addons/base_tier_validation/tests/test_tier_validation.py +11 -0
- odoo/addons/base_tier_validation/tests/test_tier_validation_reminder.py +46 -0
- odoo/addons/base_tier_validation/views/tier_definition_view.xml +2 -0
- {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
- {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
- {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
- {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
|
-
|
133
|
-
)
|
134
|
-
|
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
|
-
|
142
|
-
)
|
143
|
-
|
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
|
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.
|
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
|
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.
|
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:
|
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&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
|
-
|
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
|
-
|
460
|
-
|
461
|
-
|
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
|
-
|
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
|
-
|
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>
|
@@ -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
|
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:
|
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
|
-
-
|
86
|
-
|
87
|
-
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
-
|
92
|
-
|
93
|
-
-
|
94
|
-
|
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
|
-
-
|
110
|
-
|
111
|
-
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
-
-
|
124
|
+
- **Issue:**
|
127
125
|
|
128
|
-
|
129
|
-
|
126
|
+
When using approve_sequence option in any tier.definition there can be
|
127
|
+
inconsistencies in the systray notifications.
|
130
128
|
|
131
|
-
|
129
|
+
**Description:**
|
132
130
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|
-
-
|
137
|
+
- **Migration to 15.0:**
|
140
138
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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
|
-
-
|
167
|
-
|
168
|
-
-
|
169
|
-
|
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
|
-
-
|
177
|
-
-
|
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
|
-
-
|
185
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
228
|
-
-
|
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
|
-
-
|
272
|
-
-
|
273
|
-
-
|
274
|
-
-
|
275
|
-
-
|
276
|
-
-
|
277
|
-
-
|
278
|
-
-
|
279
|
-
-
|
280
|
-
-
|
281
|
-
-
|
282
|
-
-
|
283
|
-
-
|
284
|
-
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
-
|
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
|
-----------
|