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.
Files changed (37) hide show
  1. odoo/addons/base_tier_validation/README.rst +14 -6
  2. odoo/addons/base_tier_validation/__manifest__.py +3 -7
  3. odoo/addons/base_tier_validation/data/cron_data.xml +0 -2
  4. odoo/addons/base_tier_validation/i18n/base_tier_validation.pot +7 -63
  5. odoo/addons/base_tier_validation/i18n/es.po +0 -2
  6. odoo/addons/base_tier_validation/i18n/es_MX.po +0 -2
  7. odoo/addons/base_tier_validation/i18n/fr.po +0 -2
  8. odoo/addons/base_tier_validation/i18n/it.po +0 -2
  9. odoo/addons/base_tier_validation/i18n/nl_NL.po +0 -2
  10. odoo/addons/base_tier_validation/i18n/sv.po +0 -2
  11. odoo/addons/base_tier_validation/i18n/tr.po +0 -2
  12. odoo/addons/base_tier_validation/i18n/zh_CN.po +0 -2
  13. odoo/addons/base_tier_validation/models/res_users.py +20 -14
  14. odoo/addons/base_tier_validation/models/tier_definition.py +14 -12
  15. odoo/addons/base_tier_validation/models/tier_review.py +15 -19
  16. odoo/addons/base_tier_validation/models/tier_validation.py +58 -57
  17. odoo/addons/base_tier_validation/models/tier_validation_exception.py +16 -14
  18. odoo/addons/base_tier_validation/readme/CONTRIBUTORS.md +2 -0
  19. odoo/addons/base_tier_validation/readme/CREDITS.md +1 -0
  20. odoo/addons/base_tier_validation/security/ir.model.access.csv +1 -1
  21. odoo/addons/base_tier_validation/security/tier_validation_security.xml +2 -6
  22. odoo/addons/base_tier_validation/static/description/index.html +14 -6
  23. odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js +18 -17
  24. odoo/addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml +46 -38
  25. odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js +17 -17
  26. odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss +1 -1
  27. odoo/addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml +25 -37
  28. odoo/addons/base_tier_validation/static/src/js/services/tier_review_service.esm.js +3 -4
  29. odoo/addons/base_tier_validation/templates/tier_validation_templates.xml +41 -50
  30. odoo/addons/base_tier_validation/tests/common.py +3 -6
  31. odoo/addons/base_tier_validation/views/tier_definition_view.xml +7 -11
  32. odoo/addons/base_tier_validation/views/tier_review_view.xml +3 -3
  33. odoo/addons/base_tier_validation/views/tier_validation_exception_view.xml +4 -5
  34. {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
  35. {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
  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
  37. {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 _, api, fields, models
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", readonly=True)
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", readonly=True)
36
- reviewer_id = fields.Many2one(related="definition_id.reviewer_id", readonly=True)
37
- reviewer_group_id = fields.Many2one(
38
- related="definition_id.reviewer_group_id", readonly=True
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", readonly=True)
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", readonly=True
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") % rec.reviewer_group_id.name
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(_("There are no res.users in the selected field"))
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.") % (delay)
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 %s" % 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 _, api, fields, models
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
- """<i class="fa fa-info-circle" /> %s"""
174
- % _("This %s needs to be validated")
175
- % self._get_to_validate_message_name()
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" /> %s""" % _(
180
- """Operation has been <b>validated</b>!"""
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" /> %s""" % _(
186
- """Operation has been <b>rejected</b>."""
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") % review.name or ""
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 _write(self, vals):
372
- if self._tier_validation_state_field_is_computed:
373
- self._tier_validation_check_state_on_write(vals)
374
- self._tier_validation_check_write_remove_reviews(vals)
375
- return super()._write(vals)
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
- "select %(field)s from %(table)s where id = %(res_id)s",
387
- {
388
- "field": AsIs(self._state_field),
389
- "table": AsIs(self._table),
390
- "res_id": self.id,
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
- "- %(not_allowed_fields)s\n\n"
444
- "Only those fields can be modified:\n- %(allowed_fields)s"
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
- "- %(not_allowed_fields)s\n\n"
471
- "Only those fields can be modified:\n- %(allowed_fields)s"
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)") % comment
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 _("A review was rejected by %(user)s. (%(comment)s)") % {
630
- "user": self.env.user.name,
631
- "comment": comment,
632
- }
633
- return _("A review was rejected by %s.") % (self.env.user.name)
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 _("A record to be reviewed has been created by %s.") % (
676
- self.env.user.name
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.") % (self.env.user.name)
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.") % (self.env.user.name)
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
- notifications.append([self.env.user.partner_id, channel, review_counter])
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 _, api, exceptions, fields, models
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
- for record in self:
68
- record.valid_model_field_ids = (
69
- self.env["ir.model.fields"]
70
- .sudo()
71
- .search(
72
- [
73
- ("model", "=", record.model_name),
74
- ("name", "not in", BASE_EXCEPTION_FIELDS),
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
  )
@@ -14,3 +14,5 @@
14
14
  - [XCG Consulting](https://xcg-consulting.fr):
15
15
  - Houzéfa Abbasbhay
16
16
  - Stefan Rijnhart \<<stefan@opener.amsterdam>\>
17
+ - Kevin Khao \<<kevinkhao@gmail.com>\>
18
+ - Do Anh Duy \<<duyda@trobz.com>\>
@@ -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,,1,0,0,0
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:3687572682629edee22a15d36a33201f134bc3f2147eaaaee4bd3bb567a0c8ab
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/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>
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&amp;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="#maintainers" id="toc-entry-23">Maintainers</a></li>
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:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
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 &lt;<a class="reference external" href="mailto:stefan&#64;opener.amsterdam">stefan&#64;opener.amsterdam</a>&gt;</li>
625
+ <li>Kevin Khao &lt;<a class="reference external" href="mailto:kevinkhao&#64;gmail.com">kevinkhao&#64;gmail.com</a>&gt;</li>
626
+ <li>Do Anh Duy &lt;<a class="reference external" href="mailto:duyda&#64;trobz.com">duyda&#64;trobz.com</a>&gt;</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-23">Maintainers</a></h2>
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/17.0/base_tier_validation">OCA/server-ux</a> project on GitHub.</p>
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>
@@ -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
- onBeforeOpen() {
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
- document.body.click();
42
- // Hack to close dropdown
43
+ this.dropdown.close();
43
44
  const context = {};
44
- var domain = [["can_review", "=", true]];
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
- TierReviewMenu.template = "base_tier_validation.TierReviewMenu";
68
- TierReviewMenu.components = {Dropdown, DropdownItem};
69
- TierReviewMenu.props = [];
70
-
71
- export const systrayItem = {Component: TierReviewMenu};
68
+ export const systrayItem = {
69
+ Component: TierReviewMenu,
70
+ };
72
71
 
73
- systrayRegistry.add("base_tier_validation.ReviewerMenu", systrayItem, {sequence: 99});
72
+ registry
73
+ .category("systray")
74
+ .add("base_tier_validation.ReviewerMenu", systrayItem, {sequence: 99});