Refactor schema definitions to use less direct imports

This prevents some circular import issues
This commit is contained in:
Ramon Wenger 2024-02-14 23:04:44 +01:00
parent afc415dc8a
commit 7cf192f132
8 changed files with 97 additions and 97 deletions

View File

@ -1,27 +1,28 @@
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from api.graphene_wagtail import GenericStreamFieldType
from api.utils import get_object
from graphene import relay
from graphene_django import DjangoObjectType
from notes.models import InstrumentBookmark
from notes.schema import InstrumentBookmarkNode
from .models import BasicKnowledge, InstrumentCategory, InstrumentType
class InstrumentCategoryNode(DjangoObjectType):
types = graphene.List('basicknowledge.queries.InstrumentTypeNode')
types = graphene.List("basicknowledge.queries.InstrumentTypeNode")
class Meta:
model = InstrumentCategory
interfaces = (relay.Node,)
only_fields = [
'name', 'foreground', 'background', 'id'
]
only_fields = ["name", "foreground", "background", "id"]
@staticmethod
def resolve_types(root: InstrumentCategory, info, **kwargs):
return root.instrument_types.filter(instruments__isnull=False).order_by('name').distinct()
return (
root.instrument_types.filter(instruments__isnull=False)
.order_by("name")
.distinct()
)
class InstrumentTypeNode(DjangoObjectType):
@ -31,9 +32,7 @@ class InstrumentTypeNode(DjangoObjectType):
class Meta:
model = InstrumentType
interfaces = (relay.Node,)
only_fields = [
'name', 'category', 'type', 'id'
]
only_fields = ["name", "category", "type", "id"]
@staticmethod
def resolve_type(root: InstrumentType, info, **kwargs):
@ -41,17 +40,21 @@ class InstrumentTypeNode(DjangoObjectType):
class InstrumentNode(DjangoObjectType):
bookmarks = graphene.List(InstrumentBookmarkNode)
bookmarks = graphene.List("notes.schema.InstrumentBookmarkNode")
type = graphene.Field(InstrumentTypeNode)
contents = GenericStreamFieldType()
language = graphene.String()
highlights = graphene.List("notes.schema.HighlightNode")
class Meta:
model = BasicKnowledge
filter_fields = ['slug']
filter_fields = ["slug"]
interfaces = (relay.Node,)
only_fields = [
'slug', 'title', 'intro', 'contents',
"slug",
"title",
"intro",
"contents",
]
@staticmethod
@ -60,23 +63,28 @@ class InstrumentNode(DjangoObjectType):
def resolve_bookmarks(self, info, **kwargs):
return InstrumentBookmark.objects.filter(
user=info.context.user,
instrument=self
user=info.context.user, instrument=self
)
def resolve_language(self, info, **kwargs):
return self.locale.language_code
@staticmethod
def resolve_highlights(root: BasicKnowledge, info, **kwargs):
return root.highlights.filter(user=info.context.user)
class InstrumentQuery(object):
instrument = graphene.Field(InstrumentNode, slug=graphene.String(), id=graphene.ID())
instrument = graphene.Field(
InstrumentNode, slug=graphene.String(), id=graphene.ID()
)
instruments = graphene.List(InstrumentNode)
instrument_types = graphene.List(InstrumentTypeNode)
instrument_categories = graphene.List(InstrumentCategoryNode)
def resolve_instrument(self, info, **kwargs):
slug = kwargs.get('slug')
instrument_id = kwargs.get('id')
slug = kwargs.get("slug")
instrument_id = kwargs.get("id")
if instrument_id is not None:
return get_object(BasicKnowledge, instrument_id)
@ -85,10 +93,14 @@ class InstrumentQuery(object):
return None
def resolve_instruments(self, info, **kwargs):
return BasicKnowledge.objects.all().order_by('title').live()
return BasicKnowledge.objects.all().order_by("title").live()
def resolve_instrument_types(self, info, **kwargs):
return InstrumentType.objects.filter(instruments__isnull=False).order_by('name').distinct()
return (
InstrumentType.objects.filter(instruments__isnull=False)
.order_by("name")
.distinct()
)
def resolve_instrument_categories(self, info, **kwargs):
return InstrumentCategory.objects.all().order_by('name')
return InstrumentCategory.objects.all().order_by("name")

View File

@ -1,16 +1,14 @@
import graphene
from books.models import Chapter, ContentBlock
from books.schema.interfaces import ChapterInterface
from django.db.models import Q
from graphene import relay
from graphene_django import DjangoObjectType
from books.models import Chapter, ContentBlock
from books.schema.interfaces import ChapterInterface
from notes.models import ChapterBookmark
from notes.schema import ChapterBookmarkNode
class ChapterNode(DjangoObjectType):
bookmark = graphene.Field(ChapterBookmarkNode)
bookmark = graphene.Field("notes.schema.ChapterBookmarkNode")
content_blocks = graphene.List("books.schema.nodes.ContentBlockNode")
title_hidden_for = graphene.List("users.schema.SchoolClassNode")
description_hidden_for = graphene.List("users.schema.SchoolClassNode")

