From e318ca5f40fa6fbe904de44eb5e8a3b1fe100053 Mon Sep 17 00:00:00 2001 From: Roy Le Date: Thu, 22 Feb 2024 11:48:40 +0700 Subject: [PATCH] [FIX] spreadsheet_oca: Cannot open spreadsheet when using undo / redo commands Steps: 1. Open spreadsheet 2. Press command Ctrl + Z 3. F5 (refresh browse) An error occurred: Operation undefined not found Because missing key `undoneRevisionId` / `redoneRevisionId` in revisions data Solutions: Save all spreadsheet message in commands field --- .../models/spreadsheet_abstract.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py index 1625389a..16110860 100644 --- a/spreadsheet_oca/models/spreadsheet_abstract.py +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -3,7 +3,7 @@ import json -from odoo import fields, models +from odoo import api, fields, models from odoo.exceptions import AccessError @@ -31,13 +31,11 @@ def get_spreadsheet_data(self): "name": self.name, "spreadsheet_raw": self.spreadsheet_raw, "revisions": [ - { - "type": revision.type, - "clientId": revision.client_id, - "nextRevisionId": revision.next_revision_id, - "serverRevisionId": revision.server_revision_id, - "commands": json.loads(revision.commands), - } + dict( + json.loads(revision.commands), + nextRevisionId=revision.next_revision_id, + serverRevisionId=revision.server_revision_id, + ) for revision in self.spreadsheet_revision_ids ], "mode": mode, @@ -64,12 +62,21 @@ def send_spreadsheet_message(self, message): "client_id": message.get("clientId"), "next_revision_id": message["nextRevisionId"], "server_revision_id": message["serverRevisionId"], - "commands": json.dumps(message.get("commands", [])), + "commands": json.dumps(self._build_spreadsheet_revision_commands_data(message)), } ) self.env["bus.bus"]._sendone(channel, "spreadsheet_oca", message) return True + @api.model + def _build_spreadsheet_revision_commands_data(self, message): + """Prepare spreadsheet revision commands data from the message""" + commands = dict(message) + commands.pop("serverRevisionId", None) + commands.pop("nextRevisionId", None) + commands.pop("clientId", None) + return commands + def write(self, vals): if "spreadsheet_raw" in vals: self.spreadsheet_revision_ids.unlink()