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.
Files changed (20) hide show
  1. odoo/addons/base_tier_validation/README.rst +66 -69
  2. odoo/addons/base_tier_validation/__manifest__.py +4 -3
  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/models/res_users.py +5 -3
  7. odoo/addons/base_tier_validation/models/tier_definition.py +39 -0
  8. odoo/addons/base_tier_validation/models/tier_review.py +40 -0
  9. odoo/addons/base_tier_validation/models/tier_validation.py +37 -13
  10. odoo/addons/base_tier_validation/security/ir.model.access.csv +1 -1
  11. odoo/addons/base_tier_validation/static/description/index.html +11 -14
  12. odoo/addons/base_tier_validation/tests/__init__.py +1 -0
  13. odoo/addons/base_tier_validation/tests/common.py +1 -1
  14. odoo/addons/base_tier_validation/tests/test_tier_validation.py +11 -0
  15. odoo/addons/base_tier_validation/tests/test_tier_validation_reminder.py +46 -0
  16. odoo/addons/base_tier_validation/views/tier_definition_view.xml +2 -0
  17. {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
  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}/RECORD +20 -18
  19. {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
  20. {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:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
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
- - 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
74
- their 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.
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
- - 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
96
- modified only in the defined fields when the Validation process is
97
- ongoing.
98
- - If check *Write after Validation*, records will be able to be
99
- modified only in the defined fields when the Validation process is
100
- finished.
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
- - **Issue:**
108
+ - **Issue:**
111
109
 
112
- When using approve_sequence option in any tier.definition there can
113
- be inconsistencies in the systray notifications.
110
+ When using approve_sequence option in any tier.definition there can be
111
+ inconsistencies in the systray notifications.
114
112
 
115
- **Description:**
113
+ **Description:**
116
114
 
117
- Field can_review in tier.review is used to filter out, in the systray
118
- notifications, the reviews a user can approve. This can_review field
119
- is updated **in the database** in method review_user_count, this can
120
- make it very inconsistent for databases with a lot of users and
121
- recurring updates that can change the expected behavior.
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
- - **Migration to 15.0:**
121
+ - **Migration to 15.0:**
124
122
 
125
- The parameter \_tier_validation_manual_config will become False, on
126
- 14.0, the default value is True, as the change is applied after the
127
- migration. In order to use the new behavior we need to modify the
128
- value on our expected model.
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
- - When using approve_sequence option in any tier.definition there can
151
- be inconsistencies in the systray notifications
152
- - When using approve_sequence, still not approve only the needed
153
- sequence, but also other sequence for the same approver
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
- - Show comment on Reviews Table.
161
- - Edit notification with approve_sequence.
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
- - Add comment on Reviews Table.
169
- - Approve by sequence.
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
- - Remove message_subscribe_users
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
- - Notify reviewers
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
- - Singleton error
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
- - Edit Reviews Table
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
- - Edit drop-down style width and position
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
- - Pass parameters as functions.
212
- - Add Systray.
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
- - Lois Rilo <lois.rilo@forgeflow.com>
257
- - Naglis Jonaitis <naglis@versada.eu>
258
- - Adrià Gil Sorribes <adria.gil@forgeflow.com>
259
- - Pimolnat Suntian <pimolnats@ecosoft.co.th>
260
- - Pedro Gonzalez <pedro.gonzalez@pesol.es>
261
- - Kitti U. <kittiu@ecosoft.co.th>
262
- - Saran Lim. <saranl@ecosoft.co.th>
263
- - Carlos Lopez <celm1990@gmail.com>
264
- - Javier Colmeiro <javier.colmeiro@braintec.com>
265
- - bosd
266
- - Evan Soh <evan.soh@omnisoftsolution.com>
267
- - Manuel Regidor <manuel.regidor@sygel.es>
268
- - Eduardo de Miguel <edu@moduon.team>
269
- - `XCG Consulting <https://xcg-consulting.fr>`__:
270
-
271
- - Houzéfa Abbasbhay
272
-
273
- - Stefan Rijnhart <stefan@opener.amsterdam>
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-19 ForgeFlow S.L. (https://www.forgeflow.com)
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.2.0",
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": "brain-tec AG, ForgeFlow, Odoo Community Association (OCA)",
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. \n"
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
- if reviews:
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[model]
27
- .with_user(self.env.user)
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
- [(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:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
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>
@@ -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>
@@ -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,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-base_tier_validation
3
- Version: 17.0.2.2.0
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: brain-tec AG, ForgeFlow, Odoo Community Association (OCA)
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:75c17765e7078f2d88d782af0b37aa519e3ec9f2030d3ceb85a1b98c6547aaa2
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
  -----------------------
@@ -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
- - Lois Rilo <lois.rilo@forgeflow.com>
273
- - Naglis Jonaitis <naglis@versada.eu>
274
- - Adrià Gil Sorribes <adria.gil@forgeflow.com>
275
- - Pimolnat Suntian <pimolnats@ecosoft.co.th>
276
- - Pedro Gonzalez <pedro.gonzalez@pesol.es>
277
- - Kitti U. <kittiu@ecosoft.co.th>
278
- - Saran Lim. <saranl@ecosoft.co.th>
279
- - Carlos Lopez <celm1990@gmail.com>
280
- - Javier Colmeiro <javier.colmeiro@braintec.com>
281
- - bosd
282
- - Evan Soh <evan.soh@omnisoftsolution.com>
283
- - Manuel Regidor <manuel.regidor@sygel.es>
284
- - Eduardo de Miguel <edu@moduon.team>
285
- - `XCG Consulting <https://xcg-consulting.fr>`__:
286
-
287
- - Houzéfa Abbasbhay
288
-
289
- - 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>
290
287
 
291
288
  Maintainers
292
289
  -----------
@@ -1,8 +1,9 @@
1
- odoo/addons/base_tier_validation/README.rst,sha256=8EoPEhqkz8qegBjVSc3jayDbtatcBwCEMGb0QA3l1pw,8989
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=E-B2x0048zLnlAJDair744INsYOYXU5fPbVUjPAYExE,1658
4
- odoo/addons/base_tier_validation/data/mail_data.xml,sha256=UKzkLT8rYrFuThdp43v7nLW5SOco4vvIIAhbB_IAQZs,1414
5
- odoo/addons/base_tier_validation/i18n/base_tier_validation.pot,sha256=kMrxSb-JBx09Ips79-X6pyC0yPsc-fEQ8W_1Zv9z1wM,31554
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=rpXM9gCB1sIdFYU032VPJh6v3BWRAiwnmXi8Ukuk8CY,1985
17
- odoo/addons/base_tier_validation/models/tier_definition.py,sha256=I-HeOZopA1n-bISs28XDeAosUrTnhL_mp_TB3awb2w0,4168
18
- odoo/addons/base_tier_validation/models/tier_review.py,sha256=vuR832VVM-ZUDm-4j9zK1BSNnL0JfesxBSLyhW4Zia8,6754
19
- odoo/addons/base_tier_validation/models/tier_validation.py,sha256=-ipA8E1C8VUIiCPfok9_ARyKVJuNbrGCi6daKpFEXuI,34585
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=g6B58IuYYqxD54e9I9vyre7mD74tkpauqTqMAH4Oey0,1134
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=2qCIPdp8qgLXIgE28YkGxdGhf2Bg8X8UIna5hXV8t60,23769
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=3z2_lQ9JiDSFDam4p24qDw5j02iaPb4m2naxv9DkbGA,122
38
- odoo/addons/base_tier_validation/tests/common.py,sha256=iqVkPTebb6oKgapgFeNwORgR_0-vO2Ttd0WA6-Ggd_A,5944
39
- odoo/addons/base_tier_validation/tests/test_tier_validation.py,sha256=UIrjZBY8x9Ch6BYKXjy_YN4PLZL0HG_GMyUzM5Cb8YI,42106
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=FHpO2tW8FYKQffayERVlQEJH_ip8baZ7nC1NcFDsP7Y,7635
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.2.0.dist-info/METADATA,sha256=F7EkdnIaCarHU6vG3jNJJidOdIyPQwOUdWRMJLTj_8A,9585
49
- odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
50
- odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
51
- odoo_addon_base_tier_validation-17.0.2.2.0.dist-info/RECORD,,
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,,