Changeset 1605 in products


Ignore:
Timestamp:
Jan 29, 2010 2:05:17 PM (14 years ago)
Author:
mylan
Message:

Added ofsimporter section for possibility to import OFS Image and File objects

Location:
quintagroup.transmogrifier/branches/ofs/quintagroup/transmogrifier
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.transmogrifier/branches/ofs/quintagroup/transmogrifier/configure.zcml

    r1604 r1605  
    144144        component=".ofsmanager.OFSExporterSection" 
    145145        name="quintagroup.transmogrifier.ofsexporter" 
     146        /> 
     147 
     148    <utility 
     149        component=".ofsmanager.OFSImporterSection" 
     150        name="quintagroup.transmogrifier.ofsimporter" 
    146151        /> 
    147152 
  • quintagroup.transmogrifier/branches/ofs/quintagroup/transmogrifier/export.cfg

    r1568 r1605  
    44    manifestexporter 
    55    fileexporter 
     6     
    67    marshaller 
    78    propertiesexporter 
     
    1415[sitewalker] 
    1516blueprint = quintagroup.transmogrifier.sitewalker 
     17condition = python:hasattr(context,'getPortalTypeName') or context.meta_type in ['Image','File'] 
    1618 
    1719[manifestexporter] 
     
    2022[fileexporter] 
    2123blueprint = quintagroup.transmogrifier.fileexporter 
     24 
     25[ofsexporter] 
     26blueprint = quintagroup.transmogrifier.ofsexporter 
    2227 
    2328[marshaller] 
  • quintagroup.transmogrifier/branches/ofs/quintagroup/transmogrifier/import.cfg

    r1604 r1605  
    77    fileimporter 
    88    demarshaller 
     9    ofsimporter 
    910    referencesimporter 
    1011    propertiesimporter 
     
    3031[constructor] 
    3132blueprint = quintagroup.transmogrifier.extendedconstructor 
     33meta-types =  
     34    Image 
     35    File 
    3236 
    3337[datacorrector] 
     
    4246[demarshaller] 
    4347blueprint = quintagroup.transmogrifier.demarshaller 
     48 
     49[ofsimporter] 
     50blueprint = quintagroup.transmogrifier.ofsimporter 
    4451 
    4552[referencesimporter] 
  • quintagroup.transmogrifier/branches/ofs/quintagroup/transmogrifier/ofsmanager.py

    r1602 r1605  
    4949                    fields['height'] = getattr(obj, 'height', 0) 
    5050 
     51                if not self.condition(item, context=obj, 
     52                                      fprop_info=fields): 
     53                    continue 
     54 
    5155                files['file-properties'] = { 
    5256                    'name': '.file-properties.xml', 
     
    96100        return data 
    97101 
     102 
     103class OFSImporterSection(object): 
     104    classProvides(ISectionBlueprint) 
     105    implements(ISection) 
     106 
     107    def __init__(self, transmogrifier, name, options, previous): 
     108        self.previous = previous 
     109        self.context = transmogrifier.context 
     110 
     111        self.pathkey = defaultMatcher(options, 'path-key', name, 'path') 
     112        self.fileskey = defaultMatcher(options, 'files-key', name, 'files') 
     113        self.contextkey = defaultMatcher(options, 'context-key', name, 'import_context') 
     114 
     115        self.condition = Condition(options.get('condition', 'python:True'), 
     116                                   transmogrifier, name, options) 
     117        self.ttt = 0 
     118 
     119    def __iter__(self): 
     120        for item in self.previous: 
     121            pathkey = self.pathkey(*item.keys())[0] 
     122            fileskey = self.fileskey(*item.keys())[0] 
     123 
     124            if not (pathkey and fileskey): 
     125                yield item; continue 
     126            if 'file-properties' not in item[fileskey]: 
     127                yield item; continue 
     128 
     129            path = item[pathkey] 
     130            obj = self.context.unrestrictedTraverse(path, None) 
     131            if obj is None:         # path doesn't exist 
     132                yield item; continue 
     133 
     134            if obj.meta_type in ["File", "Image"]: 
     135                if not self.ttt: 
     136                    self.ttt = 1 
     137                    import pdb;pdb.set_trace() 
     138                try: 
     139                    manifest = item[fileskey]['file-properties']['data'] 
     140                    prop_info = self.parseManifest(manifest) 
     141                    # Update file/image properties 
     142                    if not self.condition(item, context=obj, 
     143                                          fprop_info=prop_info): 
     144                        continue 
     145                    for prop_id, prop_val in prop_info.items(): 
     146                        setattr(obj, prop_id, prop_val) 
     147 
     148                    # Add data for file/image 
     149                    name = prop_info.get('__name__', None) 
     150                    if name is None: 
     151                        continue 
     152                    data = item[fileskey].get(name, None) 
     153                    if data is None: 
     154                        continue 
     155                    obj.data = data['data'] 
     156                     
     157                except Exception, e: 
     158                    print "Exception in ofsimporter section:" 
     159                    print '-'*60 
     160                    traceback.print_exc() 
     161                    print '-'*60 
     162 
     163            yield item 
     164 
     165    def parseManifest(self, manifest): 
     166        doc = minidom.parseString(manifest) 
     167        props = {} 
     168        for prop in doc.getElementsByTagName('prop'): 
     169            prop_id = str(prop.getAttribute('id')) 
     170            if not prop_id: 
     171                continue 
     172            props[prop_id] = str(prop.firstChild.nodeValue.strip()) 
     173 
     174        return props 
Note: See TracChangeset for help on using the changeset viewer.