Skip to content

Commit

Permalink
Add dates to listRecords
Browse files Browse the repository at this point in the history
  • Loading branch information
micafer committed May 8, 2024
1 parent 9c59125 commit ad28e5e
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 45 deletions.
74 changes: 31 additions & 43 deletions app/oaipmh/oai.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,30 @@ def identify(self, root, verb):

return etree.tostring(root, pretty_print=True, encoding='unicode')

def filterIdentifiers(self, metadata_dict, from_date, until_date):
if from_date is not None:
from_date_dt = self.isValidDate(from_date)
if until_date is not None:
until_date_dt = self.isValidDate(until_date)

# Filter identifiers based on the date range specified by from_date and until_date
filtered_identifiers = list(metadata_dict.keys())

if from_date is not None or until_date is not None:
filtered_identifiers = []
for record_identifier, record_data in metadata_dict.items():
if record_data.get("creation_date"):
record_date = datetime.combine(record_data.get("creation_date"), datetime.min.time())
else:
# Convert the date string to a datetime object
record_date = datetime.strptime(self.earliest_datestamp, "%Y-%m-%d")

if (from_date is None or record_date >= from_date_dt) and \
(until_date is None or record_date <= until_date_dt):
filtered_identifiers.append(record_identifier)

return filtered_identifiers

def listIdentifiers(self, root, metadata_dict, verb, metadata_prefix, from_date=None,
until_date=None, set_spec=None, resumption_token=None):
self.addRequestElement(root, verb, metadata_prefix=metadata_prefix, from_date=from_date,
Expand Down Expand Up @@ -163,26 +187,7 @@ def listIdentifiers(self, root, metadata_dict, verb, metadata_prefix, from_date=
root.append(error_element)
return etree.tostring(root, pretty_print=True, encoding='unicode')

if from_date is not None:
from_date_dt = self.isValidDate(from_date)
if until_date is not None:
until_date_dt = self.isValidDate(until_date)

# Filter identifiers based on the date range specified by from_date and until_date
filtered_identifiers = list(metadata_dict.keys())

if from_date is not None or until_date is not None:
filtered_identifiers = []
for record_identifier, record_data in metadata_dict.items():
if record_data.get("creation_date"):
record_date = datetime.combine(record_data.get("creation_date"), datetime.min.time())
else:
# Convert the date string to a datetime object
record_date = datetime.strptime(self.earliest_datestamp, "%Y-%m-%d")

if (from_date is None or record_date >= from_date_dt) and \
(until_date is None or record_date <= until_date_dt):
filtered_identifiers.append(record_identifier)
filtered_identifiers = self.filterIdentifiers(metadata_dict, from_date, until_date)

# Create the ListIdentifiers element
list_identifiers_element = etree.Element('ListIdentifiers')
Expand Down Expand Up @@ -262,24 +267,7 @@ def listRecords(self, root, metadata_dict, verb, metadata_prefix, from_date=None
root.append(error_element)
return etree.tostring(root, pretty_print=True, encoding='unicode')

# if from_date is not None:
# from_date_dt = self.isValidDate(from_date)
# if until_date is not None:
# until_date_dt = self.isValidDate(until_date)

# Filter identifiers based on the date range specified by from_date and until_date
# filtered_identifiers = []

# for record_identifier, record_data in metadata_dict.items():
# record_date_str = record_data["date"]
# record_metadata = record_data

# # Convert the date string to a datetime object
# record_date = datetime.strptime(record_date_str, "%Y-%m-%d")

# if (from_date_dt is None or record_date >= from_date_dt) and \
# (until_date_dt is None or record_date <= until_date_dt):
# filtered_identifiers.append((record_identifier, record_date_str, record_metadata))
filtered_identifiers = self.filterIdentifiers(metadata_dict, from_date, until_date)

list_records_element = etree.Element('ListRecords')

Expand All @@ -288,24 +276,24 @@ def listRecords(self, root, metadata_dict, verb, metadata_prefix, from_date=None
error_element = Errors.noRecordsMatch()
root.append(error_element)
else:
for record_name, record_metadata in metadata_dict.items():
for record_name in filtered_identifiers:
record_element = etree.Element('record')

header_element = etree.Element('header')
identifier_element = etree.Element('identifier')
identifier_element.text = f'{self.repository_indentifier_base_url}{record_name}'
datestamp_element = etree.Element('datestamp')
datestamp_element.text = 'datestamp'
if record_metadata.get('creation_date'):
datestamp_element.text = record_metadata.get('creation_date').strftime("%Y-%m-%d")
if metadata_dict[record_name].get('creation_date'):
datestamp_element.text = metadata_dict[record_name].get('creation_date').strftime("%Y-%m-%d")

metadata_element = etree.Element('metadata')

if metadata_prefix == 'oai_dc':
metadata_xml = self.mapDC(record_metadata)
metadata_xml = self.mapDC(metadata_dict[record_name])

if metadata_prefix == 'oai_openaire':
metadata_xml = self.mapOAIRE(record_metadata)
metadata_xml = self.mapOAIRE(metadata_dict[record_name])

# Append the generated XML to the metadata element
metadata_element.append(metadata_xml)
Expand Down
10 changes: 8 additions & 2 deletions app/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -837,11 +837,17 @@ def test_oai(self):
# Test ListRecords oai_openaire
res = self.client.get('/oai?verb=ListRecords&metadataPrefix=oai_openaire')
self.assertEqual(200, res.status_code)

root = etree.fromstring(res.data)

elems = root.findall(".//oaipmh:identifier", namespaces)
self.assertEqual(len(elems), 1)
self.assertEqual(root.find(".//datacite:creatorName", namespaces).text, "Miguel Caballer")

res = self.client.get('/oai?verb=ListRecords&metadataPrefix=oai_dc&until=2020-09-07')
self.assertEqual(200, res.status_code)
root = etree.fromstring(res.data)
elems = root.findall(".//oaipmh:identifier", namespaces)
self.assertEqual(len(elems), 0)

# Test ListMetadataFormats
res = self.client.get('/oai?verb=ListMetadataFormats')
self.assertEqual(200, res.status_code)
Expand Down

0 comments on commit ad28e5e

Please sign in to comment.