From c8449e7fe94cb5781660adaa33fc94606664bae1 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 27 Feb 2020 13:58:49 +0100 Subject: [PATCH 01/98] Fix some IE 10 issues --- client/src/components/HeaderBar.vue | 5 +++-- client/src/pages/module-base.vue | 2 +- client/src/styles/_default-layout.scss | 29 +++++--------------------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/client/src/components/HeaderBar.vue b/client/src/components/HeaderBar.vue index e4f9e03b..6416615e 100644 --- a/client/src/components/HeaderBar.vue +++ b/client/src/components/HeaderBar.vue @@ -50,7 +50,8 @@ @import "@/styles/_mixins.scss"; .header-bar { - display: -ms-grid; + display: flex; + flex-direction: row; @supports (display: grid) { display: none; @@ -59,7 +60,7 @@ } } align-items: center; - justify-content: space-around; + justify-content: space-between; background-color: $color-white; grid-auto-rows: 50px; width: 100%; diff --git a/client/src/pages/module-base.vue b/client/src/pages/module-base.vue index d9e6c60d..faf0777a 100644 --- a/client/src/pages/module-base.vue +++ b/client/src/pages/module-base.vue @@ -19,7 +19,7 @@ @import "@/styles/_mixins.scss"; .module-page { - display: -ms-grid; + display: flex; @supports (display: grid) { display: grid; } diff --git a/client/src/styles/_default-layout.scss b/client/src/styles/_default-layout.scss index d6fd7f87..e3da0b86 100644 --- a/client/src/styles/_default-layout.scss +++ b/client/src/styles/_default-layout.scss @@ -4,6 +4,11 @@ .skillbox { margin: 0 auto; width: 100%; + /* + * For IE10+ + */ + display: flex; + flex-direction: column; @supports (display: grid) { display: grid; } @@ -34,39 +39,15 @@ -ms-grid-column: 1; } - /* - * For IE10+ - */ - display: -ms-grid; - -ms-grid-rows: 50px 30px auto; // 1 extra row for gap - -ms-grid-columns: 1fr; - @include skillbox-colors; &__header { grid-area: h; - -ms-grid-row: 1; } - &__content { - -ms-grid-row: 3; - -ms-grid-column: 1; - } &__footer { grid-area: f; display: none; } - - /* - * For IE10+ - */ - & > :nth-child(2) { - - } - - & > :nth-child(3) { - -ms-grid-row: 4; - -ms-grid-column: 1; - } } From fffbc47fde64c05cbdcd52381c198c55451c01b5 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 27 Feb 2020 14:21:56 +0100 Subject: [PATCH 02/98] Change profile layout --- client/src/components/profile/Profile.vue | 3 +- client/src/pages/profile.vue | 35 +++----------------- client/src/styles/_uploadcare_overwrite.scss | 10 +++--- 3 files changed, 12 insertions(+), 36 deletions(-) diff --git a/client/src/components/profile/Profile.vue b/client/src/components/profile/Profile.vue index 3a372444..658682fe 100644 --- a/client/src/components/profile/Profile.vue +++ b/client/src/components/profile/Profile.vue @@ -1,7 +1,6 @@ @@ -89,9 +93,11 @@ order: 3; border-bottom: 0; } + &:nth-child(2) { order: 1; } + &:nth-child(3) { order: 2; } From 4173fe70ab20f22cf77608888da3617534891e59 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 24 Mar 2020 16:16:13 +0100 Subject: [PATCH 54/98] Add confirmation modal when deactivating users in school class --- client/src/App.vue | 4 +- .../components/profile/DeactivatePerson.vue | 118 ++++++++++++++++++ client/src/pages/myClass.vue | 11 +- client/src/store/index.js | 37 +++++- 4 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 client/src/components/profile/DeactivatePerson.vue diff --git a/client/src/App.vue b/client/src/App.vue index 210e0254..3d27aa5b 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -27,6 +27,7 @@ import FullscreenImage from '@/components/FullscreenImage'; import FullscreenInfographic from '@/components/FullscreenInfographic'; import FullscreenVideo from '@/components/FullscreenVideo'; + import DeactivatePerson from '@/components/profile/DeactivatePerson'; import {mapGetters} from 'vuex'; @@ -53,7 +54,8 @@ EditClassNameWizard, FullscreenImage, FullscreenInfographic, - FullscreenVideo + FullscreenVideo, + DeactivatePerson }, computed: { diff --git a/client/src/components/profile/DeactivatePerson.vue b/client/src/components/profile/DeactivatePerson.vue new file mode 100644 index 00000000..756ea2a6 --- /dev/null +++ b/client/src/components/profile/DeactivatePerson.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/client/src/pages/myClass.vue b/client/src/pages/myClass.vue index 7cf4b50e..688d2891 100644 --- a/client/src/pages/myClass.vue +++ b/client/src/pages/myClass.vue @@ -61,7 +61,16 @@ this.changeMember(member, true); }, remove(member) { - this.changeMember(member, false); + this.$store.dispatch('deactivateUser', [ + member.id === this.me.id, // myself + `${member.firstName} ${member.lastName}`, // full name + this.me.selectedClass.name // class name + ]) + .then(() => { + this.changeMember(member, false); + }) + .catch(() => { + }); } }, } diff --git a/client/src/store/index.js b/client/src/store/index.js index 42328442..8cd14dd3 100644 --- a/client/src/store/index.js +++ b/client/src/store/index.js @@ -1,7 +1,7 @@ import Vue from 'vue' import Vuex from 'vuex' -Vue.use(Vuex) +Vue.use(Vuex); // WARNING fixme todo: please do not use this anymore, use the local GraphQL cache export default new Vuex.Store({ @@ -33,7 +33,10 @@ export default new Vuex.Store({ scrollToAssignmentId: '', scrollToAssignmentReady: false, scrollingToAssignment: false, - editModule: false + editModule: false, + modulePayload: [], + modalResolve: () => {}, + modalReject: () => {}, }, getters: { @@ -50,12 +53,21 @@ export default new Vuex.Store({ currentNote: state => state.currentNote, currentNoteParent: state => state.currentNoteParent, noteType: state => state.noteType, + modulePayload: state => state.modulePayload }, actions: { setSpecialContainerClass({commit}, payload) { commit('setSpecialContainerClass', payload); }, + confirmModal({dispatch, state}) { + dispatch('hideModal'); + state.modalResolve(); + }, + cancelModal({dispatch, state}) { + dispatch('hideModal'); + state.modalReject(); + }, hideModal({commit, dispatch}) { document.body.classList.remove('no-scroll'); // won't get at the body any other way commit('setModal', false); @@ -80,6 +92,7 @@ export default new Vuex.Store({ commit('setVimeoId', null); commit('setCurrentNote', null); commit('setNoteType', ''); + commit('setModulePayload', []); }, resetContentBlockPosition({commit}) { commit('setContentBlockPosition', {}); @@ -109,7 +122,12 @@ export default new Vuex.Store({ }, showModal({commit}, payload) { document.body.classList.add('no-scroll'); // won't get at the body any other way + commit('setModal', payload); + return new Promise((resolve, reject) => { + commit('setModalResolve', resolve); + commit('setModalReject', reject); + }) }, addProjectEntry({commit, dispatch}, payload) { commit('setParentProject', payload); @@ -167,8 +185,12 @@ export default new Vuex.Store({ editModule({commit}, payload) { commit('setEditModule', payload) }, - editClassName({commit, dispatch}, payload) { + editClassName({dispatch}, payload) { dispatch('showModal', 'edit-class-name-wizard'); + }, + deactivateUser({commit, dispatch}, payload) { + commit('setModulePayload', payload); + return dispatch('showModal', 'deactivate-person'); } }, @@ -244,6 +266,15 @@ export default new Vuex.Store({ }, setNoteType(state, payload) { state.noteType = payload; + }, + setModulePayload(state, payload) { + state.modulePayload = payload; + }, + setModalResolve(state, payload) { + state.modalResolve = payload; + }, + setModalReject(state, payload) { + state.modalReject = payload; } } }) From b13ca67d7859230359baab1ec5aedb3f4a4a2d06 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 24 Mar 2020 16:23:46 +0100 Subject: [PATCH 55/98] Fix section title block --- client/src/components/content-blocks/ContentComponent.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/components/content-blocks/ContentComponent.vue b/client/src/components/content-blocks/ContentComponent.vue index 4332a037..9f40af6e 100644 --- a/client/src/components/content-blocks/ContentComponent.vue +++ b/client/src/components/content-blocks/ContentComponent.vue @@ -32,6 +32,7 @@ import ThinglinkBlock from '@/components/content-blocks/ThinglinkBlock'; import GeniallyBlock from '@/components/content-blocks/GeniallyBlock'; import SubtitleBlock from '@/components/content-blocks/SubtitleBlock'; + import SectionTitleBlock from '@/components/content-blocks/SectionTitleBlock'; import ContentListBlock from '@/components/content-blocks/ContentListBlock'; import ModuleRoomSlug from '@/components/content-blocks/ModuleRoomSlug'; import Assignment from '@/components/content-blocks/assignment/Assignment'; @@ -56,6 +57,7 @@ 'infogram_block': InfogramBlock, 'genially_block': GeniallyBlock, 'subtitle': SubtitleBlock, + 'section_title': SectionTitleBlock, 'content_list': ContentListBlock, 'module_room_slug': ModuleRoomSlug, 'thinglink_block': ThinglinkBlock, @@ -102,6 +104,7 @@ .content-component { position: relative; + &--bookmarked { } From 18d52f8d2ee7099c8252c8e96072478467bd64d4 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 24 Mar 2020 16:48:11 +0100 Subject: [PATCH 56/98] Fix cypress test --- client/cypress/integration/school-class.spec.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/cypress/integration/school-class.spec.js b/client/cypress/integration/school-class.spec.js index 4309617d..cbeeeee5 100644 --- a/client/cypress/integration/school-class.spec.js +++ b/client/cypress/integration/school-class.spec.js @@ -143,6 +143,8 @@ describe('Class Management', () => { cy.get('[data-cy=remove-from-class]').first().click(); + cy.get('[data-cy=modal-save-button]').click(); + cy.get('[data-cy=active-class-members-list]').within(() => { cy.get('[data-cy=school-class-member]').should('have.length', 1) }); From 32e3c6067bbf11a1200e4eb004d1231a528267c0 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 25 Mar 2020 12:58:53 +0100 Subject: [PATCH 57/98] Move modal to plugin --- client/src/App.vue | 9 ++- .../components/profile/DeactivatePerson.vue | 13 ++-- client/src/main.js | 4 ++ client/src/pages/myClass.vue | 10 +-- client/src/plugins/modal.js | 72 +++++++++++++++++++ 5 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 client/src/plugins/modal.js diff --git a/client/src/App.vue b/client/src/App.vue index 3d27aa5b..b1acde34 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,5 +1,6 @@ @@ -33,6 +36,7 @@ import WidgetPopover from '@/components/WidgetPopover'; import ChevronDown from '@/components/icons/ChevronDown'; import CurrentClass from '@/components/school-class/CurrentClass'; + import AddIcon from '@/components/icons/AddIcon'; import updateSelectedClassMixin from '@/mixins/updateSelectedClass'; import sidebarMixin from '@/mixins/sidebar'; @@ -42,7 +46,8 @@ components: { WidgetPopover, ChevronDown, - CurrentClass + CurrentClass, + AddIcon }, props: { @@ -97,6 +102,7 @@ left: 0; transform: translateY($small-spacing); } + } .selected-class { diff --git a/client/src/styles/_widget-popover.scss b/client/src/styles/_widget-popover.scss new file mode 100644 index 00000000..19c346d8 --- /dev/null +++ b/client/src/styles/_widget-popover.scss @@ -0,0 +1,67 @@ +@import "variables"; +@import "mixins"; + +.widget-popover { + position: absolute; + right: 0; + display: flex; + flex-direction: column; + background-color: $color-white; + padding: 0; + z-index: 100; + @include widget-shadow; + + &--mobile { + left: 0; + right: inherit; + } +} + +.popover-links { + list-style: none; + display: grid; + + &__icon { + width: 25px; + height: 25px; + margin-right: $small-spacing; + } + + &__link-with-icon { + display: flex; + align-items: center; + } + + &__link { + cursor: pointer; + padding: 0 $medium-spacing; + + & > a { + display: inline-block; + color: $color-silver-dark; + font-family: $sans-serif-font-family; + font-size: toRem(14px); + line-height: 1.5; + padding: 5px 0; + cursor: pointer; + } + + &--large { + line-height: 40px; + padding: $small-spacing $medium-spacing; + + & > a, & { + @include small-text; + } + } + + &--emph { + @include regular-text; + font-weight: 600; + } + } + + &__divider { + border-top: 1px solid $color-silver-dark; + } +} diff --git a/client/src/styles/main.scss b/client/src/styles/main.scss index e4b996ec..9493d8dd 100644 --- a/client/src/styles/main.scss +++ b/client/src/styles/main.scss @@ -24,3 +24,4 @@ @import "module-activity"; @import "book-subnavigation"; @import "simple-list"; +@import "widget-popover"; From 7a84c2f043287f3c74c989310ddcf09efb67b312 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 1 Apr 2020 09:37:54 +0200 Subject: [PATCH 69/98] Fix default class name generation --- server/registration/mutations_public.py | 2 +- server/users/models.py | 4 +++- server/users/tests/test_school_classes.py | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/server/registration/mutations_public.py b/server/registration/mutations_public.py index 5b53c652..6a3a007b 100644 --- a/server/registration/mutations_public.py +++ b/server/registration/mutations_public.py @@ -59,7 +59,7 @@ class Registration(relay.ClientIDMutation): if sb_license.license_type.is_teacher_license(): teacher_role = Role.objects.get(key=Role.objects.TEACHER_KEY) UserRole.objects.get_or_create(user=user, role=teacher_role) - default_class_name = SchoolClass.generate_default_group_name() + default_class_name = SchoolClass.generate_default_group_name(user=user) default_class = SchoolClass.objects.create(name=default_class_name) SchoolClassMember.objects.create( user=user, diff --git a/server/users/models.py b/server/users/models.py index 91c9fd78..6b8659e2 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -91,8 +91,10 @@ class SchoolClass(models.Model): return '{}'.format(self.name) @classmethod - def generate_default_group_name(cls): + def generate_default_group_name(cls, user=None): prefix = 'Meine Klasse' + if user is not None: + return f'{prefix} {user.pk}' prefix_regex = r'Meine Klasse (\d+)' initial_default_group = '{} 1'.format(prefix) my_group_filter = cls.objects.filter(name__startswith=prefix).order_by('-pk') diff --git a/server/users/tests/test_school_classes.py b/server/users/tests/test_school_classes.py index 71e39c49..b3139dca 100644 --- a/server/users/tests/test_school_classes.py +++ b/server/users/tests/test_school_classes.py @@ -22,6 +22,7 @@ from graphene.test import Client from graphql_relay import to_global_id from api.utils import get_graphql_mutation, get_object +from core.factories import UserFactory from users.models import SchoolClass, User from api.schema import schema from users.services import create_users @@ -47,6 +48,10 @@ class SchoolClassesTest(TestCase): class_name = SchoolClass.generate_default_group_name() self.assertEqual('{} 11'.format(self.prefix), class_name) + def test_default_class_name_with_user(self): + user = UserFactory(username='hansli') + class_name = SchoolClass.generate_default_group_name(user=user) + self.assertEqual(f'{self.prefix} {user.pk}', class_name) class ModifySchoolClassTest(TestCase): def setUp(self): From a42201d876698f961bfc635cffc8a23abbf53ad4 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 1 Apr 2020 17:25:59 +0200 Subject: [PATCH 70/98] Add matomo config --- client/config/dev.env.js | 5 +++-- client/config/prod.env.js | 3 ++- client/package-lock.json | 11 ++++++++--- client/package.json | 1 + client/src/main.js | 14 ++++++-------- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/client/config/dev.env.js b/client/config/dev.env.js index 8b9af38e..6aef4198 100644 --- a/client/config/dev.env.js +++ b/client/config/dev.env.js @@ -4,5 +4,6 @@ const prodEnv = require('./prod.env') module.exports = merge(prodEnv, { NODE_ENV: '"development"', - GOOGLE_ANALYTICS_ID: JSON.stringify(process.env.GOOGLE_ANALYTICS_ID) -}) + MATOMO_HOST: JSON.stringify(process.env.MATOMO_HOST), + MATOMO_SITE_ID: JSON.stringify(process.env.MATOMO_SITE_ID), +}); diff --git a/client/config/prod.env.js b/client/config/prod.env.js index 7ccd6feb..3250dd1e 100644 --- a/client/config/prod.env.js +++ b/client/config/prod.env.js @@ -1,5 +1,6 @@ 'use strict' module.exports = { NODE_ENV: '"production"', - GOOGLE_ANALYTICS_ID: JSON.stringify(process.env.GOOGLE_ANALYTICS_ID) + MATOMO_HOST: JSON.stringify(process.env.MATOMO_HOST), + MATOMO_SITE_ID: JSON.stringify(process.env.MATOMO_SITE_ID), } diff --git a/client/package-lock.json b/client/package-lock.json index debb79ba..361544a6 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -2460,7 +2460,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -2492,7 +2492,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -13334,7 +13334,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -19743,6 +19743,11 @@ } } }, + "vue-matomo": { + "version": "3.13.4-0", + "resolved": "https://registry.npmjs.org/vue-matomo/-/vue-matomo-3.13.4-0.tgz", + "integrity": "sha512-EeJ75XJAXo8JDHVN+XswFxhXabcZ4DUa0z4ishWaTuvAkLHR+tYNaiouy70UXh4YCU5mbQW3P1msHRijO1j1Bw==" + }, "vue-router": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", diff --git a/client/package.json b/client/package.json index cf536d28..b2936593 100644 --- a/client/package.json +++ b/client/package.json @@ -80,6 +80,7 @@ "vue-apollo": "^3.0.0-beta.16", "vue-axios": "^2.1.1", "vue-loader": "^14.2.1", + "vue-matomo": "^3.13.4-0", "vue-router": "^3.0.1", "vue-scrollto": "^2.11.0", "vue-style-loader": "^3.0.1", diff --git a/client/src/main.js b/client/src/main.js index fba663e7..259f41a2 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -9,7 +9,6 @@ import App from './App' import router from './router' import store from '@/store/index' import VueScrollTo from 'vue-scrollto'; -import VueAnalytics from 'vue-analytics'; import {Validator, install as VeeValidate} from 'vee-validate/dist/vee-validate.minimal.esm.js'; import {required, min} from 'vee-validate/dist/rules.esm.js'; import veeDe from 'vee-validate/dist/locale/de'; @@ -19,6 +18,7 @@ import clickOutside from '@/directives/click-outside' import ME_QUERY from '@/graphql/gql/meQuery.gql'; import VueModal from '@/plugins/modal'; import VueRemoveEdges from '@/plugins/edges'; +import VueMatomo from 'vue-matomo' Vue.config.productionTip = false; @@ -34,13 +34,11 @@ Vue.use(VueScrollTo, { offset: -50 }); -if (process.env.GOOGLE_ANALYTICS_ID) { - Vue.use(VueAnalytics, { - id: process.env.GOOGLE_ANALYTICS_ID, - router - }); - console.log(process.env.GOOGLE_ANALYTICS_ID); -} +Vue.use(VueMatomo, { + host: process.env.MATOMO_HOST, + siteId: process.env.MATOMO_SITE_ID, + router: router +}); Vue.directive('click-outside', clickOutside); Vue.directive('auto-grow', autoGrow); From 68b751d325263d53be219037b212c64591aeb114 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 1 Apr 2020 17:45:07 +0200 Subject: [PATCH 71/98] Add matomo sanity check --- client/src/main.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/client/src/main.js b/client/src/main.js index 259f41a2..123f1a2e 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -34,11 +34,13 @@ Vue.use(VueScrollTo, { offset: -50 }); -Vue.use(VueMatomo, { - host: process.env.MATOMO_HOST, - siteId: process.env.MATOMO_SITE_ID, - router: router -}); +if (process.env.MATOMO_HOST) { + Vue.use(VueMatomo, { + host: process.env.MATOMO_HOST, + siteId: process.env.MATOMO_SITE_ID, + router: router + }); +} Vue.directive('click-outside', clickOutside); Vue.directive('auto-grow', autoGrow); From ad3e3fa629bcb0b361c81ef9a987d631f24a61f3 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 2 Apr 2020 16:20:42 +0200 Subject: [PATCH 72/98] Add additional pipeline test settings --- .gitignore | 3 + Pipfile | 5 +- Pipfile.lock | 322 ++++++++++++++++++++++------------------ client/cypress.json | 7 +- server/core/settings.py | 5 + 5 files changed, 196 insertions(+), 146 deletions(-) diff --git a/.gitignore b/.gitignore index bd5948be..027d2c85 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ server/media/ .coverage +# test reports +client/cypress/test-reports/ +server/test-reports/ diff --git a/Pipfile b/Pipfile index 70701acd..59d7575e 100644 --- a/Pipfile +++ b/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [requires] -python_version = '3.6' +python_version = "3.6" [dev-packages] awscli = "*" @@ -36,7 +36,8 @@ django-libsass = "*" bleach = "*" newrelic = "*" sentry-sdk = "==0.7.2" -"django-sendgrid-v5" = "==0.8.0" +django-sendgrid-v5 = "==0.8.0" python-http-client = "==3.2.1" ipython = "*" requests = "*" +unittest-xml-reporting = "*" diff --git a/Pipfile.lock b/Pipfile.lock index d9958437..d57ded6b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ca4f635dc983134e4569df2af8f0d73f488211bc2a97d11c194f76279f942977" + "sha256": "f7bfa448c4413cfd5d7517793e7095aa2f0e072f570b32281c5f573aba34552d" }, "pipfile-spec": 6, "requires": { @@ -40,26 +40,26 @@ }, "bleach": { "hashes": [ - "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", - "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" + "sha256:cc8da25076a1fe56c3ac63671e2194458e0c4d9c7becfd52ca251650d517903c", + "sha256:e78e426105ac07026ba098f04de8abe9b6e3e98b5befbf89b51a5ef0a4292b03" ], "index": "pypi", - "version": "==3.1.0" + "version": "==3.1.4" }, "boto3": { "hashes": [ - "sha256:629ce3be236b6e0aed52358146eea9ffa7679d6cd1cc9b3e12332226270d6499", - "sha256:b1351e62136fae29be8fcbb1c4890f1d72017d57e33051d435a8bf9f71212fde" + "sha256:5246caf509baa4716065e6bb78bdc516fdd6b0dfbd9098cc2a0f779fad789c6c", + "sha256:52b8de35f6647e3b8ce81f6a745a67812623b5c4acc2d6bd5e814fddfa488321" ], "index": "pypi", - "version": "==1.11.14" + "version": "==1.12.34" }, "botocore": { "hashes": [ - "sha256:34ad4d73e6bef5c8ad956c66354611628cdebd431fe2927261ed9c068b9cfb7a", - "sha256:6570f2ba046956d5b548ab2346d32f713ecf8b8cb098a839d73fcf832ccfa223" + "sha256:c799623598d04c66b0be4cb990c01a24bd3c06023f0c7221adead38a7431c994", + "sha256:db0fba3f4adfb9bf3976aae10efa9acb59e3efe52ce8feac71ecac0b7be2fc2e" ], - "version": "==1.14.14" + "version": "==1.15.34" }, "certifi": { "hashes": [ @@ -77,17 +77,17 @@ }, "click": { "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc", + "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a" ], - "version": "==7.0" + "version": "==7.1.1" }, "decorator": { "hashes": [ - "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce", - "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d" + "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", + "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" ], - "version": "==4.4.1" + "version": "==4.4.2" }, "dj-database-url": { "hashes": [ @@ -106,10 +106,10 @@ }, "django-appconf": { "hashes": [ - "sha256:35f13ca4d567f132b960e2cd4c832c2d03cb6543452d34e29b7ba10371ba80e3", - "sha256:c98a7af40062e996b921f5962a1c4f3f0c979fa7885f7be4710cceb90ebe13a6" + "sha256:1b1d0e1069c843ebe8ae5aa48ec52403b1440402b320c3e3a206a0907e97bb06", + "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380" ], - "version": "==1.0.3" + "version": "==1.0.4" }, "django-compressor": { "hashes": [ @@ -219,10 +219,10 @@ }, "faker": { "hashes": [ - "sha256:047d4d1791bfb3756264da670d99df13d799bb36e7d88774b1585a82d05dbaec", - "sha256:1b1a58961683b30c574520d0c739c4443e0ef6a185c04382e8cc888273dbebed" + "sha256:2d3f866ef25e1a5af80e7b0ceeacc3c92dec5d0fdbad3e2cb6adf6e60b22188f", + "sha256:b89aa33837498498e15c709eb40c31386408a901a53c7a5e12a425737a767976" ], - "version": "==4.0.0" + "version": "==4.0.2" }, "future": { "hashes": [ @@ -276,18 +276,18 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" + "version": "==2.9" }, "ipython": { "hashes": [ - "sha256:d9459e7237e2e5858738ff9c3e26504b79899b58a6d49e574d352493d80684c6", - "sha256:f6689108b1734501d3b59c84427259fd5ac5141afe2e846cfa8598eb811886c9" + "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a", + "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333" ], "index": "pypi", - "version": "==7.12.0" + "version": "==7.13.0" }, "ipython-genutils": { "hashes": [ @@ -305,18 +305,20 @@ }, "jmespath": { "hashes": [ - "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", - "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" + "sha256:695cb76fa78a10663425d5b73ddc5714eb711157e52704d69be03b1a02ba4fec", + "sha256:cca55c8d153173e21baa59983015ad0daf603f9cb799904ff057bfb8ff8dc2d9" ], - "version": "==0.9.4" + "version": "==0.9.5" }, "libsass": { "hashes": [ "sha256:003a65b4facb4c5dbace53fb0f70f61c5aae056a04b4d112a198c3c9674b31f2", + "sha256:0fb4399f7bbecab7b181f2c2d82c3a0ba2916bf9169714b96e425355a5b23b9f", "sha256:0fd8b4337b3b101c6e6afda9112cc0dc4bacb9133b59d75d65968c7317aa3272", "sha256:338e9ae066bf1fde874e335324d5355c52d2081d978b4f74fc59536564b35b08", "sha256:4dcfd561fb100250b89496e1362b96f2cc804f689a59731eb0f94f9a9e144f4a", "sha256:50778d4be269a021ba2bf42b5b8f6ff3704ab96a82175a052680bddf3ba7cc9f", + "sha256:53f87116e7441827878bd79bbad8debac23e1930423f61ab8d837ec4a4c36e0c", "sha256:6a51393d75f6e3c812785b0fa0b7d67c54258c28011921f204643b55f7355ec0", "sha256:74acd9adf506142699dfa292f0e569fdccbd9e7cf619e8226f7117de73566e32", "sha256:81a013a4c2a614927fd1ef7a386eddabbba695cbb02defe8f31cf495106e974c", @@ -333,17 +335,17 @@ }, "newrelic": { "hashes": [ - "sha256:8283dd54299b3fd2818a262f38f9193a2ee52b2a02fecca1a1d04764be533c92" + "sha256:5d83887781683975bd75ec624baa8de5e1e75c2bf89e7269ed2811b559da1504" ], "index": "pypi", - "version": "==5.6.0.135" + "version": "==5.10.0.138" }, "parso": { "hashes": [ - "sha256:56b2105a80e9c4df49de85e125feb6be69f49920e121406f15e7acde6c9dfc57", - "sha256:951af01f61e6dccd04159042a0706a31ad437864ec6e25d0d7a96a9fbb9b0095" + "sha256:0c5659e0c6eba20636f99a04f469798dca8da279645ce5c387315b2c23912157", + "sha256:8515fc12cfca6ee3aa59138741fc5624d62340c97e401c74875769948d4f2995" ], - "version": "==0.6.1" + "version": "==0.6.2" }, "pexpect": { "hashes": [ @@ -365,19 +367,30 @@ "sha256:0013f590a8f260df60bcfd65db19d18efc04e7f046c3c82a40e2e2b3292a937c", "sha256:0b899ee80920bb533f26581af9b4660bc12aff4562555afe74e429101ebf3c94", "sha256:12f29d6c23424f704c66b5b68c02fe0b571504459605cfe36ab8158359b0e1bb", + "sha256:135e9aa65150c53f7db85bf2bebb8a0e1a48ea850e80cf66e16dd04fa09d309c", "sha256:153ec6f18f7b61641e0e6e502acfaf4a06c9aba2ea11c0b4b3578ea9f13a4a4a", + "sha256:17fe25efc785194d48c38fad85dce470013ba19d2fb66639e149f14bccf1327f", "sha256:1912b7230459fd53682dae32b83cbd8e5d642ba36d4be18566f00a9c063aa13d", "sha256:1a5b93084e01328a1cb1ecdad99d11d75e881e89a95f88d85b523646553b36c2", "sha256:25193f934d37d836a6b1f4c062ce574a96cbca7c6d9dc8ddfbbac7f9c54deaa4", + "sha256:2c042352b430d678db50c78c5214e19638eff8b688941271da2de21fd298dfe5", + "sha256:2e818dbe445e86fc6c266973fe540c35125c42eb2cf13a6095e9adaa89c0deb5", "sha256:2fcde9954c8882d1c7f93bb828caa34a4c5e3ee69dbc7895dc8652ad972b455a", "sha256:35f7d998b8e82fb3fb51ff88b30485eb81cd7dd56ec7e1a8deba23eb88532d44", + "sha256:37cc0339abfa9e295c75d9a7f227d35cb44716feb95057f9449c4a9e9a17daf7", "sha256:43334f9581cd067945b8898cef9eb5714ee4883f8de0304c011f1dbdb1d4e2aa", "sha256:4bd4a71501b6d51db4abc07e1f43f5a6fed0a1a9583cca0b401d6af50284b0db", + "sha256:57aa6198ba8acba1313c3b743e267d821a60cac77e6026caf0b55ca58d3d23be", "sha256:5b0d657460d9f3615876fec6306e97ca15a471f6169b622d76a47e270998acf1", + "sha256:5cd36804f9f06a914a883fe682df5711d16d7b4f44d43189c5f013e7cd91e149", "sha256:6977cf073d83358b34f93abf5c1f1193b88675fe0e4441e0e28318bc3dcba7a0", "sha256:718ec7a122b28d64afc5fbc3a9b99bb0545ef511373cac06fe7624520e82cb20", + "sha256:7dfbefdb3fb911ca9faed307bf309861e9995e36cca6b761c7ba6d9b77a9744a", "sha256:801cca8923508311bf5d6d0f7da5362552e8208ebd8ec0d7b9f2cd2ff5705734", + "sha256:82b172e3264e62372c01b5b009b5b1a02fbb9276cbe5cc57ab00a6d6e5ed9a18", + "sha256:82d1ff571489765df2816785d532e243bde213752156c227fca595723ec5ff42", "sha256:8580fc58074a16b749905b26cf8363f7b628dd167ba0130f5382cdc91c86b509", + "sha256:931030d1d6282b7900e6b0a7ff9ecdb503b5e1e6781800dab2b71a9f39405bff", "sha256:9525cd680a6f9e80c6c0af03cf973e6505c59f60b4745f682cd1a449e54b31bb", "sha256:a224651a81e45ef4f1d0164e256c5f6b4abb49f2ae8f22ba2f3a9d0ff338e608", "sha256:a370d1c570f1d72e877099651e752332444b1c5009381f043c9da5fd47f3ebae", @@ -386,7 +399,12 @@ "sha256:b85f703c2ffe539313e39ce0676bed0f355cec45a16e58c9ab7417445843047c", "sha256:b9f63451084a718eccdeb1e382768c94647915653af4d6019f64560d9e98642b", "sha256:c793dfaa130847ccff958492b76ae8b9304e60b8a79a92962cb19e368276a22b", - "sha256:ddd16ab250b4fc97db1c47407e78c25216a75c29d29d10ad37e51b7a2ec7b2c3" + "sha256:d60c1625b108432ace8b1fa1a584017e5efa73f107d0f493c7f39c79bebf1d41", + "sha256:dc4b018d5c9b636f7546583c5591b9ea00c328c3e5871992ef5b95bac353f097", + "sha256:ddd16ab250b4fc97db1c47407e78c25216a75c29d29d10ad37e51b7a2ec7b2c3", + "sha256:e126ff4fed71e78333840c07279e1617f63cfca76d63ad5b27d65a7277206a3d", + "sha256:f8d49be8c282df8d2e1ab6ab53ab8abd859b1fa6fed384457ee85c9eff64ef97", + "sha256:fcf64c91fd44485100a2965d23bb0e227d093e91f7e776c5ca3b32574766eb56" ], "index": "pypi", "version": "==5.0.0" @@ -399,10 +417,10 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e", - "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a" + "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8", + "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04" ], - "version": "==3.0.3" + "version": "==3.0.5" }, "psycopg2": { "hashes": [ @@ -450,10 +468,10 @@ }, "pygments": { "hashes": [ - "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", - "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" + "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", + "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" ], - "version": "==2.5.2" + "version": "==2.6.1" }, "python-dateutil": { "hashes": [ @@ -502,11 +520,11 @@ }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], "index": "pypi", - "version": "==2.22.0" + "version": "==2.23.0" }, "rjsmin": { "hashes": [ @@ -542,10 +560,11 @@ }, "sendgrid": { "hashes": [ - "sha256:12ea8203c48c47b03dbe33e219408ca32c9259526d05b783418482d40f17943c", - "sha256:5ad98598c13b8cf5545d20f6fb6ecf967a08b48e3e175affabd82cfc71522d01" + "sha256:2954caf82c94c3566147e78ff7772f0883a7cc668de5a1c5ff1c49dcb9c1af31", + "sha256:7c606125c59d1df7354e20581ca645d109be1d026f5b01dd62112e07348b2d87", + "sha256:a58c8d3f99e1b4fed6c041e6bb0e30893a6c40ffc0ecd33430a08d044fe78832" ], - "version": "==6.1.1" + "version": "==6.2.1" }, "sentry-sdk": { "hashes": [ @@ -598,12 +617,19 @@ ], "version": "==1.1.1" }, + "unittest-xml-reporting": { + "hashes": [ + "sha256:74eaf7739a7957a74f52b8187c5616f61157372189bef0a32ba5c30bbc00e58a", + "sha256:e09b8ae70cce9904cdd331f53bf929150962869a5324ab7ff3dd6c8b87e01f7d" + ], + "index": "pypi", + "version": "==3.0.2" + }, "urllib3": { "hashes": [ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "markers": "python_version != '3.4'", "version": "==1.25.8" }, "wagtail": { @@ -624,10 +650,10 @@ }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", + "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" ], - "version": "==0.1.8" + "version": "==0.1.9" }, "webencodings": { "hashes": [ @@ -655,10 +681,10 @@ "develop": { "asgiref": { "hashes": [ - "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0", - "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5" + "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5", + "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c" ], - "version": "==3.2.3" + "version": "==3.2.7" }, "autopep8": { "hashes": [ @@ -668,11 +694,11 @@ }, "awscli": { "hashes": [ - "sha256:2748af4e77728ced50d7d5bda0fa980449bd71eedff90ee643bee86ed4283d2f", - "sha256:9118015f4bbab1c671d9c9927d07b6f7eadb7e1e8bbb2b06dc849c3de578d692" + "sha256:b713641674a228959e4030cab578d2720d1132f40bed15f0c5cd950525b559c9", + "sha256:c0b75242000ed03152e30cee50a61d571019da27a5862d520e758f03842c206d" ], "index": "pypi", - "version": "==1.17.14" + "version": "==1.18.34" }, "backcall": { "hashes": [ @@ -683,10 +709,10 @@ }, "botocore": { "hashes": [ - "sha256:34ad4d73e6bef5c8ad956c66354611628cdebd431fe2927261ed9c068b9cfb7a", - "sha256:6570f2ba046956d5b548ab2346d32f713ecf8b8cb098a839d73fcf832ccfa223" + "sha256:c799623598d04c66b0be4cb990c01a24bd3c06023f0c7221adead38a7431c994", + "sha256:db0fba3f4adfb9bf3976aae10efa9acb59e3efe52ce8feac71ecac0b7be2fc2e" ], - "version": "==1.14.14" + "version": "==1.15.34" }, "certifi": { "hashes": [ @@ -712,47 +738,47 @@ }, "coverage": { "hashes": [ - "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", - "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", - "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", - "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", - "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", - "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", - "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", - "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", - "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", - "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", - "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", - "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", - "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", - "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", - "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", - "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", - "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", - "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", - "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", - "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", - "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", - "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", - "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", - "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", - "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", - "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", - "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", - "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", - "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", - "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", - "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" + "sha256:03f630aba2b9b0d69871c2e8d23a69b7fe94a1e2f5f10df5049c0df99db639a0", + "sha256:046a1a742e66d065d16fb564a26c2a15867f17695e7f3d358d7b1ad8a61bca30", + "sha256:0a907199566269e1cfa304325cc3b45c72ae341fbb3253ddde19fa820ded7a8b", + "sha256:165a48268bfb5a77e2d9dbb80de7ea917332a79c7adb747bd005b3a07ff8caf0", + "sha256:1b60a95fc995649464e0cd48cecc8288bac5f4198f21d04b8229dc4097d76823", + "sha256:1f66cf263ec77af5b8fe14ef14c5e46e2eb4a795ac495ad7c03adc72ae43fafe", + "sha256:2e08c32cbede4a29e2a701822291ae2bc9b5220a971bba9d1e7615312efd3037", + "sha256:3844c3dab800ca8536f75ae89f3cf566848a3eb2af4d9f7b1103b4f4f7a5dad6", + "sha256:408ce64078398b2ee2ec08199ea3fcf382828d2f8a19c5a5ba2946fe5ddc6c31", + "sha256:443be7602c790960b9514567917af538cac7807a7c0c0727c4d2bbd4014920fd", + "sha256:4482f69e0701139d0f2c44f3c395d1d1d37abd81bfafbf9b6efbe2542679d892", + "sha256:4a8a259bf990044351baf69d3b23e575699dd60b18460c71e81dc565f5819ac1", + "sha256:513e6526e0082c59a984448f4104c9bf346c2da9961779ede1fc458e8e8a1f78", + "sha256:5f587dfd83cb669933186661a351ad6fc7166273bc3e3a1531ec5c783d997aac", + "sha256:62061e87071497951155cbccee487980524d7abea647a1b2a6eb6b9647df9006", + "sha256:641e329e7f2c01531c45c687efcec8aeca2a78a4ff26d49184dce3d53fc35014", + "sha256:65a7e00c00472cd0f59ae09d2fb8a8aaae7f4a0cf54b2b74f3138d9f9ceb9cb2", + "sha256:6ad6ca45e9e92c05295f638e78cd42bfaaf8ee07878c9ed73e93190b26c125f7", + "sha256:73aa6e86034dad9f00f4bbf5a666a889d17d79db73bc5af04abd6c20a014d9c8", + "sha256:7c9762f80a25d8d0e4ab3cb1af5d9dffbddb3ee5d21c43e3474c84bf5ff941f7", + "sha256:85596aa5d9aac1bf39fe39d9fa1051b0f00823982a1de5766e35d495b4a36ca9", + "sha256:86a0ea78fd851b313b2e712266f663e13b6bc78c2fb260b079e8b67d970474b1", + "sha256:8a620767b8209f3446197c0e29ba895d75a1e272a36af0786ec70fe7834e4307", + "sha256:922fb9ef2c67c3ab20e22948dcfd783397e4c043a5c5fa5ff5e9df5529074b0a", + "sha256:9fad78c13e71546a76c2f8789623eec8e499f8d2d799f4b4547162ce0a4df435", + "sha256:a37c6233b28e5bc340054cf6170e7090a4e85069513320275a4dc929144dccf0", + "sha256:c3fc325ce4cbf902d05a80daa47b645d07e796a80682c1c5800d6ac5045193e5", + "sha256:cda33311cb9fb9323958a69499a667bd728a39a7aa4718d7622597a44c4f1441", + "sha256:db1d4e38c9b15be1521722e946ee24f6db95b189d1447fa9ff18dd16ba89f732", + "sha256:eda55e6e9ea258f5e4add23bcf33dc53b2c319e70806e180aecbff8d90ea24de", + "sha256:f372cdbb240e09ee855735b9d85e7f50730dcfb6296b74b95a3e5dea0615c4c1" ], "index": "pypi", - "version": "==5.0.3" + "version": "==5.0.4" }, "decorator": { "hashes": [ - "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce", - "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d" + "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", + "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" ], - "version": "==4.4.1" + "version": "==4.4.2" }, "django": { "hashes": [ @@ -764,11 +790,10 @@ }, "django-silk": { "hashes": [ - "sha256:9d5d66628689230288d1020de186b86e6f38583f611b5dd796ec988bb6a6333e", - "sha256:b0033ec3713882a5abb8b3db2b4392a746b83ce164ab7be568f0eeec4ba78a98" + "sha256:56c2c5aefd1c65161df61e49cf2674862a748a43e81c7c470bcbc4c35c53491c" ], "index": "pypi", - "version": "==4.0.0" + "version": "==4.0.1" }, "docutils": { "hashes": [ @@ -786,25 +811,25 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" + "version": "==2.9" }, "ipdb": { "hashes": [ - "sha256:5d9a4a0e3b7027a158fc6f2929934341045b9c3b0b86ed5d7e84e409653f72fd" + "sha256:77fb1c2a6fccdfee0136078c9ed6fe547ab00db00bebff181f1e8c9e13418d49" ], "index": "pypi", - "version": "==0.12.3" + "version": "==0.13.2" }, "ipython": { "hashes": [ - "sha256:d9459e7237e2e5858738ff9c3e26504b79899b58a6d49e574d352493d80684c6", - "sha256:f6689108b1734501d3b59c84427259fd5ac5141afe2e846cfa8598eb811886c9" + "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a", + "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333" ], "index": "pypi", - "version": "==7.12.0" + "version": "==7.13.0" }, "ipython-genutils": { "hashes": [ @@ -829,10 +854,10 @@ }, "jmespath": { "hashes": [ - "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", - "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" + "sha256:695cb76fa78a10663425d5b73ddc5714eb711157e52704d69be03b1a02ba4fec", + "sha256:cca55c8d153173e21baa59983015ad0daf603f9cb799904ff057bfb8ff8dc2d9" ], - "version": "==0.9.4" + "version": "==0.9.5" }, "markupsafe": { "hashes": [ @@ -874,10 +899,10 @@ }, "parso": { "hashes": [ - "sha256:56b2105a80e9c4df49de85e125feb6be69f49920e121406f15e7acde6c9dfc57", - "sha256:951af01f61e6dccd04159042a0706a31ad437864ec6e25d0d7a96a9fbb9b0095" + "sha256:0c5659e0c6eba20636f99a04f469798dca8da279645ce5c387315b2c23912157", + "sha256:8515fc12cfca6ee3aa59138741fc5624d62340c97e401c74875769948d4f2995" ], - "version": "==0.6.1" + "version": "==0.6.2" }, "pexpect": { "hashes": [ @@ -896,10 +921,10 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e", - "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a" + "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8", + "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04" ], - "version": "==3.0.3" + "version": "==3.0.5" }, "ptyprocess": { "hashes": [ @@ -910,8 +935,19 @@ }, "pyasn1": { "hashes": [ + "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", + "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", + "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", + "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", - "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba" + "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", + "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", + "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", + "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", + "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", + "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", + "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", + "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" ], "version": "==0.4.8" }, @@ -924,10 +960,10 @@ }, "pygments": { "hashes": [ - "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", - "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" + "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", + "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" ], - "version": "==2.5.2" + "version": "==2.6.1" }, "python-dateutil": { "hashes": [ @@ -945,27 +981,28 @@ }, "pyyaml": { "hashes": [ - "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", - "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", - "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", - "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", - "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", - "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", - "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", - "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", - "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", - "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", - "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" + "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", + "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", + "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", + "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", + "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", + "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", + "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", + "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", + "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" ], - "version": "==5.2" + "markers": "python_version != '3.4'", + "version": "==5.3.1" }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], "index": "pypi", - "version": "==2.22.0" + "version": "==2.23.0" }, "rsa": { "hashes": [ @@ -990,10 +1027,10 @@ }, "sqlparse": { "hashes": [ - "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177", - "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873" + "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e", + "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548" ], - "version": "==0.3.0" + "version": "==0.3.1" }, "traitlets": { "hashes": [ @@ -1007,15 +1044,14 @@ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "markers": "python_version != '3.4'", "version": "==1.25.8" }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", + "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" ], - "version": "==0.1.8" + "version": "==0.1.9" } } } diff --git a/client/cypress.json b/client/cypress.json index 66619dd5..778d1157 100644 --- a/client/cypress.json +++ b/client/cypress.json @@ -1,4 +1,9 @@ { "baseUrl": "http://localhost:8000", - "videoUploadOnPasses": false + "videoUploadOnPasses": false, + "reporter": "junit", + "reporterOptions": { + "mochaFile": "cypress/test-reports/cypress-results-[hash].xml", + "toConsole": true + } } diff --git a/server/core/settings.py b/server/core/settings.py index 095889f5..edce4155 100644 --- a/server/core/settings.py +++ b/server/core/settings.py @@ -386,3 +386,8 @@ TASKBASE_PASSWORD = os.environ.get("TASKBASE_PASSWORD") TASKBASE_SUPERUSER = os.environ.get("TASKBASE_SUPERUSER") TASKBASE_SUPERPASSWORD = os.environ.get("TASKBASE_SUPERPASSWORD") TASKBASE_BASEURL = os.environ.get("TASKBASE_BASEURL") + + +TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' +TEST_OUTPUT_DIR = './test-reports/' +TEST_OUTPUT_VERBOSE = 1 From 42960f531d938bbcdf964ed4d53e6e5123581bf7 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 2 Apr 2020 23:02:26 +0200 Subject: [PATCH 73/98] Add new icon --- client/src/components/HeaderBar.vue | 14 ++++++-- client/src/components/icons/Logo.vue | 54 ++++++++++++---------------- client/src/layouts/PublicLayout.vue | 5 ++- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/client/src/components/HeaderBar.vue b/client/src/components/HeaderBar.vue index a44ff9d2..917866eb 100644 --- a/client/src/components/HeaderBar.vue +++ b/client/src/components/HeaderBar.vue @@ -2,10 +2,12 @@
- + + +
@@ -65,6 +67,7 @@ @include desktop { grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 50px; grid-auto-rows: auto; } @@ -114,6 +117,13 @@ -ms-grid-row-align: center; -ms-grid-column-align: center; } + + &__logo-icon { + + width: 212px; + height: 31px; + + } } .user-header { diff --git a/client/src/components/icons/Logo.vue b/client/src/components/icons/Logo.vue index 3b22353d..7af5b00a 100644 --- a/client/src/components/icons/Logo.vue +++ b/client/src/components/icons/Logo.vue @@ -1,37 +1,29 @@ - diff --git a/client/src/layouts/PublicLayout.vue b/client/src/layouts/PublicLayout.vue index a4e7b9a2..ce607d70 100644 --- a/client/src/layouts/PublicLayout.vue +++ b/client/src/layouts/PublicLayout.vue @@ -23,10 +23,13 @@ import Logo from '@/components/icons/Logo'; .public { max-width: 800px; min-width: 320px; + padding-top: 4*$large-spacing; &__logo { position: relative; - left: -10px; + + width: 260px; + height: 43px; } } From 2f6b66112c33c5e25c80564aecf5e38210195110 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Mon, 6 Apr 2020 13:31:40 +0200 Subject: [PATCH 74/98] Add additional editor plugins for instrument WYSIWYG editor --- client/src/pages/instrument.vue | 31 +++++++++---- server/books/blocks.py | 4 +- server/core/wagtail_hooks.py | 80 +++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 server/core/wagtail_hooks.py diff --git a/client/src/pages/instrument.vue b/client/src/pages/instrument.vue index be5f7133..0f15022c 100644 --- a/client/src/pages/instrument.vue +++ b/client/src/pages/instrument.vue @@ -2,15 +2,15 @@

{{instrument.title}}

- - + +
@@ -59,19 +59,32 @@ & p { margin-bottom: 40px; } + & ul { padding-left: 25px; } + & p + ul { margin-top: -30px; } + & li { list-style: disc; line-height: 1.5; } + & b { font-weight: 600; + } + + .brand { color: $color-brand; + font-weight: 600; + } + + .secondary { + color: $color-accent-2; + font-weight: 600; } } } diff --git a/server/books/blocks.py b/server/books/blocks.py index 58f793a2..dd9a118e 100644 --- a/server/books/blocks.py +++ b/server/books/blocks.py @@ -4,8 +4,8 @@ from wagtail.snippets.blocks import SnippetChooserBlock from assignments.models import Assignment from surveys.models import Survey -DEFAULT_RICH_TEXT_FEATURES = ['ul'] -INSTRUMENTS_RICH_TEXT_FEATURES = ['bold', 'ul'] +DEFAULT_RICH_TEXT_FEATURES = ['ul', ] +INSTRUMENTS_RICH_TEXT_FEATURES = ['bold', 'ul', 'brand', 'secondary'] # link_block diff --git a/server/core/wagtail_hooks.py b/server/core/wagtail_hooks.py new file mode 100644 index 00000000..3acfaab7 --- /dev/null +++ b/server/core/wagtail_hooks.py @@ -0,0 +1,80 @@ +import wagtail.admin.rich_text.editors.draftail.features as draftail_features +from wagtail.admin.rich_text.converters.html_to_contentstate import InlineStyleElementHandler +from wagtail.core import hooks + +# 1. Use the register_rich_text_features hook. +@hooks.register('register_rich_text_features') +def register_brand_feature(features): + """ + Registering the feature, which uses the `BRAND` Draft.js inline style type, + and is stored as HTML with a `` tag. + """ + feature_name = 'brand' + type_ = 'BRAND' + + # 2. Configure how Draftail handles the feature in its toolbar. + control = { + 'type': type_, + 'label': 'Grün', + 'description': 'Grün', + 'style': { + 'color': '#17A887', + 'font-weight': '600' + }, + } + + # 3. Call register_editor_plugin to register the configuration for Draftail. + features.register_editor_plugin( + 'draftail', feature_name, draftail_features.InlineStyleFeature(control) + ) + + # 4.configure the content transform from the DB to the editor and back. + db_conversion = { + 'from_database_format': {'span[class="brand"]': InlineStyleElementHandler(type_)}, + 'to_database_format': {'style_map': {type_: 'span class="brand""'}}, + } + + # 5. Call register_converter_rule to register the content transformation conversion. + features.register_converter_rule('contentstate', feature_name, db_conversion) + + # 6. (optional) Add the feature to the default features list to make it available + # on rich text fields that do not specify an explicit 'features' list + features.default_features.append(feature_name) + +@hooks.register('register_rich_text_features') +def register_secondary_feature(features): + """ + Registering the feature, which uses the `SECONDARY` Draft.js inline style type, + and is stored as HTML with a `` tag. + """ + feature_name = 'secondary' + type_ = 'SECONDARY' + + # 2. Configure how Draftail handles the feature in its toolbar. + control = { + 'type': type_, + 'label': 'Blau', + 'description': 'Blau', + 'style': { + 'color': '#078CC6', + 'font-weight': '600' + }, + } + + # 3. Call register_editor_plugin to register the configuration for Draftail. + features.register_editor_plugin( + 'draftail', feature_name, draftail_features.InlineStyleFeature(control) + ) + + # 4.configure the content transform from the DB to the editor and back. + db_conversion = { + 'from_database_format': {'span[class="secondary"]': InlineStyleElementHandler(type_)}, + 'to_database_format': {'style_map': {type_: 'span class="secondary"'}}, + } + + # 5. Call register_converter_rule to register the content transformation conversion. + features.register_converter_rule('contentstate', feature_name, db_conversion) + + # 6. (optional) Add the feature to the default features list to make it available + # on rich text fields that do not specify an explicit 'features' list + features.default_features.append(feature_name) From 38f0b64d96c3ef415b95235fc3b4afeb8908d413 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 11:28:47 +0200 Subject: [PATCH 75/98] Add deployment info to pipelines config --- bitbucket-pipelines.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index f79eaf72..5ac8a2e9 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -60,6 +60,7 @@ aliases: - npm run test:unit - &deploy-prod name: deploy to prod on Heroku + deployment: prod script: - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-prod.git HEAD:master @@ -81,6 +82,7 @@ pipelines: - step: *jest-test - step: name: deploy to stage on Heroku + deployment: stage script: - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-stage.git develop:master From e340c91a122c76ce97a686f0fe0fc1c8d830461a Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 12:01:40 +0200 Subject: [PATCH 76/98] Add dev deployment step to all branches --- bitbucket-pipelines.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index 5ac8a2e9..ae2fd9bb 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -63,12 +63,19 @@ aliases: deployment: prod script: - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-prod.git HEAD:master +- &deploy-dev + name: deploy to dev on Heroku + deployment: dev + trigger: manual + script: + - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master pipelines: default: - step: *unittest-python - step: *cypress-test - step: *jest-test + - step: *deploy-dev branches: master: From 533cf186ee41b49a53e9429f8f6772c21273e526 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 12:04:10 +0200 Subject: [PATCH 77/98] Update surveyjs version --- client/package-lock.json | 6 +++--- client/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 361544a6..d6e213e0 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -18754,9 +18754,9 @@ } }, "survey-vue": { - "version": "1.0.96", - "resolved": "https://registry.npmjs.org/survey-vue/-/survey-vue-1.0.96.tgz", - "integrity": "sha512-6vwEprt6NdTC4BFELdReQWdPNAuVb59jnj2rI/tl7bhk4TJQluRtacy95T9V5r1oMDyATzn8kl2eX0Kr14KVSg==", + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/survey-vue/-/survey-vue-1.5.18.tgz", + "integrity": "sha512-DJURzwbCmVgcW2YTM/L9+8J8AgfRffqbPygYY9eXtf5UR4YVAX0wGcVzmcnqwHnjxCw4sX5DW1UDLzXRBtgGWQ==", "requires": { "vue": "^2.1.10" } diff --git a/client/package.json b/client/package.json index b2936593..4f278e53 100644 --- a/client/package.json +++ b/client/package.json @@ -68,7 +68,7 @@ "sass-loader": "^7.1.0", "semver": "^5.3.0", "shelljs": "^0.7.6", - "survey-vue": "^1.0.96", + "survey-vue": "^1.5.18", "uglifyjs-webpack-plugin": "^1.1.1", "unfetch": "^3.1.1", "uploadcare-widget": "^3.6.0", From 4047edff0a564be9065fa5be752e5aba5a46074d Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 15:55:04 +0200 Subject: [PATCH 78/98] Add matrix styling in surveys --- client/src/styles/_forms.scss | 9 +++++++ client/src/styles/_survey.scss | 47 ++++++++++++++++++++++++++++++++++ client/src/survey.config.js | 17 ++++++++---- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/client/src/styles/_forms.scss b/client/src/styles/_forms.scss index e4216776..4511e670 100644 --- a/client/src/styles/_forms.scss +++ b/client/src/styles/_forms.scss @@ -154,4 +154,13 @@ $icon-size: 20px; margin-top: 1px; } } + + &--matrix { + margin: 0; + + #{$base}__label-container { + display: flex; + justify-content: flex-end; + } + } } diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index 39eabfcb..9d53f17d 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -2,6 +2,7 @@ &__page-title { @include main-title; margin-bottom: $large-spacing*2; + span { @include main-title; } @@ -22,6 +23,7 @@ &__question-title { @include heading-4; margin-bottom: $medium-spacing; + > span > span { // weird survey.js html structure @include heading-4; line-height: $default-line-height; @@ -57,6 +59,7 @@ } $progress-margin-right: 140px; + &__progress { background-color: $color-silver-light; height: 0.3em; @@ -67,6 +70,10 @@ margin-right: $progress-margin-right; box-sizing: border-box; display: flex; + + > span { + display: none; + } } &__radiogroup-group, &__checkbox-group { @@ -102,11 +109,51 @@ &__completed-text { @include regular-text; } + + &__matrix { + width: 100%; + } + +} + +.matrix { + margin-bottom: $large-spacing; + + &__row { + display: table-row; + border-top: 1px solid $color-silver; + } + + &__cell { + display: table-cell; + padding: $small-spacing/2 0; + text-align: left; + vertical-align: middle; + @include small-text; + } + + thead { + th { + text-align: right; + @include small-text; + vertical-align: bottom; + padding: $small-spacing/2 $small-spacing; + } + } + + &__radio { + margin: 0; + } + + &__label { + display: flex; + } } .question { $question: &; + &--error #{$question}__input { border-color: $color-error; box-shadow: none; diff --git a/client/src/survey.config.js b/client/src/survey.config.js index 0093c5e9..8476f828 100644 --- a/client/src/survey.config.js +++ b/client/src/survey.config.js @@ -73,11 +73,18 @@ export const css = { 'root': '' }, 'matrix': { - 'root': 'table table-striped', - 'label': 'sv_q_m_label', - 'cellText': 'sv_q_m_cell_text', - 'cellTextSelected': 'sv_q_m_cell_selected bg-primary', - 'cellLabel': 'sv_q_m_cell_label' + 'root': 'survey__matrix matrix', + 'label': 'base-input-container__label-container matrix__label', + 'item': 'survey__matrix-item', + 'itemValue': 'survey__matrix-item matrix__item base-input-container__input', + // 'itemChecked': 'survey__matrix-checked', + // 'itemDecorator': 'survey__matrix-decorator', + 'materialDecorator': 'base-input-container__radiobutton base-input-container__icon matrix__radio', + 'row': 'survey__radiogroup-group matrix__row', + 'cell': 'base-input-container base-input-container--survey base-input-container--matrix matrix__cell', + 'cellText': 'survey__matrix-cell-text', + 'cellTextSelected': 'survey__matrix-cell-text--selected', + 'cellLabel': 'survey__matrix-cell-label' }, 'matrixdropdown': { 'root': 'table' From 4c149eb48efc980ba1ccc4091a83d38bceadbb64 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 16:17:11 +0200 Subject: [PATCH 79/98] Update styles --- client/src/styles/_forms.scss | 2 +- client/src/styles/_survey.scss | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/styles/_forms.scss b/client/src/styles/_forms.scss index 4511e670..5cf07afc 100644 --- a/client/src/styles/_forms.scss +++ b/client/src/styles/_forms.scss @@ -160,7 +160,7 @@ $icon-size: 20px; #{$base}__label-container { display: flex; - justify-content: flex-end; + justify-content: flex-start; } } } diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index 9d53f17d..20934ef7 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -118,6 +118,7 @@ .matrix { margin-bottom: $large-spacing; + position: relative; &__row { display: table-row; @@ -126,7 +127,7 @@ &__cell { display: table-cell; - padding: $small-spacing/2 0; + padding: $medium-spacing 0; text-align: left; vertical-align: middle; @include small-text; @@ -134,10 +135,10 @@ thead { th { - text-align: right; + text-align: left; @include small-text; vertical-align: bottom; - padding: $small-spacing/2 $small-spacing; + padding: $small-spacing/2 $small-spacing/2 $small-spacing/2 0; } } From f1257d925f73910e6c14856f7474509f5172d074 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 16:27:48 +0200 Subject: [PATCH 80/98] Add force parameter to dev deployment step --- bitbucket-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index ae2fd9bb..b24ab09f 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -68,7 +68,7 @@ aliases: deployment: dev trigger: manual script: - - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master + - git push --force-with-lease https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master pipelines: default: From 419c5b78a11a13555dc60a0ecd1785902f7f4708 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 7 Apr 2020 17:29:03 +0200 Subject: [PATCH 81/98] Add real force parameter this time --- bitbucket-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index b24ab09f..5faa72ea 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -68,7 +68,7 @@ aliases: deployment: dev trigger: manual script: - - git push --force-with-lease https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master + - git push --force https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master pipelines: default: From dc662936842fe62af49792eec6d7e7d8bc2f7d9b Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 8 Apr 2020 10:50:06 +0200 Subject: [PATCH 82/98] Add interdisciplinary instrument --- client/src/components/ContentBlock.vue | 12 +++++++++++- client/src/styles/_variables.scss | 1 + .../migrations/0005_auto_20200408_0834.py | 18 ++++++++++++++++++ server/basicknowledge/models.py | 2 ++ .../migrations/0019_auto_20200408_0841.py | 18 ++++++++++++++++++ server/books/models/contentblock.py | 2 ++ 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 server/basicknowledge/migrations/0005_auto_20200408_0834.py create mode 100644 server/books/migrations/0019_auto_20200408_0841.py diff --git a/client/src/components/ContentBlock.vue b/client/src/components/ContentBlock.vue index 0cafb6bd..d3e47114 100644 --- a/client/src/components/ContentBlock.vue +++ b/client/src/components/ContentBlock.vue @@ -57,7 +57,9 @@ const instruments = { base_communication: 'Sprache & Kommunikation', - base_society: 'Gesellschaft' + base_society: 'Gesellschaft', + base_interdisciplinary: 'Überfachliches Instrument', + }; export default { @@ -291,6 +293,14 @@ } } + &--base_interdisciplinary { + @include content-box($color-accent-4-list); + + .content-block__instrument-label { + color: $color-accent-4-dark; + } + } + /deep/ p { line-height: 1.5; margin-bottom: 1em; diff --git a/client/src/styles/_variables.scss b/client/src/styles/_variables.scss index f4d793bd..6e88b0e3 100644 --- a/client/src/styles/_variables.scss +++ b/client/src/styles/_variables.scss @@ -21,6 +21,7 @@ $color-accent-5: #DBE6EC; $color-accent-1-list: $color-accent-1 $color-accent-1-light $color-accent-1-dark; $color-accent-2-list: $color-accent-2 $color-accent-2-light $color-accent-2-dark; +$color-accent-4-list: $color-accent-4 $color-accent-4-light $color-accent-4-dark; /* brand */ $color-brand-dark: #138E72; diff --git a/server/basicknowledge/migrations/0005_auto_20200408_0834.py b/server/basicknowledge/migrations/0005_auto_20200408_0834.py new file mode 100644 index 00000000..caa7b6a3 --- /dev/null +++ b/server/basicknowledge/migrations/0005_auto_20200408_0834.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.15 on 2020-04-08 08:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('basicknowledge', '0004_auto_20191128_1601'), + ] + + operations = [ + migrations.AlterField( + model_name='basicknowledge', + name='type', + field=models.CharField(choices=[('language_communication', 'Sprache & Kommunikation'), ('society', 'Gesellschaft'), ('interdisciplinary', 'Überfachliches Instrument')], max_length=100), + ), + ] diff --git a/server/basicknowledge/models.py b/server/basicknowledge/models.py index 8d320929..273c986d 100644 --- a/server/basicknowledge/models.py +++ b/server/basicknowledge/models.py @@ -26,10 +26,12 @@ class BasicKnowledge(StrictHierarchyPage): LANGUAGE_COMMUNICATION = 'language_communication' SOCIETY = 'society' + INTERDISCIPLINARY = 'interdisciplinary' TYPE_CHOICES = ( (LANGUAGE_COMMUNICATION, 'Sprache & Kommunikation'), (SOCIETY, 'Gesellschaft'), + (INTERDISCIPLINARY, 'Überfachliches Instrument'), ) type = models.CharField( diff --git a/server/books/migrations/0019_auto_20200408_0841.py b/server/books/migrations/0019_auto_20200408_0841.py new file mode 100644 index 00000000..901d9d38 --- /dev/null +++ b/server/books/migrations/0019_auto_20200408_0841.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.15 on 2020-04-08 08:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('books', '0018_remove_module_solutions_enabled_by'), + ] + + operations = [ + migrations.AlterField( + model_name='contentblock', + name='type', + field=models.CharField(choices=[('normal', 'Normal'), ('base_communication', 'Instrument Sprache & Kommunikation'), ('task', 'Auftrag'), ('base_society', 'Instrument Gesellschaft'), ('base_interdisciplinary', 'Überfachliches Instrument')], default='normal', max_length=100), + ), + ] diff --git a/server/books/models/contentblock.py b/server/books/models/contentblock.py index 713cd2fe..de630e30 100644 --- a/server/books/models/contentblock.py +++ b/server/books/models/contentblock.py @@ -27,12 +27,14 @@ class ContentBlock(StrictHierarchyPage): BASE_COMMUNICATION = 'base_communication' TASK = 'task' BASE_SOCIETY = 'base_society' + BASE_INTERDISCIPLINARY = 'base_interdisciplinary' TYPE_CHOICES = ( (NORMAL, 'Normal'), (BASE_COMMUNICATION, 'Instrument Sprache & Kommunikation'), (TASK, 'Auftrag'), (BASE_SOCIETY, 'Instrument Gesellschaft'), + (BASE_INTERDISCIPLINARY, 'Überfachliches Instrument'), ) # blocks without owner are visible by default, need to be hidden for each class From 2af171404431696703bb3674e93b0d3ed2a845e9 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 8 Apr 2020 11:22:41 +0200 Subject: [PATCH 83/98] Clean up code --- client/src/styles/_survey.scss | 1 - client/src/styles/_variables.scss | 10 ---------- client/src/survey.config.js | 2 -- 3 files changed, 13 deletions(-) diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index 20934ef7..cb505cb5 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -118,7 +118,6 @@ .matrix { margin-bottom: $large-spacing; - position: relative; &__row { display: table-row; diff --git a/client/src/styles/_variables.scss b/client/src/styles/_variables.scss index f4d793bd..001b842a 100644 --- a/client/src/styles/_variables.scss +++ b/client/src/styles/_variables.scss @@ -50,16 +50,8 @@ $serif-font-family: "ff-meta-serif-web-pro", serif; $base-font-size: 100%; // 16px in most browsers $base-font-size-pixels: 16px; // used to calculate rem - -//temporary, for room mock, todo: define with real types -$red: #FA5F5F; -$green: #6DD79A; -$brown: #EB9E77; - $list-height: 52px; - - $default-border-radius: 13px; $input-border-radius: 3px; @@ -67,14 +59,12 @@ $input-border-radius: 3px; $modal-lateral-padding: 34px; $modal-input-width: 560px; - $default-padding: 30px; $small-spacing: 10px; $medium-spacing: 20px; $large-spacing: 30px; - $font-weight-bold: 700; $font-weight-semibold: 600; $font-weight-regular: 400; diff --git a/client/src/survey.config.js b/client/src/survey.config.js index 8476f828..35a0bd67 100644 --- a/client/src/survey.config.js +++ b/client/src/survey.config.js @@ -77,8 +77,6 @@ export const css = { 'label': 'base-input-container__label-container matrix__label', 'item': 'survey__matrix-item', 'itemValue': 'survey__matrix-item matrix__item base-input-container__input', - // 'itemChecked': 'survey__matrix-checked', - // 'itemDecorator': 'survey__matrix-decorator', 'materialDecorator': 'base-input-container__radiobutton base-input-container__icon matrix__radio', 'row': 'survey__radiogroup-group matrix__row', 'cell': 'base-input-container base-input-container--survey base-input-container--matrix matrix__cell', From 04ae5a22a88f8098478dce74db5d48c2483d417c Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 8 Apr 2020 14:16:03 +0200 Subject: [PATCH 84/98] Add new favicons --- client/index.html | 9 ++++++++- server/core/static/android-chrome-192x192.png | Bin 0 -> 9785 bytes server/core/static/android-chrome-256x256.png | Bin 0 -> 13370 bytes server/core/static/apple-touch-icon.png | Bin 0 -> 9181 bytes server/core/static/browserconfig.xml | 9 +++++++++ server/core/static/favicon-16x16.png | Bin 0 -> 861 bytes server/core/static/favicon-32x32.png | Bin 0 -> 1398 bytes server/core/static/favicon.ico | Bin 0 -> 15086 bytes server/core/static/mstile-150x150.png | Bin 0 -> 7104 bytes server/core/static/safari-pinned-tab.svg | 19 ++++++++++++++++++ server/core/static/site.webmanifest | 19 ++++++++++++++++++ 11 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 server/core/static/android-chrome-192x192.png create mode 100644 server/core/static/android-chrome-256x256.png create mode 100644 server/core/static/apple-touch-icon.png create mode 100644 server/core/static/browserconfig.xml create mode 100644 server/core/static/favicon-16x16.png create mode 100644 server/core/static/favicon-32x32.png create mode 100644 server/core/static/favicon.ico create mode 100644 server/core/static/mstile-150x150.png create mode 100644 server/core/static/safari-pinned-tab.svg create mode 100644 server/core/static/site.webmanifest diff --git a/client/index.html b/client/index.html index 155dfede..22d43952 100644 --- a/client/index.html +++ b/client/index.html @@ -3,7 +3,7 @@ - skillbox + mySkillbox @@ -11,6 +11,13 @@ + + + + + + + + - - diff --git a/client/src/styles/_default-layout.scss b/client/src/styles/_default-layout.scss index e3da0b86..974a8d0f 100644 --- a/client/src/styles/_default-layout.scss +++ b/client/src/styles/_default-layout.scss @@ -1,7 +1,9 @@ @import "@/styles/_variables.scss"; @import "@/styles/_mixins.scss"; -.skillbox { +.layout { + $footer-height: 287px; + margin: 0 auto; width: 100%; /* @@ -12,17 +14,17 @@ @supports (display: grid) { display: grid; } - grid-template-rows: auto 1fr; + grid-template-rows: auto 1fr auto; + grid-template-areas: "h" "c" "f"; min-height: 100vh; grid-auto-rows: 1fr; - grid-template-areas: "h" "c"; - padding-bottom: 50px; + &--show-filter { - grid-template-rows: auto auto 1fr; - -ms-grid-rows: 50px 50px 30px 1fr; // 1 extra row for gap - grid-template-areas: "h" "." "c"; + grid-template-rows: auto auto 1fr $footer-height; + -ms-grid-rows: 50px 50px 30px 1fr $footer-height; // 1 extra row for gap + grid-template-areas: "h" "." "c" "f"; } /* @@ -48,6 +50,5 @@ &__footer { grid-area: f; - display: none; } } diff --git a/client/src/styles/_mixins.scss b/client/src/styles/_mixins.scss index 0a3d80f3..1df1b9eb 100644 --- a/client/src/styles/_mixins.scss +++ b/client/src/styles/_mixins.scss @@ -117,6 +117,16 @@ font-size: toRem(16px); } +@mixin aside-text { + @include regular-text; + font-size: toRem(14px); +} + +@mixin aside-with-cheese { + @include aside-text; + font-weight: 600; +} + @mixin meta-title { color: $color-silver-dark; font-size: toRem(36px); diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index ecfe5766..2f6e5e7b 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -159,7 +159,6 @@ } .question { - $question: &; &--error #{$question}__input { diff --git a/client/src/styles/_variables.scss b/client/src/styles/_variables.scss index d8a3f2a4..dbc9d725 100644 --- a/client/src/styles/_variables.scss +++ b/client/src/styles/_variables.scss @@ -75,3 +75,5 @@ $default-heading-line-height: 1.2; // popover $popover-default-bottom: -110px; + +$footer-width: 800px; From 159aef307500d99247eb2c44769da762659455c7 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 9 Apr 2020 17:09:01 +0200 Subject: [PATCH 87/98] Add logos --- client/src/components/icons/EhbLogo.vue | 84 +++++++++++++++++++++++++ client/src/components/icons/HepLogo.vue | 47 ++++++++++++++ client/src/layouts/DefaultFooter.vue | 31 +++++++-- 3 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 client/src/components/icons/EhbLogo.vue create mode 100644 client/src/components/icons/HepLogo.vue diff --git a/client/src/components/icons/EhbLogo.vue b/client/src/components/icons/EhbLogo.vue new file mode 100644 index 00000000..1c01c0dc --- /dev/null +++ b/client/src/components/icons/EhbLogo.vue @@ -0,0 +1,84 @@ + + + diff --git a/client/src/components/icons/HepLogo.vue b/client/src/components/icons/HepLogo.vue new file mode 100644 index 00000000..7bf58ca5 --- /dev/null +++ b/client/src/components/icons/HepLogo.vue @@ -0,0 +1,47 @@ + + + diff --git a/client/src/layouts/DefaultFooter.vue b/client/src/layouts/DefaultFooter.vue index 9cb52f12..a048eaab 100644 --- a/client/src/layouts/DefaultFooter.vue +++ b/client/src/layouts/DefaultFooter.vue @@ -10,12 +10,10 @@

- - + + + + - - - - + + + + + + + + +