From d2ff319709984f46ec609e8f41c6c7ba5232be94 Mon Sep 17 00:00:00 2001 From: Martin Varga Date: Wed, 25 Mar 2026 15:32:58 +0100 Subject: [PATCH] Remove outdated alembic branchpoint --- server/Pipfile | 2 +- server/Pipfile.lock | 135 ++++++++-------- .../35af0c8be41e_migrate_data_to_workspace.py | 153 ------------------ 3 files changed, 72 insertions(+), 218 deletions(-) delete mode 100644 server/migrations/community/35af0c8be41e_migrate_data_to_workspace.py diff --git a/server/Pipfile b/server/Pipfile index 6d027c06..d637c2c5 100644 --- a/server/Pipfile +++ b/server/Pipfile @@ -22,7 +22,7 @@ wtforms = {extras = ["email"],version = "==3.2.1"} flask-wtf = "==1.2.2" flask-mail = "==0.10.0" safe = "==0.4" -flask-migrate = "==3.1.0" +flask-migrate = "===4.1.0" wtforms-json = "==0.3.5" pytz = "==2022.2.1" scikit-build = "==0.18.1" diff --git a/server/Pipfile.lock b/server/Pipfile.lock index a11b968b..503f73d8 100644 --- a/server/Pipfile.lock +++ b/server/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8d60d49a9329d443ff2121f0cc00bff4a0c6cd589a844d034c2fd508e6d4b299" + "sha256": "977deb5d6627898ef22b834c0c1841a774a5a624550c83e70f12994d9e6213ea" }, "pipfile-spec": 6, "requires": { @@ -168,11 +168,11 @@ }, "alembic": { "hashes": [ - "sha256:18a5f6448af4864cc308aadf33eb37c0116da9a60fd9bb3f31ccb1b522b4a9b9", - "sha256:1c3ddb635f26efbc80b1b90c5652548202022d4e760f6a78d6d85959280e3684" + "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", + "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc" ], "markers": "python_version >= '3.10'", - "version": "==1.18.2" + "version": "==1.18.4" }, "amqp": { "hashes": [ @@ -404,6 +404,7 @@ "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==8.2.0" }, "click-didyoumean": { @@ -484,6 +485,7 @@ "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==3.1.2" }, "flask-login": { @@ -512,11 +514,12 @@ }, "flask-migrate": { "hashes": [ - "sha256:57d6060839e3a7f150eaab6fe4e726d9e3e7cffe2150fb223d73f92421c6d1d9", - "sha256:a6498706241aba6be7a251078de9cf166d74307bca41a4ca3e403c9d39e2f897" + "sha256:1a336b06eb2c3ace005f5f2ded8641d534c18798d64061f6ff11f79e1434126d", + "sha256:24d8051af161782e0743af1b04a152d007bad9772b2bca67b7ec1e8ceeb3910d" ], "index": "pypi", - "version": "==3.1.0" + "markers": "python_version >= '3.6'", + "version": "==4.1.0" }, "flask-sqlalchemy": { "hashes": [ @@ -524,6 +527,7 @@ "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.1.1" }, "flask-wtf": { @@ -720,62 +724,62 @@ }, "greenlet": { "hashes": [ - "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e", - "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13", - "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5", - "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd", - "sha256:1108b61b06b5224656121c3c8ee8876161c491cbe74e5c519e0634c837cf93d5", - "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e", - "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336", - "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba", - "sha256:27289986f4e5b0edec7b5a91063c109f0276abb09a7e9bdab08437525977c946", - "sha256:2f080e028001c5273e0b42690eaf359aeef9cb1389da0f171ea51a5dc3c7608d", - "sha256:301860987846c24cb8964bdec0e31a96ad4a2a801b41b4ef40963c1b44f33451", - "sha256:32e4ca9777c5addcbf42ff3915d99030d8e00173a56f80001fb3875998fe410b", - "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951", - "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f", - "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2", - "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe", - "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d", - "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242", - "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98", - "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149", - "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2", - "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab", - "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4", - "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249", - "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c", - "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3", - "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac", - "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f", - "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1", - "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774", - "sha256:7932f5f57609b6a3b82cc11877709aa7a98e3308983ed93552a1c377069b20c8", - "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd", - "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3", - "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1", - "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975", - "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f", - "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2", - "sha256:96aff77af063b607f2489473484e39a0bbae730f2ea90c9e5606c9b73c44174a", - "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683", - "sha256:b066e8b50e28b503f604fa538adc764a638b38cf8e81e025011d26e8a627fa79", - "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b", - "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5", - "sha256:bfb2d1763d777de5ee495c85309460f6fd8146e50ec9d0ae0183dbf6f0a829d1", - "sha256:c620051669fd04ac6b60ebc70478210119c56e2d5d5df848baec4312e260e4ca", - "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97", - "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5", - "sha256:cc98b9c4e4870fa983436afa999d4eb16b12872fab7071423d5262fa7120d57a", - "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36", - "sha256:da19609432f353fed186cc1b85e9440db93d489f198b4bdf42ae19cc9d9ac9b4", - "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4", - "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9", - "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729", - "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53" + "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", + "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", + "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", + "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", + "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", + "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", + "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", + "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", + "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", + "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", + "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", + "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", + "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", + "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", + "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", + "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", + "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", + "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", + "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", + "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", + "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", + "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", + "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", + "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", + "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", + "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", + "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", + "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", + "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", + "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", + "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", + "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", + "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", + "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", + "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", + "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", + "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", + "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", + "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", + "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", + "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", + "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", + "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", + "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", + "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", + "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", + "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", + "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", + "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", + "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", + "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", + "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", + "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.3.1" + "version": "==3.3.2" }, "gunicorn": { "extras": [ @@ -818,6 +822,7 @@ "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.2.0" }, "jinja2": { @@ -1930,6 +1935,7 @@ "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.0.44" }, "swagger-ui-bundle": { @@ -1998,6 +2004,7 @@ "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==4.12.2" }, "typish": { @@ -2040,11 +2047,11 @@ }, "werkzeug": { "hashes": [ - "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", - "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67" + "sha256:4b314d81163a3e1a169b6a0be2a000a0e204e8873c5de6586f453c55688d422f", + "sha256:fb8c01fe6ab13b9b7cdb46892b99b1d66754e1d7ab8e542e865ec13f526b5351" ], "markers": "python_version >= '3.9'", - "version": "==3.1.5" + "version": "==3.1.7" }, "wheel": { "hashes": [ diff --git a/server/migrations/community/35af0c8be41e_migrate_data_to_workspace.py b/server/migrations/community/35af0c8be41e_migrate_data_to_workspace.py deleted file mode 100644 index e6068793..00000000 --- a/server/migrations/community/35af0c8be41e_migrate_data_to_workspace.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (C) Lutra Consulting Limited -# -# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial - -"""Migrate data from namespaces to global workspace. -Only new values are set but namespace related columns are left intact (removed in another migration script) . - -Revision ID: 35af0c8be41e -Revises: 0ab6a1fbf974 -Create Date: 2022-09-01 21:38:41.949699 - -""" -import os -from alembic import op -from sqlalchemy import text - -# revision identifiers, used by Alembic. -revision = "35af0c8be41e" -down_revision = "0ab6a1fbf974" -branch_labels = None -depends_on = None - -global_workspace = os.getenv("GLOBAL_WORKSPACE", None) - - -def upgrade(): - data_upgrade() - op.alter_column("project", "workspace_id", nullable=False) - op.alter_column("removed_project", "workspace_id", nullable=False) - - -def downgrade(): - op.alter_column("project", "workspace_id", nullable=True) - op.alter_column("removed_project", "workspace_id", nullable=True) - data_downgrade() - - -def data_upgrade(): - """Upgrade data to migrate from namespaces to global workspace: - - projects are 'transferred' to global workspace via association with workspace id - - projects are renamed to contain their original namespace - - organisation-wide permissions are applied on project level - """ - if not global_workspace: - print("No target workspace specified - nothing to do") - return - - conn = op.get_bind() - # update project name to "namespace_project_name" to maintain project name unique constraint - conn.execute( - text( - f"UPDATE project SET name = namespace || '_' || name WHERE namespace != '{global_workspace}'" - ) - ) - conn.execute( - text( - f"UPDATE removed_project SET name = namespace || '_' || name WHERE namespace != '{global_workspace}'" - ) - ) - # associate project with workspace ID - conn.execute(text("UPDATE project SET workspace_id = 1")) - conn.execute(text("UPDATE removed_project SET workspace_id = 1")) - # transfer permissions from org to project level - conn.execute( - text( - """ - WITH - org_projects AS ( - SELECT - p.id AS project_id, - (SELECT pa.readers || org.readers) AS new_readers, - (SELECT pa.writers || org.writers) AS new_writers, - (SELECT pa.owners || org.owners) AS new_owners - FROM project p - JOIN project_access pa ON p.id = pa.project_id - JOIN namespace ns ON p.namespace = ns.name - JOIN account a ON a.id = ns.account_id - JOIN organisation org ON a.owner_id = org.id - WHERE a.type = 'organisation' AND pa.owners <> '{}' - ) - UPDATE project_access - SET - readers = ARRAY(SELECT DISTINCT * FROM unnest(org_projects.new_readers)), - writers = ARRAY(SELECT DISTINCT * FROM unnest(org_projects.new_writers)), - owners = ARRAY(SELECT DISTINCT * FROM unnest(org_projects.new_owners)) - FROM org_projects - WHERE project_access.project_id = org_projects.project_id - """ - ) - ) - - -def data_downgrade(): - """Downgrade data from global workspace to namespaces: - - association with workspace is removed - - projects are renamed to drop original namespace in their name - - project permissions are reset to default as information was reduced during data upgrade (irreversible change) - """ - if not global_workspace: - print("No target workspace specified - nothing to do") - return - - conn = op.get_bind() - conn.execute( - text( - f""" - UPDATE project - SET name = (SELECT replace(name, concat(namespace, '_'), '')) - WHERE namespace != '{global_workspace}' - """ - ) - ) - conn.execute( - text( - f""" - UPDATE removed_project - SET name = (SELECT replace(name, concat(namespace, '_'), '')) - WHERE namespace != '{global_workspace}' - """ - ) - ) - conn.execute(text("UPDATE project SET workspace_id = NULL")) - conn.execute(text("UPDATE removed_project SET workspace_id = NULL")) - # reset permissions to defaults - conn.execute( - text( - """ - WITH - org_projects AS ( - SELECT - p.id AS project_id, - p.creator_id AS creator_id, - (SELECT pa.readers || org.readers) AS new_readers, - (SELECT pa.writers || org.writers) AS new_writers, - (SELECT pa.owners || org.owners) AS new_owners - FROM project p - JOIN project_access pa ON p.id = pa.project_id - JOIN namespace ns ON p.namespace = ns.name - JOIN account a ON a.id = ns.account_id - JOIN organisation org ON a.owner_id = org.id - WHERE a.type = 'organisation' AND pa.owners <> '{}' - ) - - UPDATE project_access - SET - readers = ARRAY(SELECT org_projects.creator_id), - writers = ARRAY(SELECT org_projects.creator_id), - owners = ARRAY(SELECT org_projects.creator_id) - FROM org_projects - WHERE project_access.project_id = org_projects.project_id - """ - ) - )