Add mutation and unit test for duplication
This commit is contained in:
parent
bfb6a6e7a0
commit
6be6ab8092
|
|
@ -0,0 +1,27 @@
|
|||
from wagtail.core.models import PageManager
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from core.logger import get_logger
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from books.models import ContentBlock
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
class ContentBlockManager(PageManager):
|
||||
def duplicate(self, content_block: "ContentBlock", user):
|
||||
try:
|
||||
new_content_block = self.model(
|
||||
user_created=True,
|
||||
owner=user,
|
||||
contents=content_block.contents,
|
||||
title=content_block.title,
|
||||
type=content_block.type,
|
||||
)
|
||||
content_block.add_sibling(instance=new_content_block, pos='right')
|
||||
revision = new_content_block.save_revision()
|
||||
revision.publish()
|
||||
new_content_block.save()
|
||||
return new_content_block
|
||||
except Exception as e:
|
||||
logger.warn(e)
|
||||
|
|
@ -6,6 +6,7 @@ from wagtail.core.blocks import StreamBlock
|
|||
from wagtail.core.fields import StreamField
|
||||
from wagtail.images.blocks import ImageChooserBlock
|
||||
|
||||
from books.managers import ContentBlockManager
|
||||
from core.wagtail_utils import get_default_settings
|
||||
from books.blocks import CMSDocumentBlock, SolutionBlock, TextBlock, BasicKnowledgeBlock, LinkBlock, VideoBlock, \
|
||||
DocumentBlock, \
|
||||
|
|
@ -90,6 +91,8 @@ class ContentBlock(StrictHierarchyPage):
|
|||
parent_page_types = ['books.Chapter']
|
||||
subpage_types = []
|
||||
|
||||
objects = ContentBlockManager()
|
||||
|
||||
@property
|
||||
def module(self):
|
||||
return self.get_parent().get_parent().specific
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from books.schema.mutations.chapter import UpdateChapterVisibility
|
||||
from books.schema.mutations.contentblock import MutateContentBlock, AddContentBlock, DeleteContentBlock
|
||||
from books.schema.mutations.contentblock import DuplicateContentBlock, MutateContentBlock, AddContentBlock, \
|
||||
DeleteContentBlock
|
||||
from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, SyncModuleVisibility
|
||||
from books.schema.mutations.snapshot import CreateSnapshot, ApplySnapshot, ShareSnapshot, UpdateSnapshot, DeleteSnapshot
|
||||
from books.schema.mutations.topic import UpdateLastTopic
|
||||
|
|
@ -9,6 +10,7 @@ class BookMutations(object):
|
|||
mutate_content_block = MutateContentBlock.Field()
|
||||
add_content_block = AddContentBlock.Field()
|
||||
delete_content_block = DeleteContentBlock.Field()
|
||||
duplicate_content_block = DuplicateContentBlock.Field()
|
||||
update_solution_visibility = UpdateSolutionVisibility.Field()
|
||||
update_last_module = UpdateLastModule.Field()
|
||||
update_last_topic = UpdateLastTopic.Field()
|
||||
|
|
|
|||
|
|
@ -143,3 +143,22 @@ class DeleteContentBlock(relay.ClientIDMutation):
|
|||
return cls(success=True)
|
||||
except ContentBlock.DoesNotExist:
|
||||
return cls(success=False, errors='Content block not found')
|
||||
|
||||
|
||||
class DuplicateContentBlock(relay.ClientIDMutation):
|
||||
class Input:
|
||||
id = graphene.ID(required=True)
|
||||
|
||||
content_block = graphene.Field(ContentBlockNode)
|
||||
|
||||
@classmethod
|
||||
def mutate_and_get_payload(cls, root, info, **kwargs):
|
||||
id = from_global_id(kwargs.get('id'))[1]
|
||||
user = info.context.user
|
||||
|
||||
try:
|
||||
content_block = ContentBlock.objects.get(pk=id)
|
||||
new_content_block = ContentBlock.objects.duplicate(content_block=content_block, user=user)
|
||||
return cls(content_block=new_content_block)
|
||||
except ContentBlock.DoesNotExist:
|
||||
return cls(content_block=None)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,76 @@
|
|||
from graphql_relay import to_global_id
|
||||
|
||||
from books.factories import ContentBlockFactory, ModuleFactory, ChapterFactory
|
||||
from books.models import ContentBlock
|
||||
from core.tests.base_test import SkillboxTestCase
|
||||
|
||||
DUPLICATE_CONTENT_BLOCK_MUTATION = """
|
||||
mutation DuplicateContentBlockMutation($input: DuplicateContentBlockInput!) {
|
||||
duplicateContentBlock(input: $input) {
|
||||
contentBlock {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
CONTENT_BLOCK_QUERY = """
|
||||
query ContentBlockQuery($slug: String!) {
|
||||
module(slug: $slug) {
|
||||
chapters {
|
||||
id
|
||||
contentBlocks {
|
||||
id
|
||||
title
|
||||
type
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
class DuplicateContentBlockTestCase(SkillboxTestCase):
|
||||
def setUp(self) -> None:
|
||||
self.createDefault()
|
||||
#
|
||||
self.slug = 'module'
|
||||
self.module = ModuleFactory(slug=self.slug)
|
||||
self.chapter = ChapterFactory(parent=self.module)
|
||||
self.content_block = ContentBlock(
|
||||
type=ContentBlock.NORMAL,
|
||||
title='Title',
|
||||
)
|
||||
self.chapter.add_child(instance=self.content_block)
|
||||
|
||||
def test_duplicate_content_block(self):
|
||||
result = self.get_client().execute(CONTENT_BLOCK_QUERY, variables={
|
||||
'slug': self.slug
|
||||
})
|
||||
self.assertIsNone(result.errors)
|
||||
module = result.data.get('module')
|
||||
chapter = module.get('chapters')[0]
|
||||
content_blocks = chapter.get('contentBlocks')
|
||||
self.assertEqual(len(content_blocks), 1)
|
||||
self.assertEqual(ContentBlock.objects.count(), 1)
|
||||
|
||||
result = self.get_client().execute(DUPLICATE_CONTENT_BLOCK_MUTATION, variables={
|
||||
'input': {
|
||||
"id": to_global_id('ContentBlockNode', self.content_block.id)
|
||||
}
|
||||
})
|
||||
self.assertIsNone(result.errors)
|
||||
duplicate_content_block = result.data.get('duplicateContentBlock')
|
||||
content_block = duplicate_content_block.get('contentBlock')
|
||||
# self.assertEqual(content_block['title'], 'Title')
|
||||
self.assertIsNotNone(content_block['id'])
|
||||
|
||||
result = self.get_client().execute(CONTENT_BLOCK_QUERY, variables={
|
||||
'slug': self.slug
|
||||
})
|
||||
self.assertIsNone(result.errors)
|
||||
module = result.data.get('module')
|
||||
chapter = module.get('chapters')[0]
|
||||
content_blocks = chapter.get('contentBlocks')
|
||||
self.assertEqual(ContentBlock.objects.count(), 2)
|
||||
self.assertEqual(len(content_blocks), 2)
|
||||
Loading…
Reference in New Issue