*** Wartungsfenster jeden ersten Mittwoch vormittag im Monat ***

Skip to content
Snippets Groups Projects

Updates

Merged Moser, Maximilian requested to merge mm/updates into main
Files
6
# vim: ts=4
import urllib.parse
from random import randrange
from random import choice
from requests import get
class InvenioRecordsCache:
def __init__(self, base_url, max_records):
"""A cache for visible records in an Invenio instance."""
def __init__(self, base_url, max_records, verify_ssl):
"""Constructor."""
self.base_url = base_url
self.records_endpoint = urllib.parse.urljoin(self.base_url, "/api/records")
self.max_records = max_records
self.verify_ssl = verify_ssl
self.records = []
self.initialized = False
def load_records(self, force=False):
"""Initialize the set of records if it hasn't been initialized yet."""
if self.initialized and not force:
return
def load_records(self):
result = get(
self.records_endpoint,
headers={"Accept": "application/json"},
params="size={}".format(self.max_records),
params=f"size={self.max_records}",
verify=self.verify_ssl,
)
self.records = self.__extract_records__(result.json())
self.records = self._extract_records(result.json())
self.initialized = True
def __extract_records__(self, result):
def _extract_records(self, result):
"""Extract the records from the search result."""
_extracted_records = []
for record in result["hits"]["hits"]:
_new_record = {
"id": record["id"],
"title": record["metadata"]["title"],
"url": record["links"]["self"],
"file_urls": self.__load_resource_urls__(record),
"file_urls": self._load_file_urls(record),
}
_extracted_records.append(_new_record)
return _extracted_records
@staticmethod
def __load_resource_urls__(record):
record_files = get(record["links"]["files"]).json()
def _load_file_urls(self, record):
"""Look up the record's file URLs from its JSON."""
if record["access"]["files"].lower() != "public":
# TODO check if we have access
return []
if "files" not in record["links"]:
return []
record_files = get(record["links"]["files"], verify=self.verify_ssl).json()
if "entries" not in record_files.keys():
return []
@@ -48,5 +67,12 @@ class InvenioRecordsCache:
return file_urls
def get_random_record(self):
record_index = randrange(0, len(self.records))
return self.records[record_index]
"""Select a random record from the cached records.
Load the records if they're not loaded yet.
"""
self.load_records()
if not self.records:
return None
return choice(self.records)
Loading