{ "info": { "author": "Dorneles Trem\u00c3\u00a9a", "author_email": "deo@plonesolutions.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "About\n=====\n\n ``ExternalStorage`` is a storage for Archetypes storing the fields contents\n outside the ZODB. So it works in a fashion like ExternalFile or similar\n products.\n\n\n.. Warning::\n\n ``ExternalStorage`` is not actively maintained anymore. For new Plone\n 3.x sites or higher, please have a look at `plone.app.blob`_.\n\n.. _`plone.app.blob`: http://pypi.python.org/pypi/plone.app.blob\n\n\n.. Note::\n\n ``ExternalStorage`` 0.6 *requires* an Archetypes version *after* 1.3.3-final.\n Older Archetypes versions have critical bugs and won't work with this\n version of ExternalStorage.\n\nUsage\n-----\n\n Simply define one of your field's storages in a schema as ExternalStorage.\n (see ExternalExample in examples/).\n\nExample\n-------\n\n Copy examples/ExternalExample into your Products dir.\n\nDefining Custom Path Policy\n---------------------------\n\n You can provide your own path policy, just write a method on your\n class called 'getExternalPath' (or anything else that you specified\n at 'path_method' when intantiating the storage).\n\n Some common uses include:\n\n 1) Instance relative path to current portal (default):\n path = portal_url.getRelativeContentURL(instance)\n\n 2) Instance absolute path, including portal name and all above\n path = '/'.join(instance.getPhysicalPath())\n\n 3) Flat Instance UID\n path = instance(UID())\n\n 4) Sorted by Portal Type\n path = instance.getTypeInfo().getId() + '/' + instance.getId()\n\n By default, files are stored accordingly policy (1). If class has\n multiple fields, then (1) will be a folder and the files are stored\n inside it, following the field names.\n\n Remember to provide additional code to support multiple fields\n when providing your custom path policy.\n\nArchive\n-------\n\n In some previous versions there was some sort of archive support.\n This was implemented as a copy of the old content in some special\n folder.\n\n It's removed from the current version, but will be readded later.\n\nChangelog\n=========\n\n0.8 - 05/11/2011\n----------------\n\n* Plone 4 compat [davisagli, maurits, SteveM]\n* Package cleanup and release [aclark]\n\nHistorical\n----------\n\n* 2004-2009::\n\n 2009-11-01 Maurits van Rees \n\n * interfaces/externalstorage.py: Removed import that breaks Plone\n 4 and is unused anyway.\n \n 2008-05-04 Steve McMahon \n\n * Fixed example product to import permissions from CMFCore.permissions\n so that tests will run under Plone 3.0. Many tests failing, but\n this doesn't look new (91 tests with 20 failures and 2 errors).\n\n 2007-11-25 Dorneles Trem\u00e9a \n\n * utils.py, config.py, ExternalStorage.py: Removed our half baked\n cleanupFilename method and replaced it with the one from ATContentTypes.\n\n * tests/framework.py, tests/runalltests.py: Removed.\n\n * tests/testAdd.py, tests/testContentType.py, tests/testCut.py,\n tests/testEdit.py, tests/testFilename.py, tests/testImageField.py,\n tests/testRename.py, tests/testArchive.py, tests/testCopy.py,\n tests/testDelete.py, tests/testExternalStorage.py,\n tests/testFunctional.py, tests/testMultiField.py: Removed the old test\n framework infrastructure in favor of the modern './bin/zopectl test'\n approach.\n\n * config.py, tests/testRename.py: Removed the unnecessary IS_PLONE_2_0\n flag, changing tests to use a basic API call (manage_renameObject).\n\n * tests/testRename.py: Renamed some tests and added a new one,\n testOldFolderRemovedFromFileSystem, which currently is failing.\n\n 2007-02-16 Jean-Paul Ladage \n\n * ExternalStorage.py: Use normalizeString from plone_utils to make\n filenames os compatible. (Didn't remove the util.cleanupFilename method\n yet. Also let ES play nicer with image fields by using shutil.rmtree in\n the cleanupField method.\n\n 2006-09-22 Martijn Pieters \n\n * ExternalStorage.py: Extend filesystem path generation to use\n directories when a ImageField with scales is used. Also made detection\n of the image-scale case robuster.\n\n * example/ExternalExample/__init__.py,\n example/ExternalExample/ExternalImage.py: Example type using an\n ImageField.\n\n * tests/ESTestCase.py, tests/testImageField.py, tests/data/sample.png:\n Tests for ImageField cases.\n\n 2006-09-21 Martijn Pieters \n\n * tests/ESTestCase.py: Switched to newstyle transaction savepoints,\n cleaned up test-file loading.\n\n * utils.py: Replaced zLOG with the python logging module\n\n * filewrapper.py, ExternalStorage.py: Added support for ImageFields by\n telling the file wrapper what content class to use based on the field.\n Includes support for scaling images.\n\n 2005-10-25 Dorneles Trem\u00e9a \n\n * filewrapper: Made sure to not break when mimetype is None.\n This should fix the migration from old instances and also WebDAV\n renames.\n\n 2005-10-09 Dorneles Trem\u00e9a \n\n * config.py: Added code to check for CMFPlone version.\n\n * tests/testRename.py: Fixed compatibility with CMFPlone 2.1.\n\n * README, TODO, AUTHORS: Added '.txt' extension.\n\n * version.txt: Bumpped version to 0.7\n\n 2005-06-01 Dorneles Trem\u00e9a \n\n * ExternalStorage.py: Restored compatibility with Archetypes after\n the large-file fixes. An Archetypes version *after* 1.3.3-final is\n now officialy required.\n\n * README: Added note about the new Archetypes version required.\n\n * tests/testAdd.py, tests/testMultiField.py, tests/testFunctional.py,\n tests/testEdit.py, tests/testRename.py: Updated tests to the new\n internal format.\n\n * version.txt: Bumpped version to 0.6\n\n 2005-04-01 Dorneles Trem\u00e9a \n\n * ExternalStorage.py: Added a completely rewrote version supporting\n schemas defining multiple fields with ExternalStorage as storage.\n Removed the archive support for now. Added support to specify the\n filesystem path through a flexible way.\n\n * filewrapper.py: Added a file wrapper class to provide some nice\n features. Thanks to Tiran for the original idea.\n\n * tests/testAdd.py, tests/dummy.py, tests/testCut.py,\n tests/testFunctional.py, tests/ESTestCase.py, tests/testRename.py,\n tests/testCopy.py, tests/testEdit.py: Fixed some tests to the new\n implementation.\n\n * tests/testMultiField.py: Added to test the new multiple fields\n support.\n\n * tests/data/sample.zip: Replaced by another file, different from\n the 'sample (chars).zip' one.\n\n * README: Added note about path policy and archive.\n\n * example/ExternalExample/ComplexSample.py: Added to demonstrate\n the multifield support.\n\n * AUTHORS: Added note about code rewrite.\n\n * TODO: Removed finished items. Added new ones... ;-)\n\n * FileUtils.py: Removed. No more foreign code.\n\n * LICENSE.txt: Added as BSD license.\n\n * version.txt: Bumpped version to 0.5\n\n 2005-03-08 Dorneles Trem\u00e9a \n\n * ExternalStorage.py (__init__, initializeInstance, unset): Fixed\n a bug when an operation of copy/cut/rename is performed on multiple\n files at same time. Thanks to Sam Stainsby.\n\n * tests/testRename.py: Added a second ExternalArticle instance to\n tests, so we can demonstrate the multiple copy/cut/rename bug.\n\n * tests/testAddChars.py, tests/testEditChars.py: Removed. Fixed\n tests and merged the important stuff into testAdd.py and testEdit.py\n files.\n\n 2005-01-18 Nate Aune \n\n * config.py: Added GOOD_CHARS and CHAR_MAPPING constant tables.\n\n * ExternalStorage.py (cleanupFilename): Added a method to map\n illegal chars to allowed ones, so we can avoid ZopeCopyError\n exceptions.\n\n * tests/testAddChars.py, tests/testEditChars.py: Added tests to\n make sure ES supports files with special characters (tests are\n currently failing).\n\n 2005-01-17 Dorneles Trem\u00e9a \n\n * tests/ESTestCase.py, tests/testFunctional.py: Added\n FunctionalTestCase class and tests (currently failing).\n\n * example/ExternalExample/ExternalArticle.py: Renamed 'file' to\n 'stream' to avoid a name clash. Added a 'normal_file' field for\n test propose.\n\n 2005-01-10 Dorneles Trem\u00e9a \n\n * tests/testAdd.py: Added TestMultipleAddFile testsuite.\n\n * tests/ESTestCase.py (_addFileByFileUpload): Changed to use the\n newly added DATAPATH instead of a fixed one.\n\n * ExternalStorage.py (initializeInstance, set): Fixed a bug when\n creating multiple files using ExternalStorage: the last created\n file was created with the content from the previous one.\n\n 2005-01-09 Dorneles Trem\u00e9a \n\n * TODO: Removed the finished 'rename' item.\n\n * tests/testAdd.py: Replaced docstring by comment.\n\n * tests/testEdit.py: Added tests for the file rename process on\n field edit.\n\n * example/ExternalExample/ExternalArticle.py (setFile): Removed\n method, now that rename-on-upload works.\n\n * ExternalStorage.py (initializeInstance): Changed to only create\n the archive when required.\n (set): Made the rename process works when uploading a file with a\n different name.\n (getBasePath, computeFilePath): Fixed to always return a normalized\n path.\n\n 2004-12-08 Dorneles Trem\u00e9a \n\n * ChangeLog, HISTORY: Added a change log file and removed the old\n history one.\n\n * TODO: Updated note about 'rename'. Added an entry for file\n stream iterator tests.\n\n * example/ExternalExample/ExternalArticle.py: Moved primary and\n required from 'body' to 'file' field. Added 'rename' parameter to\n ExternalStorage.\n\n * tests/ESTestCase.py: Changed to use a different path based on\n ENVIRONMENT_VARIABLE, so tests doesn't remove anything by accident.\n\n * tests/testAdd.py, tests/testContentType.py, tests/testCopy.py,\n tests/testCut.py, tests/testDelete.py, tests/testExternalStorage.py,\n tests/testFilename.py, tests/testRename.py: Splitted into different\n modules. Added filename/contenttype/delete test suites.\n\n * ExternalStorage.py: Reorganized code. Fixed the cleanup of\n filesystem garbage when deleting/moving/renaming objects at ZODB.\n Fixed to return the same content that was stored: StringType or File,\n and thus the correct filename/contenttype. Added initial code for the\n 'rename' behavior. Renamed _extstorage_* variables to _es_*.\n\n 2004-11-30 Dorneles Trem\u00e9a \n\n * tests/: ESTestCase.py, testArchive.py, testExternalStorage.py:\n Added multi-field support to tests.\n\n 2004-11-29 Dorneles Trem\u00e9a \n\n * tests/: testExternalStorage.py, ESTestCase.py: Renamed constants\n for better understanding. Added test for the parent folder rename.\n\n 2004-11-26 Dorneles Trem\u00e9a \n\n * TODO: Updated TODO list. Next features comming soon... ;-)\n\n * ExternalStorage.py: Fixed rename process: cleanupField != unset.\n Fixed mimetype/filename support. Standardized variable names.\n Renamed some private methods.\n\n * AUTHORS, Makefile, config.py, version.txt: Added config/makefile.\n Updated version/authors.\n\n * tests/: ESTestCase.py, testExternalStorage.py: Added tests for\n ContentType/Filename. Implemented testTitleChanged.\n\n * tests/testArchive.py: Added stub file for Archive tests.\n\n * FileUtils.py, example/ExternalExample/ExternalArticle.py,\n example/ExternalExample/StreamingFile.py: Cleaned up whitespaces.\n\n * tests/data/sample.zip: Added a ZIP sample file.\n\n * iexternalstorage.py, interfaces/__init__.py,\n interfaces/externalstorage.py: Added interfaces package.\n\n 2004-10-20 Dorneles Trem\u00e9a \n\n * tests/: ESTestCase.py, dummy.py, testExternalStorage.py: Rewrote\n tests. More to come... ;-)\n\n * AUTHORS, ExternalStorage.py, HISTORY, TODO, iexternalstorage.py:\n Cleaned up code.\n\n 2004-10-15 Christian Scholz \n\n * iexternalstorage.py: Changed import of Interface to make it work\n again with recent AT.\n\n 2004-09-05 Christian Scholz \n\n * ExternalStorage.py: Fixed unset() for deleting files.\n\n 2004-08-31 Christian Scholz \n\n * example/ExternalExample/: ExternalArticle.py, StreamingFile.py:\n Example now using FileStream iterator.\n\n * ExternalStorage.py, tests/ESTestCase.py,\n tests/testExternalStorage.py: Copying/moving now working.\n FileStream iterator can be used (see example).\n\n 2004-06-28 Christian Scholz \n\n * tests/ESTestCase.py: No clearance of data anymore right now.\n\n 2004-06-27 Christian Scholz \n\n * ExternalStorage.py: Paths are now stored relative. Tried to make\n it backwards compatible.\n\n * tests/testExternalStorage.py: Tests are also working now ;-)\n\n * tests/: ESTestCase.py, __init__.py, dummy.py, framework.py,\n runalltests.py, testExternalStorage.py, data/test.doc: First try\n on adding tests.\n\n 2004-05-22 Christian Scholz \n\n * example/ExternalExample/ExternalArticle.py: Made docstring for\n setFile() more verbose.\n\n * example/ExternalExample/ExternalArticle.py: Added example for\n automatically renaming the object to the filename of the uploaded\n field.\n\n * ExternalStorage.py: Fixed the \"file data removed after object\n rename\" bug and changed the log level from INFO to DEBUG.\n\n 2004-05-05 Christian Heimes \n\n * ExternalStorage.py: Added disable archive feature.\n\n 2004-04-24 Christian Heimes \n\n * ExternalStorage.py: Changed tab to spaces. Added fixes to the\n set() method.\n\n 2004-04-14 Christian Scholz \n\n * ExternalStorage.py, HISTORY, TODO,\n example/ExternalExample/ExternalArticle.py: viewing of external\n files now actually works:\n\n - content type is stored - content type can be retrieved\n - ExternalExample now has some example methods for retrieving\n the contents of the file.\n\n 2004-03-05 Christian Scholz \n\n * AUTHORS, ExternalStorage.py, FileUtils.py, HISTORY, README, TODO,\n __init__.py, iexternalstorage.py, refresh.txt, version.txt,\n example/ExternalExample/ExternalArticle.py,\n example/ExternalExample/README,\n example/ExternalExample/__init__.py,\n example/ExternalExample/config.py,\n example/ExternalExample/refresh.txt,\n example/ExternalExample/Extensions/Install.py,\n example/ExternalExample/skins/externalexample/article_view.pt:\n Initial import.\n\nOriginal author\n===============\n\n Christian Scholz (cs@comlounge.net, MrTopf @ freenode.net)\n http://comlounge.net\n\nMaintainer / Code Rewrite / Tests / Bug Fix\n-------------------------------------------\n\n Dorneles Trem\u00e9a (deo@plonesolutions.com, deo @ freenode.net)\n http://plonesolutions.com\n\nMaintenance\n-----------\n\n Alex Clark (aclark@aclark.net)\n http://aclark.net", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://plone.org/products/externalstorage", "keywords": "Plone Archetypes ExternalStorage", "license": "Custom", "maintainer": null, "maintainer_email": null, "name": "Products.ExternalStorage", "package_url": "https://pypi.org/project/Products.ExternalStorage/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Products.ExternalStorage/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://plone.org/products/externalstorage" }, "release_url": "https://pypi.org/project/Products.ExternalStorage/0.8.1/", "requires_dist": null, "requires_python": null, "summary": "An add-on Plone product which provides an extra storage for Archetypes.", "version": "0.8.1" }, "last_serial": 322271, "releases": { "0.7": [ { "comment_text": "", "digests": { "md5": "8158f0cc1624c46782a6b61a21657616", "sha256": "d9e4f80d6ba430286d4e6dc68ecf1a8b55ecd89c2296b78ede4f81352c9507c9" }, "downloads": -1, "filename": "Products.ExternalStorage-0.7-py2.4.egg", "has_sig": false, "md5_digest": "8158f0cc1624c46782a6b61a21657616", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 89071, "upload_time": "2008-05-04T18:08:15", "url": "https://files.pythonhosted.org/packages/5a/40/373bd6594fad7f962624dfd590826e3c69fb655832027fdd9279c60ce61a/Products.ExternalStorage-0.7-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "edd67de5c5b2d86717ee92a2a5b8c9d1", "sha256": "a3726289e64be3e7113d1c208efab726e45a8a81eb70d1b202cae9e75600e14e" }, "downloads": -1, "filename": "Products.ExternalStorage-0.7-py2.5.egg", "has_sig": true, "md5_digest": "edd67de5c5b2d86717ee92a2a5b8c9d1", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 88354, "upload_time": "2009-10-31T11:53:22", "url": "https://files.pythonhosted.org/packages/22/6a/2cf1dc605644f3e03f76d99eaea23317042a914a717b081ce56293c2a535/Products.ExternalStorage-0.7-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "33d46631e40352e81a900d8cc5f14fce", "sha256": "3de48484d09725a1a01e853a4e6789c1977a9d9a2725a366510d248d98853a88" }, "downloads": -1, "filename": "Products.ExternalStorage-0.7-py2.6.egg", "has_sig": true, "md5_digest": "33d46631e40352e81a900d8cc5f14fce", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 88323, "upload_time": "2009-10-31T11:58:47", "url": "https://files.pythonhosted.org/packages/d7/16/68e5945e3b3bbbdebb6e6e2971b39177700a487ee2a739fe11dabaa6bf50/Products.ExternalStorage-0.7-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "f123c1bf62c9f0fa317ac71807dbe74c", "sha256": "1c0781190ffd8f421d7d7a5e393e253bf183b4aca730889e1f59879f2585cb83" }, "downloads": -1, "filename": "Products.ExternalStorage-0.7.tar.gz", "has_sig": true, "md5_digest": "f123c1bf62c9f0fa317ac71807dbe74c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34838, "upload_time": "2009-10-31T11:54:51", "url": "https://files.pythonhosted.org/packages/10/4b/0ecfa32b4c6000b77977477113e99882190d5b99aafcc23376608d0f4f38/Products.ExternalStorage-0.7.tar.gz" }, { "comment_text": "", "digests": { "md5": "51a7087ff541a356edb0ede23a7e9044", "sha256": "00c30d31b9ede4597e4535475555b8f3055750fce7845043c894b376c03231ad" }, "downloads": -1, "filename": "Products.ExternalStorage-0.7.zip", "has_sig": true, "md5_digest": "51a7087ff541a356edb0ede23a7e9044", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53906, "upload_time": "2009-10-31T11:58:40", "url": "https://files.pythonhosted.org/packages/9c/28/f399eafdaec113b76543facba2e1a7f678420dd3b3678cd11c5e92e6d5fa/Products.ExternalStorage-0.7.zip" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "f2f7e1b40564bf1487ce0c0cd56f9aa7", "sha256": "7bec156447e9f4d623b6a5a3dcbcbb39d6ad06e6ef98d63d9d8fea9f0fdcbebd" }, "downloads": -1, "filename": "Products.ExternalStorage-0.8.zip", "has_sig": false, "md5_digest": "f2f7e1b40564bf1487ce0c0cd56f9aa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62221, "upload_time": "2011-05-12T05:27:11", "url": "https://files.pythonhosted.org/packages/0c/51/cc9785bcb4b890f68e193bd3044df242eea32312442705d8126fa737a2f1/Products.ExternalStorage-0.8.zip" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "3e6f9c638ef75e791d2a2657127234c5", "sha256": "7321fa48ee779cbf470f8539771519e88401d3c05820e3c39857ded2e51f5b49" }, "downloads": -1, "filename": "Products.ExternalStorage-0.8.1.zip", "has_sig": false, "md5_digest": "3e6f9c638ef75e791d2a2657127234c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62502, "upload_time": "2011-05-13T00:12:26", "url": "https://files.pythonhosted.org/packages/1f/9e/9a61af46aa34d8113716694c1ef41352183ff1056c65fde2072504029aa1/Products.ExternalStorage-0.8.1.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3e6f9c638ef75e791d2a2657127234c5", "sha256": "7321fa48ee779cbf470f8539771519e88401d3c05820e3c39857ded2e51f5b49" }, "downloads": -1, "filename": "Products.ExternalStorage-0.8.1.zip", "has_sig": false, "md5_digest": "3e6f9c638ef75e791d2a2657127234c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62502, "upload_time": "2011-05-13T00:12:26", "url": "https://files.pythonhosted.org/packages/1f/9e/9a61af46aa34d8113716694c1ef41352183ff1056c65fde2072504029aa1/Products.ExternalStorage-0.8.1.zip" } ] }