示例#1
0
 def get_size(self, filename=None):
     from PIL import Image
     if filename:
         image = Image.open(filename)
     else:
         image = Image.open(self.file)
     return '%ix%i' % (image.size[0], image.size[1])
示例#2
0
 def render(self, context):
     try:
         # If size is not an int, then it's a Variable, so try to resolve it.
         if not isinstance(self.size, int):
             self.size = int(self.size.resolve(context))
         self.user = self.get_user(context)
     except Exception as e:
         print(e)
         return ''  # just die...
     if self.size > _settings.DEFAULT_AVATAR_WIDTH:
         return ''  # unacceptable
     profile = self.get_profile()
     if not profile:
         return ''
     # Avatar's heaven, where all the avatars go.
     avatars_root = path.join(_settings.AVATARS_DIR,
                              slugify(self.user.username))
     file_root, file_name, defaulting = self.get_file(profile)
     if defaulting:
         file_root = _settings.AVATARS_DIR
         if self.size_equals():
             return self.as_url(path.join(file_root, file_name))
     file_path = path.join(file_root, file_name)
     # I don't return the default because I have to resize it.
     if not defaulting:
         if path.exists(file_path) and self.size_equals(file_path):
             return self.as_url(file_path)
         else:
             if not profile.avatar:
                 file_root = _settings.AVATARS_DIR
                 file_path = path.join(file_root, _settings.DEFAULT_AVATAR)
     # Oops, I din't find it, let's try to generate it.
     if path.exists(file_path):
         orig_file = Image(file_path)
         dest_root = path.join(avatars_root, str(self.size))
         try:
             makedirs(dest_root)
         except Exception as e:
             print(e)
         # Save the new path for later...
         dest_path = path.join(dest_root, file_name)
     else:
         # Did my best...
         return ''  # fail silently
     orig_file.scale(self.size)
     if orig_file.write(dest_path):
         return self.as_url(dest_path)
     else:
         print('=== ERROR ===')
         return ''  # damn! Close but no cigar...
 def get_filename(self, context):
     file_path = self.image_name.resolve(context)
     if path.exists(file_path):
         self.image = Image(file_path)
         self.thumb_width, self.thumb_height = self.image.size().dimensions()
         i = file_path.rfind('/')
         return (file_path[:i], file_path[i+1:])
     # TODO:
     # TODO: Implementar un wallpaper por defecto que se va a mostrar en
     # TODO: lugar de los wallpapers que falten mientras alguien lo arregla.
     raise MissingImageError(file_path)
示例#4
0
 def get_resolution(self, filename=None):
     from PIL import Image
     if filename:
         image = Image.open(filename)
     else:
         image = Image.open(self.file)
     relation = float(image.size[0])/float(image.size[1])
     if relation == float(2)/float(3):
         return '2:3' #iPhone's resolution
     elif relation == float(5)/float(4):
         return '5:4'
     elif relation == float(4)/float(3):
         return '4:3'
     elif relation == float(3)/float(2):
         return '3:2'
     elif relation == float(8)/float(5):
         return '8:5'
     elif relation == float(5)/float(3):
         return '5:3'
     elif relation == float(16)/float(9):
         return '16:9'
     elif relation == float(17)/float(9):
         return '17:9'
示例#5
0
 def get_file(self, profile=None):
     default = False
     file_name = None
     # username = slugify(profile.user.username)
     file_root = _settings.AVATARS_DIR
     # La diferencia entre self.default y default es que el primero indica
     # que tengo que devolver el avatar por defecto, mientras que el segundo
     # marca si estoy devolviendo el avatar por defecto o no.
     if self.default:
         default = True
     else:
         if profile is not None:
             # Este try es por si en profile.avatar existe una relación a un
             # avatar que no existe en la tabla de avatars.
             try:
                 if profile.avatar:
                     file_name = profile.avatar.name
             except:
                 profile.avatar = None
                 profile.save()
                 default = True
     if not file_name or  not path.exists(path.join(file_root, file_name)):
         file_name = _settings.DEFAULT_AVATAR
         default = True
     avatar_file = path.join(file_root, file_name)
     self.orig = Image(avatar_file)
     self.orig_width = self.orig.size().width()
     self.orig_height = self.orig.size().height()
     if not self.sizes_ok(with_original=True):
         if default:
             file_name = file_name[file_name.rfind('/')+1:]
             file_name = '%(width)i-%(name)s' % \
                 {'width': self.width, 'name': file_name}
             new_avatar = path.join(file_root, file_name)
         else:
             new_avatar = '' # Hack alert!
         self.resize(avatar_file, new_avatar)
     return (file_name, default)
示例#6
0
 if defaulting:
     file_root = _settings.AVATARS_DIR
     if self.size_equals():
         return self.as_url(path.join(file_root, file_name))
 file_path = path.join(file_root, file_name)
 # I don't return the default because I have to resize it.
 if not defaulting:
     if path.exists(file_path) and self.size_equals(file_path):
         return self.as_url(file_path)
     else:
         if not profile.avatar:
             file_root = _settings.AVATARS_DIR
             file_path = path.join(file_root, _settings.DEFAULT_AVATAR)
 # Oops, I din't find it, let's try to generate it.
 if path.exists(file_path):
     orig_file = Image(file_path)
     dest_root = path.join(avatars_root, str(self.size))
     try:
         makedirs(dest_root)
     except Exception, e:
         print e
     # Save the new path for later...
     dest_path = path.join(dest_root, file_name)
 else:
     # Did my best...
     return ''  # fail silently
 orig_file.scale(self.size)
 if orig_file.write(dest_path):
     return self.as_url(dest_path)
 else:
     print '=== ERROR ==='
示例#7
0
 def size_equals(self, file=None):
     if not file:
         return self.size == _settings.DEFAULT_AVATAR_WIDTH
     else:
         return self.size == Image(file).size().width()
示例#8
0
 if defaulting:
     file_root = _settings.AVATARS_DIR
     if self.size_equals():
         return self.as_url(path.join(file_root, file_name))
 file_path = path.join(file_root, file_name)
 # I don't return the default because I have to resize it.
 if not defaulting:
     if path.exists(file_path) and self.size_equals(file_path):
         return self.as_url(file_path)
     else:
         if not profile.avatar:
             file_root = _settings.AVATARS_DIR
             file_path = path.join(file_root, _settings.DEFAULT_AVATAR)
 # Oops, I din't find it, let's try to generate it.
 if path.exists(file_path):
     orig_file = Image(file_path)
     dest_root = path.join(avatars_root, str(self.size))
     try:
         makedirs(dest_root)
     except Exception, e:
         print e
     # Save the new path for later...
     dest_path = path.join(dest_root, file_name)
 else:
     # Did my best...
     return ''  # fail silently
 orig_file.scale(self.size)
 if orig_file.write(dest_path):
     return self.as_url(dest_path)
 else:
     print '=== ERROR ==='
示例#9
0
    def get_for_resolution(self, resolution):
        from os import path, makedirs
        from math import ceil

        dest_width, dest_height = [int(side) for side in resolution.split('x')]
        # /path/to/directory
        file_root = self.file[:self.file.rfind('/')]
        # filename.ext
        file_name = self.file[self.file.rfind('/') + 1:]
        # /path/to/directory/1280x800
        dest_root = path.join(file_root, resolution)
        # /path/to/directory/1280x800/filename.ext
        dest_path = path.join(dest_root, file_name)
        if not path.exists(dest_path):
            if not path.exists(dest_root):
                makedirs(dest_root)
            file_orig = Image(self.file)
            if self.width != dest_width or self.height != dest_height:
                rule_width = round(
                    (float(dest_width)*float(100))/float(self.width))
                rule_height = round(
                    (float(dest_height)*float(100))/float(self.height))
                temp_width, temp_height = dest_width, dest_height
                if rule_height > rule_width:
                    # TODO:
                    # TODO: Testear caso en que ancho sea flotante.
                    temp_width = (rule_height*self.width)/100
                    file_orig.scale(temp_width, dest_height)
                else:
                    temp_height = (rule_width*self.height)/100
                    file_orig.scale(dest_width)
                if rule_width != rule_height:
                    x_offset = str((temp_width-dest_width)/2)
                    y_offset = str((temp_height-dest_height)/2)
                    file_orig.crop(str(resolution)+'+'+x_offset+'+'+y_offset)
            wmark_file = settings.WATERMARK_FILE
            wmark = Image(wmark_file)
            if wmark.size().width() > dest_width and dest_width > 200:
                wmark_file = wmark_file[:wmark_file.rfind('.')] + '-small' + \
                             wmark_file[wmark_file.rfind('.'):]
            # FIXME:
            # FIXME: La marca de agua no se ve en sistemas que implementan
            # FIXME: barras de herramientas inferiores. Hay que colocarla unos
            # FIXME: 50px mas arriba.
            # file_orig.watermark(wmark_file)
            file_orig.comment(settings.COMMENT)
            file_orig.write(dest_path)
        return dest_path
