From d9f07c1adbdf0b2ec0692da364e2b4736c9d4b6a Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 27 Mar 2019 09:33:12 +0100 Subject: [PATCH 1/9] refactor widget footer, add possibility to delete project --- client/src/components/WidgetFooter.vue | 11 +- .../components/portfolio/ProjectWidget.vue | 43 ++++++- client/src/components/rooms/RoomWidget.vue | 21 ++- client/src/components/rooms/WidgetPopover.vue | 33 +++-- .../graphql/gql/mutations/deleteProject.gql | 7 + server/portfolio/factories.py | 17 +++ .../migrations/0003_auto_20190325_1452.py | 27 ++++ server/portfolio/models.py | 3 + server/portfolio/mutations.py | 36 +++++- server/portfolio/schema.py | 10 +- server/portfolio/serializers.py | 2 +- server/portfolio/tests/__init__.py | 10 ++ .../portfolio/tests/test_project_mutations.py | 62 +++++++++ server/portfolio/tests/test_project_query.py | 120 ++++++++++++++++++ .../test_room_delete_edit_permissions.py | 1 - server/users/services.py | 3 - 16 files changed, 363 insertions(+), 43 deletions(-) create mode 100644 client/src/graphql/gql/mutations/deleteProject.gql create mode 100644 server/portfolio/factories.py create mode 100644 server/portfolio/migrations/0003_auto_20190325_1452.py create mode 100644 server/portfolio/tests/__init__.py create mode 100644 server/portfolio/tests/test_project_mutations.py create mode 100644 server/portfolio/tests/test_project_query.py diff --git a/client/src/components/WidgetFooter.vue b/client/src/components/WidgetFooter.vue index 9ec6e1a5..cc06f221 100644 --- a/client/src/components/WidgetFooter.vue +++ b/client/src/components/WidgetFooter.vue @@ -3,12 +3,10 @@ - + + + @@ -17,7 +15,6 @@ import WidgetPopover from '@/components/rooms/WidgetPopover'; export default { - props: ['on-delete', 'on-edit', 'id', 'entity'], components: { Ellipses, diff --git a/client/src/components/portfolio/ProjectWidget.vue b/client/src/components/portfolio/ProjectWidget.vue index e96bd94e..5e9d277b 100644 --- a/client/src/components/portfolio/ProjectWidget.vue +++ b/client/src/components/portfolio/ProjectWidget.vue @@ -7,19 +7,25 @@ - + + + + + diff --git a/client/src/components/rooms/RoomWidget.vue b/client/src/components/rooms/RoomWidget.vue index e0562355..aff1f758 100644 --- a/client/src/components/rooms/RoomWidget.vue +++ b/client/src/components/rooms/RoomWidget.vue @@ -5,13 +5,9 @@ - + + + @@ -58,27 +54,28 @@ }, methods: { - deleteRoom(id) { + deleteRoom() { + const theId = this.id this.$apollo.mutate({ mutation: DELETE_ROOM_MUTATION, variables: { input: { - id + id: theId } }, update(store, {data: {deleteRoom: {success}}}) { if (success) { const data = store.readQuery({query: ROOMS_QUERY}); if (data) { - data.rooms.edges.splice(data.rooms.edges.findIndex(edge => edge.node.id === id), 1); + data.rooms.edges.splice(data.rooms.edges.findIndex(edge => edge.node.id === theId), 1); store.writeQuery({query: ROOMS_QUERY, data}); } } } }) }, - editRoom(id) { - this.$router.push({name: 'edit-room', params: {id: id}}); + editRoom() { + this.$router.push({name: 'edit-room', params: {id: this.id}}); } } } diff --git a/client/src/components/rooms/WidgetPopover.vue b/client/src/components/rooms/WidgetPopover.vue index 45d53c24..e5a8f8c3 100644 --- a/client/src/components/rooms/WidgetPopover.vue +++ b/client/src/components/rooms/WidgetPopover.vue @@ -1,14 +1,13 @@ diff --git a/client/src/components/portfolio/ProjectWidget.vue b/client/src/components/portfolio/ProjectWidget.vue index 5e9d277b..a9317657 100644 --- a/client/src/components/portfolio/ProjectWidget.vue +++ b/client/src/components/portfolio/ProjectWidget.vue @@ -8,18 +8,16 @@ - - - + diff --git a/server/portfolio/inputs.py b/server/portfolio/inputs.py index 584b8018..ecfda7a3 100644 --- a/server/portfolio/inputs.py +++ b/server/portfolio/inputs.py @@ -15,6 +15,7 @@ class AddProjectArgument(ProjectInput): class UpdateProjectArgument(ProjectInput): id = graphene.ID(required=True) + final = graphene.Boolean() class ProjectEntryInput(InputObjectType): @@ -29,3 +30,4 @@ class AddProjectEntryArgument(ProjectEntryInput): class UpdateProjectEntryArgument(ProjectEntryInput): id = graphene.ID(required=True) + diff --git a/server/portfolio/mutations.py b/server/portfolio/mutations.py index 985c6302..8e6dee3f 100644 --- a/server/portfolio/mutations.py +++ b/server/portfolio/mutations.py @@ -41,8 +41,10 @@ class MutateProject(relay.ClientIDMutation): # serializer_class = ProjectSerializer @classmethod - def mutate_and_get_payload(cls, *args, **kwargs): + def mutate_and_get_payload(cls, root, info, **kwargs): data = kwargs.get('project') + data['student'] = info.context.user.id + if data.get('id') is not None: entity = get_object(Project, data['id']) serializer = ProjectSerializer(entity, data=data) diff --git a/server/portfolio/serializers.py b/server/portfolio/serializers.py index 939a9f98..dc19d3b3 100644 --- a/server/portfolio/serializers.py +++ b/server/portfolio/serializers.py @@ -6,7 +6,7 @@ from portfolio.models import Project, ProjectEntry class ProjectSerializer(serializers.ModelSerializer): class Meta: model = Project - fields = ('id', 'title', 'description', 'objectives', 'slug', 'appearance', 'student',) + fields = ('id', 'title', 'description', 'objectives', 'slug', 'appearance', 'student', 'final',) read_only_fields = ('id', 'slug',) From 0e1bca4c787c55ff57599a9c636b2f40bb8e0e47 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 27 Mar 2019 14:20:21 +0100 Subject: [PATCH 3/9] add unshare for projects --- client/src/components/portfolio/ProjectWidget.vue | 14 ++++++++++---- client/src/graphql/gql/fragments/projectParts.gql | 1 + client/src/pages/portfolio.vue | 6 +++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/client/src/components/portfolio/ProjectWidget.vue b/client/src/components/portfolio/ProjectWidget.vue index a9317657..9e54ec83 100644 --- a/client/src/components/portfolio/ProjectWidget.vue +++ b/client/src/components/portfolio/ProjectWidget.vue @@ -5,13 +5,13 @@ - @@ -23,7 +23,7 @@ import WidgetFooter from '@/components/WidgetFooter'; export default { - props: ['title', 'appearance', 'slug', 'id'], + props: ['title', 'appearance', 'slug', 'id', 'final'], components: { WidgetFooter, @@ -39,8 +39,14 @@ methods: { share: function (scope) { + this.updateShare(scope, true); + }, + unshare: function (scope) { + this.updateShare(scope, false); + }, + updateShare: function (scope, state) { scope.hide(); - this.$emit('share', this.id); + this.$emit('updateShare', this.id, state); } } } diff --git a/client/src/graphql/gql/fragments/projectParts.gql b/client/src/graphql/gql/fragments/projectParts.gql index 04cf7c9c..c0d1a8b5 100644 --- a/client/src/graphql/gql/fragments/projectParts.gql +++ b/client/src/graphql/gql/fragments/projectParts.gql @@ -5,4 +5,5 @@ fragment ProjectParts on ProjectNode { description slug objectives + final } diff --git a/client/src/pages/portfolio.vue b/client/src/pages/portfolio.vue index b156f63a..cb5425cb 100644 --- a/client/src/pages/portfolio.vue +++ b/client/src/pages/portfolio.vue @@ -7,7 +7,7 @@ v-for="project in projects" v-bind="project" @delete="deleteProject" - @share="shareProject" + @updateShare="updateShareState" @edit="editProject" :key="project.id" class="portfolio__project" @@ -69,7 +69,7 @@ editProject(id) { this.$router.push({name: 'edit-project', params: { id }}); }, - shareProject(id) { + updateShareState(id, state) { const project = this.projects.filter(project => project.id === id)[0]; this.$apollo.mutate({ mutation: UPDATE_PROJECT_MUTATION, @@ -81,7 +81,7 @@ description: project.description, appearance: project.appearance, objectives: project.objectives, - final: true + final: state } } } From cdd31516cf90dc6c38ded28d3fc4366ad3be2495 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 27 Mar 2019 15:26:12 +0100 Subject: [PATCH 4/9] hide portfolio menu on role condition --- client/src/components/WidgetFooter.vue | 3 ++- .../components/portfolio/ProjectWidget.vue | 4 ++-- client/src/pages/portfolio.vue | 24 ++++++++++++++----- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/client/src/components/WidgetFooter.vue b/client/src/components/WidgetFooter.vue index 1de28b7c..ec3db215 100644 --- a/client/src/components/WidgetFooter.vue +++ b/client/src/components/WidgetFooter.vue @@ -1,6 +1,7 @@