Commits

Axel Gembe  committed 6c5cd00

Patch to add hashpath storage backend

  • Participants
  • Parent commits 94f0a2b

Comments (0)

Files changed (2)

File add-hashpath

+# HG changeset patch
+# Parent 8a529aaf857aa76bd60af463591efecb2077bce9
+Add hashpath storage backend
+
+diff -r 8a529aaf857a AUTHORS
+--- a/AUTHORS	Wed Mar 31 17:00:52 2010 -0400
++++ b/AUTHORS	Tue Apr 27 13:35:48 2010 +0200
+@@ -15,6 +15,7 @@
+     * Jason Christa (patches)
+     * Adam Nelson (patches)
+     * Erik CW (S3 encryption)
++    * Axel Gembe (Hash path)
+ 
+ Extra thanks to Marty for adding this in Django, 
+ you can buy his very interesting book (Pro Django).
+diff -r 8a529aaf857a storages/backends/hashpath.py
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/storages/backends/hashpath.py	Tue Apr 27 13:35:48 2010 +0200
+@@ -0,0 +1,41 @@
++import os, hashlib, errno
++
++from django.conf import settings
++from django.core.files.storage import FileSystemStorage
++from django.utils.encoding import force_unicode
++
++class HashPathStorage(FileSystemStorage):
++    """
++    Creates a hash from the uploaded file to build the path.
++    """
++
++    def save(self, name, content):
++        # Get the content name if name is not given
++        if name is None: name = content.name
++
++        # Get the SHA1 hash of the uploaded file
++        sha1 = hashlib.sha1()
++        for chunk in content.chunks():
++            sha1.update(chunk)
++        sha1sum = sha1.hexdigest()
++
++        # Build the new path and split it into directory and filename
++        name = os.path.join(os.path.split(name)[0], sha1sum[:1], sha1sum[1:2], sha1sum)
++        dir_name, file_name = os.path.split(name)
++
++        # Return the name if the file is already there
++        if os.path.exists(name):
++            return name
++
++        # Try to create the directory relative to the media root
++        try:
++            os.makedirs(os.path.join(settings.MEDIA_ROOT, dir_name))
++        except OSError as e:
++            if e.errno is not errno.EEXIST:
++                raise e
++
++        # Save the file
++        name = self._save(name, content)
++
++        # Store filenames with forward slashes, even on Windows
++        return force_unicode(name.replace('\\', '/'))
+add-hashpath
 # Placed by Bitbucket