Skip to main content

CSV import/export for Archetypes

Project description

Introduction
============

Allows to export and import AT objects contents and hierarchy.

Changelog
=========

1.0.5
----------------

* fix bug crc32 with large media files
* when you set a CSVHandledTypesSchematas default is automatically preselected for user convenience
Contribution from Jean-Philippe CAMGUILHEM

1.0.4
----------------

* Uninstall problem fix
IMPORTANT NOTE: when migrating from previous versions, you need to uninstall csvreplicata and then reinstall csvreplicata.
Contribution from Jean-Philippe CAMGUILHEM

1.0.3
----------------

* Custom handlers can be now implemented outside the product, and dynamically declared to the csvreplicata tool.
Contribution from Jean-Philippe CAMGUILHEM

1.0.2
----------------

* Initial release. Contributors: Eric BREHAULT / Christophe SAUTHIER

1.0
----------------

* Unreleased

CSV Replicator
==============

Overview
--------
A description of csv replicata here.


Interfaces
----------
import interfaces and classes ::

>>> from zope.interface.verify import verifyClass
>>> from zope.interface import implements
>>> from Products.csvreplicata.handlers.base import CSVdefault
>>> from Products.csvreplicata.handlers.file import CSVFile
>>> from Products.csvreplicata.interfaces import ICSVDefault, ICSVFile

Verify implementation ::

>>> verifyClass(ICSVDefault, CSVdefault)
True
>>> verifyClass(ICSVFile, CSVFile)
True

Default handlers
----------------
Verify the default handlers provided for Archetypes fields::

>>> self.portal.portal_csvreplicatatool.getHandlers()
{'Products.Archetypes.Field.DateTimeField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVDateTime object at ...,
'file': False},
'Products.Archetypes.Field.IntegerField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVInteger object at ...,
'file': False},
'default_handler':
{'handler_class': <Products.csvreplicata.handlers.base.CSVdefault ...,
'file': False},
'Products.Archetypes.Field.FileField':
{'handler_class':
<Products.csvreplicata.handlers.file.CSVFile object ...,
'file': True},
'Products.Archetypes.Field.BooleanField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVBoolean object at ...,
'file': False},
'Products.Archetypes.Field.TextField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVText object at ...,
'file': False},
'Products.Archetypes.Field.LinesField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVLines object at ...,
'file': False},
'Products.Archetypes.Field.ImageField':
{'handler_class':
<Products.csvreplicata.handlers.file.CSVFile object at ...,
'file': True},
'Products.Archetypes.Field.FloatField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVFloat object at ...,
'file': False},
'plone.app.blob.subtypes.file.ExtensionBlobField':
{'handler_class':
<Products.csvreplicata.handlers.file.CSVFile object at ...,
'file': True},
'Products.Archetypes.Field.StringField':
{'handler_class':
<Products.csvreplicata.handlers.base.CSVString object at ...,
'file': False},
'Products.Archetypes.Field.ReferenceField': {'handler_class':
<Products.csvreplicata.handlers.reference.CSVReference object at ...,
'file': False}}


What happened with csvreplicata during import/export if MyField is not in tool's
handlers. replicator.py apllies default_handler on it:

{'default_handler':
{'handler_class': base.CSVdefault(),'file': False}}


Provide a new handler
---------------------
A developper could write his proper widget for a new ATCT based type.
Of course he wants to provide it to the csvreplicata tool.

Then there are two cases:

- his new field can be provided by an existing handler like CSVInt by example.

- he wants to provide a new handler. ::

>>> class MyCSV(CSVdefault) :
... implements(ICSVDefault)
...
... def get(self, obj, field, context=None):
... pass
...
... def set(self, obj, field, value, context=None):
... pass

>>> verifyClass(ICSVDefault, MyCSV)
True

Ok now we could register a new handler to csvrplica tool and the way is the same in both cases.

We have to set a new handler to the tool with the appropriated method. ::

>>> self.portal.portal_csvreplicatatool.setHandler('Myproduct.Field.MyField',
... {'handler_class': MyCSV(), 'file': False})

>>> 'Myproduct.Field.MyField' \
... in self.portal.portal_csvreplicatatool.getHandlers()
True

of course setHandler() permits to edit an existing handler too ! ::

>>> class AnotherMyCSV(MyCSV) :
... pass

