tastypie - проверка прав для создания объекта на POST - PullRequest
1 голос
/ 01 апреля 2012

Использование замечательного джанго-тастпи.

Мое приложение имеет концепцию документа (т.е. слово doc).Есть один владелец документа и много редакторов.Редакторы могут добавлять комментарии.

Я хочу проверить, есть ли у редактора разрешения на документ, прежде чем они смогут отправить комментарий.Однако я не могу понять, как выполнить эту проверку с помощью tastpie.

Вот мой код, немного упрощенный:

# models.py

class Document(models.Model):
    doc_text = models.TextInput()
    owner = models.ForeignKey(User)
    editor_group = models.ForeignKey(EditorGroup)

class EditorGroup(models.Model):
    name = models.CharField()
    user = models.ManyToManyField(User)

class Comment(models.Model):
    comment = models.CharField()
    user = models.ForeignKey()
    document = models.ForeignKey()

-

# api.py

class CommentResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')

    class Meta:
        queryset = Comment.objects.all()
        resource_name = 'comments'
        authorization= DjangoAuthorization()

        def obj_create(self, bundle, request, **kwargs):

            # What code can I put here to check if the Editor is in the 
            # EditorGroup

            return super(AnswerResource, self).obj_create(bundle, request, user=request.user)

ЕслиРедактор просматривает документ и отправляет комментарий. Я хочу убедиться, что они являются частью EditorGroup, прежде чем я позволю им создать комментарий.

Я рассмотрел использование obj_create для этого, но не уверен, как получить доступ к объекту Document, чтобы увидеть, является ли Editor (который теперь request.user) частью EditorGroup.

Также не уверен, является ли obj_create правильным местом для выполнения этой проверки.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 17 сентября 2012

Если вам нужно что-то проверить на объекте Document, то решение, представленное ниже, кажется приемлемым.Вы можете использовать build_related_resource метод класса RelatedField, чтобы получить ресурс из URI и превратить его в действительный объект Django.Однако, если вам нужно проверить группы, разрешения и авторизацию в целом, вам лучше взглянуть на Реализация собственной аутентификации / авторизации в django-tastypie docs.

class CommentResource(ModelResource):

    user = fields.ForeignKey(UserResource, 'user')
    document = fields.ForeignKey(DocumentResource, 'user')

    def obj_create(self, bundle, request=None, **kwargs):
        document_uri = json.loads(request.POST.keys()[0]['document'])
        document = self.document.build_related_resource(document_uri).obj
        if request.user.has_permission_to(document) or request.user.is_editor:
            [...]
1 голос
/ 01 апреля 2012

Вот один из вариантов:

if request.user.groups.filter(id=self.document.editor_group.id).exists():
    ...post_comment
else:
    ...don't post comment
...