Skip to content

Commit

Permalink
Added dataverse upload endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
JR-1991 committed Jan 18, 2022
1 parent c9d2342 commit 9ebc619
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
8 changes: 6 additions & 2 deletions pyenzyme/enzymeml/core/enzymemldocument.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,9 @@ def toXMLString(self):
@validate_arguments
def uploadToDataverse(
self,
dataverse_name: str
dataverse_name: str,
base_url: Optional[str] = None,
api_token: Optional[str] = None
):
"""Uploads an EnzymeML document to a Dataverse installation of choice.
Expand All @@ -324,7 +326,9 @@ def uploadToDataverse(
"""
uploadToDataverse(
enzmldoc=self,
dataverse_name=dataverse_name
dataverse_name=dataverse_name,
base_url=base_url,
api_token=api_token
)

# ! Utility methods
Expand Down
11 changes: 7 additions & 4 deletions pyenzyme/enzymeml/databases/dataverse.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
import os
import pydantic

from typing import Any
from typing import Any, Optional
from pyDaRUS import EnzymeMl, Citation, Dataset
from pyDaRUS.metadatablocks.enzymeML import Constant
from pyDaRUS.metadatablocks.citation import SubjectEnum


def uploadToDataverse(enzmldoc, dataverse_name: str) -> None:
def uploadToDataverse(enzmldoc, dataverse_name: str, base_url: Optional[str] = None, api_token: Optional[str] = None) -> None:
"""Uploads a givene EnzymeMLDocument object to a dataverse installation.
It should be noted, that the environment variables 'DATAVERSE_URL' and 'DATAVERSE_API_TOKEN'
Expand All @@ -29,6 +29,8 @@ def uploadToDataverse(enzmldoc, dataverse_name: str) -> None:
Args:
enzmldoc (EnzymeMLDocument): The EnzymeMLDocument to be uploaded.
dataverse_name (str): Name of the dataverse to be uploaded to.
base_url (str): Base URL of the dataverse to upload. Defaults to None. If None the URL will be drawn from env vars.
api_token (str): API Token of the dataverse to upload. Defaults to None. If None the API Token will be drawn from env vars.
"""

# Fill in all the metadatablocks
Expand All @@ -48,7 +50,9 @@ def uploadToDataverse(enzmldoc, dataverse_name: str) -> None:
try:
dataset.upload(
dataverse_name=dataverse_name,
filenames=[f"{enzmldoc.name.replace(' ', '_')}.omex"]
filenames=[f"{enzmldoc.name.replace(' ', '_')}.omex"],
base_url=base_url,
api_token=api_token
)
except Exception as e:
os.remove(f"{enzmldoc.name.replace(' ', '_')}.omex")
Expand Down Expand Up @@ -202,7 +206,6 @@ def add_object(json_data, mapping, add_fun):
# TODO find a better way to handle this error
for error in e.errors():
if error["loc"][0] == "unit":
print(params["name"], params["unit"])
params.pop("unit")
add_fun(**params)

Expand Down
40 changes: 40 additions & 0 deletions pyenzyme_server.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os

from fastapi import FastAPI, UploadFile, File, Request
from pydantic import BaseSettings
from starlette.responses import FileResponse, JSONResponse
from starlette.background import BackgroundTasks

Expand All @@ -16,6 +17,17 @@
ParticipantIdentifierError
)


# * Settings


class Settings(BaseSettings):
# Used for Dataverse upload
DATAVERSE_URL: str
DATAVERSE_API_TOKEN: str


settings = Settings()
app = FastAPI(title="PyEnzyme REST-API", version="1.2", docs_url="/")

# * Functions
Expand Down Expand Up @@ -74,6 +86,34 @@ def parse_measurement_data(measurement, key, nu_measurement, enzmldoc):
)


@app.post(
"/upload/dataverse",
summary="Uploads an OMEX archive to a dataverse installation.",
description="Use this endpoint as form-data and specify the document to be uploaded via the key 'omex_archive' for a succesfull upload.",
tags=["Databases"]
)
async def upload_to_dataverse(background_tasks: BackgroundTasks, dataverse_name: str, omex_archive: UploadFile = File(...)):

# Write to file
file_name = omex_archive.filename
content = await omex_archive.read()
with open(file_name, "wb") as file_handle:
file_handle.write(content)

# Read EnzymeML document
try:
enzmldoc = EnzymeMLDocument.fromFile(file_name)
enzmldoc.uploadToDataverse(
dataverse_name=dataverse_name,
base_url=settings.DATAVERSE_URL,
api_token=settings.DATAVERSE_API_TOKEN
)
except Exception as e:
return f"{e.__class__.__name__}: {str(e)}"
finally:
background_tasks.add_task(remove_file, path=file_name)


@app.post(
"/read",
summary="Reads an EnzymeML document served in an OMEX archive to a JSON representation",
Expand Down

0 comments on commit 9ebc619

Please sign in to comment.