Skip to content

Commit 9469425

Browse files
fix : added delete subscales and score reports to CLI (M2-9489) (#1942)
* fix: add CLI to delete subscales and score-type reports across all applet versions * Refactor to match other commands * cq --------- Co-authored-by: Andrew Weiland <aweiland@users.noreply.github.com>
1 parent 52f5e3a commit 9469425

4 files changed

Lines changed: 119 additions & 5 deletions

File tree

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +0,0 @@
1-
from apps.activities.commands.reindex_items import app as activities
2-
3-
__all__ = ["activities"]
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
from uuid import UUID
2+
3+
import typer
4+
from sqlalchemy import text
5+
6+
from infrastructure.commands.utils import coro
7+
from infrastructure.database import session_manager
8+
9+
app = typer.Typer(help="Delete subscales and score-type reports across all versions of an applet.")
10+
11+
DROP_SCORE_FUNC_SQL = """
12+
CREATE OR REPLACE FUNCTION drop_score_reports(sr jsonb)
13+
RETURNS jsonb LANGUAGE sql IMMUTABLE AS $$
14+
SELECT CASE
15+
WHEN sr ? 'reports' THEN
16+
jsonb_set(
17+
sr, '{reports}',
18+
COALESCE(
19+
(SELECT jsonb_agg(r)
20+
FROM jsonb_array_elements(sr->'reports') r
21+
WHERE r->>'type' <> 'score'),
22+
'[]'::jsonb
23+
),
24+
true
25+
)
26+
ELSE sr
27+
END;
28+
$$;
29+
"""
30+
31+
32+
@app.command(name="delete-subscales-for-all-applet-versions")
33+
@coro
34+
async def delete_subscales_for_all_applet_versions(
35+
applet_id: UUID = typer.Argument(..., help="Base applet ID (UUID)"),
36+
) -> None:
37+
"""
38+
Remove all subscales and score-type reports from every version of the specified applet.
39+
"""
40+
# obtain a session maker; then call it to get an async session
41+
s_maker = session_manager.get_session()
42+
async with s_maker() as session:
43+
await session.execute(text(DROP_SCORE_FUNC_SQL))
44+
await session.commit()
45+
46+
# Get the list of version IDs for this applet
47+
versions_sql = text("""
48+
SELECT id_version
49+
FROM applet_histories
50+
WHERE id = :applet_id
51+
""")
52+
versions = (
53+
(
54+
await session.execute(
55+
versions_sql,
56+
{"applet_id": applet_id},
57+
)
58+
)
59+
.scalars()
60+
.all()
61+
)
62+
63+
if not versions:
64+
typer.echo(f"No history versions found for applet {applet_id}.")
65+
return
66+
67+
# Delete subscales and score-type reports in both tables
68+
hist_update_sql = text("""
69+
UPDATE activity_histories
70+
SET subscale_setting = NULL,
71+
scores_and_reports = CASE
72+
WHEN scores_and_reports IS NULL THEN NULL
73+
ELSE drop_score_reports(scores_and_reports)
74+
END
75+
WHERE applet_id = ANY(:versions)
76+
""")
77+
live_update_sql = text("""
78+
UPDATE activities
79+
SET subscale_setting = NULL,
80+
scores_and_reports = CASE
81+
WHEN scores_and_reports IS NULL THEN NULL
82+
ELSE drop_score_reports(scores_and_reports)
83+
END
84+
WHERE applet_id = :applet_id
85+
""")
86+
87+
await session.execute(hist_update_sql, {"versions": versions})
88+
await session.execute(live_update_sql, {"applet_id": applet_id})
89+
await session.commit()
90+
91+
typer.echo(f"Deleted subscales and score-type reports for {len(versions)} version(s) of applet {applet_id}.")

src/cli.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
import typer # noqa: E402,I001
99

10-
from apps.activities.commands import activities # noqa: E402
10+
from apps.activities.commands.reindex_items import app as reindex_items_cli # noqa: E402
11+
from apps.activities.commands.delete_subscales import app as delete_subscales_cli # noqa: E402
12+
1113
from apps.answers.commands import convert_assessments # noqa: E402
1214
from apps.applets.commands import ( # noqa: E402
1315
applet_cli, # noqa: E402
@@ -21,7 +23,8 @@
2123
cli = typer.Typer()
2224
cli.add_typer(arbitrary_server_cli, name="arbitrary")
2325
cli.add_typer(convert_assessments, name="assessments")
24-
cli.add_typer(activities, name="activities")
26+
cli.add_typer(reindex_items_cli, name="reindex")
27+
cli.add_typer(delete_subscales_cli, name="delete-subscales")
2528
cli.add_typer(token_cli, name="token")
2629
cli.add_typer(patch, name="patch")
2730
cli.add_typer(encryption_cli, name="encryption")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Merge multiple heads
2+
3+
Revision ID: e7fc7c11c8a3
4+
Revises: 8ec71571fa71, b35481672766
5+
Create Date: 2025-08-28 13:10:44.003205
6+
7+
"""
8+
9+
10+
11+
# revision identifiers, used by Alembic.
12+
revision = "e7fc7c11c8a3"
13+
down_revision = ("8ec71571fa71", "b35481672766")
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade() -> None:
19+
pass
20+
21+
22+
def downgrade() -> None:
23+
pass

0 commit comments

Comments
 (0)