示例#10
0
class ResizedThumbnailNode(Node):
    def __init__(self, width, height, user, default):
        try:
            self.width = int(width)
        except:
            self.width = Variable(width)

        try:
            self.height = int(height)
        except:
            self.height = Variable(height)

        if not user:
            self.username = '******'
        else:
            self.username = user

        self.default = default

    def get_user(self, context):
        return Variable(self.username).resolve(context)

    def sizes_ok(self, with_original=False):
        if with_original:
            orig_width = self.orig_width
            orig_height = self.orig_height
        else:
            orig_width, orig_height = _settings.DEFAULT_AVATAR_SIZE
            orig_height = _settings.DEFAULT_AVATAR_SIZE[1]
        return self.width >= orig_width and self.height >= orig_height

    def both_sides_equals(self, fname):
        return self.orig_width == self.orig_height

    def resize(self, orig='', dest=''):
        if not path.exists(orig):
            # print orig, 'does not exists'
            return None
        if path.exists(dest):
            # print dest, 'already exists'
            return True
        if not dest:
            dest = orig
        self.orig.scale(self.width, self.height)
        if self.orig.write(dest):
            # print 'resizing done, returning...'
            return self.as_url(dest)
        else:
            print ' *** ERROR *** '
            return None # damn! Close but no cigar...

    def get_file(self, profile=None):
        default = False
        file_name = None
        # username = slugify(profile.user.username)
        file_root = _settings.AVATARS_DIR
        # La diferencia entre self.default y default es que el primero indica
        # que tengo que devolver el avatar por defecto, mientras que el segundo
        # marca si estoy devolviendo el avatar por defecto o no.
        if self.default:
            default = True
        else:
            if profile is not None:
                # Este try es por si en profile.avatar existe una relación a un
                # avatar que no existe en la tabla de avatars.
                try:
                    if profile.avatar:
                        file_name = profile.avatar.name
                except:
                    profile.avatar = None
                    profile.save()
                    default = True
        if not file_name or  not path.exists(path.join(file_root, file_name)):
            file_name = _settings.DEFAULT_AVATAR
            default = True
        avatar_file = path.join(file_root, file_name)
        self.orig = Image(avatar_file)
        self.orig_width = self.orig.size().width()
        self.orig_height = self.orig.size().height()
        if not self.sizes_ok(with_original=True):
            if default:
                file_name = file_name[file_name.rfind('/')+1:]
                file_name = '%(width)i-%(name)s' % \
                    {'width': self.width, 'name': file_name}
                new_avatar = path.join(file_root, file_name)
            else:
                new_avatar = '' # Hack alert!
            self.resize(avatar_file, new_avatar)
        return (file_name, default)

    def as_url(self, path):
        from profile.avatars import path_to_url

        return path_to_url(path)

    def render(self, context):
        try:
            # If size is not an int, then it's a Variable, so try to resolve it.
            if not isinstance(self.width, int):
                self.width = int(self.width.resolve(context))
            self.user = self.get_user(context)
        except Exception, e:
            print e
            return '' # just die...
        profile = self.user.get_profile()
        if not profile:
            return ''
        file_root = _settings.AVATARS_DIR
        file_name, defaulting = self.get_file(profile)
        file_path = path.join(file_root, file_name)
        return self.as_url(path.join(file_root, file_name))
class ResizedThumbnailNode(Node):
    def __init__(self, filename, dimensions):
        self.image_name = Variable(filename)
        # FIXME: Que pasa cuando no se explicita un ancho, y éste defaultea a
        # 0 px? Testear.
        self.height = int(dimensions[1])
        self.width = int(dimensions[0])
        # print dimensions

    def get_filename(self, context):
        file_path = self.image_name.resolve(context)
        if path.exists(file_path):
            self.image = Image(file_path)
            self.thumb_width, self.thumb_height = self.image.size().dimensions()
            i = file_path.rfind('/')
            return (file_path[:i], file_path[i+1:])
        # TODO:
        # TODO: Implementar un wallpaper por defecto que se va a mostrar en
        # TODO: lugar de los wallpapers que falten mientras alguien lo arregla.
        raise MissingImageError(file_path)

    def should_resize(self):
        if self.thumb_width > self.width or self.thumb_height > self.height:
            return True
        return False

    def render(self, context):
        try:
            image_path, image_name = self.get_filename(context)
        except MissingImageError, e:
            return ''
        # Now to the thumbnail
        size = str(self.width)
        if self.height:
            size += 'x%s' % self.height
        thumb_root = path.join(image_path, 'thumbs', size)
        thumb_path = path.join(thumb_root, image_name)
        # The URL to the thumbnail.
        thumb_url = thumb_path.replace(settings.MEDIA_ROOT, settings.MEDIA_URL)
        # Resizing logic
        if not path.exists(thumb_path):
            # image_file = Image(path.join(image_path, image_name))
            # if image_file.size().width() > self.width:
            if self.should_resize():
                if not path.exists(thumb_root):
                    makedirs(thumb_root)

                rule_width, rule_height = 0, 0
                if self.thumb_width > self.width:
                    rule_width = round(
                        (float(self.width)*float(100))/float(self.thumb_width))
                if self.thumb_height > self.height:
                    rule_height = round(
                        (float(self.height)*float(100))/float(self.thumb_height))

                temp_width, temp_height = None, None
                if rule_height > rule_width:
                    temp_width = (rule_height*self.thumb_width)/100
                    self.image.scale(temp_width, self.height)
                else:
                    temp_height = (rule_width*self.thumb_height)/100
                    self.image.scale(self.width)

                if rule_width != rule_height:
                    x_offset, y_offset = "0", "0"
                    if self.thumb_width > self.width or \
                            self.thumb_height > self.height:
                        if temp_width:
                            x_offset = str((temp_width - self.width) / 2)
                        if temp_height:
                            y_offset = str((temp_height - self.height) / 2)
                        self.image.crop(size + '+' + x_offset + '+' + y_offset)

                self.image.write(thumb_path)

                thumb_url = thumb_path.replace(
                    settings.MEDIA_ROOT, settings.MEDIA_URL)
            else:
                # If I don't need to resize it, then I set the URL to the
                # original image file.
                thumb_url = settings.MEDIA_URL + \
                            image_path[len(settings.MEDIA_ROOT):]
        return thumb_url