From 91c81b13c0023f7a7f1cd6486de2f18f1b459897 Mon Sep 17 00:00:00 2001 From: Pawel Kowalski Date: Wed, 8 Aug 2018 14:43:49 +0200 Subject: [PATCH] implement a navigable book->topic->module query --- client/src/graphql/gql/bookQuery.gql | 32 +++++++++++++++++++ .../gql/{ => sandbox}/masterBlasterQuery.gql | 0 .../gql/sandbox/masterBlasterSkillBox.gql | 31 ++++++++++++++++++ server/book/models/book.py | 3 ++ server/book/models/module.py | 4 +++ server/book/models/topic.py | 7 ++++ server/book/schema.py | 8 +++++ 7 files changed, 85 insertions(+) create mode 100644 client/src/graphql/gql/bookQuery.gql rename client/src/graphql/gql/{ => sandbox}/masterBlasterQuery.gql (100%) create mode 100644 client/src/graphql/gql/sandbox/masterBlasterSkillBox.gql diff --git a/client/src/graphql/gql/bookQuery.gql b/client/src/graphql/gql/bookQuery.gql new file mode 100644 index 00000000..bd6b05fd --- /dev/null +++ b/client/src/graphql/gql/bookQuery.gql @@ -0,0 +1,32 @@ +query BookQuery { + books { + edges { + node { + id + title + topics(first:3) { + edges { + node { + id + title + slug + teaser + description + modules(first:3) { + edges { + node { + id + title + slug + teaser + heroImage + } + } + } + } + } + } + } + } + } +} diff --git a/client/src/graphql/gql/masterBlasterQuery.gql b/client/src/graphql/gql/sandbox/masterBlasterQuery.gql similarity index 100% rename from client/src/graphql/gql/masterBlasterQuery.gql rename to client/src/graphql/gql/sandbox/masterBlasterQuery.gql diff --git a/client/src/graphql/gql/sandbox/masterBlasterSkillBox.gql b/client/src/graphql/gql/sandbox/masterBlasterSkillBox.gql new file mode 100644 index 00000000..82129da6 --- /dev/null +++ b/client/src/graphql/gql/sandbox/masterBlasterSkillBox.gql @@ -0,0 +1,31 @@ +query BooksQuery { + books { + edges { + node { + id + slug + title + + } + } + } + + topics { + edges { + node { + id + } + } + } + + modules { + edges { + node { + title + slug + heroImage + } + } + } + +} diff --git a/server/book/models/book.py b/server/book/models/book.py index e0ec923c..1d1916d9 100644 --- a/server/book/models/book.py +++ b/server/book/models/book.py @@ -27,3 +27,6 @@ class Book(Page): template = 'generic_page.html' subpage_types = ['book.Topic'] + + def get_child_ids(self): + return self.get_children().values_list('id', flat=True) diff --git a/server/book/models/module.py b/server/book/models/module.py index b1fde365..3183c454 100644 --- a/server/book/models/module.py +++ b/server/book/models/module.py @@ -52,3 +52,7 @@ class Module(Page): template = 'generic_page.html' parent_page_types = ['book.Topic'] + + @classmethod + def get_topic_modules(cls, topic): + return cls.objects.filter(id__in=topic.get_child_ids()).live() diff --git a/server/book/models/topic.py b/server/book/models/topic.py index 9da2ca92..283933ba 100644 --- a/server/book/models/topic.py +++ b/server/book/models/topic.py @@ -38,3 +38,10 @@ class Topic(Page): parent_page_types = ['book.Book'] subpage_types = ['book.Module'] + + def get_child_ids(self): + return self.get_children().values_list('id', flat=True) + + @classmethod + def get_book_topics(cls, book): + return cls.objects.filter(id__in=book.get_child_ids()).live() diff --git a/server/book/schema.py b/server/book/schema.py index c5d39288..01a01f10 100644 --- a/server/book/schema.py +++ b/server/book/schema.py @@ -31,6 +31,7 @@ class ModuleNode(DjangoObjectType): class TopicNode(DjangoObjectType): pk = graphene.Int() + modules = DjangoFilterConnectionField(ModuleNode) class Meta: model = Topic @@ -46,9 +47,13 @@ class TopicNode(DjangoObjectType): def resolve_pk(self, *args, **kwargs): return self.id + def resolve_modules(self, *args, **kwargs): + return Module.get_topic_modules(self) + class BookNode(DjangoObjectType): pk = graphene.Int() + topics = DjangoFilterConnectionField(TopicNode) class Meta: model = Book @@ -64,6 +69,9 @@ class BookNode(DjangoObjectType): def resolve_pk(self, *args, **kwargs): return self.id + def resolve_topics(self, *args, **kwargs): + return Topic.get_book_topics(self) + class ModulesQuery(object): books = DjangoFilterConnectionField(BookNode)