Skip to content

Commit af56c24

Browse files
adding migration & renaming column
1 parent cc3be4b commit af56c24

File tree

6 files changed

+48
-18
lines changed

6 files changed

+48
-18
lines changed
Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
"""enhance projects_tags for RUT
22
3-
Revision ID: 61e798889f2f
3+
Revision ID: 8e1f83486be7
44
Revises: 8bfe65a5e294
5-
Create Date: 2024-11-14 14:36:14.377526+00:00
5+
Create Date: 2024-11-15 09:12:57.789183+00:00
66
77
"""
88
import sqlalchemy as sa
99
from alembic import op
1010

1111
# revision identifiers, used by Alembic.
12-
revision = "61e798889f2f"
12+
revision = "8e1f83486be7"
1313
down_revision = "8bfe65a5e294"
1414
branch_labels = None
1515
depends_on = None
@@ -18,7 +18,26 @@
1818
def upgrade():
1919
# ### commands auto generated by Alembic - please adjust! ###
2020
op.add_column(
21-
"projects_tags", sa.Column("project_uuid", sa.String(), nullable=False)
21+
"projects_tags", sa.Column("project_uuid_for_rut", sa.String(), nullable=True)
22+
)
23+
24+
# Migrate
25+
op.execute(
26+
sa.DDL(
27+
"""
28+
UPDATE project_tags
29+
SET project_uuid_for_rut = project.uuid
30+
FROM project
31+
WHERE project_tags.project_id = project.id;
32+
"""
33+
)
34+
)
35+
36+
op.alter_column(
37+
"projects_tags",
38+
"project_uuid_for_rut",
39+
existing_type=sa.String(),
40+
nullable=False,
2241
)
2342
op.alter_column(
2443
"projects_tags", "project_id", existing_type=sa.BIGINT(), nullable=True
@@ -27,7 +46,9 @@ def upgrade():
2746
"study_tags_study_id_tag_id_key", "projects_tags", type_="unique"
2847
)
2948
op.create_unique_constraint(
30-
"project_tags_project_uuid_unique", "projects_tags", ["project_uuid", "tag_id"]
49+
"project_tags_project_uuid_unique",
50+
"projects_tags",
51+
["project_uuid_for_rut", "tag_id"],
3152
)
3253
op.drop_constraint("study_tags_study_id_fkey", "projects_tags", type_="foreignkey")
3354
op.create_foreign_key(
@@ -65,5 +86,5 @@ def downgrade():
6586
op.alter_column(
6687
"projects_tags", "project_id", existing_type=sa.BIGINT(), nullable=False
6788
)
68-
op.drop_column("projects_tags", "project_uuid")
89+
op.drop_column("projects_tags", "project_uuid_for_rut")
6990
# ### end Alembic commands ###

packages/postgres-database/src/simcore_postgres_database/models/projects_tags.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
name="project_tags_project_id_fkey",
2121
),
2222
nullable=True, # <-- NULL means that project was deleted
23-
doc="NOTE that project.c.id != project.c.uuid",
23+
doc="NOTE that project.c.id != project.c.uuid. If project is deleted, we do not delete project in this table, we just set this column to NULL. Why? Because the `project_uuid_for_rut` is still used by resource usage tracker",
2424
),
2525
sa.Column(
2626
"tag_id",
@@ -29,11 +29,11 @@
2929
nullable=False,
3030
),
3131
sa.Column(
32-
"project_uuid",
32+
"project_uuid_for_rut",
3333
sa.String,
3434
nullable=False,
3535
),
3636
sa.UniqueConstraint(
37-
"project_uuid", "tag_id", name="project_tags_project_uuid_unique"
37+
"project_uuid_for_rut", "tag_id", name="project_tags_project_uuid_unique"
3838
),
3939
)

packages/postgres-database/src/simcore_postgres_database/utils_tags_sql.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import functools
2+
from uuid import UUID
23

