Add comment model
This commit is contained in:
parent
741073c187
commit
30b123523a
|
|
@ -0,0 +1,5 @@
|
||||||
|
mutation AddComment($input: AddCommentInput!) {
|
||||||
|
addComment(input: $input) {
|
||||||
|
success
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -3,11 +3,11 @@ from graphene import relay
|
||||||
from rest_framework.exceptions import PermissionDenied
|
from rest_framework.exceptions import PermissionDenied
|
||||||
|
|
||||||
from api.utils import get_object
|
from api.utils import get_object
|
||||||
from portfolio.inputs import AddProjectArgument, UpdateProjectArgument, AddProjectEntryArgument, \
|
from portfolio.inputs import AddProjectArgument, AddProjectEntryArgument, UpdateProjectArgument, \
|
||||||
UpdateProjectEntryArgument
|
UpdateProjectEntryArgument
|
||||||
from portfolio.models import Project, ProjectEntry
|
from portfolio.models import Project, ProjectEntry
|
||||||
from portfolio.schema import ProjectNode, ProjectEntryNode
|
from portfolio.schema import ProjectEntryNode, ProjectNode
|
||||||
from portfolio.serializers import ProjectSerializer, ProjectEntrySerializer
|
from portfolio.serializers import ProjectEntrySerializer, ProjectSerializer
|
||||||
|
|
||||||
|
|
||||||
def check_owner(user, project):
|
def check_owner(user, project):
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import graphene
|
import graphene
|
||||||
|
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 django.db.models import Q
|
|
||||||
from graphene_django.filter import DjangoFilterConnectionField
|
from graphene_django.filter import DjangoFilterConnectionField
|
||||||
|
|
||||||
from api.utils import get_by_id_or_slug
|
from api.utils import get_by_id_or_slug
|
||||||
from portfolio.models import Project, ProjectEntry
|
from portfolio.models import Project, ProjectEntry
|
||||||
from users.models import UserRole, Role
|
from users.models import Role, UserRole
|
||||||
|
|
||||||
|
|
||||||
class ProjectNode(DjangoObjectType):
|
class ProjectNode(DjangoObjectType):
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ from portfolio.models import Project, ProjectEntry
|
||||||
|
|
||||||
|
|
||||||
class ProjectMutationsTestCase(DefaultUserTestCase):
|
class ProjectMutationsTestCase(DefaultUserTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
create_users()
|
create_users()
|
||||||
self.teacher = User.objects.get(username='teacher')
|
self.teacher = User.objects.get(username='teacher')
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Generated by Django 2.2.22 on 2021-08-19 19:17
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('rooms', '0008_auto_20200302_1613'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Comment',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('text', models.TextField()),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='comments', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('room_entry', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='comments', to='rooms.RoomEntry')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -3,7 +3,7 @@ from django.db import models
|
||||||
from django_extensions.db.models import TitleSlugDescriptionModel
|
from django_extensions.db.models import TitleSlugDescriptionModel
|
||||||
from wagtail.core.fields import StreamField
|
from wagtail.core.fields import StreamField
|
||||||
|
|
||||||
from books.blocks import ImageUrlBlock, LinkBlock, VideoBlock, DocumentBlock
|
from books.blocks import DocumentBlock, ImageUrlBlock, LinkBlock, VideoBlock
|
||||||
from books.models import TextBlock
|
from books.models import TextBlock
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass
|
||||||
|
|
||||||
|
|
@ -13,7 +13,8 @@ class Room(TitleSlugDescriptionModel):
|
||||||
verbose_name = 'Raum'
|
verbose_name = 'Raum'
|
||||||
verbose_name_plural = 'Räume'
|
verbose_name_plural = 'Räume'
|
||||||
|
|
||||||
school_class = models.ForeignKey(SchoolClass, blank=False, null=False, on_delete=models.CASCADE, related_name='rooms')
|
school_class = models.ForeignKey(SchoolClass, blank=False, null=False, on_delete=models.CASCADE,
|
||||||
|
related_name='rooms')
|
||||||
appearance = models.CharField(blank=True, null=False, max_length=255)
|
appearance = models.CharField(blank=True, null=False, max_length=255)
|
||||||
user_created = models.BooleanField(blank=False, null=False, default=True)
|
user_created = models.BooleanField(blank=False, null=False, default=True)
|
||||||
|
|
||||||
|
|
@ -52,3 +53,12 @@ class ModuleRoomSlug(TitleSlugDescriptionModel):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'ModuleRoomSlug {self.id}-{self.title}'
|
return f'ModuleRoomSlug {self.id}-{self.title}'
|
||||||
|
|
||||||
|
|
||||||
|
class Comment(models.Model):
|
||||||
|
text = models.TextField()
|
||||||
|
room_entry = models.ForeignKey(RoomEntry, related_name='comments', on_delete=models.PROTECT)
|
||||||
|
owner = models.ForeignKey(get_user_model(), related_name='comments', on_delete=models.PROTECT)
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.text
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ from graphql_relay import to_global_id
|
||||||
|
|
||||||
from api.utils import get_object
|
from api.utils import get_object
|
||||||
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument, UpdateRoomEntryArgument
|
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument, UpdateRoomEntryArgument
|
||||||
from rooms.models import Room, RoomEntry
|
from rooms.models import Comment, Room, RoomEntry
|
||||||
from rooms.schema import RoomNode, RoomEntryNode
|
from rooms.schema import CommentNode, RoomNode, RoomEntryNode
|
||||||
from rooms.serializers import RoomSerializer, RoomEntrySerializer
|
from rooms.serializers import RoomSerializer, RoomEntrySerializer
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass
|
||||||
|
|
||||||
|
|
@ -143,6 +143,27 @@ class DeleteRoomEntry(relay.ClientIDMutation):
|
||||||
return cls(success=True, room_id=room_id, room_slug=room_slug)
|
return cls(success=True, room_id=room_id, room_slug=room_slug)
|
||||||
|
|
||||||
|
|
||||||
|
class AddComment(relay.ClientIDMutation):
|
||||||
|
class Input:
|
||||||
|
comment = graphene.String(required=True)
|
||||||
|
room_entry = graphene.ID(required=True)
|
||||||
|
|
||||||
|
success = graphene.Boolean()
|
||||||
|
comment = graphene.Field(CommentNode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def mutate_and_get_payload(cls, root, info, **args):
|
||||||
|
room_entry_id = args.get('room_entry')
|
||||||
|
text = args.get('comment')
|
||||||
|
user = info.context.user
|
||||||
|
|
||||||
|
room_entry = get_object(RoomEntry, room_entry_id)
|
||||||
|
comment = Comment.objects.create(text=text, room_entry=room_entry, owner=user)
|
||||||
|
|
||||||
|
return cls(success=True, comment=comment)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RoomMutations:
|
class RoomMutations:
|
||||||
update_room = UpdateRoom.Field()
|
update_room = UpdateRoom.Field()
|
||||||
add_room = AddRoom.Field()
|
add_room = AddRoom.Field()
|
||||||
|
|
@ -150,3 +171,4 @@ class RoomMutations:
|
||||||
add_room_entry = AddRoomEntry.Field()
|
add_room_entry = AddRoomEntry.Field()
|
||||||
delete_room_entry = DeleteRoomEntry.Field()
|
delete_room_entry = DeleteRoomEntry.Field()
|
||||||
update_room_entry = UpdateRoomEntry.Field()
|
update_room_entry = UpdateRoomEntry.Field()
|
||||||
|
add_comment = AddComment.Field()
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,10 @@ 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 api.utils import get_object, get_by_id_or_slug
|
from api.utils import get_by_id_or_slug, get_object
|
||||||
from rooms.models import Room, RoomEntry, ModuleRoomSlug
|
from rooms.models import Comment, ModuleRoomSlug, Room, RoomEntry
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass
|
||||||
|
from users.schema import PublicUserNode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -41,6 +42,14 @@ class RoomNode(DjangoObjectType):
|
||||||
return self.room_entries.count()
|
return self.room_entries.count()
|
||||||
|
|
||||||
|
|
||||||
|
class CommentNode(DjangoObjectType):
|
||||||
|
owner = graphene.Field(PublicUserNode)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Comment
|
||||||
|
interfaces = (relay.Node,)
|
||||||
|
|
||||||
|
|
||||||
class RoomsQuery(object):
|
class RoomsQuery(object):
|
||||||
# room = relay.Node.Field(RoomNode)
|
# room = relay.Node.Field(RoomNode)
|
||||||
room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String())
|
room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String())
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
from graphql_relay import to_global_id
|
||||||
|
|
||||||
|
from core.tests.base_test import SkillboxTestCase
|
||||||
|
from rooms.factories import RoomEntryFactory
|
||||||
|
|
||||||
|
|
||||||
|
class CommentTestCase(SkillboxTestCase):
|
||||||
|
def setUp(self) -> None:
|
||||||
|
self.createDefault()
|
||||||
|
|
||||||
|
def test_add_comment(self):
|
||||||
|
room_entry = RoomEntryFactory()
|
||||||
|
text = 'First!!!'
|
||||||
|
|
||||||
|
mutation = """
|
||||||
|
mutation AddComment($input: AddCommentInput!) {
|
||||||
|
addComment(input: $input) {
|
||||||
|
success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
self.assertEqual(room_entry.comments.count(), 0)
|
||||||
|
|
||||||
|
room_entry_id = to_global_id('RoomEntryNode', room_entry.id)
|
||||||
|
|
||||||
|
result = self.get_client().execute(mutation, variables={
|
||||||
|
'input': {
|
||||||
|
'roomEntry': room_entry_id,
|
||||||
|
'comment': text
|
||||||
|
}
|
||||||
|
})
|
||||||
|
self.assertIsNone(result.get('errors'))
|
||||||
|
self.assertEqual(room_entry.comments.count(), 1)
|
||||||
|
comment = room_entry.comments.first()
|
||||||
|
self.assertEqual(comment.text, text)
|
||||||
|
self.assertEqual(comment.owner.id, self.teacher.id)
|
||||||
Loading…
Reference in New Issue