Add comment model

This commit is contained in:
Ramon Wenger 2021-08-19 21:24:32 +02:00
parent 741073c187
commit 30b123523a
10 changed files with 146 additions and 24 deletions

View File

@ -0,0 +1,5 @@
mutation AddComment($input: AddCommentInput!) {
addComment(input: $input) {
success
}
}

File diff suppressed because one or more lines are too long

View File

@ -3,11 +3,11 @@ from graphene import relay
from rest_framework.exceptions import PermissionDenied
from api.utils import get_object
from portfolio.inputs import AddProjectArgument, UpdateProjectArgument, AddProjectEntryArgument, \
from portfolio.inputs import AddProjectArgument, AddProjectEntryArgument, UpdateProjectArgument, \
UpdateProjectEntryArgument
from portfolio.models import Project, ProjectEntry
from portfolio.schema import ProjectNode, ProjectEntryNode
from portfolio.serializers import ProjectSerializer, ProjectEntrySerializer
from portfolio.schema import ProjectEntryNode, ProjectNode
from portfolio.serializers import ProjectEntrySerializer, ProjectSerializer
def check_owner(user, project):

View File

@ -1,12 +1,12 @@
import graphene
from django.db.models import Q
from graphene import relay
from graphene_django import DjangoObjectType
from django.db.models import Q
from graphene_django.filter import DjangoFilterConnectionField
from api.utils import get_by_id_or_slug
from portfolio.models import Project, ProjectEntry
from users.models import UserRole, Role
from users.models import Role, UserRole
class ProjectNode(DjangoObjectType):

View File

@ -12,7 +12,6 @@ from portfolio.models import Project, ProjectEntry
class ProjectMutationsTestCase(DefaultUserTestCase):
def setUp(self):
create_users()
self.teacher = User.objects.get(username='teacher')

View File

@ -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')),
],
),
]

View File

@ -3,7 +3,7 @@ from django.db import models
from django_extensions.db.models import TitleSlugDescriptionModel
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 users.models import SchoolClass
@ -13,7 +13,8 @@ class Room(TitleSlugDescriptionModel):
verbose_name = 'Raum'
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)
user_created = models.BooleanField(blank=False, null=False, default=True)
@ -52,3 +53,12 @@ class ModuleRoomSlug(TitleSlugDescriptionModel):
def __str__(self):
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

View File

@ -5,8 +5,8 @@ from graphql_relay import to_global_id
from api.utils import get_object
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument, UpdateRoomEntryArgument
from rooms.models import Room, RoomEntry
from rooms.schema import RoomNode, RoomEntryNode
from rooms.models import Comment, Room, RoomEntry
from rooms.schema import CommentNode, RoomNode, RoomEntryNode
from rooms.serializers import RoomSerializer, RoomEntrySerializer
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)
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:
update_room = UpdateRoom.Field()
add_room = AddRoom.Field()
@ -150,3 +171,4 @@ class RoomMutations:
add_room_entry = AddRoomEntry.Field()
delete_room_entry = DeleteRoomEntry.Field()
update_room_entry = UpdateRoomEntry.Field()
add_comment = AddComment.Field()

View File

@ -5,9 +5,10 @@ from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from api.utils import get_object, get_by_id_or_slug
from rooms.models import Room, RoomEntry, ModuleRoomSlug
from api.utils import get_by_id_or_slug, get_object
from rooms.models import Comment, ModuleRoomSlug, Room, RoomEntry
from users.models import SchoolClass
from users.schema import PublicUserNode
logger = logging.getLogger(__name__)
@ -41,6 +42,14 @@ class RoomNode(DjangoObjectType):
return self.room_entries.count()
class CommentNode(DjangoObjectType):
owner = graphene.Field(PublicUserNode)
class Meta:
model = Comment
interfaces = (relay.Node,)
class RoomsQuery(object):
# room = relay.Node.Field(RoomNode)
room_entry = graphene.Field(RoomEntryNode, id=graphene.ID(), slug=graphene.String())

View File

@ -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)