Add update lastModuleCategory mutation
This commit is contained in:
parent
f60f0d68da
commit
23bf51db52
|
|
@ -28,7 +28,7 @@ from books.blocks import (
|
||||||
SurveyBlock,
|
SurveyBlock,
|
||||||
VideoBlock,
|
VideoBlock,
|
||||||
)
|
)
|
||||||
from books.models import Book, Chapter, ContentBlock, Module, TextBlock, Topic
|
from books.models import Book, Chapter, ContentBlock, Module, TextBlock, Topic, ModuleCategory, ModuleType
|
||||||
from core.factories import (
|
from core.factories import (
|
||||||
BasePageFactory,
|
BasePageFactory,
|
||||||
DummyImageFactory,
|
DummyImageFactory,
|
||||||
|
|
@ -201,6 +201,17 @@ class VideoBlockFactory(wagtail_factories.StructBlockFactory):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VideoBlock
|
model = VideoBlock
|
||||||
|
|
||||||
|
class ModuleCategoryFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = ModuleCategory
|
||||||
|
name = '1. Lehrjahr'
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleTypeFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = ModuleType
|
||||||
|
name = 'Lernfeld 1'
|
||||||
|
|
||||||
|
|
||||||
block_types = [
|
block_types = [
|
||||||
"text_block",
|
"text_block",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from books.schema.mutations.chapter import UpdateChapterVisibility
|
from books.schema.mutations.chapter import UpdateChapterVisibility
|
||||||
from books.schema.mutations.contentblock import DuplicateContentBlock, MutateContentBlock, AddContentBlock, \
|
from books.schema.mutations.contentblock import DuplicateContentBlock, MutateContentBlock, AddContentBlock, \
|
||||||
DeleteContentBlock
|
DeleteContentBlock
|
||||||
from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, SyncModuleVisibility
|
from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, SyncModuleVisibility, UpdateLastModuleCategory
|
||||||
from books.schema.mutations.snapshot import CreateSnapshot, ApplySnapshot, ShareSnapshot, UpdateSnapshot, DeleteSnapshot
|
from books.schema.mutations.snapshot import CreateSnapshot, ApplySnapshot, ShareSnapshot, UpdateSnapshot, DeleteSnapshot
|
||||||
from books.schema.mutations.topic import UpdateLastTopic
|
from books.schema.mutations.topic import UpdateLastTopic
|
||||||
|
|
||||||
|
|
@ -14,6 +14,7 @@ class BookMutations(object):
|
||||||
update_solution_visibility = UpdateSolutionVisibility.Field()
|
update_solution_visibility = UpdateSolutionVisibility.Field()
|
||||||
update_last_module = UpdateLastModule.Field()
|
update_last_module = UpdateLastModule.Field()
|
||||||
update_last_topic = UpdateLastTopic.Field()
|
update_last_topic = UpdateLastTopic.Field()
|
||||||
|
update_last_module_category = UpdateLastModuleCategory.Field()
|
||||||
update_chapter_visibility = UpdateChapterVisibility.Field()
|
update_chapter_visibility = UpdateChapterVisibility.Field()
|
||||||
sync_module_visibility = SyncModuleVisibility.Field()
|
sync_module_visibility = SyncModuleVisibility.Field()
|
||||||
create_snapshot = CreateSnapshot.Field()
|
create_snapshot = CreateSnapshot.Field()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import graphene
|
import graphene
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from graphene import relay
|
from graphene import relay
|
||||||
|
|
@ -7,7 +5,8 @@ from graphene import relay
|
||||||
from api.utils import get_object
|
from api.utils import get_object
|
||||||
from books.models import Module, RecentModule
|
from books.models import Module, RecentModule
|
||||||
from books.schema.nodes import ModuleNode
|
from books.schema.nodes import ModuleNode
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass, User
|
||||||
|
from users.schema import PrivateUserNode
|
||||||
|
|
||||||
|
|
||||||
class UpdateSolutionVisibility(relay.ClientIDMutation):
|
class UpdateSolutionVisibility(relay.ClientIDMutation):
|
||||||
|
|
@ -104,3 +103,18 @@ class SyncModuleVisibility(relay.ClientIDMutation):
|
||||||
module.sync_from_school_class(template, school_class)
|
module.sync_from_school_class(template, school_class)
|
||||||
|
|
||||||
return cls(success=True)
|
return cls(success=True)
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateLastModuleCategory(relay.ClientIDMutation):
|
||||||
|
class Input:
|
||||||
|
id = graphene.ID()
|
||||||
|
|
||||||
|
user = graphene.Field(PrivateUserNode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def mutate_and_get_payload(cls, root, info, **args):
|
||||||
|
user = info.context.user
|
||||||
|
id = args.get('id')
|
||||||
|
|
||||||
|
User.objects.filter(pk=user.id).update(last_module_category_id=id)
|
||||||
|
return cls(user=user)
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,9 @@ from graphql_relay import to_global_id
|
||||||
from api.schema import schema
|
from api.schema import schema
|
||||||
from api.utils import get_object
|
from api.utils import get_object
|
||||||
from books.models import ContentBlock, Chapter
|
from books.models import ContentBlock, Chapter
|
||||||
from books.factories import ModuleFactory
|
from books.factories import ModuleFactory, ModuleCategoryFactory
|
||||||
from core.factories import UserFactory
|
from core.factories import UserFactory
|
||||||
|
from users.models import User
|
||||||
|
|
||||||
|
|
||||||
class NewContentBlockMutationTest(TestCase):
|
class NewContentBlockMutationTest(TestCase):
|
||||||
|
|
@ -14,12 +15,12 @@ class NewContentBlockMutationTest(TestCase):
|
||||||
module = ModuleFactory()
|
module = ModuleFactory()
|
||||||
chapter = Chapter(title='Hello')
|
chapter = Chapter(title='Hello')
|
||||||
module.add_child(instance=chapter)
|
module.add_child(instance=chapter)
|
||||||
user = UserFactory(username='aschi')
|
self.user = UserFactory(username='aschi')
|
||||||
content_block = ContentBlock(title='bla', slug='bla')
|
content_block = ContentBlock(title='bla', slug='bla')
|
||||||
chapter.specific.add_child(instance=content_block)
|
chapter.specific.add_child(instance=content_block)
|
||||||
|
|
||||||
request = RequestFactory().get('/')
|
request = RequestFactory().get('/')
|
||||||
request.user = user
|
request.user = self.user
|
||||||
self.client = Client(schema=schema, context_value=request)
|
self.client = Client(schema=schema, context_value=request)
|
||||||
|
|
||||||
self.sibling_id = to_global_id('ContentBlockNode', content_block.pk)
|
self.sibling_id = to_global_id('ContentBlockNode', content_block.pk)
|
||||||
|
|
@ -120,3 +121,27 @@ class NewContentBlockMutationTest(TestCase):
|
||||||
content = new_content_block['contents'][0]
|
content = new_content_block['contents'][0]
|
||||||
self.assertEqual(content.get('type'), 'image_url_block')
|
self.assertEqual(content.get('type'), 'image_url_block')
|
||||||
self.assertEqual(content.get('value'), {'url': '/test.png'})
|
self.assertEqual(content.get('value'), {'url': '/test.png'})
|
||||||
|
|
||||||
|
def test_updateLastModuleCategory(self):
|
||||||
|
self.assertIsNone(self.user.last_module_category, None)
|
||||||
|
|
||||||
|
moduleCategory = ModuleCategoryFactory(name='1. Lehrjahr')
|
||||||
|
moduleCategory1 = ModuleCategoryFactory(name='2. Lehrjahr')
|
||||||
|
|
||||||
|
mutation = """
|
||||||
|
mutation ($input: UpdateLastModuleCategoryInput!){updateLastModuleCategory(input: $input) {
|
||||||
|
clientMutationId
|
||||||
|
user {
|
||||||
|
username
|
||||||
|
lastModuleCategory {
|
||||||
|
name
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
result = self.client.execute(mutation, variables={"input": {"id": moduleCategory1.id}})
|
||||||
|
self.assertIsNone(result.get('errors'))
|
||||||
|
|
||||||
|
updated_user = User.objects.get(id=self.user.id)
|
||||||
|
self.assertEqual(updated_user.last_module_category.name, moduleCategory1.name)
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ class User(AbstractUser):
|
||||||
|
|
||||||
last_module = models.ForeignKey('books.Module', related_name='+', on_delete=models.SET_NULL, null=True)
|
last_module = models.ForeignKey('books.Module', related_name='+', on_delete=models.SET_NULL, null=True)
|
||||||
recent_modules = models.ManyToManyField('books.Module', related_name='+', through='books.RecentModule')
|
recent_modules = models.ManyToManyField('books.Module', related_name='+', through='books.RecentModule')
|
||||||
|
last_module_category = models.ForeignKey('books.ModuleCategory', related_name='+', on_delete=models.SET_NULL, null=True)
|
||||||
last_topic = models.ForeignKey('books.Topic', related_name='+', on_delete=models.SET_NULL, null=True)
|
last_topic = models.ForeignKey('books.Topic', related_name='+', on_delete=models.SET_NULL, null=True)
|
||||||
avatar_url = models.CharField(max_length=254, blank=True, default='')
|
avatar_url = models.CharField(max_length=254, blank=True, default='')
|
||||||
email = models.EmailField(_('email address'), unique=True)
|
email = models.EmailField(_('email address'), unique=True)
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ from graphql_relay import to_global_id
|
||||||
from api.types import FailureNode
|
from api.types import FailureNode
|
||||||
|
|
||||||
from books.models import Module
|
from books.models import Module
|
||||||
|
from books.schema.nodes import ModuleCategoryNode
|
||||||
from books.schema.queries import ModuleNode
|
from books.schema.queries import ModuleNode
|
||||||
from users.models import SchoolClass, SchoolClassMember, Team, User
|
from users.models import SchoolClass, SchoolClassMember, Team, User
|
||||||
|
|
||||||
|
|
@ -113,6 +114,8 @@ class PrivateUserNode(DjangoObjectType):
|
||||||
is_teacher = graphene.Boolean()
|
is_teacher = graphene.Boolean()
|
||||||
old_classes = graphene.List(SchoolClassNode)
|
old_classes = graphene.List(SchoolClassNode)
|
||||||
school_classes = graphene.List(SchoolClassNode)
|
school_classes = graphene.List(SchoolClassNode)
|
||||||
|
last_module_category = graphene.Field(ModuleCategoryNode)
|
||||||
|
|
||||||
recent_modules = DjangoFilterConnectionField(
|
recent_modules = DjangoFilterConnectionField(
|
||||||
ModuleNode, filterset_class=RecentModuleFilter
|
ModuleNode, filterset_class=RecentModuleFilter
|
||||||
)
|
)
|
||||||
|
|
@ -160,6 +163,9 @@ class PrivateUserNode(DjangoObjectType):
|
||||||
def resolve_team(self, info, **kwargs):
|
def resolve_team(self, info, **kwargs):
|
||||||
return self.team
|
return self.team
|
||||||
|
|
||||||
|
def resolve_last_module_category(self, info, **kwargs):
|
||||||
|
return self.last_module_category
|
||||||
|
|
||||||
|
|
||||||
class ClassMemberNode(ObjectType):
|
class ClassMemberNode(ObjectType):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue