From d273d711c1daa37f661eda69bb1797e04555d88b Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 5 Oct 2018 11:25:05 +0200 Subject: [PATCH] Renamed UserGroup to SchoolClass step 2 --- .../src/graphql/gql/fragments/roomParts.gql | 4 +-- .../graphql/gql/fragments/userGroupParts.gql | 2 +- .../src/graphql/gql/fragments/userParts.gql | 7 +++++ client/src/graphql/gql/meQuery.gql | 1 + client/src/graphql/gql/userGroupsQuery.gql | 10 ------- server/assignments/migrations/0001_initial.py | 2 +- ...005_0856.py => 0002_auto_20181005_0924.py} | 6 ++--- server/books/migrations/0001_initial.py | 4 +-- .../0002_contentblock_hidden_for.py | 2 +- server/books/schema/mutations/contentblock.py | 1 + server/core/management/commands/dummy_data.py | 2 +- .../core/management/commands/dummy_rooms.py | 2 +- server/filteredbook/admin.py | 9 ------- .../filteredbook/migrations/0001_initial.py | 27 ------------------- .../migrations/0002_visibility_user_group.py | 22 --------------- server/filteredbook/migrations/__init__.py | 0 server/filteredbook/models.py | 14 ---------- server/filteredbook/schema.py | 26 ++---------------- server/objectives/migrations/0001_initial.py | 2 +- ...005_0856.py => 0002_auto_20181005_0924.py} | 4 +-- server/rooms/admin.py | 4 +-- server/rooms/factories.py | 5 ++-- server/rooms/inputs.py | 4 +-- server/rooms/migrations/0001_initial.py | 2 +- ...005_0856.py => 0002_auto_20181005_0924.py} | 6 ++--- server/rooms/models.py | 4 +-- server/rooms/mutations.py | 3 ++- server/rooms/serializers.py | 2 +- server/user/admin.py | 2 +- server/user/factories.py | 2 +- server/user/inputs.py | 2 +- server/user/migrations/0001_initial.py | 2 +- server/user/schema.py | 6 ++--- server/user/services.py | 4 +-- 34 files changed, 49 insertions(+), 146 deletions(-) delete mode 100644 client/src/graphql/gql/userGroupsQuery.gql rename server/assignments/migrations/{0002_auto_20181005_0856.py => 0002_auto_20181005_0924.py} (95%) delete mode 100644 server/filteredbook/admin.py delete mode 100644 server/filteredbook/migrations/0001_initial.py delete mode 100644 server/filteredbook/migrations/0002_visibility_user_group.py delete mode 100644 server/filteredbook/migrations/__init__.py rename server/objectives/migrations/{0002_auto_20181005_0856.py => 0002_auto_20181005_0924.py} (96%) rename server/rooms/migrations/{0002_auto_20181005_0856.py => 0002_auto_20181005_0924.py} (92%) diff --git a/client/src/graphql/gql/fragments/roomParts.gql b/client/src/graphql/gql/fragments/roomParts.gql index e6c6df0a..5b0b502c 100644 --- a/client/src/graphql/gql/fragments/roomParts.gql +++ b/client/src/graphql/gql/fragments/roomParts.gql @@ -1,4 +1,4 @@ -#import "./userGroupParts.gql" +#import "./SchoolClassParts.gql" fragment RoomParts on RoomNode { id slug @@ -7,6 +7,6 @@ fragment RoomParts on RoomNode { appearance description userGroup { - ...UserGroupParts + ...SchoolClassParts } } diff --git a/client/src/graphql/gql/fragments/userGroupParts.gql b/client/src/graphql/gql/fragments/userGroupParts.gql index 059628e5..0476f76b 100644 --- a/client/src/graphql/gql/fragments/userGroupParts.gql +++ b/client/src/graphql/gql/fragments/userGroupParts.gql @@ -1,4 +1,4 @@ -fragment UserGroupParts on UserGroupNode { +fragment SchoolClassParts on SchoolClassNode { id name year diff --git a/client/src/graphql/gql/fragments/userParts.gql b/client/src/graphql/gql/fragments/userParts.gql index 4c5324f4..eef6c974 100644 --- a/client/src/graphql/gql/fragments/userParts.gql +++ b/client/src/graphql/gql/fragments/userParts.gql @@ -6,4 +6,11 @@ fragment UserParts on UserNode { firstName lastName avatar + schoolclassSet { + edges { + node { + ...SchoolClassParts + } + } + } } diff --git a/client/src/graphql/gql/meQuery.gql b/client/src/graphql/gql/meQuery.gql index 735e6b89..0ae0d912 100644 --- a/client/src/graphql/gql/meQuery.gql +++ b/client/src/graphql/gql/meQuery.gql @@ -1,3 +1,4 @@ +#import "./fragments/SchoolClassParts.gql" #import "./fragments/userParts.gql" query MeQuery { me { diff --git a/client/src/graphql/gql/userGroupsQuery.gql b/client/src/graphql/gql/userGroupsQuery.gql deleted file mode 100644 index 5841ea39..00000000 --- a/client/src/graphql/gql/userGroupsQuery.gql +++ /dev/null @@ -1,10 +0,0 @@ -#import "./fragments/userGroupParts.gql" -query UserGroupsQuery { - userGroups { - edges { - node { - ...UserGroupParts - } - } - } -} diff --git a/server/assignments/migrations/0001_initial.py b/server/assignments/migrations/0001_initial.py index d262c167..1bfe640b 100644 --- a/server/assignments/migrations/0001_initial.py +++ b/server/assignments/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.db import migrations, models import django.db.models.deletion diff --git a/server/assignments/migrations/0002_auto_20181005_0856.py b/server/assignments/migrations/0002_auto_20181005_0924.py similarity index 95% rename from server/assignments/migrations/0002_auto_20181005_0856.py rename to server/assignments/migrations/0002_auto_20181005_0924.py index b99d6672..e6c5cc4d 100644 --- a/server/assignments/migrations/0002_auto_20181005_0856.py +++ b/server/assignments/migrations/0002_auto_20181005_0924.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('assignments', '0001_initial'), - ('books', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('books', '0001_initial'), + ('assignments', '0001_initial'), ] operations = [ diff --git a/server/books/migrations/0001_initial.py b/server/books/migrations/0001_initial.py index 1f5b556e..37ceb583 100644 --- a/server/books/migrations/0001_initial.py +++ b/server/books/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.db import migrations, models import django.db.models.deletion @@ -12,8 +12,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('wagtailimages', '0021_image_file_hash'), ('wagtailcore', '0040_page_draft_title'), + ('wagtailimages', '0021_image_file_hash'), ] operations = [ diff --git a/server/books/migrations/0002_contentblock_hidden_for.py b/server/books/migrations/0002_contentblock_hidden_for.py index 8df5f138..b3902d67 100644 --- a/server/books/migrations/0002_contentblock_hidden_for.py +++ b/server/books/migrations/0002_contentblock_hidden_for.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.db import migrations, models diff --git a/server/books/schema/mutations/contentblock.py b/server/books/schema/mutations/contentblock.py index 9f5d486d..a1a2bd49 100644 --- a/server/books/schema/mutations/contentblock.py +++ b/server/books/schema/mutations/contentblock.py @@ -32,6 +32,7 @@ class MutateContentBlock(relay.ClientIDMutation): content_block = get_object(ContentBlock, id_param) + # FIXME: usergroup if visibility_list is not None: for v in visibility_list: user_group = get_object(SchoolClass, v.user_group_id) diff --git a/server/core/management/commands/dummy_data.py b/server/core/management/commands/dummy_data.py index 7ec5aba5..00c77dd8 100644 --- a/server/core/management/commands/dummy_data.py +++ b/server/core/management/commands/dummy_data.py @@ -743,5 +743,5 @@ class Command(BaseCommand): # ContentBlockFactory.create(parent=chapter, **self.filter_data(content_block_data, 'contents')) ContentBlockFactory.create(parent=chapter, module=module, **content_block_data) - # now create all usergroups and rooms + # now create all and rooms management.call_command('dummy_rooms', verbosity=0) diff --git a/server/core/management/commands/dummy_rooms.py b/server/core/management/commands/dummy_rooms.py index 68ae4fe7..05e9d65b 100644 --- a/server/core/management/commands/dummy_rooms.py +++ b/server/core/management/commands/dummy_rooms.py @@ -9,7 +9,7 @@ from wagtail.core.models import Site from rooms.factories import RoomFactory, RoomEntryFactory from rooms.models import Room -from user.factories import UserGroupFactory +from user.factories import SchoolClassFactory data = [ { diff --git a/server/filteredbook/admin.py b/server/filteredbook/admin.py deleted file mode 100644 index 953cbb3e..00000000 --- a/server/filteredbook/admin.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.contrib import admin - -from filteredbook.models import Visibility - - -@admin.register(Visibility) -class VisibilityAdmin(admin.ModelAdmin): - list_display = ('user_group', 'content_block') - list_filter = ('user_group', 'content_block') diff --git a/server/filteredbook/migrations/0001_initial.py b/server/filteredbook/migrations/0001_initial.py deleted file mode 100644 index 02f94f56..00000000 --- a/server/filteredbook/migrations/0001_initial.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('books', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Visibility', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_block', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='visible_to', to='books.ContentBlock')), - ], - options={ - 'verbose_name': 'Visibility', - 'verbose_name_plural': 'Visibilities', - }, - ), - ] diff --git a/server/filteredbook/migrations/0002_visibility_user_group.py b/server/filteredbook/migrations/0002_visibility_user_group.py deleted file mode 100644 index b84a821b..00000000 --- a/server/filteredbook/migrations/0002_visibility_user_group.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('user', '0001_initial'), - ('filteredbook', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='visibility', - name='user_group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='user.SchoolClass'), - ), - ] diff --git a/server/filteredbook/migrations/__init__.py b/server/filteredbook/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/server/filteredbook/models.py b/server/filteredbook/models.py index fe3428bd..139597f9 100644 --- a/server/filteredbook/models.py +++ b/server/filteredbook/models.py @@ -1,16 +1,2 @@ -from django.db import models - -from books.models import ContentBlock -from user.models import SchoolClass -class Visibility(models.Model): - class Meta: - verbose_name = 'Visibility' - verbose_name_plural = 'Visibilities' - - user_group = models.ForeignKey(SchoolClass, blank=False, null=False, on_delete=models.CASCADE) - content_block = models.ForeignKey(ContentBlock, blank=False, null=False, on_delete=models.CASCADE, related_name='visible_to') - - def __str__(self): - return 'Visibility {}-{}'.format(self.user_group, self.content_block) diff --git a/server/filteredbook/schema.py b/server/filteredbook/schema.py index 7304734e..54f1be12 100644 --- a/server/filteredbook/schema.py +++ b/server/filteredbook/schema.py @@ -1,7 +1,4 @@ -from itertools import chain - import graphene -from django.db.models import Q from graphene import relay from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField @@ -12,7 +9,7 @@ from books.schema.queries import BookNode, TopicNode, ModuleNode, ContentBlockNo class FilteredChapterNode(DjangoObjectType): - content_blocks = DjangoFilterConnectionField(ContentBlockNode, user_groups=graphene.List(graphene.String)) + content_blocks = DjangoFilterConnectionField(ContentBlockNode) class Meta: model = Chapter @@ -25,26 +22,7 @@ class FilteredChapterNode(DjangoObjectType): interfaces = (relay.Node,) def resolve_content_blocks(self, *args, **kwargs): - user_groups = kwargs.get('user_groups') - if user_groups: - reduced = [] - for user_group in user_groups: - content_blocks = ContentBlock.get_by_parent(self).exclude( - Q(visible_to__user_group__name=user_group) - ) - reduced = chain(reduced, content_blocks) - - filtered = list(set(reduced)) - return filtered - else: - return ContentBlock.get_by_parent(self) - - -class VisibilityNode(DjangoObjectType): - class Meta: - model = Chapter - filter_fields = ['user_group', 'content_block'] - interfaces = (relay.Node,) + return ContentBlock.get_by_parent(self) class BookQuery(object): diff --git a/server/objectives/migrations/0001_initial.py b/server/objectives/migrations/0001_initial.py index 83fdaff3..e89acc5a 100644 --- a/server/objectives/migrations/0001_initial.py +++ b/server/objectives/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.db import migrations, models import django.db.models.deletion diff --git a/server/objectives/migrations/0002_auto_20181005_0856.py b/server/objectives/migrations/0002_auto_20181005_0924.py similarity index 96% rename from server/objectives/migrations/0002_auto_20181005_0856.py rename to server/objectives/migrations/0002_auto_20181005_0924.py index ab4b07bd..d593bfc1 100644 --- a/server/objectives/migrations/0002_auto_20181005_0856.py +++ b/server/objectives/migrations/0002_auto_20181005_0924.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('objectives', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('books', '0002_contentblock_hidden_for'), + ('objectives', '0001_initial'), ] operations = [ diff --git a/server/rooms/admin.py b/server/rooms/admin.py index b00d4b4e..094630e9 100644 --- a/server/rooms/admin.py +++ b/server/rooms/admin.py @@ -5,8 +5,8 @@ from rooms.models import Room, RoomEntry @admin.register(Room) class RoomAdmin(admin.ModelAdmin): - list_display = ('id', 'slug', 'title', 'user_group', 'appearance') - list_filter = ('user_group', 'appearance') + list_display = ('id', 'slug', 'title', 'school_class', 'appearance') + list_filter = ('school_class', 'appearance') @admin.register(RoomEntry) diff --git a/server/rooms/factories.py b/server/rooms/factories.py index e3057a76..2461af7e 100644 --- a/server/rooms/factories.py +++ b/server/rooms/factories.py @@ -6,8 +6,7 @@ from django.contrib.auth import get_user_model from factory import CREATE_STRATEGY from wagtail.core.rich_text import RichText -from books.blocks import ImageUrlBlock -from books.factories import TextBlockFactory, BasicKnowledgeBlockFactory, ImageUrlBlockFactory, LinkBlockFactory +from books.factories import TextBlockFactory, ImageUrlBlockFactory, LinkBlockFactory from core.factories import fake, fake_paragraph from rooms.models import Room, RoomEntry from user.models import SchoolClass @@ -18,7 +17,7 @@ class RoomFactory(factory.django.DjangoModelFactory): model = Room title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) - user_group = factory.Iterator(SchoolClass.objects.all()) + school_class = factory.Iterator(SchoolClass.objects.all()) appearance = factory.LazyAttribute(lambda x: random.choice(['red', 'green', 'brown'])) diff --git a/server/rooms/inputs.py b/server/rooms/inputs.py index c7f22159..c788e8f9 100644 --- a/server/rooms/inputs.py +++ b/server/rooms/inputs.py @@ -2,13 +2,13 @@ import graphene from graphene import InputObjectType from books.schema.inputs import ContentElementInput -from user.inputs import UserGroupInput +from user.inputs import SchoolClassInput class RoomInput(InputObjectType): title = graphene.String() description = graphene.String() - user_group = UserGroupInput() + school_class = SchoolClassInput() appearance = graphene.String() diff --git a/server/rooms/migrations/0001_initial.py b/server/rooms/migrations/0001_initial.py index a5b1b49b..6709d0d1 100644 --- a/server/rooms/migrations/0001_initial.py +++ b/server/rooms/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.db import migrations, models import django_extensions.db.fields diff --git a/server/rooms/migrations/0002_auto_20181005_0856.py b/server/rooms/migrations/0002_auto_20181005_0924.py similarity index 92% rename from server/rooms/migrations/0002_auto_20181005_0856.py rename to server/rooms/migrations/0002_auto_20181005_0924.py index 9f66a6b0..033307c4 100644 --- a/server/rooms/migrations/0002_auto_20181005_0856.py +++ b/server/rooms/migrations/0002_auto_20181005_0924.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('rooms', '0001_initial'), ('user', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -28,7 +28,7 @@ class Migration(migrations.Migration): ), migrations.AddField( model_name='room', - name='user_group', + name='school_class', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='user.SchoolClass'), ), ] diff --git a/server/rooms/models.py b/server/rooms/models.py index f1ec338d..a8597d88 100644 --- a/server/rooms/models.py +++ b/server/rooms/models.py @@ -13,11 +13,11 @@ class Room(TitleSlugDescriptionModel): verbose_name = 'Raum' verbose_name_plural = 'Räume' - user_group = models.ForeignKey(SchoolClass, blank=False, null=False, on_delete=models.CASCADE) + school_class = models.ForeignKey(SchoolClass, blank=False, null=False, on_delete=models.CASCADE) appearance = models.CharField(blank=True, null=False, max_length=255) def __str__(self): - return 'Room {}-{}-{}'.format(self.id, self.title, self.user_group) + return 'Room {}-{}-{}'.format(self.id, self.title, self.school_class) class RoomEntry(TitleSlugDescriptionModel): diff --git a/server/rooms/mutations.py b/server/rooms/mutations.py index eb24da88..51fc5827 100644 --- a/server/rooms/mutations.py +++ b/server/rooms/mutations.py @@ -3,7 +3,7 @@ from graphene import relay from api.utils import get_object from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument -from rooms.models import Room, RoomEntry +from rooms.models import Room from rooms.schema import RoomNode, RoomEntryNode from rooms.serializers import RoomSerializer, RoomEntrySerializer from user.models import SchoolClass @@ -15,6 +15,7 @@ class MutateRoom(relay.ClientIDMutation): @classmethod def mutate_and_get_payload(cls, *args, **kwargs): + # FIXME room_data = kwargs.get('room') user_group = get_object(SchoolClass, room_data.get('user_group').get('id')) room_data['user_group'] = user_group.id diff --git a/server/rooms/serializers.py b/server/rooms/serializers.py index 54afc550..98e28b65 100644 --- a/server/rooms/serializers.py +++ b/server/rooms/serializers.py @@ -14,7 +14,7 @@ class ContentsSerializer(serializers.Field): class RoomSerializer(serializers.ModelSerializer): class Meta: model = Room - fields = ('id', 'title', 'description', 'slug', 'user_group', 'appearance',) + fields = ('id', 'title', 'description', 'slug', 'school_class', 'appearance',) read_only_fields = ('id', 'slug',) diff --git a/server/user/admin.py b/server/user/admin.py index 2968cdf4..5d9de542 100644 --- a/server/user/admin.py +++ b/server/user/admin.py @@ -7,7 +7,7 @@ admin.site.register(User, UserAdmin) @admin.register(SchoolClass) -class UserGroupAdmin(admin.ModelAdmin): +class SchoolClassAdmin(admin.ModelAdmin): list_display = ('id', 'name', 'year') list_filter = ('year',) diff --git a/server/user/factories.py b/server/user/factories.py index ea881dba..9fd55220 100644 --- a/server/user/factories.py +++ b/server/user/factories.py @@ -12,7 +12,7 @@ class_suffix = ['A', 'B', 'C', 'D', 'E'] # TODO: refactor to have non-overlapping user groups? -class UserGroupFactory(factory.django.DjangoModelFactory): +class SchoolClassFactory(factory.django.DjangoModelFactory): class Meta: model = SchoolClass diff --git a/server/user/inputs.py b/server/user/inputs.py index e29c224e..2440f36c 100644 --- a/server/user/inputs.py +++ b/server/user/inputs.py @@ -2,7 +2,7 @@ import graphene from graphene import InputObjectType -class UserGroupInput(InputObjectType): +class SchoolClassInput(InputObjectType): id = graphene.ID() name = graphene.String() year = graphene.Int() diff --git a/server/user/migrations/0001_initial.py b/server/user/migrations/0001_initial.py index 28d42db2..abeb0ef8 100644 --- a/server/user/migrations/0001_initial.py +++ b/server/user/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-05 08:56 +# Generated by Django 2.0.6 on 2018-10-05 09:24 from django.conf import settings import django.contrib.auth.models diff --git a/server/user/schema.py b/server/user/schema.py index ebb97d5a..7777c7ca 100644 --- a/server/user/schema.py +++ b/server/user/schema.py @@ -14,7 +14,7 @@ class UserNode(DjangoObjectType): class Meta: model = User filter_fields = ['username', 'email'] - only_fields = ['username', 'email', 'first_name', 'last_name', 'usergroup_set', ] + only_fields = ['username', 'email', 'first_name', 'last_name', 'schoolclass_set', ] interfaces = (relay.Node,) def resolve_pk(self, info, **kwargs): @@ -27,7 +27,7 @@ class UserNode(DjangoObjectType): return 'data:image/jpeg;base64,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' -class UserGroupNode(DjangoObjectType): +class SchoolClassNode(DjangoObjectType): pk = graphene.Int() class Meta: @@ -42,8 +42,6 @@ class UserGroupNode(DjangoObjectType): class UsersQuery(object): me = graphene.Field(UserNode) all_users = DjangoFilterConnectionField(UserNode) - user_group = relay.Node.Field(UserGroupNode) - user_groups = DjangoFilterConnectionField(UserGroupNode) def resolve_me(self, info, **kwargs): return info.context.user diff --git a/server/user/services.py b/server/user/services.py index bc5403b9..e2f308cb 100644 --- a/server/user/services.py +++ b/server/user/services.py @@ -1,5 +1,5 @@ from core.factories import UserFactory -from user.factories import UserGroupFactory +from user.factories import SchoolClassFactory from user.models import School, SchoolRole, UserSchoolRole, DEFAULT_SCHOOL_ID @@ -14,4 +14,4 @@ def create_school_with_users(school_name): for i in range(1, 7): student = UserFactory(username='student{}'.format(i)) UserSchoolRole.objects.create(user=student, school_role=student_role) - UserGroupFactory(users=[teacher, student], school=school) + SchoolClassFactory(users=[teacher, student], school=school)