Skip to content

Commit a9d68e9

Browse files
authored
Merge pull request #1208 from microbiomedata/automate-github-issues
Create github issue when user submits metadata
2 parents b961b59 + 89af2d8 commit a9d68e9

File tree

2 files changed

+87
-2
lines changed

2 files changed

+87
-2
lines changed

nmdc_server/api.py

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import json
2+
import logging
13
from io import BytesIO
24
from typing import Any, Dict, List, Optional
35
from uuid import UUID
46

7+
import requests
58
from fastapi import APIRouter, Depends, Header, HTTPException, Response, status
69
from fastapi.responses import JSONResponse, PlainTextResponse
710
from sqlalchemy.orm import Session
@@ -728,12 +731,16 @@ async def update_submission(
728731
status_code=400,
729732
detail="This submission is currently being edited by a different user.",
730733
)
731-
734+
# Create Github issue when metadata is being submitted
735+
if (
736+
submission.status == "in-progress"
737+
and body_dict.get("status", None) == "Submitted- Pending Review"
738+
):
739+
create_github_issue(submission, user)
732740
# Merge the submission metadata dicts
733741
submission.metadata_submission = (
734742
submission.metadata_submission | body_dict["metadata_submission"]
735743
)
736-
737744
# Update permissions and status iff the user is an "owner"
738745
if current_user_role and current_user_role.role == models.SubmissionEditorRole.owner:
739746
new_permissions = body_dict.get("permissions", None)
@@ -747,6 +754,79 @@ async def update_submission(
747754
return submission
748755

749756

757+
def create_github_issue(submission, user):
758+
settings = Settings()
759+
gh_url = str(settings.github_issue_url)
760+
token = settings.github_authentication_token
761+
assignee = settings.github_issue_assignee
762+
# If the settings for issue creation weren't supplied return, no need to do anything further
763+
if gh_url == None or token == None:
764+
return
765+
766+
# Gathering the fields we want to display in the issue
767+
headers = {"Authorization": f"Bearer {token}", "Content-Type": "text/plain; charset=utf-8"}
768+
studyform = submission.metadata_submission["studyForm"]
769+
contextform = submission.metadata_submission["contextForm"]
770+
multiomicsform = submission.metadata_submission["multiOmicsForm"]
771+
pi = studyform["piName"]
772+
piorcid = studyform["piOrcid"]
773+
datagenerated = "Yes" if contextform["dataGenerated"] else "No"
774+
omicsprocessingtypes = ", ".join(multiomicsform["omicsProcessingTypes"])
775+
sampletype = ", ".join(submission.metadata_submission["templates"])
776+
sampledata = submission.metadata_submission["sampleData"]
777+
numsamples = 0
778+
for key in sampledata:
779+
numsamples = max(numsamples, len(sampledata[key]))
780+
781+
# some variable data to supply depending on if data has been generated or not
782+
data_ids = []
783+
if contextform["dataGenerated"]:
784+
data_ids = [
785+
"NCBI ID: " + multiomicsform["NCBIBioProjectId"],
786+
"GOLD ID: " + multiomicsform["GOLDStudyId"],
787+
"Alternative IDs/Names: " + ", ".join(multiomicsform["alternativeNames"]),
788+
]
789+
790+
else:
791+
data_ids = [
792+
"JGI IDs: " + multiomicsform["JGIStudyId"],
793+
"EMSL IDs: " + multiomicsform["studyNumber"],
794+
"Alternative IDs/Names: " + ", ".join(multiomicsform["alternativeNames"]),
795+
]
796+
797+
# assemble the body of the API request
798+
body_lis = [
799+
f"Submitter: {user.name}, {user.orcid}",
800+
f"Submission ID: {submission.id}",
801+
f"Has data been generated: {datagenerated}",
802+
f"PI name: {pi}",
803+
f"PI orcid: {piorcid}",
804+
"Status: Submitted -Pending Review",
805+
f"Data types: {omicsprocessingtypes}",
806+
f"Sample type:{sampletype}",
807+
f"Number of samples:{numsamples}",
808+
] + data_ids
809+
body_string = " \n ".join(body_lis)
810+
payload_dict = {
811+
"title": f"NMDC Submission: {submission.id}",
812+
"body": body_string,
813+
"assignees": [assignee],
814+
}
815+
816+
payload = json.dumps(payload_dict)
817+
818+
# make request and log an error or success depending on reply
819+
res = requests.post(url=gh_url, data=payload, headers=headers)
820+
if res.status_code != 201:
821+
logging.error(f"Github issue creation failed with code {res.status_code}")
822+
logging.error(res.reason)
823+
else:
824+
logging.info(f"Github issue creation successful with code {res.status_code}")
825+
logging.info(res.reason)
826+
827+
return res
828+
829+
750830
@router.delete(
751831
"/metadata_submission/{id}",
752832
tags=["metadata_submission"],

nmdc_server/config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ class Settings(BaseSettings):
6767
# CORS settings necessary for allowing request from Field Notes app
6868
cors_allow_origins: Optional[str] = None # comma separated list of allowed origins
6969

70+
# Github Issue creation settings. Both are required for automated issue creation.
71+
github_issue_url: Optional[str] = None
72+
github_authentication_token: Optional[str] = None
73+
github_issue_assignee: Optional[str] = None
74+
7075
@property
7176
def current_db_uri(self) -> str:
7277
if self.environment == "testing":

0 commit comments

Comments
 (0)