Add snapshot queries and mutations to server

This commit is contained in:
Ramon Wenger 2021-04-28 00:46:37 +02:00
parent 19742f40e1
commit ead7879787
10 changed files with 72 additions and 35 deletions

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.20 on 2021-04-27 18:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('books', '0025_auto_20210414_2116'),
]
operations = [
migrations.AlterField(
model_name='snapshot',
name='module',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='snapshots', to='books.Module'),
),
]

View File

@ -60,7 +60,8 @@ class SnapshotManager(models.Manager):
class Snapshot(models.Model):
module = models.ForeignKey(
'books.Module',
on_delete=models.PROTECT
on_delete=models.PROTECT,
related_name='snapshots'
)
chapters = models.ManyToManyField(
'books.Chapter',
@ -71,3 +72,6 @@ class Snapshot(models.Model):
related_name='hidden_for_snapshots'
)
objects = SnapshotManager()
def __str__(self):
return f'Snapshot {self.id}'

View File

@ -1,5 +1,6 @@
import graphene
from graphene import relay
from graphene_django.filter import DjangoFilterConnectionField
class ChapterInterface(graphene.Interface):
class ChapterInterface(relay.Node):
content_blocks = DjangoFilterConnectionField('books.schema.nodes.ContentBlockNode')

View File

@ -1,7 +1,8 @@
import graphene
from graphene import relay
class ModuleInterface(graphene.Interface):
class ModuleInterface(relay.Node):
pk = graphene.Int()
def resolve_pk(self, info, **kwargs):

View File

@ -10,7 +10,7 @@ from users.models import SchoolClass
class CreateSnapshot(relay.ClientIDMutation):
class Input:
module = graphene.ID(required=True)
module = graphene.String(required=True)
selected_class = graphene.ID(required=True)
snapshot = graphene.Field(SnapshotNode)
@ -18,11 +18,11 @@ class CreateSnapshot(relay.ClientIDMutation):
@classmethod
def mutate_and_get_payload(cls, root, info, **args):
module_id = args.get('module')
module = get_object(Module, module_id)
module_slug = args.get('module')
module = Module.objects.get(slug=module_slug)
user = info.context.user
# todo: check user
raise NotImplementedError('Permissions')
# raise NotImplementedError('Permissions')
selected_class_id = args.get('selected_class')
selected_class = get_object(SchoolClass, selected_class_id)
snapshot = Snapshot.objects.create_snapshot(module, selected_class, user)

View File

@ -22,14 +22,14 @@ class ChapterNode(DjangoObjectType):
filter_fields = [
'slug', 'title',
]
interfaces = (relay.Node, ChapterInterface,)
interfaces = (ChapterInterface,)
def resolve_content_blocks(self, info, **kwargs):
user = info.context.user
school_classes = user.school_classes.values_list('pk', flat=True)
by_parent = ContentBlock.get_by_parent(self) \
.filter(contentblocksnapshot__isnull=True) # exclude snapshots
.filter(contentblocksnapshot__isnull=True) # exclude snapshot
# .prefetch_related('visible_for') \
# .prefetch_related('hidden_for')
@ -63,7 +63,7 @@ class SnapshotChapterNode(DjangoObjectType):
filter_fields = [
'id',
]
interfaces = (relay.Node, ChapterInterface,)
interfaces = (ChapterInterface,)
@staticmethod
def resolve_title_hidden(parent, info):

View File

@ -16,7 +16,7 @@ from surveys.schema import AnswerNode
class ModuleNode(DjangoObjectType):
chapters = DjangoFilterConnectionField(ChapterNode)
topic = graphene.Field('books.schema.queries.TopicNode')
topic = graphene.Field('books.schema.nodes.TopicNode')
hero_image = graphene.String()
solutions_enabled = graphene.Boolean()
bookmark = graphene.Field(ModuleBookmarkNode)
@ -24,6 +24,7 @@ class ModuleNode(DjangoObjectType):
my_answers = DjangoFilterConnectionField(AnswerNode)
my_content_bookmarks = DjangoFilterConnectionField(ContentBlockBookmarkNode)
my_chapter_bookmarks = DjangoFilterConnectionField(ChapterBookmarkNode)
snapshots = graphene.List('books.schema.nodes.SnapshotNode')
class Meta:
model = Module
@ -34,7 +35,7 @@ class ModuleNode(DjangoObjectType):
'slug': ['exact', 'icontains', 'in'],
'title': ['exact', 'icontains', 'in'],
}
interfaces = (relay.Node, ModuleInterface, )
interfaces = (ModuleInterface, )
def resolve_hero_image(self, info, **kwargs):
if self.hero_image:
@ -82,10 +83,13 @@ class ModuleNode(DjangoObjectType):
chapters = Chapter.objects.live().descendant_of(self)
return ChapterBookmark.objects.filter(chapter__in=chapters, user=user)
def resolve_objective_groups(self, root, **kwargs):
return self.objective_groups.all() \
@staticmethod
def resolve_objective_groups(parent, info, **kwargs):
return parent.objective_groups.all() \
.prefetch_related('hidden_for')
def resolve_snapshots(self, info, **kwargs):
return self.snapshots.all()
class RecentModuleNode(DjangoObjectType):
class Meta:

View File

@ -1,3 +1,4 @@
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
@ -7,6 +8,8 @@ from books.models.snapshot import Snapshot
class SnapshotNode(DjangoObjectType):
title = graphene.String()
class Meta:
model = Snapshot
interfaces = (relay.Node,)
@ -17,3 +20,7 @@ class SnapshotNode(DjangoObjectType):
def resolve_chapters(self, info, **kwargs):
# return Chapter.objects.filter(chapter_snapshots__snapshot=self)
return self.chapters.through.objects.all()
@staticmethod
def resolve_title(parent, info, **kwargs):
return parent.__str__()

View File

@ -48,31 +48,31 @@ query ModulesQuery($slug: String!) {
CREATE_SNAPSHOT_MUTATION = """
mutation CreateSnapshot($input: CreateSnapshotInput!) {
createSnapshot(input: $input) {
snapshot {
createSnapshot(input: $input) {
snapshot {
id
chapters {
edges {
node {
id
chapters {
edges {
node {
id
descriptionHidden
titleHidden
title
description
contentBlocks {
edges {
node {
id
title
}
}
}
}
descriptionHidden
titleHidden
title
description
contentBlocks {
edges {
node {
id
title
}
}
}
}
}
success
}
}
success
}
}
"""
APPLY_SNAPSHOT_MUTATION = """

View File

@ -360,7 +360,8 @@ RAVEN_DSN_JS = os.environ.get('RAVEN_DSN_JS', '')
GOOGLE_TAG_MANAGER_CONTAINER_ID = os.environ.get('GOOGLE_TAG_MANAGER_CONTAINER_ID')
GRAPHENE = {
'SCHEMA': 'api.schema.schema'
'SCHEMA': 'api.schema.schema',
'SCHEMA_OUTPUT': 'schema.graphql'
}
# if DEBUG: