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"
raven = "==6.9.0"
django-extensions = "==1.9.8"
graphene-django = "==2.0.0"
django-filter = "==2.0.0.dev1"
graphene-django = "==2.2.0"
django-filter = "==2.0.0"
djangorestframework = "==3.8.2"
pillow = "==5.0.0"
wagtail = "==2.2.2"
django-cors-headers = "==2.2.0"

69
Pipfile.lock generated
View File

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

View File

@ -1,17 +1,24 @@
<template>
<div class="new-room">
<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>
<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>
<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>
<room-colors></room-colors>
<room-colors
:selected-color="room.appearance"
v-on:input="updateColor"
></room-colors>
</div>
<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>
</div>
</div>
@ -21,13 +28,58 @@
<script>
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 {
components: {
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() {
this.$store.dispatch('setSpecialContainerClass', 'red');
this.$store.dispatch('setSpecialContainerClass', defaultColor);
},
beforeDestroy() {

View File

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

View File

@ -56,15 +56,7 @@
-ms-grid-rows: 210px 1fr;
-ms-grid-columns: 1fr;
&--red {
background-color: $red;
}
&--green {
background-color: $green;
}
&--brown {
background-color: $brown;
}
@include skillbox-colors;
svg {
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 {
node {
id
pk
name
year
isDeleted

View File

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

View File

@ -11,3 +11,19 @@
font-size: 1rem;
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 filteredbook.schema import BookQuery
from objectives.schema import ObjectivesQuery
from rooms.schema import RoomsQuery
from rooms.schema import RoomsQuery, RoomMutations
from user.schema import UsersQuery
@ -20,7 +20,7 @@ class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, graphene.ObjectT
debug = graphene.Field(DjangoDebug, name='__debug')
class Mutation(graphene.ObjectType, BookMutations):
class Mutation(BookMutations, RoomMutations, graphene.ObjectType):
if settings.DEBUG:
debug = graphene.Field(DjangoDebug, name='__debug')

View File

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

View File

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