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):
|
class Snapshot(models.Model):
|
||||||
module = models.ForeignKey(
|
module = models.ForeignKey(
|
||||||
'books.Module',
|
'books.Module',
|
||||||
on_delete=models.PROTECT
|
on_delete=models.PROTECT,
|
||||||
|
related_name='snapshots'
|
||||||
)
|
)
|
||||||
chapters = models.ManyToManyField(
|
chapters = models.ManyToManyField(
|
||||||
'books.Chapter',
|
'books.Chapter',
|
||||||
|
|
@ -71,3 +72,6 @@ class Snapshot(models.Model):
|
||||||
related_name='hidden_for_snapshots'
|
related_name='hidden_for_snapshots'
|
||||||
)
|
)
|
||||||
objects = SnapshotManager()
|
objects = SnapshotManager()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'Snapshot {self.id}'
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import graphene
|
import graphene
|
||||||
|
from graphene import relay
|
||||||
from graphene_django.filter import DjangoFilterConnectionField
|
from graphene_django.filter import DjangoFilterConnectionField
|
||||||
|
|
||||||
class ChapterInterface(graphene.Interface):
|
class ChapterInterface(relay.Node):
|
||||||
content_blocks = DjangoFilterConnectionField('books.schema.nodes.ContentBlockNode')
|
content_blocks = DjangoFilterConnectionField('books.schema.nodes.ContentBlockNode')
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import graphene
|
import graphene
|
||||||
|
from graphene import relay
|
||||||
|
|
||||||
|
|
||||||
class ModuleInterface(graphene.Interface):
|
class ModuleInterface(relay.Node):
|
||||||
pk = graphene.Int()
|
pk = graphene.Int()
|
||||||
|
|
||||||
def resolve_pk(self, info, **kwargs):
|
def resolve_pk(self, info, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ from users.models import SchoolClass
|
||||||
|
|
||||||
class CreateSnapshot(relay.ClientIDMutation):
|
class CreateSnapshot(relay.ClientIDMutation):
|
||||||
class Input:
|
class Input:
|
||||||
module = graphene.ID(required=True)
|
module = graphene.String(required=True)
|
||||||
selected_class = graphene.ID(required=True)
|
selected_class = graphene.ID(required=True)
|
||||||
|
|
||||||
snapshot = graphene.Field(SnapshotNode)
|
snapshot = graphene.Field(SnapshotNode)
|
||||||
|
|
@ -18,11 +18,11 @@ class CreateSnapshot(relay.ClientIDMutation):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def mutate_and_get_payload(cls, root, info, **args):
|
def mutate_and_get_payload(cls, root, info, **args):
|
||||||
module_id = args.get('module')
|
module_slug = args.get('module')
|
||||||
module = get_object(Module, module_id)
|
module = Module.objects.get(slug=module_slug)
|
||||||
user = info.context.user
|
user = info.context.user
|
||||||
# todo: check user
|
# todo: check user
|
||||||
raise NotImplementedError('Permissions')
|
# raise NotImplementedError('Permissions')
|
||||||
selected_class_id = args.get('selected_class')
|
selected_class_id = args.get('selected_class')
|
||||||
selected_class = get_object(SchoolClass, selected_class_id)
|
selected_class = get_object(SchoolClass, selected_class_id)
|
||||||
snapshot = Snapshot.objects.create_snapshot(module, selected_class, user)
|
snapshot = Snapshot.objects.create_snapshot(module, selected_class, user)
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,14 @@ class ChapterNode(DjangoObjectType):
|
||||||
filter_fields = [
|
filter_fields = [
|
||||||
'slug', 'title',
|
'slug', 'title',
|
||||||
]
|
]
|
||||||
interfaces = (relay.Node, ChapterInterface,)
|
interfaces = (ChapterInterface,)
|
||||||
|
|
||||||
def resolve_content_blocks(self, info, **kwargs):
|
def resolve_content_blocks(self, info, **kwargs):
|
||||||
user = info.context.user
|
user = info.context.user
|
||||||
school_classes = user.school_classes.values_list('pk', flat=True)
|
school_classes = user.school_classes.values_list('pk', flat=True)
|
||||||
|
|
||||||
by_parent = ContentBlock.get_by_parent(self) \
|
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('visible_for') \
|
||||||
# .prefetch_related('hidden_for')
|
# .prefetch_related('hidden_for')
|
||||||
|
|
||||||
|
|
@ -63,7 +63,7 @@ class SnapshotChapterNode(DjangoObjectType):
|
||||||
filter_fields = [
|
filter_fields = [
|
||||||
'id',
|
'id',
|
||||||
]
|
]
|
||||||
interfaces = (relay.Node, ChapterInterface,)
|
interfaces = (ChapterInterface,)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve_title_hidden(parent, info):
|
def resolve_title_hidden(parent, info):
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ from surveys.schema import AnswerNode
|
||||||
|
|
||||||
class ModuleNode(DjangoObjectType):
|
class ModuleNode(DjangoObjectType):
|
||||||
chapters = DjangoFilterConnectionField(ChapterNode)
|
chapters = DjangoFilterConnectionField(ChapterNode)
|
||||||
topic = graphene.Field('books.schema.queries.TopicNode')
|
topic = graphene.Field('books.schema.nodes.TopicNode')
|
||||||
hero_image = graphene.String()
|
hero_image = graphene.String()
|
||||||
solutions_enabled = graphene.Boolean()
|
solutions_enabled = graphene.Boolean()
|
||||||
bookmark = graphene.Field(ModuleBookmarkNode)
|
bookmark = graphene.Field(ModuleBookmarkNode)
|
||||||
|
|
@ -24,6 +24,7 @@ class ModuleNode(DjangoObjectType):
|
||||||
my_answers = DjangoFilterConnectionField(AnswerNode)
|
my_answers = DjangoFilterConnectionField(AnswerNode)
|
||||||
my_content_bookmarks = DjangoFilterConnectionField(ContentBlockBookmarkNode)
|
my_content_bookmarks = DjangoFilterConnectionField(ContentBlockBookmarkNode)
|
||||||
my_chapter_bookmarks = DjangoFilterConnectionField(ChapterBookmarkNode)
|
my_chapter_bookmarks = DjangoFilterConnectionField(ChapterBookmarkNode)
|
||||||
|
snapshots = graphene.List('books.schema.nodes.SnapshotNode')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Module
|
model = Module
|
||||||
|
|
@ -34,7 +35,7 @@ class ModuleNode(DjangoObjectType):
|
||||||
'slug': ['exact', 'icontains', 'in'],
|
'slug': ['exact', 'icontains', 'in'],
|
||||||
'title': ['exact', 'icontains', 'in'],
|
'title': ['exact', 'icontains', 'in'],
|
||||||
}
|
}
|
||||||
interfaces = (relay.Node, ModuleInterface, )
|
interfaces = (ModuleInterface, )
|
||||||
|
|
||||||
def resolve_hero_image(self, info, **kwargs):
|
def resolve_hero_image(self, info, **kwargs):
|
||||||
if self.hero_image:
|
if self.hero_image:
|
||||||
|
|
@ -82,10 +83,13 @@ class ModuleNode(DjangoObjectType):
|
||||||
chapters = Chapter.objects.live().descendant_of(self)
|
chapters = Chapter.objects.live().descendant_of(self)
|
||||||
return ChapterBookmark.objects.filter(chapter__in=chapters, user=user)
|
return ChapterBookmark.objects.filter(chapter__in=chapters, user=user)
|
||||||
|
|
||||||
def resolve_objective_groups(self, root, **kwargs):
|
@staticmethod
|
||||||
return self.objective_groups.all() \
|
def resolve_objective_groups(parent, info, **kwargs):
|
||||||
|
return parent.objective_groups.all() \
|
||||||
.prefetch_related('hidden_for')
|
.prefetch_related('hidden_for')
|
||||||
|
|
||||||
|
def resolve_snapshots(self, info, **kwargs):
|
||||||
|
return self.snapshots.all()
|
||||||
|
|
||||||
class RecentModuleNode(DjangoObjectType):
|
class RecentModuleNode(DjangoObjectType):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import graphene
|
||||||
from graphene import relay
|
from graphene import relay
|
||||||
from graphene_django import DjangoObjectType
|
from graphene_django import DjangoObjectType
|
||||||
from graphene_django.filter import DjangoFilterConnectionField
|
from graphene_django.filter import DjangoFilterConnectionField
|
||||||
|
|
@ -7,6 +8,8 @@ from books.models.snapshot import Snapshot
|
||||||
|
|
||||||
|
|
||||||
class SnapshotNode(DjangoObjectType):
|
class SnapshotNode(DjangoObjectType):
|
||||||
|
title = graphene.String()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Snapshot
|
model = Snapshot
|
||||||
interfaces = (relay.Node,)
|
interfaces = (relay.Node,)
|
||||||
|
|
@ -17,3 +20,7 @@ class SnapshotNode(DjangoObjectType):
|
||||||
def resolve_chapters(self, info, **kwargs):
|
def resolve_chapters(self, info, **kwargs):
|
||||||
# return Chapter.objects.filter(chapter_snapshots__snapshot=self)
|
# return Chapter.objects.filter(chapter_snapshots__snapshot=self)
|
||||||
return self.chapters.through.objects.all()
|
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 = """
|
CREATE_SNAPSHOT_MUTATION = """
|
||||||
mutation CreateSnapshot($input: CreateSnapshotInput!) {
|
mutation CreateSnapshot($input: CreateSnapshotInput!) {
|
||||||
createSnapshot(input: $input) {
|
createSnapshot(input: $input) {
|
||||||
snapshot {
|
snapshot {
|
||||||
|
id
|
||||||
|
chapters {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
id
|
id
|
||||||
chapters {
|
descriptionHidden
|
||||||
edges {
|
titleHidden
|
||||||
node {
|
title
|
||||||
id
|
description
|
||||||
descriptionHidden
|
contentBlocks {
|
||||||
titleHidden
|
edges {
|
||||||
title
|
node {
|
||||||
description
|
id
|
||||||
contentBlocks {
|
title
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
success
|
}
|
||||||
}
|
}
|
||||||
|
success
|
||||||
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
APPLY_SNAPSHOT_MUTATION = """
|
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')
|
GOOGLE_TAG_MANAGER_CONTAINER_ID = os.environ.get('GOOGLE_TAG_MANAGER_CONTAINER_ID')
|
||||||
|
|
||||||
GRAPHENE = {
|
GRAPHENE = {
|
||||||
'SCHEMA': 'api.schema.schema'
|
'SCHEMA': 'api.schema.schema',
|
||||||
|
'SCHEMA_OUTPUT': 'schema.graphql'
|
||||||
}
|
}
|
||||||
|
|
||||||
# if DEBUG:
|
# if DEBUG:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue