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 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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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 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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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