Skip to content

Commit 31ef807

Browse files
authored
add is_oa (is_openaccess) column to base-studies (#1199)
1 parent 10d6647 commit 31ef807

File tree

5 files changed

+67
-1
lines changed

5 files changed

+67
-1
lines changed

store/backend/neurostore/models/data.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ class BaseStudy(BaseMixin, db.Model):
189189
public = db.Column(db.Boolean, default=True)
190190
level = db.Column(db.String)
191191
metadata_ = db.Column(JSONB)
192+
is_oa = db.Column(db.Boolean, default=None, nullable=True)
192193
has_coordinates = db.Column(db.Boolean, default=False, nullable=False)
193194
has_images = db.Column(db.Boolean, default=False, nullable=False)
194195
user_id = db.Column(db.Text, db.ForeignKey("users.external_id"), index=True)

store/backend/neurostore/openapi

store/backend/neurostore/resources/data.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,7 @@ class BaseStudiesView(ObjectView, ListView):
964964
"flat": fields.Boolean(load_default=False),
965965
"info": fields.Boolean(load_default=False),
966966
"data_type": fields.String(load_default=None),
967+
"is_oa": fields.Boolean(load_default=None, allow_none=True),
967968
"feature_filter": fields.List(fields.String(load_default=None)),
968969
"pipeline_config": fields.List(fields.String(load_default=None)),
969970
"feature_display": fields.List(fields.String(load_default=None)),
@@ -1187,6 +1188,11 @@ def view_search(self, q, args):
11871188
self._model.has_images.is_(True),
11881189
),
11891190
)
1191+
is_oa = args.get("is_oa", None)
1192+
if is_oa is not None and not isinstance(is_oa, bool):
1193+
abort_validation("is_oa must be a boolean.")
1194+
if is_oa is not None:
1195+
q = q.filter(self._model.is_oa.is_(is_oa))
11901196
# filter by year range
11911197
year_min = args.get("year_min")
11921198
year_max = args.get("year_max")

store/backend/neurostore/schemas/data.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ class BaseStudySchema(BaseDataSchema):
462462
authors = fields.String(allow_none=True)
463463
year = fields.Integer(allow_none=True)
464464
level = fields.String(allow_none=True)
465+
is_oa = fields.Boolean(allow_none=True)
465466
versions = StringOrNested("StudySchema", many=True)
466467
features = fields.Method("get_features")
467468
ace_fulltext = fields.String(load_only=True, allow_none=True)

store/backend/neurostore/tests/api/test_base_studies.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,64 @@ def test_has_coordinates_images(auth_client, session):
420420
assert base_study_2.has_images is False
421421

422422

423+
def test_filter_by_is_oa(auth_client, session):
424+
base_true = BaseStudy(
425+
name="Open Access Study",
426+
doi="10.1234/oa-study",
427+
pmid="111111",
428+
is_oa=True,
429+
public=True,
430+
level="group",
431+
)
432+
base_false = BaseStudy(
433+
name="Closed Access Study",
434+
doi="10.1234/closed-study",
435+
pmid="222222",
436+
is_oa=False,
437+
public=True,
438+
level="group",
439+
)
440+
base_unknown = BaseStudy(
441+
name="Unknown Access Study",
442+
doi="10.1234/unknown-study",
443+
pmid="333333",
444+
is_oa=None,
445+
public=True,
446+
level="group",
447+
)
448+
session.add_all([base_true, base_false, base_unknown])
449+
session.commit()
450+
451+
assert session.query(BaseStudy).count() == 3
452+
453+
all_resp = auth_client.get("/api/base-studies/")
454+
assert all_resp.status_code == 200
455+
all_names = {result["name"] for result in all_resp.json()["results"]}
456+
assert {
457+
"Open Access Study",
458+
"Closed Access Study",
459+
"Unknown Access Study",
460+
}.issubset(all_names)
461+
462+
true_resp = auth_client.get("/api/base-studies/?is_oa=true")
463+
assert true_resp.status_code == 200
464+
true_results = true_resp.json()["results"]
465+
assert all(result["is_oa"] is True for result in true_results)
466+
true_names = {result["name"] for result in true_results}
467+
assert "Open Access Study" in true_names
468+
assert "Closed Access Study" not in true_names
469+
assert "Unknown Access Study" not in true_names
470+
471+
false_resp = auth_client.get("/api/base-studies/?is_oa=false")
472+
assert false_resp.status_code == 200
473+
false_results = false_resp.json()["results"]
474+
assert all(result["is_oa"] is False for result in false_results)
475+
false_names = {result["name"] for result in false_results}
476+
assert "Closed Access Study" in false_names
477+
assert "Open Access Study" not in false_names
478+
assert "Unknown Access Study" not in false_names
479+
480+
423481
def test_config_and_feature_filters(auth_client, ingest_demographic_features, session):
424482
"""Test filtering by both config args and feature results with version specification"""
425483
# Test combined feature and config filtering

0 commit comments

Comments
 (0)