# sorl/thumbnail/base.py:
def generate(self):
    """
    Generates the thumbnail if it doesn't exist or if the file date of the
    source file is newer than that of the thumbnail.
    """
    # Ensure dest(ination) attribute is set
    if not self.dest:
        raise ThumbnailException("No destination filename set.")
    
    new_generated = False
    if not isinstance(self.dest, basestring):
        # We'll assume dest is a file-like instance if it exists but isn't
        # a string.
        self._do_generate()
        new_generated = True
        
    elif not isfile(self.dest) or (self.source_exists and
        getmtime(self.source) > getmtime(self.dest)):

        import events.s3 as s3_events
        if s3_events.is_on_s3(self.relative_dest):
             # "thumb is on s3"
            s3_events.pull_from_s3(self.relative_dest)
            self._source_exists = True
        else:
             # "thumb not on s3"
            if not self.source_exists:
                # file's missing.
                if s3_events.is_on_s3(self.relative_source):
                    s3_events.pull_from_s3(self.relative_source)
                    self._source_exists = True
                else:
                     # "source is not on S3!"
                    self._source_exists = False

            if self.source_exists:
                # Ensure the directory exists
                directory = dirname(self.dest)
                if not isdir(directory):
                    os.makedirs(directory)

                self._do_generate()
                new_generated = True

    if new_generated:
        s3_events.push_to_s3(self.relative_dest)

def _get_relative_source(self):
    # Hack.
    try:
        start_str = self.relative_dest[:7]
        return self.source[self.source.find(start_str):]
    except:
        return self.source
relative_source = property(_get_relative_source)




# events/s3.py
from django.conf import settings
import libraries.backends.s3 as s3

def push_to_s3(file_path):
    s3_storage = s3.S3Storage()
    img_file = open("%s%s" % (settings.MEDIA_ROOT,file_path),'r')
    s3_img_file = s3_storage.open("%s" % (file_path), 'w')
    s3_img_file.write(img_file.read())
    img_file.close()
    s3_img_file.close()

def is_on_s3(file_path):
    s3_storage = s3.S3Storage() 
    return s3_storage.exists(file_path)
    
def pull_from_s3(file_path):
    s3_storage = s3.S3Storage()     
    img_file = open("%s%s" % (settings.MEDIA_ROOT,file_path),'w')
    s3_img_file = s3_storage.open(file_path, 'r')
    img_file.write(s3_img_file.read())
    s3_img_file.close()
    img_file.close()


# models.py
class Screenshot(SixLinksModel):
    shot = models.ImageField("Screenshot",upload_to="screenshots")

    def save(self):
        super(Screenshot, self).save()      
        import events.s3 as s3_events
        s3_events.push_to_s3(self.shot)

    def __unicode__(self):
        return "%s" % (self.shot)


# assumes django-storage is sitting in libraries, e.g. libraries/backends/s3.py is a file

# settings.py
AWS_ACCESS_KEY_ID = "YOUR-KEY"
AWS_SECRET_ACCESS_KEY = "YOUR-SECRET-KEY"
AWS_STORAGE_BUCKET_NAME = "YOUR-BUCKET"
from S3 import CallingFormat
AWS_CALLING_FORMAT = CallingFormat.PATH