{
"info": {
"author": "Yiorgis Gozadinos",
"author_email": "ggozad@jarn.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 3 - Alpha",
"Framework :: Plone",
"Intended Audience :: Developers",
"Programming Language :: Python"
],
"description": "Introduction\n============\n\n``jarn.xmpp.collaboration`` defines a protocol to do real-time collaborative editing through XMPP and provides:\n\n* a generic overridable implementation of the server component.\n* a Plone-specific implementation (server component and javascript client).\n* adapters for basic Plone content types (Pages and News Items).\n\nIt is part of a suite of packages aiming to provide XMPP services to Plone. The other two packages are\n\n* `jarn.xmpp.twisted`_, provides XMPP-specific protocol implementation for twisted.\n* `jarn.xmpp.core`_ provides facilities for presence, messaging, chatting and microblogging.\n\nRequirements\n============\nPlease see ``jarn.xmpp.core`` for details on setting up your Plone site and XMPP server. If you are not using the recipe included in `jarn.xmpp.buildout` you will need to configure your ejabberd to allow connections from the collaboration component. For ``ejabberd`` this is done by including the following in your config file::\n\n {{5347, {0,0,0,0} }, ejabberd_service, [\n {access, all},\n {shaper_rule, fast},\n {ip, {127, 0, 0, 1}},\n {hosts, [\"collaboration.localhost\"],\n [{password, \"secret\"}]\n }\n ]},\n\n\nThe instance that is going to be running the xmpp component should include the ``component.zcml``. You can do this in your buildout::\n\n zcml-additional =\n \n \n \n \n\nFinally you will need to \"activate\" the product in the Plone control panel. After doing so, please edit the registry settings and in particular:\n\n* ``jarn.xmpp.collaborationJID`` is the Jabber id of the collaborative editing service component. Essentially if ``myserver`` is your XMPP domain ``collaboration.myserver`` is a good name. This should match the name you gave to ``ejabberd``, see above. Default is ``collaboration.localhost``.\n\n* ``jarn.xmpp.collaborationPassword`` is the password the component will use to connect to your xmpp server, see above. Default is ``secret``.\n\n* ``jarn.xmpp.collaborationPort`` is the port that your XMPP server allows components to connect to, see above. Default is ``5347``.\n\nUsage\n=====\n\nUsing ``jarn.xmpp.collaboration`` is easy once you have gotten over setting it up. There are no special views to use when you collaboratively edit content. If an adapter to *ICollaborativelyEditable* exists for your content then accessing its edit form will allow multiple users to edit simultaneously.\n\nOut of the box there exist adapters for archetypes as well as dexterity-based content types. For AT content types, fields that implement ``IStringField`` or ``ITextField`` will automatically get collaborative editing support. For Dexterity the fields that will be automatically included are those that provide ``ITextLine``, ``IText`` or ``IRichText`` regardless of the *behavior* by which they are defined. Note that the javascript client assumes that TinyMCE is used. Collaboration on rich text fields will not work with Kupu.\n\nProtocol specification.\n=========================\n\nInitialization\n--------------\nIn order to initiate a collaborative editing session, the party sends a ``presence`` stanza to the server component indicating on which node he wishes to work on. The party MUST specify the `node` attribute in the ``query`` element::\n\n \n \n \n\nUpon receipt a ``message`` stanza is sent to anyone else who might be editing the same node notifying them of the new participant::\n\n \n \n \n \n \n\nThe newly joined user also receives a similar notification about existing users ::\n\n \n \n \n \n \n\nTo complete the initialization the new party MUST request the current version of the node from the server::\n\n \n \n \n\nTo which the server replies providing his current copy of the text::\n\n \n Hello world\n \n\nIn case the node does not exist, or the user has no privileges granting him access, the server MUST reply with an error, for instance::\n\n \n Unauthorized\n \n\n\nEditing cycle\n-------------\nWhen a party edits the text, it notifies the server by sending an ``iq`` stanza of type ``set``. The stanza contains one ``patch`` element which MUST specify the `node` they apply to, and in their body contain the patch created by the Diff-Match-Patch algorithm in text format. For instance if the text changed from \"`Hello world`\" to \"`Hello world, have a nice day!`\" the message would be::\n\n \n \n @@ -4,8 +4,26 @@\\n lo world\\n+, have a nice day!\\n\n \n \n\nIf the server succeeds to apply the patch to its shadow copy, it replies with a `success` result::\n\n \n \n \n\nAdditionally the server MUST broadcast the patch to all other parties who are present on the node::\n\n \n \n @@ -4,8 +4,26 @@\\n lo world\\n+, have a nice day!\\n\n \n \n\nThe parties MUST apply it to their text.\nIf applying the patch fails, the server (or client) MUST reply with an ``iq`` stanza of type `error`. For instance if a patch was sent to the server and for some reason it was not possible to apply it to the shadow copy, the server would reply::\n\n \n \n Patch @@ -4,8 +4,26 @@\\n lo world\\n+, have a nice day!\\n could not be applied.\n \n \n\nIn that case the client SHOULD sync again the current copy by sending an ``iq`` stanza of type `get`requesting the shadow copy, see the `Initialization` section above.\n\nFinally, a ``patch`` element MAY have the ``digest`` attribute. In that case, the server SHOULD check the checksum and if there is a mismatch, reply with an error stanza if appropriate. Note that currently the checksum algorithm is not negotiated and is assumed to be MD5 hex digest.\n\nFocusing\n--------\nIn an environment where multiple nodes are edited in the same time (for instance in a context where the content has more than one collaboratively editable field) the client CAN send a notification specifying which particular node he is currently editing::\n\n \n \n \n \n \n\nThe server MUST propagate the message to all other users that are currently collaborating on the node::\n\n \n \n \n \n \n\nSaving\n------\nAt any point a party can request a save. This is done by sending a message whose `item` MUST indicate the node and its action must be set to `save`::\n\n \n \n \n \n \n\nIt is up to the server component to enforce any security considerations on saving.\n\nTermination\n-----------\nThe session is terminated when the party sends an `unavailable` presence::\n\n \n\nUpon receipt, the server notifies any party that might still be editing the node::\n\n \n \n \n \n \n\nCredits\n=======\n\n* Most of this work was done using the 10% time available to `Jarn AS`_ employees for the development of open-source projects.\n* David Glick (davisagli) for dexterity support and general awesomeness.\n* ``jarn.xmpp.collaboration`` relies on the wonderful `Diff-Match-Patch`_ from Neil Fraser at Google. It is distributed under the Apache License 2.0.\n\n.. _Diff-Match-Patch: http://code.google.com/p/google-diff-match-patch\n.. _Jarn AS: http://jarn.com\n.. _jarn.xmpp.twisted: http://pypi.python.org/pypi/jarn.xmpp.twisted\n.. _jarn.xmpp.core: http://pypi.python.org/pypi/jarn.xmpp.core\n\n\n\nChangelog\n=========\n\n0.1b3 - 2011-11-26\n------------------\n\n- Fix checksum bug preventing the shadow text to be applied if an error ever\n occured.\n [ggozad]\n\n0.1b2 - 2011-10-01\n------------------\n\n- Perform checksum checks on every patch. Deal with potential errors due to\n network lag.\n [ggozad]\n\n- Use TinyMCE's raw instead of processed text. Improved reliability.\n [ggozad]\n\n0.1b1 - 2011-09-18\n------------------\n\n- Major protocol update. Instead of sending message stanzas around, now iq\n stanzas are used. This makes it possible to check for errors and synchronize\n in certain edge cases. It also makes the protocol more in line with XMPP\n conventions.\n [ggozad]\n\n- Reorganized and cleaned js code. The client protocol implementation is now\n separate from the plone-specific parts allowing code reuse and improving\n readability.\n [ggozad]\n\n- Notify user when others are joining/leaving the node.\n [ggozad]\n\n0.1a4 - 2011-09-07\n------------------\n\n- Documentation updates.\n [ggozad]\n\n- Fix js error when user has left collaborative editing.\n [ggozad]\n\n0.1a3 - 2011-09-01\n------------------\n\n- Simplified configuration and fixed confusing typos in the registry\n [ggozad]\n\n0.1a2 - 2011-06-06\n------------------\n\n- Configure the component/server password and connection port in p.a.registry.\n [ggozad]\n\n- Dexterity content type support.\n [davisagli, ggozad]\n\n- Generalized ATContentTypes support.\n [ggozad]\n\n- Provide visual feedback when a user updates a node.\n [ggozad]\n\n- JS cleanup.\n [ggozad]\n\n- Test coverage.\n [ggozad]\n\n0.1a1 2011-05-09\n----------------\n\n- Initial release\n [ggozad]",
"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/ggozad/jarn.xmpp.collaboration",
"keywords": "",
"license": "GPL",
"maintainer": null,
"maintainer_email": null,
"name": "jarn.xmpp.collaboration",
"package_url": "https://pypi.org/project/jarn.xmpp.collaboration/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/jarn.xmpp.collaboration/",
"project_urls": {
"Download": "UNKNOWN",
"Homepage": "https://github.com/ggozad/jarn.xmpp.collaboration"
},
"release_url": "https://pypi.org/project/jarn.xmpp.collaboration/0.1b3/",
"requires_dist": null,
"requires_python": null,
"summary": "Collaborative editing for Plone",
"version": "0.1b3"
},
"last_serial": 793577,
"releases": {
"0.1a1": [
{
"comment_text": "",
"digests": {
"md5": "09de6f5969b76c7d345f02e6a069ad6a",
"sha256": "7fb2798583b1b80b0fcaf59c2e073ca37283944bd7defa6f833b547b7128808a"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1a1.zip",
"has_sig": false,
"md5_digest": "09de6f5969b76c7d345f02e6a069ad6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 64517,
"upload_time": "2011-05-09T15:20:02",
"url": "https://files.pythonhosted.org/packages/12/5b/c0d5441a3eda1db8ba511dabc4a043f3a97522768b6156ba8a734dc3949e/jarn.xmpp.collaboration-0.1a1.zip"
}
],
"0.1a2": [
{
"comment_text": "",
"digests": {
"md5": "c8a20c3ec29ba946d01d3a0938e94e26",
"sha256": "3bdb5e89155a982dd2612238e00f946f1b4fd995d4e663d7f4fa730d2c078880"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1a2.zip",
"has_sig": false,
"md5_digest": "c8a20c3ec29ba946d01d3a0938e94e26",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 70608,
"upload_time": "2011-06-06T22:56:08",
"url": "https://files.pythonhosted.org/packages/06/5c/a57afe43c1a80ae0bf57336531b89f4a43e206a5c5ffabcffb921b3f3184/jarn.xmpp.collaboration-0.1a2.zip"
}
],
"0.1a3": [
{
"comment_text": "",
"digests": {
"md5": "383e6cb97840c7bbdd1f6670803c07e4",
"sha256": "91a9b0baa0f69341a1b5a484eeaf4a0297b3f03a1039072bda28204c21bbfc6a"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1a3.zip",
"has_sig": false,
"md5_digest": "383e6cb97840c7bbdd1f6670803c07e4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 70693,
"upload_time": "2011-09-01T17:28:14",
"url": "https://files.pythonhosted.org/packages/89/68/535b6a9691f14f73c7a5a8519a92ba4e60dab79e4bb006f9d9f3b0ce47a4/jarn.xmpp.collaboration-0.1a3.zip"
}
],
"0.1a4": [
{
"comment_text": "",
"digests": {
"md5": "5314493d20820e646e159073271629db",
"sha256": "f76e96469c9b96c62cae153aae4c5ff25821dd87623a59ef2a6db6477917fa53"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1a4.zip",
"has_sig": false,
"md5_digest": "5314493d20820e646e159073271629db",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 71542,
"upload_time": "2011-09-07T13:22:07",
"url": "https://files.pythonhosted.org/packages/9f/28/f8698e50db78546e5659aebbd660149f4b6a27386ed2eb14325d58d3514f/jarn.xmpp.collaboration-0.1a4.zip"
}
],
"0.1b1": [
{
"comment_text": "",
"digests": {
"md5": "40b04eb366e7c8708cab8e56e48ab4ac",
"sha256": "87e0d77b8f6a9c949cec7a41ebe09d2a9ca58f485d14b68076f79a3a189f79d9"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1b1.zip",
"has_sig": false,
"md5_digest": "40b04eb366e7c8708cab8e56e48ab4ac",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 75586,
"upload_time": "2011-09-18T12:59:53",
"url": "https://files.pythonhosted.org/packages/a4/54/ca8b95962e6376f0998b37fa5379aaa6239bec47255d954477fa36cc9de4/jarn.xmpp.collaboration-0.1b1.zip"
}
],
"0.1b2": [
{
"comment_text": "",
"digests": {
"md5": "5b4825df18d30499d670263f51bced39",
"sha256": "b093e40bde40da70ee9d41899f4dcabc961378ac13bcba0cbec8758566d5584d"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1b2.zip",
"has_sig": false,
"md5_digest": "5b4825df18d30499d670263f51bced39",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 76893,
"upload_time": "2011-10-01T18:51:39",
"url": "https://files.pythonhosted.org/packages/1d/1b/866c4719c49ad1ed351d2ac5e2bb9936bbe34b8ab221026f63dd133a9f3a/jarn.xmpp.collaboration-0.1b2.zip"
}
],
"0.1b3": [
{
"comment_text": "",
"digests": {
"md5": "dfd6b02fed4f10bbe86e47850cbd17a6",
"sha256": "6468dbae569c3af15216fed72ad4f77d7a846807f60e43c28c8486582389b5cb"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1b3.zip",
"has_sig": false,
"md5_digest": "dfd6b02fed4f10bbe86e47850cbd17a6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 77096,
"upload_time": "2011-11-26T14:27:54",
"url": "https://files.pythonhosted.org/packages/10/4e/d565081dc4982e3324c44d755951171d4a3a12c8a0d4998aa9e0b402ccd4/jarn.xmpp.collaboration-0.1b3.zip"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "dfd6b02fed4f10bbe86e47850cbd17a6",
"sha256": "6468dbae569c3af15216fed72ad4f77d7a846807f60e43c28c8486582389b5cb"
},
"downloads": -1,
"filename": "jarn.xmpp.collaboration-0.1b3.zip",
"has_sig": false,
"md5_digest": "dfd6b02fed4f10bbe86e47850cbd17a6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 77096,
"upload_time": "2011-11-26T14:27:54",
"url": "https://files.pythonhosted.org/packages/10/4e/d565081dc4982e3324c44d755951171d4a3a12c8a0d4998aa9e0b402ccd4/jarn.xmpp.collaboration-0.1b3.zip"
}
]
}