Merge branch 'feature/add-room-cherry-picked'

This commit is contained in:
Ramon Wenger 2018-09-17 18:56:54 +02:00
commit ba2b77199a
13 changed files with 180 additions and 83 deletions

View File

@ -21,8 +21,9 @@ python-dotenv = "==0.7.1"
dj-database-url = "==0.4.1" dj-database-url = "==0.4.1"
raven = "==6.9.0" raven = "==6.9.0"
django-extensions = "==1.9.8" django-extensions = "==1.9.8"
graphene-django = "==2.0.0" graphene-django = "==2.2.0"
django-filter = "==2.0.0.dev1" django-filter = "==2.0.0"
djangorestframework = "==3.8.2"
pillow = "==5.0.0" pillow = "==5.0.0"
wagtail = "==2.2.2" wagtail = "==2.2.2"
django-cors-headers = "==2.2.0" django-cors-headers = "==2.2.0"

69
Pipfile.lock generated
View File

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "a9b9215ef6546bd1d78142e5a1918cb4ba623ff8dd878db3761baa0866c39527" "sha256": "2341eacc0bfdcc8c231c5ebf696c89360052a264240118f3b509c927aeaf611b"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@ -41,18 +41,18 @@
}, },
"boto3": { "boto3": {
"hashes": [ "hashes": [
"sha256:3937eaba7cc429d1593824397f1d7dda4c9565c1269e8d3f665cee3c1b1b955c", "sha256:2152e0da8098665e6a03bbbde1de1b4fafdef7151010d1f0e53693a3f2a1deb0",
"sha256:ae1bc72a3921807ef8c0daa6c4bd147e6caa630df263e5ea5e8c36535e17ee73" "sha256:323660fd1aa9c95fe90003f44c5fc37cbb891a8b506fa346967d14edcbcb90a4"
], ],
"index": "pypi", "index": "pypi",
"version": "==1.8.9" "version": "==1.9.4"
}, },
"botocore": { "botocore": {
"hashes": [ "hashes": [
"sha256:1294d1422b278dac28869d5b96156171dd8d5b609da28fec006add8a81a31dfa", "sha256:3b2cab368572ee987a6236321ddea491e4253c819009c87ebc9e42e60371e3ae",
"sha256:91c32b97dd2f1046b1de3ce5c8bc19cf4993bc631864c9fcbf51f261bc3a7aab" "sha256:7834eba53c6bedea21eb76f25a39e477dede3a24aeb51ff19c0248ea8348f007"
], ],
"version": "==1.11.9" "version": "==1.12.4"
}, },
"certifi": { "certifi": {
"hashes": [ "hashes": [
@ -123,11 +123,11 @@
}, },
"django-filter": { "django-filter": {
"hashes": [ "hashes": [
"sha256:57c12c8ed40861e8ec7219ea65adcdd92ed0ea4c5b76a86f9ff9216a80dd5af7", "sha256:6f4e4bc1a11151178520567b50320e5c32f8edb552139d93ea3e30613b886f56",
"sha256:57c5507b0011058a7f2d2227b7ef9fea27e69e53ef65da6d2fbd0b27cdaafed3" "sha256:86c3925020c27d072cdae7b828aaa5d165c2032a629abbe3c3a1be1edae61c58"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.0.0.dev1" "version": "==2.0.0"
}, },
"django-libsass": { "django-libsass": {
"hashes": [ "hashes": [
@ -168,7 +168,7 @@
"sha256:b6714c3e4b0f8d524f193c91ecf5f5450092c2145439ac2769711f7eba89a9d9", "sha256:b6714c3e4b0f8d524f193c91ecf5f5450092c2145439ac2769711f7eba89a9d9",
"sha256:c375e4f95a3a64fccac412e36fb42ba36881e52313ec021ef410b40f67cddca4" "sha256:c375e4f95a3a64fccac412e36fb42ba36881e52313ec021ef410b40f67cddca4"
], ],
"markers": "python_version != '3.3.*' and python_version >= '2.7' and python_version != '3.2.*' and python_version != '3.0.*' and python_version != '3.1.*'", "index": "pypi",
"version": "==3.8.2" "version": "==3.8.2"
}, },
"docutils": { "docutils": {
@ -195,10 +195,11 @@
}, },
"faker": { "faker": {
"hashes": [ "hashes": [
"sha256:ea7cfd3aeb1544732d08bd9cfba40c5b78e3a91e17b1a0698ab81bfc5554c628", "sha256:74b32991f8e08e4f2f84858b919eca253becfaec4b3fa5fcff7fdbd70d5d78b1",
"sha256:f6d67f04abfb2b4bea7afc7fa6c18cf4c523a67956e455668be9ae42bccc21ad" "sha256:c2ce42dd8361e6d392276006d757532562463c8642b1086709584200b7fd7758"
], ],
"version": "==0.9.0" "markers": "python_version >= '2.7' and python_version != '3.1.*' and python_version != '3.0.*' and python_version != '3.2.*'",
"version": "==0.9.1"
}, },
"graphene": { "graphene": {
"hashes": [ "hashes": [
@ -209,11 +210,11 @@
}, },
"graphene-django": { "graphene-django": {
"hashes": [ "hashes": [
"sha256:5cabf46b59f242a533fe1df1912c87d5ad6606246937609be2e6c9086cfdf7a4", "sha256:3afd81d47c8b702650e05cc1179fac1cfceae991d241bb164d51f28bed9ec95c",
"sha256:70d9358bc48c806b6a9458e8344f0a1211cd1f1ef923a092aa55e6bcacc2c3fc" "sha256:760a18068feb5457e2ec00d2447c09b2fbac2a6b8c32cc8be2abce3752107ad3"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.0.0" "version": "==2.2.0"
}, },
"graphql-core": { "graphql-core": {
"hashes": [ "hashes": [
@ -250,14 +251,6 @@
], ],
"version": "==2.7" "version": "==2.7"
}, },
"iso8601": {
"hashes": [
"sha256:210e0134677cc0d02f6028087fee1df1e1d76d372ee1db0bf30bf66c5c1c89a3",
"sha256:49c4b20e1f38aa5cf109ddcd39647ac419f928512c869dc01d5c7098eddede82",
"sha256:bbbae5fb4a7abfe71d4688fd64bff70b91bbd74ef6a99d964bab18f7fdf286dd"
],
"version": "==0.1.12"
},
"jmespath": { "jmespath": {
"hashes": [ "hashes": [
"sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64", "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64",
@ -403,7 +396,7 @@
"sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
"sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a"
], ],
"markers": "python_version != '3.3.*' and python_version < '4' and python_version != '3.2.*' and python_version != '3.1.*' and python_version >= '2.6' and python_version != '3.0.*'", "markers": "python_version != '3.3.*' and python_version != '3.2.*' and python_version < '4' and python_version != '3.1.*' and python_version >= '2.6' and python_version != '3.0.*'",
"version": "==2.19.1" "version": "==2.19.1"
}, },
"rjsmin": { "rjsmin": {
@ -467,7 +460,7 @@
"sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
"sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
], ],
"markers": "python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.1.*' and python_version < '4' and python_version >= '2.6' and python_version != '3.2.*'", "markers": "python_version != '3.1.*' and python_version != '3.0.*' and python_version < '4' and python_version >= '2.6' and python_version != '3.2.*' and python_version != '3.3.*'",
"version": "==1.23" "version": "==1.23"
}, },
"wagtail": { "wagtail": {
@ -506,13 +499,21 @@
} }
}, },
"develop": { "develop": {
"appnope": {
"hashes": [
"sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0",
"sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"
],
"markers": "sys_platform == 'darwin'",
"version": "==0.1.0"
},
"awscli": { "awscli": {
"hashes": [ "hashes": [
"sha256:ef7145fe16d4995121868237dc30051dc9238af6211f9dc57cfb1937ea962990", "sha256:27009baa405935d7229ca551d9433e029a05d68fbc99548e1cbe8fc759b5af43",
"sha256:f953de87b96fc9d237603146c34b0b979ebc31e0f2eb43ce77deb7ab563b47dd" "sha256:6d1509d1b00618ad2bda119eb6e6f1a427b22eff006c0f705d3f8b5e3fea0932"
], ],
"index": "pypi", "index": "pypi",
"version": "==1.16.9" "version": "==1.16.14"
}, },
"backcall": { "backcall": {
"hashes": [ "hashes": [
@ -523,10 +524,10 @@
}, },
"botocore": { "botocore": {
"hashes": [ "hashes": [
"sha256:1294d1422b278dac28869d5b96156171dd8d5b609da28fec006add8a81a31dfa", "sha256:3b2cab368572ee987a6236321ddea491e4253c819009c87ebc9e42e60371e3ae",
"sha256:91c32b97dd2f1046b1de3ce5c8bc19cf4993bc631864c9fcbf51f261bc3a7aab" "sha256:7834eba53c6bedea21eb76f25a39e477dede3a24aeb51ff19c0248ea8348f007"
], ],
"version": "==1.11.9" "version": "==1.12.4"
}, },
"colorama": { "colorama": {
"hashes": [ "hashes": [
@ -699,7 +700,7 @@
"sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
"sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
], ],
"markers": "python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.1.*' and python_version < '4' and python_version >= '2.6' and python_version != '3.2.*'", "markers": "python_version != '3.1.*' and python_version != '3.0.*' and python_version < '4' and python_version >= '2.6' and python_version != '3.2.*' and python_version != '3.3.*'",
"version": "==1.23" "version": "==1.23"
}, },
"wcwidth": { "wcwidth": {

View File

@ -1,17 +1,24 @@
<template> <template>
<div class="new-room"> <div class="new-room">
<div class="new-room__content"> <div class="new-room__content">
<h1 class="new-room__heading">Neues Board</h1> <h1 class="new-room__heading">Neues Board {{room.title}}</h1>
<h2 class="new-room__property-heading">Titel</h2> <h2 class="new-room__property-heading">Titel</h2>
<input class="skillbox-input new-room__input"> <input class="skillbox-input new-room__input" v-model="room.title">
<h2 class="new-room__property-heading">Beschreibung</h2> <h2 class="new-room__property-heading">Beschreibung</h2>
<textarea class="skillbox-textarea new-room__textarea"></textarea> <textarea class="skillbox-textarea new-room__textarea" v-model="room.description"></textarea>
<h2 class="new-room__property-heading">Farbe</h2> <h2 class="new-room__property-heading">Farbe</h2>
<room-colors></room-colors> <room-colors
:selected-color="room.appearance"
v-on:input="updateColor"
></room-colors>
</div> </div>
<div class="new-room__footer"> <div class="new-room__footer">
<button class="button button--primary new-room__save-button">Speichern</button> <button
class="button button--primary new-room__save-button"
@click="addRoom(room)"
>Speichern
</button>
<button class="button">Abbrechen</button> <button class="button">Abbrechen</button>
</div> </div>
</div> </div>
@ -21,13 +28,58 @@
<script> <script>
import RoomColors from '@/components/rooms/RoomColors'; import RoomColors from '@/components/rooms/RoomColors';
import ADD_ROOM_MUTATION from '@/graphql/gql/mutations/addRoom.gql';
import ROOMS_QUERY from '@/graphql/gql/roomsQuery.gql';
const defaultColor = 'blue';
export default { export default {
components: { components: {
RoomColors RoomColors
}, },
data() {
return {
room: {
appearance: defaultColor,
title: '',
description: '',
userGroup: 1
}
}
},
methods: {
updateColor(newColor) {
this.room.appearance = newColor;
this.$store.dispatch('setSpecialContainerClass', newColor);
},
addRoom(room) {
this.$apollo.mutate({
mutation: ADD_ROOM_MUTATION,
variables: {
input: {
title: room.title,
description: room.description,
userGroup: 1,
appearance: room.appearance
}
},
update: (store, {data: {addRoom}}) => {
const data = store.readQuery({query: ROOMS_QUERY});
if (data.allRooms) {
data.allRooms.edges.push({node: addRoom});
store.writeQuery({query: ROOMS_QUERY, data});
}
}
}).then(() => {
this.$router.push('/rooms');
});
}
},
created() { created() {
this.$store.dispatch('setSpecialContainerClass', 'red'); this.$store.dispatch('setSpecialContainerClass', defaultColor);
}, },
beforeDestroy() { beforeDestroy() {

View File

@ -1,9 +1,12 @@
<template> <template>
<div class="room-colors"> <div class="room-colors">
<div v-for="color in colors" class="room-colors__color-wrapper" <div v-for="(color, index) in colors"
:class="{'room-colors__color-wrapper--selected': color.selected}"> :key="index"
class="room-colors__color-wrapper"
@click="$emit('input', color.name)"
:class="{'room-colors__color-wrapper--selected': selectedColor === color.name}">
<div class="room-colors__color" :class="'room-colors__color--' + color.name"> <div class="room-colors__color" :class="'room-colors__color--' + color.name">
<tick class="room-colors__selected-icon" v-if="color.selected"></tick> <tick class="room-colors__selected-icon" v-if="selectedColor === color.name"></tick>
</div> </div>
</div> </div>
</div> </div>
@ -13,12 +16,13 @@
import Tick from '@/components/icons/Tick'; import Tick from '@/components/icons/Tick';
export default { export default {
props: ['selected-color'],
data() { data() {
return { return {
colors: [ colors: [
{ {
name: 'yellow', name: 'yellow'
selected: true
}, },
{ {
name: 'blue' name: 'blue'
@ -41,6 +45,7 @@
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/_variables.scss"; @import "@/styles/_variables.scss";
@import "@/styles/_mixins.scss";
.room-colors { .room-colors {
display: flex; display: flex;
@ -68,18 +73,7 @@
justify-items: center; justify-items: center;
align-items: center; align-items: center;
&--yellow { @include skillbox-colors;
background-color: $color-accent-1;
}
&--blue {
background-color: $color-accent-2;
}
&--red {
background-color: $color-accent-3;
}
&--green {
background-color: $color-accent-4;
}
} }
} }
</style> </style>

View File

@ -56,15 +56,7 @@
-ms-grid-rows: 210px 1fr; -ms-grid-rows: 210px 1fr;
-ms-grid-columns: 1fr; -ms-grid-columns: 1fr;
&--red { @include skillbox-colors;
background-color: $red;
}
&--green {
background-color: $green;
}
&--brown {
background-color: $brown;
}
svg { svg {
width: 30px; width: 30px;

View File

@ -0,0 +1,27 @@
mutation AddRoomMutation($input: RoomMutationInput!) {
addRoom(input: $input) {
id
title
slug
title
description
appearance
userGroup
__typename
clientMutationId
errors {
field
messages
}
}
}
#{
# "input": {
# "title": "Neuer Raum",
# "description": "So eine Beschreibung",
# "userGroup": 4
#}
#}

View File

@ -3,6 +3,7 @@ query UserGroupsQuery {
edges { edges {
node { node {
id id
pk
name name
year year
isDeleted isDeleted

View File

@ -46,6 +46,7 @@
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/styles/_variables.scss"; @import "@/styles/_variables.scss";
@import "@/styles/_mixins.scss";
.skillbox { .skillbox {
margin: 0 auto; margin: 0 auto;
@ -64,17 +65,7 @@
-ms-grid-rows: auto 32px 1fr; // 1 extra row for gap -ms-grid-rows: auto 32px 1fr; // 1 extra row for gap
-ms-grid-columns: 1fr; -ms-grid-columns: 1fr;
&--red { // todo: define a better name when usage is clear @include skillbox-colors;
background-color: $red;
}
&--green { // todo: define a better name when usage is clear
background-color: $green;
}
&--brown { // todo: define a better name when usage is clear
background-color: $brown;
}
&__header { &__header {
grid-area: h; grid-area: h;

View File

@ -11,3 +11,19 @@
font-size: 1rem; font-size: 1rem;
fill: $color-darkgrey-1; fill: $color-darkgrey-1;
} }
@mixin skillbox-colors {
&--yellow {
background-color: $color-accent-1;
}
&--blue {
background-color: $color-accent-2;
}
&--red {
background-color: $color-accent-3;
}
&--green {
background-color: $color-accent-4;
}
}

View File

@ -9,7 +9,7 @@ from api import graphene_wagtail
from book.schema.mutations import BookMutations from book.schema.mutations import BookMutations
from filteredbook.schema import BookQuery from filteredbook.schema import BookQuery
from objectives.schema import ObjectivesQuery from objectives.schema import ObjectivesQuery
from rooms.schema import RoomsQuery from rooms.schema import RoomsQuery, RoomMutations
from user.schema import UsersQuery from user.schema import UsersQuery
@ -20,7 +20,7 @@ class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, graphene.ObjectT
debug = graphene.Field(DjangoDebug, name='__debug') debug = graphene.Field(DjangoDebug, name='__debug')
class Mutation(graphene.ObjectType, BookMutations): class Mutation(BookMutations, RoomMutations, graphene.ObjectType):
if settings.DEBUG: if settings.DEBUG:
debug = graphene.Field(DjangoDebug, name='__debug') debug = graphene.Field(DjangoDebug, name='__debug')

View File

@ -177,7 +177,7 @@ data = [
}, },
{ {
'title': 'Interview «Mein neues Umfeld»', 'title': 'Interview «Mein neues Umfeld»',
'appearance': 'brown' 'appearance': 'blue'
} }
] ]

View File

@ -2,8 +2,10 @@ import graphene
from graphene import relay 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 graphene_django.rest_framework.mutation import SerializerMutation
from rooms.models import Room, RoomEntry from rooms.models import Room, RoomEntry
from rooms.serializers import RoomSerializer
from user.schema import UserNode from user.schema import UserNode
@ -37,8 +39,9 @@ class RoomNode(DjangoObjectType):
class RoomsQuery(object): class RoomsQuery(object):
room = graphene.Field(RoomNode, slug=graphene.String(), id=graphene.Int(), appearance=graphene.String()) # room = relay.Node.Field(RoomNode)
room_entry = relay.Node.Field(RoomEntryNode) room_entry = relay.Node.Field(RoomEntryNode)
room = graphene.Field(RoomNode, slug=graphene.String(), id=graphene.Int(), appearance=graphene.String())
all_rooms = DjangoFilterConnectionField(RoomNode) all_rooms = DjangoFilterConnectionField(RoomNode)
all_room_entries = DjangoFilterConnectionField(RoomEntryNode) all_room_entries = DjangoFilterConnectionField(RoomEntryNode)
@ -52,3 +55,12 @@ class RoomsQuery(object):
if slug is not None: if slug is not None:
return Room.objects.get(slug=slug) return Room.objects.get(slug=slug)
return None return None
class RoomMutation(SerializerMutation):
class Meta:
serializer_class = RoomSerializer
class RoomMutations:
add_room = RoomMutation.Field()

View File

@ -0,0 +1,10 @@
from rest_framework import serializers
from rooms.models import Room
class RoomSerializer(serializers.ModelSerializer):
class Meta:
model = Room
fields = ('id', 'title', 'description', 'slug', 'user_group', 'appearance', )
read_only_fields = ('id', 'slug', )