From a6a83e6b90cdf0221d3ce95ae0b64b14fd00b39f Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Thu, 25 Jul 2024 09:48:26 +0200 Subject: [PATCH 01/80] Install watcher to resolve warning --- client/package-lock.json | 404 +++++++++++++++++++++++++++++++++++++-- client/package.json | 1 + 2 files changed, 386 insertions(+), 19 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 2e2cb333..99246494 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@headlessui/tailwindcss": "^0.2.1", "@headlessui/vue": "^1.7.22", + "@parcel/watcher": "^2.4.1", "@sentry/tracing": "^7.114.0", "@sentry/vue": "^8.17.0", "@urql/exchange-graphcache": "^7.1.2", @@ -3008,6 +3009,266 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@peculiar/asn1-schema": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", @@ -5448,7 +5709,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -6982,6 +7242,17 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -7972,7 +8243,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9031,7 +9301,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9048,7 +9317,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -9102,7 +9370,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -10048,7 +10315,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -10212,6 +10478,11 @@ "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -10780,7 +11051,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -12380,7 +12650,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -16593,6 +16862,101 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "requires": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "optional": true + }, "@peculiar/asn1-schema": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", @@ -18406,7 +18770,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -19508,6 +19871,11 @@ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -20261,7 +20629,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -21019,8 +21386,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -21031,7 +21397,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -21069,8 +21434,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -21768,7 +22132,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -21884,6 +22247,11 @@ "tslib": "^2.0.3" } }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -22315,8 +22683,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "2.3.0", @@ -23412,7 +23779,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } diff --git a/client/package.json b/client/package.json index 6b1d177e..8b6fded3 100644 --- a/client/package.json +++ b/client/package.json @@ -20,6 +20,7 @@ "dependencies": { "@headlessui/tailwindcss": "^0.2.1", "@headlessui/vue": "^1.7.22", + "@parcel/watcher": "^2.4.1", "@sentry/tracing": "^7.114.0", "@sentry/vue": "^8.17.0", "@urql/exchange-graphcache": "^7.1.2", From 125d3b2b1403d9876f093878aed41a111a0d9266 Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Thu, 25 Jul 2024 11:04:32 +0200 Subject: [PATCH 02/80] Calculate competence certificate grades over all course sessions --- client/src/composables.ts | 11 ++-- .../CompetenceCertificateDetailPage.vue | 6 ++- .../CompetenceCertificateListPage.vue | 51 +++++++++++++------ 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/client/src/composables.ts b/client/src/composables.ts index 15ecb645..6c231576 100644 --- a/client/src/composables.ts +++ b/client/src/composables.ts @@ -693,15 +693,18 @@ export function useCourseStatisticsv2(courseSlug: string) { }; } -export function useCertificateQuery(userId: string | undefined, courseSlug: string) { +export function useCertificateQuery( + userId: string | undefined, + courseSlug: string, + courseSession: CourseSession +) { const certificatesQuery = (() => { - const courseSession = useCurrentCourseSession(); if (userId) { return useQuery({ query: COMPETENCE_NAVI_CERTIFICATE_FOR_USER_QUERY, variables: { courseSlug: courseSlug, - courseSessionId: courseSession.value.id, + courseSessionId: courseSession.id, userId: userId, }, }); @@ -710,7 +713,7 @@ export function useCertificateQuery(userId: string | undefined, courseSlug: stri query: COMPETENCE_NAVI_CERTIFICATE_QUERY, variables: { courseSlug: courseSlug, - courseSessionId: courseSession.value.id, + courseSessionId: courseSession.id, }, }); } diff --git a/client/src/pages/competence/CompetenceCertificateDetailPage.vue b/client/src/pages/competence/CompetenceCertificateDetailPage.vue index 80bdf276..aa5dd79c 100644 --- a/client/src/pages/competence/CompetenceCertificateDetailPage.vue +++ b/client/src/pages/competence/CompetenceCertificateDetailPage.vue @@ -2,7 +2,7 @@ import log from "loglevel"; import { computed } from "vue"; import type { CompetenceCertificate } from "@/types"; -import { useCertificateQuery } from "@/composables"; +import { useCertificateQuery, useCurrentCourseSession } from "@/composables"; import CompetenceCertificateComponent from "@/pages/competence/CompetenceCertificateComponent.vue"; import { getCertificates } from "@/services/competence"; import { getPreviousRoute } from "@/router/history"; @@ -15,9 +15,11 @@ const props = defineProps<{ log.debug("CompetenceCertificateDetailPage setup", props); +const courseSession = useCurrentCourseSession(); const certificatesQuery = useCertificateQuery( props.userId, - props.courseSlug + props.courseSlug, + courseSession.value ).certificatesQuery; const certificate = computed(() => { diff --git a/client/src/pages/competence/CompetenceCertificateListPage.vue b/client/src/pages/competence/CompetenceCertificateListPage.vue index 7beb5b70..5bd80975 100644 --- a/client/src/pages/competence/CompetenceCertificateListPage.vue +++ b/client/src/pages/competence/CompetenceCertificateListPage.vue @@ -2,7 +2,7 @@ import log from "loglevel"; import { computed, onMounted } from "vue"; import type { CompetenceCertificate } from "@/types"; -import { useCertificateQuery } from "@/composables"; +import { useCertificateQuery, useCurrentCourseSession } from "@/composables"; import CompetenceCertificateComponent from "@/pages/competence/CompetenceCertificateComponent.vue"; import { assignmentsUserPoints, @@ -10,6 +10,8 @@ import { } from "@/pages/competence/utils"; import { useRoute } from "vue-router"; import { getCertificates } from "@/services/competence"; +import { useCourseSessionsStore } from "@/stores/courseSessions"; +import dayjs from "dayjs"; const props = defineProps<{ courseSlug: string; @@ -20,24 +22,41 @@ log.debug("CompetenceCertificateListPage setup", props); const route = useRoute(); -const certificatesQuery = useCertificateQuery( - props.userId, - props.courseSlug -).certificatesQuery; +const store = useCourseSessionsStore(); +const certificateQueries = store.allCourseSessions.map((courseSession) => { + return useCertificateQuery(props.userId, props.courseSlug, courseSession) + .certificatesQuery; +}); const competenceCertificates = computed(() => { - const certificates = getCertificates( - certificatesQuery.data.value, - props.userId ?? null - ); - - if (!certificates) { - return null; + const competenceCertificates: Record = {}; + for (const query of certificateQueries) { + const certificates = + (getCertificates(query.data.value, props.userId ?? null) + ?.competence_certificates as unknown as CompetenceCertificate[]) ?? []; + for (const certificate of certificates) { + if (!competenceCertificates[certificate.id]) { + // Competence certificate does not exist yet + competenceCertificates[certificate.id] = certificate; + } else { + // Merge with assignment completions of existing competence certificate. If there are multiple completions for the same assignment, keep the latest one. + competenceCertificates[certificate.id].assignments.push( + ...certificate.assignments.filter((assignment) => { + const existingAssignment = competenceCertificates[ + certificate.id + ].assignments.find((a) => a.id === assignment.id); + return ( + !existingAssignment || + dayjs(assignment.completion?.evaluation_submitted_at).isAfter( + dayjs(existingAssignment.completion?.evaluation_submitted_at) + ) + ); + }) + ); + } + } } - - return ( - (certificates?.competence_certificates as unknown as CompetenceCertificate[]) ?? [] - ); + return Object.values(competenceCertificates); }); const assignments = computed(() => { From c2c333153908278239ca6de63bc397006f6c98f9 Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Thu, 25 Jul 2024 11:04:44 +0200 Subject: [PATCH 03/80] Update elia env secret --- env_secrets/local_elia.env | Bin 577 -> 1529 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/env_secrets/local_elia.env b/env_secrets/local_elia.env index 133603a613548d53592ee797dadbaa89856b8564..2ea6b0a9781c4258b0a214dd0e8ecbfbe2f1e2ea 100644 GIT binary patch literal 1529 zcmV1HJ>8 zFdRU_tW?eu6Vq7bRV9T(kZR^a>U1=Sy}-9?G4ok&Yu5`$mjsl%r&XmP>nfdjfkKw` zF`^D4BfUp%*V?<#*>Sij^uL>@;hCeF+Rb#_@g47^cQwTC>CjEjhcjnxEg?3TC(5*G=MS)3!7BU0Eo}jnr!9k+$Zl^ga)y%*Z zSM4K4;k2>`EwstlRo~nSoQ{rDmJdh$o+MdW*qhhQT=Sr+|90X(2TWXhG@ zJU2SVYg?*QTybxseDcH4pgav>7ttee>-HmjB0`R3ZJCt}(fa2iU>cBt8px5f>kU;g zM0nC6;wv#Lj28KX5Qr3)Ia>*PUWd&BP(YR43m{qA`42pD2s9LgSwT zdY`D^qcliq?>>x_)I$$@T(yMJFCOm7fESpyEzK&gNKUs5pyhrybQ0xd;b3FB$*Nnm z_W(sJifq~V4-RSGwr&6LKQf($zygI74!RT^liS$G;z9@pkB$TkfKg)b#$|Veb(f30 z^6)GPwfI`cAB3%LCD7OgOiO^e=^4@|N)|W$Sh*z;9gj9D^!}^keUbpLBjhy15Q|lW^MV4BrCji{t2qd1dH-jYfeLIZ;K&?0rJz9q$ zSE%~M6mmH6g5z&wY;a_wi5Yk6%V7A${VAA}hX=J0tb8qLK5B*)bYGU&Yi7Ne=+k#} ztn(MAvJHqCb~U73$)V$9LEB;MGV6pbQsviE9aic zjw5@J>w*ys*@aVhuP@_fdF3qW*lCa4hI9AGJG1MlLR7Y$>s~}Qrc7%_B<0S8E5NI` zShPc)s6z^)L)izt3%C@4cdfwPXAB?HLoe2qkF!OXR4eAqN>O>gWNm|qP@JbWK zz@?ZqbS`cEg0A$gu&$E=y^WEJ_z6CkAXrxH1@AP$LagS3vIz5pp&HL7_-V+H$NXx# zn*wkn?x_=L1TB!MYy$*smkzOfoV1v^PHG1+Ej%2LgzuKkIMni-TzU_OW^{M9B(D9S zy?3=d+$(C4%0%42N@a>tSCNOk>hE6-hP<&x1i?=H(pV`0?qj{@9%@9{AD`rOhq@>^|y^k*G9*XV3z2{H}3xr?&`NW0Vq&ef1hVK@G zfR*4Ycfayif2Nx?45mv`G_Q>X%F?EOG{Lc#GagKS_l{|%kGhPz=uIT^+Z}53qUnHS zyZ44wRvdr!ajk&L@QtW@$Bn@w@dwQg3QUu} zVi)ZIgo?sV1&y+eALVdQRKU}jtksK@!i&}L*Quu1U(B%j*NV(>B4>|9Z}u92E8ndT zPQ*kRq$u5;aBBsf79(tAC~!o?u-D4L5-g8*s==oLOAKYJm1rgio9!i181OGP-XmSg f|HkC6PW94U&QNa=s+`5aLR@rEd=Lm5@2tK^z*qJM literal 577 zcmV-H0>1qKM@dveQdv+`0Blt{A6^;*(l&Q~%P|Vs1ZqS~j zXb8fxnJfFAx7`HcJO@gt^E}JKyU!CGxiR3agyiSOSGybp`@qAJG#mb;NOGLlty0^T zP*D-h6ca8^YR%2iHKRDT8o%u3i4}`Poi$n&D%E;o!A!+)F?OZlNXdjsuwVG0B!wWI z{|;zx?O0uCh*I3iWQ2V%hsbovY4kMMvvyhFl(vMG&WX2@SWa?ZUN5Af#4ceq+KkVx zZDpX->|6_XmE^4FGAj&GpfCA}6+YWO0SaUzMYTGEMS+JjHDoHy+P7=r^$QK-29)_hr*!R z(W9ku Date: Wed, 31 Jul 2024 11:45:42 +0200 Subject: [PATCH 04/80] Implement unified grading --- .../CompetenceCertificateDetailPage.vue | 26 +- .../CompetenceCertificateListPage.vue | 48 ++-- .../pages/competence/CompetenceIndexPage.vue | 41 ++-- client/src/pages/competence/utils.ts | 53 ++++ .../competenceCertificate.cy.js | 230 +++++++++++------- cypress/support/commands.js | 98 ++++---- package.json | 1 + .../core/management/commands/cypress_reset.py | 66 ++++- 8 files changed, 352 insertions(+), 211 deletions(-) diff --git a/client/src/pages/competence/CompetenceCertificateDetailPage.vue b/client/src/pages/competence/CompetenceCertificateDetailPage.vue index aa5dd79c..a83cbd3e 100644 --- a/client/src/pages/competence/CompetenceCertificateDetailPage.vue +++ b/client/src/pages/competence/CompetenceCertificateDetailPage.vue @@ -6,6 +6,8 @@ import { useCertificateQuery, useCurrentCourseSession } from "@/composables"; import CompetenceCertificateComponent from "@/pages/competence/CompetenceCertificateComponent.vue"; import { getCertificates } from "@/services/competence"; import { getPreviousRoute } from "@/router/history"; +import { mergeCompetenceCertificates } from "./utils"; +import { useCourseSessionsStore } from "@/stores/courseSessions"; const props = defineProps<{ courseSlug: string; @@ -15,26 +17,24 @@ const props = defineProps<{ log.debug("CompetenceCertificateDetailPage setup", props); -const courseSession = useCurrentCourseSession(); -const certificatesQuery = useCertificateQuery( - props.userId, - props.courseSlug, - courseSession.value -).certificatesQuery; +const store = useCourseSessionsStore(); +const certificateQueries = store.allCourseSessions.map((courseSession) => { + return useCertificateQuery(props.userId, props.courseSlug, courseSession) + .certificatesQuery; +}); const certificate = computed(() => { - const certificates = getCertificates( - certificatesQuery.data.value, - props.userId ?? null - ); + const competenceCertificatesPerCs = certificateQueries.map((query) => { + return getCertificates(query.data.value, props.userId!) + ?.competence_certificates as unknown as CompetenceCertificate[]; + }); + const certificates = mergeCompetenceCertificates(competenceCertificatesPerCs.flat()); if (!certificates) { return null; } - return ( - (certificates.competence_certificates as unknown as CompetenceCertificate[]) ?? [] - ).find((cc) => cc.slug.endsWith(props.certificateSlug)); + return certificates.find((cc) => cc.slug.endsWith(props.certificateSlug)); }); diff --git a/client/src/pages/competence/CompetenceCertificateListPage.vue b/client/src/pages/competence/CompetenceCertificateListPage.vue index 5bd80975..8db065a8 100644 --- a/client/src/pages/competence/CompetenceCertificateListPage.vue +++ b/client/src/pages/competence/CompetenceCertificateListPage.vue @@ -2,11 +2,12 @@ import log from "loglevel"; import { computed, onMounted } from "vue"; import type { CompetenceCertificate } from "@/types"; -import { useCertificateQuery, useCurrentCourseSession } from "@/composables"; +import { useCertificateQuery } from "@/composables"; import CompetenceCertificateComponent from "@/pages/competence/CompetenceCertificateComponent.vue"; import { assignmentsUserPoints, calcCompetencesTotalGrade, + mergeCompetenceCertificates, } from "@/pages/competence/utils"; import { useRoute } from "vue-router"; import { getCertificates } from "@/services/competence"; @@ -23,48 +24,29 @@ log.debug("CompetenceCertificateListPage setup", props); const route = useRoute(); const store = useCourseSessionsStore(); +console.log( + `Loading competence certificates from ${store.allCourseSessions.length} course sessions:`, + store.allCourseSessions.map((cs) => cs.title) +); const certificateQueries = store.allCourseSessions.map((courseSession) => { return useCertificateQuery(props.userId, props.courseSlug, courseSession) .certificatesQuery; }); -const competenceCertificates = computed(() => { - const competenceCertificates: Record = {}; - for (const query of certificateQueries) { - const certificates = - (getCertificates(query.data.value, props.userId ?? null) - ?.competence_certificates as unknown as CompetenceCertificate[]) ?? []; - for (const certificate of certificates) { - if (!competenceCertificates[certificate.id]) { - // Competence certificate does not exist yet - competenceCertificates[certificate.id] = certificate; - } else { - // Merge with assignment completions of existing competence certificate. If there are multiple completions for the same assignment, keep the latest one. - competenceCertificates[certificate.id].assignments.push( - ...certificate.assignments.filter((assignment) => { - const existingAssignment = competenceCertificates[ - certificate.id - ].assignments.find((a) => a.id === assignment.id); - return ( - !existingAssignment || - dayjs(assignment.completion?.evaluation_submitted_at).isAfter( - dayjs(existingAssignment.completion?.evaluation_submitted_at) - ) - ); - }) - ); - } - } - } - return Object.values(competenceCertificates); +const mergedCertificates = computed(() => { + const competenceCertificatesPerCs = certificateQueries.map((query) => { + return getCertificates(query.data.value, props.userId ?? null) + ?.competence_certificates as unknown as CompetenceCertificate[]; + }); + return mergeCompetenceCertificates(competenceCertificatesPerCs.flat()); }); const assignments = computed(() => { - return competenceCertificates?.value?.flatMap((cc) => cc.assignments); + return mergedCertificates?.value?.flatMap((cc) => cc.assignments); }); const totalGrade = computed(() => { - return calcCompetencesTotalGrade(competenceCertificates.value ?? []); + return calcCompetencesTotalGrade(mergedCertificates.value ?? []); }); const userPointsEvaluatedAssignments = computed(() => { @@ -121,7 +103,7 @@ onMounted(async () => {
cs.title) +); +const certificateQueries = store.allCourseSessions.map((courseSession) => { + return useCertificateQuery(undefined, props.courseSlug, courseSession) + .certificatesQuery; }); -const competenceCertificates = computed(() => { - return ( - (certificatesQuery.data.value?.competence_certificate_list - ?.competence_certificates as unknown as CompetenceCertificate[]) ?? [] - ); +const mergedCertificates = computed(() => { + const competenceCertificatesPerCs = certificateQueries.map((query) => { + return getCertificates(query.data.value, null) + ?.competence_certificates as unknown as CompetenceCertificate[]; + }); + + return mergeCompetenceCertificates(competenceCertificatesPerCs.flat()); }); const allAssignments = computed(() => { - return competenceCertificates.value.flatMap((cc) => cc.assignments); + return mergedCertificates.value.flatMap((cc) => cc.assignments); }); const userPointsEvaluatedAssignments = computed(() => { @@ -49,7 +54,7 @@ const userPointsEvaluatedAssignments = computed(() => { const currentCourseSession = useCurrentCourseSession(); -const isLoaded = computed(() => !certificatesQuery.fetching.value); +const isLoaded = computed(() => !certificateQueries.some((q) => q.fetching.value)); const router = useRouter(); @@ -68,7 +73,7 @@ const router = useRouter();
{{ $t("a.Erfahrungsnote üK") }}: - {{ calcCompetencesTotalGrade(competenceCertificates ?? []) }} + {{ calcCompetencesTotalGrade(mergedCertificates ?? []) }} @@ -83,7 +88,7 @@ const router = useRouter();
+ > = {}; + competenceCertificates.forEach((certificate) => { + if (!certificate) { + return; + } + if (!groupedCompetenceCertificates[certificate.id]) { + groupedCompetenceCertificates[certificate.id] = []; + } + groupedCompetenceCertificates[certificate.id].push(certificate); + }); + + console.log( + `Found ${Object.keys(groupedCompetenceCertificates).length} competence certificates over all course sessions` + ); + + return Object.values(groupedCompetenceCertificates).map((certificates) => { + const mergedCertificate: CompetenceCertificate = { + ...certificates[0], + assignments: [], + }; + certificates.forEach((certificate) => { + certificate.assignments.forEach((assignment) => { + const existingAssignment = mergedCertificate.assignments.find( + (a) => a.id === assignment.id + ); + if (!existingAssignment) { + mergedCertificate.assignments.push(assignment); + } else if ( + assignment.completion != null && + (existingAssignment.completion == null || + dayjs(existingAssignment.completion.evaluation_submitted_at).isBefore( + assignment.completion.evaluation_submitted_at + )) + ) { + mergedCertificate.assignments.splice( + mergedCertificate.assignments.findIndex((a) => a.id === assignment.id), + 1 + ); + mergedCertificate.assignments.push(assignment); + } + }); + }); + return mergedCertificate; + }); +} diff --git a/cypress/e2e/competenceNavi/competenceCertificate.cy.js b/cypress/e2e/competenceNavi/competenceCertificate.cy.js index aea07312..b038d630 100644 --- a/cypress/e2e/competenceNavi/competenceCertificate.cy.js +++ b/cypress/e2e/competenceNavi/competenceCertificate.cy.js @@ -1,26 +1,26 @@ -import { login } from "../helpers"; +import { login } from "../helpers" describe("competenceCertificate.cy.js", () => { - beforeEach(() => {}); + beforeEach(() => { }) it("check without points", () => { - cy.manageCommand("cypress_reset"); - login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/competence"); + cy.manageCommand("cypress_reset") + login("test-student1@example.com", "test") + cy.visit("/course/test-lehrgang/competence") cy.get('[data-cy="certificate-total-points-text"]').contains( "Der Punktestand wird zu einem späteren Zeitpunkt berechnet." - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' - ).and("contain", "0 von 2 Kompetenznachweis-Elementen"); + ).and("contain", "0 von 2 Kompetenznachweis-Elementen") // check on certificates page - cy.get('[data-cy="certificates-show-all-button"]').click(); + cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificate-total-points-text"]').contains( "Der Punktestand wird zu einem späteren Zeitpunkt berechnet." - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' @@ -29,100 +29,100 @@ describe("competenceCertificate.cy.js", () => { "contain", "Der Punktestand wird zu einem späteren Zeitpunkt berechnet." ) - .and("contain", "0 von 2 Kompetenznachweis-Elementen"); + .and("contain", "0 von 2 Kompetenznachweis-Elementen") // check certificate detail page cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' - ).click(); + ).click() cy.get( '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' - ).should("contain", "Höchstpunktzahl"); + ).should("contain", "Höchstpunktzahl") cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' - ).should("contain", "Höchstpunktzahl"); - }); + ).should("contain", "Höchstpunktzahl") + }) it("check with finished passed edoniq test", () => { cy.manageCommand( "cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 0" - ); - login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/competence"); + ) + login("test-student1@example.com", "test") + cy.visit("/course/test-lehrgang/competence") cy.get('[data-cy="certificate-total-points-text"]').contains( "Erfahrungsnote üK: 5" - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .should("contain", "Note: 5") - .and("contain", "1 von 2 Kompetenznachweis-Elementen"); + .and("contain", "1 von 2 Kompetenznachweis-Elementen") // check on certificates page - cy.get('[data-cy="certificates-show-all-button"]').click(); + cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificate-total-points-text"]') .should("contain", "Erfahrungsnote üK") - .and("contain", "Zwischenstand"); - cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5"); + .and("contain", "Zwischenstand") + cy.get('[data-cy="certificate-total-grade"]').should("contain", "Note: 5") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' - ).should("contain", "Note: 5"); + ).should("contain", "Note: 5") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' - ).should("contain", "Ungerundete Note: 4.96"); + ).should("contain", "Ungerundete Note: 4.96") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .and("contain", "Zwischenstand") - .and("contain", "1 von 2 Kompetenznachweis-Elementen"); + .and("contain", "1 von 2 Kompetenznachweis-Elementen") // check certificate detail page cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' - ).click(); + ).click() cy.get( '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' ) .should("contain", "Höchstpunktzahl") - .and("contain", "Ergebnisse abgegeben"); + .and("contain", "Ergebnisse abgegeben") cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' ) .should("contain", "19") .and("contain", "Bewertung freigegeben") - .and("not.contain", "Nicht Bestanden"); + .and("not.contain", "Nicht Bestanden") // it can open learning content page directly cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' - ).click(); + ).click() cy.get('[data-cy="test-result"]') .should("contain", "19 von 24 Punkten") - .and("contain", "79%"); - }); + .and("contain", "79%") + }) it("check with finished failed edoniq test", () => { cy.manageCommand( "cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24 0" - ); - login("test-student1@example.com", "test"); + ) + login("test-student1@example.com", "test") // go to certificate detail page cy.visit( "/course/test-lehrgang/competence/certificates/kompetenznachweis-1" - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' - ).should("contain", "Note: 3"); + ).should("contain", "Note: 3") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' - ).should("contain", "Ungerundete Note: 3.08"); + ).should("contain", "Ungerundete Note: 3.08") cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' @@ -130,90 +130,148 @@ describe("competenceCertificate.cy.js", () => { .should("contain", "10") .and("contain", "Bewertung freigegeben") .and("contain", "42%") - .and("contain", "Nicht bestanden"); + .and("contain", "Nicht bestanden") // it can open learning content page directly cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' - ).click(); + ).click() cy.get('[data-cy="test-result"]') .should("contain", "10 von 24 Punkten") .and("contain", "42%") - .and("contain", "Nicht bestanden"); - }); + .and("contain", "Nicht bestanden") + }) it("check with finished edoniq test and finished casework", () => { cy.manageCommand( "cypress_reset --create-assignment-evaluation --create-edoniq-test-results 19 24 0" - ); - login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/competence"); + ) + login("test-student1@example.com", "test") + cy.visit("/course/test-lehrgang/competence") cy.get('[data-cy="certificate-total-points-text"]').contains( "Erfahrungsnote üK: 5.5" - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .should("contain", "Note: 5.5") - .and("contain", "2 von 2 Kompetenznachweis-Elementen"); + .and("contain", "2 von 2 Kompetenznachweis-Elementen") // check on certificates page - cy.get('[data-cy="certificates-show-all-button"]').click(); + cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificate-total-points-text"]') .should("contain", "Erfahrungsnote üK") .and("contain", "Note: 5.5") - .and("not.contain", "Zwischenstand"); + .and("not.contain", "Zwischenstand") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .and("not.contain", "Zwischenstand") - .and("contain", "2 von 2 Kompetenznachweis-Elementen"); + .and("contain", "2 von 2 Kompetenznachweis-Elementen") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' - ).should("contain", "Note: 5.5"); + ).should("contain", "Note: 5.5") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' - ).should("contain", "Ungerundete Note: 5.48"); + ).should("contain", "Ungerundete Note: 5.48") // check certificate detail page cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' - ).click(); + ).click() cy.get( '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' ) .should("contain", "24") .and("contain", "von 24 Punkten") - .and("contain", "Bewertung freigegeben"); + .and("contain", "Bewertung freigegeben") cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' ) .should("contain", "19") .and("contain", "von 24 Punkten") - .and("contain", "Bewertung freigegeben"); - }); + .and("contain", "Bewertung freigegeben") + }) + + it("check with finished edoniq test and finished casework in different course sessions", () => { + const TEST_TRAINER2_USER_ID = "299941ae-1e4b-4f45-8180-876c3ad340b4" + const TEST_STUDENT2_USER_ID = "19c40d94-15cc-4198-aaad-ef707c4b0900" + const TEST_COURSE_SESSION_ZURICH_ID = -2 + cy.manageCommand( + `cypress_reset --create-assignment-evaluation --assignment-evaluation-user-id ${TEST_TRAINER2_USER_ID} --assignment-completion-user-id ${TEST_STUDENT2_USER_ID} --edoniq-user-id ${TEST_STUDENT2_USER_ID} --edoniq-course-session-id '${TEST_COURSE_SESSION_ZURICH_ID}' --create-edoniq-test-results 19 24 0` + ) + login("test-student2@example.com", "test") + cy.visit("/course/test-lehrgang/competence") + + cy.get('[data-cy="certificate-total-points-text"]').contains( + "Erfahrungsnote üK: 5.5" + ) + + cy.get( + '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' + ) + .should("contain", "Note: 5.5") + .and("contain", "2 von 2 Kompetenznachweis-Elementen") + + // check on certificates page + cy.get('[data-cy="certificates-show-all-button"]').click() + cy.get('[data-cy="certificate-total-points-text"]') + .should("contain", "Erfahrungsnote üK") + .and("contain", "Note: 5.5") + .and("not.contain", "Zwischenstand") + + cy.get( + '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' + ) + .and("not.contain", "Zwischenstand") + .and("contain", "2 von 2 Kompetenznachweis-Elementen") + cy.get( + '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' + ).should("contain", "Note: 5.5") + cy.get( + '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' + ).should("contain", "Ungerundete Note: 5.48") + + // check certificate detail page + cy.get( + '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' + ).click() + + cy.get( + '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' + ) + .should("contain", "24") + .and("contain", "von 24 Punkten") + .and("contain", "Bewertung freigegeben") + cy.get( + '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' + ) + .should("contain", "19") + .and("contain", "von 24 Punkten") + .and("contain", "Bewertung freigegeben") + }) it("check with finished edoniq test with deducted points", () => { cy.manageCommand( "cypress_reset --create-assignment-completion --create-edoniq-test-results 19 24 8" - ); - login("test-student1@example.com", "test"); + ) + login("test-student1@example.com", "test") // go to certificate detail page cy.visit( "/course/test-lehrgang/competence/certificates/kompetenznachweis-1" - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' - ).should("contain", "Note: 3.5"); + ).should("contain", "Note: 3.5") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' - ).should("contain", "Ungerundete Note: 3.29"); + ).should("contain", "Ungerundete Note: 3.29") cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' @@ -222,61 +280,61 @@ describe("competenceCertificate.cy.js", () => { .and("contain", "Bewertung freigegeben") .and("contain", "46%") .and("contain", "mit Abzug") - .and("contain", "Nicht bestanden"); + .and("contain", "Nicht bestanden") // it can open learning content page directly cy.get( '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' - ).click(); + ).click() cy.get('[data-cy="test-result"]') .should("contain", "11 von 24 Punkten") .and("contain", "46%") .and("contain", "Punkte aus Bewertung: 19") .and("contain", "Abgezogene Punkte: 8") .and("contain", "Grund: Edoniq Punkteabzug Test") - .and("contain", "Nicht bestanden"); - }); + .and("contain", "Nicht bestanden") + }) it("check with finished casework and points deducted", () => { cy.manageCommand( "cypress_reset --create-assignment-evaluation --assignment-evaluation-scores 4,6,4,3,2 --assignment-points-deducted 5" - ); - login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/competence"); + ) + login("test-student1@example.com", "test") + cy.visit("/course/test-lehrgang/competence") cy.get('[data-cy="certificate-total-points-text"]').contains( "Erfahrungsnote üK: 4" - ); + ) cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .should("contain", "Note: 4") - .and("contain", "1 von 2 Kompetenznachweis-Elementen"); + .and("contain", "1 von 2 Kompetenznachweis-Elementen") // check on certificates page - cy.get('[data-cy="certificates-show-all-button"]').click(); + cy.get('[data-cy="certificates-show-all-button"]').click() cy.get('[data-cy="certificate-total-points-text"]') .should("contain", "Erfahrungsnote üK") .and("contain", "Note: 4") - .and("contain", "Zwischenstand"); + .and("contain", "Zwischenstand") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]' ) .and("contain", "Zwischenstand") - .and("contain", "1 von 2 Kompetenznachweis-Elementen"); + .and("contain", "1 von 2 Kompetenznachweis-Elementen") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade"]' - ).should("contain", "Note: 4"); + ).should("contain", "Note: 4") cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-grade-percent"]' - ).should("contain", "Ungerundete Note: 3.92"); + ).should("contain", "Ungerundete Note: 3.92") // check certificate detail page cy.get( '[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]' - ).click(); + ).click() cy.get( '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]' @@ -285,28 +343,28 @@ describe("competenceCertificate.cy.js", () => { .and("contain", "von 24 Punkten") .and("contain", "58%") .and("contain", "mit Abzug") - .and("contain", "Bewertung freigegeben"); + .and("contain", "Bewertung freigegeben") cy.get( '[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"] [data-cy="open-learning-content"]' - ).click(); - cy.get('[data-cy="user-points"]').should("contain", "14"); + ).click() + cy.get('[data-cy="user-points"]').should("contain", "14") cy.get('[data-cy="total-points"]').should( "contain", "von 24 Punkten (58%)" - ); + ) cy.get('[data-cy="points-deducted"]') .should("contain", "Punkte aus Bewertung: 19") .and("contain", "Abgezogene Punkte: 5") - .and("contain", "Grund: Assignment Punkteabzug Test"); - }); + .and("contain", "Grund: Assignment Punkteabzug Test") + }) it("should display link to details", () => { - cy.manageCommand("cypress_reset"); - login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback"); + cy.manageCommand("cypress_reset") + login("test-student1@example.com", "test") + cy.visit("/course/test-lehrgang/competence/self-evaluation-and-feedback") cy.get('[data-cy^="self-eval-"][data-cy$="-detail-url"]:first').contains( "Selbsteinschätzung anschauen" - ); - }); -}); + ) + }) +}) diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 50dfdf30..9c16dcb8 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -50,20 +50,20 @@ // -- This is will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) -const _ = Cypress._; +const _ = Cypress._ Cypress.Commands.add("manageCommand", (command, preCommand = "") => { - const execCommand = `${preCommand} python server/manage.py ${command} --settings=config.settings.test_cypress`; - console.log(execCommand); + const execCommand = `${preCommand} python server/manage.py ${command} --settings=config.settings.test_cypress` + console.log(execCommand) // hack to add my asdf python instance to the path // so I can run the test directly from within IntelliJ let pythonPaths = [ "/Users/daniel/workspace/vbv_lernwelt/.direnv/python-3.10.6/bin", - "/Users/eliabieri/iterativ/vbv_lernwelt/.direnv/python-3.10.6/bin", + "/Users/eliabieri/iterativ/vbv_lernwelt/.direnv/python-3.10/bin", "/Users/christiancueni/workspace/vbv_lernwelt/.direnv/python-3.10.6/bin", "/Users/renzo/workspace/vbv_lernwelt/.direnv/python-3.10.6/bin", - ]; - let bashCommand = `PATH=${pythonPaths.join(":")}:$PATH && ${execCommand}`; + ] + let bashCommand = `PATH=${pythonPaths.join(":")}:$PATH && ${execCommand}` return cy .exec(`bash -c "${bashCommand}"`, { failOnNonZeroExit: true, @@ -73,14 +73,14 @@ Cypress.Commands.add("manageCommand", (command, preCommand = "") => { throw new Error(`Execution of "${command}" failed Exit code: ${result.code} Stdout:\n${result.stdout} - Stderr:\n${result.stderr}`); + Stderr:\n${result.stderr}`) } - }); -}); + }) +}) Cypress.Commands.add("manageShellCommand", (command) => { - return cy.manageCommand(`shell -c '${command}'`); -}); + return cy.manageCommand(`shell -c '${command}'`) +}) function loadObjectJson( key, @@ -89,28 +89,28 @@ function loadObjectJson( serializerModelPath, valueAsString = false ) { - const djangoModel = _.last(djangoModelPath.split(".")); - const djangoModelImportPath = _.initial(djangoModelPath.split(".")).join("."); - const serializerModel = _.last(serializerModelPath.split(".")); + const djangoModel = _.last(djangoModelPath.split(".")) + const djangoModelImportPath = _.initial(djangoModelPath.split(".")).join(".") + const serializerModel = _.last(serializerModelPath.split(".")) const serializerModelImportPath = _.initial( serializerModelPath.split(".") - ).join("."); + ).join(".") - let filterPart = `${key}=${value}`; + let filterPart = `${key}=${value}` if (valueAsString) { - filterPart = `${key}=\\"${value}\\"`; + filterPart = `${key}=\\"${value}\\"` } if (_.isArray(key)) { filterPart = _.zip(key, value) .map(([k, v]) => { if (valueAsString) { - return `${k}=\\"${v}\\"`; + return `${k}=\\"${v}\\"` } else { - return `${k}=${v}`; + return `${k}=${v}` } }) - .join(","); + .join(",") } const command = `from ${djangoModelImportPath} import ${djangoModel}; @@ -119,13 +119,13 @@ function loadObjectJson( object = ${djangoModel}.objects.filter(${filterPart}).first(); print(create_json_from_objects(object, ${serializerModel}, many=False)); exit(); - `.replace(/(?:\r\n|\r|\n)/g, ""); + `.replace(/(?:\r\n|\r|\n)/g, "") return cy.manageShellCommand(command).then((result) => { - const objectJson = JSON.parse(result.stdout); + const objectJson = JSON.parse(result.stdout) // console.log(command); - console.log(objectJson); - return objectJson; - }); + console.log(objectJson) + return objectJson + }) } Cypress.Commands.add("loadAssignmentCompletion", (key, value) => { @@ -135,8 +135,8 @@ Cypress.Commands.add("loadAssignmentCompletion", (key, value) => { "vbv_lernwelt.assignment.models.AssignmentCompletion", "vbv_lernwelt.assignment.serializers.CypressAssignmentCompletionSerializer", true - ); -}); + ) +}) Cypress.Commands.add("loadSecurityRequestResponseLog", (key, value) => { return loadObjectJson( @@ -145,8 +145,8 @@ Cypress.Commands.add("loadSecurityRequestResponseLog", (key, value) => { "vbv_lernwelt.core.models.SecurityRequestResponseLog", "vbv_lernwelt.core.serializers.CypressSecurityRequestResponseLogSerializer", true - ); -}); + ) +}) Cypress.Commands.add("loadExternalApiRequestLog", (key, value) => { return loadObjectJson( @@ -155,8 +155,8 @@ Cypress.Commands.add("loadExternalApiRequestLog", (key, value) => { "vbv_lernwelt.core.models.ExternalApiRequestLog", "vbv_lernwelt.core.serializers.CypressExternalApiRequestLogSerializer", true - ); -}); + ) +}) Cypress.Commands.add("loadFeedbackResponse", (key, value) => { return loadObjectJson( @@ -165,8 +165,8 @@ Cypress.Commands.add("loadFeedbackResponse", (key, value) => { "vbv_lernwelt.feedback.models.FeedbackResponse", "vbv_lernwelt.feedback.serializers.CypressFeedbackResponseSerializer", true - ); -}); + ) +}) Cypress.Commands.add("loadCheckoutInformation", (key, value) => { return loadObjectJson( @@ -175,37 +175,37 @@ Cypress.Commands.add("loadCheckoutInformation", (key, value) => { "vbv_lernwelt.shop.models.CheckoutInformation", "vbv_lernwelt.shop.serializers.CypressCheckoutInformationSerializer", true - ); -}); + ) +}) Cypress.Commands.add("makeSelfEvaluation", (answers) => { for (let i = 0; i < answers.length; i++) { - const answer = answers[i]; + const answer = answers[i] if (answer) { - cy.get('[data-cy="success"]').click(); + cy.get('[data-cy="success"]').click() } else { - cy.get('[data-cy="fail"]').click(); + cy.get('[data-cy="fail"]').click() } if (i < answers.length - 1) { - cy.get('[data-cy="next-step"]').click({ force: true }); + cy.get('[data-cy="next-step"]').click({ force: true }) } else { - cy.get('[data-cy="complete-and-continue"]').click({ force: true }); + cy.get('[data-cy="complete-and-continue"]').click({ force: true }) } } -}); +}) Cypress.Commands.add("learningContentMultiLayoutNextStep", () => { - return cy.get('[data-cy="next-step"]').click({ force: true }); -}); + return cy.get('[data-cy="next-step"]').click({ force: true }) +}) Cypress.Commands.add("learningContentMultiLayoutPreviousStep", () => { - return cy.get('[data-cy="previous-step"]').click({ force: true }); -}); + return cy.get('[data-cy="previous-step"]').click({ force: true }) +}) Cypress.Commands.add("testLearningContentTitle", (title) => { - return cy.get('[data-cy="lc-title"]').should("contain", title); -}); + return cy.get('[data-cy="lc-title"]').should("contain", title) +}) Cypress.Commands.add("testLearningContentSubtitle", (subtitle) => { - return cy.get('[data-cy="lc-subtitle"]').should("contain", subtitle); -}); + return cy.get('[data-cy="lc-subtitle"]').should("contain", subtitle) +}) diff --git a/package.json b/package.json index 7bb460e9..c2dd1054 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "cypress:open": "cypress open", "cypress:ci": "cypress-cloud run --parallel --record", + "cypress:install": "cypress install", "prettier": "npm run prettier --prefix client" }, "devDependencies": { diff --git a/server/vbv_lernwelt/core/management/commands/cypress_reset.py b/server/vbv_lernwelt/core/management/commands/cypress_reset.py index abfae404..6ec9190e 100644 --- a/server/vbv_lernwelt/core/management/commands/cypress_reset.py +++ b/server/vbv_lernwelt/core/management/commands/cypress_reset.py @@ -59,12 +59,32 @@ from vbv_lernwelt.shop.models import CheckoutInformation @click.option( "--create-assignment-completion/--no-create-assignment-completion", default=False, - help="will create assignment completion data for test-student1@example.com", + help="will create assignment completion data for test-student1@example.com by default. Other user can be specified with --assignment-completion-user", +) +@click.option( + "--assignment-completion-user-id", + default=TEST_STUDENT1_USER_ID, + help="user to create assignment completion for. Defaults to test-student1@example.com. Hint: Is only evaluated if --create-assignment-completion is set.", +) +@click.option( + "--assignment-completion-course-session-id", + default=TEST_COURSE_SESSION_BERN_ID, + help="course session to create assignment completion in. Defaults to 'Test Bern 2022 a'. Hint: Is only evaluated if --create-assignment-completion is set.", ) @click.option( "--create-assignment-evaluation/--no-create-assignment-evaluation", default=False, - help="will create assignment evaluation data for test-student1@example.com", + help="will create assignment evaluation data for test-student1@example.com by default. Other user can be specified with --assignment-evaluation-user", +) +@click.option( + "--assignment-evaluation-user-id", + default=TEST_TRAINER1_USER_ID, + help="user to create assignment evaluation for. Defaults to test-trainer1@example.com. Hint: Is only evaluated if --create-assignment-completion is set.", +) +@click.option( + "--assignment-evaluation-course-session-id", + default=TEST_COURSE_SESSION_BERN_ID, + help="course session to create assignment evaluation in. Defaults to 'Test Bern 2022 a'. Hint: Is only evaluated if --create-assignment-completion is set.", ) @click.option( "--assignment-evaluation-scores", @@ -81,7 +101,17 @@ from vbv_lernwelt.shop.models import CheckoutInformation type=(int, int, float), default=(None, None, 0.0), metavar="USER_POINTS MAX_POINTS POINTS_DEDUCTED", - help="Create edoniq result data for test-student1@example.com with user points and max points", + help="Create edoniq result data for test-student1@example.com by default with user points and max points. Use --edoniq-user-id to specify a different user.", +) +@click.option( + "--edoniq-user-id", + default=TEST_STUDENT1_USER_ID, + help="User to create edoniq test results for. Defaults to test-student1@example.com. Hint: Is only evaluated if --create-edoniq-test-results is set.", +) +@click.option( + "--edoniq-course-session-id", + default=TEST_COURSE_SESSION_BERN_ID, + help="course session to create edoniq test results in. Defaults to 'Test Bern 2022 a'. Hint: Is only evaluated if --create-edoniq-test-results is set.", ) @click.option( "--create-feedback-responses/--no-create-feedback-responses", @@ -120,10 +150,16 @@ from vbv_lernwelt.shop.models import CheckoutInformation ) def command( create_assignment_completion, + assignment_completion_user_id, + assignment_completion_course_session_id, create_assignment_evaluation, + assignment_evaluation_user_id, + assignment_evaluation_course_session_id, assignment_evaluation_scores, assignment_points_deducted, create_edoniq_test_results, + edoniq_user_id, + edoniq_course_session_id, create_feedback_responses, create_course_completion_performance_criteria, create_attendance_days, @@ -170,15 +206,19 @@ def command( assignment=Assignment.objects.get( slug="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice" ), - course_session=CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID), - user=User.objects.get(id=TEST_STUDENT1_USER_ID), + course_session=CourseSession.objects.get( + id=assignment_completion_course_session_id + ), + user=User.objects.get(id=assignment_completion_user_id), ) create_test_assignment_submitted_data( assignment=Assignment.objects.get( slug="test-lehrgang-assignment-mein-kundenstamm" ), - course_session=CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID), - user=User.objects.get(id=TEST_STUDENT1_USER_ID), + course_session=CourseSession.objects.get( + id=assignment_completion_course_session_id + ), + user=User.objects.get(id=assignment_completion_user_id), ) if create_assignment_evaluation: if not assignment_evaluation_scores: @@ -195,9 +235,11 @@ def command( assignment=Assignment.objects.get( slug="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice" ), - course_session=CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID), - assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID), - evaluation_user=User.objects.get(id=TEST_TRAINER1_USER_ID), + course_session=CourseSession.objects.get( + id=assignment_evaluation_course_session_id + ), + assignment_user=User.objects.get(id=assignment_completion_user_id), + evaluation_user=User.objects.get(id=assignment_evaluation_user_id), input_scores=assignment_evaluation_scores, points_deducted=assignment_points_deducted, ) @@ -211,8 +253,8 @@ def command( assignment=Assignment.objects.get( slug="test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo" ), - course_session=CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID), - assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID), + course_session=CourseSession.objects.get(id=edoniq_course_session_id), + assignment_user=User.objects.get(id=edoniq_user_id), user_points=user_points, max_points=max_points, evaluation_points_deducted=points_deducted, From dd028e176986ab5dae44ab5eed5573411b7e2bc3 Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Wed, 31 Jul 2024 14:35:21 +0200 Subject: [PATCH 05/80] Remove unused imports --- client/src/pages/competence/CompetenceCertificateDetailPage.vue | 2 +- client/src/pages/competence/CompetenceCertificateListPage.vue | 1 - client/src/pages/competence/CompetenceIndexPage.vue | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/client/src/pages/competence/CompetenceCertificateDetailPage.vue b/client/src/pages/competence/CompetenceCertificateDetailPage.vue index a83cbd3e..227a6a0c 100644 --- a/client/src/pages/competence/CompetenceCertificateDetailPage.vue +++ b/client/src/pages/competence/CompetenceCertificateDetailPage.vue @@ -2,7 +2,7 @@ import log from "loglevel"; import { computed } from "vue"; import type { CompetenceCertificate } from "@/types"; -import { useCertificateQuery, useCurrentCourseSession } from "@/composables"; +import { useCertificateQuery } from "@/composables"; import CompetenceCertificateComponent from "@/pages/competence/CompetenceCertificateComponent.vue"; import { getCertificates } from "@/services/competence"; import { getPreviousRoute } from "@/router/history"; diff --git a/client/src/pages/competence/CompetenceCertificateListPage.vue b/client/src/pages/competence/CompetenceCertificateListPage.vue index 8db065a8..49b83ba6 100644 --- a/client/src/pages/competence/CompetenceCertificateListPage.vue +++ b/client/src/pages/competence/CompetenceCertificateListPage.vue @@ -12,7 +12,6 @@ import { import { useRoute } from "vue-router"; import { getCertificates } from "@/services/competence"; import { useCourseSessionsStore } from "@/stores/courseSessions"; -import dayjs from "dayjs"; const props = defineProps<{ courseSlug: string; diff --git a/client/src/pages/competence/CompetenceIndexPage.vue b/client/src/pages/competence/CompetenceIndexPage.vue index 96139e11..f94e4238 100644 --- a/client/src/pages/competence/CompetenceIndexPage.vue +++ b/client/src/pages/competence/CompetenceIndexPage.vue @@ -1,7 +1,5 @@