From 84f7797a99ce0e5462f7fd33e132da7ca9f506c6 Mon Sep 17 00:00:00 2001 From: Matthew Evans Date: Tue, 15 Oct 2024 14:10:26 +0100 Subject: [PATCH 1/4] Update caniuse and accept package.json formatting --- webapp/package.json | 6 +++--- webapp/yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/webapp/package.json b/webapp/package.json index 087b64ea2..7d095124d 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -36,16 +36,16 @@ "mermaid": "^10.1.0", "primeicons": "^7.0.0", "primevue": "^4.0.0", + "qrcode-vue3": "^1.6.8", "serve": "^14.2.1", "stream-browserify": "^3.0.0", "tinymce": "^5.10.9", "vue": "^3.2.4", + "vue-qrcode-reader": "^5.5.7", "vue-router": "^4.0.0-0", "vue-select": "^4.0.0-beta.6", "vue3-easy-data-table": "^1.5.45", - "vuex": "^4.0.0-0", - "qrcode-vue3": "^1.6.8", - "vue-qrcode-reader": "^5.5.7" + "vuex": "^4.0.0-0" }, "devDependencies": { "@babel/core": "^7.24.8", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index a48440a59..9cf6b5a5b 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -3945,9 +3945,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001640: - version "1.0.30001641" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz#3572862cd18befae3f637f2a1101cc033c6782ac" - integrity sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA== + version "1.0.30001668" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz" + integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw== case-sensitive-paths-webpack-plugin@^2.3.0: version "2.4.0" From 389eae132ab1047e6f34af2feaecd2e7d03d8e13 Mon Sep 17 00:00:00 2001 From: Matthew Evans Date: Tue, 15 Oct 2024 14:50:45 +0100 Subject: [PATCH 2/4] Remove some old debug code and wrap blockInfo getter to preserve store --- webapp/src/views/EditPage.vue | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/webapp/src/views/EditPage.vue b/webapp/src/views/EditPage.vue index 54c1af292..8aae9d24a 100644 --- a/webapp/src/views/EditPage.vue +++ b/webapp/src/views/EditPage.vue @@ -185,6 +185,9 @@ export default { return this.$store.state.files; }, blocksInfos() { + if (Object.keys(this.$store.state.blocksInfos).length == 0) { + getBlocksInfos(); + } return this.$store.state.blocksInfos; }, itemApiUrl() { @@ -202,7 +205,6 @@ export default { }, }, created() { - getBlocksInfos(); this.getSampleData(); this.interval = setInterval(() => this.setLastModified(), 30000); }, @@ -250,19 +252,6 @@ export default { behavior: "smooth", }); }, - change_a_block(event, block_id) { - let item_id = this.item_id; - let new_data = { - block_id: 7, - a_new_field: "foo bar", - }; - console.log(new_data); - this.$store.commit("updateBlockData", { - item_id, - block_id, - block_data: new_data, - }); - }, getBlockDisplayType(block_id) { var type = this.blocks[block_id].blocktype; if (type in blockTypes) { From 4054f520ccf4969a07efcc8cf5d0d743226b8b73 Mon Sep 17 00:00:00 2001 From: Matthew Evans Date: Tue, 15 Oct 2024 14:51:50 +0100 Subject: [PATCH 3/4] Better handle case where block in database is not implemented by app/API --- webapp/src/components/datablocks/DataBlockBase.vue | 6 ++++-- webapp/src/components/datablocks/NotImplementedBlock.vue | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/webapp/src/components/datablocks/DataBlockBase.vue b/webapp/src/components/datablocks/DataBlockBase.vue index 289c694ba..4a1702169 100644 --- a/webapp/src/components/datablocks/DataBlockBase.vue +++ b/webapp/src/components/datablocks/DataBlockBase.vue @@ -9,7 +9,9 @@ /> {{ blockType }} - + -
This block type has not been implemented!
+
+ This block type is not implemented/installed for this datalab instance. Please contact + your datalab administrator. +
From 2f3dfb252324d0202595e06688dc338b2ab9f6bb Mon Sep 17 00:00:00 2001 From: Matthew Evans <7916000+ml-evs@users.noreply.github.com> Date: Tue, 15 Oct 2024 18:16:50 +0100 Subject: [PATCH 4/4] Update collection deletion endpoint to also unlink items (#933) --- .../src/pydatalab/routes/v0_1/collections.py | 52 ++++++++++++++----- pydatalab/tests/server/test_samples.py | 6 ++- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/pydatalab/src/pydatalab/routes/v0_1/collections.py b/pydatalab/src/pydatalab/routes/v0_1/collections.py index 4a7ac9fca..4c30644e2 100644 --- a/pydatalab/src/pydatalab/routes/v0_1/collections.py +++ b/pydatalab/src/pydatalab/routes/v0_1/collections.py @@ -284,20 +284,46 @@ def save_collection(collection_id): @COLLECTIONS.route("/collections/", methods=["DELETE"]) def delete_collection(collection_id: str): - result = flask_mongo.db.collections.delete_one( - {"collection_id": collection_id, **get_default_permissions(user_only=True)} - ) - - if result.deleted_count != 1: - return ( - jsonify( + with flask_mongo.cx.start_session() as session: + with session.start_transaction(): + collection_immutable_id = flask_mongo.db.collections.find_one( + {"collection_id": collection_id, **get_default_permissions(user_only=True)}, + projection={"_id": 1}, + )["_id"] + result = flask_mongo.db.collections.delete_one( + {"collection_id": collection_id, **get_default_permissions(user_only=True)} + ) + if result.deleted_count != 1: + return ( + jsonify( + { + "status": "error", + "message": f"Authorization required to attempt to delete collection with {collection_id=} from the database.", + } + ), + 401, + ) + + # If successful, remove collection from all matching items relationships + flask_mongo.db.items.update_many( { - "status": "error", - "message": f"Authorization required to attempt to delete collection with {collection_id=} from the database.", - } - ), - 401, - ) + "relationships": { + "$elemMatch": { + "immutable_id": collection_immutable_id, + "type": "collections", + } + } + }, + { + "$pull": { + "relationships": { + "immutable_id": collection_immutable_id, + "type": "collections", + } + } + }, + ) + return ( jsonify( { diff --git a/pydatalab/tests/server/test_samples.py b/pydatalab/tests/server/test_samples.py index 18f495a5d..7c84e1d29 100644 --- a/pydatalab/tests/server/test_samples.py +++ b/pydatalab/tests/server/test_samples.py @@ -472,7 +472,7 @@ def test_cell_from_scratch(client): @pytest.mark.dependency(depends=["test_create_cell"]) -def test_create_collections(client, default_collection): +def test_create_collections(client, default_collection, database): # Check no collections initially response = client.get("/collections") assert len(response.json["data"]) == 0, response.json @@ -530,12 +530,16 @@ def test_create_collections(client, default_collection): assert response.json["item_data"]["collections"][0]["collection_id"] == "test_collection_2" # Test that collections can be deleted and relationships to items are removed + deleted_id = database.collections.find_one({"collection_id": new_collection.collection_id})[ + "_id" + ] response = client.delete(f"/collections/{new_collection.collection_id}") assert response.status_code == 200, response.json assert response.json["status"] == "success" response = client.get(f"/collections/{new_collection.collection_id}") assert response.status_code == 404, response.json test_id = ids.pop() + assert database.items.find_one({"relationships.immutable_id": deleted_id}) is None response = client.get(f"/get-item-data/{test_id}") assert response.status_code == 200, response.json assert response.json["status"] == "success"