Add mutation to update a snapshot

This commit is contained in:
Ramon Wenger 2022-05-25 21:55:55 +02:00
parent 1f7ff13a13
commit b12d1c1a9f
4 changed files with 66 additions and 33 deletions

View File

@ -1,7 +1,7 @@
from books.schema.mutations.chapter import UpdateChapterVisibility
from books.schema.mutations.contentblock import MutateContentBlock, AddContentBlock, DeleteContentBlock
from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, SyncModuleVisibility
from books.schema.mutations.snapshot import CreateSnapshot, ApplySnapshot, ShareSnapshot
from books.schema.mutations.snapshot import CreateSnapshot, ApplySnapshot, ShareSnapshot, UpdateSnapshot
from books.schema.mutations.topic import UpdateLastTopic
@ -17,3 +17,4 @@ class BookMutations(object):
create_snapshot = CreateSnapshot.Field()
apply_snapshot = ApplySnapshot.Field()
share_snapshot = ShareSnapshot.Field()
update_snapshot = UpdateSnapshot.Field()

View File

@ -2,6 +2,7 @@ import graphene
from django.db.models import Q
from graphene import relay
from api.types import FailureNode
from api.utils import get_object
from books.models import Module, ContentBlock, Chapter
from books.models.snapshot import Snapshot
@ -9,6 +10,19 @@ from books.schema.nodes import SnapshotNode, ModuleNode
from users.models import SchoolClass
class NotOwner(graphene.ObjectType):
class Meta:
interfaces = (FailureNode,)
NotOwnerFailure = NotOwner(reason="Not the owner")
class UpdateSnapshotResult(graphene.Union):
class Meta:
types = (SnapshotNode, NotOwner,)
class CreateSnapshot(relay.ClientIDMutation):
class Input:
module = graphene.String(required=True)
@ -30,6 +44,28 @@ class CreateSnapshot(relay.ClientIDMutation):
return cls(snapshot=snapshot, success=True)
class UpdateSnapshot(relay.ClientIDMutation):
class Input:
id = graphene.ID(required=True)
title = graphene.String()
snapshot = graphene.Field(UpdateSnapshotResult)
@classmethod
def mutate_and_get_payload(cls, root, info, **args):
id = args.get('id')
title = args.get('title')
user = info.context.user
snapshot = get_object(Snapshot, id)
if snapshot.creator != user:
return cls(snapshot=NotOwnerFailure)
if title is not None:
snapshot.title = title
snapshot.save()
return cls(snapshot=snapshot)
class ApplySnapshot(relay.ClientIDMutation):
class Input:
snapshot = graphene.ID(required=True)

View File

@ -141,7 +141,7 @@ class SnapshotNode(DjangoObjectType):
@staticmethod
def resolve_title(parent: Snapshot, info, **kwargs):
return f'Snapshot {parent.id}'
return parent.title if parent.title is not None else f'Snapshot {parent.id}'
@staticmethod
def resolve_meta_title(parent, info, **kwargs):

View File

@ -301,16 +301,6 @@ type ContentBlockNode implements Node & ContentBlockInterface {
originalCreator: PublicUserNode
}
type ContentBlockNodeConnection {
pageInfo: PageInfo!
edges: [ContentBlockNodeEdge]!
}
type ContentBlockNodeEdge {
node: ContentBlockNode
cursor: String!
}
input ContentElementInput {
id: String
type: InputTypes!
@ -469,6 +459,10 @@ type DuplicateName {
reason: String
}
interface FailureNode {
reason: String
}
type FieldError {
code: String
}
@ -683,6 +677,7 @@ type Mutation {
createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload
applySnapshot(input: ApplySnapshotInput!): ApplySnapshotPayload
shareSnapshot(input: ShareSnapshotInput!): ShareSnapshotPayload
updateSnapshot(input: UpdateSnapshotInput!): UpdateSnapshotPayload
_debug: DjangoDebug
}
@ -706,6 +701,10 @@ type NotFound {
reason: String
}
type NotOwner implements FailureNode {
reason: String
}
type NoteNode implements Node {
id: ID!
text: String!
@ -756,16 +755,6 @@ type ObjectiveNode implements Node {
mine: Boolean
}
type ObjectiveNodeConnection {
pageInfo: PageInfo!
edges: [ObjectiveNodeEdge]!
}
type ObjectiveNodeEdge {
node: ObjectiveNode
cursor: String!
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
@ -965,20 +954,14 @@ type SnapshotContentBlockNode implements Node & ContentBlockInterface {
}
type SnapshotNode implements Node {
id: ID!
module: ModuleNode!
chapters: [SnapshotChapterNode]
hiddenContentBlocks(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, title: String): ContentBlockNodeConnection!
created: DateTime!
creator: String!
shared: Boolean!
objectiveGroups: [SnapshotObjectiveGroupNode]
hiddenObjectives(offset: Int, before: String, after: String, first: Int, last: Int, text: String): ObjectiveNodeConnection!
title: String
metaTitle: String
heroImage: String
id: ID!
chapters: [SnapshotChapterNode]
changes: SnapshotChangesNode
mine: Boolean
shared: Boolean!
creator: String!
objectiveGroups: [SnapshotObjectiveGroupNode]
}
type SnapshotNodeConnection {
@ -1431,6 +1414,19 @@ type UpdateSettingPayload {
clientMutationId: String
}
input UpdateSnapshotInput {
id: ID!
title: String
clientMutationId: String
}
type UpdateSnapshotPayload {
snapshot: UpdateSnapshotResult
clientMutationId: String
}
union UpdateSnapshotResult = SnapshotNode | NotOwner
input UpdateSolutionVisibilityInput {
slug: String
enabled: Boolean