From b1d7967d45af2433f1d6379ae85df2e8073e2e28 Mon Sep 17 00:00:00 2001 From: Sebastian Allard Date: Wed, 8 Nov 2023 13:47:58 +0100 Subject: [PATCH 1/9] Rename family in db --- cg/store/api/base.py | 4 ++-- cg/store/filters/status_analysis_filters.py | 2 +- cg/store/models.py | 10 +++++----- tests/cli/workflow/fastq/test_fastq_base.py | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cg/store/api/base.py b/cg/store/api/base.py index dafb13930a..f831267533 100644 --- a/cg/store/api/base.py +++ b/cg/store/api/base.py @@ -92,7 +92,7 @@ def _get_subquery_with_latest_case_analysis_date(self) -> Query: case_and_date: Query = ( self._get_join_analysis_case_query() .group_by(Case.id) - .with_entities(Analysis.family_id, func.max(Analysis.started_at).label("started_at")) + .with_entities(Analysis.case_id, func.max(Analysis.started_at).label("started_at")) .subquery() ) return case_and_date @@ -104,7 +104,7 @@ def _get_latest_analyses_for_cases_query(self) -> Query: return analyses.join( case_and_date_subquery, and_( - Analysis.family_id == case_and_date_subquery.c.family_id, + Analysis.case_id == case_and_date_subquery.c.family_id, Analysis.started_at == case_and_date_subquery.c.started_at, ), ) diff --git a/cg/store/filters/status_analysis_filters.py b/cg/store/filters/status_analysis_filters.py index fb00495c5b..f5dc158ff3 100644 --- a/cg/store/filters/status_analysis_filters.py +++ b/cg/store/filters/status_analysis_filters.py @@ -67,7 +67,7 @@ def order_analyses_by_uploaded_at_asc(analyses: Query, **kwargs) -> Query: def filter_analyses_by_case_entry_id(analyses: Query, case_entry_id: int, **kwargs) -> Query: """Return a query of analysis filtered by case entry id.""" - return analyses.filter(Analysis.family_id == case_entry_id) + return analyses.filter(Analysis.case_id == case_entry_id) def filter_analyses_started_before(analyses: Query, started_at_date: datetime, **kwargs) -> Query: diff --git a/cg/store/models.py b/cg/store/models.py index ff212d0fef..137ff93681 100644 --- a/cg/store/models.py +++ b/cg/store/models.py @@ -216,7 +216,7 @@ class Analysis(Model): is_primary = Column(types.Boolean, default=False) created_at = Column(types.DateTime, default=dt.datetime.now, nullable=False) - family_id = Column(ForeignKey("family.id", ondelete="CASCADE"), nullable=False) + case_id = Column(ForeignKey("case.id", ondelete="CASCADE"), nullable=False) uploaded_to_vogue_at = Column(types.DateTime, nullable=True) case = orm.relationship("Case", back_populates="analyses") @@ -377,7 +377,7 @@ def to_dict(self): class Case(Model, PriorityMixin): - __tablename__ = "family" + __tablename__ = "case" __table_args__ = (UniqueConstraint("customer_id", "name", name="_customer_name_uc"),) action = Column(types.Enum(*CASE_ACTIONS)) @@ -516,11 +516,11 @@ def to_dict(self, links: bool = False, analyses: bool = False) -> dict: class CaseSample(Model): - __tablename__ = "family_sample" - __table_args__ = (UniqueConstraint("family_id", "sample_id", name="_family_sample_uc"),) + __tablename__ = "case_sample" + __table_args__ = (UniqueConstraint("case_id", "sample_id", name="_case_sample_uc"),) id = Column(types.Integer, primary_key=True) - family_id = Column(ForeignKey("family.id", ondelete="CASCADE"), nullable=False) + case_id = Column(ForeignKey("case.id", ondelete="CASCADE"), nullable=False) sample_id = Column(ForeignKey("sample.id", ondelete="CASCADE"), nullable=False) status = Column(types.Enum(*STATUS_OPTIONS), default="unknown", nullable=False) diff --git a/tests/cli/workflow/fastq/test_fastq_base.py b/tests/cli/workflow/fastq/test_fastq_base.py index ddd9b570bd..7f1271a2d2 100644 --- a/tests/cli/workflow/fastq/test_fastq_base.py +++ b/tests/cli/workflow/fastq/test_fastq_base.py @@ -23,7 +23,7 @@ def test_store_fastq_analysis(caplog, another_case_id: str, cli_runner, fastq_co assert ( len( fastq_context.status_db._get_query(table=Analysis) - .filter(Analysis.family_id == case_obj.id) + .filter(Analysis.case_id == case_obj.id) .all() ) > 0 From 62c7aa8a32fab7537515e5ae91cec9fcbfa1ec69 Mon Sep 17 00:00:00 2001 From: seallard Date: Wed, 8 Nov 2023 15:12:38 +0100 Subject: [PATCH 2/9] Fix tests --- cg/cli/workflow/fastq/base.py | 2 +- cg/store/api/base.py | 2 +- cg/store/api/find_business_data.py | 2 +- tests/store_helpers.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cg/cli/workflow/fastq/base.py b/cg/cli/workflow/fastq/base.py index c5bd63255d..f11b2f9470 100644 --- a/cg/cli/workflow/fastq/base.py +++ b/cg/cli/workflow/fastq/base.py @@ -33,7 +33,7 @@ def store_fastq_analysis(context: click.Context, case_id: str, dry_run: bool = F completed_at=dt.datetime.now(), primary=True, started_at=dt.datetime.now(), - family_id=case_obj.id, + case_id=case_obj.id, ) if dry_run: return diff --git a/cg/store/api/base.py b/cg/store/api/base.py index f831267533..73e9b107d4 100644 --- a/cg/store/api/base.py +++ b/cg/store/api/base.py @@ -104,7 +104,7 @@ def _get_latest_analyses_for_cases_query(self) -> Query: return analyses.join( case_and_date_subquery, and_( - Analysis.case_id == case_and_date_subquery.c.family_id, + Analysis.case_id == case_and_date_subquery.c.case_id, Analysis.started_at == case_and_date_subquery.c.started_at, ), ) diff --git a/cg/store/api/find_business_data.py b/cg/store/api/find_business_data.py index b89de9311c..027abbfd0d 100644 --- a/cg/store/api/find_business_data.py +++ b/cg/store/api/find_business_data.py @@ -59,7 +59,7 @@ def has_active_cases_for_sample(self, internal_id: str) -> bool: active_actions = ["analyze", "running"] for family_sample in sample.links: - case: Case = self.get_case_by_entry_id(entry_id=family_sample.family_id) + case: Case = self.get_case_by_entry_id(entry_id=family_sample.case_id) if case.action in active_actions: return True diff --git a/tests/store_helpers.py b/tests/store_helpers.py index 642ddd9a5b..853343951d 100644 --- a/tests/store_helpers.py +++ b/tests/store_helpers.py @@ -293,7 +293,7 @@ def add_analysis( case = StoreHelpers.add_case(store, data_analysis=pipeline, data_delivery=data_delivery) analysis = store.add_analysis( - pipeline=pipeline, version=pipeline_version, family_id=case.id + pipeline=pipeline, version=pipeline_version, case_id=case.id ) analysis.started_at = started_at or datetime.now() From 339401abcd9286b9f4f6d2d1ff98ef165c1c296d Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 13:17:40 +0100 Subject: [PATCH 3/9] Rename database tables and columns --- ..._11_08_b105b426af99_rename_family_in_db.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py diff --git a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py new file mode 100644 index 0000000000..80233cce31 --- /dev/null +++ b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py @@ -0,0 +1,43 @@ +"""Rename family in db + +Revision ID: b105b426af99 +Revises: 70e641d723b3 +Create Date: 2023-11-08 15:13:25.197537 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = "b105b426af99" +down_revision = "70e641d723b3" +branch_labels = None +depends_on = None + + +def upgrade(): + # Rename tables + op.rename_table("family", "case") + op.rename_table("family_sample", "case_sample") + + # Rename foreign keys + op.alter_column("analysis", "family_id", new_column_name="case_id", type=sa.Integer()) + op.alter_column("case_sample", "family_id", new_column_name="case_id", type=sa.Integer()) + + # Rename unique constraint + op.drop_constraint("_family_sample_uc", "case_sample", type_="unique") + op.create_unique_constraint("_case_sample_uc", "case_sample", ["case_id", "sample_id"]) + + +def downgrade(): + # Rename tables + op.rename_table("case", "family") + op.rename_table("case_sample", "family_sample") + + # Rename foreign keys + op.alter_column("analysis", "case_id", new_column_name="family_id", type=sa.Integer()) + op.alter_column("family_sample", "case_id", new_column_name="family_id", type=sa.Integer()) + + # Rename unique constraint + op.drop_constraint("_case_sample_uc", "family_sample", type_="unique") + op.create_unique_constraint("_family_sample_uc", "family_sample", ["family_id", "sample_id"]) From e64e6e0651c95892aefa3fc8bebab0a872f6503b Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 15:23:25 +0100 Subject: [PATCH 4/9] Fix revision --- ..._11_08_b105b426af99_rename_family_in_db.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py index 80233cce31..a7f5be2267 100644 --- a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py +++ b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py @@ -20,24 +20,46 @@ def upgrade(): op.rename_table("family", "case") op.rename_table("family_sample", "case_sample") + # Drop foreign key constraints that reference the unique constraint to be dropped + op.drop_constraint("analysis_ibfk_1", "analysis", type_="foreignkey") + op.drop_constraint("case_sample_ibfk_1", "case_sample", type_="foreignkey") + # Rename foreign keys - op.alter_column("analysis", "family_id", new_column_name="case_id", type=sa.Integer()) - op.alter_column("case_sample", "family_id", new_column_name="case_id", type=sa.Integer()) + op.alter_column("analysis", "family_id", new_column_name="case_id", existing_type=sa.Integer()) + op.alter_column( + "case_sample", "family_id", new_column_name="case_id", existing_type=sa.Integer() + ) - # Rename unique constraint + # Drop the unique constraint op.drop_constraint("_family_sample_uc", "case_sample", type_="unique") + + # Create the new unique constraint op.create_unique_constraint("_case_sample_uc", "case_sample", ["case_id", "sample_id"]) + # Recreate foreign key constraints referencing the new unique constraint + op.create_foreign_key("analysis_ibfk_1", "analysis", "case", ["case_id"], ["id"]) + op.create_foreign_key("case_sample_ibfk_1", "case_sample", "case", ["case_id"], ["id"]) + def downgrade(): # Rename tables op.rename_table("case", "family") op.rename_table("case_sample", "family_sample") + # Drop foreign key constraints before renaming them back + op.drop_constraint('analysis_ibfk_1', 'analysis', type_='foreignkey') + op.drop_constraint('case_sample_ibfk_1', 'case_sample', type_='foreignkey') + # Rename foreign keys - op.alter_column("analysis", "case_id", new_column_name="family_id", type=sa.Integer()) - op.alter_column("family_sample", "case_id", new_column_name="family_id", type=sa.Integer()) + op.alter_column("analysis", "case_id", new_column_name="family_id", existing_type=sa.Integer()) + op.alter_column("case_sample", "case_id", new_column_name="family_id", existing_type=sa.Integer()) - # Rename unique constraint + # Drop the new unique constraint op.drop_constraint("_case_sample_uc", "family_sample", type_="unique") + + # Recreate the original unique constraint op.create_unique_constraint("_family_sample_uc", "family_sample", ["family_id", "sample_id"]) + + # Recreate foreign key constraints referencing the original unique constraint + op.create_foreign_key('analysis_ibfk_1', 'analysis', 'family', ['family_id'], ['id']) + op.create_foreign_key('case_sample_ibfk_1', 'family_sample', 'family', ['family_id'], ['id']) From 7bd5b9748e39ef164604e9edaf321550d943c96b Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 16:28:22 +0100 Subject: [PATCH 5/9] Patch revision --- ..._11_08_b105b426af99_rename_family_in_db.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py index a7f5be2267..756fcf8a39 100644 --- a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py +++ b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py @@ -42,24 +42,26 @@ def upgrade(): def downgrade(): - # Rename tables - op.rename_table("case", "family") - op.rename_table("case_sample", "family_sample") - # Drop foreign key constraints before renaming them back - op.drop_constraint('analysis_ibfk_1', 'analysis', type_='foreignkey') - op.drop_constraint('case_sample_ibfk_1', 'case_sample', type_='foreignkey') + op.drop_constraint("analysis_ibfk_1", "analysis", type_="foreignkey") + op.drop_constraint("case_sample_ibfk_1", "case_sample", type_="foreignkey") - # Rename foreign keys + # Drop the unique constraint + op.drop_constraint("_case_sample_uc", "case_sample", type_="unique") + + # Rename foreign keys back to original before renaming tables op.alter_column("analysis", "case_id", new_column_name="family_id", existing_type=sa.Integer()) - op.alter_column("case_sample", "case_id", new_column_name="family_id", existing_type=sa.Integer()) + op.alter_column( + "case_sample", "case_id", new_column_name="family_id", existing_type=sa.Integer() + ) - # Drop the new unique constraint - op.drop_constraint("_case_sample_uc", "family_sample", type_="unique") + # Rename tables back to original + op.rename_table("case", "family") + op.rename_table("case_sample", "family_sample") # Recreate the original unique constraint op.create_unique_constraint("_family_sample_uc", "family_sample", ["family_id", "sample_id"]) # Recreate foreign key constraints referencing the original unique constraint - op.create_foreign_key('analysis_ibfk_1', 'analysis', 'family', ['family_id'], ['id']) - op.create_foreign_key('case_sample_ibfk_1', 'family_sample', 'family', ['family_id'], ['id']) + op.create_foreign_key("analysis_ibfk_1", "analysis", "family", ["family_id"], ["id"]) + op.create_foreign_key("case_sample_ibfk_1", "family_sample", "family", ["family_id"], ["id"]) From 562bb9f91c18e1edcbfc3e4ed4942e1af3759480 Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 16:35:38 +0100 Subject: [PATCH 6/9] Formatting --- tests/store_helpers.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/store_helpers.py b/tests/store_helpers.py index 853343951d..438a0f06ea 100644 --- a/tests/store_helpers.py +++ b/tests/store_helpers.py @@ -292,9 +292,7 @@ def add_analysis( if not case: case = StoreHelpers.add_case(store, data_analysis=pipeline, data_delivery=data_delivery) - analysis = store.add_analysis( - pipeline=pipeline, version=pipeline_version, case_id=case.id - ) + analysis = store.add_analysis(pipeline=pipeline, version=pipeline_version, case_id=case.id) analysis.started_at = started_at or datetime.now() if completed_at: From d6e5e858cfc7d182a2783307a806862fd1b3c0ef Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 16:41:52 +0100 Subject: [PATCH 7/9] Rename family to case in view module --- cg/server/admin.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cg/server/admin.py b/cg/server/admin.py index 51533e292b..4dfbbfe3bd 100644 --- a/cg/server/admin.py +++ b/cg/server/admin.py @@ -33,8 +33,8 @@ def view_priority(unused1, unused2, model, unused3): return Markup("%s" % model.priority.name) if model else "" -def view_family_sample_link(unused1, unused2, model, unused3): - """column formatter to open the family-sample view""" +def view_case_sample_link(unused1, unused2, model, unused3): + """column formatter to open the case-sample view""" del unused1, unused2, unused3 @@ -258,7 +258,7 @@ class CaseView(BaseView): "tickets", ] column_formatters = { - "internal_id": view_family_sample_link, + "internal_id": view_case_sample_link, "priority": view_priority, } column_searchable_list = [ @@ -279,7 +279,7 @@ class CaseView(BaseView): } @staticmethod - def view_family_link(unused1, unused2, model, unused3): + def view_case_link(unused1, unused2, model, unused3): """column formatter to open this view""" del unused1, unused2, unused3 markup = "" @@ -310,9 +310,9 @@ def action_set_empty(self, ids: list[str]): def set_action_for_cases(self, action: Union[CaseActions, None], case_entry_ids: list[str]): try: for entry_id in case_entry_ids: - family = db.get_case_by_entry_id(entry_id=entry_id) - if family: - family.action = action + case = db.get_case_by_entry_id(entry_id=entry_id) + if case: + case.action = action db.session.commit() @@ -328,7 +328,7 @@ def set_action_for_cases(self, action: Union[CaseActions, None], case_entry_ids: if not self.handle_view_exception(ex): raise - flash(gettext(f"Failed to set family action. {str(ex)}")) + flash(gettext(f"Failed to set case action. {str(ex)}")) class FlowcellView(BaseView): @@ -392,7 +392,7 @@ class AnalysisView(BaseView): column_default_sort = ("created_at", True) column_editable_list = ["is_primary"] column_filters = ["pipeline", "pipeline_version", "is_primary"] - column_formatters = {"case": CaseView.view_family_link} + column_formatters = {"case": CaseView.view_case_link} column_searchable_list = [ "case.internal_id", "case.name", @@ -448,7 +448,7 @@ class SampleView(BaseView): column_filters = ["customer.internal_id", "priority", "sex", "application_version.application"] column_formatters = { "is_external": is_external_application, - "internal_id": view_family_sample_link, + "internal_id": view_case_sample_link, "invoice": InvoiceView.view_invoice_link, "priority": view_priority, } @@ -570,7 +570,7 @@ class CaseSampleView(BaseView): column_editable_list = ["status"] column_filters = ["status"] column_formatters = { - "case": CaseView.view_family_link, + "case": CaseView.view_case_link, "sample": SampleView.view_sample_link, } column_searchable_list = ["case.internal_id", "case.name", "sample.internal_id"] From 792c454067c029b5574027fff84f979aeca21590 Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 16:54:26 +0100 Subject: [PATCH 8/9] Fix downgrade --- alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py index 756fcf8a39..b627c275c8 100644 --- a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py +++ b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py @@ -64,4 +64,4 @@ def downgrade(): # Recreate foreign key constraints referencing the original unique constraint op.create_foreign_key("analysis_ibfk_1", "analysis", "family", ["family_id"], ["id"]) - op.create_foreign_key("case_sample_ibfk_1", "family_sample", "family", ["family_id"], ["id"]) + op.create_foreign_key("family_sample_ibfk_1", "family_sample", "family", ["family_id"], ["id"]) From be39c900c90d45aafc67bf5229e72c2a166a9135 Mon Sep 17 00:00:00 2001 From: seallard Date: Thu, 9 Nov 2023 17:10:45 +0100 Subject: [PATCH 9/9] Fix order --- .../2023_11_08_b105b426af99_rename_family_in_db.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py index b627c275c8..d2a44a3590 100644 --- a/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py +++ b/alembic/versions/2023_11_08_b105b426af99_rename_family_in_db.py @@ -16,14 +16,14 @@ def upgrade(): + # Drop foreign key constraints that reference the unique constraint to be dropped + op.drop_constraint("analysis_ibfk_1", "analysis", type_="foreignkey") + op.drop_constraint("family_sample_ibfk_1", "family_sample", type_="foreignkey") + # Rename tables op.rename_table("family", "case") op.rename_table("family_sample", "case_sample") - # Drop foreign key constraints that reference the unique constraint to be dropped - op.drop_constraint("analysis_ibfk_1", "analysis", type_="foreignkey") - op.drop_constraint("case_sample_ibfk_1", "case_sample", type_="foreignkey") - # Rename foreign keys op.alter_column("analysis", "family_id", new_column_name="case_id", existing_type=sa.Integer()) op.alter_column(