Move returns wrong object when the id already exists
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 101
- Forks
- 62
- Avg merge
- 15h 15m
- Merged PRs (30d)
- 1
Description
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:
- folder1/doc
- folder2/doc
- folder3
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 to folder3/copy_of_doc, but it returns folder3/doc, which is the original folder1/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 explicit id 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 iddocalready exists in the target.api.content.move(source=folder2.doc, target=folder3, safe_id=True): rename the item tocopy_of_doc(theOFSpackage does that for us), and return this item.
Does that sound good?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at the api.content.move entry point and reproduce the two moves described in the issue on Plone 4.3.18 with plone.api 1.8.4. Done means safe_id=False rejects the conflicting implicit id with InvalidParameterError, while safe_id=True creates copy_of_doc and returns that moved object.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100