Add 404 type response to topic query

This commit is contained in:
Ramon Wenger 2022-05-19 11:19:19 +02:00
parent 3278774876
commit 6e1501f33b
2 changed files with 22 additions and 3 deletions

View File

@ -6,6 +6,11 @@ from graphene_django.filter import DjangoFilterConnectionField
from books.models import Topic, Module
from books.schema.nodes import ModuleNode
NOT_FOUND = { 'reason': 'Not Found'}
class NotFound(graphene.ObjectType):
reason = graphene.String()
class TopicNode(DjangoObjectType):
pk = graphene.Int()
@ -27,3 +32,14 @@ class TopicNode(DjangoObjectType):
def resolve_modules(self, *args, **kwargs):
return Module.get_by_parent(self)
class TopicOr404Node(graphene.Union):
class Meta:
types = (TopicNode, NotFound)
@classmethod
def resolve_type(cls, instance, info):
if type(instance).__name__ == "Topic":
return TopicNode
return NotFound

View File

@ -5,7 +5,7 @@ from graphene_django.filter import DjangoFilterConnectionField
from api.utils import get_object
from core.logger import get_logger
from .connections import TopicConnection, ModuleConnection
from .nodes import ContentBlockNode, ChapterNode, ModuleNode, TopicNode, SnapshotNode
from .nodes import ContentBlockNode, ChapterNode, ModuleNode, NOT_FOUND, TopicNode, SnapshotNode, TopicOr404Node
from ..models import Book, Topic, Module, Chapter, Snapshot
logger = get_logger(__name__)
@ -13,7 +13,7 @@ logger = get_logger(__name__)
class BookQuery(object):
node = relay.Node.Field()
topic = graphene.Field(TopicNode, slug=graphene.String())
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)
@ -63,5 +63,8 @@ class BookQuery(object):
if id is not None:
return get_object(Topic, id)
if slug is not None:
return Topic.objects.get(slug=slug)
try:
return Topic.objects.get(slug=slug)
except Topic.DoesNotExist:
return NOT_FOUND
return None