[Nuxeo-tickets] [Nuxeo Repository] #1840: possible improvement for CPSDocument.createFile

Nuxeo Repository trac at nuxeo.com
Mon Apr 30 14:02:52 CEST 2007


#1840: possible improvement for CPSDocument.createFile
-------------------------------------+--------------------------------------
 Reporter:  jose.jimenez at iavante.es  |       Owner:  madarche 
     Type:  enhancement              |      Status:  new      
 Priority:  P2                       |   Milestone:  CPS 3.4.5
Component:  CPSDocument              |     Version:  TRUNK    
 Severity:  normal                   |    Keywords:           
-------------------------------------+--------------------------------------
 Hello everybody,

 recently i needed to create a new portal type that uploads a zip file, and
 recreates the same file and directories structure.

 In order to do this, i have patched the module CPSDocument.createFile

 I think that it can interest to somebody.

 Here is the code (diff -u):

 --- createFile.py       2007-04-30 13:55:52.000000000 +0200
 +++ createFileNew.py    2007-04-30 13:57:44.000000000 +0200
 @@ -21,7 +21,6 @@
  Create a document (attached file) for each file in the uploaded ZIP,
  with types according to their extensions
  """
 -
  from logging import getLogger

  from Products.CMFCore.utils import getToolByName
 @@ -66,59 +65,68 @@
          logger.info('Bad Zip File')
          return 0
      infolist = zipfile.infolist()
 -    if not check_allowed_content_types:
 -        image_type_allowed = True
 -    else:
 -        image_type_allowed = 'Image' in  allowed_content_types
      # browsing the ZIP file
      for info in infolist:
          path = info.filename
 -        # Skip folders
 +        list = path.split('/')
 +        if list[len(list) - 1] == '':
 +            list = list[0:len(list)-1]
 +
 +        path_filename = list[len(list)-1]
 +
 +        #if is a directory
          if path[-1] == '/':
 -            continue
 -        # Acquiring only the filename (without the directory path)
 -        path_filename = generateFileName(path.split('/')[-1])
 -
 -        mimetype = registry.lookupExtension(path_filename.lower())
 -        if mimetype is not None:
 -            mimetype = mimetype.normalized()
 -        else:
 -            mimetype = 'application/octet-stream'
 -
 -        if mimetype.startswith('image/') and image_type_allowed:
 -            # use the Image portal type or fallback to File if Image is
 not
 -            # allowed
 -            ptype = 'Image'
 -            field_name = 'preview'
 -        else:
 -            ptype = 'File'
 +            ptype = 'Workspace'
              field_name = 'file'
 +            isFolder = True
 +        else:
 +            mimetype =
 registry.lookupExtension(path_filename.lower()).normalized()
 +            isFolder = False
 +
 +        if not isFolder:
 +            if mimetype.startswith('image/'):
 +                ptype = 'Image'
 +                field_name = 'preview'
 +            else:
 +                ptype = 'File'
 +                field_name = 'file'
 +
          if check_allowed_content_types and ptype not in
 allowed_content_types:
              continue
          try:
 +            container = context
 +            if len(list) > 1:
 +                for folder in list[0:len(list) - 1]:
 +                    container = container[folder]
              file_id = context.portal_workflow.invokeFactoryFor(
 -                context, ptype, path_filename)
 +                container, ptype, path_filename)
          except BadRequest:
              logger.info('File %s already exists', path_filename)
              return 0

 -        file_proxy = getattr(context, file_id)
 +        file_proxy = getattr(container, file_id)
          file_doc = file_proxy.getEditableContent()

 -        # create file to attach to document
 -        data = zipfile.read(path)
 -        file_to_attach = File(path_filename, path_filename, data)
 -        if mimetype and file_to_attach.content_type != mimetype:
 -            logger.debug('Fixing mimetype from %s to %s',
 -                         file_to_attach.content_type, mimetype)
 -            file_to_attach.manage_changeProperties(content_type=mimetype)
 -
 -        doc_def = {
 -            'Title': path_filename,
 -            'Description': 'Imported File (original archive: %s)' %
 filename,
 -            field_name: file_to_attach,
 -        }
 -
 +        if not isFolder:
 +            # create file to attach to document
 +            data = zipfile.read(path)
 +            file_to_attach = File(path_filename, path_filename, data)
 +            if mimetype and file_to_attach.content_type != mimetype:
 +                logger.debug('Fixing mimetype from %s to %s',
 +                             file_to_attach.content_type, mimetype)
 +
 file_to_attach.manage_changeProperties(content_type=mimetype)
 +
 +            doc_def = {
 +                'Title': path_filename,
 +                'Description': 'Imported File (original archive: %s)' %
 filename,
 +                field_name: file_to_attach,
 +            }
 +        else:
 +            doc_def = {
 +                'Title': path_filename,
 +                'Description': 'Imported File (original archive: %s)' %
 filename,
 +            }
 +
          file_doc.edit(doc_def, proxy=file_proxy)

      return 1

-- 
Ticket URL: <https://svn.nuxeo.org/trac/pub/ticket/1840>
Nuxeo Repository <http://www.cps-project.org/>
Nuxeo Repository



This list archive provided by Nuxeo, the leaders of open source ECM. Check out the Nuxeo 5 open source, standards-based ECM project.