{ "info": { "author": "Kevin Brown", "author_email": "kbrown@rediker.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4" ], "description": ".. image:: https://travis-ci.org/Rediker-Software/olp.svg?branch=master\n :target: https://travis-ci.org/Rediker-Software/olp\n\nObject-level permissions (OLP)\n==============================\nDjango has supported object-level permissions since Django 1.2, but it\nrequires a custom authentication backend to implement it. There are\n`tons of implementations `_\nout there, but most of them are meant to handle specific situations.\n\nFeatures\n========\nLike most other implementations, OLP is meant to handle a few specific cases\nwhich we encountered.\n\nDifferent types of \"groups\"\n---------------------------\nDjango has a concept of \"users\" and \"groups\" which the authentication system\nis built upon. These groups only consist of a single model and cannot be\nbuilt upon to have different, distinct types. OLP allows you to have multiple\nmodels contribute to an individual user's permissions, even on the object\nlevel.\n\nThe different models can have independent permissions, and do not need to be\ndirectly attached to a user. If they are attached to a user (and specified\nin the settings), they can contribute to a user's overall permissions.\n\nDirect integration\n------------------\nOLP is directly integrated with Django's authentication backends. While it\nis not required to use OLP, it is recommended as it makes it easier to use\nOLP.\n\nNormalization of methods\n------------------------\nOnly the user and groups models have `has_perm` functions, and that becomes a\nquick limitation when working with other models. OLP patches the other\nmodels (as specified in the settings) and gives them ``has_perm`` methods\nwhich act the same way as the ones given to users and groups.\n\nIn order to make assigning and removing permissions as easy as checking them,\nOLP will also patch all of the models with ``assign_perm`` and ``remove_perm``\nmethods.\n\nSettings\n========\nOLP determines the settings from the Django settings file using the key\n``OLP_SETTINGS``. This must be a dictionary which contains the key ``models``,\nas shown below.\n\n.. code :: python\n\n OLP_SETTINGS = {\n \"models\": (\n ),\n }\n\nThe ``models`` key should contain a tuple of tuples containing the string path\nto the model and the queryset filter used to filter by a user.\n\nExample\n=======\nexample/settings.py\n\n.. code :: python\n\n OLP_SETTINGS = {\n \"models\": (\n (\"django.contrib.auth.models.Group\", \"users\"),\n ),\n }\n\nexample/models.py\n\n.. code :: python\n\n from django.db import models\n\n class Apple(models.Model):\n owner = models.ForeignKey(\"auth.User\")\n\n class Meta:\n permissions = (\n (\"can_see_apple\", \"User can see the apple.\"),\n )\n\npython shell\n\n.. code :: python\n\n >>> from olp.utils import patch_models\n >>> patch_models()\n >>> from example.models import Apple\n >>> from django.contrib.auth import Group, User\n >>> user = User.objects.all()[0]\n >>> group = Group.objects.all()[0]\n >>> apple = Apple(owner=user)\n >>> apple.save()\n >>> user.has_perm(\"example.can_see_apple\", apple)\n False\n >>> user.assign_perm(\"can_see_apple\", apple)\n True\n >>> user.has_perm(\"example.can_see_apple\", apple)\n True\n >>> user.remove_perm(\"example.can_see_apple\", apple)\n True\n >>> user.has_perm(\"example.can_see_apple\", apple)\n False\n >>> group.has_perm(\"example.can_see_apple\", apple)\n False\n >>> group.assign_perm(\"example.can_see_apple\", apple)\n True\n >>> group.has_perm(\"example.can_see_apple\", apple)\n True\n >>> user.has_perm(\"example.can_see_apple\", apple)\n True\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Rediker-Software/olp", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "olp", "package_url": "https://pypi.org/project/olp/", "platform": "", "project_url": "https://pypi.org/project/olp/", "project_urls": { "Homepage": "https://github.com/Rediker-Software/olp" }, "release_url": "https://pypi.org/project/olp/0.3.0/", "requires_dist": [ "Django (>=1.3)" ], "requires_python": "", "summary": "Object-level permissions across multiple models for Django.", "version": "0.3.0" }, "last_serial": 3855268, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "228c44f36d49665fe964d2ab520aa1bc", "sha256": "d9efc4df09d05200279d2cee4940c8728a861805ae8af749e03a5b3ab2b45607" }, "downloads": -1, "filename": "olp-0.0.2.tar.gz", "has_sig": false, "md5_digest": "228c44f36d49665fe964d2ab520aa1bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3249, "upload_time": "2013-06-28T15:53:15", "url": "https://files.pythonhosted.org/packages/f4/64/8f80b06514ca6c6eee599f427270347ffcd632d1296c8b57339d39abe366/olp-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "c212850ea3936fd568c195ffd37173aa", "sha256": "c82e98b4d8728f4bf3aafbd9c541191b5786f737a45f6dcd591d518ae5d02416" }, "downloads": -1, "filename": "olp-0.0.3.tar.gz", "has_sig": false, "md5_digest": "c212850ea3936fd568c195ffd37173aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3288, "upload_time": "2013-06-28T15:59:44", "url": "https://files.pythonhosted.org/packages/e1/ba/c48f553ac1eaf7012b39368f3108b87ea4b17dbf9b84bc420b324c4917f7/olp-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "eeb87bb0d6aafe5aa8c0161c4c0a6f78", "sha256": "d04d6fdda70af6323a79368197146a01e237d44746c39ec01642eb346be34a41" }, "downloads": -1, "filename": "olp-0.0.4.tar.gz", "has_sig": false, "md5_digest": "eeb87bb0d6aafe5aa8c0161c4c0a6f78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3390, "upload_time": "2013-07-05T16:59:57", "url": "https://files.pythonhosted.org/packages/af/83/2de2639cd4b7b25c5df2ec4dd2f2f7f1edba588dbcc87ecf1a708079e065/olp-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "43b7b045779f285ca43b85d32d00cc1b", "sha256": "a444d40706df0e49ed6a4de8cf44611ce2b42c699f5cc6c66f6ca0e5cebe026b" }, "downloads": -1, "filename": "olp-0.0.5.tar.gz", "has_sig": false, "md5_digest": "43b7b045779f285ca43b85d32d00cc1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3690, "upload_time": "2013-08-01T19:50:31", "url": "https://files.pythonhosted.org/packages/c5/ff/54f3b157fa74167a7da29883513786867ac13807fcb0f45f04befc812f1e/olp-0.0.5.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "7a976ccc0c62d501e1705a2d73392439", "sha256": "e6a5d5935142e7786cc487df9fa37f40ba937acefc3b90c89d37eb9ab06e29fa" }, "downloads": -1, "filename": "olp-0.1.0.tar.gz", "has_sig": false, "md5_digest": "7a976ccc0c62d501e1705a2d73392439", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5226, "upload_time": "2013-11-18T21:47:49", "url": "https://files.pythonhosted.org/packages/11/75/d74113468d4a787413fddb7ade45d42e270792b987eb848efd9d9d55ee62/olp-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "c525ab75ea3719c83244c68e47b03f6a", "sha256": "ac334921df3a60d714892c78a6b5c52a4956cce11f66e935260ce4fc7d80950a" }, "downloads": -1, "filename": "olp-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c525ab75ea3719c83244c68e47b03f6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5208, "upload_time": "2013-11-27T15:18:07", "url": "https://files.pythonhosted.org/packages/a1/d6/5788ce4afc08812c393a295bf1dc91d49eb1bd15a73661d05ad224ec28dc/olp-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7e62856661493107e66b64c634ab2d30", "sha256": "7481b62091f049a87d90782c9dca8a479541ef478af5ec0831b30243c7f371db" }, "downloads": -1, "filename": "olp-0.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "7e62856661493107e66b64c634ab2d30", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8500, "upload_time": "2015-03-31T21:32:28", "url": "https://files.pythonhosted.org/packages/b5/3d/f9f2cddd38330803271c5c18fc1cc4d537a8bbcae222df0eaaa9e0ab63f8/olp-0.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7f0d575097322d222702570f4f38e9a", "sha256": "a38f201a633429966ce5f83474ff825427a2b5e19e575a2440fa5fbcb5145727" }, "downloads": -1, "filename": "olp-0.1.2.tar.gz", "has_sig": false, "md5_digest": "e7f0d575097322d222702570f4f38e9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5458, "upload_time": "2015-03-31T21:32:25", "url": "https://files.pythonhosted.org/packages/dc/be/f7d95c4cf2ffa31bbb995b5776c9f5c563af26c6fd34caa14c0416c02418/olp-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ec4a37a649857bbb13289dd7109f4261", "sha256": "79ce890b82d32ad1a20f6a82b8541f36ba08fc2205fbf5081732992b4b0663c6" }, "downloads": -1, "filename": "olp-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "ec4a37a649857bbb13289dd7109f4261", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8657, "upload_time": "2015-09-16T20:44:11", "url": "https://files.pythonhosted.org/packages/be/7a/97f9c919f23cc711159aef0be8c92858397ee3eef86fed6243a4ef3137d7/olp-0.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f9c906d125ba7fd33f0a52828b90316e", "sha256": "0548b3d12fb086a194662182bc03f14799b196d5f1c46ca88587415d3eca2135" }, "downloads": -1, "filename": "olp-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f9c906d125ba7fd33f0a52828b90316e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5644, "upload_time": "2015-09-16T20:44:02", "url": "https://files.pythonhosted.org/packages/75/9d/eb56ec9df4afb0eaadb4c118e6b764eec3f120510daeca73670e9e982ea2/olp-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "built for Linux-4.4.0-24-generic-x86_64-with-glibc2.7", "digests": { "md5": "74d9a67678955bb2eba36926f6b9d8cf", "sha256": "c1805d0f848f1f18900996bd5694a41b3c449970ecfc5d61b59c003e7e034f27" }, "downloads": -1, "filename": "olp-0.2.1.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "74d9a67678955bb2eba36926f6b9d8cf", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 9349, "upload_time": "2016-06-22T15:24:01", "url": "https://files.pythonhosted.org/packages/2a/36/0163ae43aaa84d2a689d154bfe879557b2a49e08c5ba6dfb25c07a7d3641/olp-0.2.1.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "9e01b5845322abee3d88a0b24df8af71", "sha256": "9911c79eb384809d53baba0223afd310ab89329300a1808d834a3aae9d8c36a2" }, "downloads": -1, "filename": "olp-0.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "9e01b5845322abee3d88a0b24df8af71", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8665, "upload_time": "2016-06-22T15:25:32", "url": "https://files.pythonhosted.org/packages/3f/24/5260c0c8cd8e024555782e1007e82e96eb6909dc4333d914af64d289d45f/olp-0.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "870625007b33ccbf37c282dfdb164c8e", "sha256": "82ed0db855cb35f73263c04a553692dd8a0503e5ec6bc12349911a6516a064ef" }, "downloads": -1, "filename": "olp-0.2.1.tar.gz", "has_sig": false, "md5_digest": "870625007b33ccbf37c282dfdb164c8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5574, "upload_time": "2016-06-22T15:23:32", "url": "https://files.pythonhosted.org/packages/d2/0d/ca286b1b98255203095eefa8eaa0cf3c081803ff8a22842e02c387002db6/olp-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "7ef1553c3b2f5fb5ed740e6b009f11b4", "sha256": "42fa30eec1a6609bb1060936c982e5ad0665bbee8d084142beb46641f7811d20" }, "downloads": -1, "filename": "olp-0.2.2-py2-none-any.whl", "has_sig": false, "md5_digest": "7ef1553c3b2f5fb5ed740e6b009f11b4", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8871, "upload_time": "2016-11-08T19:43:47", "url": "https://files.pythonhosted.org/packages/cb/01/432cc54a1691c8c202ddc377150ab4a81ba7fcd929079c1af97ff7d29128/olp-0.2.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fa3f4567489b130107e5a29adcd80a5", "sha256": "d3ee55e589a642878776064b4d1ad8c802610602dfe326b95001f0ad61b5e536" }, "downloads": -1, "filename": "olp-0.2.2-py3.4.egg", "has_sig": false, "md5_digest": "6fa3f4567489b130107e5a29adcd80a5", "packagetype": "bdist_egg", "python_version": "3.4", "requires_python": null, "size": 13658, "upload_time": "2017-06-01T11:54:12", "url": "https://files.pythonhosted.org/packages/7e/c1/a84eab29f044e8bc617245c8ae74d95578e3f641a1314abb6a789da0dcea/olp-0.2.2-py3.4.egg" }, { "comment_text": "", "digests": { "md5": "68dcc5a5798eb29eaef26af0e444d29e", "sha256": "48c27d41bab485c862f3d38a58eeb95d38850018c3d11a7029ea7349fd62ebce" }, "downloads": -1, "filename": "olp-0.2.2.zip", "has_sig": false, "md5_digest": "68dcc5a5798eb29eaef26af0e444d29e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10752, "upload_time": "2016-11-08T19:38:43", "url": "https://files.pythonhosted.org/packages/cb/4d/699d6e21657267ebc0adf1a492cb94a5b81e85ab3c522215b3506e70c39b/olp-0.2.2.zip" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "f08f4e459f9a98175d7229e5f09682e0", "sha256": "26c95ebb9a7ef0c2245a79f596ff30a41043ac73ba5bb60a09abeccd4228d8d2" }, "downloads": -1, "filename": "olp-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f08f4e459f9a98175d7229e5f09682e0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9021, "upload_time": "2017-06-01T11:54:11", "url": "https://files.pythonhosted.org/packages/97/0d/04cd0bc61c79e111230550c5e8bbd71ef4c250d0d3bf8296973996985dd5/olp-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6acca9bf0f4a06cf41c3a098e3100146", "sha256": "5d990152957cc4c19f72fcc9ef65e3430202e1a024b72b6eb95125dbea3ef525" }, "downloads": -1, "filename": "olp-0.2.3.tar.gz", "has_sig": false, "md5_digest": "6acca9bf0f4a06cf41c3a098e3100146", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5819, "upload_time": "2017-06-01T11:54:14", "url": "https://files.pythonhosted.org/packages/fa/07/d9589c66291c97f0953ebf8756c13a52b75b88bf658485726207daf37f3c/olp-0.2.3.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a7ef33d77fd9899df0bf83288d079ab4", "sha256": "54cace4cb8a8d431e489b0e274935c75dbbc5a63be75ee4e3ea69a6ad1c77254" }, "downloads": -1, "filename": "olp-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a7ef33d77fd9899df0bf83288d079ab4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6802, "upload_time": "2018-05-11T19:44:26", "url": "https://files.pythonhosted.org/packages/e9/dc/3d07aac20d36b3420dbf2121d2a08fb49e42125b6bda680d30a7ae4df30e/olp-0.3.0-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a7ef33d77fd9899df0bf83288d079ab4", "sha256": "54cace4cb8a8d431e489b0e274935c75dbbc5a63be75ee4e3ea69a6ad1c77254" }, "downloads": -1, "filename": "olp-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a7ef33d77fd9899df0bf83288d079ab4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6802, "upload_time": "2018-05-11T19:44:26", "url": "https://files.pythonhosted.org/packages/e9/dc/3d07aac20d36b3420dbf2121d2a08fb49e42125b6bda680d30a7ae4df30e/olp-0.3.0-py2.py3-none-any.whl" } ] }