{ "info": { "author": "Simone Orsi", "author_email": "simahawk@gmail.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Programming Language :: Python" ], "description": "collective.readunread\r\n=====================\r\n\r\nIntroduction\r\n============\r\n\r\nThis package provides read/unread status for Plone objects.\r\n\r\nIt adds a \"readBy\" field and a proper index to any object marked with IReadByProvider interface.\r\n\r\n\r\nHow to use it\r\n=============\r\n\r\nIn order to activate read/unread feature the target object must implement::\r\n\r\n collective.readunread.interfaces.IReadByProvider\r\n\r\n\r\nYou can add a ZCML slug in your package like::\r\n\r\n \r\n\r\n\r\nHow it works\r\n============\r\n\r\nFor testing purpose we'll assign it to the Document content type\r\n\r\n>>> from zope import interface\r\n>>> from Products.ATContentTypes.content.document import ATDocument\r\n>>> from collective.readunread.interfaces import IReadByProvider\r\n>>> interface.classImplements(ATDocument,IReadByProvider)\r\n\r\nand create a Document\r\n\r\n>>> self.setRoles(('Manager',))\r\n>>> docid = self.folder.invokeFactory('Document', 'document')\r\n>>> doc = self.folder[docid]\r\n\r\nWe must trigger IObjectInitializedEvent on it since we have a subcriber that\r\nwill take care of pushing the userid of the creator into 'readBy' field\r\n\r\n>>> from Products.Archetypes.event import ObjectInitializedEvent\r\n>>> from zope.event import notify\r\n>>> notify(ObjectInitializedEvent(doc))\r\n\r\nWe can use the manager adapter for handling readby status\r\n\r\n>>> from collective.readunread.interfaces import IReadByManager\r\n>>> manager = IReadByManager(doc)\r\n\r\nSince the doc is new we should get only creator's ID\r\n\r\n>>> len(manager.get_readby()) == 1\r\nTrue\r\n>>> manager.get_readby()\r\n('test_user_1_',)\r\n\r\nLet's read the doc as other users. The following will create 3 new users\r\n\r\n>>> from collective.readunread.tests.tests import setupMembers\r\n>>> setupMembers(self.portal, n=3)\r\n\r\nWe have two ways for setting the doc as 'read' by a user. First, we can trigger\r\nthe PostValidationHook event with the user (that simulates viewing the doc)\r\n\r\n>>> from collective.readunread.tests.tests import fireViewEvent\r\n>>> fireViewEvent(doc,'user1')\r\n>>> fireViewEvent(doc,'user2')\r\n\r\nLet's see who read the doc\r\n\r\n>>> 'user1' in manager.get_readby()\r\nTrue\r\n>>> 'user2' in manager.get_readby()\r\nTrue\r\n>>> 'user3' in manager.get_readby()\r\nFalse\r\n\r\nThe second way is to set it trough the manager\r\n\r\n>>> manager.set_readby(['user3',])\r\n>>> 'user3' in manager.get_readby()\r\nTrue\r\n\r\nWe can check the status of a user\r\n\r\n>>> manager.get_status('user3')\r\n'read'\r\n\r\nWe can also set a user as unread\r\n\r\n>>> manager.set_unreadby(['user3',])\r\n>>> 'user3' not in manager.get_readby()\r\nTrue\r\n>>> manager.get_status('user3')\r\n'unread'\r\n\r\n\r\nTODO\r\n====\r\n\r\n- document & test buttons macro\r\n- document & test helper views\r\n\r\nChangelog\r\n=========\r\n\r\n1.0b6\r\n-----\r\n- fix missing import browser package\r\n\r\n1.0b5\r\n-----\r\n- update docs\r\n- added doctest for manager\r\n- fixed adapter\r\n- improved utils\r\n\r\n1.0b4\r\n-----\r\n- fix profile name\r\n- add .gitignore\r\n\r\n1.0b3\r\n-----\r\n- missing HISTORY update (experimenting w/ jarn.mkrelease)\r\n\r\n1.0b2\r\n-----\r\n- updated docs\r\n\r\n\r\n1.0b1dev (unreleased)\r\n---------------------\r\n- Initial release\r\n\r\n\r\nCredits\r\n=======\r\n\r\nDeveloped with the support of `International Traning Center of the ILO`__.\r\n\r\n.. image:: http://www.itcilo.org/logo_en.jpg\r\n :alt: ITCILO - Logo\r\n :target: http://www.itcilo.org/\r\n\r\n__ http://www.itcilo.org/\r\n\r\n\r\nAuthors\r\n=======\r\n\r\nThis product was developed by Domsense.\r\n\r\n.. image:: http://domsense.com/logo-txt.png\r\n :alt: Domsense Website\r\n :target: http://www.domsense.com/", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/collective.readunread", "keywords": "Plone", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "collective.readunread", "package_url": "https://pypi.org/project/collective.readunread/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/collective.readunread/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/collective/collective.readunread" }, "release_url": "https://pypi.org/project/collective.readunread/1.0b6/", "requires_dist": null, "requires_python": null, "summary": "read/unread status for Plone contents", "version": "1.0b6" }, "last_serial": 3158831, "releases": { "1.0b1": [ { "comment_text": "", "digests": { "md5": "0f5e6e89a610fab54491a192ded93944", "sha256": "bb1da467d76f7312642624cc4e71bed575ff85d82e9954d534fe1cc95b7c37dc" }, "downloads": -1, "filename": "collective.readunread-1.0b1.zip", "has_sig": false, "md5_digest": "0f5e6e89a610fab54491a192ded93944", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37954, "upload_time": "2012-01-23T16:12:03", "url": "https://files.pythonhosted.org/packages/54/64/b96a209d10392d3bfad2342bc9e55141e7fcd0df67aa4d9629c6af0e6e21/collective.readunread-1.0b1.zip" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "e9b9d88c241168abd96b9f7f34b67fad", "sha256": "95707cdb6cf5ec0ec85d2d030d361e59a4b922ccb8df65848abb3c0b97dc5c29" }, "downloads": -1, "filename": "collective.readunread-1.0b2.zip", "has_sig": false, "md5_digest": "e9b9d88c241168abd96b9f7f34b67fad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38043, "upload_time": "2012-01-23T16:16:45", "url": "https://files.pythonhosted.org/packages/32/e3/d575c91754e047525f83524332ebdcc6a2fc5b6fb6fb5e03d4ab5e965cdc/collective.readunread-1.0b2.zip" } ], "1.0b3": [ { "comment_text": "", "digests": { "md5": "5de719e5ec43e9e4b9486a0539b565ce", "sha256": "7fb4aa3fef4f167ed589369f8b2c370f3c29063cd8bc00ee27dcfef70987f626" }, "downloads": -1, "filename": "collective.readunread-1.0b3.zip", "has_sig": false, "md5_digest": "5de719e5ec43e9e4b9486a0539b565ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38222, "upload_time": "2012-01-23T16:25:56", "url": "https://files.pythonhosted.org/packages/01/b8/3ea3dd9f6ff680a5fcc7f579e4923c069066fedc7428c45880d46cc5af1b/collective.readunread-1.0b3.zip" } ], "1.0b4": [ { "comment_text": "", "digests": { "md5": "a68c36242af663394d06372b25467bbc", "sha256": "239288ec37919124130addf0ac4c64b5233ff86788d7b808675f95302dead36e" }, "downloads": -1, "filename": "collective.readunread-1.0b4-py2.6.egg", "has_sig": false, "md5_digest": "a68c36242af663394d06372b25467bbc", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 16729, "upload_time": "2012-01-23T17:29:22", "url": "https://files.pythonhosted.org/packages/ba/3d/34706643658de5ec5a000c543a217b7cf7d4ec8720793f24b147d05f50bd/collective.readunread-1.0b4-py2.6.egg" } ], "1.0b5": [ { "comment_text": "", "digests": { "md5": "57c014d50fb6513b205266005027ef10", "sha256": "17c2040fba4cd4437b003bfb3b553186455f815bb2266ed89364bff97ba8de4c" }, "downloads": -1, "filename": "collective.readunread-1.0b5.zip", "has_sig": false, "md5_digest": "57c014d50fb6513b205266005027ef10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42087, "upload_time": "2012-01-24T15:08:49", "url": "https://files.pythonhosted.org/packages/a2/16/0083fcc298d2e0d81d43f846ffc631a312d8380bb68873d2cc1e7d3a84c1/collective.readunread-1.0b5.zip" } ], "1.0b6": [ { "comment_text": "", "digests": { "md5": "46a45775f0449e2a7bfa3cb78a268f47", "sha256": "9b27e73fe79bbde15b462d665faca2dd6682870476bdd95f6bfca83cf69d3fc3" }, "downloads": -1, "filename": "collective.readunread-1.0b6.zip", "has_sig": false, "md5_digest": "46a45775f0449e2a7bfa3cb78a268f47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42148, "upload_time": "2012-01-27T11:47:30", "url": "https://files.pythonhosted.org/packages/6b/05/09aff2458bafbae414a2578a5a76dc39eaa019d2db283cb14c585f408481/collective.readunread-1.0b6.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "46a45775f0449e2a7bfa3cb78a268f47", "sha256": "9b27e73fe79bbde15b462d665faca2dd6682870476bdd95f6bfca83cf69d3fc3" }, "downloads": -1, "filename": "collective.readunread-1.0b6.zip", "has_sig": false, "md5_digest": "46a45775f0449e2a7bfa3cb78a268f47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42148, "upload_time": "2012-01-27T11:47:30", "url": "https://files.pythonhosted.org/packages/6b/05/09aff2458bafbae414a2578a5a76dc39eaa019d2db283cb14c585f408481/collective.readunread-1.0b6.zip" } ] }