odoo-addon-base-tier-validation 17.0.2.2.0__py3-none-any.whl → 17.0.2.3.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 +66 -69
- odoo/addons/base_tier_validation/__manifest__.py +4 -3
- 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/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 -14
- 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.0.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.dist-info}/METADATA +68 -71
- {odoo_addon_base_tier_validation-17.0.2.2.0.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.dist-info}/RECORD +20 -18
- {odoo_addon_base_tier_validation-17.0.2.2.0.dist-info → odoo_addon_base_tier_validation-17.0.2.3.0.dist-info}/WHEEL +0 -0
- {odoo_addon_base_tier_validation-17.0.2.2.0.dist-info → odoo_addon_base_tier_validation-17.0.2.3.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:9d45fb0cb0dd64489508d2963bbd948c59b466f16618469b6e86e3d606511aeb
|
11
11
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
12
12
|
|
13
13
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png
|
@@ -66,16 +66,16 @@ To configure this module, you need to:
|
|
66
66
|
|
67
67
|
**Note:**
|
68
68
|
|
69
|
-
-
|
70
|
-
|
71
|
-
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
-
|
76
|
-
|
77
|
-
-
|
78
|
-
|
69
|
+
- If check *Notify Reviewers on Creation*, all possible reviewers will
|
70
|
+
be notified by email when this definition is triggered.
|
71
|
+
- If check *Notify reviewers on reaching pending* if you want to send a
|
72
|
+
notification when pending status is reached. This is usefull in a
|
73
|
+
approve by sequence scenario to only notify reviewers when it is their
|
74
|
+
turn in the sequence.
|
75
|
+
- If check *Comment*, reviewers can comment after click Validate or
|
76
|
+
Reject.
|
77
|
+
- If check *Approve by sequence*, reviewers is forced to review by
|
78
|
+
specified sequence.
|
79
79
|
|
80
80
|
To configure Tier Validation Exceptions, you need to:
|
81
81
|
|
@@ -90,16 +90,14 @@ To configure Tier Validation Exceptions, you need to:
|
|
90
90
|
|
91
91
|
**Note:**
|
92
92
|
|
93
|
-
-
|
94
|
-
|
95
|
-
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
- If check *Write after Validation* and *Write under Validation*,
|
102
|
-
records will be able to be modified defined fields always.
|
93
|
+
- If you don't create any exception, the Validated record will be
|
94
|
+
readonly and cannot be modified.
|
95
|
+
- If check *Write under Validation*, records will be able to be modified
|
96
|
+
only in the defined fields when the Validation process is ongoing.
|
97
|
+
- If check *Write after Validation*, records will be able to be modified
|
98
|
+
only in the defined fields when the Validation process is finished.
|
99
|
+
- If check *Write after Validation* and *Write under Validation*,
|
100
|
+
records will be able to be modified defined fields always.
|
103
101
|
|
104
102
|
Known issues / Roadmap
|
105
103
|
======================
|
@@ -107,25 +105,25 @@ Known issues / Roadmap
|
|
107
105
|
This is the list of known issues for this module. Any proposal for
|
108
106
|
improvement will be very valuable.
|
109
107
|
|
110
|
-
-
|
108
|
+
- **Issue:**
|
111
109
|
|
112
|
-
|
113
|
-
|
110
|
+
When using approve_sequence option in any tier.definition there can be
|
111
|
+
inconsistencies in the systray notifications.
|
114
112
|
|
115
|
-
|
113
|
+
**Description:**
|
116
114
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
115
|
+
Field can_review in tier.review is used to filter out, in the systray
|
116
|
+
notifications, the reviews a user can approve. This can_review field
|
117
|
+
is updated **in the database** in method review_user_count, this can
|
118
|
+
make it very inconsistent for databases with a lot of users and
|
119
|
+
recurring updates that can change the expected behavior.
|
122
120
|
|
123
|
-
-
|
121
|
+
- **Migration to 15.0:**
|
124
122
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
123
|
+
The parameter \_tier_validation_manual_config will become False, on
|
124
|
+
14.0, the default value is True, as the change is applied after the
|
125
|
+
migration. In order to use the new behavior we need to modify the
|
126
|
+
value on our expected model.
|
129
127
|
|
130
128
|
Changelog
|
131
129
|
=========
|
@@ -147,69 +145,69 @@ Migrated to Odoo 14.
|
|
147
145
|
|
148
146
|
Fixes:
|
149
147
|
|
150
|
-
-
|
151
|
-
|
152
|
-
-
|
153
|
-
|
148
|
+
- When using approve_sequence option in any tier.definition there can be
|
149
|
+
inconsistencies in the systray notifications
|
150
|
+
- When using approve_sequence, still not approve only the needed
|
151
|
+
sequence, but also other sequence for the same approver
|
154
152
|
|
155
153
|
12.0.3.3.1 (2019-12-02)
|
156
154
|
-----------------------
|
157
155
|
|
158
156
|
Fixes:
|
159
157
|
|
160
|
-
-
|
161
|
-
-
|
158
|
+
- Show comment on Reviews Table.
|
159
|
+
- Edit notification with approve_sequence.
|
162
160
|
|
163
161
|
12.0.3.3.0 (2019-11-27)
|
164
162
|
-----------------------
|
165
163
|
|
166
164
|
New features:
|
167
165
|
|
168
|
-
-
|
169
|
-
-
|
166
|
+
- Add comment on Reviews Table.
|
167
|
+
- Approve by sequence.
|
170
168
|
|
171
169
|
12.0.3.2.1 (2019-11-26)
|
172
170
|
-----------------------
|
173
171
|
|
174
172
|
Fixes:
|
175
173
|
|
176
|
-
-
|
174
|
+
- Remove message_subscribe_users
|
177
175
|
|
178
176
|
12.0.3.2.0 (2019-11-25)
|
179
177
|
-----------------------
|
180
178
|
|
181
179
|
New features:
|
182
180
|
|
183
|
-
-
|
181
|
+
- Notify reviewers
|
184
182
|
|
185
183
|
12.0.3.1.0 (2019-07-08)
|
186
184
|
-----------------------
|
187
185
|
|
188
186
|
Fixes:
|
189
187
|
|
190
|
-
-
|
188
|
+
- Singleton error
|
191
189
|
|
192
190
|
12.0.3.0.0 (2019-12-02)
|
193
191
|
-----------------------
|
194
192
|
|
195
193
|
Fixes:
|
196
194
|
|
197
|
-
-
|
195
|
+
- Edit Reviews Table
|
198
196
|
|
199
197
|
12.0.2.1.0 (2019-05-29)
|
200
198
|
-----------------------
|
201
199
|
|
202
200
|
Fixes:
|
203
201
|
|
204
|
-
-
|
202
|
+
- Edit drop-down style width and position
|
205
203
|
|
206
204
|
12.0.2.0.0 (2019-05-28)
|
207
205
|
-----------------------
|
208
206
|
|
209
207
|
New features:
|
210
208
|
|
211
|
-
-
|
212
|
-
-
|
209
|
+
- Pass parameters as functions.
|
210
|
+
- Add Systray.
|
213
211
|
|
214
212
|
12.0.1.0.0 (2019-02-18)
|
215
213
|
-----------------------
|
@@ -247,30 +245,29 @@ Credits
|
|
247
245
|
Authors
|
248
246
|
-------
|
249
247
|
|
250
|
-
* brain-tec AG
|
251
248
|
* ForgeFlow
|
252
249
|
|
253
250
|
Contributors
|
254
251
|
------------
|
255
252
|
|
256
|
-
-
|
257
|
-
-
|
258
|
-
-
|
259
|
-
-
|
260
|
-
-
|
261
|
-
-
|
262
|
-
-
|
263
|
-
-
|
264
|
-
-
|
265
|
-
-
|
266
|
-
-
|
267
|
-
-
|
268
|
-
-
|
269
|
-
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
-
|
253
|
+
- Lois Rilo <lois.rilo@forgeflow.com>
|
254
|
+
- Naglis Jonaitis <naglis@versada.eu>
|
255
|
+
- Adrià Gil Sorribes <adria.gil@forgeflow.com>
|
256
|
+
- Pimolnat Suntian <pimolnats@ecosoft.co.th>
|
257
|
+
- Pedro Gonzalez <pedro.gonzalez@pesol.es>
|
258
|
+
- Kitti U. <kittiu@ecosoft.co.th>
|
259
|
+
- Saran Lim. <saranl@ecosoft.co.th>
|
260
|
+
- Carlos Lopez <celm1990@gmail.com>
|
261
|
+
- Javier Colmeiro <javier.colmeiro@braintec.com>
|
262
|
+
- bosd
|
263
|
+
- Evan Soh <evan.soh@omnisoftsolution.com>
|
264
|
+
- Manuel Regidor <manuel.regidor@sygel.es>
|
265
|
+
- Eduardo de Miguel <edu@moduon.team>
|
266
|
+
- `XCG Consulting <https://xcg-consulting.fr>`__:
|
267
|
+
|
268
|
+
- Houzéfa Abbasbhay
|
269
|
+
|
270
|
+
- Stefan Rijnhart <stefan@opener.amsterdam>
|
274
271
|
|
275
272
|
Maintainers
|
276
273
|
-----------
|
@@ -1,19 +1,20 @@
|
|
1
|
-
# Copyright 2017-
|
1
|
+
# Copyright 2017-24 ForgeFlow S.L. (https://www.forgeflow.com)
|
2
2
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
3
3
|
{
|
4
4
|
"name": "Base Tier Validation",
|
5
5
|
"summary": "Implement a validation process based on tiers.",
|
6
|
-
"version": "17.0.2.
|
6
|
+
"version": "17.0.2.3.0",
|
7
7
|
"development_status": "Mature",
|
8
8
|
"maintainers": ["LoisRForgeFlow"],
|
9
9
|
"category": "Tools",
|
10
10
|
"website": "https://github.com/OCA/server-ux",
|
11
|
-
"author": "
|
11
|
+
"author": "ForgeFlow, Odoo Community Association (OCA)",
|
12
12
|
"license": "AGPL-3",
|
13
13
|
"application": False,
|
14
14
|
"installable": True,
|
15
15
|
"depends": ["mail"],
|
16
16
|
"data": [
|
17
|
+
"data/cron_data.xml",
|
17
18
|
"data/mail_data.xml",
|
18
19
|
"security/ir.model.access.csv",
|
19
20
|
"security/tier_validation_security.xml",
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<odoo noupdate="1">
|
3
|
+
<record id="ir_cron_auto_tier_validation" model="ir.cron">
|
4
|
+
<field name="name">Send Tier Review Reminder</field>
|
5
|
+
<field name="interval_number">1</field>
|
6
|
+
<field name="interval_type">days</field>
|
7
|
+
<field name="numbercall">-1</field>
|
8
|
+
<field
|
9
|
+
name="nextcall"
|
10
|
+
eval="(datetime.now() + timedelta(minutes=5)).strftime('%Y-%m-%d %H:%M:%S')"
|
11
|
+
/>
|
12
|
+
<field name="doall" eval="False" />
|
13
|
+
<field name="model_id" ref="model_tier_definition" />
|
14
|
+
<field name="code">model._cron_send_review_reminder()</field>
|
15
|
+
<field name="state">code</field>
|
16
|
+
</record>
|
17
|
+
</odoo>
|
@@ -40,4 +40,22 @@
|
|
40
40
|
<field name="internal" eval="True" />
|
41
41
|
<field name="hidden" eval="True" />
|
42
42
|
</record>
|
43
|
+
<record
|
44
|
+
id="mt_tier_validation_reminder"
|
45
|
+
model="mail.message.subtype"
|
46
|
+
forcecreate="1"
|
47
|
+
>
|
48
|
+
<field name="name">Tier Validation Reminder</field>
|
49
|
+
<field name="default" eval="True" />
|
50
|
+
<field name="internal" eval="True" />
|
51
|
+
<field name="hidden" eval="True" />
|
52
|
+
</record>
|
53
|
+
<record
|
54
|
+
id="mail_act_tier_validation_reminder"
|
55
|
+
model="mail.activity.type"
|
56
|
+
forcecreate="1"
|
57
|
+
>
|
58
|
+
<field name="name">Tier Validation Reminder</field>
|
59
|
+
<field name="icon">fa-bell</field>
|
60
|
+
</record>
|
43
61
|
</odoo>
|
@@ -56,6 +56,13 @@ msgstr ""
|
|
56
56
|
msgid "A record to be reviewed has been created by %s."
|
57
57
|
msgstr ""
|
58
58
|
|
59
|
+
#. module: base_tier_validation
|
60
|
+
#. odoo-python
|
61
|
+
#: code:addons/base_tier_validation/models/tier_review.py:0
|
62
|
+
#, python-format
|
63
|
+
msgid "A review has been requested %s days ago."
|
64
|
+
msgstr ""
|
65
|
+
|
59
66
|
#. module: base_tier_validation
|
60
67
|
#. odoo-python
|
61
68
|
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
@@ -115,6 +122,11 @@ msgstr ""
|
|
115
122
|
msgid "All"
|
116
123
|
msgstr ""
|
117
124
|
|
125
|
+
#. module: base_tier_validation
|
126
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer
|
127
|
+
msgid "Allow Write For Reviewers"
|
128
|
+
msgstr ""
|
129
|
+
|
118
130
|
#. module: base_tier_validation
|
119
131
|
#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids
|
120
132
|
msgid "Allowed groups to use this Tier Validation Exception"
|
@@ -395,6 +407,11 @@ msgstr ""
|
|
395
407
|
msgid "It's in the validation process"
|
396
408
|
msgstr ""
|
397
409
|
|
410
|
+
#. module: base_tier_validation
|
411
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date
|
412
|
+
msgid "Last Reminder Date"
|
413
|
+
msgstr ""
|
414
|
+
|
398
415
|
#. module: base_tier_validation
|
399
416
|
#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid
|
400
417
|
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid
|
@@ -490,6 +507,13 @@ msgstr ""
|
|
490
507
|
msgid "Notify Reviewers on reaching Pending"
|
491
508
|
msgstr ""
|
492
509
|
|
510
|
+
#. module: base_tier_validation
|
511
|
+
#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay
|
512
|
+
msgid ""
|
513
|
+
"Number of days after which a message must be posted to remind about pending "
|
514
|
+
"validation (0 = no reminder)"
|
515
|
+
msgstr ""
|
516
|
+
|
493
517
|
#. module: base_tier_validation
|
494
518
|
#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action
|
495
519
|
msgid ""
|
@@ -627,6 +651,16 @@ msgstr ""
|
|
627
651
|
msgid "Reviews"
|
628
652
|
msgstr ""
|
629
653
|
|
654
|
+
#. module: base_tier_validation
|
655
|
+
#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server
|
656
|
+
msgid "Send Tier Review Reminder"
|
657
|
+
msgstr ""
|
658
|
+
|
659
|
+
#. module: base_tier_validation
|
660
|
+
#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay
|
661
|
+
msgid "Send reminder message on pending reviews"
|
662
|
+
msgstr ""
|
663
|
+
|
630
664
|
#. module: base_tier_validation
|
631
665
|
#. odoo-javascript
|
632
666
|
#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0
|
@@ -674,7 +708,8 @@ msgstr ""
|
|
674
708
|
#: code:addons/base_tier_validation/models/tier_validation.py:0
|
675
709
|
#, python-format
|
676
710
|
msgid ""
|
677
|
-
"This action needs to be validated for at least one record.
|
711
|
+
"This action needs to be validated for at least one record. Reviews pending:\n"
|
712
|
+
" - %s \n"
|
678
713
|
"Please request a validation."
|
679
714
|
msgstr ""
|
680
715
|
|
@@ -733,6 +768,12 @@ msgstr ""
|
|
733
768
|
msgid "Tier Validation Rejected Notification"
|
734
769
|
msgstr ""
|
735
770
|
|
771
|
+
#. module: base_tier_validation
|
772
|
+
#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder
|
773
|
+
#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder
|
774
|
+
msgid "Tier Validation Reminder"
|
775
|
+
msgstr ""
|
776
|
+
|
736
777
|
#. module: base_tier_validation
|
737
778
|
#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested
|
738
779
|
msgid "Tier Validation Requested"
|
@@ -20,11 +20,13 @@ class Users(models.Model):
|
|
20
20
|
review_groups = self.env["tier.review"].read_group(domain, ["model"], ["model"])
|
21
21
|
for review_group in review_groups:
|
22
22
|
model = review_group["model"]
|
23
|
+
Model = self.env[model]
|
23
24
|
reviews = self.env["tier.review"].search(review_group.get("__domain"))
|
24
|
-
|
25
|
+
# Skip Models not having Tier Validation enabled (example: was unistalled)
|
26
|
+
if reviews and hasattr(Model, "can_review"):
|
25
27
|
records = (
|
26
|
-
self.env
|
27
|
-
.
|
28
|
+
Model.with_user(self.env.user)
|
29
|
+
.with_context(active_test=False)
|
28
30
|
.search([("id", "in", reviews.mapped("res_id"))])
|
29
31
|
.filtered(lambda x: not x.rejected and x.can_review)
|
30
32
|
)
|
@@ -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>
|
@@ -599,7 +597,6 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
|
599
597
|
<div class="section" id="authors">
|
600
598
|
<h2><a class="toc-backref" href="#toc-entry-21">Authors</a></h2>
|
601
599
|
<ul class="simple">
|
602
|
-
<li>brain-tec AG</li>
|
603
600
|
<li>ForgeFlow</li>
|
604
601
|
</ul>
|
605
602
|
</div>
|
@@ -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,12 +1,12 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odoo-addon-base_tier_validation
|
3
|
-
Version: 17.0.2.
|
3
|
+
Version: 17.0.2.3.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.
|
7
7
|
Home-page: https://github.com/OCA/server-ux
|
8
8
|
License: AGPL-3
|
9
|
-
Author:
|
9
|
+
Author: ForgeFlow, Odoo Community Association (OCA)
|
10
10
|
Author-email: support@odoo-community.org
|
11
11
|
Classifier: Programming Language :: Python
|
12
12
|
Classifier: Framework :: Odoo
|
@@ -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
|
-----------------------
|
@@ -263,30 +261,29 @@ Credits
|
|
263
261
|
Authors
|
264
262
|
-------
|
265
263
|
|
266
|
-
* brain-tec AG
|
267
264
|
* ForgeFlow
|
268
265
|
|
269
266
|
Contributors
|
270
267
|
------------
|
271
268
|
|
272
|
-
-
|
273
|
-
-
|
274
|
-
-
|
275
|
-
-
|
276
|
-
-
|
277
|
-
-
|
278
|
-
-
|
279
|
-
-
|
280
|
-
-
|
281
|
-
-
|
282
|
-
-
|
283
|
-
-
|
284
|
-
-
|
285
|
-
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
-
|
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>
|
290
287
|
|
291
288
|
Maintainers
|
292
289
|
-----------
|
@@ -1,8 +1,9 @@
|
|
1
|
-
odoo/addons/base_tier_validation/README.rst,sha256=
|
1
|
+
odoo/addons/base_tier_validation/README.rst,sha256=ssumbPoXpw1zirWY8VJ0ukQe35PdJoM4d8UXYPBHGhY,8904
|
2
2
|
odoo/addons/base_tier_validation/__init__.py,sha256=rKfzYX9RhkkCxgh2f0PJLYN45Kw8T8-fwxw1pbjLuug,108
|
3
|
-
odoo/addons/base_tier_validation/__manifest__.py,sha256=
|
4
|
-
odoo/addons/base_tier_validation/data/
|
5
|
-
odoo/addons/base_tier_validation/
|
3
|
+
odoo/addons/base_tier_validation/__manifest__.py,sha256=fgw6nFay3kfI0Oh-HzFnE1UNt6Q5P_SSU5OXibMuPqI,1674
|
4
|
+
odoo/addons/base_tier_validation/data/cron_data.xml,sha256=HMA_SgAk3_vLu_QQLHd0UyzPASuDRj5cvpiK_17esQc,707
|
5
|
+
odoo/addons/base_tier_validation/data/mail_data.xml,sha256=hXhGTSyG2NAsDfZShmpyBKTXJi46L5PP1mFJAlKmlVE,1984
|
6
|
+
odoo/addons/base_tier_validation/i18n/base_tier_validation.pot,sha256=6yPkTdgfvQZ4QoSnO2BOQH9jc8xcHx-Kj-RdcXXhBDo,33011
|
6
7
|
odoo/addons/base_tier_validation/i18n/es.po,sha256=foXNBuNeOITckWNhyRzAi_MnAAcH0TL17il_MM2x2xc,37396
|
7
8
|
odoo/addons/base_tier_validation/i18n/es_MX.po,sha256=Dab4-L8S-W0ZfPqLgueQHQhov3j5TY3GpzgwurIYLe4,35026
|
8
9
|
odoo/addons/base_tier_validation/i18n/fr.po,sha256=LdnI_LiprThHzxcwFNBgXJI3Ylwdi8et0bICuCwM-1c,36032
|
@@ -13,20 +14,20 @@ odoo/addons/base_tier_validation/i18n/tr.po,sha256=vNq0HkHCwi9WL5fihgHtGY1aZFChx
|
|
13
14
|
odoo/addons/base_tier_validation/i18n/zh_CN.po,sha256=i0DqtQ8l-Rz8MvCRN7tY8rrESkZAT6OzTUzF1fnhyVM,33449
|
14
15
|
odoo/addons/base_tier_validation/models/__init__.py,sha256=X8c8CFM5eOXyIErFr7xsaGDBPZMBSKE2v4W-_2h9B2s,250
|
15
16
|
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=
|
17
|
-
odoo/addons/base_tier_validation/models/tier_definition.py,sha256=
|
18
|
-
odoo/addons/base_tier_validation/models/tier_review.py,sha256=
|
19
|
-
odoo/addons/base_tier_validation/models/tier_validation.py,sha256
|
17
|
+
odoo/addons/base_tier_validation/models/res_users.py,sha256=0xJZVWDUfdJwA3_ysHKO99cQph2m8iz0Zr5JU90td68,2163
|
18
|
+
odoo/addons/base_tier_validation/models/tier_definition.py,sha256=5QU2rPgtV1Ty2Nz-Td5W7dKzYyupMO-Q6A_IMl9TnrQ,5675
|
19
|
+
odoo/addons/base_tier_validation/models/tier_review.py,sha256=2otyKeErcz1DrMTwbKGrtPUiIov3KCC9CMHsKWIYJNk,8336
|
20
|
+
odoo/addons/base_tier_validation/models/tier_validation.py,sha256=nHo96cSjrDXmGQqRCTo224U_J8FhozRDp85421AvfS0,35386
|
20
21
|
odoo/addons/base_tier_validation/models/tier_validation_exception.py,sha256=9H_FbTF04IyB2u6a82UAdIPmv_MUcFKmLNVl7UOM1lg,2882
|
21
22
|
odoo/addons/base_tier_validation/readme/CONFIGURE.md,sha256=MuyVCH75T0_3Rtrkl7RUg7XzxjoU7zUkbPWv84_a-XU,1709
|
22
23
|
odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md,sha256=QM71L1RKrzDEgNvfgXjNAoWy3dMxH5k26HhcrrpdYRs,664
|
23
24
|
odoo/addons/base_tier_validation/readme/DESCRIPTION.md,sha256=SJukiMB1jvhcY8zrM6BLWCJrLJtMUPAg7dzzmJbyv18,958
|
24
25
|
odoo/addons/base_tier_validation/readme/HISTORY.md,sha256=P8GfoUhYG7QGIpa8Z0L67E3YEeZBFQCwpDXnt5WG-DY,1332
|
25
26
|
odoo/addons/base_tier_validation/readme/ROADMAP.md,sha256=HRRQQuOlSeOF5yfqG0KuANnvrde8y6Suz2pbrXB1OyU,864
|
26
|
-
odoo/addons/base_tier_validation/security/ir.model.access.csv,sha256=
|
27
|
+
odoo/addons/base_tier_validation/security/ir.model.access.csv,sha256=Fh7oRtUpyI0jS7DdWdN7zr5OYwfBg1XB71AuoS0-hp4,1139
|
27
28
|
odoo/addons/base_tier_validation/security/tier_validation_security.xml,sha256=eWFwz-osHgYFmVoEVzOSboO9oqUMtQ8oygyaz0os50Y,806
|
28
29
|
odoo/addons/base_tier_validation/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
|
29
|
-
odoo/addons/base_tier_validation/static/description/index.html,sha256=
|
30
|
+
odoo/addons/base_tier_validation/static/description/index.html,sha256=1_1om4I8so_kHFkIEMCBKl8mqiN0DBoa-Pj-vockpK8,23747
|
30
31
|
odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js,sha256=MNfjKSg-9h3JfeXiYlf15SAdVHjj3aUvedj0BqVvJrk,2254
|
31
32
|
odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml,sha256=_wIy5Gv2VUJEXD5_FGphx1J19-Y8uzFlWryuPqlIh8c,2798
|
32
33
|
odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js,sha256=MDWUp2ozeRdBoLeCfTcOnD-bKnk3yF6pHwtTAnsLZmg,1090
|
@@ -34,18 +35,19 @@ odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_r
|
|
34
35
|
odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml,sha256=uNQuIpAfRpqO53iSpiM4ra31dcExP7wdTwx4aRiDU60,6485
|
35
36
|
odoo/addons/base_tier_validation/static/src/js/services/tier_review_service.esm.js,sha256=E4xNh1WmnofpFt88EYYCGcDWyP53S2Mt450QawcrsCM,972
|
36
37
|
odoo/addons/base_tier_validation/templates/tier_validation_templates.xml,sha256=VI6kY0V6nVSz6KQ9GRxY_9TZkRrJgzBzsl9xFKtA__Y,3620
|
37
|
-
odoo/addons/base_tier_validation/tests/__init__.py,sha256=
|
38
|
-
odoo/addons/base_tier_validation/tests/common.py,sha256=
|
39
|
-
odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=
|
38
|
+
odoo/addons/base_tier_validation/tests/__init__.py,sha256=7tj1DSbPnyA__lAKxvjX53Ll_ZTE8y8Z1bewtZJoURI,166
|
39
|
+
odoo/addons/base_tier_validation/tests/common.py,sha256=0UDM1P5r7c2YftiBIs42ykFQdznWXzYur8SNscRK8cI,5966
|
40
|
+
odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=I8hVKYLcaiVGY7XKRI-rQ3wNsB1yR1VGqEdNWgaYSwk,42670
|
41
|
+
odoo/addons/base_tier_validation/tests/test_tier_validation_reminder.py,sha256=jsLU-7pJtbUvKPi7ddXU4jAwiJp32pKTrluarrtLKvU,1963
|
40
42
|
odoo/addons/base_tier_validation/tests/tier_validation_tester.py,sha256=m25QbB9-9Goxx1Fiz0qwsVO3WPL6jrtMlGDW6VQbLik,3345
|
41
43
|
odoo/addons/base_tier_validation/views/res_config_settings_views.xml,sha256=5HbrsAVaXRoQNX7utIQ_EzZrqzKnwBrV9uHsi-PHb9M,2640
|
42
|
-
odoo/addons/base_tier_validation/views/tier_definition_view.xml,sha256=
|
44
|
+
odoo/addons/base_tier_validation/views/tier_definition_view.xml,sha256=ScFV2RkAO2ysXAg4kLODlNJGSP65toR-TCKpe4-WGJo,7780
|
43
45
|
odoo/addons/base_tier_validation/views/tier_review_view.xml,sha256=tPzmpz-kbQwOOtJrAcsTJEP9bJLcfzWAITCpI86kZU4,966
|
44
46
|
odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml,sha256=aDtHtZU_5eVIvSQgT8uhM26aKYC7Sp0KUBYwd1eM3KM,5219
|
45
47
|
odoo/addons/base_tier_validation/wizard/__init__.py,sha256=52q6-LAjYeJ1Vu5ahon_jnhds9VsoJvYaQCiZc82WKw,95
|
46
48
|
odoo/addons/base_tier_validation/wizard/comment_wizard.py,sha256=gj7zCcpe47-2ifxSRlE6okQ1wtq5Ok3JBVg2CtN0ZIU,879
|
47
49
|
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.
|
50
|
+
odoo_addon_base_tier_validation-17.0.2.3.0.dist-info/METADATA,sha256=zbVRXq381qo4w-G8LL79SirujUSuD4BRE398Z6Fj1XU,9486
|
51
|
+
odoo_addon_base_tier_validation-17.0.2.3.0.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
|
52
|
+
odoo_addon_base_tier_validation-17.0.2.3.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
|
53
|
+
odoo_addon_base_tier_validation-17.0.2.3.0.dist-info/RECORD,,
|
File without changes
|