Zip export for Plone
Project description
Overview
ftw.zipexport provides a generic solution to export data from plone in a zip archive.
A user can export data with the “Export as Zip” action in document listings.
Install
Compatibility
For zipping files with a total size of over 4Gb python 2.7.4 is required.
Step-by-Step
Add ftw.zipexport to your buildout configuration
[instance] eggs = ftw.zipexport
Run buildout
Install ftw.zipexport in portal_setup
Implementation
In a first step we have to collect all data to zip. Use the IZipRepresentation interface for this task.
The get_files function returns a list of tuples. The tuples consist of two values. First a relative path under which the file should show up in the zip. Second the data as eather a file or a stream.
class IZipRepresentation(Interface):
def get_files(path_prefix='', recursive=True, toplevel=True):
By default we support basic data-types like folder and files. More complex data-types require an own adapter for IZipRepresentation.
Feel free to extend one of the predefined adapters: Predefined representations
The data generated by our IZipRepresentation then gets delivered to the ZipGeneration helper class.
class ZipGenerator(object):
def add_file(file_path, file_pointer):
Zipps the file and adds it to the archive.
If large or many files are selected this function might take some time to execute.
def generate():
returns a temp file holding the generated zip
Here is the sample code of the described steps:
from zope.component import getMultiAdapter
from ftw.zipexport.generation import ZipGenerator
from ftw.zipexport.interfaces import IZipRepresentation
ziprepresentation = getMultiAdapter((self.folder, self.request), interface=IZipRepresentation)
with ZipGenerator() as zipgenerator:
for file_path, file_pointer in ziprepresentation.get_files():
zipgenerator.add_file(file_path, file_pointer)
generated_zip_pointer = zipgenerator.generate()
The download is handled in a standard BrowserView which plainly reads from the temp file. For details check out the code: zipexportview.py.
Current supported data-types
IFolderish
IFileContent
IDexterityItem with IPrimaryFieldInfo
Path Normalization
Paths are automatically using Plone’s IFileNameNormalizer. If you want to use a custom normalization, you can pass it to the ZipGenerator:
from ftw.zipexport.generation import ZipGenerator
from Products.CMFPlone.utils import safe_unicode
import re
def normalize_path(path):
path = safe_unicode(path).replace(u'\\', u'/')
return re.sub(ur'[^\w\-.\/]', u'', path)
with ZipGenerator(path_normalizer=normalize_path) as zipgenerator:
...
Pass None to disable normalization completely:
from ftw.zipexport.generation import ZipGenerator
with ZipGenerator(path_normalizer=None) as zipgenerator:
...
Nice to have
Multithreading
Links
Continuous integration: https://jenkins.4teamwork.ch/view/All/search/?q=ftw.zipexport
Copyright
This package is copyright by 4teamwork.
ftw.zipexport is licensed under GNU General Public License, version 2.
Changelog
1.6.5 (2023-09-08)
Exporting selected folders will now preserve the folder structure on the top level. [elioschmutz]
1.6.4 (2019-09-19)
Fix doubled subfolders when a folder with umlaut in the title contains empty subfolders. [phgross]
1.6.3 (2018-04-17)
Allow IFolderish to specify a custom title via a property. [Rotonen]
Drop support for Plone 4.2. [mbaechtold]
1.6.2 (2017-11-29)
Remove wrong allowed check on context for zip selected view. [phgross]
1.6.1 (2017-09-06)
Fix encoding bug when zip filename contains umlauts. [phgross]
1.6.0 (2017-08-17)
Include empty folders by default and add possibility to deactivate this behavior. [elioschmutz]
1.5.0 (2016-12-15)
Drop official support for Python 2.6 [jone]
1.4.0 (2016-12-12)
Add events for the ZIP exports [Rotonen]
1.3.1 (2016-02-09)
Do not fail when exporting AT folders with titles containing umlauts [fRiSi]
Fall back to object.id in case filename is not set. [fRiSi]
1.3.0 (2015-05-05)
Normalize all paths added to the ZIP file. [jone]
Handle path encoding in ZIP. [jone]
Added check if fs has enough space to create the zip file. [lknoepfel]
1.2.2 (2015-03-25)
Fixed a bug in the file export which occurred if the file to be exported did not have a blob but an OFS file. [mbaechtold]
1.2.1 (2014-06-05)
Fixed metadata version in default profile. [lknoepfel]
1.2.0 (2014-05-26)
Added option to select multiple interfaces on which the export is available. [lknoepfel]
Added error message when the content is too big to zip. This happens when the ZIP64 isn’t available and the content is bigger than 4GB. [lknoepfel]
Corrected error message when no zip-exportable content is selected. [lknoepfel]
Deny zipexport on unallowed content. [lknoepfel]
Include default AT image files. [jone]
Added French translation by I. Anthenien. [lknoepfel]
1.1.1 (2013-11-21)
Added handling for files with same filename. [lknoepfel]
Added a separate profile to install an additional zip-export document action. [deif]
1.1.0 (2013-10-14)
Added export limitation. [lknoepfel]
Fix encoding problem with nested folders containing umlauts in the title. [jone]
1.0.0 (2013-09-13)
Initial Development
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file ftw.zipexport-1.6.5.tar.gz
.
File metadata
- Download URL: ftw.zipexport-1.6.5.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.9.16
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5ed9c612b6165bfc34fbcf69c061385b4350bd19cd9f36cf92f40c21193c55f9 |
|
MD5 | 35971b10344e1440e8d1778517953a65 |
|
BLAKE2b-256 | 89e27ecad1a51156febe7c004ce990a2d1e7080b0c0d4a56d5752bb5209916aa |