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,
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 (
BasePageFactory,
DummyImageFactory,
@ -201,6 +201,17 @@ class VideoBlockFactory(wagtail_factories.StructBlockFactory):
class Meta:
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 = [
"text_block",

View File

@ -1,7 +1,7 @@
from books.schema.mutations.chapter import UpdateChapterVisibility
from books.schema.mutations.contentblock import DuplicateContentBlock, MutateContentBlock, AddContentBlock, \
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.topic import UpdateLastTopic
@ -14,6 +14,7 @@ class BookMutations(object):
update_solution_visibility = UpdateSolutionVisibility.Field()
update_last_module = UpdateLastModule.Field()
update_last_topic = UpdateLastTopic.Field()
update_last_module_category = UpdateLastModuleCategory.Field()
update_chapter_visibility = UpdateChapterVisibility.Field()
sync_module_visibility = SyncModuleVisibility.Field()
create_snapshot = CreateSnapshot.Field()

View File

@ -1,5 +1,3 @@
from datetime import datetime
import graphene
from django.utils import timezone
from graphene import relay
@ -7,7 +5,8 @@ from graphene import relay
from api.utils import get_object
from books.models import Module, RecentModule
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):
@ -104,3 +103,18 @@ class SyncModuleVisibility(relay.ClientIDMutation):
module.sync_from_school_class(template, school_class)
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.utils import get_object
from books.models import ContentBlock, Chapter
from books.factories import ModuleFactory
from books.factories import ModuleFactory, ModuleCategoryFactory
from core.factories import UserFactory
from users.models import User
class NewContentBlockMutationTest(TestCase):
@ -14,12 +15,12 @@ class NewContentBlockMutationTest(TestCase):
module = ModuleFactory()
chapter = Chapter(title='Hello')
module.add_child(instance=chapter)
user = UserFactory(username='aschi')
self.user = UserFactory(username='aschi')
content_block = ContentBlock(title='bla', slug='bla')
chapter.specific.add_child(instance=content_block)
request = RequestFactory().get('/')
request.user = user
request.user = self.user
self.client = Client(schema=schema, context_value=request)
self.sibling_id = to_global_id('ContentBlockNode', content_block.pk)
@ -120,3 +121,27 @@ class NewContentBlockMutationTest(TestCase):
content = new_content_block['contents'][0]
self.assertEqual(content.get('type'), 'image_url_block')
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)
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)
avatar_url = models.CharField(max_length=254, blank=True, default='')
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 books.models import Module
from books.schema.nodes import ModuleCategoryNode
from books.schema.queries import ModuleNode
from users.models import SchoolClass, SchoolClassMember, Team, User
@ -113,6 +114,8 @@ class PrivateUserNode(DjangoObjectType):
is_teacher = graphene.Boolean()
old_classes = graphene.List(SchoolClassNode)
school_classes = graphene.List(SchoolClassNode)
last_module_category = graphene.Field(ModuleCategoryNode)
recent_modules = DjangoFilterConnectionField(
ModuleNode, filterset_class=RecentModuleFilter
)
@ -160,6 +163,9 @@ class PrivateUserNode(DjangoObjectType):
def resolve_team(self, info, **kwargs):
return self.team
def resolve_last_module_category(self, info, **kwargs):
return self.last_module_category
class ClassMemberNode(ObjectType):
"""