mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-04-26 12:03:47 +03:00
Merge branch 'permissions-to-fields#3' into permission-to-type#5
# Conflicts: # graphene_django/fields.py
This commit is contained in:
commit
e7a4538a3e
|
@ -154,16 +154,18 @@ class DjangoConnectionField(ConnectionField):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class DjangoField(Field):
|
class PermissionField(Field):
|
||||||
"""Class to manage permission for fields"""
|
"""Class to manage permission for fields"""
|
||||||
|
|
||||||
def __init__(self, type, permissions, permissions_resolver=auth_resolver, *args, **kwargs):
|
def __init__(self, type, permissions=(), permissions_resolver=auth_resolver, *args, **kwargs):
|
||||||
"""Get permissions to access a field"""
|
"""Get permissions to access a field"""
|
||||||
super(DjangoField, self).__init__(type, *args, **kwargs)
|
super(PermissionField, self).__init__(type, *args, **kwargs)
|
||||||
self.permissions = permissions
|
self.permissions = permissions
|
||||||
self.permissions_resolver = permissions_resolver
|
self.permissions_resolver = permissions_resolver
|
||||||
|
|
||||||
def get_resolver(self, parent_resolver):
|
def get_resolver(self, parent_resolver):
|
||||||
"""Intercept resolver to analyse permissions"""
|
"""Intercept resolver to analyse permissions"""
|
||||||
return partial(get_unbound_function(self.permissions_resolver), self.resolver or parent_resolver,
|
parent_resolver = super(PermissionField, self).get_resolver(parent_resolver)
|
||||||
self.permissions, None, None, True)
|
if self.permissions:
|
||||||
|
return partial(get_unbound_function(self.permissions_resolver), parent_resolver, self.permissions, None, None, True)
|
||||||
|
return parent_resolver
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from graphene_django.fields import DjangoField
|
from graphene_django.fields import PermissionField
|
||||||
|
|
||||||
|
|
||||||
class MyInstance(object):
|
class MyInstance(object):
|
||||||
|
@ -10,11 +10,11 @@ class MyInstance(object):
|
||||||
return "resolver method"
|
return "resolver method"
|
||||||
|
|
||||||
|
|
||||||
class DjangoPermissionFieldTests(TestCase):
|
class PermissionFieldTests(TestCase):
|
||||||
|
|
||||||
def test_permission_field(self):
|
def test_permission_field(self):
|
||||||
MyType = object()
|
MyType = object()
|
||||||
field = DjangoField(MyType, permissions=['perm1', 'perm2'], source='resolver')
|
field = PermissionField(MyType, permissions=['perm1', 'perm2'], source='resolver')
|
||||||
resolver = field.get_resolver(None)
|
resolver = field.get_resolver(None)
|
||||||
|
|
||||||
class Viewer(object):
|
class Viewer(object):
|
||||||
|
@ -30,7 +30,7 @@ class DjangoPermissionFieldTests(TestCase):
|
||||||
|
|
||||||
def test_permission_field_without_permission(self):
|
def test_permission_field_without_permission(self):
|
||||||
MyType = object()
|
MyType = object()
|
||||||
field = DjangoField(MyType, permissions=['perm1', 'perm2'], source='resolver')
|
field = PermissionField(MyType, permissions=['perm1', 'perm2'], source='resolver')
|
||||||
resolver = field.get_resolver(field.resolver)
|
resolver = field.get_resolver(field.resolver)
|
||||||
|
|
||||||
class Viewer(object):
|
class Viewer(object):
|
||||||
|
|
|
@ -125,7 +125,10 @@ def auth_resolver(parent_resolver, permissions, attname, default_value, raise_ex
|
||||||
:return: Resolved field. None if the viewer does not have permission to access the field.
|
:return: Resolved field. None if the viewer does not have permission to access the field.
|
||||||
"""
|
"""
|
||||||
# Get viewer from context
|
# Get viewer from context
|
||||||
|
if not hasattr(info.context, 'user'):
|
||||||
|
raise PermissionDenied()
|
||||||
user = info.context.user
|
user = info.context.user
|
||||||
|
|
||||||
if has_permissions(user, permissions):
|
if has_permissions(user, permissions):
|
||||||
if parent_resolver:
|
if parent_resolver:
|
||||||
# A resolver is provided in the class
|
# A resolver is provided in the class
|
||||||
|
|
Loading…
Reference in New Issue
Block a user