-
-
Notifications
You must be signed in to change notification settings - Fork 54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move returns wrong object when the id already exists #434
Comments
I just stumbled into this, as well. Not only does the The reason for this is that it does the move in two steps:
The problem is that the colliding object has already been renamed after step 1 by the Interestingly, unlike |
The bug still exists with latest I had a simple case, where custom reports had to be moved between report folders based on selected report type. Naturally choose Comment #434 (comment) explains the problem quite clear, regarding the wrong object return part. But additionally when the
Which ends up in a broken catalog brain resulting:
To fix the original issue Regarding the broken catalog brain, I had to copy move inner parts and tweak it: # manually uncatalog source object before move
brain = uuidToCatalogBrain(source.UID())
source.portal_catalog.uncatalog_object(brain.getPath())
copy_info = target.manage_pasteObjects(
source.aq_parent.manage_cutObjects(source.id)
)
# update source id from copy info
source_id = copy_info[0]['new_id'] Which still results on
But this one is at least not harmful, and there is no broken brain in portal catalog. |
Seen on Plone 4.3.18 with plone.api 1.8.4, but I don't see anything in later releases that would fix this.
As example, you have three folders and two documents with the same id:
You move both documents to the third folder:
api.content.move(source=folder1.doc, target=folder3)
api.content.move(source=folder2.doc, target=folder3)
The second call moves
folder2/doc
tofolder3/copy_of_doc
, but it returnsfolder3/doc
, which is the originalfolder1/doc
.In other words: the move works, but you get the wrong object back.
This is with the default
safe_id=False
, so I thought this would raise an error. The documentation says about this keyword argument: "When False, the given id will be enforced. If the id is conflicting with another object in the target container, raise a InvalidParameterError. When True, choose a new, non-conflicting id."The problem is that this
safe_id
parameter is only checked if you pass an explicitid
parameter. I think it should also be used without this id.So in the above case:
api.content.move(source=folder2.doc, target=folder3, safe_id=False)
: fail withInvalidParameterError
, because another item with iddoc
already exists in the target.api.content.move(source=folder2.doc, target=folder3, safe_id=True)
: rename the item tocopy_of_doc
(theOFS
package does that for us), and return this item.Does that sound good?
The text was updated successfully, but these errors were encountered: