clear vreg's parent_classes cache to fix etype cache / auto-reloading bug
EtypeRegistry.parent_classes()'s is cached. When the registry is
reloaded, if the cache is not cleared, we might get the old list
of parent classes and that leads to strange bugs.
Typical scenario :
1/ start application in debug mode
2/ go to add/Bookmark -> everything's fine
3/ change the source
4/ reload add/Bookmark -> 'creation' not selectable because :
a/ cw detects a change in the source and reloads vreg
b/ cw tries to select 'creation' view for 'Bookmark'
- 'creation' view uses specified_etype_implements('Any')
- cw compares Bookmark.__bases__[0] (i.e. new version of
AnyEntity) with the old version of AnyEntity cached in
the vreg. They don't match => view is not applicable.
--- a/cwvreg.py Wed Jan 20 11:31:38 2010 +0100
+++ b/cwvreg.py Wed Jan 20 13:03:08 2010 +0100
@@ -115,6 +115,7 @@
super(ETypeRegistry, self).initialization_completed()
# clear etype cache if you don't want to run into deep weirdness
clear_cache(self, 'etype_class')
+ clear_cache(self, 'parent_classes')
def register(self, obj, **kwargs):
oid = kwargs.get('oid') or class_regid(obj)