[Erp5-report] r34712 jm - in /erp5/trunk/products: ERP5/bootstrap/erp5_core/SkinTemplateIte...
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Apr 21 18:38:44 CEST 2010
Author: jm
Date: Wed Apr 21 18:38:42 2010
New Revision: 34712
URL: http://svn.erp5.org?rev=34712&view=rev
Log:
When deleting a object, ignore related deleted objects, including their children
Modified:
erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_delete.xml
erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_viewDeleteDialog/listbox_related_object_list_quantity.xml
erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
erp5/trunk/products/ERP5/tests/testERP5Core.py
erp5/trunk/products/ERP5Type/Base.py
Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_delete.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_delete.xml?rev=34712&r1=34711&r2=34712&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_delete.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_delete.xml [utf8] Wed Apr 21 18:38:42 2010
@@ -70,25 +70,6 @@
\n
REQUEST=context.REQUEST\n
qs = \'\'\n
-ret_url = \'\'\n
-\n
-getRelatedPropertyList = portal.portal_categories.getRelatedPropertyList\n
-def Object_hasRelation(obj):\n
- # Check if there is some related objets.\n
- result = 0\n
- for o in obj.getIndexableChildValueList():\n
- for related_url in getRelatedPropertyList(o, property_name=\'relative_url\'):\n
- if related_url.startswith(obj.getRelativeUrl()):\n
- continue\n
- elif related_url.startswith(\'portal_simulation\'):\n
- continue\n
- elif related_url.startswith(\'portal_trash\'):\n
- continue\n
- else:\n
- result = 1\n
- break\n
- return result\n
-\n
ret_url = context.absolute_url() + \'/\' + form_id\n
if error:\n
message = Base_translateString("Sorry, your selection has changed.")\n
@@ -98,7 +79,7 @@
object_used = 0\n
\n
object_list = [x.getObject() for x in context.Folder_getDeleteObjectList(uid=uids)]\n
- object_used = sum([Object_hasRelation(x) for x in object_list])\n
+ object_used = sum([x.getRelationCountForDeletion() and 1 for x in object_list])\n
\n
if object_used > 0:\n
if object_used == 1:\n
@@ -253,8 +234,6 @@
<string>REQUEST</string>
<string>qs</string>
<string>ret_url</string>
- <string>getRelatedPropertyList</string>
- <string>Object_hasRelation</string>
<string>message</string>
<string>None</string>
<string>object_used</string>
Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_viewDeleteDialog/listbox_related_object_list_quantity.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_viewDeleteDialog/listbox_related_object_list_quantity.xml?rev=34712&r1=34711&r2=34712&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_viewDeleteDialog/listbox_related_object_list_quantity.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_viewDeleteDialog/listbox_related_object_list_quantity.xml [utf8] Wed Apr 21 18:38:42 2010
@@ -257,18 +257,15 @@
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
- <tuple>
- <string>Products.Formulator.TALESField</string>
- <string>TALESMethod</string>
- </tuple>
- <none/>
+ <global name="TALESMethod" module="Products.Formulator.TALESField"/>
+ <tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
- <value> <string>python: len(here.portal_categories.getRelatedValueList(cell))</string> </value>
+ <value> <string>cell/getRelationCountForDeletion</string> </value>
</item>
</dictionary>
</pickle>
Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision?rev=34712&r1=34711&r2=34712&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] Wed Apr 21 18:38:42 2010
@@ -1,1 +1,1 @@
-1567
+1568
Modified: erp5/trunk/products/ERP5/tests/testERP5Core.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5Core.py?rev=34712&r1=34711&r2=34712&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5Core.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testERP5Core.py [utf8] Wed Apr 21 18:38:42 2010
@@ -430,28 +430,37 @@
def test_Folder_delete_related_object(self):
# deletion is refused if there are related objects
- module = self.portal.newContent(portal_type='Folder', id='test_folder')
- document_1 = module.newContent(portal_type='Folder', id='1')
- document_2 = module.newContent(portal_type='Folder', id='2')
- self.portal.portal_categories.setCategoryMembership(
- context=document_1,
- base_category_list=('source',),
- category_list=document_2.getRelativeUrl())
- uid_list = [document_1.getUid(), document_2.getUid()]
- self.portal.portal_selections.setSelectionParamsFor(
+ organisation_module_len = len(self.portal.organisation_module)
+ person_module_len = len(self.portal.person_module)
+ organisation = self.portal.organisation_module.newContent()
+ person = self.portal.person_module.newContent(
+ default_career_subordination_value=organisation)
+ for obj in person, organisation:
+ obj.manage_addLocalRoles(self.manager_username, ['Assignor'])
+ transaction.commit()
+ self.assertEqual(0, organisation.getRelationCountForDeletion())
+ self.tic()
+ self.assertEqual(2, organisation.getRelationCountForDeletion())
+ self.assertEqual(0, person.getRelationCountForDeletion())
+ def delete(assert_deleted, obj):
+ uid_list = [obj.getUid()]
+ self.portal.portal_selections.setSelectionParamsFor(
'test_selection', dict(uids=uid_list))
- transaction.commit()
- self.tic()
- self.assertEquals([document_1],
- self.portal.portal_categories.getRelatedValueList(document_2))
- md5_string = md5.new(str(sorted([str(x) for x in uid_list]))).hexdigest()
- redirect = module.Folder_delete(selection_name='test_selection',
- uids=uid_list,
- md5_object_uid_list=md5_string)
- self.assert_('Sorry, 1 item is in use.' in redirect, redirect)
- transaction.savepoint(optimistic=True)
- self.assertEquals(len(module.objectValues()), 2)
-
+ md5_string = md5.new(str(sorted(str(x) for x in uid_list))).hexdigest()
+ redirect = obj.getParentValue().Folder_delete(uids=uid_list,
+ selection_name='test_selection', md5_object_uid_list=md5_string)
+ self.assertTrue(('Sorry, 1 item is in use.', 'Deleted.')[assert_deleted]
+ in redirect, redirect)
+ transaction.commit()
+ self.tic()
+ delete(0, organisation)
+ delete(1, person)
+ self.assertEqual(0, organisation.getRelationCountForDeletion())
+ delete(1, organisation)
+ self.assertEquals(organisation_module_len + 1,
+ len(self.portal.organisation_module))
+ self.assertEquals(person_module_len + 1,
+ len(self.portal.person_module))
def test_Folder_delete_non_accessible_object(self):
# deletion is refused if there are related objects, even if those related
Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=34712&r1=34711&r2=34712&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Base.py [utf8] Wed Apr 21 18:38:42 2010
@@ -2817,6 +2817,45 @@
else:
return False
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'isDeleted')
+ def isDeleted(self):
+ """Test if the context is in 'deleted' state"""
+ for wf in self.getPortalObject().portal_workflow.getWorkflowsFor(self):
+ state = wf._getWorkflowStateOf(self)
+ if state is not None and state.getId() == 'deleted':
+ return True
+ return False
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'getRelationCountForDeletion')
+ def getRelationCountForDeletion(self):
+ """Count number of related objects preventing deletion"""
+ portal = self.getPortalObject()
+ getRelatedValueList = portal.portal_categories.getRelatedValueList
+ ignore_list = [x.getPhysicalPath() for x in (
+ portal.portal_simulation,
+ portal.portal_trash,
+ self)]
+ related_list = [(related.getPhysicalPath(), related)
+ for o in self.getIndexableChildValueList()
+ for related in getRelatedValueList(o)]
+ related_list.sort()
+ ignored = None
+ related_count = 0
+ for related_path, related in related_list:
+ if ignored is None or related_path[:len(ignored)] != ignored:
+ for ignored in ignore_list:
+ if related_path[:len(ignored)] == ignored:
+ break
+ else:
+ if related.isDeleted():
+ ignored = related_path
+ else:
+ ignored = None
+ related_count += 1
+ return related_count
+
# Workflow Related Method
security.declarePublic('getWorkflowStateItemList')
def getWorkflowStateItemList(self):
More information about the Erp5-report
mailing list