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.6
----------------
* support vocabulary defined as object method
Contribution from Jim BAACK

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.6.tar.gz (30.2 kB view details)

Uploaded Source

Built Distribution

Products.csvreplicata-1.0.6-py2.4.egg (60.5 kB view details)

Uploaded Source

File details

Details for the file Products.csvreplicata-1.0.6.tar.gz.

File metadata

File hashes

Hashes for Products.csvreplicata-1.0.6.tar.gz
Algorithm Hash digest
SHA256 a842aa92197897c535953a906c59d85dcde0e45f6c04cfda7d9ca5c443ae8e91
MD5 a26da0843b210c1e38fc8022af335a74
BLAKE2b-256 11854ee5462d2db24d1acfea12f496defb374f0a917bd9f718eaf4053b6f773e

See more details on using hashes here.

File details

Details for the file Products.csvreplicata-1.0.6-py2.4.egg.

File metadata

File hashes

Hashes for Products.csvreplicata-1.0.6-py2.4.egg
Algorithm Hash digest
SHA256 0676b34acbda7ce029e0ceac663ef3b667bd7dd94d852055500db0612daf7795
MD5 1f7dda6f5939cdcf04cf34bbf491afb4
BLAKE2b-256 8e6f6585082eedb09c7d814c409388092c0cb81e429cfb59864cd9d6f68446fa

See more details on using hashes here.

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