2015-07-30 5 views
0

У меня есть две модели, обе имеют FileField как так:Джанго - Заменить файл в FileField с файлом из другого FileField

class OriginalFile(models.Model): 
    docfile = models.FileField(upload_to=file_path) 

class RevisedFile(models.Model): 
    newfile = models.FileField(upload_to=revisedfile_path) 
    originalfile = models.ForeignKey(OriginalFile, on_delete=models.PROTECT) 

Как вы видите, при загрузке файла в первый раз, он получает загружены file_path в модели OriginalFile. Однако, если пользователь загружает исправленную версию того же файла, он сохраняется в revisedfile_path в модели RevisedFile.

Обычный пользователь не имеет права самостоятельно пересматривать файл (поэтому я не заменяю исходный файл в этот момент). Если менеджер принимает пересмотренный файл, то следующие вещи должны произойти:

  1. Заменить docfile из OriginalFile с newfile из RevisedFile
  2. Удалить соответствующий экземпляр RevisedFile вместе с newfile сохраняется в каталоге.

Имена docfile и newfile можно считать одинаковыми. Я понятия не имею, как подойти к этой проблеме. Любую помощь можно было бы высоко ценить. Благодарю.

+0

Звучит так, как будто пользователи имеют доступ к вашей файловой системе и вы загружаете их в разные каталоги, чтобы ограничить доступ для пользователей, не являющихся менеджерами. Это так? –

+0

Да, обычные пользователи загружают файлы, используя форму. – Rahul

ответ

0

Удалите любой пользовательский доступ к вашей файловой системе. Используйте FK вместо прямого управления файлами. Не удаляйте старые файлы, но не показывайте старые файлы.

class DocFile(models.Model): 
    file = models.FileField(upload_to=file_path) # Single path for all doc files 

class Document(models.Model): 
    # Optional name, description fields 
    approved = models.FK(DocFile) 
    revisions = models.ManyToManyField(DocFile) 

Когда обычный пользователь загружает файл, добавьте его в Document.revisions и, если он является единственной версией ревизии, он также одобрен.

Создать группу разрешений для менеджеров и разрешить им редактировать документ в админ. Таким образом, они могут выбрать, какой из DocFiles, связанных с документом, является утвержденным. Нет необходимости передавать файлы, вы не теряете версии файла, и ваша файловая система безопасна от rm -r. Менеджер также сможет загружать файлы для просмотра

+0

Посредством доступа к файловой системе я имел в виду, что пользователь может загрузить файл. Ни в коем случае нельзя просматривать/изменять файлы или каталог доступа. Кроме того, я полагаю, что, как вы предложили, будет много потерянных файлов, если пользователи часто загружают пересмотренные файлы. Это одна из вещей, которую я хотел избежать. Кроме того, поскольку пересмотренные и оригинальные файлы будут иметь одно и то же имя, это может вызвать проблемы? – Rahul

+0

Вы по-прежнему можете удалить файлы из admin или добавить дополнительную логику, чтобы удалить изменения, если одобренный был изменен. Осиротевшие файлы нечего бояться. –

+0

Вы можете добавить время загрузки в DocFile и иметь файлы удаления cronjob, если утвержденный DocFile был загружен последними версиями. –

Смежные вопросы