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

Revision 171, 7.3 KB checked in by jon, 4 years ago (diff)

Providing type information based on ec metadata

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