diff --git a/server/books/factories.py b/server/books/factories.py index d3e8260e..db270cdc 100644 --- a/server/books/factories.py +++ b/server/books/factories.py @@ -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", diff --git a/server/books/schema/mutations/__init__.py b/server/books/schema/mutations/__init__.py index b0587618..0dcc09c7 100644 --- a/server/books/schema/mutations/__init__.py +++ b/server/books/schema/mutations/__init__.py @@ -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() diff --git a/server/books/schema/mutations/module.py b/server/books/schema/mutations/module.py index 477b7efb..0a2a11e0 100644 --- a/server/books/schema/mutations/module.py +++ b/server/books/schema/mutations/module.py @@ -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) diff --git a/server/books/tests/test_module_mutations.py b/server/books/tests/test_module_mutations.py index dfd5b07d..68faf7aa 100644 --- a/server/books/tests/test_module_mutations.py +++ b/server/books/tests/test_module_mutations.py @@ -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) diff --git a/server/users/models.py b/server/users/models.py index adac3fb7..77208ca1 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -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) diff --git a/server/users/schema/types.py b/server/users/schema/types.py index d2510659..d06b33b3 100644 --- a/server/users/schema/types.py +++ b/server/users/schema/types.py @@ -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): """