Show
Ignore:
Timestamp:
06/29/09 15:12:59 (3 years ago)
Author:
jon
Message:

Adding the mit import functionality

Location:
collective.imstransport/trunk/collective/imstransport/utilities
Files:
2 added
3 modified

Legend:

Unmodified
Added
Removed
  • collective.imstransport/trunk/collective/imstransport/utilities/configure.zcml

    r307 r313  
    4343     / -->   
    4444 
    45   <!-- utility 
     45  <utility 
    4646     provides=".interfaces.IIMSManifestReader" 
    4747     factory=".mit.imsmitreader.IMSMITReader" 
    4848     name="MIT Content Package" 
    49      / -- 
     49     / 
    5050 
    5151  <utility 
  • collective.imstransport/trunk/collective/imstransport/utilities/mit/imsmitreader.py

    r197 r313  
    1 from zope.interface import implements 
    2 from collective.imstransport.utilities.interfaces import IIMSObjectCreator 
    3 from zope.component import getUtility 
    41from collective.imstransport.utilities.imsinterchange import IMSReader 
    52from collective.imstransport.utilities.packagingio import ZipfileReader 
    6 from collective.imstransport.utilities.imscp.cpreader import CPReader 
    7 from collective.imstransport.utilities.imscp.cpresourcereader import CPResourceReader 
    8 import re 
    9 from collective.imstransport import IMSTransportMessageFactory as _ 
    10 from collective.imstransport.IMS_exceptions import ManifestError 
    11 from xml.dom import minidom 
    12  
     3from collective.imstransport.utilities.mit.mitreader import MITReader 
     4from zope.component import getUtility 
     5from collective.imstransport.utilities.interfaces import IIMSObjectCreator 
    136 
    147class IMSMITReader(IMSReader): 
    158    """ Create objects from IMS manifest. """ 
    16  
    17     name = _(u'MIT Content Package') 
    18  
    19     XML = 'http://www.w3.org/XML/1998/namespace' 
    20     IMSCP = 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1' 
    21     LOM = 'http://ltsc.ieee.org/xsd/LOM' 
    229 
    2310    def readPackage(self, file, context): 
     
    3017             return False, 'Internal error. No source object specified' 
    3118 
    32         mitcpreader = MITCPReader(context, source) 
    33               
     19        mitreader = MITReader() 
    3420        manifest = source.readManifest() 
    3521        if not manifest: 
    36             return False, \ 
    37                    'Manifest', \ 
    38                    'Could not locate manifest file "imsmanifest.xml" in the zip archive.' 
     22            raise ManifestError, 'Could not locate manifest file "imsmanifest.xml" in the zip archive.' 
    3923 
    40         mitcpreader.parseManifest(manifest) 
    41         orgdata = mitcpreader.readOrganizations() 
    42         resourceids = mitcpreader.readResources() 
     24        try: 
     25            doc = mitreader.parseManifest(manifest) 
     26        except ExpatError, e: 
     27            raise ManifestError, str(e) 
     28        base = mitreader.readManifestBase(doc) 
     29        objDict['package'] = mitreader.readPackageMetadata(doc) 
     30        orgs = mitreader.readOrganizations(doc) 
     31        resources = mitreader.readResources(doc) 
    4332 
    44         for resourceid in resourceids: 
     33        for x in resources: 
     34            resid, restype, reshref = mitreader.readResourceAttributes(x) 
     35            location = mitreader.readLocation(x) 
     36            if location: 
     37                dataxml = source.readFile('%s%s' %(base,location)) 
     38                resdata = mitreader.parseDataFile(dataxml) 
     39                metadata = mitreader.readMetadata(resdata) 
     40            else: 
     41                metadata = {} 
     42            files = mitreader.readFiles(base, x) 
    4543 
    46 #### Change here from CPResource reader to MIT specific. 
    47             mitresourcereader = MITCPResourceReader(mitcpreader, resourceid, "http://ocw.mit.edu/xmlns/LOM")  
     44            if not files and reshref: 
     45                files = ['%s%s' %(base,reshref),] 
     46            for y in files: 
     47                hash = resid + y 
     48                # If there is only one file, or it matches the reshref 
     49                # add the metadata to it if it exists 
     50                if y == reshref or len(files) == 1: 
     51                    objDict[hash] = metadata 
     52                    # If it is listed in the org section 
     53                    if orgs.has_key(resid): 
     54                        numval, navval = orgs[resid] 
     55                        if numval: 
     56                            objDict[hash]['position'] = numval 
     57                            objDict[hash]['excludeFromNav'] = False 
     58                        else: 
     59                            objDict[hash]['excludeFromNav'] = True 
     60                        if navval: 
     61                            # Use 'and' as opposed to 'or' to avoid KeyError 
     62                            if not (objDict[hash].has_key('title') and objDict[hash]['title']): 
     63                                objDict[hash]['title'] = orgs[resid][1] 
     64                    else: 
     65                        objDict[hash]['excludeFromNav'] = True 
     66                    objDict[hash]['type'] = self.determineType(objDict[hash], y) 
     67                    if objDict[hash]['type'] == 'Document': 
     68                        file = source.readFile(y) 
     69                        objDict[hash]['text'] = mitreader.runFilters(file, ['stripchrome']) 
     70                    else: 
     71                        objDict[hash]['file'] =  y 
     72                # If it is just a lowly file 
     73                else: 
     74                    objDict[hash] = {} 
     75                    objDict[hash]['excludeFromNav'] = True 
     76                    objDict[hash]['type'] = self.determineType(objDict[hash], y) 
     77                    if objDict[hash]['type'] == 'Document': 
     78                        file = source.readFile(y) 
     79                        objDict[hash]['text'] = mitreader.runFilters(file, ['stripchrome']) 
     80                    else: 
     81                        objDict[hash]['file'] =  y 
    4882 
    49             datafile = mitresourcereader.getDataFile()             
    50             base = mitcpreader.getBase() 
     83                # Add to all files 
     84                id = self.createIdFromFile(y) 
     85                objDict[hash]['id'] = id 
     86                if not (objDict[hash].has_key('title') and objDict[hash]['title']): 
     87                    objDict[hash]['title'] = id 
     88                objDict[hash]['path'] = self.createPathFromFile(y) 
    5189 
    52             if datafile: 
    53                 metadataxml = source.readFile('%s%s' %(base, datafile)) 
    54                 mitresourcereader.parseMetadataDoc(metadataxml) 
    55                 resdata = self._parseResourceMetadata(mitresourcereader, resourceid) 
    56  
    57             reshref = mitresourcereader.getHref() 
    58             files = mitresourcereader.readFiles() 
    59             hashref = resourceid 
    60              
    61             hashref = '' 
    62             if files: 
    63                 for relfile in files: 
    64                     file = '%s%s' %(base, relfile) 
    65                      
    66                     id = self._createIdFromFile(file) 
    67                     path = self._createPathFromFile(file) 
    68  
    69                     if reshref == file or len(files) == 1: 
    70                         hashref = resourceid 
    71                         objDict[hashref] = resdata 
    72                          
    73                         # Check if item is in organizations section 
    74                         orgs = [org for org in orgdata if org] 
    75                         if hashref in orgs: 
    76                             objDict[hashref]['excludeFromNav'] = False 
    77                             objDict[hashref]['title'] = orgdata[hashref] 
    78                         else: 
    79                             objDict[hashref]['excludeFromNav'] = True 
    80  
    81                     else: 
    82                         hashref = '%s%s' %(resourceid, file) 
    83                         objDict[hashref] = {} 
    84                         objDict[hashref]['excludeFromNav'] = True 
    85  
    86                     self._parseFile(file, objDict, hashref, id, path) 
    87          
    8890        objcreator = getUtility(IIMSObjectCreator) 
    8991        objcreator.createObjects(objDict, context, source) 
    90         return 
    91  
    92  
    93 ADLCP_namespace = "http://www.adlnet.org/xsd/adlcp_rootv1p2" 
    94 IMSCP_namespace = "http://www.imsglobal.org/xsd/imscp_v1p1" 
    95          
    96 class MITCPResourceReader(CPResourceReader): 
    97  
    98  
    99     def __init__(self, reader, id, lom_namespace): 
    100         """ Constructor for MITResourceReader """ 
    101         self.id = id 
    102         self.reader = reader 
    103         self.document = self.reader.document 
    104         self.resource = None 
    105         self.files = [] 
    106         self.resdict = {} 
    107         self.href = '' 
    108         self.datafile = '' 
    109         self.lom_namespace = lom_namespace 
    110  
    111  
    112  
    113         resources = self.document.getElementsByTagName('resources') 
    114         if resources: 
    115             for res in resources[0].getElementsByTagName('resource'): 
    116                 if self.id == res.getAttribute('identifier'): 
    117                     self.resource = res 
    118                     self.href = res.getAttribute('href') 
    119                     break 
    120  
    121         metadata_nodes = self.resource.getElementsByTagName('metadata') 
    122         if metadata_nodes: 
    123             data_file_nodes = metadata_nodes[0].getElementsByTagNameNS(ADLCP_namespace, 'location') 
    124             if data_file_nodes: 
    125                 self.datafile = self.reader.getTextValue(data_file_nodes[0]) 
    126  
    127     def getDataFile(self): 
    128         """ Return the data file """ 
    129         return self.datafile 
    130  
    131     def parseMetadataDoc(self, resxml): 
    132         """ Parse xml data file for mit resources """ 
    133         document = minidom.parseString(resxml) 
    134         lom_nodes = document.getElementsByTagNameNS(self.lom_namespace, 'lom') 
    135         if lom_nodes: 
    136             self.lom_node = lom_nodes[0] 
    137  
    138 class MITCPReader(CPReader): 
    139  
    140     def getBase(self): 
    141         """ Return the base from the manifest element """ 
    142         manifest_nodes = self.document.getElementsByTagName('manifest') 
    143         if manifest_nodes: 
    144             return manifest_nodes[0].getAttribute('xml:base') 
    145         else: 
    146             return None 
    147          
    148  
    149      
    150      
    151  
    152  
    153  
    154  
    155  
  • collective.imstransport/trunk/collective/imstransport/utilities/objcreator.py

    r296 r313  
    2020            else: 
    2121                parent = self.createFolderPath(context, data['path']) 
    22                 if not getattr(parent.aq_inner.aq_explicit, data['id'], None): 
     22                exobj = getattr(parent.aq_inner.aq_explicit, data['id'], None) 
     23                if exobj and exobj.portal_type == data['type']: 
     24                    obj = getattr(parent, data['id']) 
     25                else: 
    2326                    parent.invokeFactory(data['type'], data['id']) 
    24                 obj = getattr(parent, data['id']) 
     27                    obj = getattr(parent, data['id']) 
    2528                if data['type'] == 'Image' or getattr(obj, 'setImage', None): 
    2629                    if data.has_key('file'):