{ "info": { "author": "redzej", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP" ], "description": "# graphene-permissions\n\n**Permission system for graphene-django apps.**\n\n[![Build Status](https://travis-ci.org/redzej/graphene-permissions.svg?branch=master)](https://travis-ci.org/redzej/graphene-permissions)\n[![PyPI version](https://badge.fury.io/py/graphene-permissions.svg)](https://badge.fury.io/py/graphene-permissions)\n[![Python 3.6](https://img.shields.io/badge/python-3.6-green.svg)](https://www.python.org/downloads/release/python-360/)\n[![codecov](https://codecov.io/gh/redzej/graphene-permissions/branch/master/graph/badge.svg)](https://codecov.io/gh/redzej/graphene-permissions)\n[![Maintainability](https://api.codeclimate.com/v1/badges/12b39435f888adf2370b/maintainability)](https://codeclimate.com/github/redzej/graphene-permissions/maintainability)\n\n\n## Overview\n\nDRF-inspired permission system based on classes for graphene-django. Allows easy customization of permission classes for\nfor queries and mutations.\n\n\n## Requirements\n\n* Python 3.5+\n* Django 2.0+\n* graphene-django 2.0+\n\n## Installation\n\nInstall using pip:\n\n```commandline\npip install graphene-permissions\n```\n\n## Example\n\nTo enforce permission system, add appropriate mixin and set attribute `permission_classes`.\n\n\n```python\n### models.py\nfrom django.db import models\n\n\nclass Pet(models.Model):\n name = models.CharField(max_length=32)\n race = models.CharField(max_length=64)\n```\n```python\n### schema.py\nfrom graphene import relay\nfrom graphene_django import DjangoObjectType\nfrom graphene_permissions.mixins import AuthNode\nfrom graphene_permissions.permissions import AllowAuthenticated\n\n\nclass PetNode(AuthNode, DjangoObjectType):\n permission_classes = (AllowAuthenticated,)\n\n class Meta:\n model = Pet\n filter_fields = ('name',)\n interfaces = (relay.Node,)\n```\n\n## Docs\n\n### Setting up permission check\nFor queries use `AuthNode` mixin and inherite from `AuthFilter` class.\n```python\nclass AllowAuthenticatedPetNode(AuthNode, DjangoObjectType):\n permission_classes = (AllowAuthenticated,)\n\n class Meta:\n model = Pet\n filter_fields = ('name',)\n interfaces = (relay.Node,)\n\n\nclass AllowAuthenticatedFilter(AuthFilter):\n permission_classes = (AllowAuthenticated,)\n\n\nclass PetsQuery:\n user_pet = relay.Node.Field(AllowAuthenticatedPetNode)\n all_user_pets = AllowAuthenticatedFilter(AllowAuthenticatedPetNode)\n```\n\nFor mutations use `AuthMutation` mixin.\n```python\nclass AuthenticatedAddPet(AuthMutation, ClientIDMutation):\n permission_classes = (AllowAuthenticated,)\n pet = graphene.Field(AllowAuthenticatedPetNode)\n\n class Input:\n name = graphene.String()\n race = graphene.String()\n owner = graphene.ID()\n\n @classmethod\n def mutate_and_get_payload(cls, root, info, **input):\n if cls.has_permission(root, info, input):\n owner = User.objects.get(pk=from_global_id(input['owner'])[1])\n pet = Pet.objects.create(name=input['name'], race=input['race'], owner=owner)\n return AuthenticatedAddPet(pet=pet)\n return AuthenticatedAddPet(pet=None)\n\n\nclass PetsMutation:\n authenticated_add_pet = AuthenticatedAddPet.Field()\n```\n\n### Customizing permission classes\nDefault permission classes are: `AllowAny`, `AllowAuthenticated`, `AllowStaff`.\nYou can set up equal permission for both queries and mutations with one class, simply subclass one of these classes \nand to limit access for given object, override appropriate method. Remember to return `true` if user should be given \naccess and `false`, if denied.\n\n```python\nclass AllowMutationForStaff(AllowAuthenticated):\n @staticmethod\n def has_node_permission(info, id):\n # logic here \n # return boolean\n\n @staticmethod\n def has_mutation_permission(root, info, input):\n if info.request.user.is_staff:\n return True\n return False\n\n @staticmethod\n def has_filter_permission(info):\n # logic here\n # return boolean\n```\n\n### Multiple permissions\nYou can set up multiple permissions checks, simply adding more classes. Permission is evaluated for every class.\nIf one of the checks fails, access is denied.\n\n```python\nclass CustomPetNode(AuthNode, DjangoObjectType):\n permission_classes = (AllowAuthenticated, AllowStaff, AllowCustom)\n\n class Meta:\n model = Pet\n interfaces = (relay.Node,)\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/redzej/graphene-permissions", "keywords": "graphene django permissions permission system", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "graphene-permissions", "package_url": "https://pypi.org/project/graphene-permissions/", "platform": "", "project_url": "https://pypi.org/project/graphene-permissions/", "project_urls": { "Homepage": "https://github.com/redzej/graphene-permissions" }, "release_url": "https://pypi.org/project/graphene-permissions/1.1.2/", "requires_dist": [ "django-filter (>=2.*)", "graphene (>=2.*)", "graphene-django (>=2.0.0)" ], "requires_python": ">=3.5", "summary": "Simple graphene-django permission system.", "version": "1.1.2" }, "last_serial": 5115515, "releases": { "1.0.12": [ { "comment_text": "", "digests": { "md5": "8753279d78cb835410d84407d8eeb5b5", "sha256": "cc78da832decc409851dd3bc129849a1da799251605e7841fc8c27937c99ed4f" }, "downloads": -1, "filename": "graphene-permissions-1.0.12.tar.gz", "has_sig": false, "md5_digest": "8753279d78cb835410d84407d8eeb5b5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3909, "upload_time": "2018-03-01T01:22:26", "url": "https://files.pythonhosted.org/packages/71/ec/778a8ee8ac9af1a971c0d1fffd3c5827380507ba046280f6c63d98aabb3d/graphene-permissions-1.0.12.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d00b3daba88ffba0abe845a13f9a281d", "sha256": "087455fc5ec8127e446bfafeb46411bd634d85918d96b04b930b20aa6d8f9109" }, "downloads": -1, "filename": "graphene_permissions-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d00b3daba88ffba0abe845a13f9a281d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4362, "upload_time": "2018-05-23T11:23:01", "url": "https://files.pythonhosted.org/packages/7a/79/8b2df1851c731911cf683cd5992937ce6a6ece490f08eef3a05d64f97d02/graphene_permissions-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a8631d42abe6cbb2cfb04ba69ebbd8df", "sha256": "8a45855f13d1ad0e891f2360477f1501bb9aeadaf0dc77cc4b3c250e9d22b2ae" }, "downloads": -1, "filename": "graphene-permissions-1.1.0.tar.gz", "has_sig": false, "md5_digest": "a8631d42abe6cbb2cfb04ba69ebbd8df", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 3940, "upload_time": "2018-05-23T11:30:04", "url": "https://files.pythonhosted.org/packages/38/94/67168b4bb42f6a357f825ae296840e2ffda52ac80251662c9b07e1523572/graphene-permissions-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "c99f3ac9af06bd577b31e81111722b97", "sha256": "75cddb6bd3b45e1101c9ce1ef652e4468d42119905dea00b1e179b74ed0f90e9" }, "downloads": -1, "filename": "graphene_permissions-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c99f3ac9af06bd577b31e81111722b97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4357, "upload_time": "2018-07-25T00:53:02", "url": "https://files.pythonhosted.org/packages/03/f6/186555293b9e5ba27bf671c76d8d6225740af5710c8e3e0d0e8315519b38/graphene_permissions-1.1.1-py3-none-any.whl" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "0c9ca0443b5306b9d7e0b17018e78ffe", "sha256": "472a1f16b31da2bfaf422d523f6602377dab64ce25a4608ec70a9b440dcd4afe" }, "downloads": -1, "filename": "graphene_permissions-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0c9ca0443b5306b9d7e0b17018e78ffe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 5347, "upload_time": "2019-04-08T20:39:55", "url": "https://files.pythonhosted.org/packages/60/a1/a430192635f4ea191d07d40ce9d558fef93a3a37e62984017a0fc0c234a8/graphene_permissions-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1910bc9fa61a34e3e3854146c558697a", "sha256": "2ec6d0663911744cb46484d648daddf5caee22a3eaaf02607ec0f423a9121052" }, "downloads": -1, "filename": "graphene-permissions-1.1.2.tar.gz", "has_sig": false, "md5_digest": "1910bc9fa61a34e3e3854146c558697a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4134, "upload_time": "2019-04-08T20:39:56", "url": "https://files.pythonhosted.org/packages/7f/85/96f36a663164f660051cf28d9d22c8c07191a85959a0e0270103ad7c1d02/graphene-permissions-1.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0c9ca0443b5306b9d7e0b17018e78ffe", "sha256": "472a1f16b31da2bfaf422d523f6602377dab64ce25a4608ec70a9b440dcd4afe" }, "downloads": -1, "filename": "graphene_permissions-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0c9ca0443b5306b9d7e0b17018e78ffe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 5347, "upload_time": "2019-04-08T20:39:55", "url": "https://files.pythonhosted.org/packages/60/a1/a430192635f4ea191d07d40ce9d558fef93a3a37e62984017a0fc0c234a8/graphene_permissions-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1910bc9fa61a34e3e3854146c558697a", "sha256": "2ec6d0663911744cb46484d648daddf5caee22a3eaaf02607ec0f423a9121052" }, "downloads": -1, "filename": "graphene-permissions-1.1.2.tar.gz", "has_sig": false, "md5_digest": "1910bc9fa61a34e3e3854146c558697a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 4134, "upload_time": "2019-04-08T20:39:56", "url": "https://files.pythonhosted.org/packages/7f/85/96f36a663164f660051cf28d9d22c8c07191a85959a0e0270103ad7c1d02/graphene-permissions-1.1.2.tar.gz" } ] }