{ "info": { "author": "Ramon Bartl", "author_email": "rb@ridingbytes.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Framework :: Plone :: 4.2", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Framework :: Plone :: 5.1", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "collective.logbook\n==================\n\n:Author: Ramon Bartl\n:Version: 0.9.0\n\n``collective.logbook`` add-on provides advanced persistent error logging for the\n`open source Plone CMS `_.\n\n.. contents:: Table of Contents\n :depth: 2\n\n\nLastest Build Status\n--------------------\n\nMaster Branch https://github.com/collective/collective.logbook\n\n.. image:: https://api.travis-ci.org/collective/collective.logbook.png?branch=master\n :target: https://travis-ci.org/collective/collective.logbook\n :alt: Build Status\n\n\nIntroduction\n------------\n\nFor anonymous users Plone generates an Error Page, which contains an error\nnumber. But what to do with this error number?\n\nYou have to log into your plone site, go to the ZMI, check the error_log object\nand probably construct the url by hand to get the proper error with this error\nnumber, e.g.:\n\nhttp://localhost:8080/Plone/error_log/showEntry?id=1237283091.10.529903983894\n\nIf you are lucky, you will find the error by this number for further\ninvestigation. If not, then maybe number of occured errors have exceeded the\nnumber of exceptions to keep, or you are on the wrong Zope instance if you run a\ncluster setup with a ZEO server, or maybe the Zope instance was restarted in\nbetween, which caused a reset of all logged errors.\n\nNot really smooth this behaviour.\n\nWould it not be better to have a *nice frontend* where you can paste the error\nnumber to a field and search for it? Keep all logged error messages\n*persistent*, also when Zope restarts? Keep only *unique errors* and not a\nthousand times the same Error? Get an *email notification* when a new, unique\nerror occured, so that you know already what's going on before your client mails\nthis error number to you?\n\nIf you think that this would be cool, `collective.logbook` is what you want.\n\n\nQuickstart\n----------\n\nAfter installation, you can configure your logbook settings in the controlpanel:\n\nhttp://localhost:8080/Plone/@@logbook-controlpanel\n\nAll occured errors get listed in the logbook view:\n\nhttp://localhost:8080/Plone/@@logbook\n\nAs the logbook view diplays real errors that occured in your Plone site, it will\nprobably be empty at the first time.\n\nTo raise an error by intent, `collective.logbook` ships with two URL routes,\nthat do this job for you for testing purpose:\n\nhttp://localhost:8080/Plone/@@error-test\n\nThis will raise an expected `RuntimeError`, which should be logged in the\nlogbook view. Calling this URL multiple times, should reference the error,\nbecause of the same error signature.\n\nThis means, if you have configured Email notification, you will just be notified\nonce. The same is true for the webhooks, which will be described later.\n\nTo simulate different errors, you can browse this URL:\n\nhttp://localhost:8080/Plone/@@random-error-test\n\nThis raises different errors, and multiple calls to this URL fills up the\nlogbook view with the occured errors, sorted by the most often happened errors\nor to be more precisely, the errors that are referenced most often appear first.\n\n\nWeb hooks\n---------\n\n`collective.logbook` provides ability to HTTP POST error message to any web\nservice when an error happens in Plone. This behavior is called a web hook.\n\nUse cases\n\n- `Showing Plone errors real-time in Skype chat `_\n\n- `Routing errors to different websites and services via Zapier `_\n\nIn Site Setup > Logbook you can enter URLs where HTTP POST will be asynchronously\nperformed on a traceback. HTTP POST payload is an message from Logbook,\ncontaining a link for further information.\n\n.. note::\n\n Currently repeated errros (same traceback signature, which get referenced in\n logbook) are not POST'ed again. You will receive a message only once, unless\n you clear logbook contents in the @@logbook management view.\n\n\nInstallation\n------------\n\nThese instructions assume that you already have a Plone buildout that's built\nand ready to run.\n\nEdit your buildout.cfg file and look for the eggs key in the instance section.\nAdd collective.logbook to that list. Your list will look something like this::\n\n eggs =\n ...\n collective.logbook\n\nRun buildout.\n\nActivate the add-on via Site Setup > Add ons.\n\n\nCompatibility\n-------------\n\nThis extension works with Plone 4 and Plone 5.\n\n\nBrowser Testing\n---------------\n\nWith `collective.logbook` enabled, it is simple to see all errors occured in your Plone site::\n\n >>> portal = self.getPortal()\n >>> browser = self.getBrowser()\n >>> browser.addHeader('Authorization', 'Basic admin:secret')\n\nRemember some URLs::\n\n >>> portal_url = portal.absolute_url()\n >>> logbook_controlpanel_url = portal_url + \"/@@logbook-controlpanel\"\n >>> logbook_test_error_url = portal_url + \"/@@error-test\"\n >>> logbook_url = portal_url + \"/@@logbook\"\n\nBrowse to the `@@logbook` view::\n\n >>> browser.open(logbook_url)\n >>> 'Congratulations, there are 0 Errors in your Plone Site!' in browser.contents\n True\n\nNow lets create an error with the `@@error-test` view, which raises an expected `RuntimeError`::\n\n >>> browser.open(logbook_test_error_url)\n Traceback (most recent call last):\n ...\n HTTPError: HTTP Error 500: Internal Server Error\n\n >>> browser.open(logbook_url)\n >>> \"There are 1 saved (unique) Tracebacks and 0 referenced Tracebacks\" in browser.contents\n True\n\nThe same error will be referenced and not logged again::\n\n >>> browser.open(logbook_test_error_url)\n Traceback (most recent call last):\n ...\n HTTPError: HTTP Error 500: Internal Server Error\n\n >>> browser.open(logbook_url)\n >>> \"There are 1 saved (unique) Tracebacks and 1 referenced Tracebacks\" in browser.contents\n True\n\nThere is also a `@@random-error-test` view, which randomly selects different tracebacks for testing.\n\nLogbook logging can be deactivated on purpose in the `@@logbook-controlpanel` view::\n\n >>> browser.open(logbook_controlpanel_url)\n >>> browser.getControl(name=\"form.widgets.logbook_enabled:list\").value = []\n >>> browser.getControl(name=\"form.buttons.save\").click()\n\nErrors should not be logged anymore::\n\n >>> browser.open(logbook_test_error_url)\n Traceback (most recent call last):\n ...\n HTTPError: HTTP Error 500: Internal Server Error\n\n >>> browser.open(logbook_url)\n >>> \"There are 1 saved (unique) Tracebacks and 1 referenced Tracebacks\" in browser.contents\n True\n\nFinally, we remove all errors::\n\n >>> browser.open(logbook_url)\n >>> browser.getControl(name=\"form.button.deleteall\").click()\n >>> 'Congratulations, there are 0 Errors in your Plone Site!' in browser.contents\n True\n\n\nTechnical Details\n-----------------\n\nThis section gives an overview how `collective.logbook` works.\n\n\nSiteErrorLog Patch\n~~~~~~~~~~~~~~~~~~\n\n`collective.logbook` patches the raising method of\n`Products.SiteErrorLog.SiteErrorLog`::\n\n from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog\n\n _raising = SiteErrorLog.raising\n\n def raising(self, info):\n enty_url = _raising(self, info)\n notify(ErrorRaisedEvent(self, enty_url))\n return enty_url\n\nThe patch fires an `ErrorRaisedEvent` event before it returns the enty_url. The\nentry url is the link to the standard SiteErrorLog like:\n\n http://localhost:8080/Plone/error_log/showEntry?id=1237283091.10.529903983894\n\nThe patch gets _only_ then installed, when you install collective.logbook over\nthe portal_quickinstaller tool and removes the patch, when you uninstall it.\n\nYou can also deactivate the patch over the logbook configlet of the plone\ncontrol panel.\n\n\nLog Storage\n~~~~~~~~~~~\n\nThe default storage is an annotation storage on the plone site root::\n\n \n \n\nThe default storage adapter creates 2 PersistentDict objects in your portal.\nOne 'main' storage and one 'index' storage, which keeps track of referenced\nerrors.\n\n\nThe storage will be fetched via an adapter lookup. So the more specific\nadapter will win. Maybe an SQL storage with SQLAlchemy would be nice here:)\n\n\nNotify Event\n~~~~~~~~~~~~\n\nWhen a new unique error occurs, an INotifyTraceback event gets fired. An\nemail event handler is already registered with collective.logbook::\n\n \n\nThis handler will email new tracebacks to the list of email adresses\nspecified in the logbook configlet of the plone control panel.\n\n\nConfiguration\n~~~~~~~~~~~~~\n\ncollective.logbook now uses Plone 5's registry to store its configuration.\nIt has 3 configuration keys:\n\n - logbook.logbook_log_mails\n - logbook.logbook_large_site\n - logbook.logbook_webhook_urls\n\nThese properties take the values you enter in logbook configlet in the plone\ncontrol panel.\n\nThe first one is used to email new tracebacks to these email addresses.\n\nThe second one changes some behaviour for large sites.\n\nThe third one does an HTTP POST to some URLs when an error occurs.\n\nChangelog\n=========\n\n\n0.9.1 (2018-07-17)\n------------------\n\n- Fix #17 by making sure the context of a log entry is not acquisition-wrapped.\n [rafaelbco]\n\n0.9.0 (2017-02-23)\n------------------\n\n- Fix #11 by adding upgrade step to create registry records.\n [rafaelbco]\n\n- Fix #12: Error while trying to login into the ZMI.\n [rafaelbco]\n\n0.8 (2017-01-27)\n----------------\n\n- Complete Code Rework, Cleanup and Refactoring for Plone 4/5 Compatibility.\n [ramonski]\n\n- add Plone 5.0 pypi classifier, update README.rst to mention Plone 5 compatibility\n [tkimnguyen]\n\n0.8b2 (2016-10-24)\n------------------\n\n- Cleanup/doc update for Plone 5 version\n [glemignot]\n\n0.8b1 (2016-10-21)\n------------------\n\n- Initial port to Plone 5\n [glemignot]\n\n0.7 (2014-06-12)\n----------------\n\n- Fixed tests\n [ramonski]\n\n- Add Plone4.3-compatibility.\n [WouterVH]\n\n- Added Web Hook support\n [miohtama, sevanteri]\n\n0.6 (2011-11-28)\n----------------\n\n- Log exceptions within exception handler\n [jfroche]\n\n- Move delete all button, add show all button, show error message if error was not found.\n [jfroche]\n\n- Add option that disable browsing stored errors. This option become useful if you have a site with many errors.\n [jfroche]\n\n0.5 (2011-08-16)\n----------------\n\n- Move storage to OOBTree to avoid that logging error transactions get\n bigger and bigger.\n Add upgradehandler accordingly.\n [gotcha]\n\n- Fix saving configuration.\n [gotcha]\n\n- Logging initialization at startup time was broken with Zope 2.13 at least.\n [gotcha]\n\n- Added support for i18n\n [macagua]\n\n- Added support for Spanisn translation\n [macagua]\n\n- Move the mail notifier into a view to use a template for better\n HTML email handling.\n [rossp]\n\n- Include the REQUEST HTML for more useful debugging and\n troubleshooting.\n [rossp]\n\n0.4 (2010-08-02)\n----------------\n\n- Add \"z3c.autoinclude.plugin\" entry point, so in Plone 3.3+ you can avoid\n loading the ZCML file. [WouterVH]\n\n- expose send mail exception to the log message\n this fixes http://plone.org/products/collective.logbook/issues/3\n [naro]\n\n- fixed email notification for plone4 since MailHost.send signature changed\n (see `Upgrade Information`_)\n [fRiSi]\n\n .. _`Upgrade Information`: http://plone.org/documentation/manual/upgrade-guide/version/upgrading-plone-3-x-to-4.0/updating-add-on-products-for-plone-4.0/mailhost.securesend-is-now-deprecated-use-send-instead/\n\n- store and show user and date for referenced errors too\n this fixes http://plone.org/products/collective.logbook/issues/2\n [fRiSi]\n\n0.3.1 (2009-03-18)\n------------------\n\n- the error handler now starts a new transaction before saving it into the\n logbook [ramonski]\n\n0.3 (2009-03-17)\n----------------\n\n- 0.2 release was broken, sorry for this re-release [ramonski]\n- fixed issues which caused some ugly Database Conflict errors [ramonski]\n- removed all Zope2.app() stuff [ramonski]\n- mail handler stops when no emails specified [ramonski]\n- fixed uninstall method of properties [ramonski]\n\n0.2 (2009-03-17)\n----------------\n\n- added a configlet for plone control panel [ramonski]\n- added a default notify traceback email handler [ramonski]\n- added propert install/uninstall methods for the SiteErrorLog patch\n [ramonski]\n- added 2 properties in the application root [ramonski]\n\n0.1 - Unreleased\n----------------\n\n- Initial release [ramonski]", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/collective.logbook", "keywords": "", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "collective.logbook", "package_url": "https://pypi.org/project/collective.logbook/", "platform": "", "project_url": "https://pypi.org/project/collective.logbook/", "project_urls": { "Homepage": "https://github.com/collective/collective.logbook" }, "release_url": "https://pypi.org/project/collective.logbook/0.9.1/", "requires_dist": null, "requires_python": "", "summary": "Advanced Persistent Error Log", "version": "0.9.1" }, "last_serial": 4165525, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "d3dac2452d3effcf12c8d3a730e5a297", "sha256": "7b96af0bf9581b1546fe5dac72962073687c93b939ca2ba215896e9525caf8a1" }, "downloads": -1, "filename": "collective.logbook-0.1-py2.4.egg", "has_sig": false, "md5_digest": "d3dac2452d3effcf12c8d3a730e5a297", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 40392, "upload_time": "2008-12-27T20:38:59", "url": "https://files.pythonhosted.org/packages/ce/d9/b4d76a4c80d5953f57f4ad52f7eebde3e12b24a01fb60a8d4e785f09ff82/collective.logbook-0.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "e3e5f806c3decb904522f02219825d63", "sha256": "828c38d0f25fcb5c69b029d31c7963583d40a1f85aec6c37121c10502f00aa71" }, "downloads": -1, "filename": "collective.logbook-0.1.tar.gz", "has_sig": false, "md5_digest": "e3e5f806c3decb904522f02219825d63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16610, "upload_time": "2008-12-27T20:38:57", "url": "https://files.pythonhosted.org/packages/30/31/d9d46ca61069e66838ccab17675d8339c8cfa79456cacf35ae774518cada/collective.logbook-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "55bdf01f49c9b30fbcedebc9d7ca647d", "sha256": "13d407fe3b40f7cd983acbb61288dffb807a14313c7fce54cdd534eaa5d193de" }, "downloads": -1, "filename": "collective.logbook-0.2-py2.4.egg", "has_sig": false, "md5_digest": "55bdf01f49c9b30fbcedebc9d7ca647d", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 52460, "upload_time": "2009-03-17T12:50:12", "url": "https://files.pythonhosted.org/packages/75/e1/e008cac3ad5d4728a9992dd73e49220392acf2bfcaf62cb91778f9194d35/collective.logbook-0.2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "9cc81fa6ed08b9cb2e6df1cc2d6bd491", "sha256": "c057a8ec6a64e97df3dbf8956e332d04cefeceb90089a50fa09eed13492b80cb" }, "downloads": -1, "filename": "collective.logbook-0.2.tar.gz", "has_sig": false, "md5_digest": "9cc81fa6ed08b9cb2e6df1cc2d6bd491", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22214, "upload_time": "2009-03-17T12:50:11", "url": "https://files.pythonhosted.org/packages/a9/58/b186c27078e742351b47c4bb0b9c799586c1a885858afd963342b0946e86/collective.logbook-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "584075067d709ce60b1314c5c6287249", "sha256": "922c8775c11a9443d590a14cf999725a8afa6aa9e28f69f221eb2f0668add88c" }, "downloads": -1, "filename": "collective.logbook-0.3-py2.4.egg", "has_sig": false, "md5_digest": "584075067d709ce60b1314c5c6287249", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 52880, "upload_time": "2009-03-17T15:15:50", "url": "https://files.pythonhosted.org/packages/3b/42/947211416ae05ff65eb64d8e27311fd77e4a544efed6edecace4a47dd444/collective.logbook-0.3-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "b6c1311b3165fa2cb99f656631c89ccc", "sha256": "185d6d2f8b2a5ebc4aa912992a5fb7f1bdd2eed28149e3faebe30acc24ea4bf4" }, "downloads": -1, "filename": "collective.logbook-0.3.tar.gz", "has_sig": false, "md5_digest": "b6c1311b3165fa2cb99f656631c89ccc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22616, "upload_time": "2009-03-17T15:15:49", "url": "https://files.pythonhosted.org/packages/03/42/d26afe0d9159e80bf5f9e660591f7379fd60101eded3752f5e4bebf4aa25/collective.logbook-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "7e9f76f247dc086cfa9cec27bb21183d", "sha256": "a199583b2c8f2299e0efe63ad639de270565806f8b10517293d0a0a1fc57c8fa" }, "downloads": -1, "filename": "collective.logbook-0.3.1-py2.4.egg", "has_sig": false, "md5_digest": "7e9f76f247dc086cfa9cec27bb21183d", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 52944, "upload_time": "2009-03-18T14:39:36", "url": "https://files.pythonhosted.org/packages/e2/21/3a43ab1bec8abef383a5b92aeae3c605fce2d2d59efe00c1ae1eaedaf181/collective.logbook-0.3.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "80ba226f43999468d8ff4c59c19b7656", "sha256": "1a5e77bce2f1212ee0d10dcc32564f299d55bb2f22daee4845c44531ae982a8d" }, "downloads": -1, "filename": "collective.logbook-0.3.1.tar.gz", "has_sig": false, "md5_digest": "80ba226f43999468d8ff4c59c19b7656", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22698, "upload_time": "2009-03-18T14:39:35", "url": "https://files.pythonhosted.org/packages/b8/f8/8d4d8be2770f613bec7d63fcc06ded08b3b7585b402e4053528b3504c356/collective.logbook-0.3.1.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "2cfb9195c2cbe9307a9ffd14a86ce508", "sha256": "997f1a8a3017ecf94eb4f8478bdfd68e89eaf2877bb897b00e548dbc6b41b43c" }, "downloads": -1, "filename": "collective.logbook-0.4-py2.6.egg", "has_sig": false, "md5_digest": "2cfb9195c2cbe9307a9ffd14a86ce508", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 53427, "upload_time": "2010-08-03T00:01:38", "url": "https://files.pythonhosted.org/packages/3b/3f/80c07385b5426f807bd7d6256cd931d86abe8fb256ddc14505ce1c808b9d/collective.logbook-0.4-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "f8c4a1ec82824ba80463d73f81d0d2ac", "sha256": "2b1a672ce01b6bd2e0662a875ac7fe6bb5d0865f29a023cb2dd59eab413a13c5" }, "downloads": -1, "filename": "collective.logbook-0.4.zip", "has_sig": false, "md5_digest": "f8c4a1ec82824ba80463d73f81d0d2ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47746, "upload_time": "2010-08-02T23:59:51", "url": "https://files.pythonhosted.org/packages/ec/78/46a0ace0c647aad21c686421665a667d47eda399d726869f1bf90e8c986d/collective.logbook-0.4.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "c8e163daa8dfc7562b43a7f3d17e26bf", "sha256": "6d3bb44d1afeea11741cdd88397db8f72d2932b978eba7f05f7064f8d13284b7" }, "downloads": -1, "filename": "collective.logbook-0.5.tar.gz", "has_sig": false, "md5_digest": "c8e163daa8dfc7562b43a7f3d17e26bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30082, "upload_time": "2011-08-16T15:14:32", "url": "https://files.pythonhosted.org/packages/1b/be/a623c78d122e9ede512869d49217c1a69508ba513cf8b9866bc6d830728f/collective.logbook-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "c955d69862fb3089243b7b36d98be13a", "sha256": "7d664d0b5dc912577cf6e051fcf7e0897040f0fcd24711bdd28c8cf6cb2704b4" }, "downloads": -1, "filename": "collective.logbook-0.6.tar.gz", "has_sig": false, "md5_digest": "c955d69862fb3089243b7b36d98be13a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31764, "upload_time": "2011-11-28T15:39:20", "url": "https://files.pythonhosted.org/packages/ae/06/3539c4105fd47db37622ba5d2b88d66475fd4d244f798e13ccf685bcdceb/collective.logbook-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "6157af212890ec878a620e1ba1d93853", "sha256": "f7bce60906cbd499e0cc6182f9ceeee835a96369d2efcf58d6aa05668d87b677" }, "downloads": -1, "filename": "collective.logbook-0.7.tar.gz", "has_sig": false, "md5_digest": "6157af212890ec878a620e1ba1d93853", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37161, "upload_time": "2014-06-12T19:47:53", "url": "https://files.pythonhosted.org/packages/1e/1f/4ef63d2682ab8691a3ea77d214a608b574053f8ebf8ae2ed2ca0305805ae/collective.logbook-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "e20c390699f19d523d41fa79f69b7515", "sha256": "c955b73a6223f3311562e705b628b21e95d1efa1a1239a0b9913fa75474793a1" }, "downloads": -1, "filename": "collective.logbook-0.8.tar.gz", "has_sig": false, "md5_digest": "e20c390699f19d523d41fa79f69b7515", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4215579, "upload_time": "2017-01-27T12:23:51", "url": "https://files.pythonhosted.org/packages/12/68/c4cf6019eded0fe0843a9aaa6bad9250b55b6aa4a9f7957d403ccb302696/collective.logbook-0.8.tar.gz" } ], "0.8b2": [ { "comment_text": "", "digests": { "md5": "4f20b8f057268ac9749a91e9351868eb", "sha256": "4eb16e34f0c012ec5ff7685815a35e0a2e11bea6d57a95c15791673506dfdbc7" }, "downloads": -1, "filename": "collective.logbook-0.8b2.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "4f20b8f057268ac9749a91e9351868eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37792, "upload_time": "2016-10-25T08:51:06", "url": "https://files.pythonhosted.org/packages/a9/ab/df7491fbf0f1f6fb6d85685bc61cb722f7bedf3d069be1c9052d8effe744/collective.logbook-0.8b2.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "ba59d05eac12e1042b6b226a70dd8ac0", "sha256": "227017901941b3d972b7a243dbcf376f8c87d610d373acede43569df4f5f1d4f" }, "downloads": -1, "filename": "collective.logbook-0.8b2.tar.gz", "has_sig": false, "md5_digest": "ba59d05eac12e1042b6b226a70dd8ac0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33095, "upload_time": "2016-10-25T08:51:09", "url": "https://files.pythonhosted.org/packages/91/de/c8de7171200e504d21cc9d00291b93cde19e9324bff913d65a463dd1b58f/collective.logbook-0.8b2.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "bde18fa97b70f67004670144d3d91aed", "sha256": "3ad9e345a26eecb6ab8aeb04c06954fbb6ec4e163401e19e8b5b5092b1ed0869" }, "downloads": -1, "filename": "collective.logbook-0.9.0.zip", "has_sig": false, "md5_digest": "bde18fa97b70f67004670144d3d91aed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 346525, "upload_time": "2017-02-23T11:34:16", "url": "https://files.pythonhosted.org/packages/be/d8/51f277a27c51d37b314d9dc4f374a5d270f256db8066116681151ad2c77c/collective.logbook-0.9.0.zip" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "6c3e29e066761f564ee6b6ed4f29847c", "sha256": "ab2022fc229a50ee3181327818e02602eb067123ffca70aadecb090465ff91bb" }, "downloads": -1, "filename": "collective.logbook-0.9.1.tar.gz", "has_sig": false, "md5_digest": "6c3e29e066761f564ee6b6ed4f29847c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37217, "upload_time": "2018-07-17T14:10:46", "url": "https://files.pythonhosted.org/packages/89/5a/a65d8baad3c90771208e5a7e9110a1c4732bfb5d6c8e2a0a0c371b31d14c/collective.logbook-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6c3e29e066761f564ee6b6ed4f29847c", "sha256": "ab2022fc229a50ee3181327818e02602eb067123ffca70aadecb090465ff91bb" }, "downloads": -1, "filename": "collective.logbook-0.9.1.tar.gz", "has_sig": false, "md5_digest": "6c3e29e066761f564ee6b6ed4f29847c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37217, "upload_time": "2018-07-17T14:10:46", "url": "https://files.pythonhosted.org/packages/89/5a/a65d8baad3c90771208e5a7e9110a1c4732bfb5d6c8e2a0a0c371b31d14c/collective.logbook-0.9.1.tar.gz" } ] }