From ff70e441c733ae9d698a4ab9b0b493e83251134c Mon Sep 17 00:00:00 2001 From: Pawel Kowalski Date: Thu, 23 Aug 2018 15:38:39 +0200 Subject: [PATCH] Add RoomEntry model, factory, dummy_data, node --- client/src/graphql/gql/roomEntriesQuery.gql | 24 +++++++++ .../graphql/gql/sandbox/roomEntriesQuery.gql | 32 +++++++++++ client/src/pages/index.vue | 7 --- .../core/management/commands/dummy_rooms.py | 54 +++++++++++++++---- server/rooms/admin.py | 12 +++-- server/rooms/factories.py | 12 ++++- server/rooms/migrations/0003_roomentry.py | 31 +++++++++++ .../migrations/0004_auto_20180823_1336.py | 17 ++++++ server/rooms/models.py | 13 +++++ server/rooms/schema.py | 23 ++++++-- server/user/schema.py | 22 ++++++-- 11 files changed, 219 insertions(+), 28 deletions(-) create mode 100644 client/src/graphql/gql/roomEntriesQuery.gql create mode 100644 client/src/graphql/gql/sandbox/roomEntriesQuery.gql create mode 100644 server/rooms/migrations/0003_roomentry.py create mode 100644 server/rooms/migrations/0004_auto_20180823_1336.py diff --git a/client/src/graphql/gql/roomEntriesQuery.gql b/client/src/graphql/gql/roomEntriesQuery.gql new file mode 100644 index 00000000..6f425dc2 --- /dev/null +++ b/client/src/graphql/gql/roomEntriesQuery.gql @@ -0,0 +1,24 @@ +query RoomEntriesQuery($id: ID!) { + room(id:$id) { + id + title + slug + appearance + pk + roomEntries { + edges { + node { + id + slug + title + description + author { + id + firstName + lastName + } + } + } + } + } +} diff --git a/client/src/graphql/gql/sandbox/roomEntriesQuery.gql b/client/src/graphql/gql/sandbox/roomEntriesQuery.gql new file mode 100644 index 00000000..2abdd98f --- /dev/null +++ b/client/src/graphql/gql/sandbox/roomEntriesQuery.gql @@ -0,0 +1,32 @@ +query RoomsQuery { + room(id:"Um9vbU5vZGU6MTA=") { + id + title + slug + appearance + pk + roomEntries { + edges { + node { + id + slug + title + description + author { + id + firstName + lastName + } + } + } + } + } + allRooms(first:0) { + edges { + node { + id + } + } + } + +} diff --git a/client/src/pages/index.vue b/client/src/pages/index.vue index 7d56546f..bbcbd02c 100644 --- a/client/src/pages/index.vue +++ b/client/src/pages/index.vue @@ -39,13 +39,6 @@ } } } - }, - - head: { - title: 'Modules with Apollo' - }, - - created() { } } diff --git a/server/core/management/commands/dummy_rooms.py b/server/core/management/commands/dummy_rooms.py index 1b9d7d3a..75cab70b 100644 --- a/server/core/management/commands/dummy_rooms.py +++ b/server/core/management/commands/dummy_rooms.py @@ -6,7 +6,7 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.core.management import BaseCommand -from rooms.factories import RoomFactory +from rooms.factories import RoomFactory, RoomEntryFactory from rooms.models import Room from user.factories import UserGroupFactory from user.models import UserGroup @@ -15,20 +15,50 @@ data = [ { 'title': 'Ein historisches Festival', 'appearance': 'red', - # 'group': 'Klasse 3b - 2018/2019' - # 'entries': [1, 1, 1, 1, 1, 1] + 'entries': [ + { + 'title': 'Ein neues Festival auf dem Gurten – und ich bin dabei!', + 'description': 'Endlich war es soweit. Zum ersten Mal fand am 2. und 3. Juli 1977 das 1. Internationale …' + }, + { + 'title': 'Mein Tagesblog', + 'description': 'https://blogger.com/cruel-festivals-around-the-world/' + }, + { + 'title': 'Woodstock', + 'description': 'In Woodstock hat sich dem Mythos nach vor genau vierzig Jahren das Lebensgefühl …' + }, + { + 'title': 'Ein neues Festival auf dem Gurten – und ich bin dabei!', + 'description': 'Endlich war es soweit. Zum ersten Mal fand am 2. und 3. Juli 1977 das 1. Internationale …' + }, + { + 'title': 'Das Festival', + 'description': 'www.meinblog.ch' + }, + { + 'title': '', + 'description': '' + }, + ] }, { 'title': 'Erfahrungen Lehrbeginn', 'appearance': 'green', - # 'group': 'Klasse 3b - 2018/2019' - # 'entries': [1] + 'entries': [ + { + 'title': 'Ich heisse Jan und habe am 01. August 2017 meine Ausbildung begonnen. Pünktlich zum …', + 'description': '' + }, + { + 'title': 'Mein Lehrbeginn', + 'description': 'Was war ich angespannt… und nervös. Das hat sich aber schnell gelegt.' + } + ] }, { 'title': 'Interview «Mein neues Umfeld»', - 'appearance': 'brown', - # 'group': 'Hans Muster und 12 weitere Personen' - # 'entries': [1, 1, 1, 1, 1, 1] + 'appearance': 'brown' } ] @@ -67,7 +97,13 @@ class Command(BaseCommand): UserGroupFactory(users=(random.choices(get_user_model().objects.all(), k=3))) for room_idx, room_data in enumerate(data): - RoomFactory.create(**room_data) + room = RoomFactory.create(**self.filter_data(room_data, ['entries'])) + + default_room_entries = [{} for i in range(0, random.randint(5, 8))] + room_entries = room_data.get('entries', default_room_entries) + + for room_entry_idx, room_entry in enumerate(room_entries): + RoomEntryFactory.create(room=room, **room_entry) # for book_idx, book_data in enumerate(data): # book = BookFactory.create(parent=site.root_page, **self.filter_data(book_data, 'topics')) diff --git a/server/rooms/admin.py b/server/rooms/admin.py index 767cea9a..b00d4b4e 100644 --- a/server/rooms/admin.py +++ b/server/rooms/admin.py @@ -1,9 +1,15 @@ from django.contrib import admin -from rooms.models import Room +from rooms.models import Room, RoomEntry @admin.register(Room) class RoomAdmin(admin.ModelAdmin): - list_display = ('id', 'title', 'user_group', 'appearance') - list_filter = ('user_group', 'appearance',) + list_display = ('id', 'slug', 'title', 'user_group', 'appearance') + list_filter = ('user_group', 'appearance') + + +@admin.register(RoomEntry) +class RoomEntryAdmin(admin.ModelAdmin): + list_display = ('id', 'slug', 'title', 'room', 'author') + list_filter = ('room', 'author') diff --git a/server/rooms/factories.py b/server/rooms/factories.py index 73793fe6..854186c2 100644 --- a/server/rooms/factories.py +++ b/server/rooms/factories.py @@ -1,9 +1,10 @@ import random import factory +from django.contrib.auth import get_user_model from core.factories import fake -from rooms.models import Room +from rooms.models import Room, RoomEntry from user.models import UserGroup @@ -14,3 +15,12 @@ class RoomFactory(factory.django.DjangoModelFactory): title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) user_group = factory.Iterator(UserGroup.objects.all()) appearance = factory.LazyAttribute(lambda x: random.choice(['red', 'green', 'brown'])) + + +class RoomEntryFactory(factory.django.DjangoModelFactory): + class Meta: + model = RoomEntry + + title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(8, 12))) + description = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(20, 30))) + author = factory.Iterator(get_user_model().objects.all()) diff --git a/server/rooms/migrations/0003_roomentry.py b/server/rooms/migrations/0003_roomentry.py new file mode 100644 index 00000000..e6476b6e --- /dev/null +++ b/server/rooms/migrations/0003_roomentry.py @@ -0,0 +1,31 @@ +# Generated by Django 2.0.6 on 2018-08-23 13:25 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('rooms', '0002_room_user_group'), + ] + + operations = [ + migrations.CreateModel( + name='RoomEntry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('description', models.TextField(blank=True, null=True, verbose_name='description')), + ('slug', django_extensions.db.fields.AutoSlugField(blank=True, editable=False, populate_from='title', verbose_name='slug')), + ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rooms.Room')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/server/rooms/migrations/0004_auto_20180823_1336.py b/server/rooms/migrations/0004_auto_20180823_1336.py new file mode 100644 index 00000000..cbcae34a --- /dev/null +++ b/server/rooms/migrations/0004_auto_20180823_1336.py @@ -0,0 +1,17 @@ +# Generated by Django 2.0.6 on 2018-08-23 13:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('rooms', '0003_roomentry'), + ] + + operations = [ + migrations.AlterModelOptions( + name='roomentry', + options={'verbose_name': 'Raumeintrag', 'verbose_name_plural': 'Raumeinträge'}, + ), + ] diff --git a/server/rooms/models.py b/server/rooms/models.py index 0814f482..20c2ffc8 100644 --- a/server/rooms/models.py +++ b/server/rooms/models.py @@ -1,3 +1,4 @@ +from django.contrib.auth import get_user_model from django.db import models from django_extensions.db.models import TitleDescriptionModel, TitleSlugDescriptionModel @@ -14,3 +15,15 @@ class Room(TitleSlugDescriptionModel): def __str__(self): return 'Room {}-{}-{}'.format(self.id, self.title, self.user_group) + + +class RoomEntry(TitleSlugDescriptionModel): + class Meta: + verbose_name = 'Raumeintrag' + verbose_name_plural = 'Raumeinträge' + + room = models.ForeignKey(Room, blank=False, null=False, on_delete=models.CASCADE) + author = models.ForeignKey(get_user_model(), null=True, on_delete=models.CASCADE) + + def __str__(self): + return 'RoomEntry {}-{}-{}'.format(self.id, self.title, self.author) diff --git a/server/rooms/schema.py b/server/rooms/schema.py index 7cb167f1..52a53c15 100644 --- a/server/rooms/schema.py +++ b/server/rooms/schema.py @@ -3,13 +3,27 @@ from graphene import relay from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField -from rooms.models import Room -from user.schema import UserGroupNode +from rooms.models import Room, RoomEntry +from user.schema import UserGroupNode, UserNode + + +class RoomEntryNode(DjangoObjectType): + pk = graphene.Int() + author = UserNode() + + class Meta: + model = RoomEntry + filter_fields = ['slug'] + interfaces = (relay.Node,) + + def resolve_pk(self, *args, **kwargs): + return self.id class RoomNode(DjangoObjectType): pk = graphene.Int() - userGroup = UserGroupNode() + user_group = UserGroupNode() + room_entries = DjangoFilterConnectionField(RoomEntryNode) class Meta: model = Room @@ -22,4 +36,7 @@ class RoomNode(DjangoObjectType): class RoomsQuery(object): room = relay.Node.Field(RoomNode) + room_entry = relay.Node.Field(RoomEntryNode) + all_rooms = DjangoFilterConnectionField(RoomNode) + all_room_entries = DjangoFilterConnectionField(RoomEntryNode) diff --git a/server/user/schema.py b/server/user/schema.py index 208d57b0..38db10cd 100644 --- a/server/user/schema.py +++ b/server/user/schema.py @@ -3,16 +3,28 @@ from graphene import relay from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField -from rooms.models import Room -from user.models import UserGroup +from user.models import UserGroup, User -class UserGroupNode(DjangoObjectType): +class UserNode(DjangoObjectType): pk = graphene.Int() class Meta: - model = UserGroup - filter_fields = ['pk', 'name'] + model = User + filter_fields = ['username', 'email'] + interfaces = (relay.Node,) + + def resolve_pk(self, *args, **kwargs): + return self.id + + +class UserGroupNode(DjangoObjectType): + pk = graphene.Int() + users = DjangoFilterConnectionField(UserNode) + + class Meta: + model = UserGroup + filter_fields = ['name'] interfaces = (relay.Node,) def resolve_pk(self, *args, **kwargs):