Skip to content

Commit

Permalink
Merge pull request #81 from unt-libraries/fix-80
Browse files Browse the repository at this point in the history
Fix 80
  • Loading branch information
ldko committed Apr 18, 2017
2 parents 6fce3fb + 426a56c commit 2bec5d4
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 126 deletions.
34 changes: 9 additions & 25 deletions premis_event_service/presentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@
from lxml import etree
from django.shortcuts import get_object_or_404

from codalib.bagatom import getValueByName, getNodeByName, getNodesByName
from codalib.xsdatetime import xsDateTime_parse, xsDateTime_format, localize_datetime
from codalib.bagatom import (getValueByName,
getNodeByName,
getNodesByName,
updateObjectFromXML)
from codalib.xsdatetime import (xsDateTime_parse,
xsDateTime_format,
localize_datetime)
from .models import Event, Agent, LinkObject, AGENT_TYPE_CHOICES
from premis_event_service import settings
import collections
Expand Down Expand Up @@ -35,7 +40,7 @@

xpath_map = collections.OrderedDict()
xpath_map['@namespaces'] = PREMIS_NSMAP
xpath_map['event_identifier_type'] = 'premis:eventIdentifier/eventIdentifierType'
xpath_map['event_identifier_type'] = 'premis:eventIdentifier/premis:eventIdentifierType'
xpath_map['event_identifier'] = 'premis:eventIdentifier/premis:eventIdentifierValue'
xpath_map['event_type'] = 'premis:eventType'
xpath_map['event_date_time'] = 'premis:eventDateTime'
Expand All @@ -62,9 +67,7 @@ def premisEventXMLToObject(eventXML):
Event XML -> create Event object
"""

newEventObject = Event()
for fieldName, chain in translateDict.iteritems():
doSimpleXMLAssignment(newEventObject, fieldName, eventXML, chain)
newEventObject = updateObjectFromXML(eventXML, Event(), xpath_map)
linkingObjectIDNodes = getNodesByName(eventXML, "linkingObjectIdentifier")
try:
Event.objects.get(event_identifier=newEventObject.event_identifier)
Expand Down Expand Up @@ -301,22 +304,3 @@ def objectToPremisAgentXML(agentObject, webRoot):
agentType.text = [tup for tup in AGENT_TYPE_CHOICES if
tup[0] == agentObject.agent_type][0][1]
return agentXML


def doSimpleXMLAssignment(recordObject, fieldName, node, chain):
"""
"""

if not isinstance(chain, list) and not isinstance(chain, tuple):
chain = [chain]
currentNode = getNodeByName(node, chain[0])
chain = chain[1:]
for i in range(len(chain)):
chainItem = chain[i]
currentNode = getNodeByName(currentNode, chainItem)
if currentNode is not None and currentNode.text:
value = currentNode.text.strip()
else:
value = None
if value:
setattr(recordObject, fieldName, value)
117 changes: 16 additions & 101 deletions tests/test_presentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,22 @@ def test_returns_event(self, event_xml):
event = presentation.premisEventXMLToObject(tree)
assert isinstance(event, models.Event)

def test_returns_event_without_some_elements(self):
# The event XML is valid but lacks some elements.
obj_xml = """<?xml version="1.0"?>
<premis:event xmlns:premis="info:lc/xmlns/premis-v2">
<premis:eventIdentifier>
<premis:eventIdentifierType>http://purl.org/net/untl/vocabularies/identifier-qualifiers/#UUID</premis:eventIdentifierType>
<premis:eventIdentifierValue>1a81d172ce8f465fbcb52d146485f882</premis:eventIdentifierValue>
</premis:eventIdentifier>
<premis:eventType>http://purl.org/net/untl/vocabularies/preservationEvents/#fixityCheck</premis:eventType>
<premis:eventDateTime>2017-05-13T09:14:55-05:00</premis:eventDateTime>
</premis:event>
"""
tree = etree.fromstring(obj_xml)
event = presentation.premisEventXMLToObject(tree)
assert isinstance(event, models.Event)

def test_sets_event_type(self, event_xml):
tree = etree.fromstring(event_xml.obj_xml)
event = presentation.premisEventXMLToObject(tree)
Expand Down Expand Up @@ -624,104 +640,3 @@ def test_validate_agentxml(self, premis_schema):
agent = factories.AgentFactory()
agent_xml = presentation.objectToPremisAgentXML(agent, 'example.com')
premis_schema.assert_(agent_xml)


class TestDoSimpleXMLAssignment:

@pytest.fixture
def record_obj(self):
class Record(object):
value = None
return Record()

def test_attribute_not_set_when_element_value_is_none(self, record_obj):
tree = etree.fromstring(
"""<root>
<element/>
</root>
"""
)

chain = ['element']

record_obj.value = 10
presentation.doSimpleXMLAssignment(record_obj, 'd', tree, chain)
assert record_obj.value == 10

def test_without_nested_elements(self, record_obj):
tree = etree.fromstring(
"""<root>
<element>1</element>
</root>
"""
)

chain = ['element']

# Since the function mutates the object, we will verify that the
# attribute is the expected value before the function call.
assert record_obj.value is None
presentation.doSimpleXMLAssignment(record_obj, 'value', tree, chain)
assert record_obj.value == '1'

def test_chain_is_name_of_element(self, record_obj):
tree = etree.fromstring(
"""<root>
<element>1</element>
</root>
"""
)

chain = 'element'

assert record_obj.value is None
presentation.doSimpleXMLAssignment(record_obj, 'value', tree, chain)
assert record_obj.value == '1'

def test_with_one_nested_element(self, record_obj):
tree = etree.fromstring(
"""<root>
<element>
<subelement>1</subelement>
</element>
</root>
"""
)

chain = ['element', 'subelement']

assert record_obj.value is None
presentation.doSimpleXMLAssignment(record_obj, 'value', tree, chain)
assert record_obj.value == '1'

def test_with_two_nested_elements(self, record_obj):
tree = etree.fromstring(
"""<root>
<element>
<subelement>
<subsubelement>1</subsubelement>
</subelement>
</element>
</root>
"""
)

chain = ['element', 'subelement', 'subsubelement']

assert record_obj.value is None
presentation.doSimpleXMLAssignment(record_obj, 'value', tree, chain)
assert record_obj.value == '1'

def test_element_text_is_stripped(self, record_obj):
tree = etree.fromstring(
"""<root>
<element> 1 </element>
</root>
"""
)

chain = ['element']

assert record_obj.value is None
presentation.doSimpleXMLAssignment(record_obj, 'value', tree, chain)
assert record_obj.value == '1'

0 comments on commit 2bec5d4

Please sign in to comment.