{ "info": { "author": "Plone Foundation", "author_email": "plone-developers@lists.sourceforge.net", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Plone", "Framework :: Plone :: 5.2", "Intended Audience :: Developers", "Intended Audience :: Other Audience", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7" ], "description": "==============\nplone.app.blob\n==============\n\nOverview\n========\n\nThis package aims to be an add-on for Plone (>= 3.x) integrating ZODB (>=3.8)\nblob support, which allows large binary data to be managed by the ZODB, but\nseparately from your usual ``FileStorage`` database, i.e. ``Data.fs``. This\nhas several advantages, most importantly a much smaller ``Data.fs`` and better\nperformance both cpu- as well as memory-wise.\n\n .. |__| unicode:: U+20 .. space\n\n\nContents\n========\n\n.. contents:: |__|\n\n\nStatus\n======\n\nAt the moment the integration for \"File\" content should be stable, but still\nneeds more field testing. It is being successfully used in several production\ndeployments, though. The provided blob-based content type should safely\nusable as a drop-in replacement for ``ATFile``. As such it has been\nsuccessfully tested against all ``CMFPlone`` and ``ATContentTypes`` tests.\nPlease use the provided ``test-compatibility.sh`` script to run these tests\nfor yourself.\n\nImage support is still in an alpha stadium and not enabled by default. It can\nbe activated by applying the respective profile via the portal setup tool.\n\nMore detailed information about the integration and the current status can be\nfound in the corresponding `Plone enhancement`_ and `Plone 4 PLIP`_ tickets.\n\n .. _`Plone enhancement`: http://dev.plone.org/plone/ticket/6805\n .. _`Plone 4 PLIP`: http://dev.plone.org/plone/ticket/7822\n .. |--| unicode:: U+2013 .. en dash\n .. |---| unicode:: U+2014 .. em dash\n\n\nRequirements\n============\n\nPlone 3.0 or newer is required. The package has been tested with all versions\nfrom 3.0 up to and including 4.0. However, as all versions before 3.0.4\nrequire a workaround described in the `Troubleshooting`_ section below, it is\nrecommended to use `Plone 3.0.4`_ or a more recent version.\n\n .. _`Plone 3.0.4`: http://old.plone.org/products/plone/releases/3.0.4\n\n\nInstallation\n============\n\nThe easiest way to get ZODB blob support in Plone 3 using this package is to\nwork with installations based on `zc.buildout`_. Other types of installations\nshould also be possible, but might turn out to be somewhat tricky |---| please\nsee the `FAQ`_ section below.\n\nTo get started you will simply need to add the package to your \"eggs\" and\n\"zcml\" sections, run buildout, restart your Plone instance and install the\n\"plone.app.blob\" package using the quick-installer or via the \"Add-on\nProducts\" section in \"Site Setup\".\n\n .. _`zc.buildout`: https://pypi.python.org/pypi/zc.buildout/\n\nA sample buildout configuration file, i.e. ``buildout.cfg``, could look like\nthis::\n\n [buildout]\n parts = zope2 instance\n extends = http://dist.plone.org/release/3.3.1/versions.cfg\n find-links =\n http://dist.plone.org/release/3.3.1\n http://dist.plone.org/thirdparty/\n versions = versions\n\n [versions]\n ZODB3 = 3.8.3\n\n [zope2]\n recipe = plone.recipe.zope2install\n url = ${versions:zope2-url}\n\n [instance]\n recipe = plone.recipe.zope2instance\n zope2-location = ${zope2:location}\n blob-storage = var/blobstorage\n user = admin:admin\n eggs =\n Plone\n plone.app.blob\n zcml = plone.app.blob\n\nYou can also use this buildout configuration to create a fresh Plone\ninstallation. To do so you would store it as ``buildout.cfg`` |---| preferably\nin an empty directory, download `bootstrap.py\n`_\ninto the same directory and issue the following commands::\n\n $ python bootstrap.py\n $ ./bin/buildout\n $ ./bin/instance fg\n\nAfter that you create a \"Plone Site\" via the `ZMI`_ as usual and either\nselect the \"plone.app.blob\" extension profile at creation time or again\ninstall the \"plone.app.blob\" package using one of the above mentioned methods.\n\n .. _`ZMI`: http://localhost:8080/manage\n\nA sample ZEO buildout configuration could look like this::\n\n [buildout]\n parts = zope2 zeoserver instance1 instance2\n extends = http://dist.plone.org/release/3.3.1/versions.cfg\n find-links =\n http://dist.plone.org/release/3.3.1\n http://dist.plone.org/thirdparty/\n versions = versions\n\n [versions]\n ZODB3 = 3.8.3\n\n [zope2]\n recipe = plone.recipe.zope2install\n url = ${versions:zope2-url}\n\n [zeoserver]\n recipe = plone.recipe.zope2zeoserver\n zope2-location = ${zope2:location}\n zeo-address = 127.0.0.1:8100\n zeo-var = ${buildout:directory}/var\n blob-storage = ${zeoserver:zeo-var}/blobstorage\n eggs = plone.app.blob\n\n [instance1]\n recipe = plone.recipe.zope2instance\n zope2-location = ${zope2:location}\n zeo-address = ${zeoserver:zeo-address}\n blob-storage = ${zeoserver:blob-storage}\n zeo-client = on\n shared-blob = on\n user = admin:admin\n eggs =\n Plone\n plone.app.blob\n zcml = plone.app.blob\n\n [instance2]\n recipe = plone.recipe.zope2instance\n http-address = 8081\n zope2-location = ${instance1:zope2-location}\n zeo-client = ${instance1:zeo-client}\n zeo-address = ${instance1:zeo-address}\n blob-storage = ${instance1:blob-storage}\n shared-blob = ${instance1:shared-blob}\n user = ${instance1:user}\n eggs = ${instance1:eggs}\n zcml = ${instance1:zcml}\n\nPlease note the configuration options ``blob-storage`` and ``shared-blob``\nspecified in ``[client1]`` and ``[client2]``. To enable blob support on a ZEO\nclient (or standalone instance) you always have to specify a path in the\n``blob-storage`` configuration option. If ``shared-blob`` is set to \"on\", the\nZEO client will assume it can read blob files directly from within the path\nspecified in the ``blob-storage`` option. This path might also refer to a\nnetwork share in case the ZEO client and server are installed on separate\nmachines. However, to stream blob files trough the ZEO connection you will\nhave to set the ``shared-blob`` option to \"off\". The path specified in the\n``blob-storage`` option will be ignored in this situation, but it needs to be\nset nevertheless.\n\nMore detailed instructions on how to set things up as well as some background\ninformation on blobs |---| or in other words the story of an \"early adopter\"\n|---| can be found in `Ken Manheimer's wiki`__. This is a highly useful\nresource and recommended read for people trying to give blobs a spin. Please\nnote however, that most of the recipe changes described in these instructions\nhave already been incorporated in the particular recipes by now.\n\n .. __: http://myriadicity.net/Sundry/PloneBlobs\n\nIn addition, more information on how to use buildout is available in the\n`accompanying README.txt`__ as well as in `Martin's`_ excellent `buildout\ntutorial`_ on `plone.org`_.\n\n .. __: http://svn.plone.org/svn/plone/plone.app.blob/buildouts/plone-3.x/README.txt\n .. _`Martin's`: http://martinaspeli.net/\n .. _`buildout tutorial`: http://docs.plone.org/4/en/old-reference-manuals/buildout/index.html\n .. _`plone.org`: http://plone.org/\n\n\nMigrating existing content\n==========================\n\nIn-place content migration is provided for existing \"File\" and \"Image\"\ncontent. The `Products.contentmigration`_ package is required for this to\nwork. To install this package you will again need to add its name to the\n\"eggs\" and \"zcml\" section of your ``buildout.cfg``, so that it reads like::\n\n [instance]\n ...\n eggs +=\n plone.app.blob\n Products.contentmigration\n zcml +=\n plone.app.blob\n Products.contentmigration\n\nYou can also refer to the above mentioned `sample buildout.cfg`_ for details.\n\n .. _`Products.contentmigration`: https://pypi.python.org/pypi/Products.contentmigration/\n .. _`sample buildout.cfg`: http://svn.plone.org/svn/plone/plone.app.blob/buildouts/plone-3.x/buildout.cfg\n\nIn order to then migrate your existing file content to blobs you can use the\nmigration interfaces provided at ``http:///@@blob-file-migration`` to\nmigrate \"File\" content as well as ``http:///@@blob-image-migration``\nfor \"Image\" content respectively. ```` will need to be replaced with\nthe URL of your \"Plone Site\" object here, of course. The pages will show you\nthe number of available ``ATFile`` or ``ATImage`` instances and then lets you\nconvert these to the provided blob content types by clicking a button.\n\nFor custom AT-based content types that use FileField(s), see\n`example.blobattype`_ for details of how to enable and migrate them to use\nblobs.\n\n .. _`example.blobattype`: https://pypi.python.org/pypi/example.blobattype\n\nPlease refer to the next section if you encounter any errors during migration.\n\n\nTroubleshooting\n===============\n\nThe following are some known issues, that will hopefully be resolved soon\nenough. In the meantime here are the recommended workarounds:\n\n\n**\"AttributeError: 'module' object has no attribute 'VersionBase'\" Exception**\n\n Symptom\n After upgrading your buildout you're getting errors like the following::\n\n Traceback (innermost last):\n ...\n Module App.PersistentExtra, line 57, in locked_in_version\n AttributeError: 'module' object has no attribute 'VersionBase'\n Problem\n Version `1.0b5`_ of ``plone.app.blob`` adds `support for Plone 4`_ as\n well as `Dexterity`_, which is why the version restriction for ZODB had\n to be lifted. However, while Plone 4 will use Zope 2.12 and ZODB 3.9,\n Plone 3.x doesn't work with either of these.\n Solution\n Downgrade ``ZODB3`` to a release from the 3.8 series. You can do this by\n adding a version pin like::\n\n [versions]\n ZODB3 = 3.8.3\n\n to your ``buildout.cfg``.\n\n .. _`1.0b5`: https://pypi.python.org/pypi/plone.app.blob/1.0b5\n .. _`support for Plone 4`: http://dev.plone.org/plone/ticket/7822\n .. _`Dexterity`: https://pypi.python.org/pypi/plone.app.dexterity\n\n\n**\"FileFieldException: Value is not File or String (...)\" Exception**\n\n Symptom\n After upgrading your buildout you're getting an error like the following\n during blob migration::\n\n Traceback (innermost last):\n File \".../basemigrator/walker.py\", line 174, in migrate\n ...\n File \".../Archetypes/Field.py\", line 931, in _process_input\n FileFieldException: Value is not File or String (...)\n Problem\n Your version of ``archetypes.schemaextender`` has been upgraded to `1.1`_\n while running buildout. You either didn't run it in non-newest mode\n (``-N``) or have not pinned down the version of\n ``archetypes.schemaextender``.\n Solution\n Downgrade ``archetypes.schemaextender`` to version 1.0 for the moment.\n You can do this by adding a version pin like::\n\n [versions]\n archetypes.schemaextender = 1.0\n\n to your ``buildout.cfg``. A proper fix to add compatibility to the\n latest version is being worked on.\n\n .. _`1.1`: https://pypi.python.org/pypi/archetypes.schemaextender/1.1\n\n\n**\"AttributeError: 'NoneType' object has no attribute 'getAccessor'\" Exception**\n\n Symptom\n After upgrading from version `1.0b2`_ or earlier you're getting an error\n like the following when trying to view blob-based content::\n\n Traceback (innermost last):\n Module ZPublisher.Publish, line 119, in publish\n ...\n Module Products.ATContentTypes.content.base, line 300, in get_content_type\n AttributeError: 'NoneType' object has no attribute 'getAccessor'\n Problem\n Recent versions have added support for sub-types based on marker\n interfaces and your existing blob-based content hasn't been marked yet.\n Solution\n Upgrade to at least `1.0b4`_, re-install \"plone.app.blob\" via the\n quick-installer and reset all sub-types by accessing the\n ``@@blob-maintenance/resetSubtypes`` view.\n\n .. _`1.0b2`: https://pypi.python.org/pypi/plone.app.blob/1.0b2\n .. _`1.0b4`: https://pypi.python.org/pypi/plone.app.blob/1.0b4\n\n\n**\"Invalid plugin id\" Exception**\n\n Symptom\n When trying to create a \"Plone Site\" you're getting an error like::\n\n Error Type: KeyError\n Error Value: 'Invalid plugin id: credentials_basic_auth'\n Problem\n Your version of ``Products.PluggableAuthService`` is too old |---| you need\n 1.5.2 or newer (please see http://www.zope.org/Collectors/PAS/59 for more\n information about this).\n Solution\n Please use the `provided buildout`_, add the `1.5 branch`_ as an\n `svn:external`_ to the ``products/`` directory of your buildout or\n upgrade to `Plone 3.0.4`_ by re-running buildout.\n\n .. _`provided buildout`: http://svn.plone.org/svn/plone/plone.app.blob/buildouts/plone-3.x\n .. _`1.5 branch`: http://svn.zope.org/Products.PluggableAuthService/branches/1.5/\n .. _`svn:external`: http://svnbook.red-bean.com/en/1.0/ch07s03.html\n\n\n**\"unknown type name: 'blobstorage'\"**\n\n Symptom\n When running buildout you're getting an error like::\n\n Error: unknown type name: 'blobstorage'\n (line 36 in file:///.../parts/instance/etc/zope.conf)\n Problem\n Your version of the `plone.recipe.zope2instance`_ recipe is too old\n |---| you need to have at least version `1.0`_.\n Solution\n Make sure you're running buildout with neither \"``-N``\" nor \"``-o``\" and\n you also don't have::\n\n newest = false\n\n in your ``~/.buildout/default.cfg``. Alternatively, running buildout\n with option \"``-n``\" should update the recipe to the latest version.\n\n .. _`plone.recipe.zope2instance`: https://pypi.python.org/pypi/plone.recipe.zope2instance/\n .. _`1.0`: https://pypi.python.org/pypi/plone.recipe.zope2instance/1.0\n\n\n**missing distribution for required \"zdaemon\" and \"ZConfig\" eggs**\n\n Symptom\n When running buildout you're getting errors like::\n\n Getting distribution for 'zdaemon>=1.4a2,<1.4.999'.\n While:\n Installing instance.\n Getting distribution for 'zdaemon>=1.4a2,<1.4.999'.\n Error: Couldn't find a distribution for 'zdaemon>=1.4a2,<1.4.999'.\n\n or::\n\n Getting distribution for 'ZConfig>=2.4a2,<2.4.999'.\n While:\n Installing instance.\n Getting distribution for 'ZConfig>=2.4a2,<2.4.999'.\n Error: Couldn't find a distribution for 'ZConfig>=2.4a2,<2.4.999'.\n Problem\n ``zdaemon`` and ``ZConfig`` eggs have only been released to the\n `Cheeseshop`_ starting from more recent versions, i.e. 2.0 and 2.5\n respectively. Older distributions in egg format are only available\n from http://download.zope.org/distribution\n Solution\n Add the above link to the ``find-links`` setting of the ``[buildout]``\n section in your ``buildout.cfg``, like::\n\n find-links =\n http://download.zope.org/distribution/\n ...\n\n .. _`Cheeseshop`: https://pypi.python.org/pypi\n\n\n**\"ZRPCError: bad handshake 'Z303'\"**\n\n Symptom\n With a ZEO setup you are getting errors like::\n\n ZRPCError: bad handshake 'Z303'\n Problem\n You probably haven't added ``plone.app.blob`` to the ``eggs`` setting in\n your ``[zeo]`` buildout part. Without it the ZEO server will not use\n the required version 3.8 of ZODB and hence not support blobs.\n Solution\n Add the string ``plone.app.blob`` to the ``eggs`` setting in the ``[zeo]``\n section (i.e. the one using the ``plone.recipe.zope2zeoserver`` recipe)\n in your ``buildout.cfg``, like::\n\n [zeo]\n ...\n eggs = plone.app.blob\n ...\n\n\n**\"AttributeError: 'NoneType' object has no attribute 'product'\" during migration**\n\n Symptom\n After installing \"plone.app.blob\" via the quick-installer or applying\n the \"plone.app.blob: ATFile replacement\" profile you are seeing migration\n errors like::\n\n Traceback (innermost last):\n Module ZPublisher.Publish, line 119, in publish\n Module ZPublisher.mapply, line 88, in mapply\n Module ZPublisher.Publish, line 42, in call_object\n Module plone.app.blob.browser.migration, line 24, in __call__\n Module plone.app.blob.migrations, line 42, in migrateATFiles\n Module Products.contentmigration.basemigrator.walker, line 126, in go\n Module Products.contentmigration.basemigrator.walker, line 205, in migrate\n MigrationError: MigrationError for obj at /... (File -> Blob):\n Traceback (most recent call last):\n File \".../Products/contentmigration/basemigrator/walker.py\", line 174, in migrate\n migrator.migrate()\n File \".../Products/contentmigration/basemigrator/migrator.py\", line 185, in migrate\n method()\n File \".../Products/contentmigration/archetypes.py\", line 111, in beforeChange_schema\n archetype = getType(self.dst_meta_type, fti.product)\n AttributeError: 'NoneType' object has no attribute 'product'\n Problem\n The current migration code has been written to convert existing \"File\"\n content to the \"Blob\" content type provided by the base \"plone.app.blob\"\n profile. However, that type isn't known when just installing the \"ATFile\n replacement\" profile. The latter is probably what you want to install,\n though, as former \"File\" content will keep the same portal type, i.e.\n \"File\" after being migrated. This way no apparent changes are visible,\n which might help with avoiding confusion.\n Solution\n For now you might work around this by either applying the \"plone.app.blob\"\n profile via the ZMI in ``/portal_setup``. This will install the above\n mentioned \"Blob\" content type. After that migration will work, but your\n former \"File\" content will have the \"Blob\" content type.\n\n If that's not what you want, simply change line line 17 in\n ``plone/app/blob/migrations.py`` (which is probably contained in an egg\n directory located somewhere like ``eggs/plone.app.blob-1.0b2-py2.4.egg/``\n relative to your buildout/installation) from::\n\n dst_portal_type = 'Blob'\n\n to::\n\n dst_portal_type = 'File'\n\n After that migration should use the new \"File\" type, based on ZODB blobs.\n Once you've migrated you might remove or disable the \"Blob\" type from\n ``/portal_types`` again. A future version of \"plone.app.blob\" will try\n auto-detect the correct target type for the migration (or at least allow\n to specify it) to make this more convenient.\n\n If you have already migrated to \"Blob\" content, but would rather like to\n have \"File\" items, you can change the two previous lines to::\n\n src_portal_type = 'Blob'\n src_meta_type = 'ATBlob'\n\n and re-run the blob migration. This will convert your \"Blob\"s to show up\n as \"File\"s again. You should probably pack your ZODB afterwards to avoid\n having its blob storage occupy twice as much disk space as actually\n needed (the extra migration will create new blobs).\n\n\n**\"Image\" and/or \"File\" content doesn't show up as expected after migrating to blobs**\n\n Symptom\n After migrating \"Image\" and/or \"File\" content to be based on blobs, some\n of it doesn't show up as expected. A typical example of this are ATCT's\n photo album views.\n Problem\n All versions before 1.0b11 didn't update the \"Type\" catalog index\n correctly during migration. This could of course result in wrong results\n for all queries using this index.\n Solution\n Manually update the \"Type\" index using the ZMI or upgrade to at least\n `1.0b11`_ and use the ``@@blob-maintenance/updateTypeIndex`` view to\n limit the reindexing to only blob-based content. The latter should\n usually be quicker, especially for bigger sites.\n\n .. _`1.0b11`: https://pypi.python.org/pypi/plone.app.blob/1.0b11\n\n\n**Errors when using additionally mounted databases**\n\n Symptom\n With additionally configured ZODB mount-points you are getting errors\n like::\n\n Traceback (innermost last):\n ...\n Module ZEO.ClientStorage, line 1061, in temporaryDirectory\n AttributeError: 'NoneType' object has no attribute 'temp_dir\n\n or::\n\n Traceback (innermost last):\n ...\n Module ZODB.blob, line 495, in temp_dir\n TypeError: Blobs are not supported\n Problem\n You haven't configured a blob-storage for your extra database.\n Solution\n Please refer to David Glick's `comment in ticket #10130`__ for detailed\n information about the various ways to configure a blob-storage for\n additional mount-points. The recommended way to accomplish this both\n for ZEO and non-ZEO setups is to use `collective.recipe.filestorage`__\n and adjust your buildout with the following::\n\n [buildout]\n ...\n parts =\n ...\n filestorage\n instance\n\n [filestorage]\n recipe = collective.recipe.filestorage\n blob-storage = var/blobstorage-%(fs_part_name)s\n parts =\n foo\n\n Please note that for the \"parts\" setting in the \"buildout\" section it is\n important to list \"filestorage\" before any parts installing Zope or ZEO.\n The \"parts\" setting in the \"filestorage\" section, however, represents\n a list of filestorage sub-parts to be generated, one per line. Further\n details can be found in the `documentation of the recipe`__.\n\n .. __: http://dev.plone.org/plone/ticket/10130#comment:5\n .. __: https://pypi.python.org/pypi/collective.recipe.filestorage\n .. __: https://pypi.python.org/pypi/collective.recipe.filestorage\n\n\nFAQ\n===\n\nIs it possible to use \"plone.app.blob\" in installations not based on `zc.buildout`_?\n\n Yes, but that would require some additional steps, since it depends on ZODB\n 3.8, but Plone currently ships with Zope 2.10, which still comes with\n ZODB 3.7. So, to make things work you could either install the `required\n versions`__ of all additionally needed packages into your ``lib/python/``\n directory or use the respective eggs and make sure they get preferred over\n their older versions on ``import``, for example by setting up\n ``PYTHONPATH``.\n\n .. __: http://dev.plone.org/plone/browser/plone.app.blob/trunk/setup.py#L35\n\n Alternatively it should also be possible to install the package using\n `easy_install`_, which would automatically install its dependencies\n including ZODB 3.8, too. Again you would need to set up your ``PYTHONPATH``\n to make sure the desired versions are used. However, installing the package\n like this is likely to have side effects on other Zope/Plone instances on\n your system, so you probably want to use `virtualenv`_ here at least.\n\n .. _`easy_install`: http://peak.telecommunity.com/DevCenter/EasyInstall\n .. _`virtualenv`: https://pypi.python.org/pypi/virtualenv\n\n Overall, to get started without too much pain, a buildout-based\n installation is recommended |---| for example the `provided buildout`_.\n\nWill this be available for Plone 2.5.x?\n\n Yes, support for the 2.5 series is planned and next on the agenda.\n\nWhat about image support, i.e. a drop-in for ``ATImage`` content?\n\n While just replacing the primary field in ``ATImage``'s schemata should\n probably already work quite well, proper image support is planned for a\n later release. \"proper\" here means using a sub-typing approach as\n `presented by Rocky Burt`__ in Naples, which will have several advantages\n including a cleaner and better structured code, but will also take a little\n longer to implement.\n\n .. __: http://www.serverzen.com/training/subtyping-unleashed\n\nStrange messages like ``Exception exceptions.OSError: (2, 'No such file or\ndirectory', '.../tmpZvxjZB') in ', mode 'w+b' at 0x7317650>> ignored`` get written to\nthe logs whenever a file is uploaded. Is that an error or something to worry\nabout?\n\n No, that's fine, it's just a small annoyance, that should be fixed\n eventually. In case you care, the problem is that the zope publisher creates\n a temporary file for each upload it receives. Once the upload has finished\n that temporary file is passed to the blob machinery, which moves it into\n its blob storage. However, at the end of the request the wrapper class for\n temporary files tries to remove the file as well, since well, it's supposed\n to be temporary. At that time the file is already gone though, and the\n above warning is issued.\n\nI have a ZEO setup with the server and clients running on separate machines.\nWhy do I get blobs stored in my ZEO clients' blobstorage directories and not\nonly on the server?\n\n ZEO clients cache blobs the first time they are fetched. Unfortunately the\n cache is not cleaned automatically when the instances are stopped and will\n keep growing. In addition, if you manually delete the files without\n restarting, the ZEO client will still expect to find them. ZODB 3.9, which\n is used by Plone 4, introduces a cache size control that alleviates the\n problem. Plone 3.x and earlier can only be used with ZODB 3.8.x, though.\n However, Sasha Vincic has written a `workaround for Plone 2.5.x`__ that\n invalidates the existing reference causing the blob data to be fetched\n again from the ZEO server should it be missing. The patch has been merged_\n and is available from version 1.0b11.\n\n .. __: http://dev.plone.org/plone/changeset/32170\n .. _`merged`: http://dev.plone.org/plone/changeset/33100\n\n.. TODO: answer the following...\n.. Given the overall clutter and confusion in the\n.. broader file system storage product space, it might be helpful to expand\n.. the Overview paragraph a bit. The things I'm wondering are: how does\n.. Blob differ from FSS? Is it different from other blob implementations?\n.. Are there things naive people might expect of plone.app.blob that it\n.. *doesn't* do? (e.g. massive increase the speed of serving large files.\n.. This doesn't really fully replace tramline, right?\n.. A bit of information on how you can use\n.. plone.app.blog in your custom content types might helpful too.\n\n\nFeedback\n========\n\nAny kind of feedback like bug reports, suggestions, feature requests and most\npreferably success stories is most welcome and much appreciated. Especially,\nit would be interesting to hear about success or problems with migration of\nexisting content and installations on platforms other than OSX.\n\nSo please feel free to file tickets in the `issue tracker`_, contact me on\n`#plone`_, `#plone-framework`_, the `plone developer mailing list`_ or\ndirectly via `email`_.\n\n .. _`issue tracker`: https://github.com/plone/plone.app.blob/issues\n .. _`#plone`: irc://irc.eu.freenode.net/plone\n .. _`#plone-framework`: irc://irc.eu.freenode.net/plone-framework\n .. _`plone developer mailing list`: mailto:plone-developers@lists.sourceforge.net\n .. _`email`: mailto:az_at_zitc_dot_de\n\nDetailed Documentation\n======================\n\nThis package integrates ZODB 3.8's blob support into Plone 3.0. To do this a\nnew content type `Blob` is provided, which can be used instead of the existing\n`File` and `Image` types. Their behaviour is mimicked by `sub-typing`_, which\nin this case means dynamically changing views and schema of the underlying\n`Blob` type as well as adapting it to add functionality.\n\n .. _`sub-typing`: http://www.serverzen.com/training/subtyping-unleashed\n\nFirst of all the `plone.app.blob` package needs to be installed, which at the\nmoment requires a special `branch`_ of Zope 2.10 as well as a few additional\npackages for `extending the schema`_ and `migration purposes`_. The easiest\nway to get a working setup is probably to use one of the provided `buildout`_\nconfigurations, either one `based on ploneout`_ and therefore mainly targeted\nat developers or another `based on plone.recipe.plone`_. The latter uses the\ncurrent plone release tarball instead of subversion checkout, meaning it is\nmainly targeted at integrators and users (and significantly faster to set up\nas well :)).\n\n .. _`branch`: http://svn.zope.org/Zope/branches/2.10-with-ZODB3.8/\n .. _`extending the schema`: http://dev.plone.org/archetypes/browser/archetypes.schemaextender/\n .. _`migration purposes`: http://dev.plone.org/collective/browser/contentmigration/\n .. _`buildout`: http://pypi.python.org/pypi/zc.buildout\n .. _`based on ploneout`: http://dev.plone.org/plone/browser/plone.app.blob/buildouts/ploneout\n .. _`based on plone.recipe.plone`: http://dev.plone.org/plone/browser/plone.app.blob/buildouts/plone-3.x\n\nIn any way, the setup should make the new content type available as well as\ninstantiable:\n\n >>> from Products.CMFCore.utils import getToolByName\n >>> portal = layer['portal']\n >>> portal_types = getToolByName(portal, 'portal_types')\n >>> portal_types.getTypeInfo('Blob')\n \n\n >>> from plone.app.testing import TEST_USER_ID\n >>> folder = portal.portal_membership.getHomeFolder(TEST_USER_ID)\n >>> folder.invokeFactory('Blob', id='blob', title='a Blob')\n 'blob'\n >>> blob = folder.blob\n >>> blob\n \n\nThe new instance should have been marked with the default sub-type and\ntherefore also contain the extended schema:\n\n >>> from plone.app.blob.interfaces import IATBlobBlob\n >>> IATBlobBlob.providedBy(blob)\n True\n >>> blob.getField('file')\n \n\nMimicking the existing \"File\" content type, i.e. `ATFile`, it shouldn't have\nan associated workflow:\n\n >>> workflow_tool = getToolByName(portal, 'portal_workflow')\n >>> workflow_tool.getWorkflowsFor(blob)\n []\n\nSince no data has been written to it, the blob file should still be empty:\n\n >>> blob.getFile().getBlob()\n \n >>> blob.getFile().getBlob().open().read()\n ''\n\nFeeding it with some image data should result in a correctly set mime-type\nand a now non-empty blob file:\n\n >>> from StringIO import StringIO\n >>> from base64 import decodestring\n >>> gif = 'R0lGODlhAQABAPAAAPj8+AAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='\n >>> gif = StringIO(decodestring(gif))\n >>> blob.setFile(gif)\n >>> print blob.getFilename()\n None\n >>> blob.getContentType()\n 'image/gif'\n >>> len(blob.getFile().getBlob().open().read())\n 43\n >>> str(blob) == gif.getvalue()\n True\n\nMigration from existing file content, i.e. `ATFile` instances, is also\nprovided. The payload data as well as all other fields should be properly\nmigrated:\n\n >>> initial_file_product = portal.portal_types.File.product\n >>> initial_file_factory = portal.portal_types.File.factory\n >>> portal.portal_types.File.product = 'ATContentTypes'\n >>> portal.portal_types.File.factory = 'addATFile'\n >>> gif.filename = 'foo.gif'\n >>> folder.invokeFactory('File', id='foo', title='a file', file=gif,\n ... subject=('foo', 'bar'), contributors=('me'))\n 'foo'\n >>> portal.portal_types.File.product = initial_file_product\n >>> portal.portal_types.File.factory = initial_file_factory\n >>> folder.foo\n \n >>> folder.foo.Title()\n 'a file'\n >>> folder.foo.getFilename()\n 'foo.gif'\n >>> folder.foo.getContentType()\n 'image/gif'\n >>> folder.foo.Subject()\n ('foo', 'bar')\n >>> folder.foo.Contributors()\n ('me',)\n\n >>> from plone.app.blob.migrations import migrateATFiles\n >>> migrateATFiles(portal)\n 'Migrating /plone/Members/test_user_1_/foo (File -> Blob)\\n'\n\n >>> folder.foo\n \n >>> folder.foo.Title()\n 'a file'\n >>> folder.foo.getFilename()\n 'foo.gif'\n >>> folder.foo.getContentType()\n 'image/gif'\n >>> folder.foo.Subject()\n ('foo', 'bar')\n >>> folder.foo.Contributors()\n ('me',)\n >>> folder.foo.getFile().getBlob()\n \n >>> str(folder.foo) == gif.getvalue()\n True\n >>> folder.foo.getFile().getBlob().open().read()\n 'GIF89a...'\n\nAlso, migrating should have indexed the new content correctly to prevent stale\nor wrong data from showing up in some views, i.e. folder listing:\n\n >>> catalog = getToolByName(portal, 'portal_catalog')\n >>> brain = catalog(id = 'foo')[0]\n >>> folder.foo.UID() == brain.UID\n True\n\n >>> folder.foo.getObjSize() == brain.getObjSize\n True\n\nFinally the correct creation of blob-based content \"through the web\" is tested\nusing a testbrowser:\n\n >>> from plone.app.testing import setRoles\n >>> setRoles(portal, TEST_USER_ID, ['Editor'])\n\n >>> from plone.testing.z2 import Browser\n\n >>> from plone.app.testing import TEST_USER_NAME, TEST_USER_PASSWORD\n >>> browser = Browser(layer['app'])\n >>> browser.addHeader('Authorization', 'Basic %s:%s' % (\n ... TEST_USER_NAME, TEST_USER_PASSWORD))\n\n >>> browser.open(folder.absolute_url())\n >>> browser.getLink(url='createObject?type_name=Blob').click()\n >>> browser.url\n 'http://nohost/plone/.../portal_factory/Blob/blob.../edit...'\n >>> browser.getControl(name='title').value = 'Foo bar'\n >>> control = browser.getControl(name='file_file')\n >>> testfile = StringIO('%PDF-1.4 fake pdf...' + 'foo' * 1000)\n >>> control.add_file(testfile, None, 'foo.pdf')\n >>> browser.getControl('Save').click()\n >>> browser.url\n 'http://nohost/plone/.../foo-bar/view'\n >>> browser.contents\n '...Info...Changes saved...\n ...Foo bar...foo.pdf...PDF document...'\n\n\nChangelog\n=========\n\n1.8.0 (2018-10-30)\n------------------\n\nNew features:\n\n- Removed usage of getObjSize script from tests.\n Also declared dependency on Products.CMFPlone.\n https://github.com/plone/Products.CMFPlone/issues/1801\n [reinhardt]\n\nBug fixes:\n\n- Switch to new TestCase using AT after PloneTestcase is now DX.\n [pbauer]\n\n\n1.7.4 (2018-02-02)\n------------------\n\nNew features:\n\n- Prepare for Python 2 / 3 compatibility\n [davilima6, rudaporto]\n\nBug fixes:\n\n- Fix bug where Image blob fields couldn't be used with\n archetypes.schemaextender unless the parent class subclasses\n ATCTImageTransform\n [MatthewWilkes]\n\n\n1.7.3 (2017-11-24)\n------------------\n\nBug fixes:\n\n- Adapt test to changes in ZPublisher.HTTPResponse.setHeader\n [pbauer]\n\n- Remove no longer existing icons from type definitions.\n [davisagli]\n\n\n1.7.2 (2017-06-03)\n------------------\n\nBug fixes:\n\n- Handle ``ValueError`` exceptions when doing a range request.\n This fixes `issue #39 `_.\n [batlock666]\n\n\n1.7.1 (2017-05-16)\n------------------\n\nBug fixes:\n\n- Do not use imports from ``Products.ATContentTypes.interface`` deprecated since 2009.\n [jensens]\n\n\n1.7 (2017-04-01)\n----------------\n\nNew features:\n\n- Adapt tests to the new indexing operations queueing.\n Part of PLIP 1343: https://github.com/plone/Products.CMFPlone/issues/1343\n [gforcada]\n\n\n1.6.7 (2017-02-20)\n------------------\n\nBug fixes:\n\n- Make sure core permissions are defined.\n This fixes `issue #30 `_.\n [maurits]\n\n\n1.6.6 (2017-02-12)\n------------------\n\nBug fixes:\n\n- Make doctests work with new zope.testbrowser based on Webtest.\n [pbauer]\n\n\n1.6.5 (2016-11-09)\n------------------\n\nBug fixes:\n\n- Add coding headers on python files.\n [gforcada]\n\n- More flexible test of getIcon.\n [jensens]\n\n- Update code to follow Plone styleguide.\n [gforcada]\n\n\n1.6.4 (2016-08-12)\n------------------\n\nFixes:\n\n- Use zope.interface decorator.\n [gforcada]\n\n\n1.6.3 (2016-07-29)\n------------------\n\nBug fixes:\n\n- Add a note to monkey.py for when it is possible to remove it.\n [gforcada]\n\n\n1.6.2 (2016-05-12)\n------------------\n\nBug fixes:\n\n- Blob images now reset EXIF data on save [martior]\n\n\n1.6.1 (2015-11-26)\n------------------\n\nNew:\n\n- The blob file now gets exported when exporting content via\n GenericSetup.\n [do3cc]\n\n\n1.6.0 (2015-09-21)\n------------------\n\n- Use configuration registry to set types_use_view_action_in_listings values.\n [esteele]\n\n\n1.5.16 (2015-07-29)\n-------------------\n\n- Fix migrator for AT-based types that got broken in 1.5.8 release and add\n an option to remove the content of the non-blob field during migration to\n not end up having stale data in the ZODB\n [fRiSi]\n\n\n1.5.15 (2015-05-31)\n-------------------\n\n- fix permission for download\n [david-batranu]\n\n\n1.5.14 (2015-05-13)\n-------------------\n\n- fix tests for latest plone.app.imaging changes for Plone 5\n\n\n1.5.13 (2015-05-05)\n-------------------\n\n- Fix tests from authenticator issues.\n [vangheem]\n\n\n1.5.12 (2015-04-30)\n-------------------\n\n- Rerelease for clarity because of double release of 1.5.11.\n [maurits]\n\n\n1.5.11 (2015-04-30)\n-------------------\n\n- Fix: Products.MimetypesRegistry used in p.a.blob.utils but no dependency\n [jensens]\n\n- Fix some tests.\n [rafaelbco]\n\n- ported tests to plone.app.testing\n [tomgross]\n\n\n1.5.10 (2014-04-16)\n-------------------\n\n- Fix tests to work with barceloneta theme.\n [vangheem]\n\n\n1.5.9 (2014-01-28)\n------------------\n\n- Make sure mimetype is not None and use use filename for detection if available.\n [tschanzt]\n\n1.5.8 (2013-04-06)\n------------------\n\n- Use obj.Schema() instead of obj.schema in the migration process.\n [gbastien]\n\n\n1.5.7 (2013-03-05)\n------------------\n\n- Only set the instance id from the name of an uploaded file\n if the file field is primary.\n [davisagli]\n\n\n1.5.6 (2013-01-09)\n------------------\n\n- Fix BLOB migration when LinguaPlone is installed.\n Also for ATFile.\n\n CAUTION: when the fix was discussed with witsch,\n he pointed to the fact that the files would be\n entirely loaded in memory during migration.\n This could potentially eat too much memory.\n [gotcha]\n\n- Don't fail on obscure chars in filename\n [tomgross]\n\n\n1.5.5 (2012-11-29)\n------------------\n\n- Added adapter for data wrapped in xmlrpclib.Binary\n https://github.com/plone/plone.app.blob/pull/1\n [aclark, garbas]\n\n- Fix BLOB migration when LinguaPlone is installed.\n [rpatterson]\n\n\n1.5.4 (2012-10-15)\n------------------\n\n- Create a transaction savepoint after setting a blob's value in order to\n make it available at its temporary path (within the same transaction).\n [tomgross]\n\n\n1.5.3 (2012-09-20)\n------------------\n\n- Update mutator to take care of filename in keyword args.\n [gotcha]\n\n- Check for unicode filename first in ``index_html``.\n [vangheem]\n\n\n1.5.2 (2012-05-25)\n------------------\n\n- Deprecated aliases were replaced on tests.\n [hvelarde]\n\n- Keep the acquisition context of the blob in index_html, as otherwise\n we cannot get the http__etag method.\n [maurits]\n\n- Move download implementation (the ``index_html`` method) to the blob\n wrapper class. The wrapper object is now directly viewable via the\n Zope 2 publisher.\n\n This change adds support for publishing of the original image data\n for any image field via the scaling view (even for fields that have\n been added via schema extension).\n\n Previously, if the blob wrapper was published for a content object\n that did not derive from the provided image class, Plone's default\n ``index_html`` template would be used, rendering an HTML page\n instead of the image.\n [malthe]\n\n\n1.5.1 (2011-08-19)\n------------------\n\n- ATImage adapter should take care of cases where no image was uploaded.\n [gotcha]\n\n\n1.5 (2011-04-21)\n----------------\n\n- Test fixes.\n [davisagli]\n\n\n1.4 (2011-02-14)\n----------------\n\n- Avoid breaking on startup if PIL is not present.\n [davisagli]\n\n\n1.3 (2010-09-28)\n----------------\n\n- Adjust tests to the fixed spelling of 'kB'.\n [witsch]\n\n\n1.2 (2010-09-22)\n----------------\n\n- Fix the ``type`` of blob-based fields so they are distinguishable as\n blob fields.\n [davisagli]\n\n- Fix broken migration-forms.\n [WouterVH]\n\n\n1.1 (2010-08-13)\n----------------\n\n- Properly close written blobs in all `IBlobbable` adapters in order to\n avoid `POSKeyErrors`.\n This fixes http://plone.org/products/plone.app.blob/issues/43\n [jbaach, witsch]\n\n- Allow explicitly setting a mimetype via a keyword passed to the mutator.\n [davidblewett, kleist, witsch]\n\n- Don't raise `AttributeError` when calling `getSize` on empty images.\n [ggozad, witsch]\n\n\n1.0 (2010-07-18)\n----------------\n\n- Correct blob migration count to ignore unrelated messages. This closes\n http://dev.plone.org/plone/ticket/10114.\n [hannosch]\n\n- Update license to GPL version 2 only.\n [hannosch]\n\n\n1.0b18 (2010-07-01)\n-------------------\n\n- Avoid deprecation warnings under Zope 2.13.\n [hannosch]\n\n- Test fix: Use the API to look at request headers.\n [hannosch]\n\n\n1.0b17 (2010-06-03)\n-------------------\n\n- Fix deletion of blob-based content even if the field is not called 'file'\n or 'image'.\n [regebro]\n\n- The `ImageField` could not be copied, which broke the standard way of\n subclassing archetypes schemas.\n [regebro]\n\n- Migration screen tried to check for installation via quick installer. We\n check the product of the destination portal type instead now. This closes\n http://dev.plone.org/plone/ticket/10365.\n [dunlapm, hannosch]\n\n- Enable \"Image\" replacement content type by default.\n [witsch]\n\n- Don't break when image-specific methods are accidentally used on\n \"File\" content.\n [witsch]\n\n\n1.0b16 (2010-05-02)\n-------------------\n\n- Remove existing image scales when updating blob-aware image fields.\n Fixes http://dev.plone.org/plone/ticket/10455\n [frisi]\n\n- Correct dependency on plone.app.imaging to >1.0b9 since we need the\n new IImageScaleFactory feature.\n [wichert]\n\n\n1.0b15 (2010-04-10)\n-------------------\n\n- Provide blob-aware factory for new-style image scales.\n [witsch]\n\n- Don't set the modification date of migrated content.\n [rossp]\n\n- Restore support for defining per-field image scale sizes.\n Refs http://dev.plone.org/plone/ticket/10328 and\n fixes http://dev.plone.org/plone/ticket/10159\n [witsch]\n\n- Provide base classes for file and image fields to be used in custom\n types not based on `archetypes.schemaextender`.\n Fixes http://dev.plone.org/plone/ticket/10328\n [witsch]\n\n- Drop workaround for broken index accessor handling, which has been fixed\n upstream in `archetypes.schemaextender`.\n [witsch]\n\n- Don't try to determine image dimensions for content other than images.\n Refs http://plone.org/products/cmfeditions/issues/58\n [witsch, do3cc]\n\n\n1.0b14 (2010-03-07)\n-------------------\n\n- Revert the change to use the URL normalizer when generating content ids\n based on filename and reinstate the previous (and expected) behavior.\n Refs http://dev.plone.org/plone/ticket/8591\n [witsch]\n\n\n1.0b13 (2010-03-06)\n-------------------\n\n- Use updated version of `createScales` as monkey-patched in\n `plone.app.imaging`. Refs http://dev.plone.org/plone/ticket/10186\n [witsch]\n\n\n1.0b12 (2010-02-16)\n-------------------\n\n- Change test setup to reuse the same directory when setting up blob\n storages, thereby fixing some BBB test issues.\n [witsch]\n\n- Remove temporary monkey wrapper for `Blob.open` used to work around an\n issue with `CMFEditions`. Refs http://dev.plone.org/plone/ticket/10200\n [witsch]\n\n- Use URL normalizer when generating content ids based on filename.\n [terapyon, papago, witsch]\n\n- Update view to analyse approximate content size grouped by type.\n [witsch]\n\n- Add `z3c.autoinclude` entry point for automatic ZCML loading in Plone 3.3+.\n [witsch]\n\n- Make sure image scales from old AT image fields are removed during\n migration to blob fields, when using the BlobMigrator. This closes\n http://dev.plone.org/plone/ticket/10160\n [davisagli]\n\n- Updated migration.pt to follow the recent markup conventions.\n References http://dev.plone.org/plone/ticket/9981\n [spliter]\n\n- Make it possible to delete image content.\n [witsch]\n\n\n1.0b11 (2010-01-30)\n-------------------\n\n- Fix issues regarding migration from `OFS.File` and `OFS.Image` content.\n [optilude, witsch]\n\n- Revert changes to make things more robust in case of missing blob files.\n This refs http://plone.org/products/plone.app.blob/issues/10\n [witsch]\n\n- Try to re-fetch blobs that have been removed from a client-side ZEO cache\n before giving up and raising an error. This makes it possible to control\n the client blob cache size via external processes (e.g. `cron`) even with\n ZODB 3.8. See http://dev.plone.org/plone/changeset/32170/ for more info.\n [svincic, witsch]\n\n- Fix issue with incorrect values for \"Type\" catalog index after migration.\n [yomatters, witsch]\n\n\n1.0b10 (2009-12-03)\n-------------------\n\n- Add support for accessing image scales via path expressions like\n `here/image_thumb` for backward-compatibility.\n [witsch]\n\n\n1.0b9 (2009-11-26)\n------------------\n\n- Unify the ATBlob factories (for CMF>=2.2 and CMF<2.2) while still\n preventing events from being fired for the former.\n [witsch]\n\n- Fix range support for open ranges.\n [j23d, witsch]\n\n- Make the title field non-required for ATBlobs, since it will be\n generated from the filename if necessary.\n [davisagli]\n\n- If a title was entered, use it instead of the filename to generate an\n id for files (matching what was already done for images).\n [davisagli]\n\n- Update the CMF 2.2 version of the ATBlob factory to match a fix I made\n in Archetypes 2.0a2.\n [davisagli]\n\n\n1.0b8 (2009-11-17)\n------------------\n\n- Added a modified version of the customized ATBlob factory for use with\n CMF 2.2.\n [davisagli]\n\n- Make sure that BlobWrappers for zero-length blobs still evaluate to\n boolean True.\n [davisagli]\n\n- Implement range support for downloads. This fixes\n http://plone.org/products/plone.app.blob/issues/11\n [j23d, rossp, witsch]\n\n- Fix image field validator to match that from `ATContentTypes`.\n [rossp]\n\n- With `ATContentTypes` >=2.0, check the `_should_set_id_to_filename`\n method to determine if `ATBlob`'s `fixAutoId` method should set the\n item id to the filename of the blob field. For images, don't set it\n to the filename if a title was supplied.\n [davisagli]\n\n- Add blobbable adapters for Python file objects and OFS Pdata objects.\n [davisagli]\n\n- Add helper view to get a rough estimate of the total size of binary\n content in a site.\n [witsch]\n\n\n1.0b7 (2009-11-06)\n------------------\n\n- Fix regression in setup for running bbb tests against Plone 3.x.\n [witsch]\n\n- Update migration view to issue warning when `plone.app.blob` has not\n been quick-installed yet. Fixes http://dev.plone.org/plone/ticket/8496\n [witsch]\n\n- Preserve filename when editing via WebDAV. This fixes\n http://plone.org/products/plone.app.blob/issues/23\n [witsch]\n\n- Update basic blob content type to be LinguaPlone-aware. This fixes\n http://plone.org/products/plone.app.blob/issues/24\n [j23d]\n\n- Override helper method to provide file-like objects for image\n transformations. This fixes http://dev.plone.org/plone/ticket/8506\n [amleczko, witsch]\n\n- Add some additional CMF/ATCT compatibility to the ATCT\n replacement types using the \"cmf_edit\" method.\n [alecm]\n\n- Provide helper methods for easier migration of custom content types.\n [ggozad, witsch]\n\n- Refactor test setup to make it work with ZODB 3.9.\n [witsch]\n\n\n1.0b6 (2009-10-10)\n------------------\n\n- Minor fixes and test updates for compatibility with Plone 4.0.\n [witsch]\n\n- Store image scales in blobs.\n [witsch]\n\n- Use correct permissions when registering replacement types for\n \"File\" and \"Image\" content.\n See http://plone.org/products/plone.app.blob/issues/9\n [witsch]\n\n- Fix migration issue regarding stale catalog index- & meta-data.\n [witsch]\n\n- Allow certain file types to be downloaded immediately.\n See http://plone.org/products/plone.app.blob/issues/4\n [optilude]\n\n- Fix performance issue regarding extension field.\n [witsch]\n\n\n1.0b5 (2009-08-26)\n------------------\n\n- Fix compatibility issue with `repoze.zope2`.\n [optilude, witsch]\n\n- Fix compatibility issues with ZODB 3.9 and Plone 4.0.\n [witsch]\n\n- Speed up migration of existing content by using \"in-place\" migrators\n and avoid unnecessary re-indexing.\n [witsch]\n\n- Fix registration of blob-based image scale adapter to prevent getting\n 404s for content other than images. This fixes the second issue\n related to http://plone.org/products/plone.app.blob/issues/19\n [witsch]\n\n\n1.0b4 (2009-11-19)\n------------------\n\n- Provide maintenance view for (re)setting blob sub-types, which can also\n be used to fix things after upgrading from 1.0b2 or earlier.\n This fixes http://plone.org/products/plone.app.blob/issues/19\n [witsch]\n\n\n1.0b3 (2009-11-15)\n------------------\n\n- Clean up GenericSetup profiles to allow separate installation of\n replacement types for \"File\" and \"Image\" content.\n [witsch]\n\n- Add index accessor to make indexing of file content work again.\n This fixes http://plone.org/products/plone.app.blob/issues/12\n [witsch]\n\n- Make code more robust in case of missing blob files.\n This fixes http://plone.org/products/plone.app.blob/issues/10\n [witsch]\n\n- Make tests clean up their temporary blob directories.\n [stefan]\n\n- Remove quota argument from DemoStorage calls.\n [stefan]\n\n- Add workaround to prevent breakage with CMFEditions (blob-based\n content can still not be versioned, though).\n [witsch]\n\n- Add missing acquisition-wrapper, also allowing to remove circular\n references between instance and field, which broke pickling.\n [witsch]\n\n- Fix helper for determining image sizes to not break for non-image\n content.\n [witsch]\n\n- Use PIL for determining image sizes as the OFS code cannot handle\n certain types of JPEGs.\n [witsch]\n\n- Added missing metadata.xml to the default profile.\n [hannosch]\n\n- Only use the file name for id generation for the replacement types,\n i.e. \"File\" and \"Image\", but not custom types. This fixes\n http://plone.org/products/plone.app.blob/issues/3\n [witsch]\n\n- Fix issue where the mime-type registry returned an empty tuple when\n looking up an unknown mime-type. This fixes\n http://plone.org/products/plone.app.blob/issues/1\n [witsch]\n\n\n1.0b2 (2008-02-29)\n------------------\n\n- Reverted fix for Windows that closed the file upload object in order\n to work around a problem with reading from the blob file afterwards.\n [witsch]\n\n\n1.0b1 (2008-02-28)\n------------------\n\n- Minor bug fixes and cleanups\n [witsch]\n\n- Fix for a problem regarding file uploads on Windows, where renaming\n the still open temporary file isn't allowed and hence caused an error.\n Now the file is closed before the call to `consumeFile()`.\n [rochael]\n\n- Fix for Windows regarding the generation of the temporary file used for\n file uploads so that it doesn't get deleted after being moved to the\n blob storare\n [rochael]\n\n- Change file size calculation so as not to need to reopen the file, which\n broke on Windows\n [rochael]\n\n- Changed the primary field of the blob content types to not to be\n \"searchable\" as this causes indexing of the blob content making ram\n consumption go through the roof\n [witsch]\n\n\n1.0a2 (2007-12-12)\n------------------\n\n- Various minor bug fixes regarding migration, content icons etc\n [witsch]\n\n- String value are now wrapped using StringIO to make them adaptable, so\n that their mime-type can be guessed as well.\n [naro]\n\n- Added alternative GenericSetup profile to allow to replace ATFile\n as the \"File\" content type\n [witsch]\n\n\n1.0a1 (2007-12-07)\n------------------\n\n- Initial version\n [witsch]\n\n- Initial package structure.\n [zopeskel]\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://pypi.org/project/plone.app.blob/", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://plone.org/products/plone.app.blob", "keywords": "zodb blob support plone integration", "license": "GPL version 2", "maintainer": "", "maintainer_email": "", "name": "plone.app.blob", "package_url": "https://pypi.org/project/plone.app.blob/", "platform": "Any", "project_url": "https://pypi.org/project/plone.app.blob/", "project_urls": { "Download": "https://pypi.org/project/plone.app.blob/", "Homepage": "http://plone.org/products/plone.app.blob" }, "release_url": "https://pypi.org/project/plone.app.blob/1.8.0/", "requires_dist": [ "Products.CMFPlone", "Products.MimetypesRegistry", "ZODB3 (>=3.8.1)", "archetypes.schemaextender (>=1.6)", "plone.app.imaging (>1.0b9)", "plone.scale", "setuptools", "six", "zope.proxy (>=3.4)", "Products.contentmigration; extra == 'test'", "collective.monkeypatcher; extra == 'test'", "plone.app.imaging; extra == 'test'", "plone.app.testing; extra == 'test'" ], "requires_python": "", "summary": "ZODB blob support for Plone", "version": "1.8.0" }, "last_serial": 4434044, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "b722aa7db255960801179badd2dcfef2", "sha256": "fe23d396127325198403d55044d7acfb0f7ea3ed5acb51f01b8624b562e2715e" }, "downloads": -1, "filename": "plone.app.blob-1.0.zip", "has_sig": false, "md5_digest": "b722aa7db255960801179badd2dcfef2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184926, "upload_time": "2010-07-18T14:25:24", "url": "https://files.pythonhosted.org/packages/14/1e/e660be256ba3b6190c964a0f6750d79ec68b5f5351ffd6c4a9f1e8903b10/plone.app.blob-1.0.zip" } ], "1.0a1": [ { "comment_text": "", "digests": { "md5": "ac71422dc6cca9e663f5f8d15570f2ca", "sha256": "78f036d4c2fd154ec35045911ad71be1b0fac2adeb85d56dfbd8b349b14c9430" }, "downloads": -1, "filename": "plone.app.blob-1.0a1-py2.4.egg", "has_sig": true, "md5_digest": "ac71422dc6cca9e663f5f8d15570f2ca", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 46117, "upload_time": "2007-12-07T00:50:31", "url": "https://files.pythonhosted.org/packages/a6/00/c26eef68c4e41c7ca77193c551abc62d96bbb39587fc725b2767c07f03c0/plone.app.blob-1.0a1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "f866a3b88268be9e9ac1105d3df74e59", "sha256": "06dd68a9983756f9476e1dfa575a65be643db6a5bfe1829dcfa0242530672e20" }, "downloads": -1, "filename": "plone.app.blob-1.0a1.tar.gz", "has_sig": true, "md5_digest": "f866a3b88268be9e9ac1105d3df74e59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24188, "upload_time": "2007-12-07T00:50:17", "url": "https://files.pythonhosted.org/packages/4c/dd/b934d141dcb7abdee1f57fe0356d5f7685b60ea0b73f2f06330031511c8c/plone.app.blob-1.0a1.tar.gz" } ], "1.0a2": [ { "comment_text": "", "digests": { "md5": "99277023cc58ed4b652a572cfa8e333a", "sha256": "a341ca7e3daadf83c3cdadc824e1b73f50a37fc2249c937d34befba117b80b63" }, "downloads": -1, "filename": "plone.app.blob-1.0a2-py2.4.egg", "has_sig": true, "md5_digest": "99277023cc58ed4b652a572cfa8e333a", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 50585, "upload_time": "2007-12-12T12:19:52", "url": "https://files.pythonhosted.org/packages/d3/48/c27d1909c7e7863fb8a260d7f52985fc157536548279511008bdf7671396/plone.app.blob-1.0a2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "8dcc8128ea4a89b63ce1353b35b2892a", "sha256": "a8c2c6a2ce8985fb85d33eaba10c78f367fa8feaf18972bbe5161e7a542bf128" }, "downloads": -1, "filename": "plone.app.blob-1.0a2.tar.gz", "has_sig": true, "md5_digest": "8dcc8128ea4a89b63ce1353b35b2892a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29494, "upload_time": "2007-12-12T12:19:43", "url": "https://files.pythonhosted.org/packages/9d/78/9e739a89547be0a510d7c17bc2b3c15bd9e26bca07af15a7731302f0c2bb/plone.app.blob-1.0a2.tar.gz" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "91e0bdadb7e7b056dcffc8f7ccb6400a", "sha256": "9404ccb2736e178e1d5452f895b225137e73f441caccb351c6c40920ad8d0cd0" }, "downloads": -1, "filename": "plone.app.blob-1.0b1-py2.4.egg", "has_sig": true, "md5_digest": "91e0bdadb7e7b056dcffc8f7ccb6400a", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 53750, "upload_time": "2008-02-27T23:19:28", "url": "https://files.pythonhosted.org/packages/2f/df/670007574480425f9a5327df869321829fa65ebd38a5e08e9aca2feab972/plone.app.blob-1.0b1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "9385514593cb725cd82963a20f71681e", "sha256": "627a9130e399ffb155405d3adb319744a080ab22122ed1b04ff7b1fff0faab3b" }, "downloads": -1, "filename": "plone.app.blob-1.0b1.tar.gz", "has_sig": true, "md5_digest": "9385514593cb725cd82963a20f71681e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33164, "upload_time": "2008-02-27T23:19:18", "url": "https://files.pythonhosted.org/packages/76/20/b19c7c87287c7af41e64006258958da1f8f3e10edf30a325146ff0f2d92e/plone.app.blob-1.0b1.tar.gz" } ], "1.0b10": [ { "comment_text": "", "digests": { "md5": "eebd9f9ffd321dcb07d5dc49ef1c2e1b", "sha256": "907011c83d4cc147cc284d28dba0b14025e98d0bbefbd1f3efc3f3928ce865e3" }, "downloads": -1, "filename": "plone.app.blob-1.0b10.zip", "has_sig": true, "md5_digest": "eebd9f9ffd321dcb07d5dc49ef1c2e1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 170514, "upload_time": "2009-12-03T03:13:29", "url": "https://files.pythonhosted.org/packages/f8/d0/91b5170977964826ee5ce412372a4a4c39509eaa00890b2b2959bfe5e364/plone.app.blob-1.0b10.zip" } ], "1.0b11": [ { "comment_text": "", "digests": { "md5": "7834e3a3e103acc8c0bfa9a9d5f880d4", "sha256": "478b138f8e1d6ae287ae69fa4e88e3ec16ad967d8506ee3ee3a4b146c4fb1094" }, "downloads": -1, "filename": "plone.app.blob-1.0b11.zip", "has_sig": true, "md5_digest": "7834e3a3e103acc8c0bfa9a9d5f880d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 174955, "upload_time": "2010-01-30T01:21:26", "url": "https://files.pythonhosted.org/packages/2a/de/e4718ef8fa656804580df4c357a4363ddd237ecc2a5d990314c40095db17/plone.app.blob-1.0b11.zip" } ], "1.0b12": [ { "comment_text": "", "digests": { "md5": "a667084cd917a64262b6336f708b39d0", "sha256": "1b6fd41efb51a7d21f9ccfd4a800a0c01799dc6aa356239f9b08c488b515e722" }, "downloads": -1, "filename": "plone.app.blob-1.0b12.zip", "has_sig": true, "md5_digest": "a667084cd917a64262b6336f708b39d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 175813, "upload_time": "2010-02-16T16:51:29", "url": "https://files.pythonhosted.org/packages/27/8e/b356b18802213b3096a377b21acf81790aaeb197a89ae50f82e43adda586/plone.app.blob-1.0b12.zip" } ], "1.0b13": [ { "comment_text": "", "digests": { "md5": "f6c91555832e77b80a4e366f6eb4fbe3", "sha256": "043be1af80c46b20f2e44251398e32dba798a318cb7fa8a198a8d3cd79b7f902" }, "downloads": -1, "filename": "plone.app.blob-1.0b13.zip", "has_sig": true, "md5_digest": "f6c91555832e77b80a4e366f6eb4fbe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 177840, "upload_time": "2010-03-06T01:45:29", "url": "https://files.pythonhosted.org/packages/c6/4d/37d67ab787d235fcbb5c3bec32f0dd10916519510c47ebb1c20d3408e439/plone.app.blob-1.0b13.zip" } ], "1.0b14": [ { "comment_text": "", "digests": { "md5": "403e4479f616dafa810eaad77f1cb407", "sha256": "bdd1b2f4d7a8cdc24024fda40917c4adbdaac51735e0cfdfab6285bcab59abaf" }, "downloads": -1, "filename": "plone.app.blob-1.0b14.zip", "has_sig": true, "md5_digest": "403e4479f616dafa810eaad77f1cb407", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 178011, "upload_time": "2010-03-07T00:02:33", "url": "https://files.pythonhosted.org/packages/51/b3/8056678760e8206e3432f2539fe36d00943ddb15052df6b5d97386bab2a4/plone.app.blob-1.0b14.zip" } ], "1.0b15": [ { "comment_text": "", "digests": { "md5": "44c1193905ea4e4fe3238a38f7b0ab2d", "sha256": "08282cb47cd141c6c2607868aac554571e64ca8aff6e1671e878950fe8b4f417" }, "downloads": -1, "filename": "plone.app.blob-1.0b15.zip", "has_sig": true, "md5_digest": "44c1193905ea4e4fe3238a38f7b0ab2d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 182798, "upload_time": "2010-04-10T01:58:30", "url": "https://files.pythonhosted.org/packages/83/94/4bedf38f2d5cb8fd6877aefb30403801cd066b693fbbf7066415fbf6ca7b/plone.app.blob-1.0b15.zip" } ], "1.0b16": [ { "comment_text": "", "digests": { "md5": "d238a54ebdfd8d00fc4bda476d2192bc", "sha256": "c2fb5b7e68efe5a08aae5bb0873d255d6754d8e5f718c58f04c4da81a03782b9" }, "downloads": -1, "filename": "plone.app.blob-1.0b16.zip", "has_sig": true, "md5_digest": "d238a54ebdfd8d00fc4bda476d2192bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 183125, "upload_time": "2010-05-02T00:34:11", "url": "https://files.pythonhosted.org/packages/42/09/bd02bfb22fd077e4f4ca534aed459e3b706042f2f83d12baa021b3709533/plone.app.blob-1.0b16.zip" } ], "1.0b17": [ { "comment_text": "", "digests": { "md5": "f8cc4d4ae2cdc224d3e1cb1c2779d56b", "sha256": "b3138a9475ea4ad65c9970c09c0db98cde8f3d099d5861d708e41a373bf1a55e" }, "downloads": -1, "filename": "plone.app.blob-1.0b17.zip", "has_sig": false, "md5_digest": "f8cc4d4ae2cdc224d3e1cb1c2779d56b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184389, "upload_time": "2010-06-03T19:22:58", "url": "https://files.pythonhosted.org/packages/aa/c9/d3ab9da973d9641c58e7e98cf43c699d9aeab1b51fcf95f971c2a2ceacae/plone.app.blob-1.0b17.zip" } ], "1.0b18": [ { "comment_text": "", "digests": { "md5": "430e9a4ee02fc9e1bdc70341a51570b9", "sha256": "3067a7bd9a9e028349167cffad0d01748f0bc5250367ba255ca7688b9b5edcb1" }, "downloads": -1, "filename": "plone.app.blob-1.0b18.zip", "has_sig": false, "md5_digest": "430e9a4ee02fc9e1bdc70341a51570b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184709, "upload_time": "2010-07-01T19:18:11", "url": "https://files.pythonhosted.org/packages/bf/b2/a3a85a5a3a16e2a08306191b89b81a30fcf64ae6a176170fa6df347b8c08/plone.app.blob-1.0b18.zip" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "500dcb475ec084bd70a11b2ac51c4f5d", "sha256": "be9d435d40b341270be4ae6eaa3458e1b41cd9ec056804243b3cf0b9b423ee0f" }, "downloads": -1, "filename": "plone.app.blob-1.0b2-py2.4.egg", "has_sig": true, "md5_digest": "500dcb475ec084bd70a11b2ac51c4f5d", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 54284, "upload_time": "2008-02-29T09:13:46", "url": "https://files.pythonhosted.org/packages/b9/93/2abe6a4b6410f2d42c7376a780362ab38d1f63be824a71f7dcc656c75363/plone.app.blob-1.0b2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "3a438c29ed34f819aea7983340eddd2c", "sha256": "2b0b8c4068df683e1a70f50ff8c5efba1dd8b1fe3ad50ff677ef6d79a5a2fc8e" }, "downloads": -1, "filename": "plone.app.blob-1.0b2.tar.gz", "has_sig": true, "md5_digest": "3a438c29ed34f819aea7983340eddd2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33676, "upload_time": "2008-02-29T09:13:35", "url": "https://files.pythonhosted.org/packages/1e/c1/ce92a245ba5f1958866c4b671be7bb62fb431f3715d87e41965e6eaf17bb/plone.app.blob-1.0b2.tar.gz" } ], "1.0b3": [ { "comment_text": "", "digests": { "md5": "55b45ce018969011d102497ed9995e8b", "sha256": "b2f64f6931412b17578f9c02d9b8bf0219df92c5ccb172ed4bdfa98117119730" }, "downloads": -1, "filename": "plone.app.blob-1.0b3.zip", "has_sig": true, "md5_digest": "55b45ce018969011d102497ed9995e8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 143990, "upload_time": "2009-05-15T13:42:47", "url": "https://files.pythonhosted.org/packages/c4/3d/277f0ece34678d49800194898b1822fe901c5ae64468db0c05c66dd28ff2/plone.app.blob-1.0b3.zip" } ], "1.0b4": [ { "comment_text": "", "digests": { "md5": "18f024170371f517ecd11e231ee331dd", "sha256": "f7c2537133e4d6d2c2f1b5dcc25b9468ada6df178cbb28e5a85ca0d85074f1c6" }, "downloads": -1, "filename": "plone.app.blob-1.0b4.zip", "has_sig": true, "md5_digest": "18f024170371f517ecd11e231ee331dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 146990, "upload_time": "2009-05-19T01:44:43", "url": "https://files.pythonhosted.org/packages/f7/4b/8ae8dd3e32377a84d0a32d600125aac6056b4f148681ad56c2997c321388/plone.app.blob-1.0b4.zip" } ], "1.0b5": [ { "comment_text": "", "digests": { "md5": "66a5617591eeea2c69a5c5dc47715da1", "sha256": "fa022a14803f51e2a59b108079a5d7130ae63c8a14c5aa47d15ff6ea1ef41f7d" }, "downloads": -1, "filename": "plone.app.blob-1.0b5.zip", "has_sig": true, "md5_digest": "66a5617591eeea2c69a5c5dc47715da1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153925, "upload_time": "2009-08-26T01:40:59", "url": "https://files.pythonhosted.org/packages/34/4f/748567ba2997b38038934fc7cd12bc14da3afbba45575fac9e70ac34d47e/plone.app.blob-1.0b5.zip" } ], "1.0b6": [ { "comment_text": "", "digests": { "md5": "ca25450a53c2ddf91c3758b9db91d928", "sha256": "7509a6d87d073515530969f860f2cef81fe24ada79429af5992c8c4a4dc59789" }, "downloads": -1, "filename": "plone.app.blob-1.0b6.zip", "has_sig": true, "md5_digest": "ca25450a53c2ddf91c3758b9db91d928", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 158004, "upload_time": "2009-10-10T15:01:01", "url": "https://files.pythonhosted.org/packages/fa/6a/afa17cef6d504b25953469982a1cb58608f4f3a85e192d1d0d36ba189925/plone.app.blob-1.0b6.zip" } ], "1.0b7": [ { "comment_text": "", "digests": { "md5": "b0c9fa1348001672cd085d3ec1184a99", "sha256": "e2f22a6b810f3b93fce29c3691d5d0f882d16266a34a502f14fa7672a401d5e7" }, "downloads": -1, "filename": "plone.app.blob-1.0b7.zip", "has_sig": true, "md5_digest": "b0c9fa1348001672cd085d3ec1184a99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 164041, "upload_time": "2009-11-06T17:29:06", "url": "https://files.pythonhosted.org/packages/13/18/4a4075f6fedeaab8ab2b437fb60aaf7279cea592522e03ec5bd624790956/plone.app.blob-1.0b7.zip" } ], "1.0b8": [ { "comment_text": "", "digests": { "md5": "3ce17f0068c0b49bc1acd4c903dbbd60", "sha256": "988fb84dfd4e9fce5ede44a305b801d98b14257a40edbf5242ac791e3944ce1d" }, "downloads": -1, "filename": "plone.app.blob-1.0b8.zip", "has_sig": true, "md5_digest": "3ce17f0068c0b49bc1acd4c903dbbd60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169342, "upload_time": "2009-11-17T02:00:18", "url": "https://files.pythonhosted.org/packages/11/e0/1925d6c323e0545248bc497a6bc07257260a0e38ac24594e7d484fa04a82/plone.app.blob-1.0b8.zip" } ], "1.0b9": [ { "comment_text": "", "digests": { "md5": "019f02ff8784993e9b8f258323551f00", "sha256": "e10eefa63c8fedbc5b25b2d0033691b289a938c792e7727ea92cc91c6a603ff0" }, "downloads": -1, "filename": "plone.app.blob-1.0b9.zip", "has_sig": true, "md5_digest": "019f02ff8784993e9b8f258323551f00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169855, "upload_time": "2009-11-26T13:48:08", "url": "https://files.pythonhosted.org/packages/62/84/fe30b0bba958657cf329da9e4932fffda32e7df35499921535ab8b2fe6a4/plone.app.blob-1.0b9.zip" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "bca2176119286646965567dcf7b30cce", "sha256": "1246fb3768aebaf697a9cf7868f759af665c1e9bdaa66256118663913ad17c2a" }, "downloads": -1, "filename": "plone.app.blob-1.1.zip", "has_sig": true, "md5_digest": "bca2176119286646965567dcf7b30cce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 185233, "upload_time": "2010-08-13T17:19:53", "url": "https://files.pythonhosted.org/packages/b8/c1/a71146f1c3f415f7851acb84a86ec9076048f97012e7e2649a0021fd0653/plone.app.blob-1.1.zip" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "535c864a0f57debe1293df6a95c7eaf4", "sha256": "b1aa024d9dfad72de6d0ccb2a4e0156a673f209b79ba749133911bea41dbb3b7" }, "downloads": -1, "filename": "plone.app.blob-1.2.zip", "has_sig": true, "md5_digest": "535c864a0f57debe1293df6a95c7eaf4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 185460, "upload_time": "2010-09-22T16:34:49", "url": "https://files.pythonhosted.org/packages/d3/83/6edb5c29c8b80e80cf10b099677dd433729f82e91a902b30196dc5150f41/plone.app.blob-1.2.zip" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "e1c991fca10115a8feed7052d4183434", "sha256": "d8b4c41642c8ca9f2a608bfc16673180c281bb0b42e2c9f3b7082d6a471289e0" }, "downloads": -1, "filename": "plone.app.blob-1.3.zip", "has_sig": true, "md5_digest": "e1c991fca10115a8feed7052d4183434", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 185571, "upload_time": "2010-09-28T16:41:18", "url": "https://files.pythonhosted.org/packages/d4/f9/dec272a4c87bfcaa9c001fbeb12d56ee46434fed1ad606a61e0489ed4c77/plone.app.blob-1.3.zip" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "25083b5864c5403e0081cb853baf6682", "sha256": "bef327244b38d451bd6739c32f1059b5004cfd03f096786bfd3dc80dbad18bd5" }, "downloads": -1, "filename": "plone.app.blob-1.4.zip", "has_sig": false, "md5_digest": "25083b5864c5403e0081cb853baf6682", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 186108, "upload_time": "2011-02-14T14:49:19", "url": "https://files.pythonhosted.org/packages/39/9d/e23baa4e6e0f8c1ed1ae48cbb1729fd9437420c00f3b7640bba30949aba7/plone.app.blob-1.4.zip" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "7913a71fb931561e07f8b440b0a2cd13", "sha256": "90cdc8229e44860c7e2d38342b0ff691c1cf780e5c05c1ae59c9c0ad96502b9b" }, "downloads": -1, "filename": "plone.app.blob-1.5.zip", "has_sig": false, "md5_digest": "7913a71fb931561e07f8b440b0a2cd13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 190041, "upload_time": "2011-04-21T15:12:49", "url": "https://files.pythonhosted.org/packages/38/a4/eb47f1f13624e6f3e529aa073ece957ca4c098e59ad628c3925f2819763c/plone.app.blob-1.5.zip" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "f1b5068f00e6f6c6f38d3a48396f9475", "sha256": "d7c8298d60e051a728565a11b387c9b0750f0ae4cd0937a71b5e90a71a6bcddb" }, "downloads": -1, "filename": "plone.app.blob-1.5.1.tar.gz", "has_sig": false, "md5_digest": "f1b5068f00e6f6c6f38d3a48396f9475", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 148258, "upload_time": "2011-08-19T11:41:16", "url": "https://files.pythonhosted.org/packages/13/5b/87104aa2436aa363f8b0ea3a6d86246f14953c688b4073b2e4212f263596/plone.app.blob-1.5.1.tar.gz" } ], "1.5.10": [ { "comment_text": "", "digests": { "md5": "57105dc6a2f3ec4aa68076a5ef1da0f6", "sha256": "dcf195695e5c50d17b657eb7de35669b095649f2e4792d98d539d7354fbdd541" }, "downloads": -1, "filename": "plone.app.blob-1.5.10.zip", "has_sig": false, "md5_digest": "57105dc6a2f3ec4aa68076a5ef1da0f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 195711, "upload_time": "2014-04-16T04:54:45", "url": "https://files.pythonhosted.org/packages/18/eb/3b6edd5cf9f61cf485609b9ecd2d99212887b52ecf043ac4f050865332bc/plone.app.blob-1.5.10.zip" } ], "1.5.11": [ { "comment_text": "", "digests": { "md5": "fd62d1590a032ab6ea3a3c692dc5452d", "sha256": "3a281eb4863f1e3ad8abdf6e7811993055902e568d249147aa35c2531ad307cd" }, "downloads": -1, "filename": "plone.app.blob-1.5.11.tar.gz", "has_sig": false, "md5_digest": "fd62d1590a032ab6ea3a3c692dc5452d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153535, "upload_time": "2015-04-30T08:54:05", "url": "https://files.pythonhosted.org/packages/22/24/4b9b2f9e9b31dee62d001d92e4694c1f52ca98b4617cdfa24634a8c8fb93/plone.app.blob-1.5.11.tar.gz" }, { "comment_text": "", "digests": { "md5": "a734c958802f797e8fb2c8fd688073ed", "sha256": "eff91b2b64f7f75710a56f33500601763849b459d4560f26a66b55680c69238e" }, "downloads": -1, "filename": "plone.app.blob-1.5.11.zip", "has_sig": false, "md5_digest": "a734c958802f797e8fb2c8fd688073ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194046, "upload_time": "2015-03-11T13:01:40", "url": "https://files.pythonhosted.org/packages/0a/23/1b66db8776a5ab60f02eae06220b9d7790a7606db08d01bb5edada7d7560/plone.app.blob-1.5.11.zip" } ], "1.5.12": [ { "comment_text": "", "digests": { "md5": "91d5f45916300894cff4550af8d3e0ce", "sha256": "1e19be9f11e2a37c26055edbfe6d266d6155535416133037e39feaba8ea06950" }, "downloads": -1, "filename": "plone.app.blob-1.5.12.tar.gz", "has_sig": false, "md5_digest": "91d5f45916300894cff4550af8d3e0ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153632, "upload_time": "2015-04-30T09:00:28", "url": "https://files.pythonhosted.org/packages/4b/5c/700eae1a2dff830effa83449e08b8db9c645c7ea145c07e22e9d4693a2e5/plone.app.blob-1.5.12.tar.gz" } ], "1.5.13": [ { "comment_text": "", "digests": { "md5": "f030acb823687f58885704359bc7f44c", "sha256": "9d678592032e648a90880d42d2b25d50542d4d572243ce324e2deae20e7f1eb7" }, "downloads": -1, "filename": "plone.app.blob-1.5.13.tar.gz", "has_sig": false, "md5_digest": "f030acb823687f58885704359bc7f44c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153732, "upload_time": "2015-05-04T23:39:39", "url": "https://files.pythonhosted.org/packages/74/04/12c72be856f17f1c815f49cbcc10a46baad19468430ffc1848572c76edd7/plone.app.blob-1.5.13.tar.gz" } ], "1.5.14": [ { "comment_text": "", "digests": { "md5": "3dbc77b6259332b85231eee2415844b9", "sha256": "878c5e14e46ec2bdaeba106ea915e6dae9681a1c36075b444a6503ac7902ea13" }, "downloads": -1, "filename": "plone.app.blob-1.5.14.tar.gz", "has_sig": false, "md5_digest": "3dbc77b6259332b85231eee2415844b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 154028, "upload_time": "2015-05-13T19:43:40", "url": "https://files.pythonhosted.org/packages/26/5e/826a04c4e9afb1b56523d1cc3c5cfecb23280f4c16e61aaec134c92154e5/plone.app.blob-1.5.14.tar.gz" } ], "1.5.15": [ { "comment_text": "", "digests": { "md5": "1ce3000ce4625dfda2435a0593a043e5", "sha256": "b08f15534ce85a81a737892a94c3f032b4a7f8ff1db7c9a9901993216852546e" }, "downloads": -1, "filename": "plone.app.blob-1.5.15.zip", "has_sig": false, "md5_digest": "1ce3000ce4625dfda2435a0593a043e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194527, "upload_time": "2015-05-31T14:02:40", "url": "https://files.pythonhosted.org/packages/a9/cf/635d4cbb3c2d04ffbf9177874e7be095d3df3f0eaee590ef9cd193180604/plone.app.blob-1.5.15.zip" } ], "1.5.16": [ { "comment_text": "", "digests": { "md5": "2f968b9921944de295f5ef9cde7abecb", "sha256": "89f01a19aef58d09f41a571b86787ae3b66bcd54a924a64b9cf771454d17606a" }, "downloads": -1, "filename": "plone.app.blob-1.5.16.tar.gz", "has_sig": false, "md5_digest": "2f968b9921944de295f5ef9cde7abecb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 154855, "upload_time": "2015-07-28T23:02:23", "url": "https://files.pythonhosted.org/packages/2b/b8/442d907ef08a43b250623e6ed94c13fe6c0d8068fc67fee4817434d29778/plone.app.blob-1.5.16.tar.gz" } ], "1.5.17": [ { "comment_text": "", "digests": { "md5": "b4aca18d598b819ac814ed259d2d83ed", "sha256": "f02f088e651a0c0072b5d0b56842ab071268483a0551925cf3e031cac4bf88ba" }, "downloads": -1, "filename": "plone.app.blob-1.5.17.tar.gz", "has_sig": false, "md5_digest": "b4aca18d598b819ac814ed259d2d83ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155036, "upload_time": "2016-02-15T13:15:06", "url": "https://files.pythonhosted.org/packages/63/92/c9154ab659850265460af59032b43b00eb8262dc019be142db55cd276a68/plone.app.blob-1.5.17.tar.gz" } ], "1.5.18": [ { "comment_text": "", "digests": { "md5": "164d9b60bfc6de072d6f65a7417f442b", "sha256": "c6a99d5967e2eb83cec687608aaec09ad14b3539f71b86c346459dd650dd039d" }, "downloads": -1, "filename": "plone.app.blob-1.5.18.tar.gz", "has_sig": false, "md5_digest": "164d9b60bfc6de072d6f65a7417f442b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155419, "upload_time": "2017-06-29T16:21:12", "url": "https://files.pythonhosted.org/packages/c9/2d/26689976defe42a425fe6419c157cbca82f54d59e470af0eb415fa34cc83/plone.app.blob-1.5.18.tar.gz" } ], "1.5.19": [ { "comment_text": "", "digests": { "md5": "76f5aee34a4f9e872c757261c5704831", "sha256": "2db0a18d7003e0f0bb779da43f74717ab0025dca5f474484effe6a5c7b770bb7" }, "downloads": -1, "filename": "plone.app.blob-1.5.19-py2-none-any.whl", "has_sig": false, "md5_digest": "76f5aee34a4f9e872c757261c5704831", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 157720, "upload_time": "2017-07-01T18:51:20", "url": "https://files.pythonhosted.org/packages/9d/4c/8afd54887cd571bc8445878fbe303ef3631d4f3c77cf356d91b5cb9b26ed/plone.app.blob-1.5.19-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af62af1e6518aa4eb38853458c9d485f", "sha256": "e672e00133561e6d0e18328606422be9da717311f57628d2504ac496a9207df2" }, "downloads": -1, "filename": "plone.app.blob-1.5.19.tar.gz", "has_sig": false, "md5_digest": "af62af1e6518aa4eb38853458c9d485f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155581, "upload_time": "2017-07-01T18:51:22", "url": "https://files.pythonhosted.org/packages/3e/5f/78d8e06c9826d8e963d8435c4a60dd5ba91a7b166ea3643362a415f35281/plone.app.blob-1.5.19.tar.gz" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "4ba2e753d3355b929891d2cd0f5fb33d", "sha256": "167d1c25a64c68a24ee4928ddbbd7f8177b82ef15825fd3609fc5549479ee57b" }, "downloads": -1, "filename": "plone.app.blob-1.5.2.zip", "has_sig": false, "md5_digest": "4ba2e753d3355b929891d2cd0f5fb33d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 192540, "upload_time": "2012-05-25T22:52:10", "url": "https://files.pythonhosted.org/packages/16/30/7573c18bdd5f492c4619205d16f5d3f9c7daaf676bc4e190cfb41a702a98/plone.app.blob-1.5.2.zip" } ], "1.5.3": [ { "comment_text": "", "digests": { "md5": "ba6f49b0693db2c78e2f02b260f5afc4", "sha256": "afbf0090798c3489b7d867eaa33913e7e2380a46355d9020eb64b9158b8adc10" }, "downloads": -1, "filename": "plone.app.blob-1.5.3.zip", "has_sig": false, "md5_digest": "ba6f49b0693db2c78e2f02b260f5afc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 192977, "upload_time": "2012-09-20T13:19:29", "url": "https://files.pythonhosted.org/packages/8a/1e/5d762ede336a8c4144ece7336f3e1bb3d146fdfa59d9634788e5f899101b/plone.app.blob-1.5.3.zip" } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "8ee39790e1d33892bc6d4c69185a1420", "sha256": "2f0bc65036f30bb3c3fc662e84584c4920c19726c473626465f0ef4a55e99a3a" }, "downloads": -1, "filename": "plone.app.blob-1.5.4.zip", "has_sig": false, "md5_digest": "8ee39790e1d33892bc6d4c69185a1420", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 193351, "upload_time": "2012-10-15T15:39:23", "url": "https://files.pythonhosted.org/packages/6c/f8/c8b276ce5b7b86e79497f98040949c90aa059c24e4557e1835ee1a299cc2/plone.app.blob-1.5.4.zip" } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "42b9ea6e247d9f594683695eff9bdd20", "sha256": "95606d19f3bbbc9431b73feb560c5411f707fc1cf1fd14423b3490d435c2abcc" }, "downloads": -1, "filename": "plone.app.blob-1.5.5.zip", "has_sig": false, "md5_digest": "42b9ea6e247d9f594683695eff9bdd20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194372, "upload_time": "2012-11-29T14:34:46", "url": "https://files.pythonhosted.org/packages/5c/c9/0ae29d5b3adda20c8de016fdc573f4574034fa46d4874521ca31e899de2c/plone.app.blob-1.5.5.zip" } ], "1.5.6": [ { "comment_text": "", "digests": { "md5": "8d6ba6f360b6bfd40f87914132339660", "sha256": "575ffabb08765c75486ad248bbc47f6b40f49d31505daabe2a2a170b2b9771fe" }, "downloads": -1, "filename": "plone.app.blob-1.5.6.zip", "has_sig": false, "md5_digest": "8d6ba6f360b6bfd40f87914132339660", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194757, "upload_time": "2013-01-09T10:37:19", "url": "https://files.pythonhosted.org/packages/f1/56/669d248b4b627794f2afdd01104e77575aa5df3596ed3521626ed8746666/plone.app.blob-1.5.6.zip" } ], "1.5.7": [ { "comment_text": "", "digests": { "md5": "135bc404212981c445d5bbb6a749b155", "sha256": "0529ef3cf301ba2385491916f89d9d1fbd0a1a1a6f4ea0f2931d033805feeba7" }, "downloads": -1, "filename": "plone.app.blob-1.5.7.zip", "has_sig": false, "md5_digest": "135bc404212981c445d5bbb6a749b155", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194905, "upload_time": "2013-03-05T19:16:24", "url": "https://files.pythonhosted.org/packages/d4/54/12e756ff2bc51d43ff44bb83026e4b9d707dc6f965fa48b6469561f68c8d/plone.app.blob-1.5.7.zip" } ], "1.5.8": [ { "comment_text": "", "digests": { "md5": "7e575d8df137cd19067cc95845aae604", "sha256": "48e45b5ffe807c5dbcfb5629f19b3ed81501d707bbb54e58608a24460a0c9972" }, "downloads": -1, "filename": "plone.app.blob-1.5.8.zip", "has_sig": false, "md5_digest": "7e575d8df137cd19067cc95845aae604", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 194973, "upload_time": "2013-04-06T14:39:34", "url": "https://files.pythonhosted.org/packages/10/2a/538019b7bbf47bf6ffea0530e7a7b01dd89bea8f7dff2cad8b8834c25aaa/plone.app.blob-1.5.8.zip" } ], "1.5.9": [ { "comment_text": "", "digests": { "md5": "3ac753daa2758e3e8290e1e3a1887183", "sha256": "f264b4233b881e52727ff7f7ed7aaca50ed2eda6029c1b57b25d21d1a96e6299" }, "downloads": -1, "filename": "plone.app.blob-1.5.9.zip", "has_sig": false, "md5_digest": "3ac753daa2758e3e8290e1e3a1887183", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 195348, "upload_time": "2014-01-28T13:32:07", "url": "https://files.pythonhosted.org/packages/3a/cd/f7b2134d325c068310ad95a802fbdb78ccef7800f3bd2ea910947e54678f/plone.app.blob-1.5.9.zip" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "d43245710126462823c180add3d52900", "sha256": "5ef7e6e4c3fceeb04b3b09b1913a5dce9517072249d0b40d290c999344c1e8e3" }, "downloads": -1, "filename": "plone.app.blob-1.6.0.tar.gz", "has_sig": false, "md5_digest": "d43245710126462823c180add3d52900", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 154983, "upload_time": "2015-09-21T22:32:15", "url": "https://files.pythonhosted.org/packages/e2/f0/eddccc05a96651d53f83231cf854bf25861f66d124ef18198f2a108f2f40/plone.app.blob-1.6.0.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "597875533204a9811997f5e714cd6ebd", "sha256": "a5cedc093288b784e64e2166f6da4ff5c5e6de41ceaa7cca2e1e33b0232c12de" }, "downloads": -1, "filename": "plone.app.blob-1.6.1.tar.gz", "has_sig": false, "md5_digest": "597875533204a9811997f5e714cd6ebd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155436, "upload_time": "2015-11-25T23:19:38", "url": "https://files.pythonhosted.org/packages/53/6e/7ec0f9d390dd4fef031b67860391f17fa05e996bb44549d1fd12af452280/plone.app.blob-1.6.1.tar.gz" } ], "1.6.2": [ { "comment_text": "", "digests": { "md5": "3e4a39a1663000e4abc6b86386641788", "sha256": "a63eedd8021e912a17f7437277f7e61596c1cf68258a2a2e1dd035a1a7f6ac06" }, "downloads": -1, "filename": "plone.app.blob-1.6.2.tar.gz", "has_sig": false, "md5_digest": "3e4a39a1663000e4abc6b86386641788", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155645, "upload_time": "2016-05-12T10:51:16", "url": "https://files.pythonhosted.org/packages/7d/6b/b7163f46706390444cb80822e2f768f5e7f95bfe33be908926c664c2a449/plone.app.blob-1.6.2.tar.gz" } ], "1.6.3": [ { "comment_text": "", "digests": { "md5": "58ce1f06f14ab2fb036404ed9dd93316", "sha256": "1449ad6c451c22033bf9fa003a5ae65766ee1073031fff1e49a4377b3d43b51e" }, "downloads": -1, "filename": "plone.app.blob-1.6.3.tar.gz", "has_sig": false, "md5_digest": "58ce1f06f14ab2fb036404ed9dd93316", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155925, "upload_time": "2016-07-29T18:06:58", "url": "https://files.pythonhosted.org/packages/5a/3d/cb60a6338854879ec942c2fad4d9c59cbdc3ee665d269dfb94e66183f2b9/plone.app.blob-1.6.3.tar.gz" } ], "1.6.4": [ { "comment_text": "", "digests": { "md5": "594b16ea37a2eb409996ff0449546f5a", "sha256": "89cbf4f0f4b3289a017fd245fd55e93f28f9ca27b1406b6950a0e5b9e7cbe0fc" }, "downloads": -1, "filename": "plone.app.blob-1.6.4.tar.gz", "has_sig": false, "md5_digest": "594b16ea37a2eb409996ff0449546f5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 155978, "upload_time": "2016-08-11T23:24:10", "url": "https://files.pythonhosted.org/packages/1b/fb/4dfd77420b5e57340a9164206abe5e3a9c64b4cbbfb513652f3f4d518e86/plone.app.blob-1.6.4.tar.gz" } ], "1.6.5": [ { "comment_text": "", "digests": { "md5": "f9d6926373d67aedcebcd3859e1ca467", "sha256": "11f8b110f19081c491279ea8f015d4b7376bc2b446cd593dfe73a571a32478b5" }, "downloads": -1, "filename": "plone.app.blob-1.6.5.tar.gz", "has_sig": false, "md5_digest": "f9d6926373d67aedcebcd3859e1ca467", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 156407, "upload_time": "2016-11-09T16:08:25", "url": "https://files.pythonhosted.org/packages/4e/c3/6cb29b88eba1c0c35411e3180d2e0a24470e33a92688e1eac1f3621e40c9/plone.app.blob-1.6.5.tar.gz" } ], "1.6.6": [ { "comment_text": "", "digests": { "md5": "84c6877f63186e0cdf4bc4a09467034f", "sha256": "95baed57ae1b2de551ea5bc60506aecdfe00b79fb3e46a681c5077fffcd5264f" }, "downloads": -1, "filename": "plone.app.blob-1.6.6.tar.gz", "has_sig": false, "md5_digest": "84c6877f63186e0cdf4bc4a09467034f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 156597, "upload_time": "2017-02-12T20:57:17", "url": "https://files.pythonhosted.org/packages/4d/6a/3f4a891483514ba3b3881d4e6971699acdee4cdfa80079d1e1b30bf88e31/plone.app.blob-1.6.6.tar.gz" } ], "1.6.7": [ { "comment_text": "", "digests": { "md5": "e9c520485b58cd9315f0fb497a27b8ad", "sha256": "2dad01a58c49116a48d5c7e73dbb3ad7545c867835951a7bddcc1a814b226b41" }, "downloads": -1, "filename": "plone.app.blob-1.6.7.tar.gz", "has_sig": false, "md5_digest": "e9c520485b58cd9315f0fb497a27b8ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 156783, "upload_time": "2017-02-20T18:15:15", "url": "https://files.pythonhosted.org/packages/6d/b9/2c5ffa0757f144d695b02e32847d39d95bbcb28f004f09a4186905a21904/plone.app.blob-1.6.7.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "cd8f28bff38a61ba25d2f9dc6a24130e", "sha256": "b98c2d5a469b406d2cffe551b915a22780cda5f5ace0ce41a63433f8bc0fadb2" }, "downloads": -1, "filename": "plone.app.blob-1.7.tar.gz", "has_sig": false, "md5_digest": "cd8f28bff38a61ba25d2f9dc6a24130e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157068, "upload_time": "2017-03-31T23:10:44", "url": "https://files.pythonhosted.org/packages/cf/c4/0ef2fc3c16ff5829a46861df26ed4dd82267cc968b62244c397b9e5d0cc6/plone.app.blob-1.7.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "08a4127c412996e404ccb2e744c994c0", "sha256": "f3fa6fdaeb7789a0b62dc3609aa32e29556d89c2a5f9603aec2d8bd850616988" }, "downloads": -1, "filename": "plone.app.blob-1.7.1.tar.gz", "has_sig": false, "md5_digest": "08a4127c412996e404ccb2e744c994c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157245, "upload_time": "2017-05-16T19:25:29", "url": "https://files.pythonhosted.org/packages/29/f3/a2dcb950259abd4d42d5128be32c1fcd4415324e4b13898d156efe2eb1cc/plone.app.blob-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "5601b152e5cc148cf2af3c008d198e84", "sha256": "a0e3860e8769504246d01e8ea518b0207d887daad72df8e39743d346593a0f4a" }, "downloads": -1, "filename": "plone.app.blob-1.7.2-py2-none-any.whl", "has_sig": false, "md5_digest": "5601b152e5cc148cf2af3c008d198e84", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 159797, "upload_time": "2017-06-03T19:23:24", "url": "https://files.pythonhosted.org/packages/79/6c/65f9d0472adfaba13bcdd36e0f1db1e4657a10fd0b6ca8d299c5b61f15e4/plone.app.blob-1.7.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f27b797a416601868d7b9189acb1c8c", "sha256": "b4d09bd3d12d321e82da9bf7258182c5cbd7905fa866a1c310f092a2acd6fe32" }, "downloads": -1, "filename": "plone.app.blob-1.7.2.tar.gz", "has_sig": false, "md5_digest": "6f27b797a416601868d7b9189acb1c8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 151228, "upload_time": "2017-06-03T19:23:26", "url": "https://files.pythonhosted.org/packages/f4/02/1480a17e861bed14712ad33d9a0a008ac1dbe4124bbe0351c84f7bbf8feb/plone.app.blob-1.7.2.tar.gz" } ], "1.7.3": [ { "comment_text": "", "digests": { "md5": "4136c683f1f7e4c33936332f86e094df", "sha256": "2273626c8b8fc87256f229e97339d63792829256e647284cbe544c518f311575" }, "downloads": -1, "filename": "plone.app.blob-1.7.3-py2-none-any.whl", "has_sig": false, "md5_digest": "4136c683f1f7e4c33936332f86e094df", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 160012, "upload_time": "2017-11-25T01:15:45", "url": "https://files.pythonhosted.org/packages/ab/75/b18e671320b1aa9c226b15898a0eb04d0e6dc0c6e912d0a6c74b2bc4149e/plone.app.blob-1.7.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a94ae97177268513ddf48f8c47c4acd", "sha256": "e4280701004b18750a62ab5a9dcc60c626897f473380afbf13426d0d27a043b6" }, "downloads": -1, "filename": "plone.app.blob-1.7.3.tar.gz", "has_sig": false, "md5_digest": "5a94ae97177268513ddf48f8c47c4acd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 151797, "upload_time": "2017-11-25T01:15:47", "url": "https://files.pythonhosted.org/packages/1c/f0/7ce16d1530a41e37b95791d8e3f9a85c080ab686f3942c5c201963c07cd8/plone.app.blob-1.7.3.tar.gz" } ], "1.7.4": [ { "comment_text": "", "digests": { "md5": "f810e2c559e9dfad55bde93ffa8b735f", "sha256": "b155be9c029139d53c56c6142a07f366aaccf0b518699b46e0e8e1d4f5589450" }, "downloads": -1, "filename": "plone.app.blob-1.7.4-py2-none-any.whl", "has_sig": false, "md5_digest": "f810e2c559e9dfad55bde93ffa8b735f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 161975, "upload_time": "2018-02-02T15:48:53", "url": "https://files.pythonhosted.org/packages/7d/f2/5b64c9e1cb77501fa3dc96f1805759689f6f32765c6f591f2d62479d9d89/plone.app.blob-1.7.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc0685f952121a24a72c52ab1ed676c6", "sha256": "b14cc43a9070d84c1ccf1703aae8e7e6ff2da36d89246d2741fc0a0954bf9eae" }, "downloads": -1, "filename": "plone.app.blob-1.7.4.tar.gz", "has_sig": false, "md5_digest": "cc0685f952121a24a72c52ab1ed676c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152749, "upload_time": "2018-02-02T15:48:56", "url": "https://files.pythonhosted.org/packages/1d/d3/dcc32ec34be08548d340b6b522208d0ee502e3b772f6b6c1f0a7761a8bd7/plone.app.blob-1.7.4.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "3ba2d6ebeda36c33695fb62edb554869", "sha256": "7cf959a6a3e91e5eecc0ab00fe04d7268708bbc09d3bcf146cac35015acf5b25" }, "downloads": -1, "filename": "plone.app.blob-1.8.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3ba2d6ebeda36c33695fb62edb554869", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 162217, "upload_time": "2018-10-31T02:18:08", "url": "https://files.pythonhosted.org/packages/72/bd/8b355967d09a646d087dd2ae70841b6190cec3bb498279aec21782483f25/plone.app.blob-1.8.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62cf6a474c64a7b67003e31a6116f1e9", "sha256": "99c64ab928fc860d98de85e682fcb571801e018e5ccfaa6b36c24d85f036870f" }, "downloads": -1, "filename": "plone.app.blob-1.8.0.tar.gz", "has_sig": false, "md5_digest": "62cf6a474c64a7b67003e31a6116f1e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153105, "upload_time": "2018-10-31T02:18:12", "url": "https://files.pythonhosted.org/packages/dc/bf/9489c1e3333655de4f851875d0f8a303ed5f4546442203bc5823f05c5caa/plone.app.blob-1.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3ba2d6ebeda36c33695fb62edb554869", "sha256": "7cf959a6a3e91e5eecc0ab00fe04d7268708bbc09d3bcf146cac35015acf5b25" }, "downloads": -1, "filename": "plone.app.blob-1.8.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3ba2d6ebeda36c33695fb62edb554869", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 162217, "upload_time": "2018-10-31T02:18:08", "url": "https://files.pythonhosted.org/packages/72/bd/8b355967d09a646d087dd2ae70841b6190cec3bb498279aec21782483f25/plone.app.blob-1.8.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62cf6a474c64a7b67003e31a6116f1e9", "sha256": "99c64ab928fc860d98de85e682fcb571801e018e5ccfaa6b36c24d85f036870f" }, "downloads": -1, "filename": "plone.app.blob-1.8.0.tar.gz", "has_sig": false, "md5_digest": "62cf6a474c64a7b67003e31a6116f1e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 153105, "upload_time": "2018-10-31T02:18:12", "url": "https://files.pythonhosted.org/packages/dc/bf/9489c1e3333655de4f851875d0f8a303ed5f4546442203bc5823f05c5caa/plone.app.blob-1.8.0.tar.gz" } ] }