{ "info": { "author": "mongkok", "author_email": "domake.io@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 1 - Planning", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "Django GraphQL Extensions\n=========================\n\n|Pypi| |Wheel| |Build Status| |Codecov| |Code Climate|\n\nA collection of custom extensions for `Django GraphQL`_\n\n.. _Django GraphQL: https://github.com/graphql-python/graphene-django\n\n\nDependencies\n------------\n\n* Python \u2265 3.4\n* Django \u2265 1.11\n\n\nInstallation\n------------\n\nInstall last stable version from Pypi.\n\n.. code:: sh\n\n pip install django-graphql-extensions\n\n\nAuthentication\n--------------\n\n- ``@login_required``\n- ``@staff_member_required``\n- ``@permission_required``\n- ``@user_passes_test``\n\nSee the `documentation`_ to know the full list of decorators.\n\n.. _documentation: https://github.com/flavors/django-graphql-extensions/wiki/Auth-decorators\n\n.. code:: python\n\n from django.contrib.auth import get_user_model\n\n import graphene\n from graphql_extensions.auth.decorators import (\n login_required, staff_member_required,\n )\n\n\n class Query(graphene.ObjectType):\n viewer = graphene.Field(UserType)\n users = graphene.List(UserType)\n\n @login_required\n def resolve_viewer(self, info, **kwargs):\n return info.context.user\n\n @staff_member_required\n def resolve_users(self, info, **kwargs):\n return get_user_model().objects.all()\n\n\nErrors\n------\n\nReturning appropriate **error responses** and **masking** error messages sent to the client.\n\nConfigure your ``GraphQLView``.\n\n.. code:: python\n\n from django.urls import include, path\n\n from graphql_extensions.views import GraphQLView\n\n urlpatterns = [\n path('', GraphQLView.as_view(), name='index'),\n ]\n\n**Exceptions**\n\n.. code:: python\n\n from graphql_extensions import exceptions\n\n\n- ``exceptions.GraphQLError``\n- ``exceptions.PermissionDenied``\n- ``exceptions.ValidationError``\n- ``exceptions.NotFound``\n\n\n**Payload**\n\n.. code:: js\n\n {\n \"errors\": [\n {\n \"type\": \"NotFound\",\n \"message\": \"GraphQL object not found\",\n \"code\": \"notFound\",\n \"data\": {\n \"id\": 1\n },\n \"path\": [\"updateGroup\"],\n \"operation\": \"mutation\",\n \"trace\": [\n \" File \\\"/app/schema.py\\\", line 30, in mutate\\n group = cls.update(info, **kwargs)\\n\",\n \" File \\\"/graphql_extensions/mixins.py\\\", line 32, in update\\n instance = cls.get_object(context, id=id)\\n\",\n \" File \\\"/graphql_extensions/mixins.py\\\", line 21, in get_object\\n raise exceptions.NotFound(**kwargs)\\n\"\n ]\n }\n ],\n \"data\": {\n \"updateGroup\": null\n }\n }\n\n\nMixins\n------\n\n**Pre-built mutations** that provide for commonly used patterns.\n\n- ``RetrieveMixin``\n- ``UpdateMixin``\n\n.. code:: python\n\n from django.contrib.auth.models import Group\n\n import graphene\n from graphene_django import DjangoObjectType\n from graphql_extensions import mixins\n from graphql_extensions.auth.decorators import login_required\n\n\n class GroupType(DjangoObjectType):\n\n class Meta:\n model = Group\n\n\n class UpdateGroup(mixins.UpdateMixin, graphene.Mutation):\n group = graphene.Field(GroupType)\n\n class Arguments:\n id = graphene.Int(required=True)\n name = graphene.String()\n\n @classmethod\n def get_queryset(cls, info, **kwargs):\n return info.context.user.groups.all()\n\n @classmethod\n @login_required\n def mutate(cls, root, info, **kwargs):\n group = cls.update(info, **kwargs)\n return cls(group=group)\n\n\nWriting tests\n-------------\n\nThis package includes a subclass of `unittest.TestCase `__ ``SchemaTestCase`` and improve support for making GraphQL queries.\n\n.. code:: python\n\n from django.contrib.auth import get_user_model\n\n from graphql_extensions.testcases import SchemaTestCase\n\n\n class UsersTests(SchemaTestCase):\n\n def test_create_user(self):\n query = '''\n mutation CreateUser($username: String!, $password: String!) {\n createUser(username: $username, password: $password) {\n user {\n id\n }\n }\n }'''\n\n response = self.client.execute(query, {\n 'username': 'test',\n 'password': 'dolphins',\n })\n\n self.assertFalse(response.errors)\n self.assertTrue(response.data['user'])\n\n def test_get_viewer(self):\n user = get_user_model().objects.create_user(\n username='test',\n password='dolphins')\n\n self.client.force_login(self.user)\n\n query = '''\n {\n viewer {\n username\n }\n }'''\n\n response = self.client.execute(query)\n data = response.data['viewer']\n\n self.assertEqual(data['username'], user.username)\n\n\nTypes\n-----\n\nCustom *Graphene* **types**.\n\n- ``Email``\n- ``Timestamp``\n- ``Choices``\n- ``CamelJSON``\n- ...\n\n\nRelay\n-----\n\nComplete support for `Relay`_.\n\n.. _Relay: https://facebook.github.io/relay/\n\n\n.. |Pypi| image:: https://img.shields.io/pypi/v/django-graphql-extensions.svg\n :target: https://pypi.python.org/pypi/django-graphql-extensions\n\n.. |Wheel| image:: https://img.shields.io/pypi/wheel/django-graphql-extensions.svg\n :target: https://pypi.python.org/pypi/django-graphql-extensions\n\n.. |Build Status| image:: https://travis-ci.org/flavors/django-graphql-extensions.svg?branch=master\n :target: https://travis-ci.org/flavors/django-graphql-extensions\n\n.. |Codecov| image:: https://img.shields.io/codecov/c/github/flavors/django-graphql-extensions.svg\n :target: https://codecov.io/gh/flavors/django-graphql-extensions\n\n.. |Code Climate| image:: https://api.codeclimate.com/v1/badges/6ca5da3b6a51d35ea7d6/maintainability\n :target: https://codeclimate.com/github/flavors/django-graphql-extensions\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/flavors/django-graphql-extensions/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-graphql-extensions", "package_url": "https://pypi.org/project/django-graphql-extensions/", "platform": "", "project_url": "https://pypi.org/project/django-graphql-extensions/", "project_urls": { "Homepage": "https://github.com/flavors/django-graphql-extensions/" }, "release_url": "https://pypi.org/project/django-graphql-extensions/0.0.6/", "requires_dist": null, "requires_python": "", "summary": "A collection of custom extensions for Django GraphQL", "version": "0.0.6" }, "last_serial": 4392342, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3bbfc2d4c7b6e193a86794a7a38c697b", "sha256": "4e17ebe95b3c441048576c64f5f9a5a073bb8e4cdf1b1fecc73874f4783f9456" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3bbfc2d4c7b6e193a86794a7a38c697b", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15523, "upload_time": "2018-01-21T09:41:39", "url": "https://files.pythonhosted.org/packages/5c/ed/69445e1513187f886b5c460a1377dfa9c5745101fffdeecc9deda88fb2b4/django_graphql_extensions-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af567af74fd47462e138bee5bd6dd181", "sha256": "853d36a89bcb832701438701ee705b74c796280ef0033341e7c3b9810b200a81" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.1.tar.gz", "has_sig": false, "md5_digest": "af567af74fd47462e138bee5bd6dd181", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9342, "upload_time": "2018-01-21T09:41:12", "url": "https://files.pythonhosted.org/packages/88/e3/e8fbad65f1d7b068050b7efea7539d6cef969daa483c791474960dd89a31/django-graphql-extensions-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "d90b468f4ac095e14c0cf74b6fff62e4", "sha256": "738990e2c219700fb2039d6198ab75bf62de84cb0275b99fd8df3924bd3c76ce" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d90b468f4ac095e14c0cf74b6fff62e4", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15464, "upload_time": "2018-03-24T18:41:55", "url": "https://files.pythonhosted.org/packages/18/ec/2ab5d3d1af5a4eb512fda12e93183c799ffc0894bbe47c68bb6c22b1dc9a/django_graphql_extensions-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41569f9cbaf964b395eeb9a6c48e1227", "sha256": "f84264f962291b0dab355ab3dd7124ae3f726869436bebe564ddeb7ddd2fd9bd" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.2.tar.gz", "has_sig": false, "md5_digest": "41569f9cbaf964b395eeb9a6c48e1227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9359, "upload_time": "2018-03-24T18:41:50", "url": "https://files.pythonhosted.org/packages/6a/01/55d3461d960e3658ae650ed6bfd59fc47b6bd1f772455b10484b0468e81f/django-graphql-extensions-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "3d6f71514c6661c217cc9cac3197ee10", "sha256": "1d2f77a47bddcc4b1a0b7d116ce8a3b711db7e322a726e32793d7357b1fefdb5" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3d6f71514c6661c217cc9cac3197ee10", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15500, "upload_time": "2018-03-25T16:27:11", "url": "https://files.pythonhosted.org/packages/f7/98/60b46eda375f631f81f9d58add0445474a5f4ec9f105602f5ef64631ea82/django_graphql_extensions-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f5ad647f95b53e273c76090db0ce7f46", "sha256": "01e674413158b1d9509246823dd91d658064da56f88bd020d41c21ab9a17e570" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.3.tar.gz", "has_sig": false, "md5_digest": "f5ad647f95b53e273c76090db0ce7f46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9371, "upload_time": "2018-03-25T16:26:58", "url": "https://files.pythonhosted.org/packages/56/4e/2b1e4b8f3a6ffa48d2dd86d2947574c72b77739150dad20ea0c7000effb3/django-graphql-extensions-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "a6ab5e746c2e36e22ab8960388ef8861", "sha256": "6cf0047a66e0ba348a1e9e4ed53c267bbb748f84956dee71f5a39118f7198515" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a6ab5e746c2e36e22ab8960388ef8861", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15610, "upload_time": "2018-04-12T18:25:36", "url": "https://files.pythonhosted.org/packages/ad/a3/1eb92396e512fa7d59c68d346874a562cc95b72d8660bf34863b35aca5ac/django_graphql_extensions-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2fc081431d6d0a01259ad56bec7b603", "sha256": "86e51c34182e145d6f172cddbeaa3d5ea86518d368d6966c35dd18151b32ad55" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.4.tar.gz", "has_sig": false, "md5_digest": "d2fc081431d6d0a01259ad56bec7b603", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9443, "upload_time": "2018-04-12T18:25:32", "url": "https://files.pythonhosted.org/packages/21/c2/6aec2fae907baeab7e809e627e7c68997dc7d0a548227654b6999b7f6ea7/django-graphql-extensions-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "7dbf88e863763c24c9ad3b12386cd46d", "sha256": "e6487ffced21f7272722a69ab90a520c4636b15c6cd7997dbe5e4535ce2cd5eb" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7dbf88e863763c24c9ad3b12386cd46d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16611, "upload_time": "2018-09-17T14:49:28", "url": "https://files.pythonhosted.org/packages/b0/84/488969eac6053da0ff606da2ea9d6de68fa7c45567127b7dfded6883682e/django_graphql_extensions-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4dc6f7209ad1f7eecd2aff3932291632", "sha256": "0ffe181889bd14377a94adc10fe2413d557eeee2791ca130f59eaafdeeef5297" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.5.tar.gz", "has_sig": false, "md5_digest": "4dc6f7209ad1f7eecd2aff3932291632", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10096, "upload_time": "2018-09-17T14:49:23", "url": "https://files.pythonhosted.org/packages/12/7e/dfe3847b39b2d8ebd175184f124c876ecc9950e2eed60ca75b75a573f8ca/django-graphql-extensions-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "502ba958108d1d483419e47aeaaf95ce", "sha256": "fc5704654930a362a5b3965115733f20b0536cc9de9f7669fa8f0e7de7f85fda" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "502ba958108d1d483419e47aeaaf95ce", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16760, "upload_time": "2018-10-19T00:12:56", "url": "https://files.pythonhosted.org/packages/3c/17/0c87dabfc39245dd5649931b884b7a5d0e13c9fdafeb12620dc5d359b55e/django_graphql_extensions-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f9b2c2ece3261a57b4d2c58c0673e84", "sha256": "0d0deeb20bcd8e8e8c48991eb0389dd84e1f88745d946f1f228fee6c03fe8ad5" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.6.tar.gz", "has_sig": false, "md5_digest": "9f9b2c2ece3261a57b4d2c58c0673e84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10158, "upload_time": "2018-10-19T00:12:50", "url": "https://files.pythonhosted.org/packages/08/97/fd801365457b7cc114817f1d0a3548fc3eaa8c95cd96f3da12a05178d48b/django-graphql-extensions-0.0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "502ba958108d1d483419e47aeaaf95ce", "sha256": "fc5704654930a362a5b3965115733f20b0536cc9de9f7669fa8f0e7de7f85fda" }, "downloads": -1, "filename": "django_graphql_extensions-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "502ba958108d1d483419e47aeaaf95ce", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 16760, "upload_time": "2018-10-19T00:12:56", "url": "https://files.pythonhosted.org/packages/3c/17/0c87dabfc39245dd5649931b884b7a5d0e13c9fdafeb12620dc5d359b55e/django_graphql_extensions-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f9b2c2ece3261a57b4d2c58c0673e84", "sha256": "0d0deeb20bcd8e8e8c48991eb0389dd84e1f88745d946f1f228fee6c03fe8ad5" }, "downloads": -1, "filename": "django-graphql-extensions-0.0.6.tar.gz", "has_sig": false, "md5_digest": "9f9b2c2ece3261a57b4d2c58c0673e84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10158, "upload_time": "2018-10-19T00:12:50", "url": "https://files.pythonhosted.org/packages/08/97/fd801365457b7cc114817f1d0a3548fc3eaa8c95cd96f3da12a05178d48b/django-graphql-extensions-0.0.6.tar.gz" } ] }