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