{ "info": { "author": "Eric BREHAULT", "author_email": "eric.brehault@makina-corpus.org", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Introduction\n============\n\nAllows to export and import AT objects contents and hierarchy.\n\nIt supports also other contents or objects via plugins (ZCA).\nThis part mainly targeted for a developper audiance, so see interfaces.py / adapters.py.\n\n\nWe have plans to integrate the export/import code with transmogrifier_, [ also_ ] but we have no ETA For now.\n\n.. _transmogrifier: http://pypi.python.org/pypi/collective.transmogrifier/\n.. _also: http://pypi.python.org/pypi/plone.app.transmogrifier/\n\n\nRepository: git_\n\n\n.. _git: https://github.com/collective/Products.csvreplicata.git\n\nA Makina Corpus add-on\n-------------------------\n|makinacom|_\n\n* `Planet Makina Corpus `_\n* `Contact us `_\n\n.. |makinacom| image:: http://depot.makina-corpus.org/public/logo.gif\n.. _makinacom: http://www.makina-corpus.com\n\n\nProducts.csvreplicata Installation\n======================================\n\nTo install Products.csvreplicata into the global Python environment (or a workingenv),\nusing a traditional Zope 2 instance, you can do this:\n\n * When you're reading this you have probably already run\n ``easy_install Products.csvreplicata``. Find out how to install setuptools\n (and EasyInstall) here:\n http://peak.telecommunity.com/DevCenter/EasyInstall\n\n * If you are using Zope 2.9 (not 2.10), get `pythonproducts`_ and install it\n via::\n\n python setup.py install --home /path/to/instance\n\n into your Zope instance.\n\n * Create a file called ``Products.csvreplicata-configure.zcml`` in the\n ``/path/to/instance/etc/package-includes`` directory. The file\n should only contain this::\n\n \n\n.. _pythonproducts: http://plone.org/products/pythonproducts\n\n\nAlternatively, if you are using zc.buildout and the plone.recipe.zope2instance\nrecipe to manage your project, you can do this:\n\n * Add ``Products.csvreplicata`` to the list of eggs to install, e.g.\n\n::\n\n [buildout]\n ...\n eggs =\n ...\n Products.csvreplicata\n\n * Tell the plone.recipe.zope2instance recipe to install a ZCML slug\n\n::\n\n [instance]\n recipe = plone.recipe.zope2instance\n ...\n zcml =\n Products.csvreplicata\n\n * Re-run buildout, e.g. with:\n\n $ ./bin/buildout\n\nYou can skip the ZCML slug if you are going to explicitly include the package\nfrom another package's configure.zcml file.\n\n\nBecause its top level Python namespace package is called ``Products``, this\npackage can also be installed in Zope 2 as an old style **Zope 2 Product**.\n\nFor that, move (or symlink) the ``csvreplicata`` folder of this project\n(``Products.csvreplicata/Products/csvreplicata``) into the ``Products`` directory of\nthe Zope instance it has to be installed for, and restart the server.\n\nYou can also skip the ZCML slug if you install this package the **Zope 2\nProduct** way.\n\nDetailled documentation\n=======================\n\n\nInterfaces\n-------------\nimport interfaces and classes ::\n\n >>> from zope.interface.verify import verifyClass\n >>> from zope.interface import implements\n >>> from Products.csvreplicata.handlers.base import CSVdefault\n >>> from Products.csvreplicata.handlers.file import CSVFile\n >>> from Products.csvreplicata.interfaces import ICSVDefault, ICSVFile\n\nVerify implementation ::\n\n >>> verifyClass(ICSVDefault, CSVdefault)\n True\n >>> verifyClass(ICSVFile, CSVFile)\n True\n\n\n\nExport / Import in plain format\n------------------------------------\n\nExport\n+++++++++\nhere we export folders and documents\n::\n\n >>> self.setRoles(['Manager'])\n >>> id=self.folder.invokeFactory('Document' , id='doc1' , title=\"Document 1\")\n >>> id=self.folder.invokeFactory('Document' , id='doc2' , title=\"Document 2\")\n >>> id=self.folder.invokeFactory('News Item' , id='news1' , title=\"news 'super' 3\")\n >>> id=self.folder.invokeFactory('Document' , id='doc4' , title=\"Document 4\")\n >>> id=self.folder.invokeFactory('Folder' , id='sub1' , title=\"mytest\")\n >>> id=self.folder.sub1.invokeFactory('Document' , id='doc11' , title=\"Document 1 du dossier 1\")\n >>> id=self.folder.sub1.invokeFactory('News Item', id='news21' , title=\"news 1 du dossier 1\")\n >>> id=self.folder.sub1.invokeFactory('Document' , id='doc31' , title=\"Document 2 du dossier 1\")\n >>> self.portal.portal_csvreplicatatool.getPlainFormat()\n False\n\n >>> self.portal.portal_csvreplicatatool.getEncoding()\n 'UTF-8'\n >>> self.portal.portal_csvreplicatatool.getDelimiter()\n ';'\n >>> self.portal.portal_csvreplicatatool.getStringdelimiter()\n '\"'\n >>> self.portal.portal_csvreplicatatool.replicabletypes = {'Document': ['default'], 'Folder': ['default'], 'News': ['Default']}\n >>> from Products.csvreplicata.interfaces import Icsvreplicata\n >>> repl = Icsvreplicata(self.folder)\n >>> print repl.csvexport(exportable_content_types=['Document', 'Folder', 'News Item'], depth=0).getvalue()\n \"/plone/Members/test_user_1_\";\"...\"\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";\"label_body_text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"\";\"doc1\";\"Document\";\"Document 1\";\"\";\"\";\"simple_publication_workflow\";\"private\";\"\";\"\"\n \"\";\"doc2\";\"Document\";\"Document 2\";\"\";\"\";\"simple_publication_workflow\";\"private\";\"\";\"\"\n \"parent\";\"id\";\"type\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"\";\"news1\";\"News Item\";\"simple_publication_workflow\";\"private\"\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";\"label_body_text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"\";\"doc4\";\"Document\";\"Document 4\";\"\";\"\";\"simple_publication_workflow\";\"private\"\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_description\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"\";\"sub1\";\"Folder\";\"mytest\";\"\";\"simple_publication_workflow\";\"private\"\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";\"label_body_text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"sub1\";\"doc11\";\"Document\";\"Document 1 du dossier 1\";\"\";\"\";\"simple_publication_workflow\";\"private\"\n \"parent\";\"id\";\"type\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"sub1\";\"news21\";\"News Item\";\"simple_publication_workflow\";\"private\"\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";\"label_body_text\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain\";\"ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state\"\n \"sub1\";\"doc31\";\"Document\";\"Document 2 du dossier 1\";\"\";\"\";\"simple_publication_workflow\";\"private\"\n \n\nThis output is not that good to deal with CSV apis, we will try to export it to a flat structure.\n::\n\n >>> from Products.csvreplicata import replicator\n >>> self.portal.portal_csvreplicatatool.setPlainFormat(True)\n >>> self.portal.portal_csvreplicatatool.getPlainFormat()\n True\n >>> repl = Icsvreplicata(self.folder)\n >>> print Icsvreplicata(self.folder).csvexport(exportable_content_types=['Document', 'Folder', 'News Item'], depth=0).getvalue() # doctest: +ELLIPSIS\n \"startpoint\";\"replicata_export_date\";\"parent\";\"id\";\"type\";\"title\";\"description\";...\n \"Start point\";\"Export Date\";\"Parent folder\";\"Identifier\";\"Content type\";\"Title\";...\n \"/plone/Members/test_user_1_\";\"...\";\"\";\"doc1\";\"Document\";\"Document 1\";...\n \"/plone/Members/test_user_1_\";\"...\";\"\";\"doc2\";\"Document\";\"Document 2\";...\n \"/plone/Members/test_user_1_\";\"...\";\"\";\"news1\";\"News Item\";...\n \"/plone/Members/test_user_1_\";\"...\";\"\";\"doc4\";\"Document\";\"Document 4\";...\n \"/plone/Members/test_user_1_\";\"...\";\"\";\"sub1\";\"Folder\";\"mytest\";...\n \"/plone/Members/test_user_1_\";\"...\";\"sub1\";\"doc11\";\"Document\";\"Document 1 du dossier 1\";...\n \"/plone/Members/test_user_1_\";\"...\";\"sub1\";\"news21\";\"News Item\";...\n \"/plone/Members/test_user_1_\";\"...\";\"sub1\";\"doc31\";\"Document\";\"Document 2 du dossier 1\";...\n \n\nRedo the export but with a plugin that find the title on the object.\n::\n\n >>> from Products.csvreplicata import adapters\n >>> class CustomExporter(adapters.CSVReplicataExportImportPluginAbstract):\n ... def __init__(self, *args, **kwargs):\n ... adapters.CSVReplicataExportImportPluginAbstract.__init__(self, *args, **kwargs)\n ... self.ids.append('title')\n ... def fill_values(self, row, row_ids):\n ... \"\"\".\"\"\"\n ... for id in row_ids:\n ... if id.replace(self.prefix, '') in self.ids:\n ... index = row_ids.index(id)\n ... if index < len(row):\n ... row[index] = self.context.Title()\n ... def set_values(self, row, row_ids):\n ... \"\"\".\"\"\"\n ... print \"plugin.setValue called with %s <-> %s\" % (row, row_ids)\n ...\n >>> provideAdapter(CustomExporter, (interfaces.Icsvreplicata, zope.interface.Interface), interfaces.ICSVReplicataExportImportPlugin, name ='fooplugin' )\n >>> from csv import DictReader\n >>> content = Icsvreplicata(self.folder).csvexport(exportable_content_types=['Document', 'Folder', 'News Item'], depth=None).getvalue()\n >>> items = [item for item in DictReader(StringIO(content), delimiter=\";\", quotechar='\"')]\n >>> keys = items[0].keys();keys.sort()\n\nAs we cant predict order of the keys, doing some magic to order them before testing.\n::\n \n >>> pprint([[(key, item[key]) for key in keys if not 'date' in key]for item in items], width=130) # doctest: +REPORT_NDIFF\n [[('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain',\n 'ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state',\n 'ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title',\n 'ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title'),\n ('description', 'label_...'),\n ('id', 'Identifier'),\n ('parent', 'Parent folder'),\n ('startpoint', 'Start point'),\n ('text', 'label_body_text'),\n ('title', 'Title'),\n ('type', 'Content type')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'Document 1'),\n ('description', ''),\n ('id', 'doc1'),\n ('parent', ''),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'Document 1'),\n ('type', 'Document')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'Document 2'),\n ('description', ''),\n ('id', 'doc2'),\n ('parent', ''),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'Document 2'),\n ('type', 'Document')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', \"news 'super' 3\"),\n ('description', ''),\n ('id', 'news1'),\n ('parent', ''),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', ''),\n ('type', 'News Item')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'Document 4'),\n ('description', ''),\n ('id', 'doc4'),\n ('parent', ''),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'Document 4'),\n ('type', 'Document')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'mytest'),\n ('description', ''),\n ('id', 'sub1'),\n ('parent', ''),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'mytest'),\n ('type', 'Folder')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'Document 1 du dossier 1'),\n ('description', ''),\n ('id', 'doc11'),\n ('parent', 'sub1'),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'Document 1 du dossier 1'),\n ('type', 'Document')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'news 1 du dossier 1'),\n ('description', ''),\n ('id', 'news21'),\n ('parent', 'sub1'),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', ''),\n ('type', 'News Item')],\n [('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_chain', 'simple_publication_workflow'),\n ('ReplicataPlugin_Products_csvreplicata_exportimport_plugins_WorkflowExportImporter_wf_state', 'private'),\n ('ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title', 'Document 2 du dossier 1'),\n ('description', ''),\n ('id', 'doc31'),\n ('parent', 'sub1'),\n ('startpoint', '/plone/Members/test_user_1_'),\n ('text', ''),\n ('title', 'Document 2 du dossier 1'),\n ('type', 'Document')]]\n\n\n\n\nImport\n+++++++++\n\nThen, now that we got a working export, what about importing it\n::\n\n >>> id = self.folder.invokeFactory('Folder' , id='fa' , title=\"tests import\")\n >>> id = self.folder.invokeFactory('Folder' , id='fb' , title=\"tests import\")\n >>> fa = self.folder.fa; fb = self.folder.fb\n\nImport in CSVReplicata plain format, an entry per line without contextual type hinting\n::\n\n >>> CSV = StringIO(\"\"\"\\\n ... \"startpoint\";\"replicata_export_date\";\"parent\";\"id\";\"type\";\"title\";\"description\";\"ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title\";\"text\"\n ... \"Start point\";\"Export Date\";\"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\";\"ReplicataPlugin_Products_csvreplicata_tests_test_doctests_CustomExporter_title\";\"label_body_text\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"\";\"doc1\";\"Document\";\"Document 1\";\"\";\"Document 1\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"\";\"doc2\";\"Document\";\"Document 2\";\"\";\"Document 2\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"\";\"news1\";\"News Item\";\"\";\"\";\"news 'super' 3\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"\";\"doc4\";\"Document\";\"Document 4\";\"\";\"Document 4\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"\";\"sub1\";\"Folder\";\"mytest\";\"\";\"mytest\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"sub1\";\"doc11\";\"Document\";\"Document 1 du dossier 1\";\"\";\"Document 1 du dossier 1\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"sub1\";\"news21\";\"News Item\";\"\";\"\";\"news 1 du dossier 1\";\"\"\n ... \"/plone/Members/test_user_1_\";20090101010101;\"sub1\";\"doc31\";\"Document\";\"Document 2 du dossier 1\";\"\";\"Document 2 du dossier 1\";\"\"\n ... \"\"\")\n >>> print Icsvreplicata(self.folder.fa).csvimport(CSV, datetimeformat='%d%m%Y', delimiter=\";\", stringdelimiter='\"', plain_format=True)\n p...\n (8, 0, ..., [])\n >>> self.folder.fa.objectIds()\n ['doc1', 'doc2', 'news1', 'doc4', 'sub1']\n >>> self.folder.fa.sub1.objectIds()\n ['doc11', 'news21', 'doc31']\n\nImport in CSVReplicata orignal format, an entry per line with contextual type hinting\n:: \n\n >>> CSV = StringIO(\"\"\"\\\n ... \"/plone/Members/test_user_1_\";20100101010101\n ... \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\"\n ... \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\";\"label_body_text\"\n ... \"\";\"doc1\";\"Document\";\"Document 1\";\"\";\"\"\n ... \"\";\"doc2\";\"Document\";\"Document 2\";\"\";\"\"\n ... \"parent\";\"id\";\"type\"\n ... \"Parent folder\";\"Identifier\";\"Content type\"\n ... \"\";\"news1\";\"News Item\"\n ... \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\"\n ... \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\";\"label_body_text\"\n ... \"\";\"doc4\";\"Document\";\"Document 4\";\"\";\"\"\n ... \"parent\";\"id\";\"type\";\"title\";\"description\"\n ... \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\"\n ... \"\";\"sub1\";\"Folder\";\"mytest\";\"\"\n ... \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\"\n ... \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\";\"label_body_text\"\n ... \"sub1\";\"doc11\";\"Document\";\"Document 1 du dossier 1\";\"\";\"\"\n ... \"parent\";\"id\";\"type\"\n ... \"Parent folder\";\"Identifier\";\"Content type\"\n ... \"sub1\";\"news21\";\"News Item\"\n ... \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\"\n ... \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_...\";\"label_body_text\"\n ... \"sub1\";\"doc31\";\"Document\";\"Document 2 du dossier 1\";\"\";\"\"\n ... \"\"\")\n >>> print Icsvreplicata(self.folder.fb).csvimport(CSV, datetimeformat='%d%m%Y', delimiter=\";\", stringdelimiter='\"', plain_format=False)\n p...\n (8, 0, ..., [])\n >>> self.folder.fb.objectIds()\n ['doc1', 'doc2', 'news1', 'doc4', 'sub1']\n >>> self.folder.fb.sub1.objectIds()\n ['doc11', 'news21', 'doc31'] \n\n\n\nDefault handlers\n----------------\n\nVerify the default handlers provided for Archetypes fields::\n\n >>> handlersDict = self.portal.portal_csvreplicatatool.getHandlers()\n >>> handlers = handlersDict.keys();handlers.sort()\n >>> pprint(handlers)\n ['Products.Archetypes.Field.BooleanField',\n 'Products.Archetypes.Field.DateTimeField',\n 'Products.Archetypes.Field.FileField',\n 'Products.Archetypes.Field.FloatField',\n 'Products.Archetypes.Field.ImageField',\n 'Products.Archetypes.Field.IntegerField',\n 'Products.Archetypes.Field.LinesField',\n 'Products.Archetypes.Field.ReferenceField',\n 'Products.Archetypes.Field.StringField',\n 'Products.Archetypes.Field.TextField',\n 'Products.AttachmentField.AttachmentField.AttachmentField',\n 'default_handler',\n ...]\n >>> pprint([(h, handlersDict[h]['handler_class']) for h in handlers], width=130)\n [('Products.Archetypes.Field.BooleanField', ),\n ('Products.Archetypes.Field.DateTimeField', ),\n ('Products.Archetypes.Field.FileField', ),\n ('Products.Archetypes.Field.FloatField', ),\n ('Products.Archetypes.Field.ImageField', ),\n ('Products.Archetypes.Field.IntegerField', ),\n ('Products.Archetypes.Field.LinesField', ),\n ('Products.Archetypes.Field.ReferenceField', ),\n ('Products.Archetypes.Field.StringField', ),\n ('Products.Archetypes.Field.TextField', ),\n ('Products.AttachmentField.AttachmentField.AttachmentField', ),\n ('default_handler', ),\n (...\n\n\nWhat happened with csvreplicata during import/export if MyField is not in tool's\nhandlers. replicator.py apllies default_handler on it::\n\n {'default_handler':\n {'handler_class': base.CSVdefault(),'file': False}}\n\n\n\n\n\nThe replicator exporter/downloader\n------------------------------------\n\nExport in normal mode\n+++++++++++++++++++++++++\nhere we export folders and documents ::\n\n >>> from Products.csvreplicata.browser import manager\n >>> self.portal.portal_csvreplicatatool.replicabletypes = \\\n ... {'Document':['default'], 'Folder':['default'],\n ... 'News Item': ['default'], 'File': ['default'] }\n >>> import re\n >>> self.setRoles(['Manager'])\n >>> id=self.folder.invokeFactory('Document' , id='doc1' , title=\"Document 1\")\n >>> id=self.folder.invokeFactory('Document' , id='doc2' , title=\"Document 2\")\n >>> params = {\"datetimeformat\": '%d/%m/%Y %H:%M:%S',\n ... \"vocabularyvalue\": \"No\",\n ... \"encoding\": \"UTF-8\",\n ... \"delimiter\": \";\",\n ... \"stringdelimiter\": '\"',\n ... \"exportable_content_types\": [\"News Items\", \"Document\", \"Folder\"],\n ... }\n >>> req = make_request('/'.join(self.folder.getPhysicalPath())+'@@csvreplicata', **params)\n >>> repl = manager.ReplicationManager(self.folder, req)\n >>> from Products.csvreplicata import replicator\n >>> print ''.join([a for a in repl.doExport()])\n \"/plone/Members/test_user_1_\";...\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"text\";...\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";...\n \"\";\"doc1\";\"Document\";\"Document 1\";\"\";...\n \"\";\"doc2\";\"Document\";\"Document 2\";\"\";...\n \n\n >>> items = list(req.response._headers.iteritems());items.sort();pprint(items)\n [('content-disposition', ['attachment; filename=export.csv']),\n ('content-length', ['...']),\n ('content-type', ['text/csv;charset=UTF-8'])]\n\n\nExport as zip when there are files out there and we want them\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nNow adding and exporting a file::\n\n >>> params['exportfiles'] = 'Yes'\n >>> params[\"exportable_content_types\"].append('File')\n >>> id=self.folder.invokeFactory('File', id='f1' , title=\"File 1\")\n >>> req = make_request('/'.join(self.folder.getPhysicalPath())+'@@csvreplicata', **params)\n >>> f1 = self.folder.f1\n >>> f1.getFile().data = 'foo'\n >>> f1.setFilename('bar')\n >>> repl = manager.ReplicationManager(self.folder, req)\n >>> from StringIO import StringIO\n >>> import zipfile\n >>> content = StringIO([a for a in repl.doExport()][0])\n >>> zip = zipfile.ZipFile(content)\n >>> print zip.read('export.csv')\n \"/plone/Members/test_user_1_\";...\n \"parent\";\"id\";\"type\";\"title\";\"description\";\"...\n \"Parent folder\";\"Identifier\";\"Content type\";\"Title\";\"label_summary\";...\n \"\";\"doc1\";\"Document\";\"Document 1\";...\n \"\";\"doc2\";\"Document\";\"Document 2\";...\n \"parent\";\"id\";\"type\";\"title\";\"description\";...\n \"Parent folder\";\"Identifier\";\"Content ...\n \"\";\"f1\";\"File\";\"File 1\";\"\";...\n \n\n\n >>> zip.printdir()\n File Name...\n bar...\n export.csv...\n >>> items = list(req.response._headers.iteritems());items.sort();pprint(items)\n [('content-disposition', ['attachment; filename=export.zip']),\n ('content-length', ['...']),\n ('content-type', ['application/zip'])]\n\n\nThe File Stream Iterator\n+++++++++++++++++++++++++\n\nThis object returns a generator to read our big files!::\n\n >>> from Products.csvreplicata.browser.manager import FileStreamIterator, EphemeralStreamIterator\n >>> import tempfile\n >>> fpath = tempfile.mkstemp('foo')[1]\n >>> fobj = open(fpath, 'w');fobj.write('foo');fobj.close()\n >>> len(FileStreamIterator(fpath))\n 3\n\nWe can play with chunks to divide rendering into small parts ::\n\n >>> [[a for a in FileStreamIterator(fpath, chunk=chunk)] for chunk in [1,2, 3,4]]\n [['f', 'o', 'o'], ['fo', 'o'], ['foo'], ['foo']]\n\n >>> os.unlink(fpath)\n\n\nThe Ephemeral Stream Iterator\n+++++++++++++++++++++++++++++++++\n\n\nThis object returns a generator to read our big files but delete them when they are read!::\n\n >>> from Products.csvreplicata.browser.manager import FileStreamIterator, EphemeralStreamIterator\n >>> import tempfile\n >>> fdir = tempfile.mkdtemp(); fdir2 = tempfile.mkdtemp(dir=fdir);fpath = os.path.join(fdir2, 'foo')\n >>> fobj = open(fpath, 'w');fobj.write('foo');fobj.close()\n\nFiles are there, we can ask to not delete parents (default)::\n\n >>> [os.path.exists(p) for p in fdir,fdir2, fpath]\n [True, True, True]\n >>> len(EphemeralStreamIterator(fpath, delete_parent=False, delete_grand_parent=False))\n 3\n >>> [a for a in EphemeralStreamIterator(fpath, delete_parent=False, delete_grand_parent=False)]\n ['foo']\n >>> [os.path.exists(p) for p in fdir,fdir2, fpath]\n [True, True, False]\n\nWe have read it, the file and the parent are deleted::\n\n >>> fobj = open(fpath, 'w');fobj.write('foo');fobj.close()\n >>> [a for a in EphemeralStreamIterator(fpath, delete_parent=True, delete_grand_parent=True)]\n ['foo']\n >>> [os.path.exists(p) for p in fdir2, fdir, fpath]\n [False, False, False]\n\n\n\nChangelog\n===========\n\n\n1.1.13 (2013-06-04)\n-------------------\n\n- fix release\n\n\n1.1.12 (2013-04-12)\n-------------------\n\n- Support for Products.ATExtensions formattable names field [kiorky]\n- Again, better error traces [kiorky]\n\n\n\n>>>>>>> af6cc49cb43f53f13b1630d7860c198288392dc8\n1.1.11 (2012-12-21)\n-------------------\n\n- fix rst markup\n\n\n1.1.10 (2012-12-21)\n-------------------\n- Better non exportable types [kiorky]\n- better references restore [kiorky]\n<<<<<<< HEAD\n- fixed error (invalid literal for int) [potar]\n- fixed compatibility with SmartFolder [potar]\n=======\n>>>>>>> af6cc49cb43f53f13b1630d7860c198288392dc8\n\n1.1.8 (2012-05-28)\n------------------\n- fix blob files export/import [kiorky]\n- handle years < 999 [kiorky]\n- let commits be more incremental [kiorky]\n- fix export order [kiorky]\n- improve retry policy [kiorky]\n\n\n1.1.7 (2010-08-20)\n---------------------\n- Adding comments exporter/searcher [kiorky]\n\n\n1.1.6 (2010-07-30)\n----------------------\n- Fix importObject (obj referenced before assignment) [danjacka]\n\n1.1.5 (2010-07-29)\n-------------------\n- Fix unittest for plone4 msgid changes [kiorky]\n- Implement import plugins [kiorky]\n- Add a meta.zcml with some basic plugins, like for wf state export/import [kiorky]\n- Rename objects for consistency purpose [kiorky]\n- Fix some Acquisition bugs [kiorky]\n- Support blobstorage [kiorky]\n\n1.1.4 (2010-03-05)\n-------------------\n\n- fix some encoding issues with file handler [kiorky]\n- better plain format import [kiorky]\n- Fix setSubject [kiorky]\n\n1.1.3 (2010-01-27)\n--------------------\n\n- Fixed missing import of interface.implements in browser.manager [fRiSi]\n\n1.1.2 (2010-01-27)\n---------------------\n\n\n- Fix silly empty list bug in replicator.csvimport prototype. [kiorky]\n\n- fixed missing import of interface.implements in browser.manager [fRiSi]\n\n- Fix unicode error with reference fields [kiorky]\n\n- Add support for temporary export path [kiorky]\n\n- Add support for flattened CSV Files [kiorky]\n\n- Add tests, and tests infrastructure [kiorky]\n\n- Add Stream (Files) Iterators not to overhead the RAM [kiorky]\n\n1.1.1 - Unreleased\n-------------------\n\n- remove five:traversable directive (deprecated in plone3) [toutpt]\n\n- Add default config for importcsvStep [toutpt]\n\n- importcsvStep now depend on plone-final step [toutpt]\n\n- option ``ignore_content_errors`` added to import step config (set it to true) and to the replicator methods. It allows to log errors when setting fields instead of raising exceptions and stop. [kiorky]\n\n\n\n1.1 (2009-10-17)\n-----------------\n\n- A new import step to use csvreplicata to import contents [toutpt]\n\n- Fix creationflag issue [toutpt]\n\n- plugins system. Export other things than AT. take a look at interfaces and adpaters [kiorky]\n\n- some encoding bugs fixed [kiorky]\n\n- datetime format settings in the tool [kiorky]\n\n- images/files created with folder structure in export [kiorky]\n\n- Plone 2.5 compatibility back [kiorky]\n\n1.0.7 (2009-07-15)\n--------------------\n\n- Prevent fixTools from running outside of the context of Products.csvreplicata [pigeonflight]\n\n- Fix export when data value is not ascii [yboussard]\n\n1.0.6\n-------\n\n- support vocabulary defined as object method [Jim BAACK]\n\n1.0.5\n-----\n\n- fix bug crc32 with large media files\n- when you set a CSVHandledTypesSchematas default is automatically preselected for user convenience [Jean-Philippe CAMGUILHEM]\n\n1.0.4\n-----\n\n- Uninstall problem fix\n\n IMPORTANT NOTE: when migrating from previous versions, you need to uninstall csvreplicata and then reinstall csvreplicata. [Jean-Philippe CAMGUILHEM]\n\n1.0.3\n-----\n\n- Custom handlers can be now implemented outside the product, and dynamically declared to the csvreplicata tool. [Jean-Philippe CAMGUILHEM]\n\n1.0.2\n-----\n\n- Initial release.[Eric BREHAULT / Christophe SAUTHIER]\n\n1.0\n---\n\n- Unreleased", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://svn.plone.org/svn/collective/Products.csvreplicata", "keywords": "archetypes,import/export,csv,replication,synchronisation", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "Products.csvreplicata", "package_url": "https://pypi.org/project/Products.csvreplicata/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Products.csvreplicata/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://svn.plone.org/svn/collective/Products.csvreplicata" }, "release_url": "https://pypi.org/project/Products.csvreplicata/1.1.13/", "requires_dist": null, "requires_python": null, "summary": "CSV import/export for Archetypes or other contents (via plugins for the later). Created by Makina Corpus.", "version": "1.1.13" }, "last_serial": 751352, "releases": { "1.0.1dev": [ { "comment_text": "", "digests": { "md5": "5c9beae06bf06fb20e77aecc01a3caf7", "sha256": "a9a9faf3df1a2b2283ae05ae93494e8ad1fafdc2d9ace24134d2bb6819b19718" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.1dev.tar.gz", "has_sig": false, "md5_digest": "5c9beae06bf06fb20e77aecc01a3caf7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20525, "upload_time": "2008-08-11T13:03:01", "url": "https://files.pythonhosted.org/packages/28/1c/0a44e270ea7320b593837948585755f1f04c341c4397a81709e7cc05ab81/Products.csvreplicata-1.0.1dev.tar.gz" } ], "1.0.2dev-r46": [ { "comment_text": "", "digests": { "md5": "eb05cd57f82e12191091dfe5fcb2db4e", "sha256": "ed6b470dd34d86719e1a5d23cd28b818755a68e7f0cc5b5d1ab60d41a520b074" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.2dev-r46.tar.gz", "has_sig": false, "md5_digest": "eb05cd57f82e12191091dfe5fcb2db4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25950, "upload_time": "2008-08-11T15:14:51", "url": "https://files.pythonhosted.org/packages/23/e3/b3f0a28c81ba0099ac79acc2d72fc64bae31c9990aaf4d3362c15ce881f2/Products.csvreplicata-1.0.2dev-r46.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "28a3dc9b70970e21f817c2ef14e4c294", "sha256": "4c9c652a721ad95816906e606b4d39bc0c9f5a9a549803e4810b43712533cbfb" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.3-py2.5.egg", "has_sig": false, "md5_digest": "28a3dc9b70970e21f817c2ef14e4c294", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 55532, "upload_time": "2008-10-17T14:15:31", "url": "https://files.pythonhosted.org/packages/5f/36/29dba313f712944cd1dcc930ec29b96b778f8bf61d787185b5ea00f46116/Products.csvreplicata-1.0.3-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "1a82d0c95ebf61b2d9409715b1d7eeeb", "sha256": "73d696fd8515c1099c0e6e5265faeca1349b0577b0a3e6a68cfc2de1bc563758" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.3.tar.gz", "has_sig": false, "md5_digest": "1a82d0c95ebf61b2d9409715b1d7eeeb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27390, "upload_time": "2008-10-17T14:15:29", "url": "https://files.pythonhosted.org/packages/e2/3e/a3cd7336f59977e9176ccd4ecde746b386fd53c31b2f9d4865ff13393685/Products.csvreplicata-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "bda85ff839255e947270d5136d3b70cb", "sha256": "8d62feae981ce6cab55ec87a9a545f2d41518a155d0338b7fd705667bdcdd1be" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.4-py2.4.egg", "has_sig": false, "md5_digest": "bda85ff839255e947270d5136d3b70cb", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 59491, "upload_time": "2008-10-20T13:09:31", "url": "https://files.pythonhosted.org/packages/75/a8/73a379e0c5bb5ea0f4784e4625877d5f3c3ea5b2ee512d9b2e1f95e46eb0/Products.csvreplicata-1.0.4-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "74fc9dd9fd92a15d77592745e48936e5", "sha256": "d83a831e5b4aa05dd95336f462543b359803f661088ddf6f8185ae1237da066f" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.4.tar.gz", "has_sig": false, "md5_digest": "74fc9dd9fd92a15d77592745e48936e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29519, "upload_time": "2008-10-20T13:09:31", "url": "https://files.pythonhosted.org/packages/09/9a/68abfb371ed6fac9d5ca704fba09bd0215f72daec83dfecfd1ac5316ac9d/Products.csvreplicata-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "711c97f69a4fd5dab85ee834926a7fef", "sha256": "abd7353432a161a76485fa6fce87854840b79c4bd030e2dc631c1c77ac5aacc0" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.5-py2.4.egg", "has_sig": false, "md5_digest": "711c97f69a4fd5dab85ee834926a7fef", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 60380, "upload_time": "2008-11-07T16:37:26", "url": "https://files.pythonhosted.org/packages/3c/f0/204a1ceea4609dc42cf2d1c625b033389f6b381e40dfb7c4b48b5e678d92/Products.csvreplicata-1.0.5-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "4db6a778bb4036fe55184b30525597a7", "sha256": "5dc8674067555ef9dbc08d5a0510b8d33f501cbc350266de7d35ff5b1cb47440" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.5.tar.gz", "has_sig": false, "md5_digest": "4db6a778bb4036fe55184b30525597a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30108, "upload_time": "2008-11-07T16:37:25", "url": "https://files.pythonhosted.org/packages/e9/12/863868cf80d438b268aad4e6ee38e90210f58868d3d66733c16049a4a5d4/Products.csvreplicata-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "1f7dda6f5939cdcf04cf34bbf491afb4", "sha256": "0676b34acbda7ce029e0ceac663ef3b667bd7dd94d852055500db0612daf7795" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.6-py2.4.egg", "has_sig": false, "md5_digest": "1f7dda6f5939cdcf04cf34bbf491afb4", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 60509, "upload_time": "2008-11-21T12:41:16", "url": "https://files.pythonhosted.org/packages/8e/6f/6585082eedb09c7d814c409388092c0cb81e429cfb59864cd9d6f68446fa/Products.csvreplicata-1.0.6-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "a26da0843b210c1e38fc8022af335a74", "sha256": "a842aa92197897c535953a906c59d85dcde0e45f6c04cfda7d9ca5c443ae8e91" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.6.tar.gz", "has_sig": false, "md5_digest": "a26da0843b210c1e38fc8022af335a74", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30216, "upload_time": "2008-11-21T12:41:15", "url": "https://files.pythonhosted.org/packages/11/85/4ee5462d2db24d1acfea12f496defb374f0a917bd9f718eaf4053b6f773e/Products.csvreplicata-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "f6a887c3ca16ece88d17eec5b048a581", "sha256": "d2a8cbfda6b018aa8f32300a2e5078880e40c510e8f35bb7f3158c0223a7475d" }, "downloads": -1, "filename": "Products.csvreplicata-1.0.7-py2.4.egg", "has_sig": false, "md5_digest": "f6a887c3ca16ece88d17eec5b048a581", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 61087, "upload_time": "2009-07-15T16:54:31", "url": "https://files.pythonhosted.org/packages/c5/03/cc5bc8403d5a60c83fabc7fab8a2b48c40fdd597b177c5030902219c3d65/Products.csvreplicata-1.0.7-py2.4.egg" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "f9f0d1ff7477dcb1fe7b2820333bc687", "sha256": "f5e3c6fd402301d2841504c8cd0cd767fc0db6a91fd2f1b95c666183e4ebef29" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.tar.gz", "has_sig": false, "md5_digest": "f9f0d1ff7477dcb1fe7b2820333bc687", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37733, "upload_time": "2009-11-17T11:17:29", "url": "https://files.pythonhosted.org/packages/39/56/87429d011c45ceeaa2143dea81e8265799542306f1918dbd909cc48939ff/Products.csvreplicata-1.1.tar.gz" } ], "1.1.10": [ { "comment_text": "", "digests": { "md5": "a12c276f5db3608ddfa9ae66995927f3", "sha256": "5b2a6bd29e023b60df2be7fe3a138531687f66035be4cd670ce2eb5aa93ea9e7" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.10.zip", "has_sig": false, "md5_digest": "a12c276f5db3608ddfa9ae66995927f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 101992, "upload_time": "2012-12-21T13:40:05", "url": "https://files.pythonhosted.org/packages/8d/8d/dafcd9ed6205a5b74644d9737c7dbac194fedacab397d46740ef922ec504/Products.csvreplicata-1.1.10.zip" } ], "1.1.11": [ { "comment_text": "", "digests": { "md5": "1eb931af66b04e4cfa977514fb7f89f7", "sha256": "0c9750174bc2ecb0f8795123ff2fe7a6446512091c767d257da17e2aa09e23fd" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.11.zip", "has_sig": false, "md5_digest": "1eb931af66b04e4cfa977514fb7f89f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 102022, "upload_time": "2012-12-21T13:46:15", "url": "https://files.pythonhosted.org/packages/bc/b6/d1a158657c1166bedfdf99fe6a088f24e446dea704d6f527250aeeef9f81/Products.csvreplicata-1.1.11.zip" } ], "1.1.12": [ { "comment_text": "", "digests": { "md5": "5b62b37c2028a4dda11fc43580fcf78f", "sha256": "40d46a328c850120299723ef3a8efa44d4227a35896210109c25af3dc1d6cab7" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.12.zip", "has_sig": false, "md5_digest": "5b62b37c2028a4dda11fc43580fcf78f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 70072, "upload_time": "2013-04-12T00:15:42", "url": "https://files.pythonhosted.org/packages/0b/93/a0649e5cdc6730d2d459556afe45fd2991c376e1696fa42e534d9d17706c/Products.csvreplicata-1.1.12.zip" } ], "1.1.13": [ { "comment_text": "", "digests": { "md5": "f91400205965ae5eafd1b69267005966", "sha256": "cace21df0d762dd2ea0dc029c1d382982a7b3149fd327e95768d44f48a1ae173" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.13.zip", "has_sig": false, "md5_digest": "f91400205965ae5eafd1b69267005966", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93094, "upload_time": "2013-06-04T21:41:04", "url": "https://files.pythonhosted.org/packages/89/57/2e3216f90c02b0b244859377e58f75b0f29b23357ef26ae26c8837ab1b75/Products.csvreplicata-1.1.13.zip" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "a007760efd19af9c36b71a1a3e18e655", "sha256": "9ac335a0a31a08fe4e6d26e913a2e1c7fb23053309d77ba6ac9c6fc6ae3be437" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.2.zip", "has_sig": false, "md5_digest": "a007760efd19af9c36b71a1a3e18e655", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81656, "upload_time": "2010-01-28T02:30:11", "url": "https://files.pythonhosted.org/packages/22/8c/d00651bbabb7fe28ee4a9bfd800d776c4f83045f5c0366bd0f9d0fe4461d/Products.csvreplicata-1.1.2.zip" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "8dc1bd90655869820e36c89af68a3b54", "sha256": "919ceca19bb23b99bf14024f89d42d95224e073355827e9040805b6b25bf68e7" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.3.zip", "has_sig": false, "md5_digest": "8dc1bd90655869820e36c89af68a3b54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81843, "upload_time": "2010-01-28T12:16:04", "url": "https://files.pythonhosted.org/packages/fa/6f/2b4fd8ba7feb6f93a1d42df581740dd55e8ce41f00f88bc7d743c400f408/Products.csvreplicata-1.1.3.zip" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "f563604abad396de33ab90796a4ed7b0", "sha256": "a49ae9d3e91944c97036e824ced6bb8bbe70fb643aa4b8bec751a77e0e78089f" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.4.zip", "has_sig": false, "md5_digest": "f563604abad396de33ab90796a4ed7b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 83335, "upload_time": "2010-03-03T16:30:32", "url": "https://files.pythonhosted.org/packages/e4/eb/cda9aa2c8003837287cc3ce2be16699fdbac28c1a4def337c63aebf7b9b5/Products.csvreplicata-1.1.4.zip" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "436764b19cea73d8b298f9327f14ec0b", "sha256": "6e7820215e28bbc867cc764e77f862b954d1ee456986689745f9a5216e53609f" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.5.tar.gz", "has_sig": false, "md5_digest": "436764b19cea73d8b298f9327f14ec0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55520, "upload_time": "2010-07-29T15:42:51", "url": "https://files.pythonhosted.org/packages/da/de/de533df42e4184c6090cd0454abacf6ec331fc3b0a6630e1f2ec0cd12f59/Products.csvreplicata-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "49d59c10c243a0c9085c5fd3087b29f7", "sha256": "ac9680ad4c4b817bcef29190366c1188c6cbf49c2797d40b207d3edeb663341a" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.6.tar.gz", "has_sig": false, "md5_digest": "49d59c10c243a0c9085c5fd3087b29f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55666, "upload_time": "2010-07-30T14:44:17", "url": "https://files.pythonhosted.org/packages/ce/c5/531946095d9e96b1c83d8a0e780ea44fc39ca932141fa7da5463ab053955/Products.csvreplicata-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "a7b353193c85124fcb4c8743293e2cd9", "sha256": "82679647515711be9b25c589f93a326dcc7159f2b62732c1214bbe154c78575d" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.7.zip", "has_sig": false, "md5_digest": "a7b353193c85124fcb4c8743293e2cd9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86509, "upload_time": "2010-08-20T14:00:42", "url": "https://files.pythonhosted.org/packages/02/82/6e7bb232f78fb9a91fff7f6cd5f4602c431e36e2fbfe44815119ed2b0ac0/Products.csvreplicata-1.1.7.zip" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "68fbd6c71d6a77746d55b041c6b001e1", "sha256": "a2c82cabcb1e4b2e73edabcd8785ed8abd445b1d6d2680440b576f798f52fe7c" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.8.zip", "has_sig": false, "md5_digest": "68fbd6c71d6a77746d55b041c6b001e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 90851, "upload_time": "2012-05-28T17:17:47", "url": "https://files.pythonhosted.org/packages/0b/45/99d654a117b9a3b5acf9ef6f3519602bc33860fe37a4b0ddb2e9d02e8c83/Products.csvreplicata-1.1.8.zip" } ], "1.1.9": [ { "comment_text": "", "digests": { "md5": "e0148e23575f0472145f9ca3e6796129", "sha256": "db694286515854f018d0d4e447aa9042ca86eb0082580c5e11f459d78f511025" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.9.zip", "has_sig": false, "md5_digest": "e0148e23575f0472145f9ca3e6796129", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 90889, "upload_time": "2012-05-28T17:32:01", "url": "https://files.pythonhosted.org/packages/2e/6b/09c439c9531368c340a063f1ebdbe7517fba021c5e589505913d4daca9a9/Products.csvreplicata-1.1.9.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f91400205965ae5eafd1b69267005966", "sha256": "cace21df0d762dd2ea0dc029c1d382982a7b3149fd327e95768d44f48a1ae173" }, "downloads": -1, "filename": "Products.csvreplicata-1.1.13.zip", "has_sig": false, "md5_digest": "f91400205965ae5eafd1b69267005966", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93094, "upload_time": "2013-06-04T21:41:04", "url": "https://files.pythonhosted.org/packages/89/57/2e3216f90c02b0b244859377e58f75b0f29b23357ef26ae26c8837ab1b75/Products.csvreplicata-1.1.13.zip" } ] }