2016-09-06 23 views
0

私はdjango-rest-frameworkを使って、安らかなプロジェクトでdjango-guardianを使ってオブジェクトのアクセス許可を管理したいと思います。私が望む何django-guardianとdjango-rest-framework

:彼は 「add_modelname」権限を持っている場合にのみ

  • は、接続されているユーザーがオブジェクトを作成することができます。
  • 接続されたユーザーがオブジェクトを作成するときは、「delete_modelname」 と「change_modelname」のアクセス許可を設定します。
  • 「change_modelobject」権限がある場合にのみ、接続されたユーザーがオブジェクトを編集できるようにします。
  • 「delete_modelobject」権限がある場合のみ、接続されたユーザーがオブジェクトを削除できるようにします。

私はこのコードでthoses例を管理しようとしている:

view.py

class ModelNameViewSet(viewsets.ModelViewSet): 
    """ 
    This viewset automatically provides `list`, `create`, `retrieve`, 
    `update` and `destroy` actions. 

    Additionally we also provide an extra `highlight` action. 
    """ 
    queryset = ModelName.objects.all() 
    serializer_class = ModelNameSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, ModelNamePermission) 

    def create(self, request, *args, **kwargs): 
     assign_perm("change_modelname", request.user, self) 
     assign_perm("delete_modelname", request.user, self) 
     return super().create(request, *args, **kwargs) 

class ModelNamePermission(permissions.BasePermission): 
    """ 
    Custom permission to only allow owners of an object to edit it. 
    """ 

    def has_permission(self, request, view): 
     if request.method in ['GET']: 
      return request.user.has_perm('view_modelname')   
     if request.method in ['POST']: 
      return request.user.has_perm('add_modelname') 
     if request.method in ['PUT', 'PATCH']: 
      return request.user.has_perm('change_modelname') 
     if request.method in ['DELETE']: 
      return request.user.has_perm('delete_modelname') 
     return False 

    def has_object_permission(self, request, view, obj):   
     if request.method in ['GET']: 
      return request.user.has_perm('view_modelname', obj)   
     if request.method in ['POST']: 
      return request.user.has_perm('add_modelname', obj) 
     if request.method in ['PUT', 'PATCH']: 
      return request.user.has_perm('change_modelname', obj) 
     if request.method in ['DELETE']: 
      return request.user.has_perm('delete_modelname', obj) 
     return False 

permissions.py私が遭遇した最初の問題は、Iこの行にエラーがあります:

assign_perm("change_modelname", request.user, self) 

エラー:

error: 'ModelNameViewSet' object has no attribute '_meta' 

そして私は、コードの残りの部分はなりません作品だと思いますが、少なくとも私が何をしたいのかを見ることができます。

具体的なケースについては例を見ていません。

編集:

request.user.has_perm('view_coachingrequest') 

オールウェイズtrueを返します: もう一つは、このコードはということです。しかし、私は自分のユーザーにこのアクセス許可を設定していません(管理者のみで試してみました。おそらくそれが理由です)。

+0

私はまったく同じことをしたいと思います。あなたはそれをやりましたか? – BaptWaels

答えて

0

ビューセットのcreateメソッドは、新しく作成されたモデルインスタンスを返します。ビューセット・オブジェクト自体に権限を割り当てようとしています。次のようにcreateメソッドのコードは次のようになります。

def create(self, request, *args, **kwargs): 
    instance = super().create(request, *args, **kwargs) 
    assign_perm("change_modelname", request.user, instance) 
    assign_perm("delete_modelname", request.user, instance) 
    return instance 

これは、モデルのインスタンスを作成し、それを返す前にそれをご希望の権限を割り当てます。

関連する問題