Merge branch 'master' of github.com:ramonwenger/skillbox

This commit is contained in:
Ramon Wenger 2018-08-23 16:05:40 +02:00
commit f583c6c8cc
11 changed files with 218 additions and 28 deletions

View File

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

View File

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

View File

@ -39,13 +39,6 @@
} }
} }
} }
},
head: {
title: 'Modules with Apollo'
},
created() {
} }
} }
</script> </script>

View File

@ -6,7 +6,7 @@ from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.management import BaseCommand from django.core.management import BaseCommand
from rooms.factories import RoomFactory from rooms.factories import RoomFactory, RoomEntryFactory
from rooms.models import Room from rooms.models import Room
from user.factories import UserGroupFactory from user.factories import UserGroupFactory
from user.models import UserGroup from user.models import UserGroup
@ -15,20 +15,50 @@ data = [
{ {
'title': 'Ein historisches Festival', 'title': 'Ein historisches Festival',
'appearance': 'red', 'appearance': 'red',
# 'group': 'Klasse 3b - 2018/2019' 'entries': [
# 'entries': [1, 1, 1, 1, 1, 1] {
'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', 'title': 'Erfahrungen Lehrbeginn',
'appearance': 'green', 'appearance': 'green',
# 'group': 'Klasse 3b - 2018/2019' 'entries': [
# 'entries': [1] {
'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»', 'title': 'Interview «Mein neues Umfeld»',
'appearance': 'brown', 'appearance': 'brown'
# 'group': 'Hans Muster und 12 weitere Personen'
# 'entries': [1, 1, 1, 1, 1, 1]
} }
] ]
@ -67,7 +97,13 @@ class Command(BaseCommand):
UserGroupFactory(users=(random.choices(get_user_model().objects.all(), k=3))) UserGroupFactory(users=(random.choices(get_user_model().objects.all(), k=3)))
for room_idx, room_data in enumerate(data): 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): # for book_idx, book_data in enumerate(data):
# book = BookFactory.create(parent=site.root_page, **self.filter_data(book_data, 'topics')) # book = BookFactory.create(parent=site.root_page, **self.filter_data(book_data, 'topics'))

View File

@ -1,9 +1,15 @@
from django.contrib import admin from django.contrib import admin
from rooms.models import Room from rooms.models import Room, RoomEntry
@admin.register(Room) @admin.register(Room)
class RoomAdmin(admin.ModelAdmin): class RoomAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'user_group', 'appearance') list_display = ('id', 'slug', 'title', 'user_group', 'appearance')
list_filter = ('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')

View File

@ -1,9 +1,10 @@
import random import random
import factory import factory
from django.contrib.auth import get_user_model
from core.factories import fake from core.factories import fake
from rooms.models import Room from rooms.models import Room, RoomEntry
from user.models import UserGroup 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))) title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8)))
user_group = factory.Iterator(UserGroup.objects.all()) user_group = factory.Iterator(UserGroup.objects.all())
appearance = factory.LazyAttribute(lambda x: random.choice(['red', 'green', 'brown'])) 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())

View File

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

View File

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

View File

@ -1,3 +1,4 @@
from django.contrib.auth import get_user_model
from django.db import models from django.db import models
from django_extensions.db.models import TitleDescriptionModel, TitleSlugDescriptionModel from django_extensions.db.models import TitleDescriptionModel, TitleSlugDescriptionModel
@ -14,3 +15,15 @@ class Room(TitleSlugDescriptionModel):
def __str__(self): def __str__(self):
return 'Room {}-{}-{}'.format(self.id, self.title, self.user_group) 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)

View File

@ -3,13 +3,27 @@ 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 rooms.models import Room from rooms.models import Room, RoomEntry
from user.schema import UserGroupNode 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 RoomType(DjangoObjectType): class RoomType(DjangoObjectType):
pk = graphene.Int() pk = graphene.Int()
userGroup = UserGroupNode() user_group = UserGroupNode()
room_entries = DjangoFilterConnectionField(RoomEntryNode)
class Meta: class Meta:
model = Room model = Room
@ -26,6 +40,8 @@ class RoomsQuery(object):
id=graphene.Int(), id=graphene.Int(),
appearance=graphene.String()) appearance=graphene.String())
all_rooms = DjangoFilterConnectionField(RoomType) all_rooms = DjangoFilterConnectionField(RoomType)
all_room_entries = DjangoFilterConnectionField(RoomEntryNode)
room_entry = relay.Node.Field(RoomEntryNode)
def resolve_room(self, info, **kwargs): def resolve_room(self, info, **kwargs):
slug = kwargs.get('slug') slug = kwargs.get('slug')

View File

@ -3,16 +3,28 @@ 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 rooms.models import Room from user.models import UserGroup, User
from user.models import UserGroup
class UserGroupNode(DjangoObjectType): class UserNode(DjangoObjectType):
pk = graphene.Int() pk = graphene.Int()
class Meta: class Meta:
model = UserGroup model = User
filter_fields = ['pk', 'name'] 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,) interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs): def resolve_pk(self, *args, **kwargs):