34
import sqlalchemy as sa
45
from simcore_postgres_database.models.groups import user_to_groups
@@ -60,7 +61,7 @@ def get_tag_stmt(
6061
# aggregation ensures MOST PERMISSIVE policy of access-rights
6162
sa.func.bool_or(tags_access_rights.c.read).label("read"),
6263
sa.func.bool_or(tags_access_rights.c.write).label("write"),
63-
sa.func.bool_or(tags_access_rights.c.delete).label("delete")
64+
sa.func.bool_or(tags_access_rights.c.delete).label("delete"),
6465
)
6566
.select_from(
6667
_join_user_to_given_tag(
@@ -80,7 +81,7 @@ def list_tags_stmt(*, user_id: int):
8081
# aggregation ensures MOST PERMISSIVE policy of access-rights
8182
sa.func.bool_or(tags_access_rights.c.read).label("read"),
8283
sa.func.bool_or(tags_access_rights.c.write).label("write"),
83-
sa.func.bool_or(tags_access_rights.c.delete).label("delete")
84+
sa.func.bool_or(tags_access_rights.c.delete).label("delete"),
8485
)
8586
.select_from(
8687
_join_user_to_tags(
@@ -104,7 +105,7 @@ def count_groups_with_given_access_rights_stmt(
104105
tag_id: int,
105106
read: bool | None,
106107
write: bool | None,
107-
delete: bool | None
108+
delete: bool | None,
108109
):
109110
"""
110111
How many groups (from this user_id) are given EXACTLY these access permissions
@@ -192,12 +193,15 @@ def get_tags_for_project_stmt(*, project_index: int):
192193
)
193194

194195

195-
def add_tag_to_project_stmt(*, project_index: int, tag_id: int):
196+
def add_tag_to_project_stmt(
197+
*, project_index: int, tag_id: int, project_uuid_for_rut: UUID
198+
):
196199
return (
197200
pg_insert(projects_tags)
198201
.values(
199202
project_id=project_index,
200203
tag_id=tag_id,
204+
project_uuid_for_rut=f"{project_uuid_for_rut}",
201205
)
202206
.on_conflict_do_nothing()
203207
)

packages/postgres-database/tests/test_utils_tags.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@ def _check(func_smt, **kwargs):
668668
user_id = 425 # 4
669669
tag_id = 4
670670
project_index = 1
671+
project_uuid = "106f8b4b-ffb6-459a-a27b-981c779e6d3f"
671672
service_key = "simcore/services/comp/isolve"
672673
service_version = "2.0.85"
673674

@@ -726,6 +727,7 @@ def _check(func_smt, **kwargs):
726727
add_tag_to_project_stmt,
727728
project_index=project_index,
728729
tag_id=tag_id,
730+
project_uuid_for_rut=project_uuid,
729731
)
730732

731733
_check(

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/repositories/resource_tracker.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,11 @@ async def get_service_run_by_id(
216216

217217
_project_tags_subquery = (
218218
sa.select(
219-
projects_tags.c.project_uuid,
219+
projects_tags.c.project_uuid_for_rut,
220220
sa.func.array_agg(tags.c.name).label("project_tags"),
221221
)
222222
.select_from(projects_tags.join(tags, projects_tags.c.tag_id == tags.c.id))
223-
.group_by(projects_tags.c.project_uuid)
223+
.group_by(projects_tags.c.project_uuid_for_rut)
224224
).subquery("project_tags_subquery")
225225

226226
async def list_service_runs_by_product_and_user_and_wallet(
@@ -291,7 +291,7 @@ async def list_service_runs_by_product_and_user_and_wallet(
291291
).join(
292292
self._project_tags_subquery,
293293
resource_tracker_service_runs.c.project_id
294-
== self._project_tags_subquery.c.project_uuid,
294+
== self._project_tags_subquery.c.project_uuid_for_rut,
295295
isouter=True,
296296
)
297297
)
@@ -481,7 +481,7 @@ async def export_service_runs_table_to_s3(
481481
).join(
482482
self._project_tags_subquery,
483483
resource_tracker_service_runs.c.project_id
484-
== self._project_tags_subquery.c.project_uuid,
484+
== self._project_tags_subquery.c.project_uuid_for_rut,
485485
isouter=True,
486486
)
487487
)

services/web/server/src/simcore_service_webserver/projects/db.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,9 @@ async def list_projects( # pylint: disable=too-many-arguments,too-many-statemen
403403
sa.select(
404404
projects_tags.c.project_id,
405405
sa.func.array_agg(projects_tags.c.tag_id).label("tags"),
406-
).group_by(projects_tags.c.project_id)
406+
)
407+
.where(projects_tags.c.project_id.is_not(None))
408+
.group_by(projects_tags.c.project_id)
407409
).subquery("project_tags_subquery")
408410

409411
###
@@ -1218,6 +1220,7 @@ async def add_tag(
12181220
projects_tags.insert().values(
12191221
project_id=project["id"],
12201222
tag_id=tag_id,
1223+
project_uuid_for_rut=project["uuid"],
12211224
)
12221225
)
12231226
project_tags.append(tag_id)

0 commit comments

Comments
 (0)