{ "info": { "author": "Kees Hink", "author_email": "hink@gw20e.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Programming Language :: Python" ], "description": "Introduction\n============\n\nThis product is intended as a solution for the use case of sending notification\ne-mails for items which are about to expire (in, say, the next 24 hours).\n\nThe solution this product facilitates allows you to:\n\n1. Select and preview the items for which to take action\n2. Select different actions:\n\n a. send e-mail notification:\n\n i. configure message text\n ii. configure recipients\n\n b. modify the workflow state\n c. move the item somewhere else\n\nAll this can be done by site administrators without programming skills, using\nPlone's control panel.\n\nImplementation\n==============\n\nThe facilitated solution requires these parts:\n\n1. Items are selected in a Topic. Topics allow you to define a relative date,\n like \"in the next week\". They also allow you to filter items on lots of \n other criteria.\n\n2. We create a View which fires an Event for each item in the Topic when that \n is View is called. That is the scope of this product.\n\n3. A Content Rule is added which is triggered by the fired Event. Content Rules\n may have different Actions: sending e-mail, changing workflow state, moving\n objects.\n\n4. The View is called at regular intervals. You may use Cron4Plone or a cron\n job for this.\n\nGetting started\n===============\n\n1. Select items\n---------------\n\nCreate a Topic which gathers all content you want some action taken for. \n\n In the future, we might also use plone.app.collection's new style\n Collections for this, however these currently don't seem to support\n relative date criteria.\n\nExample\n~~~~~~~\n\nIf you want to send e-mails about content that was modified the previous day:\n\n- go to the criteria tab\n- \"Add new search criteria\" for field name \"Modification date\"\n- set \"Criteria type\" to \"Relative date\" and click \"Add criteria\"\n- in the \"Modification Date\" criteria:\n\n - for \"Which day\", select \"Now\"\n - for \"In the past or future\", select \"In the past\"\n - for \"More or less\", select \"Less than\"\n\n2. Install the `@@fire-topicitems-events` view\n----------------------------------------------\n\nInstall this product using buildout\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn `buildout.cfg`::\n \n eggs +=\n collective.topicitemsevent\n\nAfterwards, install the product using the Plone \"Add-on products\" controlpanel.\n\nCheck that it works\n~~~~~~~~~~~~~~~~~~~\n\nGo to your newly created Topic and call the `@@fire-topicitems-events` view on\nit. You should have administrator permissions to do this. If all goes well, you\nshould be redirected to the Topic's default view, and you will see a status\nmessage that says \"Firing TopicItemEvent for: \", followed by a list of item\ntitles and their urls.\n \n3. Configure Content Rule\n-------------------------\n\nCreating the Content Rule\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n1. Via Plone's control panel, go to the \"Content Rules Control Panel\" \n (`/@@rules-controlpanel`).\n2. Add a content rule. As the \"Triggering event\" select \"Topic Item Event\". \n Give it a meaningful title. For now, we'll use \"Send e-mail notifications \n about modifications\".\n3. The new rule will show up in the Rules Control Panel. Click it to add an\n action. Under the header \"Perform the following actions\", you can select\n any Content Rule action. \n4. For now, just select \"Send email\", click \"Add\" and configure the email. \n (Use the `${title}` and `${url}` variables, so the people who get the mail \n know what it's about.)\n5. You might also want to add a \"Notify user\" action. This is handy when\n testing the content rule: You'll see the status message(es) after using the \n `@@fire-topicitems-events` view.\n\nAdding the Content Rule\n~~~~~~~~~~~~~~~~~~~~~~~\n\n1. Go to the root of the Plone Site, click \"Rules\" and add the rule for the \n site.\n2. Afterwards, select the rule and click \"Apply to subfolders\".\n\nTesting the Content Rule\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow go to your Topic and call `@@fire-topicitems-events` again.\n\n4. Call the View at intervals\n-----------------------------\n\nWe'll assume you use Cron4Plone_ for this, but you might also use a cron job.\nYou need to call the view as administrator, the Cron4Plone documentation will\ntell you how.\n\nIn the Cron4Plone configuraton screen, you should have a line like::\n \n 30 2 * * portal/test-topic/@@fire-topicitems-events\n\nWhere 'test-topic' refers to your Topic's id. This will call the view each\nnight at 02:30 AM.\n\nIssues\n======\n\n1. This solution doesn't keep track of which e-mails were sent. When changing\n the Topic's date range, or the cron interval, notifications my be sent \n multiple times or not at all. This issue will likely never be resolved.\n\n2. You can likely not have multiple contentrules listening on the \"Topic Item\n Event. If you have multiple contentrules listening on the \"Topic Item Event\",\n there's no way of knowing which Topic the Content Rule's Event was fired\n from. \n \n a. One way to workaround this is to activate the Content Rule on a\n specific Folder. You'd have to be careful though: this might get \n complicated very quickly.\n\n b. You could also protect your Content Rule with an extra filtering\n condition. For example, if you have a rule that makes expired content\n private, and you're afraid that this rule will come into action as a\n result of a TopicItemEvent being fired from an unrelated Topic (which\n unfortunately lists an item that is not to be made private) , then you\n could add `python: DateTime() > here.getExpirationDate()` as a TALES\n expression condition. This will ensure the rule only comes into action if\n the item is expired.\n\n.. _Cron4Plone: http://pypi.python.org/pypi/Products.cron4plone\n\nChangelog\n=========\n\n1.0 (2012-06-13)\n----------------\n- Stable release\n\n0.1.1 (2011-11-28)\n------------------\n\n- Documentation update: How to use a TALES expression in a Plone Content Rule\n to check on dates (ExpirationDate, EffectiveDate).\n\n0.1 (2011-11-21)\n----------------\n\n- package info changes (setup.py)\n\n0.1dvl (2011-10-26)\n-------------------\n\n- Initial release", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://plone.org/products/collective.topicitemsevent", "keywords": "Plone notifications", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "collective.topicitemsevent", "package_url": "https://pypi.org/project/collective.topicitemsevent/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/collective.topicitemsevent/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://plone.org/products/collective.topicitemsevent" }, "release_url": "https://pypi.org/project/collective.topicitemsevent/1.0/", "requires_dist": null, "requires_python": null, "summary": "Facilitate flexible scheduled notifications in Plone: Fire 'Topic Item Events' for items in a Topic", "version": "1.0" }, "last_serial": 432124, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ce69900bca2a38f871a4df5cc853d22c", "sha256": "fa4f4ec4dfc8c2627af8396df44a8b2a8ab7c1ea5a209645e4af78d5e29c396d" }, "downloads": -1, "filename": "collective.topicitemsevent-0.1.tar.gz", "has_sig": false, "md5_digest": "ce69900bca2a38f871a4df5cc853d22c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15223, "upload_time": "2011-11-21T16:02:24", "url": "https://files.pythonhosted.org/packages/73/42/7e0d09f491d96c9c4f36d1c5eb37524247baefcc9c99878c8c592b78b48c/collective.topicitemsevent-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "0b43a6db380295304a7845858102a049", "sha256": "b4e7f4d20a87a7fd3aebf2fe2a7abfee357485378c677eb6c4b0d2d80910d510" }, "downloads": -1, "filename": "collective.topicitemsevent-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0b43a6db380295304a7845858102a049", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16151, "upload_time": "2011-11-28T15:40:38", "url": "https://files.pythonhosted.org/packages/ff/4a/3b689014b94dca488a308ae44e01e7000ccd4b0df2ec74f7d68a2457e243/collective.topicitemsevent-0.1.1.tar.gz" } ], "0.1dvl": [ { "comment_text": "", "digests": { "md5": "d50cd63dab91c1761d3b32f2a7581d4c", "sha256": "38cc596fec1681537ed44f5c8c4a92648a277d2d07313b67e53642ba4c0a65b6" }, "downloads": -1, "filename": "collective.topicitemsevent-0.1dvl.tar.gz", "has_sig": false, "md5_digest": "d50cd63dab91c1761d3b32f2a7581d4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5512, "upload_time": "2011-10-26T14:17:37", "url": "https://files.pythonhosted.org/packages/fe/9b/58613e2bca366728b331b3ca4bae1664f58781ef33e0e83ae05497c6bcc6/collective.topicitemsevent-0.1dvl.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "e3a6db05697629c07069c73e8830b8b4", "sha256": "3f10f059ae9098026991092b5682c17fb19dbf6403489f51c960e1137d8fa18c" }, "downloads": -1, "filename": "collective.topicitemsevent-1.0.zip", "has_sig": false, "md5_digest": "e3a6db05697629c07069c73e8830b8b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26037, "upload_time": "2012-06-13T12:14:37", "url": "https://files.pythonhosted.org/packages/fe/af/01544baf16f03fa994f0d5d46a40372acdcb4aa22348eeba4b395c0d855a/collective.topicitemsevent-1.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e3a6db05697629c07069c73e8830b8b4", "sha256": "3f10f059ae9098026991092b5682c17fb19dbf6403489f51c960e1137d8fa18c" }, "downloads": -1, "filename": "collective.topicitemsevent-1.0.zip", "has_sig": false, "md5_digest": "e3a6db05697629c07069c73e8830b8b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26037, "upload_time": "2012-06-13T12:14:37", "url": "https://files.pythonhosted.org/packages/fe/af/01544baf16f03fa994f0d5d46a40372acdcb4aa22348eeba4b395c0d855a/collective.topicitemsevent-1.0.zip" } ] }