Commit 51aed102 authored by Laurent Wouters's avatar Laurent Wouters
Browse files

[server] Fixed issue with the adapters cache of a cloned EditedEntity

The adapters' cache of the entity within an EditedEntity used to be copied along
the entity itself during a cloning operation of the EditedEntity. This raises
an issue when the adapters' cache is not empty and contains cached values
linking to transaction-specific data (or the transaction itself). This prevents
the clone EditedEntity being used in a transaction outside the one that created

This change resets the adapters' cache of the new copy so that no cached value
remain. The new copy can then be used in a new transaction afterwards.
parent e08d8e171238
......@@ -155,5 +155,6 @@ class EditedEntity(dict):
thecopy = EditedEntity(copy(self.entity))
thecopy.entity.cw_attr_cache = copy(self.entity.cw_attr_cache)
thecopy.entity._cw_related_cache = {}
thecopy.entity._cw_adapters_cache = {}
thecopy.update(self, skipsec=False)
return thecopy
# copyright 2018 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
# contact --
# This file is part of CubicWeb.
# CubicWeb is free software: you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 2.1 of the License, or (at your option)
# any later version.
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
# You should have received a copy of the GNU Lesser General Public License along
# with CubicWeb. If not, see <>.
"""Tests for the entity edition"""
from cubicweb.devtools.testlib import CubicWebTC
from cubicweb.server.edition import EditedEntity
class EditedEntityTC(CubicWebTC):
Test cases for EditedEntity
def test_clone_cache_reset(self):
Tests that when an EditedEntity is cloned the caches are reset in the cloned instance
:return: Nothing
# Create an entity, create the EditedEntity and clone it
with self.admin_access.cnx() as cnx:
affaire = cnx.create_entity("Affaire", sujet=u"toto")
ee = EditedEntity(affaire)
the_clone = ee.clone()
# Check the attributes
with self.admin_access.cnx() as cnx:
# Assume a different connection set on the entity
self.assertNotEqual(the_clone.entity._cw, cnx)
# Use the new connection
the_clone.entity._cw = cnx
self.assertEqual("toto", the_clone.entity.sujet)
if __name__ == '__main__':
import unittest
......@@ -60,6 +60,7 @@ cubicweb/server/test/data-migractions/migratedapp/
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment