Commit 0c926116 authored by Markus Scheidgen's avatar Markus Scheidgen
Browse files

Fixed ineffective optimade API and its test.

parent be4f56c3
...@@ -140,6 +140,9 @@ def add_search_parameters(request_parser): ...@@ -140,6 +140,9 @@ def add_search_parameters(request_parser):
request_parser.add_argument( request_parser.add_argument(
'until_time', type=lambda x: rfc3339DateTime.parse(x), 'until_time', type=lambda x: rfc3339DateTime.parse(x),
help='A yyyy-MM-ddTHH:mm:ss (RFC3339) maximum entry time (e.g. upload time)') help='A yyyy-MM-ddTHH:mm:ss (RFC3339) maximum entry time (e.g. upload time)')
request_parser.add_argument(
'dft.optimade', type=str,
help='A search query in the optimade filter language.')
# main search parameters # main search parameters
for qualified_name, quantity in search.search_quantities.items(): for qualified_name, quantity in search.search_quantities.items():
...@@ -181,16 +184,16 @@ def apply_search_parameters(search_request: search.SearchRequest, args: Dict[str ...@@ -181,16 +184,16 @@ def apply_search_parameters(search_request: search.SearchRequest, args: Dict[str
until_time = rfc3339DateTime.parse(until_time_str) if until_time_str is not None else None until_time = rfc3339DateTime.parse(until_time_str) if until_time_str is not None else None
search_request.time_range(start=from_time, end=until_time) search_request.time_range(start=from_time, end=until_time)
except Exception: except Exception:
abort(400, message='bad datetime format') abort(400, 'bad datetime format')
# optimade # optimade
try: try:
optimade = args.get('optimade', None) optimade = args.get('dft.optimade', None)
if optimade is not None: if optimade is not None:
q = filterparser.parse_filter(optimade) q = filterparser.parse_filter(optimade)
search_request.query(q) search_request.query(q)
except filterparser.FilterException: except filterparser.FilterException:
abort(400, message='could not parse optimade query') abort(400, 'could not parse optimade query')
# search parameter # search parameter
search_request.search_parameters(**{ search_request.search_parameters(**{
......
...@@ -1162,12 +1162,24 @@ class TestRepo(): ...@@ -1162,12 +1162,24 @@ class TestRepo():
def test_optimade(self, api, non_empty_processed, test_user_auth): def test_optimade(self, api, non_empty_processed, test_user_auth):
rv = api.get( rv = api.get(
'/repo/?%s' % urlencode(dict(owner='all', optimade='nelements >= 1')), '/repo/?%s' % urlencode({'owner': 'all', 'dft.optimade': 'nelements >= 1'}),
headers=test_user_auth) headers=test_user_auth)
assert rv.status_code == 200 assert rv.status_code == 200
data = json.loads(rv.data) data = json.loads(rv.data)
assert data['pagination']['total'] > 0 assert data['pagination']['total'] > 0
rv = api.get(
'/repo/?%s' % urlencode({'owner': 'all', 'dft.optimade': 'nelements = 23'}),
headers=test_user_auth)
assert rv.status_code == 200
data = json.loads(rv.data)
assert data['pagination']['total'] == 0
rv = api.get(
'/repo/?%s' % urlencode({'owner': 'all', 'dft.optimade': 'this is not optimade'}),
headers=test_user_auth)
assert rv.status_code == 400
def test_labels(self, api, non_empty_processed, test_user_auth): def test_labels(self, api, non_empty_processed, test_user_auth):
rv = api.get( rv = api.get(
'/repo/?%s' % urlencode(dict(owner='all', labels=['nonmetal', 'semiconductor']), doseq=True), '/repo/?%s' % urlencode(dict(owner='all', labels=['nonmetal', 'semiconductor']), doseq=True),
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment