Add update lastModuleCategory mutation

This commit is contained in:
Lorenz Padberg 2023-08-10 16:25:37 +02:00
parent f60f0d68da
commit 23bf51db52
6 changed files with 66 additions and 8 deletions

View File

@ -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",

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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):
""" """