Skip to content

Commit

Permalink
Fixes for 1.11
Browse files Browse the repository at this point in the history
- Update dropdown option in backlog
- Fix allow-orphaned-key-delete tag
- Drop PREMIS 2 namespace
  • Loading branch information
replaceafill committed Dec 12, 2019
1 parent 4a0a749 commit e169fbe
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 59 deletions.
2 changes: 1 addition & 1 deletion amuser/am_browser_ability.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ def wait_for_dip_in_transfer_backlog(self, dip_uuid):
).send_keys(dip_uuid)
Select(
self.driver.find_element_by_css_selector('select[title="field name"]')
).select_by_visible_text("SIP UUID")
).select_by_visible_text("Transfer UUID")
Select(
self.driver.find_element_by_css_selector('select[title="query type"]')
).select_by_visible_text("Phrase")
Expand Down
35 changes: 17 additions & 18 deletions amuser/am_mets_ability.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,23 @@ def get_premis_events(mets):
dicts.
"""
result = []
for premis_event_el in mets.findall(".//premis3:event", c.METS_NSMAP):
for premis_event_el in mets.findall(".//premis:event", c.METS_NSMAP):
result.append(
{
"event_type": premis_event_el.find(
"premis3:eventType", c.METS_NSMAP
"premis:eventType", c.METS_NSMAP
).text,
"event_detail": premis_event_el.find(
"premis3:eventDetailInformation/premis3:eventDetail",
c.METS_NSMAP,
"premis:eventDetailInformation/premis:eventDetail", c.METS_NSMAP
).text,
"event_outcome": premis_event_el.find(
"premis3:eventOutcomeInformation/premis3:eventOutcome",
"premis:eventOutcomeInformation/premis:eventOutcome",
c.METS_NSMAP,
).text,
"event_outcome_detail_note": premis_event_el.find(
"premis3:eventOutcomeInformation"
"/premis3:eventOutcomeDetail"
"/premis3:eventOutcomeDetailNote",
"premis:eventOutcomeInformation"
"/premis:eventOutcomeDetail"
"/premis:eventOutcomeDetailNote",
c.METS_NSMAP,
).text,
}
Expand Down Expand Up @@ -120,13 +119,13 @@ def assert_empty_dir_documented_identified(mets_doc, empty_dir_rel_path):
assert dmd_sec_el is not None
identifiers = []
for obj_idfr_el in dmd_sec_el.findall(
"mets:mdWrap/" "mets:xmlData/" "premis3:object/" "premis3:objectIdentifier",
"mets:mdWrap/" "mets:xmlData/" "premis:object/" "premis:objectIdentifier",
ns,
):
identifiers.append(
(
obj_idfr_el.find("premis3:objectIdentifierType", ns).text,
obj_idfr_el.find("premis3:objectIdentifierValue", ns).text,
obj_idfr_el.find("premis:objectIdentifierType", ns).text,
obj_idfr_el.find("premis:objectIdentifierValue", ns).text,
)
)
uuid_id = [ival for itype, ival in identifiers if itype == "UUID"][0]
Expand All @@ -153,27 +152,27 @@ def _add_entity_identifiers(entity, doc, ns):
obj_idfr_els = amd_sec_el.findall(
".//mets:mdWrap/"
"mets:xmlData/"
"premis3:object/"
"premis3:objectIdentifier",
"premis:object/"
"premis:objectIdentifier",
ns,
)
for obj_idfr_el in obj_idfr_els:
identifiers.append(
(
obj_idfr_el.find("premis3:objectIdentifierType", ns).text,
obj_idfr_el.find("premis3:objectIdentifierValue", ns).text,
obj_idfr_el.find("premis:objectIdentifierType", ns).text,
obj_idfr_el.find("premis:objectIdentifierValue", ns).text,
)
)
else:
dmd_sec_el = doc.xpath("mets:dmdSec[@ID='{}']".format(e_id), namespaces=ns)[0]
for obj_idfr_el in dmd_sec_el.findall(
"mets:mdWrap/" "mets:xmlData/" "premis3:object/" "premis3:objectIdentifier",
"mets:mdWrap/" "mets:xmlData/" "premis:object/" "premis:objectIdentifier",
ns,
):
identifiers.append(
(
obj_idfr_el.find("premis3:objectIdentifierType", ns).text,
obj_idfr_el.find("premis3:objectIdentifierValue", ns).text,
obj_idfr_el.find("premis:objectIdentifierType", ns).text,
obj_idfr_el.find("premis:objectIdentifierValue", ns).text,
)
)
entity["identifiers"] = identifiers
Expand Down
3 changes: 1 addition & 2 deletions amuser/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,7 @@ def varvn(varname, vn):
# Namespace map for parsing METS XML.
METS_NSMAP = {
"mets": "http://www.loc.gov/METS/",
"premis": "info:lc/xmlns/premis-v2",
"premis3": "http://www.loc.gov/premis/v3",
"premis": "http://www.loc.gov/premis/v3",
"dc": "http://purl.org/dc/elements/1.1/",
"dcterms": "http://purl.org/dc/terms/",
"xlink": "http://www.w3.org/1999/xlink",
Expand Down
72 changes: 42 additions & 30 deletions features/steps/aip_encryption_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ def step_impl(context):
" attributes"
" Purpose: AIP Storage;"
" Relative path: var/archivematica/sharedDirectory/www/AIPsStoreEncrypted;"
" Description: Store AIP Encrypted in standard Archivematica Directory;"
" Description: {};".format(
utils.get_gpg_space_location_description(context.scenario.space_uuid)
)
)


Expand Down Expand Up @@ -149,15 +151,19 @@ def step_impl(context):
)
context.scenario.new_key_name = new_key_name
context.scenario.new_key_fingerprint = new_key_fingerprint
# Edit the "standard GPG-encrypted space" to use the new GPG key
standard_encr_space_uuid = context.am_user.browser.search_for_ss_space(
{
"Access protocol": "GPG encryption on Local Filesystem",
"Path": "/",
"Staging path": "/var/archivematica/storage_service/storage_service_encrypted",
"GnuPG Private Key": "Archivematica Storage Service GPG Key",
}
)["uuid"]
if getattr(context.scenario, "space_uuid", None) is not None:
# Don't look for a space if previos steps saved it
standard_encr_space_uuid = context.scenario.space_uuid
else:
# Edit the "standard GPG-encrypted space" to use the new GPG key
standard_encr_space_uuid = context.am_user.browser.search_for_ss_space(
{
"Access protocol": "GPG encryption on Local Filesystem",
"Path": "/",
"Staging path": "/var/archivematica/storage_service/storage_service_encrypted",
"GnuPG Private Key": "Archivematica Storage Service GPG Key",
}
)["uuid"]
new_key_repr = "{} <{}>".format(new_key_name, new_key_email)
logger.info('Created a new GPG key "%s"', new_key_repr)
context.am_user.browser.change_encrypted_space_key(
Expand All @@ -170,7 +176,9 @@ def step_impl(context):
)
def step_impl(context):
context.execute_steps(
'Given the processing config decision "Store AIP location" is set to "Store AIP Encrypted in standard Archivematica Directory"\n'
'Given the processing config decision "Store AIP location" is set to "{}"\n'.format(
utils.get_gpg_space_location_description(context.scenario.space_uuid)
)
)


Expand Down Expand Up @@ -207,15 +215,19 @@ def step_impl(context):
"""Edit the standard GPG-encrypted space so that it is using a GPG key
other than the one stored in ``context.scenario.new_key_name``.
"""
# Edit the "standard GPG-encrypted space" to use the new GPG key
standard_encr_space_uuid = context.am_user.browser.search_for_ss_space(
{
"Access protocol": "GPG encryption on Local Filesystem",
"Path": "/",
"Staging path": "/var/archivematica/storage_service/storage_service_encrypted",
"GnuPG Private Key": context.scenario.new_key_name,
}
)["uuid"]
if getattr(context.scenario, "space_uuid", None) is not None:
# Don't look for a space if previos steps saved it
standard_encr_space_uuid = context.scenario.space_uuid
else:
# Edit the "standard GPG-encrypted space" to use the new GPG key
standard_encr_space_uuid = context.am_user.browser.search_for_ss_space(
{
"Access protocol": "GPG encryption on Local Filesystem",
"Path": "/",
"Staging path": "/var/archivematica/storage_service/storage_service_encrypted",
"GnuPG Private Key": context.scenario.new_key_name,
}
)["uuid"]
context.am_user.browser.change_encrypted_space_key(standard_encr_space_uuid)


Expand Down Expand Up @@ -346,7 +358,7 @@ def step_impl(context):
'.//mets:mdWrap[@MDTYPE="PREMIS:EVENT"]', context.am_user.mets.mets_nsmap
):
premis_event_type_el = premis_event_el.find(
"mets:xmlData/premis3:event/premis3:eventType",
"mets:xmlData/premis:event/premis:eventType",
context.am_user.mets.mets_nsmap,
)
if premis_event_type_el.text.strip() == "encryption":
Expand All @@ -356,13 +368,13 @@ def step_impl(context):
# <premis:eventDetail>program=gpg (GPG); version=1.4.16; python-gnupg;
# version=0.4.0</premis:eventDetail>
premis_event_detail = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventDetailInformation/premis3:eventDetail",
"mets:xmlData/premis:event/premis:eventDetailInformation/premis:eventDetail",
context.am_user.mets.mets_nsmap,
).text
assert "GPG" in premis_event_detail
assert "version=" in premis_event_detail
premis_event_od_note = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcomeDetail/premis3:eventOutcomeDetailNote",
"mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcomeDetail/premis:eventOutcomeDetailNote",
context.am_user.mets.mets_nsmap,
).text.strip()
assert 'Status="encryption ok"' in premis_event_od_note
Expand Down Expand Up @@ -590,37 +602,37 @@ def assert_pointer_premis_event(**kwargs):
kwargs["context"].am_user.mets.mets_nsmap,
):
premis_event_type_el = premis_event_el.find(
"mets:xmlData/premis3:event/premis3:eventType",
"mets:xmlData/premis:event/premis:eventType",
kwargs["context"].am_user.mets.mets_nsmap,
)
if premis_event_type_el.text.strip() == kwargs["event_type"]:
premis_event = premis_event_el
break
assert premis_event is not None
premis_event_uuid = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventIdentifier/premis3:eventIdentifierValue",
"mets:xmlData/premis:event/premis:eventIdentifier/premis:eventIdentifierValue",
kwargs["context"].am_user.mets.mets_nsmap,
).text.strip()
if kwargs.get("in_evt_dtl"):
in_evt_dtl = kwargs["in_evt_dtl"] or []
premis_event_detail = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventDetailInformation/premis3:eventDetail",
"mets:xmlData/premis:event/premis:eventDetailInformation/premis:eventDetail",
kwargs["context"].am_user.mets.mets_nsmap,
).text.strip()
for substr in in_evt_dtl:
assert substr in premis_event_detail
if kwargs.get("in_evt_out"):
in_evt_out = kwargs["in_evt_out"] or []
premis_event_out = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcome",
"mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcome",
kwargs["context"].am_user.mets.mets_nsmap,
).text.strip()
for substr in in_evt_out:
assert substr in premis_event_out
if kwargs.get("in_evt_out_dtl_nt"):
in_evt_out_dtl_nt = kwargs["in_evt_out_dtl_nt"] or []
premis_event_od_note = premis_event.find(
"mets:xmlData/premis3:event/premis3:eventOutcomeInformation/premis3:eventOutcomeDetail/premis3:eventOutcomeDetailNote",
"mets:xmlData/premis:event/premis:eventOutcomeInformation/premis:eventOutcomeDetail/premis:eventOutcomeDetailNote",
kwargs["context"].am_user.mets.mets_nsmap,
).text.strip()
for substr in in_evt_out_dtl_nt:
Expand Down Expand Up @@ -706,14 +718,14 @@ def assert_pointer_transform_file_encryption(pointer_path, ns, fingerprint=None)
"TRANSFORMKEY fingerprint {} does not match expected"
" fingerprint {}".format(transform_key, fingerprint)
)
# premis3:compositionLevel incremented
# premis:compositionLevel incremented
compos_lvl_el = doc.find(
"mets:amdSec/mets:techMD/mets:mdWrap/mets:xmlData/premis:object/premis:objectCharacteristics/premis:compositionLevel",
ns,
)
assert compos_lvl_el is not None
assert compos_lvl_el.text.strip() == "2"
# premis3:inhibitors added
# premis:inhibitors added
inhibitors_el = doc.find(
"mets:amdSec/mets:techMD/mets:mdWrap/mets:xmlData/premis:object/premis:objectCharacteristics/premis:inhibitors",
ns,
Expand Down
12 changes: 6 additions & 6 deletions features/steps/black_box_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,9 @@ def step_impl(context):
'mets:amdSec[@ID="{}"]'.format(amdsec_id), namespaces=context.mets_nsmap
)
object_uuid = amdsec.xpath(
"mets:techMD/mets:mdWrap/mets:xmlData/premis3:object/"
'premis3:objectIdentifier/premis3:objectIdentifierType[text()="UUID"]/'
"../premis3:objectIdentifierValue",
"mets:techMD/mets:mdWrap/mets:xmlData/premis:object/"
'premis:objectIdentifier/premis:objectIdentifierType[text()="UUID"]/'
"../premis:objectIdentifierValue",
namespaces=context.mets_nsmap,
)[0].text
assert object_uuid == file_uuid
Expand Down Expand Up @@ -263,7 +263,7 @@ def step_impl(context):
tree = etree.parse(context.current_transfer["aip_mets_location"])
premis_events = tree.findall(
'mets:amdSec/mets:digiprovMD/mets:mdWrap[@MDTYPE="PREMIS:EVENT"]/'
"mets:xmlData/premis3:event",
"mets:xmlData/premis:event",
namespaces=context.mets_nsmap,
)
error = "The {} file does not contain any PREMIS events".format(
Expand All @@ -272,12 +272,12 @@ def step_impl(context):
assert premis_events, error
for event in premis_events:
event_agents = event.findall(
"premis3:linkingAgentIdentifier", namespaces=context.mets_nsmap
"premis:linkingAgentIdentifier", namespaces=context.mets_nsmap
)
event_agent_types = set(
[
event_agent.findtext(
"premis3:linkingAgentIdentifierType", namespaces=context.mets_nsmap
"premis:linkingAgentIdentifierType", namespaces=context.mets_nsmap
)
for event_agent in event_agents
]
Expand Down
6 changes: 6 additions & 0 deletions features/steps/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -869,3 +869,9 @@ def assert_source_md_in_bagit_mets(mets_root, mets_nsmap):
assert element_count > 0, "No elements in BagIt transfer metadata: {}".format(
element_count
)


def get_gpg_space_location_description(space_uuid):
return "Store AIP Encrypted in standard Archivematica Directory ({})".format(
space_uuid
)
4 changes: 2 additions & 2 deletions features/steps/uuids_for_directories_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,10 @@ def step_impl(context):
), "Could not find a <mets:dmdSec> for directory at {}".format(dirpath)
try:
id_type = dmdSec_el.find(
".//premis3:objectIdentifierType", ns
".//premis:objectIdentifierType", ns
).text.strip()
id_val = dmdSec_el.find(
".//premis3:objectIdentifierValue", ns
".//premis:objectIdentifierValue", ns
).text.strip()
except AttributeError:
logger.info(ns)
Expand Down

0 comments on commit e169fbe

Please sign in to comment.