# Permission Manager
A simple way to manage object permissions.
## Install
```bash
pip install permission-manager
```
## Example
Use `BasePermissionManager`
```python
import dataclasses
from permission_manager import BasePermissionManager, PermissionResult
@dataclasses.dataclass
class User:
name: str
@dataclasses.dataclass
class Person:
first_name: str
last_name: str
status: str
class PersonPermissionManager(BasePermissionManager):
instance: Person
def has_create_permission(self):
return True
def has_delete_permission(self):
return self.user.name == 'admin'
def has_access_permission(self):
if self.instance.status == 'excommunicado':
return PermissionResult('Due status')
return True
manager = PersonPermissionManager()
manager.has_permission('create')
# same as
# manager.has_create_permission()
# > True
manager = PersonPermissionManager(
instance=Person(
first_name='John',
last_name='Wick',
status='excommunicado',
),
user=User(name='Ms. Perkins'),
)
manager.has_permission('delete')
# > False
manager.has_permission('access')
# > PermissionResult(value=False, message=['Due status'])
manager.resolve()
# > {'access': False, 'create': True, 'delete': False}
manager.resolve(with_messages=True)
# > {'access': {'allow': False, 'messages': ['Due status']},
# 'create': {'allow': True, 'messages': None},
# 'delete': {'allow': False, 'messages': None}}
```
Also, it's include `PermissionManager`, which add additional functionality to check parent permissions
```python
import dataclasses
from permission_manager import PermissionManager
class PostPermissionManager(PermissionManager):
instance: 'Post'
def has_update_permission(self):
return self.instance.status == 'draft'
@dataclasses.dataclass
class Post:
title: str
status: str = 'draft'
permission_manager = PostPermissionManager
class ImagePermissionManager(PermissionManager):
parent_attr = 'post'
instance: 'Image'
def has_update_permission(self):
return self.parent_permission_manager.has_permission('update')
@dataclasses.dataclass
class Image:
post: Post
file: str
post = Post(title='Test')
manager = ImagePermissionManager(
instance=Image(
post=post,
file='/path/to/file',
),
)
manager.has_permission('update')
# > True
post.status = 'published'
manager.has_permission('update')
# > False
```
Raw data
{
"_id": null,
"home_page": "https://github.com/kindlycat/permission-manager",
"name": "permission-manager",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "permissions",
"author": "Grigory Mishchenko",
"author_email": "grishkokot@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/18/c1/c1c744c0622703883e8d898807ea62f04113125f5472c536c0270527f3fa/permission_manager-0.3.0.tar.gz",
"platform": null,
"description": "# Permission Manager\n\nA simple way to manage object permissions.\n\n## Install\n\n```bash\npip install permission-manager\n```\n\n## Example\n\nUse `BasePermissionManager`\n\n```python\nimport dataclasses\nfrom permission_manager import BasePermissionManager, PermissionResult\n\n\n@dataclasses.dataclass\nclass User:\n name: str\n\n\n@dataclasses.dataclass\nclass Person:\n first_name: str\n last_name: str\n status: str\n\n\nclass PersonPermissionManager(BasePermissionManager):\n instance: Person\n\n def has_create_permission(self):\n return True\n \n def has_delete_permission(self):\n return self.user.name == 'admin'\n\n def has_access_permission(self):\n if self.instance.status == 'excommunicado':\n return PermissionResult('Due status')\n return True\n\n\nmanager = PersonPermissionManager()\nmanager.has_permission('create')\n# same as \n# manager.has_create_permission()\n# > True\n\nmanager = PersonPermissionManager(\n instance=Person(\n first_name='John',\n last_name='Wick',\n status='excommunicado',\n ),\n user=User(name='Ms. Perkins'),\n)\nmanager.has_permission('delete')\n# > False\nmanager.has_permission('access')\n# > PermissionResult(value=False, message=['Due status'])\n\nmanager.resolve()\n# > {'access': False, 'create': True, 'delete': False}\nmanager.resolve(with_messages=True)\n# > {'access': {'allow': False, 'messages': ['Due status']},\n# 'create': {'allow': True, 'messages': None},\n# 'delete': {'allow': False, 'messages': None}}\n```\n\nAlso, it's include `PermissionManager`, which add additional functionality to check parent permissions\n\n```python\nimport dataclasses\nfrom permission_manager import PermissionManager\n\n\nclass PostPermissionManager(PermissionManager):\n instance: 'Post'\n\n def has_update_permission(self):\n return self.instance.status == 'draft'\n\n\n@dataclasses.dataclass\nclass Post:\n title: str\n status: str = 'draft'\n\n permission_manager = PostPermissionManager\n\n \nclass ImagePermissionManager(PermissionManager):\n parent_attr = 'post'\n instance: 'Image'\n \n def has_update_permission(self):\n return self.parent_permission_manager.has_permission('update')\n\n\n@dataclasses.dataclass\nclass Image:\n post: Post\n file: str\n\npost = Post(title='Test')\nmanager = ImagePermissionManager(\n instance=Image(\n post=post,\n file='/path/to/file',\n ),\n)\nmanager.has_permission('update')\n# > True\npost.status = 'published'\nmanager.has_permission('update')\n# > False\n```\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A simple way to manage object permissions.",
"version": "0.3.0",
"project_urls": {
"Homepage": "https://github.com/kindlycat/permission-manager",
"Repository": "https://github.com/kindlycat/permission-manager"
},
"split_keywords": [
"permissions"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b62c2564fbff09d76408ff6c9cfbf2ca1f9e17afd2205f736e4de9c8d3cd0878",
"md5": "bbb3d2c732a6a5f0f33106928de307ba",
"sha256": "d8ae285e56ef9dd8f6dbabeac891e26369ee7041f3b37e277d9479a0a8e1e50d"
},
"downloads": -1,
"filename": "permission_manager-0.3.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bbb3d2c732a6a5f0f33106928de307ba",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 6050,
"upload_time": "2024-04-28T01:56:04",
"upload_time_iso_8601": "2024-04-28T01:56:04.534423Z",
"url": "https://files.pythonhosted.org/packages/b6/2c/2564fbff09d76408ff6c9cfbf2ca1f9e17afd2205f736e4de9c8d3cd0878/permission_manager-0.3.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "18c1c1c744c0622703883e8d898807ea62f04113125f5472c536c0270527f3fa",
"md5": "496f600efef5fd00904f3a7188d56309",
"sha256": "c4fe863380f49dd6489d94ed0fa57aa81d1eb4b8b2ea3ebaf9805f51e8a28f8d"
},
"downloads": -1,
"filename": "permission_manager-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "496f600efef5fd00904f3a7188d56309",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 5144,
"upload_time": "2024-04-28T01:56:06",
"upload_time_iso_8601": "2024-04-28T01:56:06.292461Z",
"url": "https://files.pythonhosted.org/packages/18/c1/c1c744c0622703883e8d898807ea62f04113125f5472c536c0270527f3fa/permission_manager-0.3.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-28 01:56:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "kindlycat",
"github_project": "permission-manager",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "permission-manager"
}