-
Notifications
You must be signed in to change notification settings - Fork 0
/
seadl_cModels.py
109 lines (95 loc) · 4 KB
/
seadl_cModels.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import sys, urllib
from islandoraUtils.metadata import fedora_relationships
from utils.commonFedora import *
import pdb
#Get etree from somewhere it should be...
try:
from lxml import etree
print("running with lxml.etree")
except ImportError:
try:
# Python 2.5
import xml.etree.cElementTree as etree
print("running with cElementTree on Python 2.5+")
except ImportError:
try:
# Python 2.5
import xml.etree.ElementTree as etree
print("running with ElementTree on Python 2.5+")
except ImportError:
try:
# normal cElementTree install
import cElementTree as etree
print("running with cElementTree")
except ImportError:
try:
# normal ElementTree install
import elementtree.ElementTree as etree
print("running with ElementTree")
except ImportError:
message = "Failed to import ElementTree from any known place"
print(message)
raise ImportError(message)
HOSTURL = "localhost"
def getPidsForContentModel(contentModel):
if not (contentModel.startswith("<") or contentModel.endswith(">")):
contentModel = "<info:fedora/%s>" % contentModel
# start with the query to pull the desired objects
query_string = "select $object from <#ri> where $object <fedora-model:hasModel> %s" % contentModel
url = urllib.urlopen("http://%s:8080/fedora/risearch?type=tuples&flush=TRUE&format=Sparql&lang=itql&stream=on&query=%s" % (HOSTURL, urllib.quote_plus(query_string)))
# create the xml parser to retrieve the results
parser = etree.XMLParser(remove_blank_text=True)
xmlFile = etree.parse(url, parser)
xmlFileRoot = xmlFile.getroot()
results = []
pids = []
ns = { "results" : "http://www.w3.org/2001/sw/DataAccess/rf1/result" }
xmlPids = xmlFileRoot.xpath("/results:sparql/results:results/results:result/results:object", namespaces=ns)
pids = [p.attrib["uri"] for p in xmlPids]
return pids
def editRelsExt(rels_ext, rels_predicate, newvalue):
# remove this relation
rels_ext.purgeRelationships(predicate=rels_predicate)
# add
rels_ext.addRelationship(predicate=rels_predicate, object=newvalue)
def commitRelsExt(rels_ext):
loop = True
while loop:
loop = False
try:
rels_ext.update()
except FedoraConnectionException, fedoraEXL:
if str(fedoraEXL.body).find("is currently being modified by another thread") != -1:
loop = True
print("Trouble (thread lock) updating obj(%s) RELS-EXT - retrying." % childObject.pid)
else:
print("Error updating obj(%s) RELS-EXT" % childObject.pid)
return False
return True
def main(argv):
fedora = connectToFedora("localhost", "fedoraAdmin", "password")
if not fedora:
print("Failed to connect to fedora instance")
return 1
### SCAN FOR OBJECTS
oldModel = "ilives:pageCModel"
newModel = "islandora:pageCModel"
objects = getPidsForContentModel(oldModel)
print("Found %d objects to update" % len(objects))
for pid in objects:
strippedPid = pid.replace('info:fedora/', '')
print(strippedPid) + " ...",
try:
obj = fedora.getObject(strippedPid)
except FedoraConnectionException, fcx:
print("Failed to connect to object %s" % pid)
continue
nsmap = [ fedora_relationships.rels_namespace('fedora', 'info:fedora/fedora-system:def/relations-external#'),
fedora_relationships.rels_namespace('fedora-model', 'info:fedora/fedora-system:def/model#')
]
rels_ext = fedora_relationships.rels_ext(obj, nsmap, 'fedora')
editRelsExt(rels_ext, ["fedora-model", "hasModel"], newModel)
commitRelsExt(rels_ext)
print("Done")
if __name__ == '__main__':
sys.exit(main(sys.argv))