{ "info": { "author": "Maurits van Rees", "author_email": "maurits@vanrees.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Plone", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Framework :: Plone :: 5.1", "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", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Introduction\n============\n\ndexterity.membrane enables dexterity content items to be used as users and groups in Plone sites and integrates with Products.membrane.\n\n.. image:: https://travis-ci.org/collective/dexterity.membrane.png\n :target: https://travis-ci.org/collective/dexterity.membrane\n\n\nCompatibility\n-------------\n\nThis package has been tested and developed for Plone 4.2+\nIn fact it will only work on that version (or higher) as we require uuid support.\nWe highly recommend using Python 2.7.\nIt may work on Python 2.6, but we are not testing with that version (and at least the tests have some code that only works on 2.7).\n\nWe depend on Products.membrane 2.0.2 or higher as that contains a fix to make sure members that are deleted are also removed from the membrane_tool catalog.\n\n\nUser id\n-------\n\nAs user id we use the uuid that is generated for the content item.\nThis only works on Plone 4.1 and higher.\nSee the definition of ``getUserId`` in the ``user.py`` behavior.\n\nIf you define your own member content type, you should enable the ``plone.app.referenceablebehavior.referenceable.IReferenceable`` behavior on it as that gives uuid support.\nThis also means members can be referenced from Archetypes content.\n\n\nEmail as login name\n-------------------\n\nThis package contains a member content type that has an email field.\nThis is used as login name by the behavior.\nSee ``getUserName``.\nOther implementations are possible, so we do not force you to use the email address as the login name in your site.\n\nBy default, this is on, but you can switch it off in our control panel.\nThe setting is saved in the Plone registry.\n\nAside from this, it is probably a good idea to also switch on the use_email_as_login property of Plone itself.\nThe only effect this has as far as this package is concerned, is that some text in login forms is changed:\nyou see ``email address`` as label instead of ``login name``, mostly.\nTo enable this, you can put this in ``propertiestool.xml`` (Plone 4), possibly in a custom package for your project::\n\n \n \n \n True\n \n \n\n\nWarning about changing settings\n-------------------------------\n\nIt is best to configure the settings once, and then not touch them anymore.\nIf you change the settings when you already have created members, some reindexing may be needed.\nIf there are just a few members, editing and saving them all will be the easiest way.\nIf you have dozens or hundreds of members this is not very practical.\nFuture versions might automate this.\nIf you are interested in helping, a `pull request `_ would be nice.\n\n\nMember content type\n-------------------\n\nThis package defines a member content type, but this may be considered an example;\nfeel free to create a different type and only use the behaviors or create your own adaptations of them.\n\n\nBehaviors\n---------\n\n``dexterity.membrane.behavior.user.IMembraneUser``\n this makes the content behave as a membrane user, defining a way to get the user id (``getUserId``) and login name (``getUserName``).\n\n``dexterity.membrane.behavior.password.IProvidePasswords``\n adds a password and confirmation field to your dexterity content.\n This is used during authentication.\n\n``dexterity.membrane.behavior.group.IMembraneGroup``\n this makes the content behave as a membrane group, defining a way to get the group id (``getGroupId``) and group name (``getGroupName``).\n\n\nMembrane implementation\n-----------------------\n\n``Products.membrane.interfaces.IMembraneUserAuth``\n we implement authentication using the email field and the password field.\n\n``Products.membrane.interfaces import IMembraneUserProperties``\n we provide a read-only mapping from the first and last name fields of our own ``IMember`` schema to the fullname user property.\n We have a read-write mapping for the email, home_page/homepage and description/bio properties/fields for ``IMember``.\n\n\nLocal roles\n-----------\n\nThis package defines a local role provider.\nIt makes sure a logged in user gets the local Reader, Editor and Creator roles on the membrane object that belongs to that user.\n\n\nWorkflow\n--------\n\nWe define a simple workflow with pending/approved states.\nA user can only login when in the approved state.\n\n\nEncryption\n----------\n\nAs of 1.1.0b3, dexterity.membrane uses bcrypt_ to encrypt new passwords.\nThis change maintains support for existing SSHA passwords.\n\n.. _bcrypt: https://en.wikipedia.org/wiki/Bcrypt\n\nChangelog\n=========\n\n\n2.1.0 (2019-06-01)\n------------------\n\n- Depend on plone.api\n [ale-rt]\n- Fixed some docstring\n [ale-rt]\n- Biography: plone.app.textfield RichText field for Plone 5\n [ksuess]\n- Fix AttributeError: 'tuple' object has no attribute 'strip'\n [b4oshany]\n\n\n2.0.1 (2018-01-18)\n------------------\n\n- Performance improvements: cache expensive bcrypt operations\n [ale-rt]\n\n\n2.0 (2017-10-21)\n----------------\n\n- Removed collective.indexing dependency. Collective.indexing was merged into Plone 5.1\n If you're using this package with a Plone version < than 5.1, please add collective.indexing manually and pin Products.membrane to < 4.\n [agitator]\n\n- Dropping official support for Plone < 4.3, use 1.2.x for older versions of Plone.\n [agitator]\n\n\n1.2 (2017-01-11)\n----------------\n\n- No longer officially support Python 2.6. See compatibility in readme.\n [maurits]\n\n- Enable use_email_as_username without use_uuid_as_userid.\n This fixes getUserId, which fixes the indexed user values,\n which fixes enumerateUsers.\n Warning: if you already have members and you change the settings,\n this may need reindexing, or editing and saving all users manually.\n Fixes https://github.com/collective/dexterity.membrane/issues/26\n [gyst]\n\n\n1.1.2 (2016-08-05)\n------------------\n\n- Added backwards compatibility import for ``membranepasswords.IProvidePasswords``.\n Otherwise z3c.relationfield may give problems when editing content.\n Fixes https://github.com/collective/dexterity.membrane/issues/23\n [mikejmets]\n\n\n1.1.1 (2016-07-06)\n------------------\n\n- A group might accidentally show up as a user.\n ``portal_membership.listMembers`` then says: ``AttributeError:\n 'NoneType' object has no attribute '__of__'``. We prevent this by\n implementing getUserId and getUserName on groups, returning the\n group id and group name. [maurits]\n\n\n1.1.0 (2015-10-07)\n------------------\n\n- Switch to bcrypt encryption for passwords\n (includes backwards-compatibility with existing SSHA passwords)\n [mgrbyte]\n\n\n1.1.0b2 (2015-03-03)\n--------------------\n\n- added BBB class for IMembraneGroup, IProvidePasswordsSchema and IMembraneUser\n [agitator]\n\n\n1.1.0b1 (2015-03-02)\n--------------------\n\n- fix release\n\n\n1.1.0b0 (2015-03-02)\n--------------------\n\n- support special characters/umlauts in passwords\n [agitator]\n\n- renaming with bbb imports: remove last ``membrane`` from all\n ``dexterity.membrane.behavior.membrane*``.\n [jensens]\n\n- fix: make ``PasswordProvider`` work. The whole was inactive and broken after\n activation.\n [jensens]\n\n- Get rid of deprecated plone.directives and use plone core functionality to\n achieve same goals. Also minor modernization of buildout.\n [jensens]\n\n- Declare plone.directives.form dependency.\n [vincentfretin]\n\n\n1.0 (2014-10-16)\n----------------\n\n- add a hook using a utility to add a password checker in own customization\n code. we may want to provide an default, but yet not sure how it should\n look like.\n [jensens]\n\n- make it easier to inherit passowrd for own behavior\n [jensens]\n\n- Remove grok dependency, refactor a bit to reduce complexity in one module.\n Attention: password related behaviour is now in own module. Needs update of\n customizations/own code after upgrade.\n [jensens]\n\n- Cleanup, pep8, plone-code-style, make tests fly again.\n [jensens]\n\n- Make get_full_name a method of MembraneUser so it can be easily customized.\n [cedricmessiant, vincentfretin]\n\n- Add French translations.\n [cedricmessiant]\n\n0.4 (2013-07-18)\n----------------\n\n- Add upgrade step to update the behavior profile. If you have\n installed the example content profile, you will see a warning in the\n Add-ons control panel that Plone does not know how to update this\n profile. We recommend that you deactivate it and then activate it\n again. Issue #7\n [maurits]\n\n- Rename content profile to example and rename behavior profile to\n default. Issue #7.\n [maurits]\n\n- Add Spanish and Brazilian Portuguese translations. [hvelarde]\n\n\n0.3 (2013-05-15)\n----------------\n\n- Fix installation problems when OS does not support symbolic links. Renamed\n ``README.txt`` to ``README.rst`` and updated ``setup.py`` to point to that\n file. This fixes #5.\n [saily]\n\n- Fix getattr in getPropertiesForUser to have a default value.\n [datakurre]\n\n\n0.2 (2013-02-19)\n----------------\n\n- Keep constistent with plone's email login #12187, so don't lowercase email\n addresses.\n [saily]\n\n- Add basic membrane group behavior\n [saily]\n\n\n0.1 (2012-09-20)\n----------------\n\n- Initial alpha release", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/dexterity.membrane", "keywords": "plone dexterity membrane", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "dexterity.membrane", "package_url": "https://pypi.org/project/dexterity.membrane/", "platform": "", "project_url": "https://pypi.org/project/dexterity.membrane/", "project_urls": { "Homepage": "https://github.com/collective/dexterity.membrane" }, "release_url": "https://pypi.org/project/dexterity.membrane/2.1.0/", "requires_dist": null, "requires_python": "", "summary": "Dexterity content and behaviors to integrate with membrane.", "version": "2.1.0" }, "last_serial": 5345929, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "c67d6e61818306a948146a378cfe82d2", "sha256": "890edd69f274be9fa86933a2a5f90dad7334b0d03a2db6b19a3d9c54a150a3dc" }, "downloads": -1, "filename": "dexterity.membrane-0.1.zip", "has_sig": false, "md5_digest": "c67d6e61818306a948146a378cfe82d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48484, "upload_time": "2012-09-20T08:50:52", "url": "https://files.pythonhosted.org/packages/66/f0/6001d0fcf85c9a2e81c1f3c0ad81808c39809f3b2dfc46b47f2c460b17ad/dexterity.membrane-0.1.zip" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "6467593e72dec05292e637baca4e6c3f", "sha256": "1e1a0dcc80499b4ad8673392b5986f5c6701a229583e1707eacdc46c1d978ec1" }, "downloads": -1, "filename": "dexterity.membrane-0.2.tar.gz", "has_sig": false, "md5_digest": "6467593e72dec05292e637baca4e6c3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30247, "upload_time": "2013-02-19T14:28:46", "url": "https://files.pythonhosted.org/packages/c6/55/ed91549180defe5a8483b6fc83fe6020b602a146b4995f816305156be1f8/dexterity.membrane-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "5d47ec18ef909f4a2687241ea852e3cd", "sha256": "1e5772c8c68a76a01ef74e4ee97995f4c8fb817e16edf41d9d0cb31fa03e315b" }, "downloads": -1, "filename": "dexterity.membrane-0.3.zip", "has_sig": false, "md5_digest": "5d47ec18ef909f4a2687241ea852e3cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50453, "upload_time": "2013-05-15T12:28:57", "url": "https://files.pythonhosted.org/packages/37/40/936c27379395a965b4cbee9755414ece87cd1b195d99210ba3c95cb20591/dexterity.membrane-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "e921c6f018075bc2212493e74bcac8ad", "sha256": "fe5723fe09810029e41570e5dbb710c58d4749e8b017f0811ff463186f05b1fd" }, "downloads": -1, "filename": "dexterity.membrane-0.4.zip", "has_sig": false, "md5_digest": "e921c6f018075bc2212493e74bcac8ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57652, "upload_time": "2013-07-18T21:03:04", "url": "https://files.pythonhosted.org/packages/de/a5/448e4735ffa081c4c22059baa79323870ff9d67211332580a8d9c341c397/dexterity.membrane-0.4.zip" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "63c7e22a28bb96aba144651d354e5d46", "sha256": "e9ee97d02044a7660c76105a76c31d907cc3712d7fba62fbacd4407ab5612318" }, "downloads": -1, "filename": "dexterity.membrane-1.0.zip", "has_sig": false, "md5_digest": "63c7e22a28bb96aba144651d354e5d46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53924, "upload_time": "2014-10-16T15:23:52", "url": "https://files.pythonhosted.org/packages/a4/68/fe72fa8b9087add56a142b09471ade61764799b7364dd891a283bfde6ca4/dexterity.membrane-1.0.zip" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "4835cf6b2edd12a7b319efd0a5ce9724", "sha256": "c335bab068d8bee834057be2cf13a5913a156b126095bd5c5aa0cd6d743cc54b" }, "downloads": -1, "filename": "dexterity.membrane-1.1.0.tar.gz", "has_sig": false, "md5_digest": "4835cf6b2edd12a7b319efd0a5ce9724", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35208, "upload_time": "2015-10-07T12:32:45", "url": "https://files.pythonhosted.org/packages/6e/e9/764813ee72638873e630c9f4f9eb47cd7474ac47cda4581055a1157e1e58/dexterity.membrane-1.1.0.tar.gz" } ], "1.1.0b0": [], "1.1.0b1": [ { "comment_text": "", "digests": { "md5": "59fb06a38d10f87591da4d65f148d160", "sha256": "5d7566a18c95ba090050a2b9f7a91aa7ed7b47d24a503e6f0c5af0c8526d3e27" }, "downloads": -1, "filename": "dexterity.membrane-1.1.0b1.zip", "has_sig": false, "md5_digest": "59fb06a38d10f87591da4d65f148d160", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55280, "upload_time": "2015-03-02T21:14:37", "url": "https://files.pythonhosted.org/packages/42/0f/897321dc52a08519e1e5b3dd25f5a80d06fcf96be7f568481d744083c72e/dexterity.membrane-1.1.0b1.zip" } ], "1.1.0b2": [ { "comment_text": "", "digests": { "md5": "3c8b9eb6974167290bdc9bba85f7c68e", "sha256": "bffa1b4ef314cce5fe81211aee7ecef0d7bfae210a9a8adf9d01cd386d4f5349" }, "downloads": -1, "filename": "dexterity.membrane-1.1.0b2.zip", "has_sig": false, "md5_digest": "3c8b9eb6974167290bdc9bba85f7c68e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56439, "upload_time": "2015-03-03T20:17:51", "url": "https://files.pythonhosted.org/packages/74/06/5b058ab2c6e9404ddc126035479f8357da2d892653ffc631c56a78f55f00/dexterity.membrane-1.1.0b2.zip" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "eac834f6554a2fe2fbbe5e6353eb6b72", "sha256": "2a9d26f4783b714e01083f5998deceae88ee2472f9b492a39cea2d8df9da1b3d" }, "downloads": -1, "filename": "dexterity.membrane-1.1.1.tar.gz", "has_sig": false, "md5_digest": "eac834f6554a2fe2fbbe5e6353eb6b72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35690, "upload_time": "2016-07-06T09:23:31", "url": "https://files.pythonhosted.org/packages/82/4c/780d753096d141774328af90973a736afb7c9888b64d5d27ec16e8a69826/dexterity.membrane-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "29ba970fe34b50b2c032e0dd0fed5070", "sha256": "0088fa79433b2d9680c1c8ba0287cd2571e3d22cc1e48a84833456df893778e4" }, "downloads": -1, "filename": "dexterity.membrane-1.1.2.tar.gz", "has_sig": false, "md5_digest": "29ba970fe34b50b2c032e0dd0fed5070", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35935, "upload_time": "2016-08-05T16:40:16", "url": "https://files.pythonhosted.org/packages/af/8c/1d00196de31e0b4c4c9fb9b83380ce77de5e7b016fc9eb0e5c755140d112/dexterity.membrane-1.1.2.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "454f5a3c1db10b66f6a59c89117c5c78", "sha256": "c8d1f939091312403c91e8dbc1efd82f4395b815170a04d13a70a11b897cbef1" }, "downloads": -1, "filename": "dexterity.membrane-1.2.tar.gz", "has_sig": false, "md5_digest": "454f5a3c1db10b66f6a59c89117c5c78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37460, "upload_time": "2017-01-11T21:55:17", "url": "https://files.pythonhosted.org/packages/a8/88/f011e4311c4ed4cb0c8c68f1d737ac4ec8de8fb3e9bc8d0cb46d4515af4e/dexterity.membrane-1.2.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "793fc46b12cd8589395b815b532e9407", "sha256": "55a185be38b6d8885add0b3e50405cd63186e865cd78c06770a6e5e7f337bed4" }, "downloads": -1, "filename": "dexterity.membrane-2.0.tar.gz", "has_sig": false, "md5_digest": "793fc46b12cd8589395b815b532e9407", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36985, "upload_time": "2017-10-21T08:31:16", "url": "https://files.pythonhosted.org/packages/e7/27/56bf4c506abce5aa4cac6dd60be6e43f6bba1ff2ba62fe2a13a634266cfd/dexterity.membrane-2.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "d99e196de11d1f0a9741d74624396877", "sha256": "1e697d6213f41e071e2fbf128fe219aff60c89dde429b0a75ad81d78257765e5" }, "downloads": -1, "filename": "dexterity.membrane-2.0.1.tar.gz", "has_sig": false, "md5_digest": "d99e196de11d1f0a9741d74624396877", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37216, "upload_time": "2018-01-18T12:19:33", "url": "https://files.pythonhosted.org/packages/76/de/382ef985ea54d999b7d138fb73b522506034d11738747d24f91882f87cb1/dexterity.membrane-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "57d4c2238fc9b428213aa6699797e597", "sha256": "a89286e52f121b0cf61abecbbb0a79c4aedc4be057ceeb77670034df1f80538b" }, "downloads": -1, "filename": "dexterity.membrane-2.1.0.tar.gz", "has_sig": false, "md5_digest": "57d4c2238fc9b428213aa6699797e597", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38907, "upload_time": "2019-06-01T09:37:35", "url": "https://files.pythonhosted.org/packages/92/7e/2b972bd8e88faac2e2bf1ba9a0527ebe0486a65cf118108bc4434958789a/dexterity.membrane-2.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "57d4c2238fc9b428213aa6699797e597", "sha256": "a89286e52f121b0cf61abecbbb0a79c4aedc4be057ceeb77670034df1f80538b" }, "downloads": -1, "filename": "dexterity.membrane-2.1.0.tar.gz", "has_sig": false, "md5_digest": "57d4c2238fc9b428213aa6699797e597", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38907, "upload_time": "2019-06-01T09:37:35", "url": "https://files.pythonhosted.org/packages/92/7e/2b972bd8e88faac2e2bf1ba9a0527ebe0486a65cf118108bc4434958789a/dexterity.membrane-2.1.0.tar.gz" } ] }