plone / plone/plone.api

Move returns wrong object when the id already exists

Open
#434 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

01 type: bug 13 prio: normal
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 with InvalidParameterError, because another item with id doc already exists in the target.
  • api.content.move(source=folder2.doc, target=folder3, safe_id=True): rename the item to copy_of_doc (the OFS package does that for us), and return this item.

Does that sound good?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.