{ "info": { "author": "Petr Olah", "author_email": "djangoguru@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "=============================\ndjango-fperms\n=============================\n\n.. image:: https://badge.fury.io/py/django-fperms.svg\n :target: https://badge.fury.io/py/django-fperms\n\n.. image:: https://travis-ci.org/Formulka/django-fperms.svg?branch=master\n :target: https://travis-ci.org/Formulka/django-fperms\n\n.. image:: https://codecov.io/gh/Formulka/django-fperms/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/Formulka/django-fperms\n\nThe flexible permissions library uses a custom permission model, that when installed patches itself into the standard django authentication library.\n\nDocumentation\n-------------\n\nThe full documentation is at https://django-fperms.readthedocs.io.\n\nQuickstart\n----------\n\nInstall django-fperms::\n\n pip install django-fperms\n\nAdd it to your `INSTALLED_APPS`:\n\n.. code-block:: python\n\n INSTALLED_APPS = (\n ...\n 'fperms.apps.FPermsConfig',\n ...\n )\n\n\nOut of the box you have access to several new permission types:\n\n- **generic**: for general purpose project wide permissions\n- **model**: for per model permissions (similar to django default permissions)\n- **instance**: for per instance permissions, similar to model permissions but specific per instance\n- **field**: for per model field permissions, similar to model permissions but specific per model field, work in progress\n\nYou can also create your own permission model subclassing the abstract base permission class:\n\n.. code-block:: python\n\n fperms.models.BasePerm\n\nand setting the ``PERM_MODEL`` variable in your project settings with the path to your custom model. E.g.\n\n.. code-block:: python\n\n ...\n PERM_MODEL='fperms.models.Perm'\n ...\n\nYou can find an example of custom permission model at https://github.com/formulka/django-fperms-iscore\n\nUsage\n-----\n\nA superuser has for all intents and purposes permission to do everything. For regular users you can assign permissions directly or via a user group.\n\n**Creating a new permission**:\n\nYou can create a new permission directly via its model or via a specially formated string:\n\n.. code-block:: python\n\n from fperms import enums\n from fperms.models import Perm\n\n Perm.objects.create(\n type=enums.PERM_TYPE_GENERIC,\n codename='export',\n )\n Perm.objects.create_from_str('generic.export')\n\n**Assigning a permission**:\n\nYou can assign existing permission via the custom ``perms`` manager available for both User (including custom ones) and Group models. You can add single permission or multiple both directly via its instance or using the formated string:\n\n.. code-block:: python\n\n from django.auth.models import User, Group\n\n from fperms.models import Perm\n\n perm_export = Perm.objects.create(\n type=enums.PERM_TYPE_GENERIC,\n codename='export',\n )\n perm_import = Perm.objects.create(\n type=enums.PERM_TYPE_GENERIC,\n codename='import',\n )\n\n user = User.objects.get(pk=1)\n user.perms.add_perm(perm_export)\n user.perms.add_perm(perms=[perm_export, perm_import])\n\n group = Group.objects.get(pk=1)\n group.perms.add_perm(perms=['generic.export', 'generic.import'])\n\nBy default if said permission does not exist, it will raise an exception. You can override this behavior by setting ``PERM_AUTO_CREATE`` variable in your project settings to ``True``, assigning a permission will then create it as well if it does not exist.\n\n**Retrieving permission instance**:\n\nYou can get a permission instance directly from the model or via the string representation.\n\n.. code-block:: python\n\n perm = Perm.objects.get(type=enums.PERM_TYPE_GENERIC, codename='export')\n perm = Perm.objects.get_from_str('generic.export')\n\n**Checking permission**:\n\nYou can check whether the user or group has a required permission via ``has_perm`` method of the ``perms`` manager again using both the permission instance or the string representation.\n\n.. code-block:: python\n\n ...\n perm = Perm.objects.create(\n type=enums.PERM_TYPE_GENERIC,\n codename='export',\n )\n\n assert user.perms.has_perm(perm)\n assert user.perms.has_perm('generic.export')\n\nBuilt in perm types\n-------------------\n\n**generic**\n\n- generic permission useful for project wide permissions\n- type is defined as ``fperms.enums.PERM_TYPE_GENERIC``, it is the default permission type\n- it requires ``type`` and ``codename`` fields (type being default only the codename is actually required)\n- string representation is ``'generic.'``\n\n.. code-block:: python\n\n ...\n # equivalent results:\n Perm.objects.create(\n codename='export',\n )\n Perm.objects.create_from_str('generic.export')\n\n**model**\n\n- model level permission analogous to the builtin django permissions\n- type is defined as ``fperms.enums.PERM_TYPE_MODEL``\n- it requires ``type``, ``content_type`` and ``codename`` fields\n- django admin is using codenames ``add``, ``change`` and ``delete`` for its inner workings\n- string representation is ``'model...'``\n\n.. code-block:: python\n\n from fperms import enums\n from fprems.utils import get_content_type\n ...\n # equivalent results:\n Perm.objects.create(\n type=enums.PERM_TYPE_MODEL,\n content_type=get_content_type(Article),\n codename='add',\n )\n Perm.objects.create_from_str('model.articles.Article.add')\n\n**object**\n\n- model level permission specific per object\n- type is defined as ``fperms.enums.PERM_TYPE_OBJECT``\n- it requires ``type``, ``content_type``, ``object_id`` and ``codename`` fields\n- django admin is using codenames ``add``, ``change`` and ``delete`` for its inner workings\n- string representation is ``'object...'``\n\n.. code-block:: python\n\n from fperms import enums\n from fprems.utils import get_content_type\n ...\n article = Article.objects.get(pk=1)\n # equivalent results:\n Perm.objects.create(\n type=enums.PERM_TYPE_OBJECT,\n content_type=get_content_type(Article),\n object_id=article.pk,\n codename='add',\n )\n Perm.objects.create_from_str('object.articles.Article.add', obj_id=article.pk)\n\n # creating multiple permissions for a single object at once is supported\n Perm.objects.create_from_str(perms=[\n 'object.articles.Article.add',\n 'object.articles.Article.change',\n 'object.articles.Article.delete',\n ], obj_id=article.pk)\n\n**field**\n\n- model level permission specific per model field\n- type is defined as ``fperms.enums.PERM_TYPE_FIELD``\n- it requires ``type``, ``content_type``, ``field_name`` and ``codename`` fields\n- string representation is ``'field....'``\n- TODO: this permission type is not fully implemented yet\n\n.. code-block:: python\n\n from fperms import enums\n from fprems.utils import get_content_type\n ...\n article = Article.objects.get(pk=1)\n # equivalent results:\n Perm.objects.create(\n type=enums.PERM_TYPE_FIELD,\n content_type=get_content_type(Article),\n field_name='name',\n codename='add',\n )\n Perm.objects.create_from_str('field.articles.Article.name.add')\n\nAdmin\n-----\n\nFlexible permisssions support django admin interface, to enable them you need to first update the list of authentication backends in your project settings:\n\n.. code-block:: python\n\n AUTHENTICATION_BACKENDS = [\n 'django.contrib.auth.backends.ModelBackend',\n 'fperms.backends.PermBackend',\n ]\n\nand then simply subclass the ``fperms.admin.PermModelAdmin`` instead of the regular ``admin.ModelAdmin``:\n\n.. code-block:: python\n\n from django.contrib import admin\n from fperms.admin import PermModelAdmin\n\n from articles.models import Article\n\n\n @admin.register(Article)\n class ArticleAdmin(PermModelAdmin):\n pass\n\nTo enable per-instance permission support, set ``perms_per_instance`` property of the admin class to ``True``.\n\n.. code-block:: python\n\n ...\n @admin.register(Article)\n class ArticleAdmin(PermModelAdmin):\n\n perms_per_instance = True\n\nUser still needs model level permission for each model it should be able to access via admin site.\n\nIf the ``perms_per_instance`` option is set to ``True``, author of a new instance will automatically receive the permission to update and delete said instance.\nYou can override this behavior by setting ``perms_per_instance_author_change`` and ``perms_per_instance_author_delete`` admin properties respectively to ``False``.\n\nRunning Tests\n-------------\n\nDoes the code actually work?\n\n::\n\n source /bin/activate\n (myenv) $ pip install tox\n (myenv) $ tox\n\nCredits\n-------\n\nTools used in rendering this package:\n\n* Cookiecutter_\n* `cookiecutter-djangopackage`_\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`cookiecutter-djangopackage`: https://github.com/pydanny/cookiecutter-djangopackage\n\n\n\n\nHistory\n-------\n\n0.1.0 (2018-02-13)\n++++++++++++++++++\n\n* First release on PyPI.", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/formulka/django-fperms/archive/0.4.5.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/formulka/django-fperms", "keywords": "django-fperms", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-fperms", "package_url": "https://pypi.org/project/django-fperms/", "platform": "", "project_url": "https://pypi.org/project/django-fperms/", "project_urls": { "Download": "https://github.com/formulka/django-fperms/archive/0.4.5.tar.gz", "Homepage": "https://github.com/formulka/django-fperms" }, "release_url": "https://pypi.org/project/django-fperms/0.4.5/", "requires_dist": null, "requires_python": "", "summary": "Flexible Django permissions backend", "version": "0.4.5" }, "last_serial": 5672304, "releases": { "0.4.0": [ { "comment_text": "", "digests": { "md5": "a256965024970765df9df925b5e8be42", "sha256": "7036a7b8a68a7a0c967b92ffabba50a112e9e6ca24c236d38834d03b82341af1" }, "downloads": -1, "filename": "django-fperms-0.4.0.tar.gz", "has_sig": false, "md5_digest": "a256965024970765df9df925b5e8be42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12682, "upload_time": "2018-04-17T13:40:32", "url": "https://files.pythonhosted.org/packages/70/d0/f5a587bef0d29a9e40f7eea2921868ae56ab13bf6e41a9f627e8ef42ffe6/django-fperms-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "77650bee5a4ce6cd4c2f0b639efb4df5", "sha256": "37342daf062adf1b6f9a822851fcc0fb52ad92ed76b24e6f77c1d6f169bf67af" }, "downloads": -1, "filename": "django-fperms-0.4.1.tar.gz", "has_sig": false, "md5_digest": "77650bee5a4ce6cd4c2f0b639efb4df5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12686, "upload_time": "2018-04-25T11:57:35", "url": "https://files.pythonhosted.org/packages/82/ea/a88c1607c31b761dec02313b629614f2e8dc03e89aabeb2c358d2173d2e2/django-fperms-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "313b7e724d8acd923d4e3a33fd01598c", "sha256": "cbd5d4b144c48c3e40c2bcc633e3c046e7102d0b6a41570f3029cf0de668a012" }, "downloads": -1, "filename": "django-fperms-0.4.2.tar.gz", "has_sig": false, "md5_digest": "313b7e724d8acd923d4e3a33fd01598c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12714, "upload_time": "2018-04-27T09:15:39", "url": "https://files.pythonhosted.org/packages/f1/95/e5b7cc394032c75c11077a311057c84f640a259639049611e8eab6a2c74d/django-fperms-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "1ee80b6371b4390f52f2559da3c41437", "sha256": "545eccb9082315bb67c5417c6a64545345b822ee194884ac83c6bc704694b25a" }, "downloads": -1, "filename": "django-fperms-0.4.3.tar.gz", "has_sig": false, "md5_digest": "1ee80b6371b4390f52f2559da3c41437", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12835, "upload_time": "2019-08-12T08:38:09", "url": "https://files.pythonhosted.org/packages/68/d4/5880c6d6db96cc809f787d0bbd4b8395bee41a231b3d2bd392c5177cad5e/django-fperms-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "7946c0fb3bc8b6fe5111254defb3a36f", "sha256": "75bcf921faa10d2e60c4492361f5128166933d247458ff487eceec151f6af307" }, "downloads": -1, "filename": "django-fperms-0.4.4.tar.gz", "has_sig": false, "md5_digest": "7946c0fb3bc8b6fe5111254defb3a36f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12839, "upload_time": "2019-08-13T14:24:51", "url": "https://files.pythonhosted.org/packages/a7/c0/2827153504b7b582e66f2f3aeb8a292d46ee32f1d83532d850392c0f6732/django-fperms-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "ca7c25f9076d9dc7f083b96ece9cc4d5", "sha256": "4e0a54c98f99896af2db15317a839233ccc3757304e676c4fecd0787f26ac99b" }, "downloads": -1, "filename": "django-fperms-0.4.5.tar.gz", "has_sig": false, "md5_digest": "ca7c25f9076d9dc7f083b96ece9cc4d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14133, "upload_time": "2019-08-13T14:58:54", "url": "https://files.pythonhosted.org/packages/a5/19/c24220a4b8ee8eb8f6d86faab493f00e328cdfa3fc939e1baf2bcf09f2d6/django-fperms-0.4.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ca7c25f9076d9dc7f083b96ece9cc4d5", "sha256": "4e0a54c98f99896af2db15317a839233ccc3757304e676c4fecd0787f26ac99b" }, "downloads": -1, "filename": "django-fperms-0.4.5.tar.gz", "has_sig": false, "md5_digest": "ca7c25f9076d9dc7f083b96ece9cc4d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14133, "upload_time": "2019-08-13T14:58:54", "url": "https://files.pythonhosted.org/packages/a5/19/c24220a4b8ee8eb8f6d86faab493f00e328cdfa3fc939e1baf2bcf09f2d6/django-fperms-0.4.5.tar.gz" } ] }