Commit 356da9ca by Don Mitchell

Merge pull request #4315 from edx/bug/delete_draft

Deleting a child of a unit should convert the unit to draft
parents cda3d296 1f71a67a
...@@ -409,6 +409,14 @@ class DraftModuleStore(MongoModuleStore): ...@@ -409,6 +409,14 @@ class DraftModuleStore(MongoModuleStore):
# remove subtree from its parent # remove subtree from its parent
parent_locations = self._get_raw_parent_locations(location, key_revision=parent_revision) parent_locations = self._get_raw_parent_locations(location, key_revision=parent_revision)
# if no parents, then we're trying to delete something which we should convert to draft
if not parent_locations:
# find the published parent, convert it to draft, then manipulate the draft
parent_locations = self._get_raw_parent_locations(location, key_revision=MongoRevisionKey.published)
# parent_locations will still be empty if the object was an orphan
if parent_locations:
draft_parent = self.convert_to_draft(parent_locations[0], user_id)
parent_locations = [draft_parent.location]
# there could be 2 parents if # there could be 2 parents if
# Case 1: the draft item moved from one parent to another # Case 1: the draft item moved from one parent to another
# Case 2: revision==ModuleStoreEnum.RevisionOption.all and the single parent has 2 versions: draft and published # Case 2: revision==ModuleStoreEnum.RevisionOption.all and the single parent has 2 versions: draft and published
...@@ -561,7 +569,7 @@ class DraftModuleStore(MongoModuleStore): ...@@ -561,7 +569,7 @@ class DraftModuleStore(MongoModuleStore):
if published_parent == item_location: if published_parent == item_location:
# Case 1: child was deleted in draft parent item # Case 1: child was deleted in draft parent item
# So, delete published version of the child now that we're publishing the draft parent # So, delete published version of the child now that we're publishing the draft parent
self._delete_subtree(item_location, [as_published]) self._delete_subtree(orig_child, [as_published])
else: else:
# Case 2: child was moved to a new draft parent item # Case 2: child was moved to a new draft parent item
# So, do not delete the child. It will be published when the new parent is published. # So, do not delete the child. It will be published when the new parent is published.
......
...@@ -63,8 +63,8 @@ class TestPublish(SplitWMongoCourseBoostrapper): ...@@ -63,8 +63,8 @@ class TestPublish(SplitWMongoCourseBoostrapper):
To reproduce a bug (STUD-811) publish a vertical, convert to draft, delete a child, move a child, publish. To reproduce a bug (STUD-811) publish a vertical, convert to draft, delete a child, move a child, publish.
See if deleted and moved children still is connected or exists in db (bug was disconnected but existed) See if deleted and moved children still is connected or exists in db (bug was disconnected but existed)
""" """
location = self.old_course_key.make_usage_key('vertical', name='Vert1') vert_location = self.old_course_key.make_usage_key('vertical', name='Vert1')
item = self.draft_mongo.get_item(location, 2) item = self.draft_mongo.get_item(vert_location, 2)
# Vert1 has 3 children; so, publishes 4 nodes which may mean 4 inserts & 1 bulk remove # Vert1 has 3 children; so, publishes 4 nodes which may mean 4 inserts & 1 bulk remove
# 25-June-2014 find calls are 19. Probably due to inheritance recomputation? # 25-June-2014 find calls are 19. Probably due to inheritance recomputation?
# 02-July-2014 send calls are 7. 5 from above, plus 2 for updating subtree edit info for Chapter1 and course # 02-July-2014 send calls are 7. 5 from above, plus 2 for updating subtree edit info for Chapter1 and course
...@@ -73,24 +73,16 @@ class TestPublish(SplitWMongoCourseBoostrapper): ...@@ -73,24 +73,16 @@ class TestPublish(SplitWMongoCourseBoostrapper):
self.draft_mongo.publish(item.location, self.userid) self.draft_mongo.publish(item.location, self.userid)
# verify status # verify status
item = self.draft_mongo.get_item(location, 0) item = self.draft_mongo.get_item(vert_location, 0)
self.assertFalse(getattr(item, 'is_draft', False), "Item was published. Draft should not exist") self.assertFalse(getattr(item, 'is_draft', False), "Item was published. Draft should not exist")
# however, children are still draft, but I'm not sure that's by design # however, children are still draft, but I'm not sure that's by design
# convert back to draft
self.draft_mongo.convert_to_draft(location, self.userid)
# both draft and published should exist
draft_vert = self.draft_mongo.get_item(location, 0)
self.assertTrue(getattr(draft_vert, 'is_draft', False), "Item was converted to draft but doesn't say so")
item = self.old_mongo.get_item(location, 0)
self.assertFalse(getattr(item, 'is_draft', False), "Published item doesn't say so")
# delete the draft version of the discussion # delete the draft version of the discussion
location = self.old_course_key.make_usage_key('discussion', name='Discussion1') location = self.old_course_key.make_usage_key('discussion', name='Discussion1')
self.draft_mongo.delete_item(location, self.userid) self.draft_mongo.delete_item(location, self.userid)
draft_vert = self.draft_mongo.get_item(draft_vert.location, 0) draft_vert = self.draft_mongo.get_item(vert_location, 0)
# remove pointer from draft vertical (still there b/c not refetching vert) self.assertTrue(getattr(draft_vert, 'is_draft', False), "Deletion didn't convert parent to draft")
self.assertNotIn(location, draft_vert.children) self.assertNotIn(location, draft_vert.children)
# move the other child # move the other child
other_child_loc = self.old_course_key.make_usage_key('html', name='Html2') other_child_loc = self.old_course_key.make_usage_key('html', name='Html2')
...@@ -100,8 +92,8 @@ class TestPublish(SplitWMongoCourseBoostrapper): ...@@ -100,8 +92,8 @@ class TestPublish(SplitWMongoCourseBoostrapper):
self.draft_mongo.update_item(draft_vert, self.userid) self.draft_mongo.update_item(draft_vert, self.userid)
self.draft_mongo.update_item(other_vert, self.userid) self.draft_mongo.update_item(other_vert, self.userid)
# publish # publish
self.draft_mongo.publish(draft_vert.location, self.userid) self.draft_mongo.publish(vert_location, self.userid)
item = self.old_mongo.get_item(draft_vert.location, 0) item = self.old_mongo.get_item(vert_location, 0)
self.assertNotIn(location, item.children) self.assertNotIn(location, item.children)
self.assertIsNone(self.draft_mongo.get_parent_location(location)) self.assertIsNone(self.draft_mongo.get_parent_location(location))
with self.assertRaises(ItemNotFoundError): with self.assertRaises(ItemNotFoundError):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment