Skip to content

Commit d2098c7

Browse files
authored
Merge pull request #433 from ghga-de/develop
Prepare Release 0.9.8
2 parents c8d7408 + 44505f7 commit d2098c7

File tree

6 files changed

+34
-25
lines changed

6 files changed

+34
-25
lines changed

datameta/api/download.py

+9-11
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,22 @@ def get_file_url(request: Request) -> HTTPTemporaryRedirect:
4545
)
4646

4747
# retrieve URL:
48-
url = storage.get_download_url(
48+
url, expires_at = storage.get_download_url(
4949
request=request,
5050
db_file=db_file,
5151
expires_after=expires_after
5252
)
5353

54-
if redirect:
55-
return HTTPTemporaryRedirect(url, json_body = {
54+
response = {
5655
'fileId' : get_identifier(db_file),
5756
'fileUrl' : f"{request.host_url}{url}",
58-
'expires' : expires_after
59-
})
57+
'expires' : expires_at.isoformat() + "+00:00"
58+
}
59+
60+
if redirect:
61+
return HTTPTemporaryRedirect(url, json_body=response)
6062
else:
61-
return HTTPOk(json_body = {
62-
'fileId' : get_identifier(db_file),
63-
'fileUrl' : f"{request.host_url}{url}",
64-
'expires' : expires_after
65-
})
63+
return HTTPOk(json_body=response)
6664

6765

6866
@view_config(
@@ -83,7 +81,7 @@ def download_by_token(request: Request) -> HTTPOk:
8381
db_token = db.query(models.DownloadToken).filter(
8482
and_(
8583
models.DownloadToken.value == hashed_token,
86-
models.DownloadToken.expires > datetime.now()
84+
models.DownloadToken.expires > datetime.utcnow()
8785
)
8886
).one_or_none()
8987

datameta/api/metadatasets.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -378,14 +378,14 @@ def set_metadata_via_service(request: Request) -> MetaDataSetResponse:
378378
.options(joinedload(Service.users))\
379379
.one_or_none()
380380

381-
service_metadata = { mdatum.name : mdatum for mdatum in service.target_metadata }
382-
383-
service_records = { rec.metadatum.name : rec for rec in metadataset.metadatumrecords if rec.metadatum.name in service_metadata }
384-
385381
# Return 404 if a resource could not be found
386382
if metadataset is None or service is None:
387383
raise HTTPNotFound()
388384

385+
service_metadata = { mdatum.name : mdatum for mdatum in service.target_metadata }
386+
387+
service_records = { rec.metadatum.name : rec for rec in metadataset.metadatumrecords if rec.metadatum.name in service_metadata }
388+
389389
# Return 403 if the user has no permission to execute this service or the
390390
# service has already been executed for this metadataset
391391
if service.id in (sexec.service_id for sexec in metadataset.service_executions):
@@ -413,9 +413,6 @@ def set_metadata_via_service(request: Request) -> MetaDataSetResponse:
413413
# Validate submission access to the specified files
414414
validation.validate_submission_access(db, db_files, {}, auth_user)
415415

416-
# Validate the associations between files and records
417-
fnames, ref_fnames, val_errors = validation.validate_submission_association(db_files, { metadataset.site_id : metadataset })
418-
419416
# Validate the provided records
420417
validate_metadataset_record(service_metadata, records, return_err_message=False, rendered=False)
421418

@@ -426,9 +423,21 @@ def set_metadata_via_service(request: Request) -> MetaDataSetResponse:
426423
db_rec.value = record_value
427424
db.add(db_rec)
428425

426+
# Validate the associations between files and records
427+
fnames, ref_fnames, val_errors = validation.validate_submission_association(db_files, { metadataset.site_id : metadataset }, ignore_submitted_metadatasets=True)
428+
429+
# If there were any validation errors, return 400
430+
if val_errors:
431+
entities, fields, messages = zip(*val_errors)
432+
raise errors.get_validation_error(messages=messages, fields=fields, entities=entities)
433+
434+
# Given that validation hasn't failed, we know that file names are unique. Flatten the dict.
435+
fnames = { k : v[0] for k, v in fnames.items() }
436+
429437
# Associate the files with the metadata
430438
for fname, mdatrec in ref_fnames.items():
431439
mdatrec.file = fnames[fname]
440+
db.add(mdatrec)
432441

433442
# Create a service execution
434443
sexec = ServiceExecution(

datameta/api/openapi.yaml

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
openapi: 3.0.0
1616
info:
1717
description: DataMeta
18-
version: 0.26.0
18+
version: 0.27.0
1919
title: DataMeta
2020

2121
servers:
@@ -1276,7 +1276,8 @@ components:
12761276
fileUrl:
12771277
type: string
12781278
expires:
1279-
type: integer
1279+
type: string
1280+
format: date-time
12801281
required:
12811282
- fileId
12821283
- fileUrl

datameta/storage.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def _get_download_url_local(request: Request, db_file: models.File, expires_afte
164164

165165
token = security.generate_token()
166166
token_hash = security.hash_token(token)
167-
expires = datetime.now() + timedelta(minutes = float(expires_after))
167+
expires = datetime.utcnow() + timedelta(minutes = float(expires_after))
168168

169169
db = request.dbsession
170170
download_token = models.DownloadToken(
@@ -174,7 +174,7 @@ def _get_download_url_local(request: Request, db_file: models.File, expires_afte
174174
)
175175
db.add(download_token)
176176

177-
return f"{base_url}/download/{token}"
177+
return f"{base_url}/download/{token}", expires
178178

179179

180180
def _get_download_url_s3(request: Request, db_file: models.File, expires_after: Optional[int] = None):

datameta/validation.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def validate_submission_access(db, db_files, db_msets, auth_user):
6464
raise errors.get_validation_error(messages=messages, fields=fields, entities=entities)
6565

6666

67-
def validate_submission_association(db_files, db_msets):
67+
def validate_submission_association(db_files, db_msets, ignore_submitted_metadatasets = False):
6868
"""Validates a submission with regard to
6969
7070
- All submitted files being associated to metadata
@@ -82,7 +82,8 @@ def validate_submission_association(db_files, db_msets):
8282
# Collect files which already have other metadata associated
8383
errors += [ (db_file, None, "Already submitted") for file_id, db_file in db_files.items() if db_file.metadatumrecord is not None ]
8484
# Collect metadatasets that were already submitted
85-
errors += [ (db_mset, None, "Already submitted") for mset_id, db_mset in db_msets.items() if db_mset.submission_id is not None ]
85+
if not ignore_submitted_metadatasets:
86+
errors += [ (db_mset, None, "Already submitted") for mset_id, db_mset in db_msets.items() if db_mset.submission_id is not None ]
8687

8788
# Collect the file names of the provided files
8889
f_names_obj = defaultdict(list)

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060

6161
setup(
6262
name = 'datameta',
63-
version = '0.9.7',
63+
version = '0.9.8',
6464
description = 'DataMeta - submission server for data and associated metadata',
6565
long_description = README + '\n\n' + CHANGES,
6666
author = 'Leon Kuchenbecker',

0 commit comments

Comments
 (0)