2017-04-12 20 views
0

私は、経費、賃料、給与などのさまざまな経費が表示されているテーブルを用意しています。スタッフから給料を隠したいので追加します私のquerysetに新しいフィルターを付ける必要があります。しかし、私はそれを別のユーザーとテストすると、まだそこにあります。テーブルに給与を表示しない - Djangoの許可

なぜこれが起こっているのか分からないので、誰かが私にここで間違っていることを説明してください。ありがとう!

これは私のカスタムpermissionです:

@staticmethod 
def can_view_salaries(user): 
    return user.is_staff and user.has_perm('cms_expenses.can_view_salaries') 

あなたは私がフィルタリングをやっている私のrestapi景色を見ることができます。

class ExpenseViewSet(viewsets.ModelViewSet): 
    def get_queryset(self): 
     only_recurrent = self.request.query_params.get('recurrent', False) 
     queryset = models.Expense.objects.get_expenses_list(self.request.user) 
     if only_recurrent: 
      queryset = queryset.exclude(scheduled_recurrence__isnull=True) 
     if self.check_object_permissions(self.request.user, queryset): 
      queryset = ExpenseAccessService.can_view_salaries(self.request.user) 
     return queryset 

    serializer_class = ExpenseSerializer 
    filter_backends = (
     filters.DjangoFilterBackend, 
     filters.SearchFilter, 
     filters.OrderingFilter 
    ) 

    filter_fields = ('paid', 'generated',) 
    ordering_fields = (
     'value', 'currency', 'category', 'attachment', 'created', 'scheduled_recurrence', 'paid', 
     'scheduled_recurrence__interval', 'scheduled_recurrence__next_occurrence', 'payment_proof', 
     'description') 
    search_fields = (
     'value', 'currency', 'category', 'attachment', 'created', 'paid', 
     'scheduled_recurrence__interval', 'scheduled_recurrence__next_occurrence', 'payment_proof', 
     'description') 

    pagination_class = StandardResultsOffsetPagination 

    permission_classes = [ 
     permissions.IsAuthenticated, 
     expenses_permissions.ExpensesPermissions 
    ] 
+1

'can_view_salaries'関数はブール値を返します。なぜそれをクエリーセットに割り当てるのですか? – AKS

+0

@AKS残りのAPIビューのパーミッションに基づいてリストを適切にフィルタリングしたいのは、それがクエリーセットで使用している理由ですが、私はこれを正しく理解できるので、提案に公開しています – PetarP

+1

'get_queryset'は完全に壊れています。ユーザーにオブジェクトパーミッションがない場合、クエリーセットはまったく変更されず、返されます。また、ユーザー*がパーミッションを持っている場合、ブール値を返します。これはまったく意味がありません。 –

答えて

0

私は少し遅れてこの質問への回答を投稿していますが、友人と話をしてダニエラ・ローズマンの読書を読んだ後、私はstuffためので、セットアップを望んで、私はこのソリューションを作ってみた:私は給与と歩合の将来の視聴中に私のものを制限してきたジャンゴexclude

class ExpenseViewSet(viewsets.ModelViewSet): 
    def get_queryset(self): 
     only_recurrent = self.request.query_params.get('recurrent', False) 
     queryset = models.Expense.objects.get_expenses_list(self.request.user) 
     if only_recurrent: 
      queryset = queryset.exclude(scheduled_recurrence__isnull=True) 
     if not ExpenseAccessService.can_view_salaries_and_commissions(self.request.user): 
      queryset = queryset.exclude(category__in=["salary", "commissions"]) 
     return queryset 

、私は解決策でも作ってみましたQオブジェクトでcomplex lookupsを使用しますが、excludeは読みやすくなります。

0

実は、check_object_permissions()マルチオブジェクト権限

def check_object_permissions(self, request, obj): 
    """ 
    Check if the request should be permitted for a given object. 
    Raises an appropriate exception if the request is not permitted. 
    """ 
    for permission in self.get_permissions(): 
     if not permission.has_object_permission(request, self, obj): 
      self.permission_denied(
       request, message=getattr(permission, 'message', None) 
      ) 

をチェックして、カスタムresponse.dataしたい場合は、このようなget_serializer_class上書きするために、より良いいただきたいしません:

def get_serializer_class(self): 
    if self.request.user.is_staff: 
     return StaffExpenseSerializer 
    if self.request.user.is_superuser: 
     return AdminExpenseSerializer 
関連する問題