diff --git a/connector_search_engine/models/se_index.py b/connector_search_engine/models/se_index.py index bb1c9aa3..69d58e3f 100644 --- a/connector_search_engine/models/se_index.py +++ b/connector_search_engine/models/se_index.py @@ -216,12 +216,14 @@ def _jobify_batch_sync(self, force_export: bool = False) -> None: description=description, identity_key=identity_exact ).batch_sync(force_export) - def _jobify_batch_recompute(self, force_export: bool = False) -> None: + def _jobify_batch_recompute( + self, force_export: bool = False, binding_ids: list | None = None + ) -> None: self.ensure_one() description = _("Prepare a batch recompute of index '%s'") % self.name self.with_delay( description=description, identity_key=identity_exact - ).batch_recompute(force_export) + ).batch_recompute(force_export, binding_ids=binding_ids) @api.model def generate_batch_sync_per_index(self, domain: list | None = None) -> None: @@ -256,11 +258,16 @@ def _get_domain_for_recomputing_binding(self, force_export: bool = False) -> lis states.append("recomputing") return [("index_id", "=", self.id), ("state", "in", states)] - def batch_recompute(self, force_export: bool = False) -> None: + def batch_recompute( + self, force_export: bool = False, binding_ids: list | None = None + ) -> None: """Recompute all the bindings of the index marked as to_recompute.""" self.ensure_one() - domain = self._get_domain_for_recomputing_binding(force_export) - bindings = self.env["se.binding"].search(domain) + if binding_ids: + bindings = self.env["se.binding"].browse(binding_ids) + else: + domain = self._get_domain_for_recomputing_binding(force_export) + bindings = self.env["se.binding"].search(domain) bindings_count = len(bindings) for batch in bindings._batch(self.batch_recomputing_size): description = _( diff --git a/connector_search_engine/tests/test_all.py b/connector_search_engine/tests/test_all.py index 473363e8..c8db5799 100644 --- a/connector_search_engine/tests/test_all.py +++ b/connector_search_engine/tests/test_all.py @@ -307,7 +307,7 @@ def test_life_cycle(self): trap.assert_enqueued_job( self.se_index.batch_recompute, args=(False,), - kwargs={}, + kwargs={"binding_ids": None}, properties=dict( identity_key=identity_exact, ), diff --git a/connector_search_engine/wizards/se_binding_state_updater.py b/connector_search_engine/wizards/se_binding_state_updater.py index fdee8c8c..a39d57dd 100644 --- a/connector_search_engine/wizards/se_binding_state_updater.py +++ b/connector_search_engine/wizards/se_binding_state_updater.py @@ -1,7 +1,9 @@ # Copyright 2023 ACSONE SA/NV +# Copyright 2024 Camptocamp SA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models +from odoo.tools import groupby class SeBindingStateUpdater(models.TransientModel): @@ -14,7 +16,12 @@ class SeBindingStateUpdater(models.TransientModel): selection=lambda self: self.env["se.binding"]._fields["state"].selection, required=True, ) + do_it_now = fields.Boolean(help="Don't wait for the cron to process these records") def doit(self): res_ids = self.env.context.get("active_ids") - self.env["se.binding"].browse(res_ids).write({"state": self.state}) + selected_bindings = self.env["se.binding"].browse(res_ids) + selected_bindings.write({"state": self.state}) + if self.do_it_now and self.state == "to_recompute": + for index, bindings in groupby(selected_bindings, key=lambda x: x.index_id): + index._jobify_batch_recompute(binding_ids=[x.id for x in bindings]) diff --git a/connector_search_engine/wizards/se_binding_state_updater.xml b/connector_search_engine/wizards/se_binding_state_updater.xml index 5e11eee1..9f103a03 100644 --- a/connector_search_engine/wizards/se_binding_state_updater.xml +++ b/connector_search_engine/wizards/se_binding_state_updater.xml @@ -11,7 +11,13 @@
- + + + +