From 0b7a69cf49ef768b03d34c2935be2be0591e7a09 Mon Sep 17 00:00:00 2001 From: James Kent Date: Tue, 12 Dec 2023 16:27:38 -0600 Subject: [PATCH] [FIX] specification_condition update (#644) * fix specification_condition update * style issues --- compose/neurosynth_compose/models/analysis.py | 3 +- .../neurosynth_compose/resources/analysis.py | 2 +- .../tests/api/test_specification.py | 56 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/compose/neurosynth_compose/models/analysis.py b/compose/neurosynth_compose/models/analysis.py index 98d23d8b7..0d635f064 100644 --- a/compose/neurosynth_compose/models/analysis.py +++ b/compose/neurosynth_compose/models/analysis.py @@ -49,7 +49,8 @@ class SpecificationCondition(BaseMixin, db.Model): ) condition = relationship("Condition", backref=backref("specification_conditions")) specification = relationship( - "Specification", backref=backref("specification_conditions") + "Specification", + backref=backref("specification_conditions", cascade="all, delete-orphan"), ) user_id = db.Column(db.Text, db.ForeignKey("users.external_id")) user = relationship("User", backref=backref("specification_conditions")) diff --git a/compose/neurosynth_compose/resources/analysis.py b/compose/neurosynth_compose/resources/analysis.py index 374533170..0130b7839 100644 --- a/compose/neurosynth_compose/resources/analysis.py +++ b/compose/neurosynth_compose/resources/analysis.py @@ -190,7 +190,7 @@ def update_or_create(cls, data, id=None, commit=True): if cls._attribute_name: existing_nested = getattr(record, cls._attribute_name, None) - if existing_nested and len(existing_nested) == len(rec_data): + if existing_nested: _ = [ rd.update({"id": ns.id}) for rd, ns in zip( diff --git a/compose/neurosynth_compose/tests/api/test_specification.py b/compose/neurosynth_compose/tests/api/test_specification.py index 441e8f650..2ec3ca367 100644 --- a/compose/neurosynth_compose/tests/api/test_specification.py +++ b/compose/neurosynth_compose/tests/api/test_specification.py @@ -112,3 +112,59 @@ def test_update_condition_weight(session, app, auth_client, user_data): assert set(get_spec.json[key]) == set(value) else: assert get_spec.json[key] == value + + +def test_other_specification_conditions(session, app, auth_client, user_data): + specification_data = { + "conditions": [True, False], + "corrector": None, + "database_studyset": None, + "estimator": { + "args": { + "**kwargs": {}, + "kernel__fwhm": None, + "kernel__sample_size": None, + "n_iters": 10000, + }, + "type": "ALESubtraction", + }, + "filter": "included", + "type": "CBMA", + "weights": [1, -1], + } + + create_spec = auth_client.post("/api/specifications", data=specification_data) + + updated_data = { + "type": "CBMA", + "estimator": { + "type": "ALESubtraction", + "args": { + "**kwargs": {}, + "kernel__fwhm": None, + "kernel__sample_size": None, + "n_iters": 10000, + }, + }, + "corrector": None, + "filter": "included", + "conditions": [True], + "database_studyset": "neuroquery", + "weights": [1], + } + + assert create_spec.status_code == 200 + + spec_id = create_spec.json["id"] + + update_spec = auth_client.put(f"/api/specifications/{spec_id}", data=updated_data) + assert update_spec.status_code == 200 + + get_spec = auth_client.get(f"/api/specifications/{spec_id}") + assert get_spec.status_code == 200 + + for key, value in updated_data.items(): + if isinstance(value, list): + assert set(get_spec.json[key]) == set(value) + else: + assert get_spec.json[key] == value