cr-connect-workflow/crc/api/data_store.py

103 lines
3.4 KiB
Python

import json
from datetime import datetime
from crc import session
from crc.api.common import ApiError
from crc.models.data_store import DataStoreModel, DataStoreSchema
from crc.services.data_store_service import DataStoreBase
def study_multi_get(study_id):
"""Get all data_store values for a given study_id study"""
if study_id is None:
raise ApiError('unknown_study', 'Please provide a valid Study ID.')
dsb = DataStoreBase()
retval = dsb.get_multi_common(study_id, None)
results = DataStoreSchema(many=True).dump(retval)
return results
def user_multi_get(user_id):
"""Get all data values in the data_store for a userid"""
if user_id is None:
raise ApiError('unknown_study', 'Please provide a valid UserID.')
dsb = DataStoreBase()
retval = dsb.get_multi_common(None,
user_id)
results = DataStoreSchema(many=True).dump(retval)
return results
def file_multi_get(file_id):
"""Get all data values in the data store for a file_id"""
if file_id is None:
raise ApiError(code='unknown_file', message='Please provide a valid file id.')
dsb = DataStoreBase()
retval = dsb.get_multi_common(None, None, file_id=file_id)
results = DataStoreSchema(many=True).dump(retval)
return results
def datastore_del(id):
"""Delete a data store item for a key"""
session.query(DataStoreModel).filter_by(id=id).delete()
session.commit()
json_value = json.dumps('deleted', ensure_ascii=False, indent=2)
return json_value
def datastore_get(id):
"""retrieve a data store item by a key"""
item = session.query(DataStoreModel).filter_by(id=id).first()
results = DataStoreSchema(many=False).dump(item)
return results
def update_datastore(id, body):
"""allow a modification to a datastore item """
if id is None:
raise ApiError('unknown_id', 'Please provide a valid ID.')
item = session.query(DataStoreModel).filter_by(id=id).first()
if item is None:
raise ApiError('unknown_item', 'The item "' + id + '" is not recognized.')
DataStoreSchema().load(body, instance=item, session=session)
item.last_updated = datetime.utcnow()
session.add(item)
session.commit()
return DataStoreSchema().dump(item)
def add_datastore(body):
""" add a new datastore item """
if body.get(id, None):
raise ApiError('id_specified', 'You may not specify an id for a new datastore item')
if 'key' not in body:
raise ApiError('no_key', 'You need to specify a key to add a datastore item')
if 'value' not in body:
raise ApiError('no_value', 'You need to specify a value to add a datastore item')
if ('user_id' not in body) and ('study_id' not in body) and ('file_id' not in body):
raise ApiError('conflicting_values', 'A datastore item should have either a study_id, user_id or file_id ')
present = 0
for field in ['user_id','study_id','file_id']:
if field in body:
present = present+1
if present > 1:
raise ApiError('conflicting_values', 'A datastore item should have one of a study_id, user_id or a file_id '
'but not more than one of these')
item = DataStoreSchema().load(body)
item.last_updated = datetime.utcnow()
session.add(item)
session.commit()
return DataStoreSchema().dump(item)