>>> self.portal.portal_csvreplicatatool.setHandler('Myproduct.Field.MyField',
... {'handler_class': AnotherMyCSV(), 'file': False})
>>> self.portal.portal_csvreplicatatool.getHandlers()['Myproduct.Field.MyField']
{'handler_class': <AnotherMyCSV object at ..., 'file': False}

now we can aso delete this handler ::

>>> self.portal.portal_csvreplicatatool.delHandler('Myproduct.Field.MyField')
>>> 'Myproduct.Field.MyField' in self.portal.portal_csvreplicatatool.getHandlers()
False


Export / Import
---------------

Export
______
here we export folders and documents ::

>>> import re
>>> self.setRoles(['Manager'])
>>> id=self.folder.invokeFactory('Document', id='doc1', title="Document 1")
>>> id=self.folder.invokeFactory('Document', id='doc2', title="Document 2")
>>> id=self.folder.invokeFactory('Document', id='doc3',
... title="Document 'super' 3")
>>> id=self.folder.invokeFactory('Document', id='doc4', title="Document 4")
>>> id=self.folder.invokeFactory('Folder', id='sub1', title="Sous dossier 1")
>>> id=self.folder.sub1.invokeFactory('Document', id='doc11',
... title="Document 1 du dossier 1")
>>> self.portal.portal_csvreplicatatool.getEncoding()
'UTF-8'
>>> self.portal.portal_csvreplicatatool.getDelimiter()
';'
>>> self.portal.portal_csvreplicatatool.getStringdelimiter()
'"'
>>> self.portal.portal_csvreplicatatool.replicabletypes = \
... {'Document':['default'], 'Folder':['default']}
>>> from Products.csvreplicata.interfaces import Icsvreplicata
>>> replicator = Icsvreplicata(self.folder)
>>> re.sub(';\d{14}',';YYYYMMDDhhmmss',
... replicator.csvexport(exportable_content_types=['Document', 'Folder']))
'"/plone/Members/test_user_1_";YYYYMMDDhhmmss\r\n"parent";"id";"type";"title";"description";"text"\r\n"Parent folder";"Identifier";"Content type";"Title";"label_description";"label_body_text"\r\n"";"doc1";"Document";"Document 1";"";""\r\n"";"doc2";"Document";"Document 2";"";""\r\n"";"doc3";"Document";"Document \'super\' 3";"";""\r\n"";"doc4";"Document";"Document 4";"";""\r\n"parent";"id";"type";"title";"description"\r\n"Parent folder";"Identifier";"Content type";"Title";"label_description"\r\n"";"sub1";"Folder";"Sous dossier 1";""\r\n'
>>> re.sub(';\d{14}',';YYYYMMDDhhmmss',
... replicator.csvexport(depth=2, exportable_content_types=['Document', 'Folder']))
'"/plone/Members/test_user_1_";YYYYMMDDhhmmss\r\n"parent";"id";"type";"title";"description";"text"\r\n"Parent folder";"Identifier";"Content type";"Title";"label_description";"label_body_text"\r\n"";"doc1";"Document";"Document 1";"";""\r\n"";"doc2";"Document";"Document 2";"";""\r\n"";"doc3";"Document";"Document \'super\' 3";"";""\r\n"";"doc4";"Document";"Document 4";"";""\r\n"parent";"id";"type";"title";"description"\r\n"Parent folder";"Identifier";"Content type";"Title";"label_description"\r\n"";"sub1";"Folder";"Sous dossier 1";""\r\n"parent";"id";"type";"title";"description";"text"\r\n"Parent folder";"Identifier";"Content type";"Title";"label_description";"label_body_text"\r\n"sub1";"doc11";"Document";"Document 1 du dossier 1";"";""\r\n'

import
______
see data in tests/test_file.csv ::

>>> import os
>>> from Globals import package_home
>>> from Products.csvreplicata.tests import GLOBALS
>>> path = os.path.join(package_home(GLOBALS), 'test_file.csv')
>>> fd = open(path, 'rb')
>>> replicator.csvimport(fd, datetimeformat='%d/%m/%Y')
(1, 1, DateTime('2050/10/20 12:12:00 GMT+1'), [])
>>> fd.close()
>>> self.folder.doc1.Title()
'Document 1 NEW'
>>> self.folder.doc5
<ATDocument at /plone/Members/test_user_1_/doc5>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Products.csvreplicata-1.0.5.tar.gz (30.1 kB view hashes)

Uploaded Source

Built Distribution

Products.csvreplicata-1.0.5-py2.4.egg (60.4 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page