def get_entries( collection: EntryCollection, response: EntryResponseMany, request: Request, params: EntryListingQueryParams, ) -> EntryResponseMany: """Generalized /{entry} endpoint getter""" from optimade.server.routers import ENTRY_COLLECTIONS ( results, data_returned, more_data_available, fields, include_fields, ) = collection.find(params) include = [] if getattr(params, "include", False): include.extend(params.include.split(",")) included = get_included_relationships(results, ENTRY_COLLECTIONS, include) if more_data_available: # Deduce the `next` link from the current request query = urllib.parse.parse_qs(request.url.query) query["page_offset"] = int(query.get("page_offset", [0])[0]) + len(results) urlencoded = urllib.parse.urlencode(query, doseq=True) base_url = get_base_url(request.url) links = ToplevelLinks( next=f"{base_url}{request.url.path}?{urlencoded}") else: links = ToplevelLinks(next=None) if fields or include_fields: results = handle_response_fields(results, fields, include_fields) return response( links=links, data=results, meta=meta_values( url=request.url, data_returned=data_returned, data_available=len(collection), more_data_available=more_data_available, ), included=included, )
def get_single_entry( collection: EntryCollection, entry_id: str, response: EntryResponseOne, request: Request, params: SingleEntryQueryParams, ) -> EntryResponseOne: from optimade.server.routers import ENTRY_COLLECTIONS params.filter = f'id="{entry_id}"' ( results, data_returned, more_data_available, fields, include_fields, ) = collection.find(params) include = [] if getattr(params, "include", False): include.extend(params.include.split(",")) included = get_included_relationships(results, ENTRY_COLLECTIONS, include) if more_data_available: raise HTTPException( status_code=500, detail= f"more_data_available MUST be False for single entry response, however it is {more_data_available}", ) links = ToplevelLinks(next=None) if fields or include_fields and results is not None: results = handle_response_fields(results, fields, include_fields)[0] return response( links=links, data=results, meta=meta_values( url=request.url, data_returned=data_returned, data_available=len(collection), more_data_available=more_data_available, ), included=included, )
def get_entries( collection: EntryCollection, response: EntryResponseMany, request: Request, params: EntryListingQueryParams, ) -> EntryResponseMany: """Generalized /{entry} endpoint getter""" from optimade.server.routers import ENTRY_COLLECTIONS results, data_returned, more_data_available, fields = collection.find( params) included = get_included_relationships(results, ENTRY_COLLECTIONS) if more_data_available: parse_result = urllib.parse.urlparse(str(request.url)) query = urllib.parse.parse_qs(parse_result.query) query["page_offset"] = int(query.get("page_offset", [0])[0]) + len(results) urlencoded = urllib.parse.urlencode(query, doseq=True) links = ToplevelLinks( next= f"{parse_result.scheme}://{parse_result.netloc}{parse_result.path}?{urlencoded}" ) else: links = ToplevelLinks(next=None) if fields: results = handle_response_fields(results, fields) return response( links=links, data=results, meta=meta_values( url=str(request.url), data_returned=data_returned, data_available=len(collection), more_data_available=more_data_available, ), included=included, )