Skip to content

Commit

Permalink
global: addition of OAISet record adding
Browse files Browse the repository at this point in the history
* Adds API method to OAISet for adding records.

Signed-off-by: Krzysztof Nowak <k.nowak@cern.ch>
  • Loading branch information
Krzysztof Nowak committed Apr 12, 2016
1 parent 7554883 commit 5380799
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 12 deletions.
14 changes: 14 additions & 0 deletions invenio_oaiserver/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

"""Models for storing information about OAIServer state."""

from datetime import datetime

from flask_babelex import lazy_gettext as _
from invenio_db import db
from sqlalchemy.event import listen
Expand All @@ -32,6 +34,7 @@

from .errors import OAISetSpecUpdateError
from .proxies import current_oaiserver
from .utils import datetime_to_datestamp


class OAISet(db.Model, Timestamp):
Expand Down Expand Up @@ -88,6 +91,17 @@ def validate_spec(self, key, value):
raise OAISetSpecUpdateError("Updating spec is not allowed.")
return value

def add_record(self, record, commit_record=True):
"""Add a record to the OAISet.
:param record: Record to be added.
:type record: `invenio_record.api.Record`
"""
record.setdefault('_oai', {}).setdefault('sets', []).append(self.spec)
record['_oai']['updated'] = datetime_to_datestamp(datetime.utcnow())
if commit_record:
record.commit()


def oaiset_removed_or_inserted(mapper, connection, target):
"""Invalidate cache on collection insert or delete."""
Expand Down
13 changes: 1 addition & 12 deletions invenio_oaiserver/response.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
from .provider import OAIIDProvider
from .query import get_records
from .resumption_token import serialize
from .utils import serializer
from .utils import datetime_to_datestamp, serializer

NS_OAIPMH = 'http://www.openarchives.org/OAI/2.0/'
NS_OAIPMH_XSD = 'http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd'
Expand All @@ -62,17 +62,6 @@
}


def datetime_to_datestamp(dt, day_granularity=False):
"""Transform datetime to datestamp."""
# assert dt.tzinfo is None # only accept timezone naive datetimes
# ignore microseconds
dt = dt.replace(microsecond=0)
result = dt.isoformat() + 'Z'
if day_granularity:
result = result[:-10]
return result


def envelope(**kwargs):
"""Create OAI-PMH envelope for response."""
e_oaipmh = Element(etree.QName(NS_OAIPMH, 'OAI-PMH'), nsmap=NSMAP)
Expand Down
11 changes: 11 additions & 0 deletions invenio_oaiserver/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,14 @@ def dumps_etree(pid, record, **kwargs):
from dojson.contrib.to_marc21.utils import dumps_etree

return dumps_etree(to_marc21.do(record['_source']), **kwargs)


def datetime_to_datestamp(dt, day_granularity=False):
"""Transform datetime to datestamp."""
# assert dt.tzinfo is None # only accept timezone naive datetimes
# ignore microseconds
dt = dt.replace(microsecond=0)
result = dt.isoformat() + 'Z'
if day_granularity:
result = result[:-10]
return result
14 changes: 14 additions & 0 deletions tests/test_percolator.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@

"""Percolator test cases."""

from datetime import datetime
from time import sleep

import pytest
from dateutil.parser import parse as iso2dt
from invenio_db import db
from invenio_indexer.api import RecordIndexer
from invenio_records.api import Record
Expand Down Expand Up @@ -216,3 +218,15 @@ def _try_populate_oaisets():
assert len(record2_model['_oai']['sets']) == 3

current_oaiserver.register_signals_oaiset()


def test_oaiset_add_record(app):
"""Test the API method for manual record adding."""
with app.app_context():
oaiset1 = OAISet(spec='abc')
rec1 = Record.create({'title': 'Test1'})
oaiset1.add_record(rec1, commit_record=False)
assert 'abc' in rec1['_oai']['sets']
assert 'updated' in rec1['_oai']
dt = iso2dt(rec1['_oai']['updated'])
assert dt.year == datetime.now().year # Test if parsed OK

0 comments on commit 5380799

Please sign in to comment.