разрешение в APIView desnt работа и ответ. но ответ должен отказать в доступе - PullRequest
0 голосов
/ 23 мая 2019

в коде ниже, я хочу добавить разрешение, но оно не работает точно. когда я изменяю разрешение на «IsAdmin», которое работает правильно, и ответ «доступ запрещен», когда я хочу получить TeacherPostStatistic. но я не знаю, почему это разрешение, которое мне нужно, не работает? спасибо. view.py:

class TeacherPostStatistic(generics.RetrieveAPIView):
    permission_classes = (ClassCoTeacherPermission, ClassOwnerPermission)

    def get_klass(self):
        class_id = self.kwargs['class_id']
        return Class.objects.get(id=class_id)

    def get(self, request, *arg, **kwargs):
        klass = self.get_klass()
        response = Post.post_count_last7days(klass)
        return JsonResponse(response, safe=False)

urls.py:

url(r'^teacher/(?P<class_id>[0-9]+)/post-statistic/$', views.TeacherPostStatistic.as_view()),

models.py:

class Post(models.Model):
    title = models.CharField(
        _("Post title"),
        max_length=100,
        blank=True,
        default="",
    )
    description = models.CharField(
        _("Post description"),
        max_length=1500,
        blank=True,
    )
    type = models.CharField(
        _("Post type"),
        max_length=1,
        choices=TYPE_CHOICES,
    )
    create_date = models.DateTimeField(default=timezone.now)
    emoji_count = JSONField(default=get_empty_dic)
    like_count = models.IntegerField(default=0)

    writer = models.ForeignKey(
        User,
        related_name='written_posts',
        related_query_name='written_post',
        null=True,
        on_delete=models.SET_NULL
    )
    klass = models.ForeignKey(
        'klass.Class',
        related_name='posts',
        related_query_name='published_post',
        on_delete=models.CASCADE
    )
    users = models.ManyToManyField(
        User,
        through='PostUserActivity',
        related_name="posts",
        blank=True,
    )

    files = models.ManyToManyField(File)

    @classmethod
    def post_count_last7days(cls, klass):
        post_per_day_chart = {}
        for past_day in range(0, 7):
            count_post_in_past_day = cls.objects.filter(klass__exact=klass, create_date__date=date.today()-timedelta(days=past_day)).count()
            post_per_day_chart[past_day] = count_post_in_past_day
        print(post_per_day_chart)
        return post_per_day_chart

permission.py:

class ClassCoTeacherPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        print(obj,view)
        return self.has_perm(user=request.user, klass=obj)

    @classmethod
    def has_perm(cls, user, klass):
        co_teacher = ClassCoTeacherMembership.objects.filter(klass=klass, co_teacher=user)
        if not co_teacher.exists():
            raise exc.UserIsNotCoTeacherOfTheClass
        return True

class ClassOwnerPermission(permissions.BasePermission):
    """
    Object-level permission to only allow owners of an object to edit it.
    Assumes the model instance has an `owner` attribute.
    """

    @classmethod
    def has_perm(cls, user, klass):
        return klass.owner == user

    def has_object_permission(self, request, view, obj):
        print(obj,view)
        return self.has_perm(request.user, obj)e

этот клинт запрашивает у ClassRoom нет разрешения для доступа к «TeacherPostStatistic» в view.py, но в ответе django, который без какого-либо доступа запрещает.
Второй вопрос: что print(obj,view) не работает? в терминале ничего не появляется. но когда это разрешение вызывает другое мнение (тот программист написал сам) печать работает. Я noob в django / python, поэтому, пожалуйста, объясните мне, как вы можете, особенно ту часть, которую я комментирую "obj". И если вы знаете какой-то простой источник для меня в интернете (документ, видео и т. д.), пожалуйста, дайте мне знать.

...