Question

I would like to use tinyMCE as the editor for my django application, but have run into some trouble. I have everything setup, but it appears there is no way to specify the upload path for the image insert/upload function. I have two specific scenarios where this becomes a problem:

  • File browser for user submitted content should not show files uploaded by other users. I'd like to "jail" them to a specific directory by user id.
  • I need a way to link uploaded files with the object they are related to. That way I can prune those files in the future if the object no longer exists, and I can show only images that are related to that object in the filebrowser.

django-tinymce-filebrowser automatically sets the upload path to mce_filebrowser/%Y/%m/%d. There doesn't appear to be an option to change this path in any way.

django-filebrowser has options for setting the upload directory in settings.py, but I haven't been able to find any record of someone overriding that path for a specific modelform instance. The closest I found was Django filebrowser, model specific directory parameter for FileBrowserField, but I think the solution there isn't applicable to my situation.

Is anyone using another filebrowser for django-tinymce? Did you have a similar problem and find a fix for it? I'd appreciate any points in the right direction.

Was it helpful?

Solution

I used a similar approach but instead of modifying the django-filebrowser code I ended up extending the browse() method in a subclass of FileBrowserSite and making the modification there:

from django.core.files.storage import DefaultStorage
from filebrowser.sites import FileBrowserSite

class FileBrowserSite(FileBrowserSite):
    def browse(self, request):
        self.directory = self.directory + str(request.user) + '/'
        return super(FileBrowserSite, self).browse(request)

storage = DefaultStorage()
site = FileBrowserSite(name='file', storage=storage)
site.directory = "content/"

I put this piece of code on a file called filebrowser.py and the then on my urls.py I did:

from .filebrowser import site

urlpatterns = [
    url(r'^admin/content/file/', include(site.urls)),  
]

I think is a much cleaner approach than modifying the source code, and is working like charm on my project.

OTHER TIPS

I've extended a little bit the answer by Erasmo. Generally, it works great. Thanks! However, as OriolJ pointed out, every user needs a created directory to use the filebrowser. It is recommended to avoid using signals, so I added the functionality to the custom FileBrowserSite.

filebrowser.py

import os
from django.conf import settings
from django.core.files.storage import DefaultStorage
from filebrowser.sites import FileBrowserSite


class FileBrowserSite(FileBrowserSite):
    def browse(self, request):
        # get directory path from settings to avoid recursion
        self.directory = settings.DIRECTORY + str(request.user) + '/'
        # create a directory for a user if it does not already exist
        full_path = self.storage.location + '/' + self.directory
        if not os.path.exists(full_path):
            os.makedirs(full_path)
        return super().browse(request)


storage = DefaultStorage()


site = FileBrowserSite(name='file', storage=storage)

settings.py

FILEBROWSER_DIRECTORY = 'user_content/'
DIRECTORY = ''

urls.py

from .filebrowser import site

urlpatterns = [
    url(r'^admin/content/file/', include(site.urls)),  
]

Hope this slight update will save someone a couple of minutes.

I've, somewhat hacked this. I'm on grappelli 2.7.2, and django-filebrowser 3.6.1.

I've just added a line to the django-filebrowser file: sites.py: on the method browse() of the class FileBrowserSite, line ~273, I've added:

self._directory_set(DIRECTORY + str(request.user) + "/")

It's important though that there is already a directory created for every user, you can make a post_save signal to create a directory every time a user is created. This solution will not relate the files with the object, but I think that this may be a good start for you and it will isolate files of different users.

For me, this is currently working just fine, I can imagine that this is not the most perfect way to do it, feedback is very welcome.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top