odoo-addon-base-tier-validation 17.0.2.3.2.1__py3-none-any.whl → 18.0.1.0.0.3__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 +14 -6
- odoo/addons/base_tier_validation/__manifest__.py +3 -7
- odoo/addons/base_tier_validation/data/cron_data.xml +0 -2
- odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +7 -63
- odoo/addons/base_tier_validation/i18n/es.po +0 -2
- odoo/addons/base_tier_validation/i18n/es_MX.po +0 -2
- odoo/addons/base_tier_validation/i18n/fr.po +0 -2
- odoo/addons/base_tier_validation/i18n/it.po +0 -2
- odoo/addons/base_tier_validation/i18n/nl_NL.po +0 -2
- odoo/addons/base_tier_validation/i18n/sv.po +0 -2
- odoo/addons/base_tier_validation/i18n/tr.po +0 -2
- odoo/addons/base_tier_validation/i18n/zh_CN.po +0 -2
- odoo/addons/base_tier_validation/models/res_users.py +20 -14
- odoo/addons/base_tier_validation/models/tier_definition.py +14 -12
- odoo/addons/base_tier_validation/models/tier_review.py +15 -19
- odoo/addons/base_tier_validation/models/tier_validation.py +58 -57
- odoo/addons/base_tier_validation/models/tier_validation_exception.py +16 -14
- odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md +2 -0
- odoo/addons/base_tier_validation/readme/CREDITS.md +1 -0
- odoo/addons/base_tier_validation/security/ir.model.access.csv +1 -1
- odoo/addons/base_tier_validation/security/tier_validation_security.xml +2 -6
- odoo/addons/base_tier_validation/static/description/index.html +14 -6
- odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js +18 -17
- odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml +46 -38
- odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js +17 -17
- odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss +1 -1
- odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml +25 -37
- odoo/addons/base_tier_validation/static/src/js/services/tier_review_service.esm.js +3 -4
- odoo/addons/base_tier_validation/templates/tier_validation_templates.xml +41 -50
- odoo/addons/base_tier_validation/tests/common.py +3 -6
- odoo/addons/base_tier_validation/views/tier_definition_view.xml +7 -11
- odoo/addons/base_tier_validation/views/tier_review_view.xml +3 -3
- odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml +4 -5
- {odoo_addon_base_tier_validation-17.0.2.3.2.1.dist-info → odoo_addon_base_tier_validation-18.0.1.0.0.3.dist-info}/METADATA +17 -9
- {odoo_addon_base_tier_validation-17.0.2.3.2.1.dist-info → odoo_addon_base_tier_validation-18.0.1.0.0.3.dist-info}/RECORD +37 -36
- {odoo_addon_base_tier_validation-17.0.2.3.2.1.dist-info → odoo_addon_base_tier_validation-18.0.1.0.0.3.dist-info}/WHEEL +0 -0
- {odoo_addon_base_tier_validation-17.0.2.3.2.1.dist-info → odoo_addon_base_tier_validation-18.0.1.0.0.3.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ import logging
|
|
5
5
|
|
6
6
|
import pytz
|
7
7
|
|
8
|
-
from odoo import
|
8
|
+
from odoo import api, fields, models
|
9
9
|
from odoo.exceptions import ValidationError
|
10
10
|
|
11
11
|
_logger = logging.getLogger(__name__)
|
@@ -15,7 +15,7 @@ class TierReview(models.Model):
|
|
15
15
|
_name = "tier.review"
|
16
16
|
_description = "Tier Review"
|
17
17
|
|
18
|
-
name = fields.Char(related="definition_id.name"
|
18
|
+
name = fields.Char(related="definition_id.name")
|
19
19
|
status = fields.Selection(
|
20
20
|
[
|
21
21
|
("waiting", "Waiting"),
|
@@ -32,14 +32,10 @@ class TierReview(models.Model):
|
|
32
32
|
related="definition_id.company_id",
|
33
33
|
store=True,
|
34
34
|
)
|
35
|
-
review_type = fields.Selection(related="definition_id.review_type"
|
36
|
-
reviewer_id = fields.Many2one(related="definition_id.reviewer_id"
|
37
|
-
reviewer_group_id = fields.Many2one(
|
38
|
-
|
39
|
-
)
|
40
|
-
reviewer_field_id = fields.Many2one(
|
41
|
-
related="definition_id.reviewer_field_id", readonly=True
|
42
|
-
)
|
35
|
+
review_type = fields.Selection(related="definition_id.review_type")
|
36
|
+
reviewer_id = fields.Many2one(related="definition_id.reviewer_id")
|
37
|
+
reviewer_group_id = fields.Many2one(related="definition_id.reviewer_group_id")
|
38
|
+
reviewer_field_id = fields.Many2one(related="definition_id.reviewer_field_id")
|
43
39
|
reviewer_ids = fields.Many2many(
|
44
40
|
string="Reviewers",
|
45
41
|
comodel_name="res.users",
|
@@ -55,7 +51,7 @@ class TierReview(models.Model):
|
|
55
51
|
reviewed_formated_date = fields.Char(
|
56
52
|
string="Validation Formated Date", compute="_compute_reviewed_formated_date"
|
57
53
|
)
|
58
|
-
has_comment = fields.Boolean(related="definition_id.has_comment"
|
54
|
+
has_comment = fields.Boolean(related="definition_id.has_comment")
|
59
55
|
comment = fields.Char(string="Comments")
|
60
56
|
can_review = fields.Boolean(
|
61
57
|
compute="_compute_can_review",
|
@@ -63,11 +59,9 @@ class TierReview(models.Model):
|
|
63
59
|
help="""Can review will be marked if the review is pending and the
|
64
60
|
approve sequence has been achieved""",
|
65
61
|
)
|
66
|
-
approve_sequence = fields.Boolean(
|
67
|
-
related="definition_id.approve_sequence", readonly=True
|
68
|
-
)
|
62
|
+
approve_sequence = fields.Boolean(related="definition_id.approve_sequence")
|
69
63
|
approve_sequence_bypass = fields.Boolean(
|
70
|
-
related="definition_id.approve_sequence_bypass"
|
64
|
+
related="definition_id.approve_sequence_bypass"
|
71
65
|
)
|
72
66
|
last_reminder_date = fields.Datetime(readonly=True)
|
73
67
|
|
@@ -141,7 +135,7 @@ class TierReview(models.Model):
|
|
141
135
|
for rec in self:
|
142
136
|
todo_by = False
|
143
137
|
if rec.reviewer_group_id:
|
144
|
-
todo_by = _("Group %s"
|
138
|
+
todo_by = self.env._("Group %s", rec.reviewer_group_id.name)
|
145
139
|
else:
|
146
140
|
todo_by = ", ".join(rec.reviewer_ids[:num_show].mapped("display_name"))
|
147
141
|
num_users = len(rec.reviewer_ids)
|
@@ -157,7 +151,9 @@ class TierReview(models.Model):
|
|
157
151
|
resource = self.env[self.model].browse(self.res_id)
|
158
152
|
reviewer_field = getattr(resource, self.reviewer_field_id.name, False)
|
159
153
|
if not reviewer_field or not reviewer_field._name == "res.users":
|
160
|
-
raise ValidationError(
|
154
|
+
raise ValidationError(
|
155
|
+
self.env._("There are no res.users in the selected field")
|
156
|
+
)
|
161
157
|
return reviewer_field
|
162
158
|
|
163
159
|
def _notify_pending_status(self, review_ids):
|
@@ -173,7 +169,7 @@ class TierReview(models.Model):
|
|
173
169
|
|
174
170
|
def _notify_review_reminder_body(self):
|
175
171
|
delay = (fields.Datetime.now() - self.create_date).days
|
176
|
-
return _("A review has been requested %s days ago."
|
172
|
+
return self.env._("A review has been requested %s days ago.", delay)
|
177
173
|
|
178
174
|
def _send_review_reminder(self):
|
179
175
|
record = self.env[self.model].browse(self.res_id)
|
@@ -183,7 +179,7 @@ class TierReview(models.Model):
|
|
183
179
|
elif hasattr(record, "message_post"):
|
184
180
|
self._notify_review_reminder(record)
|
185
181
|
else:
|
186
|
-
msg = "Could not send reminder for record
|
182
|
+
msg = f"Could not send reminder for record {record}"
|
187
183
|
_logger.exception(msg)
|
188
184
|
self.last_reminder_date = fields.Datetime.now()
|
189
185
|
|
@@ -7,8 +7,9 @@ from ast import literal_eval
|
|
7
7
|
from lxml import etree
|
8
8
|
from psycopg2.extensions import AsIs
|
9
9
|
|
10
|
-
from odoo import
|
10
|
+
from odoo import api, fields, models
|
11
11
|
from odoo.exceptions import ValidationError
|
12
|
+
from odoo.tools import SQL
|
12
13
|
from odoo.tools.misc import frozendict
|
13
14
|
|
14
15
|
BASE_EXCEPTION_FIELDS = ["message_follower_ids", "access_token"]
|
@@ -169,22 +170,21 @@ class TierValidation(models.AbstractModel):
|
|
169
170
|
return self._description
|
170
171
|
|
171
172
|
def _get_to_validate_message(self):
|
172
|
-
return (
|
173
|
-
"
|
174
|
-
|
175
|
-
|
176
|
-
)
|
173
|
+
return f"""<i class="fa fa-info-circle"></i> {self.env._(
|
174
|
+
"This %s needs to be validated",
|
175
|
+
self._get_to_validate_message_name()
|
176
|
+
)}"""
|
177
177
|
|
178
178
|
def _get_validated_message(self):
|
179
|
-
msg = """<i class="fa fa-thumbs-up"
|
180
|
-
"
|
181
|
-
)
|
179
|
+
msg = f"""<i class="fa fa-thumbs-up"></i> {self.env._(
|
180
|
+
"Operation has been <b>validated</b>!"
|
181
|
+
)}"""
|
182
182
|
return self.validated and msg or ""
|
183
183
|
|
184
184
|
def _get_rejected_message(self):
|
185
|
-
msg = """<i class="fa fa-thumbs-down"
|
186
|
-
"
|
187
|
-
)
|
185
|
+
msg = f"""<i class="fa fa-thumbs-down"></i> {self.env._(
|
186
|
+
"Operation has been <b>rejected</b>."
|
187
|
+
)}"""
|
188
188
|
return self.rejected and msg or ""
|
189
189
|
|
190
190
|
def _compute_validated_rejected(self):
|
@@ -221,7 +221,7 @@ class TierValidation(models.AbstractModel):
|
|
221
221
|
review = rec.review_ids.sorted("sequence").filtered(
|
222
222
|
lambda x: x.status == "pending"
|
223
223
|
)[:1]
|
224
|
-
rec.next_review = review and _("Next: %s"
|
224
|
+
rec.next_review = review and self.env._("Next: %s", review.name or "")
|
225
225
|
|
226
226
|
def _compute_hide_reviews(self):
|
227
227
|
for rec in self:
|
@@ -368,11 +368,12 @@ class TierValidation(models.AbstractModel):
|
|
368
368
|
self._tier_validation_check_write_remove_reviews(vals)
|
369
369
|
return super().write(vals)
|
370
370
|
|
371
|
-
def
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
371
|
+
def _write_multi(self, vals_list):
|
372
|
+
for rec, vals in zip(self, vals_list, strict=False):
|
373
|
+
if rec._tier_validation_state_field_is_computed:
|
374
|
+
rec._tier_validation_check_state_on_write(vals)
|
375
|
+
rec._tier_validation_check_write_remove_reviews(vals)
|
376
|
+
return super()._write_multi(vals_list)
|
376
377
|
|
377
378
|
def _tier_validation_get_current_state_value(self):
|
378
379
|
"""Get the current value from the cache or the database.
|
@@ -383,12 +384,12 @@ class TierValidation(models.AbstractModel):
|
|
383
384
|
self.ensure_one()
|
384
385
|
if self._tier_validation_state_field_is_computed and isinstance(self.id, int):
|
385
386
|
self.env.cr.execute(
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
387
|
+
SQL(
|
388
|
+
"select %(field)s from %(table)s where id = %(res_id)s",
|
389
|
+
field=AsIs(self._state_field),
|
390
|
+
table=AsIs(self._table),
|
391
|
+
res_id=self.id,
|
392
|
+
)
|
392
393
|
)
|
393
394
|
rows = self.env.cr.fetchall()
|
394
395
|
if rows:
|
@@ -407,16 +408,16 @@ class TierValidation(models.AbstractModel):
|
|
407
408
|
lambda r: r.status == "pending"
|
408
409
|
).mapped("name")
|
409
410
|
raise ValidationError(
|
410
|
-
_(
|
411
|
+
self.env._(
|
411
412
|
"This action needs to be validated for at least "
|
412
413
|
"one record. Reviews pending:\n - %s "
|
413
|
-
"\nPlease request a validation."
|
414
|
+
"\nPlease request a validation.",
|
415
|
+
"\n - ".join(pending_reviews),
|
414
416
|
)
|
415
|
-
% "\n - ".join(pending_reviews)
|
416
417
|
)
|
417
418
|
if rec.review_ids and not rec.validated:
|
418
419
|
raise ValidationError(
|
419
|
-
_(
|
420
|
+
self.env._(
|
420
421
|
"A validation process is still open for at least "
|
421
422
|
"one record."
|
422
423
|
)
|
@@ -437,16 +438,16 @@ class TierValidation(models.AbstractModel):
|
|
437
438
|
) = rec._get_fields_to_write_validation(
|
438
439
|
vals, rec._get_under_validation_exceptions
|
439
440
|
)
|
441
|
+
not_allowed_fields_str = "\n- ".join(not_allowed_fields)
|
442
|
+
allowed_fields_str = "\n- ".join(allowed_fields)
|
440
443
|
raise ValidationError(
|
441
|
-
_(
|
444
|
+
self.env._(
|
442
445
|
"You are not allowed to write those fields under validation.\n"
|
443
|
-
"- %(
|
444
|
-
"Only those fields can be modified:\n- %(
|
446
|
+
"- %(not_allowed_fields_str)s\n\n"
|
447
|
+
"Only those fields can be modified:\n- %(allowed_fields_str)s",
|
448
|
+
not_allowed_fields_str=not_allowed_fields_str,
|
449
|
+
allowed_fields_str=allowed_fields_str,
|
445
450
|
)
|
446
|
-
% {
|
447
|
-
"not_allowed_fields": "\n- ".join(not_allowed_fields),
|
448
|
-
"allowed_fields": "\n- ".join(allowed_fields),
|
449
|
-
}
|
450
451
|
)
|
451
452
|
|
452
453
|
# Write after validation. Check only if Tier Validation Exception is created
|
@@ -464,16 +465,16 @@ class TierValidation(models.AbstractModel):
|
|
464
465
|
) = rec._get_fields_to_write_validation(
|
465
466
|
vals, rec._get_after_validation_exceptions
|
466
467
|
)
|
468
|
+
not_allowed_fields_str = "\n- ".join(not_allowed_fields)
|
469
|
+
allowed_fields_str = "\n- ".join(allowed_fields)
|
467
470
|
raise ValidationError(
|
468
|
-
_(
|
471
|
+
self.env._(
|
469
472
|
"You are not allowed to write those fields after validation.\n"
|
470
|
-
"- %(
|
471
|
-
"Only those fields can be modified:\n- %(
|
473
|
+
"- %(not_allowed_fields_str)s\n\n"
|
474
|
+
"Only those fields can be modified:\n- %(allowed_fields_str)s",
|
475
|
+
not_allowed_fields_str=not_allowed_fields_str,
|
476
|
+
allowed_fields_str=allowed_fields_str,
|
472
477
|
)
|
473
|
-
% {
|
474
|
-
"not_allowed_fields": "\n- ".join(not_allowed_fields),
|
475
|
-
"allowed_fields": "\n- ".join(allowed_fields),
|
476
|
-
}
|
477
478
|
)
|
478
479
|
|
479
480
|
def _tier_validation_check_write_remove_reviews(self, vals):
|
@@ -576,13 +577,13 @@ class TierValidation(models.AbstractModel):
|
|
576
577
|
)
|
577
578
|
if has_comment:
|
578
579
|
comment = has_comment.mapped("comment")[0]
|
579
|
-
return _("A review was accepted. (%s)"
|
580
|
-
return _("A review was accepted")
|
580
|
+
return self.env._("A review was accepted. (%s)", comment)
|
581
|
+
return self.env._("A review was accepted")
|
581
582
|
|
582
583
|
def _add_comment(self, validate_reject, reviews):
|
583
584
|
wizard = self.env.ref("base_tier_validation.view_comment_wizard")
|
584
585
|
return {
|
585
|
-
"name": _("Comment"),
|
586
|
+
"name": self.env._("Comment"),
|
586
587
|
"type": "ir.actions.act_window",
|
587
588
|
"view_mode": "form",
|
588
589
|
"res_model": "comment.wizard",
|
@@ -626,11 +627,12 @@ class TierValidation(models.AbstractModel):
|
|
626
627
|
)
|
627
628
|
if has_comment:
|
628
629
|
comment = has_comment.mapped("comment")[0]
|
629
|
-
return _(
|
630
|
-
"
|
631
|
-
|
632
|
-
|
633
|
-
|
630
|
+
return self.env._(
|
631
|
+
"A review was rejected by %(user)s. (%(comment)s)",
|
632
|
+
user=self.env.user.name,
|
633
|
+
comment=comment,
|
634
|
+
)
|
635
|
+
return self.env._("A review was rejected by %s.", self.env.user.name)
|
634
636
|
|
635
637
|
def _notify_rejected_review(self):
|
636
638
|
post = "message_post"
|
@@ -672,12 +674,13 @@ class TierValidation(models.AbstractModel):
|
|
672
674
|
rec._notify_rejected_review()
|
673
675
|
|
674
676
|
def _notify_created_review_body(self):
|
675
|
-
return _(
|
676
|
-
|
677
|
+
return self.env._(
|
678
|
+
"A record to be reviewed has been created by %s.",
|
679
|
+
self.env.user.name,
|
677
680
|
)
|
678
681
|
|
679
682
|
def _notify_requested_review_body(self):
|
680
|
-
return _("A review has been requested by %s."
|
683
|
+
return self.env._("A review has been requested by %s.", self.env.user.name)
|
681
684
|
|
682
685
|
def _notify_review_requested(self, tier_reviews):
|
683
686
|
"""method to notify when tier validation is created"""
|
@@ -732,7 +735,7 @@ class TierValidation(models.AbstractModel):
|
|
732
735
|
return created_trs
|
733
736
|
|
734
737
|
def _notify_restarted_review_body(self):
|
735
|
-
return _("The review has been reset by %s."
|
738
|
+
return self.env._("The review has been reset by %s.", self.env.user.name)
|
736
739
|
|
737
740
|
def _notify_restarted_review(self):
|
738
741
|
post = "message_post"
|
@@ -777,10 +780,8 @@ class TierValidation(models.AbstractModel):
|
|
777
780
|
@api.model
|
778
781
|
def _update_counter(self, review_counter):
|
779
782
|
self.review_ids._compute_can_review()
|
780
|
-
notifications = []
|
781
783
|
channel = "base.tier.validation/updated"
|
782
|
-
|
783
|
-
self.env["bus.bus"]._sendmany(notifications)
|
784
|
+
self.env.user.partner_id._bus_send(channel, review_counter)
|
784
785
|
|
785
786
|
def unlink(self):
|
786
787
|
self.mapped("review_ids").unlink()
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Copyright 2024 Moduon Team (https://www.moduon.team)
|
2
2
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
3
3
|
|
4
|
-
from odoo import
|
4
|
+
from odoo import api, exceptions, fields, models
|
5
5
|
|
6
6
|
from .tier_validation import BASE_EXCEPTION_FIELDS
|
7
7
|
|
@@ -9,7 +9,6 @@ from .tier_validation import BASE_EXCEPTION_FIELDS
|
|
9
9
|
class TierValidationException(models.Model):
|
10
10
|
_name = "tier.validation.exception"
|
11
11
|
_description = "Tier Validation Exceptions"
|
12
|
-
_rec_name = "name"
|
13
12
|
|
14
13
|
@api.model
|
15
14
|
def _get_tier_validation_model_names(self):
|
@@ -30,7 +29,6 @@ class TierValidationException(models.Model):
|
|
30
29
|
related="model_id.model",
|
31
30
|
string="Model Name",
|
32
31
|
store=True,
|
33
|
-
readonly=True,
|
34
32
|
index=True,
|
35
33
|
)
|
36
34
|
field_ids = fields.Many2many(
|
@@ -64,17 +62,21 @@ class TierValidationException(models.Model):
|
|
64
62
|
|
65
63
|
@api.depends("model_id")
|
66
64
|
def _compute_valid_model_field_ids(self):
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
65
|
+
model_names = self.mapped("model_name")
|
66
|
+
valid_model_fields = dict(
|
67
|
+
self.env["ir.model.fields"]
|
68
|
+
.sudo()
|
69
|
+
._read_group(
|
70
|
+
domain=[
|
71
|
+
("model", "in", model_names),
|
72
|
+
("name", "not in", BASE_EXCEPTION_FIELDS),
|
73
|
+
],
|
74
|
+
groupby=["model"],
|
75
|
+
aggregates=["id:array_agg"],
|
77
76
|
)
|
77
|
+
)
|
78
|
+
for record in self:
|
79
|
+
record.valid_model_field_ids = valid_model_fields.get(record.model_name, [])
|
78
80
|
|
79
81
|
@api.constrains(
|
80
82
|
"allowed_to_write_under_validation", "allowed_to_write_after_validation"
|
@@ -85,7 +87,7 @@ class TierValidationException(models.Model):
|
|
85
87
|
and not self.allowed_to_write_after_validation
|
86
88
|
):
|
87
89
|
raise exceptions.ValidationError(
|
88
|
-
_(
|
90
|
+
self.env._(
|
89
91
|
"At least one of these fields must be checked! "
|
90
92
|
"Write under Validation, Write after Validation"
|
91
93
|
)
|
@@ -0,0 +1 @@
|
|
1
|
+
The migration of this module from 17.0 to 18.0 was financially supported by Camptocamp.
|
@@ -7,5 +7,5 @@ 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
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
|
-
access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception
|
10
|
+
access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,base.group_user,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
|
@@ -4,16 +4,12 @@
|
|
4
4
|
<field name="name">Tier Definition multi-company</field>
|
5
5
|
<field name="model_id" ref="model_tier_definition" />
|
6
6
|
<field name="global" eval="True" />
|
7
|
-
<field name="domain_force">
|
8
|
-
['|',('company_id','=',False),('company_id', 'in', company_ids)]
|
9
|
-
</field>
|
7
|
+
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
10
8
|
</record>
|
11
9
|
<record id="tier_review_comp_rule" model="ir.rule">
|
12
10
|
<field name="name">Tier Review multi-company</field>
|
13
11
|
<field name="model_id" ref="model_tier_review" />
|
14
12
|
<field name="global" eval="True" />
|
15
|
-
<field name="domain_force">
|
16
|
-
['|',('company_id','=',False),('company_id', 'in', company_ids)]
|
17
|
-
</field>
|
13
|
+
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
18
14
|
</record>
|
19
15
|
</odoo>
|
@@ -367,9 +367,9 @@ 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:7b3ca7f03e3d92d3cdaeb8de45ef9b88d126b246ba08f2f16d0b17f0121d1c11
|
371
371
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
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/
|
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/18.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-18-0/server-ux-18-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=18.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
|
374
374
|
company and sometimes it also involves several people and stages in the
|
375
375
|
process. With this module you will be able to define your custom
|
@@ -414,7 +414,8 @@ compute method in <tt class="docutils literal">_get_after_validation_exceptions<
|
|
414
414
|
<li><a class="reference internal" href="#credits" id="toc-entry-20">Credits</a><ul>
|
415
415
|
<li><a class="reference internal" href="#authors" id="toc-entry-21">Authors</a></li>
|
416
416
|
<li><a class="reference internal" href="#contributors" id="toc-entry-22">Contributors</a></li>
|
417
|
-
<li><a class="reference internal" href="#
|
417
|
+
<li><a class="reference internal" href="#other-credits" id="toc-entry-23">Other credits</a></li>
|
418
|
+
<li><a class="reference internal" href="#maintainers" id="toc-entry-24">Maintainers</a></li>
|
418
419
|
</ul>
|
419
420
|
</li>
|
420
421
|
</ul>
|
@@ -589,7 +590,7 @@ sequence, but also other sequence for the same approver</li>
|
|
589
590
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-ux/issues">GitHub Issues</a>.
|
590
591
|
In case of trouble, please check there if your issue has already been reported.
|
591
592
|
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
592
|
-
<a class="reference external" href="https://github.com/OCA/server-ux/issues/new?body=module:%20base_tier_validation%0Aversion:%
|
593
|
+
<a class="reference external" href="https://github.com/OCA/server-ux/issues/new?body=module:%20base_tier_validation%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
593
594
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
594
595
|
</div>
|
595
596
|
<div class="section" id="credits">
|
@@ -621,10 +622,17 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
|
621
622
|
</ul>
|
622
623
|
</li>
|
623
624
|
<li>Stefan Rijnhart <<a class="reference external" href="mailto:stefan@opener.amsterdam">stefan@opener.amsterdam</a>></li>
|
625
|
+
<li>Kevin Khao <<a class="reference external" href="mailto:kevinkhao@gmail.com">kevinkhao@gmail.com</a>></li>
|
626
|
+
<li>Do Anh Duy <<a class="reference external" href="mailto:duyda@trobz.com">duyda@trobz.com</a>></li>
|
624
627
|
</ul>
|
625
628
|
</div>
|
629
|
+
<div class="section" id="other-credits">
|
630
|
+
<h2><a class="toc-backref" href="#toc-entry-23">Other credits</a></h2>
|
631
|
+
<p>The migration of this module from 17.0 to 18.0 was financially supported
|
632
|
+
by Camptocamp.</p>
|
633
|
+
</div>
|
626
634
|
<div class="section" id="maintainers">
|
627
|
-
<h2><a class="toc-backref" href="#toc-entry-
|
635
|
+
<h2><a class="toc-backref" href="#toc-entry-24">Maintainers</a></h2>
|
628
636
|
<p>This module is maintained by the OCA.</p>
|
629
637
|
<a class="reference external image-reference" href="https://odoo-community.org">
|
630
638
|
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
|
@@ -634,7 +642,7 @@ mission is to support the collaborative development of Odoo features and
|
|
634
642
|
promote its widespread use.</p>
|
635
643
|
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
|
636
644
|
<p><a class="reference external image-reference" href="https://github.com/LoisRForgeFlow"><img alt="LoisRForgeFlow" src="https://github.com/LoisRForgeFlow.png?size=40px" /></a></p>
|
637
|
-
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-ux/tree/
|
645
|
+
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-ux/tree/18.0/base_tier_validation">OCA/server-ux</a> project on GitHub.</p>
|
638
646
|
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
639
647
|
</div>
|
640
648
|
</div>
|
odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js
CHANGED
@@ -1,22 +1,25 @@
|
|
1
|
-
/* @odoo-module */
|
2
|
-
|
3
1
|
import {Component, useState} from "@odoo/owl";
|
4
2
|
import {Dropdown} from "@web/core/dropdown/dropdown";
|
5
|
-
import {DropdownItem} from "@web/core/dropdown/dropdown_item";
|
6
3
|
import {registry} from "@web/core/registry";
|
7
4
|
import {useDiscussSystray} from "@mail/utils/common/hooks";
|
5
|
+
import {useDropdownState} from "@web/core/dropdown/dropdown_hooks";
|
8
6
|
import {useService} from "@web/core/utils/hooks";
|
9
7
|
|
10
|
-
const systrayRegistry = registry.category("systray");
|
11
|
-
|
12
8
|
export class TierReviewMenu extends Component {
|
9
|
+
static components = {Dropdown};
|
10
|
+
static props = [];
|
11
|
+
static template = "base_tier_validation.TierReviewMenu";
|
12
|
+
|
13
13
|
setup() {
|
14
|
+
super.setup();
|
14
15
|
this.discussSystray = useDiscussSystray();
|
15
16
|
this.orm = useService("orm");
|
16
17
|
this.store = useState(useService("mail.store"));
|
17
18
|
this.action = useService("action");
|
19
|
+
this.dropdown = useDropdownState();
|
18
20
|
this.fetchSystrayReviewer();
|
19
21
|
}
|
22
|
+
|
20
23
|
async fetchSystrayReviewer() {
|
21
24
|
const groups = await this.orm.call("res.users", "review_user_count");
|
22
25
|
let total = 0;
|
@@ -26,9 +29,7 @@ export class TierReviewMenu extends Component {
|
|
26
29
|
this.store.tierReviewCounter = total;
|
27
30
|
this.store.tierReviewGroups = groups;
|
28
31
|
}
|
29
|
-
|
30
|
-
this.fetchSystrayReviewer();
|
31
|
-
}
|
32
|
+
|
32
33
|
availableViews() {
|
33
34
|
return [
|
34
35
|
[false, "kanban"],
|
@@ -37,11 +38,11 @@ export class TierReviewMenu extends Component {
|
|
37
38
|
[false, "activity"],
|
38
39
|
];
|
39
40
|
}
|
41
|
+
|
40
42
|
openReviewGroup(group) {
|
41
|
-
|
42
|
-
// Hack to close dropdown
|
43
|
+
this.dropdown.close();
|
43
44
|
const context = {};
|
44
|
-
|
45
|
+
const domain = [["can_review", "=", true]];
|
45
46
|
if (group.active_field) {
|
46
47
|
domain.push(["active", "in", [true, false]]);
|
47
48
|
}
|
@@ -64,10 +65,10 @@ export class TierReviewMenu extends Component {
|
|
64
65
|
}
|
65
66
|
}
|
66
67
|
|
67
|
-
|
68
|
-
TierReviewMenu
|
69
|
-
|
70
|
-
|
71
|
-
export const systrayItem = {Component: TierReviewMenu};
|
68
|
+
export const systrayItem = {
|
69
|
+
Component: TierReviewMenu,
|
70
|
+
};
|
72
71
|
|
73
|
-
|
72
|
+
registry
|
73
|
+
.category("systray")
|
74
|
+
.add("base_tier_validation.ReviewerMenu", systrayItem, {sequence: 99});
|