View File

@ -1,16 +1,13 @@
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from basicknowledge.models import BasicKnowledge
from basicknowledge.queries import InstrumentCategoryNode
from books.models import ContentBlock
from books.schema.interfaces.contentblock import ContentBlockInterface
from books.utils import are_solutions_enabled_for
from core.logger import get_logger
from core.mixins import HiddenAndVisibleForMixin
from graphene import relay
from graphene_django import DjangoObjectType
from notes.models import ContentBlockBookmark
from notes.schema import ContentBlockBookmarkNode, HighlightNode
from rooms.models import ModuleRoomSlug
logger = get_logger(__name__)
@ -42,11 +39,13 @@ def is_solution_and_hidden_for_user(type, user, module):
class ContentBlockNode(DjangoObjectType, HiddenAndVisibleForMixin):
mine = graphene.Boolean()
bookmarks = graphene.List(ContentBlockBookmarkNode)
bookmarks = graphene.List("notes.schema.ContentBlockBookmarkNode")
original_creator = graphene.Field("users.schema.PublicUserNode")
instrument_category = graphene.Field(InstrumentCategoryNode)
instrument_category = graphene.Field(
"basicknowledge.queries.InstrumentCategoryNode"
)
path = graphene.String()
highlights = graphene.List(HighlightNode)
highlights = graphene.List("notes.schema.HighlightNode")
class Meta:
model = ContentBlock

View File

@ -1,27 +1,16 @@
import graphene
from django.db.models import Q
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from assignments.models import StudentSubmission
from assignments.schema.types import AssignmentNode, StudentSubmissionNode
from books.models import (
Module,
Chapter,
ContentBlock,
RecentModule,
)
from books.models import Chapter, ContentBlock, Module, RecentModule
from books.schema.interfaces.module import ModuleInterface
from books.schema.nodes.chapter import ChapterNode
from books.schema.nodes.module_category import ModuleCategoryNode
from books.schema.nodes.module_level import ModuleLevelNode
from notes.models import ModuleBookmark, ContentBlockBookmark, ChapterBookmark
from notes.schema import (
ModuleBookmarkNode,
ContentBlockBookmarkNode,
ChapterBookmarkNode,
)
from django.db.models import Q
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from notes.models import ChapterBookmark, ContentBlockBookmark, ModuleBookmark
from objectives.schema import ObjectiveGroupNode
from surveys.models import Answer
from surveys.schema import AnswerNode
@ -52,11 +41,15 @@ class ModuleNode(DjangoObjectType):
chapters = graphene.List(ChapterNode)
solutions_enabled = graphene.Boolean()
bookmark = graphene.Field(ModuleBookmarkNode)
bookmark = graphene.Field("notes.schema.ModuleBookmarkNode")
my_submissions = DjangoFilterConnectionField(StudentSubmissionNode)
my_answers = DjangoFilterConnectionField(AnswerNode)
my_content_bookmarks = DjangoFilterConnectionField(ContentBlockBookmarkNode)
my_chapter_bookmarks = DjangoFilterConnectionField(ChapterBookmarkNode)
my_content_bookmarks = DjangoFilterConnectionField(
"notes.schema.ContentBlockBookmarkNode"
)
my_chapter_bookmarks = DjangoFilterConnectionField(
"notes.schema.ChapterBookmarkNode"
)
snapshots = graphene.List("books.schema.nodes.SnapshotNode")
objective_groups = graphene.List(ObjectiveGroupNode)
assignments = graphene.List(AssignmentNode)

View File

@ -1,11 +1,10 @@
import graphene
from books.models import Module, Topic
from books.schema.nodes import ModuleNode
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from books.models import Topic, Module
from books.schema.nodes import ModuleNode
class NotFoundFailure:
reason = "Not Found"
@ -17,7 +16,7 @@ class NotFound(graphene.ObjectType):
class TopicNode(DjangoObjectType):
pk = graphene.Int()
modules = DjangoFilterConnectionField(ModuleNode)
modules = DjangoFilterConnectionField("books.schema.nodes.ModuleNode")
class Meta:
model = Topic

View File

@ -1,43 +1,44 @@
import graphene
from api.utils import get_object
from core.logger import get_logger
from graphene import relay
from graphene_django.filter import DjangoFilterConnectionField
from wagtail.models import Locale
from api.utils import get_object
from core.logger import get_logger
from .connections import TopicConnection, ModuleConnection
from .nodes import (
ContentBlockNode,
ChapterNode,
ModuleNode,
NotFoundFailure,
SnapshotNode,
TopicOr404Node,
)
from .nodes.module_category import ModuleCategoryNode
from .nodes.module_level import ModuleLevelNode
from ..models import Book, Topic, Module, Chapter, Snapshot, ModuleLevel, ModuleCategory
from ..models import Book, Chapter, Module, ModuleCategory, ModuleLevel, Snapshot, Topic
from .connections import ModuleConnection, TopicConnection
logger = get_logger(__name__)
class BookQuery(object):
node = relay.Node.Field()
topic = graphene.Field(TopicOr404Node, slug=graphene.String())
module = graphene.Field(ModuleNode, slug=graphene.String(), id=graphene.ID())
chapter = relay.Node.Field(ChapterNode)
content_block = relay.Node.Field(ContentBlockNode)
snapshot = relay.Node.Field(SnapshotNode)
topic = graphene.Field(
"books.schema.nodes.topic.TopicOr404Node", slug=graphene.String()
)
module = graphene.Field(
"books.schema.nodes.module.ModuleNode", slug=graphene.String(), id=graphene.ID()
)
chapter = relay.Node.Field("books.schema.nodes.chapter.ChapterNode")
content_block = relay.Node.Field("books.schema.nodes.content.ContentBlockNode")
snapshot = relay.Node.Field("books.schema.nodes.snapshot.SnapshotNode")
topics = relay.ConnectionField(TopicConnection)
modules = relay.ConnectionField(ModuleConnection)
chapters = DjangoFilterConnectionField(ChapterNode)
chapters = DjangoFilterConnectionField("books.schema.nodes.chapter.ChapterNode")
module_level = graphene.Field(ModuleLevelNode, id=graphene.ID(required=True))
module_levels = graphene.List(ModuleLevelNode)
module_level = graphene.Field(
"books.schema.nodes.module_level.ModuleLevelNode", id=graphene.ID(required=True)
)
module_levels = graphene.List("books.schema.nodes.module_level.ModuleLevelNode")
module_category = graphene.Field(ModuleCategoryNode, id=graphene.ID(required=True))
module_categories = graphene.List(ModuleCategoryNode)
module_category = graphene.Field(
"books.schema.nodes.module_category.ModuleCategoryNode",
id=graphene.ID(required=True),
)
module_categories = graphene.List(
"books.schema.nodes.module_category.ModuleCategoryNode"
)
def resolve_books(self, *args, **kwargs):
return Book.objects.filter(**kwargs).live()
@ -84,6 +85,8 @@ class BookQuery(object):
default_locale = Locale.get_default()
return Topic.objects.get(slug=slug, locale=default_locale)
except Topic.DoesNotExist:
from books.schema.nodes.topic import NotFoundFailure
return NotFoundFailure
return None

View File

@ -1,10 +1,7 @@
import graphene
from graphene_django.filter import DjangoFilterConnectionField
from basicknowledge.models import BasicKnowledge
from basicknowledge.queries import InstrumentNode
from books.models import Module
from books.schema.queries import ModuleNode
from graphene_django.filter import DjangoFilterConnectionField
from users.models import User
from .types import PrivateUserNode
@ -13,8 +10,10 @@ from .types import PrivateUserNode
class UsersQuery(object):
me = graphene.Field(PrivateUserNode)
all_users = DjangoFilterConnectionField(PrivateUserNode)
my_activity = DjangoFilterConnectionField(ModuleNode)
my_instrument_activity = DjangoFilterConnectionField(InstrumentNode)
my_activity = DjangoFilterConnectionField("books.schema.nodes.ModuleNode")
my_instrument_activity = DjangoFilterConnectionField(
"basicknowledge.queries.InstrumentNode"
)
def resolve_me(self, info, **kwargs):
return info.context.user

View File

@ -1,6 +1,9 @@
from datetime import datetime
import graphene
from api.types import FailureNode
from books.models import Module
from books.models.topic import Topic
from django.db.models import Q
from django.utils.dateformat import format
from django_filters import FilterSet, OrderingFilter
@ -8,12 +11,6 @@ from graphene import ObjectType, relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from graphql_relay import to_global_id
from api.types import FailureNode
from books.models import Module
from books.models.topic import Topic
from books.schema.nodes import ModuleLevelNode
from books.schema.queries import ModuleNode
from users.models import SchoolClass, SchoolClassMember, Team, User
@ -118,7 +115,7 @@ class PrivateUserNode(DjangoObjectType):
school_classes = graphene.List(SchoolClassNode)
recent_modules = DjangoFilterConnectionField(
ModuleNode, filterset_class=RecentModuleFilter
"books.schema.nodes.ModuleNode", filterset_class=RecentModuleFilter
)
team = graphene.Field(TeamNode)
read_only = graphene.Boolean()