From ad4c65129a6cbbbb188965ae9f345698f752dce0 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 14 Feb 2024 12:19:55 +0100 Subject: [PATCH] Only add/remove model from Document once --- panel/io/model.py | 14 ++++++++++---- panel/template/base.py | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/panel/io/model.py b/panel/io/model.py index 5fbb5d1757..7c8292c6c6 100644 --- a/panel/io/model.py +++ b/panel/io/model.py @@ -7,7 +7,7 @@ from contextlib import contextmanager from typing import ( - TYPE_CHECKING, Any, Iterable, List, Optional, + TYPE_CHECKING, Any, Iterable, List, Optional, Set, ) import numpy as np @@ -92,27 +92,33 @@ def diff( msg.add_buffer(buffer) return msg -def remove_root(obj: Model, replace: Document | None = None) -> None: +def remove_root(obj: Model, replace: Document | None = None, skip: Set[Model] | None = None) -> None: """ Removes the document from any previously displayed bokeh object """ + models = set() for model in obj.select({'type': Model}): + if skip and model in skip: + continue prev_doc = model.document model._document = None if prev_doc: prev_doc.remove_root(model) if replace: model._document = replace + models.add(model) + return models -def add_to_doc(obj: Model, doc: Document, hold: bool = False): +def add_to_doc(obj: Model, doc: Document, hold: bool = False, skip: Set[Model] | None = None): """ Adds a model to the supplied Document removing it from any existing Documents. """ # Add new root - remove_root(obj) + models = remove_root(obj, skip=skip) doc.add_root(obj) if doc.callbacks.hold_value is None and hold: doc.hold() + return models def patch_cds_msg(model, msg): """ diff --git a/panel/template/base.py b/panel/template/base.py index ea8f1c6a24..f58842caae 100644 --- a/panel/template/base.py +++ b/panel/template/base.py @@ -211,6 +211,7 @@ def _init_doc( # Add all render items to the document objs, models = [], [] sizing_modes = {} + tracked_models = set() for name, (obj, tags) in self._render_items.items(): # Render root without pre-processing @@ -241,7 +242,7 @@ def _init_doc( objs.append(obj) models.append(model) - add_to_doc(model, document, hold=bool(comm)) + tracked_models |= add_to_doc(model, document, hold=bool(comm), skip=tracked_models) document.on_session_destroyed(obj._server_destroy) # type: ignore # Here we ensure that the preprocessor is run across all roots