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 import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from api.graphene_wagtail import GenericStreamFieldType from api.graphene_wagtail import GenericStreamFieldType
from api.utils import get_object from api.utils import get_object
from graphene import relay
from graphene_django import DjangoObjectType
from notes.models import InstrumentBookmark from notes.models import InstrumentBookmark
from notes.schema import InstrumentBookmarkNode
from .models import BasicKnowledge, InstrumentCategory, InstrumentType from .models import BasicKnowledge, InstrumentCategory, InstrumentType
class InstrumentCategoryNode(DjangoObjectType): class InstrumentCategoryNode(DjangoObjectType):
types = graphene.List('basicknowledge.queries.InstrumentTypeNode') types = graphene.List("basicknowledge.queries.InstrumentTypeNode")
class Meta: class Meta:
model = InstrumentCategory model = InstrumentCategory
interfaces = (relay.Node,) interfaces = (relay.Node,)
only_fields = [ only_fields = ["name", "foreground", "background", "id"]
'name', 'foreground', 'background', 'id'
]
@staticmethod @staticmethod
def resolve_types(root: InstrumentCategory, info, **kwargs): 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): class InstrumentTypeNode(DjangoObjectType):
@ -31,9 +32,7 @@ class InstrumentTypeNode(DjangoObjectType):
class Meta: class Meta:
model = InstrumentType model = InstrumentType
interfaces = (relay.Node,) interfaces = (relay.Node,)
only_fields = [ only_fields = ["name", "category", "type", "id"]
'name', 'category', 'type', 'id'
]
@staticmethod @staticmethod
def resolve_type(root: InstrumentType, info, **kwargs): def resolve_type(root: InstrumentType, info, **kwargs):
@ -41,17 +40,21 @@ class InstrumentTypeNode(DjangoObjectType):
class InstrumentNode(DjangoObjectType): class InstrumentNode(DjangoObjectType):
bookmarks = graphene.List(InstrumentBookmarkNode) bookmarks = graphene.List("notes.schema.InstrumentBookmarkNode")
type = graphene.Field(InstrumentTypeNode) type = graphene.Field(InstrumentTypeNode)
contents = GenericStreamFieldType() contents = GenericStreamFieldType()
language = graphene.String() language = graphene.String()
highlights = graphene.List("notes.schema.HighlightNode")
class Meta: class Meta:
model = BasicKnowledge model = BasicKnowledge
filter_fields = ['slug'] filter_fields = ["slug"]
interfaces = (relay.Node,) interfaces = (relay.Node,)
only_fields = [ only_fields = [
'slug', 'title', 'intro', 'contents', "slug",
"title",
"intro",
"contents",
] ]
@staticmethod @staticmethod
@ -60,23 +63,28 @@ class InstrumentNode(DjangoObjectType):
def resolve_bookmarks(self, info, **kwargs): def resolve_bookmarks(self, info, **kwargs):
return InstrumentBookmark.objects.filter( return InstrumentBookmark.objects.filter(
user=info.context.user, user=info.context.user, instrument=self
instrument=self
) )
def resolve_language(self, info, **kwargs): def resolve_language(self, info, **kwargs):
return self.locale.language_code return self.locale.language_code
@staticmethod
def resolve_highlights(root: BasicKnowledge, info, **kwargs):
return root.highlights.filter(user=info.context.user)
class InstrumentQuery(object): 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) instruments = graphene.List(InstrumentNode)
instrument_types = graphene.List(InstrumentTypeNode) instrument_types = graphene.List(InstrumentTypeNode)
instrument_categories = graphene.List(InstrumentCategoryNode) instrument_categories = graphene.List(InstrumentCategoryNode)
def resolve_instrument(self, info, **kwargs): def resolve_instrument(self, info, **kwargs):
slug = kwargs.get('slug') slug = kwargs.get("slug")
instrument_id = kwargs.get('id') instrument_id = kwargs.get("id")
if instrument_id is not None: if instrument_id is not None:
return get_object(BasicKnowledge, instrument_id) return get_object(BasicKnowledge, instrument_id)
@ -85,10 +93,14 @@ class InstrumentQuery(object):
return None return None
def resolve_instruments(self, info, **kwargs): 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): 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): 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 import graphene
from books.models import Chapter, ContentBlock
from books.schema.interfaces import ChapterInterface
from django.db.models import Q from django.db.models import Q
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from books.models import Chapter, ContentBlock
from books.schema.interfaces import ChapterInterface
from notes.models import ChapterBookmark from notes.models import ChapterBookmark
from notes.schema import ChapterBookmarkNode
class ChapterNode(DjangoObjectType): class ChapterNode(DjangoObjectType):
bookmark = graphene.Field(ChapterBookmarkNode) bookmark = graphene.Field("notes.schema.ChapterBookmarkNode")
content_blocks = graphene.List("books.schema.nodes.ContentBlockNode") content_blocks = graphene.List("books.schema.nodes.ContentBlockNode")
title_hidden_for = graphene.List("users.schema.SchoolClassNode") title_hidden_for = graphene.List("users.schema.SchoolClassNode")
description_hidden_for = graphene.List("users.schema.SchoolClassNode") description_hidden_for = graphene.List("users.schema.SchoolClassNode")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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