Add snapshot queries and mutations to server
This commit is contained in:
parent
19742f40e1
commit
ead7879787
|
|
@ -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'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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__()
|
||||
|
|
|
|||
|
|
@ -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 = """
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue