Skip to content

Commit 7988d1e

Browse files
authored
Merge pull request #1395 from microbiomedata/1392-sync-submission-templates
Ensure template props are synced on PATCH
2 parents caf7076 + 964442d commit 7988d1e

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

nmdc_server/api.py

+4
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,12 @@ async def update_submission(
825825
submission.metadata_submission = (
826826
submission.metadata_submission | body_dict["metadata_submission"]
827827
)
828+
# TODO: remove the child properties "studyName" and "templates" in favor of the top-
829+
# level property. Requires some coordination between this API and its clients.
828830
if "studyForm" in body_dict["metadata_submission"]:
829831
submission.study_name = body_dict["metadata_submission"]["studyForm"]["studyName"]
832+
if "templates" in body_dict["metadata_submission"]:
833+
submission.templates = body_dict["metadata_submission"]["templates"]
830834
# Update permissions and status iff the user is an "owner"
831835
if current_user_role and current_user_role.role == models.SubmissionEditorRole.owner:
832836
new_permissions = body_dict.get("permissions", None)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Migrate study templates
2+
3+
Revision ID: ff4e651c3007
4+
Revises: 317274ad8137
5+
Create Date: 2024-09-18 17:21:05.171525
6+
7+
"""
8+
9+
from typing import Optional
10+
11+
import sqlalchemy as sa
12+
from alembic import op
13+
from sqlalchemy.dialects.postgresql import JSONB
14+
from sqlalchemy.sql import column, table
15+
16+
# revision identifiers, used by Alembic.
17+
revision: str = "ff4e651c3007"
18+
down_revision: Optional[str] = "317274ad8137"
19+
branch_labels: Optional[str] = None
20+
depends_on: Optional[str] = None
21+
22+
23+
def upgrade():
24+
submission_metadata = table(
25+
"submission_metadata",
26+
column("id", sa.String),
27+
column("metadata_submission", JSONB),
28+
column("templates", JSONB),
29+
)
30+
31+
connection = op.get_bind()
32+
submissions = connection.execute(
33+
sa.select([submission_metadata.c.id, submission_metadata.c.metadata_submission])
34+
)
35+
36+
for submission in submissions:
37+
templates = submission.metadata_submission.get("templates")
38+
if templates:
39+
connection.execute(
40+
submission_metadata.update()
41+
.where(submission_metadata.c.id == submission.id)
42+
.values(templates=templates)
43+
)
44+
45+
46+
def downgrade():
47+
# ### commands auto generated by Alembic - please adjust! ###
48+
pass
49+
# ### end Alembic commands ###

tests/test_submission.py

+57
Original file line numberDiff line numberDiff line change
@@ -553,3 +553,60 @@ def test_delete_submission_while_locked(db: Session, client: TestClient, logged_
553553
# Verify that it is still there
554554
response = client.request(method="GET", url=f"/api/metadata_submission/{submission.id}")
555555
assert response.status_code == 200
556+
557+
558+
def test_sync_submission_templates(db: Session, client: TestClient, logged_in_user):
559+
template = "foo"
560+
submission = fakes.MetadataSubmissionFactory(
561+
author=logged_in_user,
562+
author_orcid=logged_in_user.orcid,
563+
locked_by=logged_in_user,
564+
lock_updated=datetime.utcnow(),
565+
)
566+
fakes.SubmissionRoleFactory(
567+
submission=submission,
568+
submission_id=submission.id,
569+
user_orcid=logged_in_user.orcid,
570+
role=SubmissionEditorRole.owner,
571+
)
572+
payload = json.loads(
573+
SubmissionMetadataSchemaPatch(**submission.__dict__).json(exclude_unset=True)
574+
)
575+
payload["metadata_submission"]["templates"] = [template]
576+
db.commit()
577+
578+
_ = client.request(
579+
method="PATCH", url=f"/api/metadata_submission/{submission.id}", json=payload
580+
)
581+
response = client.request(method="GET", url=f"/api/metadata_submission/{submission.id}")
582+
assert response.status_code == 200
583+
assert len(response.json()["templates"]) == 1
584+
assert response.json()["templates"][0] == template
585+
586+
587+
def test_sync_submission_study_name(db: Session, client: TestClient, logged_in_user):
588+
expected_val = "my study"
589+
submission = fakes.MetadataSubmissionFactory(
590+
author=logged_in_user,
591+
author_orcid=logged_in_user.orcid,
592+
locked_by=logged_in_user,
593+
lock_updated=datetime.utcnow(),
594+
)
595+
fakes.SubmissionRoleFactory(
596+
submission=submission,
597+
submission_id=submission.id,
598+
user_orcid=logged_in_user.orcid,
599+
role=SubmissionEditorRole.owner,
600+
)
601+
payload = json.loads(
602+
SubmissionMetadataSchemaPatch(**submission.__dict__).json(exclude_unset=True)
603+
)
604+
payload["metadata_submission"]["studyForm"]["studyName"] = expected_val
605+
db.commit()
606+
607+
_ = client.request(
608+
method="PATCH", url=f"/api/metadata_submission/{submission.id}", json=payload
609+
)
610+
response = client.request(method="GET", url=f"/api/metadata_submission/{submission.id}")
611+
assert response.status_code == 200
612+
assert response.json()["study_name"] == expected_val

0 commit comments

Comments
 (0)