[Erp5-report] r17074 - /erp5/trunk/products/ERP5Type/Core/Folder.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Oct 22 03:29:52 CEST 2007
Author: yo
Date: Mon Oct 22 03:29:52 2007
New Revision: 17074
URL: http://svn.erp5.org?rev=17074&view=rev
Log:
Avoid setting method ids starting with __.
Modified:
erp5/trunk/products/ERP5Type/Core/Folder.py
Modified: erp5/trunk/products/ERP5Type/Core/Folder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Core/Folder.py?rev=17074&r1=17073&r2=17074&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Core/Folder.py (original)
+++ erp5/trunk/products/ERP5Type/Core/Folder.py Mon Oct 22 03:29:52 2007
@@ -1486,50 +1486,33 @@
# We browse all used class from btree and hbtree and set not implemented
# class if one method defined on a class is not defined on other, thus if
# new method appears in one class if will raise in the other one
-class NotImplementedClass:
+class NotImplementedClass(object):
def __init__(self, method_id):
self.__name__ = method_id
def __call__(self, *args, **kw):
raise NotImplementedError, str(self.__name__)
-# Check method on HBTree but not on BTree
-hbtree_method_id_list = [x for x in HBTreeFolder2Base.__dict__
- if callable(getattr(HBTreeFolder2Base, x))]
-for method_id in hbtree_method_id_list:
- if getattr(BTreeFolder2Base, method_id, None) is None:
- setattr(BTreeFolder2Base, method_id, NotImplementedClass(method_id))
-
-hbtree_method_id_list = [x for x in HBTreeFolder2.__dict__
- if callable(getattr(HBTreeFolder2, x))]
-for method_id in hbtree_method_id_list:
- if getattr(BTreeFolder2, method_id, None) is None:
- setattr(BTreeFolder2, method_id, NotImplementedClass(method_id))
-
-hbtree_method_id_list = [x for x in CMFHBTreeFolder.__dict__
- if callable(getattr(CMFHBTreeFolder, x))]
-for method_id in hbtree_method_id_list:
- if getattr(CMFBTreeFolder, method_id, None) is None:
- setattr(CMFBTreeFolder, method_id, NotImplementedClass(method_id))
-
-# Check method on BTree but not on HBTree
-btree_method_id_list = [x for x in BTreeFolder2Base.__dict__
- if callable(getattr(BTreeFolder2Base, x))]
-for method_id in btree_method_id_list:
- if getattr(HBTreeFolder2Base, method_id, None) is None:
- setattr(HBTreeFolder2Base, method_id, NotImplementedClass(method_id))
-
-btree_method_id_list = [x for x in BTreeFolder2.__dict__
- if callable(getattr(BTreeFolder2, x))]
-for method_id in btree_method_id_list:
- if getattr(HBTreeFolder2, method_id, None) is None:
- setattr(HBTreeFolder2, method_id, NotImplementedClass(method_id))
-
-btree_method_id_list = [x for x in CMFBTreeFolder.__dict__
- if callable(getattr(CMFBTreeFolder, x))]
-for method_id in btree_method_id_list:
- if getattr(CMFHBTreeFolder, method_id, None) is None:
- setattr(CMFHBTreeFolder, method_id, NotImplementedClass(method_id))
+for source_klass, destination_klass in \
+ (
+ # Check method on HBTree but not on BTree
+ (HBTreeFolder2Base, BTreeFolder2Base),
+ (HBTreeFolder2, BTreeFolder2),
+ (CMFHBTreeFolder, CMFBTreeFolder),
+ # Check method on BTree but not on HBTree
+ (BTreeFolder2Base, HBTreeFolder2Base),
+ (BTreeFolder2, HBTreeFolder2),
+ (CMFBTreeFolder, CMFHBTreeFolder),
+ ):
+ # It is better to avoid methods starting with ___, because they have
+ # special meanings in Python or Zope, and lead to strange errors
+ # when set to an unexpected value. In fact, __implemented__ should not
+ # be set this way, otherwise Zope crashes.
+ method_id_list = [x for x in source_klass.__dict__.iterkeys()
+ if not x.startswith('__') and callable(getattr(source_klass, x))]
+ for method_id in method_id_list:
+ if not hasattr(destination_klass, method_id):
+ setattr(destination_klass, method_id, NotImplementedClass(method_id))
# Overwrite Zope setTitle()
Folder.setTitle = Base.setTitle
More information about the Erp5-report
mailing list