source: enpraxis.educommons/branches/educommons-imsintegration/enpraxis/educommons/utilities/eduimsccreader.py @ 189

Revision 189, 7.4 KB checked in by jon, 4 years ago (diff)

Changes to allow educommons to import and export IMS content packages

Line 
1from zope.interface import implements
2from collective.imstransport.utilities.interfaces import IIMSManifestReader
3from zope.component import getUtility
4from collective.imstransport.utilities.interfaces import IIMSObjectCreator
5from collective.imstransport.utilities.imscc.imsccreader import IMSCCReader
6from collective.imstransport.utilities.imscc.ccresourcereader import CCResourceReader
7from collective.imstransport.utilities.imscc.ccreader import CCReader
8from collective.imstransport.utilities.packagingio import ZipfileReader
9from collective.imstransport.IMS_exceptions import ManifestError
10import re
11
12
13class eduCCResourceReader(CCResourceReader):
14    """ Customize read custom data method in ResourceReader object """
15
16    def readCustomMetadata(self, node):
17        """ Read custom metadata """
18       
19        ec_namespace = 'http://cosl.usu.edu/xsd/eduCommonsv1.2'
20        metadata = {}
21        reader = self.reader
22
23        objectType_nodes = node.getElementsByTagNameNS(ec_namespace,'objectType')
24        if objectType_nodes:
25            ot = reader.getTextValue(objectType_nodes[0])
26            if ot:
27                if ot not in ['Course', 'FSSFile', 'Document', 'File', 'Image', 'Link']:
28                    raise ManifestError, '"%s" is not a recognized object type.' %ot
29                metadata['type'] = '%s' %ot
30
31        copyright_nodes = node.getElementsByTagNameNS(ec_namespace, 'copyright')
32        if copyright_nodes:
33            cn = reader.getTextValue(copyright_nodes[0])
34            if cn:
35                metadata['rights'] = cn
36
37        license_nodes = node.getElementsByTagNameNS(ec_namespace, 'license')
38        if license_nodes:
39            license_node = license_nodes[0]
40            license = [str(license_node.getAttribute('category'))]
41            licenseName_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseName')
42            if licenseName_nodes:
43                license.append(str(reader.getTextValue(licenseName_nodes[0])))
44            else:
45                license.append('None')
46            licenseUrl_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseUrl')
47            if licenseUrl_nodes:
48                license.append(str(reader.getTextValue(licenseUrl_nodes[0])))
49            else:
50                license.append('None')
51            licenseIconUrl_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseIconUrl')
52            if licenseIconUrl_nodes:
53                license.append(str(reader.getTextValue(licenseIconUrl_nodes[0])))
54            else:
55                license.append('None')
56            metadata['license'] = license
57
58        clearedCopyright_nodes = node.getElementsByTagNameNS(ec_namespace, 'clearedCopyright')
59        if clearedCopyright_nodes:
60            cc = reader.getTextValue(clearedCopyright_nodes[0])
61            if 'true' == cc:
62                metadata['clearedCopyright'] = True
63            else:
64                metadata['clearedCopyright'] = False
65
66        accessibility_nodes = node.getElementsByTagNameNS(ec_namespace, 'accessible')
67        if accessibility_nodes:
68            access = reader.getTextValue(accessibility_nodes[0])
69            if 'true' == access:
70                metadata['accessible'] = True
71            else:
72                metadata['accessible'] = False
73
74        courseId_nodes = node.getElementsByTagNameNS(ec_namespace, 'courseId')
75        if courseId_nodes:
76            cin = reader.getTextValue(courseId_nodes[0])
77            if cin:
78                metadata['courseId'] = cin
79               
80        term_nodes = node.getElementsByTagNameNS(ec_namespace, 'term')
81        if term_nodes:
82            tm = reader.getTextValue(term_nodes[0])
83            if tm:
84                metadata['term'] = tm
85               
86        displayInsEmail_nodes = node.getElementsByTagNameNS(ec_namespace, 'displayInstEmail')
87        if displayInsEmail_nodes:
88            die = reader.getTextValue(displayInsEmail_nodes[0])
89            if 'true' == die:
90                metadata['displayInstEmail'] = True
91            else:
92                metadata['displayInstEmail'] = False
93
94        instrIsPrincipal_nodes = node.getElementsByTagNameNS(ec_namespace, 'instructorAsCreator')
95        if instrIsPrincipal_nodes:
96            iis = reader.getTextValue(instrIsPrincipal_nodes[0])
97            if 'true' == iis:
98                metadata['instructorAsCreator'] = True
99            else:
100                metadata['instructorAsCreator'] = False
101
102        excludeFromNav_nodes = node.getElementsByTagNameNS(ec_namespace,'excludeFromNav')
103        if excludeFromNav_nodes:
104            efn = reader.getTextValue(excludeFromNav_nodes[0])
105            if 'true' == efn:
106                metadata['excludeFromNav'] = True
107            else:
108                metadata['excludeFromNav'] = False
109       
110        homePagePath_nodes = node.getElementsByTagNameNS(ec_namespace,'homePagePath')
111        if homePagePath_nodes:
112            metadata['homePagePath'] = reader.getTextValue(homePagePath_nodes[0])
113
114        return metadata
115
116
117class eduIMSCCReader(IMSCCReader):
118    """ Create objects from IMS manifest. """
119    implements(IIMSManifestReader)
120
121    def readPackage(self, context, input):
122        """ Read the manifest """
123
124        source = ZipfileReader(input)
125        objDict = {}
126
127        if not source:
128             return False, 'Internal error. No source object specified'
129
130        ccreader = CCReader(context, source)
131             
132        manifest = source.readManifest()
133        if not manifest:
134            return False, \
135                   'Manifest', \
136                   'Could not locate manifest file "imsmanifest.xml" in the zip archive.'
137
138        ccreader.parseManifest(manifest)
139        orgdata = ccreader.readOrganizations()
140        resourceids = ccreader.readResources()
141
142        for resourceid in resourceids:
143            ccresourcereader = eduCCResourceReader(ccreader, resourceid, {})           
144            resdata = self.parseResourceMetadata(ccresourcereader, resourceid, context)
145            reshref = ccresourcereader.getHref()
146            files = ccresourcereader.readFiles()
147
148            hashref = ''
149            if files:
150                for file in files:
151                    hashref = '%s%s' %(resourceid, file)
152                    id = self.createIdFromFile(file)
153                    path = self.createPathFromFile(file)
154
155                    if reshref == file or len(files) == 1:
156                        hashref = resourceid
157                        objDict[hashref] = resdata
158                       
159                        if hashref in [org for org in orgdata if org]:
160                            objDict[hashref]['excludeFromNav'] = False
161
162                    self.parseFile(context, file, objDict, hashref, id, path)
163
164        objcreator = getUtility(IIMSObjectCreator)
165        objcreator.createObjects(objDict, context, source)
166        return
167
168
169    def parseResourceMetadata(self, resourcereader, resourceid, context):
170        """ Read the resource metadata """
171           
172        resourcereader.readGeneral()
173        resourcereader.readLifecycle()
174        resourcereader.readMetaMetadata()
175        resourcereader.readTechnical()
176        resourcereader.readRights()
177        customnode = resourcereader.getCustomData('eduCommons', 'http://cosl.usu.edu/xsd/eduCommonsv1.2')
178        if customnode:
179            metadict = resourcereader.readCustomMetadata(customnode)
180            resourcereader.appendCustomData(metadict)
181        return resourcereader.processResourceMetadata()
182       
Note: See TracBrowser for help on using the repository browser.