Как мне назначить определенных пользователей загруженному пользователем файлу, чтобы они могли его изменять / удалять (Django Apache)

#python #django #apache #file-upload #permissions

#python #django #apache #загрузка файла #разрешения

Вопрос:

Я использую django 1.10 Apache в Linux. Я создал небольшое веб-приложение для загрузки документов (с dropzone.js ) и хочу реализовать возможность для пользователя указывать, кто может просматривать / изменять / удалять определенный файл, но я не могу понять, как это сделать. Я попытался использовать ManyToManyField, но, возможно, я неправильно понимаю само поле.

Модель «Document» такова:

Модель

 class Document(models.Model):

    file = models.FileField(upload_to = 'files/')
                                #validators=[validate_file_type])
    uploaded_at = models.DateTimeField(auto_now_add = True)
    extension = models.CharField(max_length = 30, blank = True)
    thumbnail = models.ImageField(blank = True, null = True)
    is_public = models.BooleanField(default = False)
    accesible_by = models.ManyToManyField(User) #This is my attempt at doing this task.

    def clean(self):
        self.extension = self.file.name.split('/')[-1].split('.')[-1]
        if self.extension == 'xlsx' or self.extension == 'xls':
            self.thumbnail = 'xlsx.png'
        elif self.extension == 'pptx' or self.extension == 'ppt':
            self.thumbnail = 'pptx.png'
        elif self.extension == 'docx' or self.extension == 'doc':
            self.thumbnail = 'docx.png'


    def delete(self, *args, **kwargs):
        #delete file from /media/files
        self.file.delete(save = False)
        #call parent delete method.
        super().delete(*args, **kwargs)

    #Redirect to file list page.
    def get_absolute_url(self):
        return reverse('dashby-files:files')

    def __str__(self):
        return self.file.name.split('/')[-1]

    class Meta():
        ordering = ['-uploaded_at']
  

Мой взгляд на создание документов:

Вид

 class DocumentCreate(CreateView):
    model = Document
    fields = ['file', 'is_public']

    def form_valid(self, form):
        self.object = form.save(commit = False)
        ## I guess here i would Add the (self.request.user) to the accesible_by Field.
        self.object.save()
        data = {'status': 'success'}
        response = JSONResponse(data, mimetype =
        response_mimetype(self.request))
        return response
  

Заранее спасибо всем за любые идеи или предложения…

Ответ №1:

У вас есть модель и представление, которые, как мы надеемся, работают для добавления новых документов, вам еще предстоит выполнить несколько шагов. Вам понадобится место для назначения пользователей, которые могут просматривать / изменять / удалять ваши файлы. Если вам нужно сохранить уровни доступа (просмотр / удаление …), вашего accessible_by будет недостаточно, и вам подойдет сквозная таблица для добавления дополнительной информации, такой как уровень доступа.

Вам нужно написать представления для различных действий, таких как просмотр, удаление …, которые будут запрашивать пользователи, и здесь вы гарантируете, что пользователи имеют правильные привилегии. Реализация заключалась бы в получении request.user и идентификатора документа, поиске, есть ли у пользователя разрешение на то, что он делает, возврате неавторизованного исключения http или разрешении продолжения действия.

Редактировать: мой вопрос заключается в том, как я могу назначить разрешения пользователя для каждого отдельного файла

Если мы сохраняем это для управления доступом с уровня django, используя модель документа, которая у вас уже есть, и вы предприняли некоторые шаги, и для каждого документа вы можете назначить пользователей (accessible_by). Что-то вроде этого может помочь вам начать:

 from django.core.exceptions import PermissionDenied
def view_document(request, doc_pk):
    doc = get_object_or_404(Document, pk=doc_pk)
    if not doc.accessible_by.filter(username=request.user.username):
        raise PermissionDenied
    #perform rest of action
  

Или вы имеете в виду использовать саму структуру разрешений?

Комментарии:

1. Мой плохой там. У меня уже есть представления, которые позволяют мне изменять и удалять документы. Мой вопрос заключается в том, как я могу назначить пользовательские разрешения каждому отдельному файлу, чтобы их можно было изменять / удалять на основе этого.

2. Вы можете быстро назначать пользователей для документов через администратора. Разрешение пользователя от accessible_by вашей модели, похоже, предполагает, что вы хотите иметь документы, и скажите это, и этот пользователь может получить к нему доступ.

3. Да. Именно к этому я и стремлюсь. Если бы это можно было сделать с помощью фреймворка разрешений, я думаю, это могло бы быть лучше, если бы я попробовал подход, который вы отредактировали.