コード例 #1
0
class WorkPhoto(models.Model):
    work = models.ForeignKey(Work,
                             on_delete=models.CASCADE,
                             related_name="photo_work",
                             blank=True)
    file = ProcessedImageField(
        format='JPEG',
        options={'quality': 90},
        upload_to="work/",
        processors=[Transpose(),
                    ResizeToFit(width=1024, upscale=False)])
    preview = ProcessedImageField(
        format='JPEG',
        options={'quality': 60},
        upload_to="work/",
        processors=[Transpose(),
                    ResizeToFit(width=102, upscale=False)])
    created = models.DateTimeField(auto_now_add=True,
                                   auto_now=False,
                                   verbose_name="Создано")

    class Meta:
        indexes = (BrinIndex(fields=['created']), )
        verbose_name = 'Фото'
        verbose_name_plural = 'Фото'
        ordering = ["-created"]
コード例 #2
0
class Building(Importable, CachedEntity):
    """A physical building withing the campus"""
    #: Full name
    name = djm.CharField(max_length=32, unique=True)
    #: Abbreviated name
    abbreviation = djm.CharField(max_length=16, unique=True, null=True, db_index=True)
    #: Tag in the campus map
    map_tag = djm.CharField(max_length=20, unique=True)
    #: Geographical center
    location = gis.PointField(geography=True, null=True)
    #:  Picture illustrating this building
    picture = djm.ImageField(upload_to=building_pic_path, null=True, blank=True)
    picture_thumbnail = ImageSpecField(
        source='picture',
        processors=[ResizeToFit(*settings.THUMBNAIL_SIZE)],
        format='JPEG',
        options={'quality': settings.MEDIUM_QUALITY})
    picture_cover = ImageSpecField(
        source='picture',
        processors=[ResizeToFit(*settings.COVER_SIZE)],
        format='JPEG',
        options={'quality': settings.HIGH_QUALITY})

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('college:building', args=[self.id])
コード例 #3
0
ファイル: venue.py プロジェクト: InsulaCoworking/MusicCity
class Venue(models.Model):
    owner = models.ForeignKey(User,
                              null=True,
                              blank=True,
                              verbose_name='Responsable',
                              on_delete=models.SET_NULL)
    name = models.CharField(null=False, verbose_name='Nombre', max_length=240)
    description = models.TextField(null=False, blank=True)
    latitude = models.FloatField(null=False, verbose_name='Latitud')
    longitude = models.FloatField(null=False, verbose_name='Longitud')
    image = ProcessedImageField(
        null=True,
        blank=True,
        upload_to=RandomFileName('venue/'),
        verbose_name='Imagen de cabecera',
        processors=[ResizeToFit(900, 900, upscale=False)],
        format='JPEG')
    profile_image = ProcessedImageField(
        null=True,
        blank=True,
        upload_to=RandomFileName('venue/'),
        verbose_name='Imagen de perfil',
        processors=[ResizeToFit(512, 512, upscale=False)],
        format='JPEG')
    profile_thumbnail = ImageSpecField(
        source='profile_image',
        processors=[ResizeToFill(150, 150, upscale=False)],
        format='JPEG',
        options={'quality': 70})
    address = models.TextField(null=True, blank=True)
    public_space = models.BooleanField(
        default=False, verbose_name='Espacio en la vía pública')

    facebook_link = models.CharField(null=True,
                                     blank=True,
                                     verbose_name='Página de Facebook',
                                     max_length=250)
    twitter_link = models.CharField(null=True,
                                    blank=True,
                                    verbose_name='Perfil de Twitter',
                                    max_length=250)
    webpage_link = models.CharField(null=True,
                                    blank=True,
                                    verbose_name='Página web',
                                    max_length=250)

    class Meta:
        verbose_name = 'Escenario'
        verbose_name_plural = 'Escenarios'
        ordering = ['name']
        permissions = (("manage_venue", "Puede gestionar un espacio"), )

    def __str__(self):
        return self.name

    def __unicode__(self):
        return self.name
コード例 #4
0
ファイル: models.py プロジェクト: duichwer/okuna-api
class PostImage(models.Model):
    post = models.OneToOneField(Post,
                                on_delete=models.CASCADE,
                                related_name='image',
                                null=True)
    image = ProcessedImageField(
        verbose_name=_('image'),
        storage=post_image_storage,
        upload_to=upload_to_post_image_directory,
        width_field='width',
        height_field='height',
        blank=False,
        null=True,
        format='JPEG',
        options={'quality': 80},
        processors=[ResizeToFit(width=1024, upscale=False)])
    width = models.PositiveIntegerField(editable=False,
                                        null=False,
                                        blank=False)
    height = models.PositiveIntegerField(editable=False,
                                         null=False,
                                         blank=False)
    hash = models.CharField(_('hash'), max_length=64, blank=False, null=True)
    thumbnail = ProcessedImageField(
        verbose_name=_('thumbnail'),
        storage=post_image_storage,
        upload_to=upload_to_post_image_directory,
        blank=False,
        null=True,
        format='JPEG',
        options={'quality': 30},
        processors=[ResizeToFit(width=1024, upscale=False)])

    media = GenericRelation(PostMedia)

    @classmethod
    def create_post_image(cls, image, post_id):
        hash = sha256sum(file=image.file)
        return cls.objects.create(image=image, post_id=post_id, hash=hash)

    @classmethod
    def create_post_media_image(cls, image, post_id, order):
        hash = sha256sum(file=image.file)
        post_image = cls.objects.create(image=image,
                                        post_id=post_id,
                                        hash=hash,
                                        thumbnail=image)
        PostMedia.create_post_media(type=PostMedia.MEDIA_TYPE_IMAGE,
                                    content_object=post_image,
                                    post_id=post_id,
                                    order=order)
        return post_image
コード例 #5
0
class Band(models.Model):
    name = models.CharField(null=False, verbose_name='Nombre', max_length=240)
    tag = models.ForeignKey(Tag, null=True, related_name="band_tag", on_delete=models.SET_NULL)
    genre = models.CharField(null=True, blank=True, verbose_name='etiqueta', max_length=240)
    profile_image = ProcessedImageField(null=True, blank=True, upload_to=RandomFileName('band/'),
                                 processors=[ResizeToFit(512, 512, upscale=False)], format='JPEG', verbose_name='Imagen principal')
    band_image = ProcessedImageField(null=True, blank=True, upload_to=RandomFileName('band/'),
                                        processors=[ResizeToFit(1200, 600, upscale=False)], format='JPEG',
                                        verbose_name='Imagen de cabecera')
    profile_thumbnail = ImageSpecField(source='profile_image',
                                      processors=[ResizeToFill(150, 150, upscale=False)],
                                      format='JPEG',
                                      options={'quality': 70})

    profile_thumb = ImageRatioField('profile_image', '200x200')

    city = models.CharField(null=True, blank=True, verbose_name='Ciudad', max_length=140)
    num_members = models.IntegerField(null=True, blank=True, default=1)
    description = models.TextField(null=True, blank=True, verbose_name='Descripción')
    embed_code = models.TextField(null=True, blank=True, verbose_name='Códido embed para escucha (Bandcamp, Soundcloud, Spotify...')
    embed_media = models.TextField(null=True, blank=True, verbose_name='Códido embed de vídeo (Youtube, Vimeo...')

    facebook_link  = models.CharField(null=True, blank=True, max_length=250, verbose_name='Página de Facebook')
    youtube_link   = models.CharField(null=True, blank=True, max_length=250, verbose_name='Canal de Youtube')
    twitter_link   = models.CharField(null=True, blank=True, max_length=250, verbose_name='Perfil de Twitter')
    instagram_link = models.CharField(null=True, blank=True, max_length=250, verbose_name='Perfil de Instagram')
    bandcamp_link  = models.CharField(null=True, blank=True, max_length=250, verbose_name='Página de BandCamp')
    webpage_link   = models.CharField(null=True, blank=True, max_length=250, verbose_name='Página web')
    presskit_link  = models.CharField(null=True, blank=True, max_length=250, verbose_name='Presskit')
    spotify_link   = models.CharField(null=True, blank=True, max_length=250, verbose_name='Perfil de Spotify')

    owner = models.ForeignKey(User, null=True, blank=True, verbose_name="Responsable", on_delete=models.SET_NULL)
    hidden_in_catalog = models.BooleanField(default=False, verbose_name="Oculto en el listado principal",
                                            help_text="Ocultar el perfil del listado, para bandas que no son de Alcala pero se crea su perfil para ciclos y festivales")

    class Meta:
        verbose_name = 'Banda'
        verbose_name_plural = 'Bandas'
        ordering = ['name']
        permissions = (
            ("manage_band", "Puede gestionar bandas"),
        )

    def __str__(self):
        return self.name

    def __unicode__(self):
        return self.name
コード例 #6
0
ファイル: models.py プロジェクト: montel-ig/westend-indians
class Event(models.Model):
    subject = models.CharField(choices=SUBJECT_TYPES, null=True, max_length=20, default=SUBJECT_TYPES[0][0])
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, blank=True, editable=False, null=True)
    ingress = models.TextField(blank=True, null=True)
    description = RichTextField()

    image = models.ImageField(null=True, blank=True)
    image_wide = ImageSpecField(source='image',
                                processors=[ResizeToFit(width=1280, height=800, upscale=True)],
                                options={'quality': 80},
                                autoconvert=True)
    image_medium = ImageSpecField(source='image',
                                  processors=[ResizeToFit(width=750, height=800, upscale=True)],
                                  options={'quality': 80},
                                  autoconvert=True)


    start_time = models.DateTimeField(null=False)
    end_time = models.DateTimeField(blank=True, null=True)

    street_address = models.CharField(max_length=255)
    city = models.CharField(max_length=255, blank=True, null=True)
    lat = models.DecimalField(max_digits=19, decimal_places=16, null=True, default=None, blank=True)
    lng = models.DecimalField(max_digits=19, decimal_places=16, null=True, default=None, blank=True)

    publication_date = models.DateTimeField(default=timezone.now, blank=True)
    visible = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        if (not self.slug) or (slugify(self.name) not in self.slug):
            self.slug = self.__get_unique_slug()
        super().save()

    def __str__(self):
        return f"{self.name}"

    def __get_unique_slug(self):
        slug = slugify(self.name)
        unique_slug = slug
        num = 1
        while Event.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug
コード例 #7
0
ファイル: tasks.py プロジェクト: thusoy/slingsby
def create_resizes_of_image(image):
    """ Create the web and thumb, and return a list of (source, dest) images to be transferred to
    the fileserver, including the original.
    """
    event = image.event
    year = event.startdate.split('-')[0]
    dest_media_folder = os.path.join('archive', year, slugify(event.name))

    # Add original to files to be transferred
    files_to_transfer = [(image.original.path,
                          os.path.join(dest_media_folder,
                                       '%d-original.jpg' % image.id))]

    # Do the actual conversion
    pil_img = PILImage.open(image.original)
    thumb = ImageOps.fit(pil_img, (75, 75), PILImage.ANTIALIAS)
    #thumb = ResizeToFit(75, 75).process(pil_img)
    websize = ResizeToFit(1500, 800, upscale=False).process(pil_img)
    for size, appendix in [(thumb, 'thumb'), (websize, 'web')]:
        filename = '%s-%s.jpg' % (image.id, appendix)
        local_path = os.path.join(settings.MEDIA_ROOT, 'local',
                                  'raw-archive-images', filename)
        if not os.path.exists(os.path.dirname(local_path)):
            os.mkdir(os.path.dirname(local_path))
        save_image(size, local_path, 'jpeg')
        files_to_transfer.append(
            (local_path, os.path.join(dest_media_folder, filename)))

    # Set the new URL to the original image
    image.original = None
    image.original = dest_media_folder + '/%d-original.jpg' % image.id

    return files_to_transfer
コード例 #8
0
class PostventaEventoEquipoDocumento(models.Model):
    evento = models.ForeignKey(PostventaEventoEquipo,
                               related_name='documentos',
                               on_delete=models.PROTECT,
                               db_column='equ')
    nombre_archivo = models.CharField(max_length=120, db_column='nombre')
    archivo = models.FileField(
        upload_to=postventa_evento_equipo_documento_upload_to,
        db_column='file',
        null=True)
    imagen = ProcessedImageField(
        processors=[ResizeToFit(1080, 720)],
        format='JPEG',
        options={'quality': 70},
        upload_to=postventa_evento_equipo_documento_upload_to,
        db_column='img',
        null=True)
    creado_por = models.ForeignKey(User,
                                   on_delete=models.PROTECT,
                                   blank=True,
                                   null=True,
                                   db_column='crt_by')

    class Meta:
        db_table = 'postventa_even_equip_docs'
        permissions = [
            ("list_postventaeventoequipodocumento",
             "Can list documentos evento postventa equipo"),
        ]
コード例 #9
0
class PostImage(models.Model):
    post = models.OneToOneField(Post,
                                on_delete=models.CASCADE,
                                related_name='image')
    image = ProcessedImageField(
        verbose_name=_('image'),
        storage=post_image_storage,
        upload_to=upload_to_post_image_directory,
        width_field='width',
        height_field='height',
        blank=False,
        null=True,
        format='JPEG',
        options={'quality': 100},
        processors=[ResizeToFit(width=1024, upscale=False)])
    width = models.PositiveIntegerField(editable=False,
                                        null=False,
                                        blank=False)
    height = models.PositiveIntegerField(editable=False,
                                         null=False,
                                         blank=False)
    hash = models.CharField(_('hash'), max_length=64, blank=False, null=True)

    @classmethod
    def create_post_image(cls, image, post_id):
        hash = sha256sum(file=image.file)
        return cls.objects.create(image=image, post_id=post_id, hash=hash)
コード例 #10
0
ファイル: pdf.py プロジェクト: reclamador/document_clipper
 def image_to_pdf(self, img, pdf_path=None, **kwargs):
     """
     Converts an input image file to a PDF file.
     :param img: image file opened with the PIL library.
     :param pdf_path: optional parameter indicating file path of the to-be-generated PDF file.
     A temporary file is created if no value is provided.
     :param kwargs: any parameter accepted by Image.save i.e. quality
     :return:
     """
     processor = ResizeToFit(width=self.max_size_in_pixels[0],
                             height=self.max_size_in_pixels[1])
     img = processor.process(img)
     # Create a white canvas and paste the image
     final_img_width = min(img.size[0], self.max_size_in_pixels[0])
     final_img_height = min(img.size[1], self.max_size_in_pixels[1])
     tmp_image = Image.new("RGB", (final_img_width, final_img_height),
                           "white")
     margin_left = 0
     margin_top = 0
     tmp_image.paste(
         img, (margin_left, margin_top, final_img_width, final_img_height))
     tmp_image = self.compress_img(tmp_image, quality=70)
     # Save the image as .pdf file
     if not pdf_path:
         f = NamedTemporaryFile(delete=False)
         pdf_path = f.name
     tmp_image.save(pdf_path, "PDF", resolution=100.0, **kwargs)
     return pdf_path
コード例 #11
0
def faviconGenerator(originalImage, directory):
    index = 0

    sizes = [
        #
        #	FileName		LogoSize		BoxSize
        #
        ["favicon-32", [32, 32], [32, 32]],
        ["favicon-57", [57, 57], [57, 57]],
        ["favicon-76", [76, 76], [76, 76]],
        ["favicon-96", [96, 96], [96, 96]],
        ["favicon-120", [120, 120], [120, 120]],
        ["favicon-128", [128, 128], [128, 128]],
        ["smalltile", [128, 128], [128, 128]],
        ["favicon-144", [144, 144], [144, 144]],
        ["favicon-152", [152, 152], [152, 152]],
        ["favicon-180", [180, 180], [180, 180]],
        ["favicon-196", [196, 196], [196, 196]],
        ["favicon-228", [228, 228], [228, 228]],
        ["mediumtile", [270, 270], [270, 270]],
        ["widetile", [270, 270], [558, 270]],
        ["largetile", [558, 558], [558, 558]],
    ]

    outfile = os.path.splitext(originalImage)[0] + ".png"

    for size in sizes:
        im = Image.open(originalImage)
        processor = ProcessorPipeline([ResizeToFit(size[1][0], size[1][1])])
        result = processor.process(im)
        background = Image.new('RGBA', size[2], (255, 255, 255, 0))
        background.paste(result, (int((size[2][0] - result.size[0]) / 2),
                                  int((size[2][1] - result.size[1]) / 2)))
        background.save(directory + "/" + size[0] + ".png")
        print("{}.png generated".format(size[0]))
コード例 #12
0
ファイル: views.py プロジェクト: kravciuk/vcms
class Thumbnail(ImageSpec):
    processors = [
        ResizeToFit(settings.VCMS_SHARE_THUMBNAIL_WEIGHT,
                    settings.VCMS_SHARE_THUMBNAIL_HEIGHT, False)
    ]
    format = 'JPEG'
    options = {'quality': 80}
コード例 #13
0
ファイル: category.py プロジェクト: jjoseba/vicci
class Category(models.Model):

    name = models.CharField(null=True,
                            blank=True,
                            verbose_name=_('Nombre'),
                            max_length=250)
    description = models.TextField(null=True,
                                   blank=True,
                                   verbose_name=_('Descripción'))
    color = models.CharField(
        null=True,
        blank=True,
        verbose_name=_('Color de etiqueta (código hexadecimal)'),
        max_length=30)
    photo = ProcessedImageField(
        null=True,
        blank=True,
        upload_to=RandomFileName('momenti/'),
        verbose_name=_('Imagen principal'),
        processors=[ResizeToFit(1024, 1024, upscale=False)],
        format='JPEG')
    photo_thumbnail = ImageSpecField(
        source='photo',
        processors=[ResizeToFill(150, 150, upscale=False)],
        format='JPEG',
        options={'quality': 70})

    class Meta:
        verbose_name = _('Categoría')
        verbose_name_plural = _('Categorías')
        ordering = ['name']

    def __unicode__(self):
        return self.name if self.name else ''
コード例 #14
0
ファイル: models.py プロジェクト: cionman/django_tdd
class Toy(models.Model):
    title = models.CharField(max_length=100)
    toy_image = models.ImageField(upload_to='toy/%Y/%m/%d',
                                  null=True,
                                  blank=True)
    image_thumb = ImageSpecField(
        source='toy_image',
        processors=[ResizeToFit(400, 400)],  # 처리할 작업목록
        format='JPEG',
        options={'quality': 80},
    )
    tech_stack = models.ManyToManyField('TechStack',
                                        related_name='toy_techstack_set',
                                        null=True,
                                        blank=True)
    start_date = models.DateField()
    end_date = models.DateField(null=True, blank=True)
    desc = models.TextField()
    url = models.CharField(max_length=200)
    idate = models.DateTimeField(auto_now_add=True)
    mdate = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "toy"
        ordering = ["-idate"]

    def __str__(self):
        return self.title
コード例 #15
0
class WebSpec(ImageSpec):
    format = 'JPEG'
    options = {'quality': 90}
    processors = [
        Transpose(Transpose.AUTO),
        ResizeToFit(1600, 1600, upscale=False)
    ]
コード例 #16
0
class IntercoopEntity(models.Model):

    name = models.CharField(null=True, blank=True, max_length=250, verbose_name=_('Nombre'))
    expiration = models.IntegerField(default=INVITE_DURATION_YEARS, verbose_name=_('Años de validez'))
    include_code = models.BooleanField(default=True, verbose_name=_('Incluir identificador de socia externa para validación'))
    code_label = models.CharField(null=True, blank=True, max_length=200, verbose_name=_('Etiqueta del identificador'))

    logo = ProcessedImageField(null=True, blank=True, upload_to=RandomFileName('intercoop/'),
                               verbose_name='Logo en alta resolución',
                               processors=[ResizeToFit(1024, 1024, upscale=False)], format='JPEG',
                               options={'quality': 80})

    description = models.TextField(null=True, blank=True, verbose_name='Descripción')
    slug = models.CharField(null=True, blank=True, max_length=200,verbose_name='Enlace permanente', help_text='Identificador para el enlace de alta')

    class Meta:
        verbose_name = _('Entidad de intercooperación')
        verbose_name_plural = _('Entidades de intercooperación')
        ordering = ('name',)
        permissions = (
            ("mespermission_can_manage_entity", _("Puede gestionar entidades de intercooperación")),
            ("mespermission_can_add_entity", _("Puede añadir entidades de intercooperación")),
        )

    def __str__(self):
        return self.name

    def __unicode__(self):
        return self.name
コード例 #17
0
ファイル: models.py プロジェクト: dsipakou/gallery-api
class Image(models.Model):
    uuid = models.CharField(_("image uuid"),
                            max_length=36,
                            null=True,
                            blank=True,
                            unique=True)
    photo = ProcessedImageField(
        verbose_name=_("photo"),
        upload_to="uploads/gallery/images",
        processors=[ResizeToFit(3200, 1800)],
        format="PNG",
    )
    photo_preview = ImageSpecField(source="photo",
                                   processors=[ResizeToCover(400, 400)],
                                   format="PNG")
    name = models.CharField(_("name"), max_length=80, blank=False)
    description = models.TextField(_("description"),
                                   max_length=8000,
                                   blank=True)
    show_later = models.BooleanField(_("latest picture"), blank=False)
    date = models.DateTimeField(_("picture date"), blank=False)
    date_created = models.DateTimeField(_("date created"),
                                        auto_created=True,
                                        auto_now_add=True)
    date_updated = models.DateTimeField(_("date updated"), auto_now=True)

    def __str__(self):
        return self.name

    def admin_image_tag(self):
        return mark_safe('<img style="width: 150px;" src="{}" />'.format(
            self.photo_preview.url))

    admin_image_tag.short_desription = _("image short desc")
コード例 #18
0
class GalleryPhoto(models.Model):

    gallery = models.ForeignKey(Gallery,
                                null=True,
                                related_name='photos',
                                on_delete=models.CASCADE)
    order = models.IntegerField(verbose_name=_('Orden'), default=0)
    title = models.CharField(null=True,
                             blank=True,
                             verbose_name=_('Título'),
                             max_length=250)
    image = ProcessedImageField(
        null=True,
        blank=True,
        upload_to=RandomFileName('photos/'),
        processors=[ResizeToFit(512, 512, upscale=False)],
        format='JPEG')

    image_thumbnail = ImageSpecField(
        source='image',
        processors=[ResizeToFill(150, 150, upscale=False)],
        format='JPEG',
        options={'quality': 70})

    uploaded = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = _('Foto')
        verbose_name_plural = _('Fotos')
        ordering = ['order']
コード例 #19
0
class User(SignatureModel, AbstractUser):
    """Extends the standard django user model with additional fields"""

    default_approver = models.ForeignKey(
        'User',
        on_delete=models.PROTECT,
        related_name='+',
        to_field='username',
        db_column='default_approver',
        blank=True,
        null=True,
    )
    role = models.CharField(max_length=512, blank=True, null=True)
    image = ProcessedImageField(
        upload_to=get_profile_image_filename,
        null=True,
        blank=True,
        processors=[ResizeToFit(1000, 1000)],
        format='JPEG',
        options={'quality': 70},
    )
    phone = PhoneField(max_length=512, blank=True, null=True)
    room = models.CharField(max_length=512, blank=True, null=True)
    on_facewall = models.BooleanField(default=True)
    division = models.ForeignKey('Division', on_delete=models.CASCADE, db_column='division', default=1)

    def get_absolute_url(self):
        return reverse('staff_list:profile', args=[self.pk])

    def phone_number(self):
        if self.phone:
            return self.phone.replace('+44 (0)1865 2', '')
コード例 #20
0
def faviconGenerator(imageLocation):
    originalImage = imageLocation
    directory = '/opt/osp/static'

    index = 0

    sizes = [
	#
	#	FileName		LogoSize		BoxSize
	#
		["favicon-16x16",		[16,16],		[16,16]],
		["favicon-32x32",		[32,32],		[32,32]],
		["apple-touch-icon",	[180,180],		[180,180]],
        ["android-chrome-192x192", [192, 192], [192, 192]],
        ["android-chrome-512x512", [512, 512], [512, 512]],

	]

    outfile = os.path.splitext(originalImage)[0] + ".png"

    for size in sizes:
        im = Image.open(originalImage)
        processor = ProcessorPipeline([ResizeToFit(size[1][0], size[1][1])])
        result = processor.process(im)
        background = Image.new('RGBA', size[2], (255, 255, 255, 0))
        background.paste(
			result, (int((size[2][0] - result.size[0]) / 2), int((size[2][1] - result.size[1]) / 2))
		)
        background.save(directory + "/" + size[0] + ".png")
    im = Image.open(originalImage)
    processor = im.resize((16,16), Image.LANCZOS)
    processor.save(directory + "/favicon.ico")
    return 'OK'
コード例 #21
0
ファイル: models.py プロジェクト: cionman/django_tdd
class Codelab(CommonInfo):
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='codelab/%Y/%m/%d',
                              help_text='대표이미지를 선택해주세요.')
    image_thumb = ImageSpecField(
        source='image',
        processors=[ResizeToFit(400, 400)],  # 처리할 작업목록
        format='JPEG',
        options={'quality': 80},
    )
    desc = models.CharField(max_length=200)
    favorite = models.IntegerField(default=0)
    isview = models.BooleanField(default=True)
    category = models.ForeignKey('CodelabCategory',
                                 null=True,
                                 on_delete=models.SET_NULL)

    class Meta:
        db_table = 'codelab'
        ordering = ['-idate']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('codelab:codelab', args=[self.id])
コード例 #22
0
class MyUser(UserMixin,AbstractUser):
    ROLES = (('A', 'Admin'),
             ('SA','Super Admin'),
             ('E','Enumerator'),
             ('V', 'View Only'),
    )
    SEX = (('MALE', 'Male'), ('FEMALE', 'Female'), ('NS', 'Not Set'))
    # TYPE=(('AT','Attendee'),('OG','Organizer'))
    role=models.CharField(max_length=45,default="A",choices=ROLES)
    phone = models.CharField(max_length=50, null=True, blank=True)
    google_profile_image = models.URLField(max_length=200, blank=True, null=True)
    dob = models.DateField(null=True, blank=True)
    bio = models.CharField(max_length=100, null=True, blank=True)
    image = models.ImageField("uploads", upload_to=scramble, null=True, blank=True)
    gender = models.CharField(max_length=5, choices=SEX, default='NS')
    allow_notification = models.BooleanField(default=True, )
    main_image = ImageSpecField(source='image', processors=[ResizeToFit(height=400)], format='JPEG',
                                      options={'quality': 80})
    confirm_code = models.IntegerField(null=True, blank=True)
    reset_code = models.IntegerField(null=True, blank=True)
    old_password = models.CharField(null=True, blank=True,max_length=55)
    changed_password=models.BooleanField(default=False)
    verified=models.BooleanField(default=False)
    dummy=models.BooleanField(default=False)

    class Meta:
        ordering=('id',)
コード例 #23
0
class Profile(models.Model):
    user = models.OneToOneField(User,
                                related_name='profile',
                                on_delete=models.CASCADE)

    image = models.ImageField(verbose_name='Image',
                              validators=[validate_image],
                              upload_to=make_upload_path,
                              blank=True,
                              null=True)

    created_at = models.DateTimeField(verbose_name='Publication date',
                                      auto_now_add=True,
                                      null=True)
    updated_at = models.DateTimeField(verbose_name='Updated',
                                      auto_now=True,
                                      null=True)

    thumbnail = ImageSpecField(
        [ResizeToFit(height=60, width=60, upscale=True)], source='image')
    middle = ImageSpecField([ResizeToFit(height=180, width=180, upscale=True)],
                            source='image')

    def __str__(self):
        return self.user.username

    @property
    def upload_dir(self):
        return 'profile/images'

    class Meta:
        ordering = ('-pk', )
        verbose_name = 'Profile'
        verbose_name_plural = 'Profiles'

    def admin_thumbnail(self):
        if self.image:
            return mark_safe('<img src="{}" />'.format(self.thumbnail.url))
        else:
            return ''

    admin_thumbnail.short_description = 'Image'
    admin_thumbnail.allow_tags = True

    @property
    def username(self):
        return self.user.username
コード例 #24
0
class New(models.Model):

    id = models.BigIntegerField(unique=True, primary_key=True)
    uuid = models.UUIDField(default=uuid.uuid4,
                            editable=False,
                            unique=True,
                            verbose_name="uuid")
    title = models.CharField(max_length=200, verbose_name="Название")
    description = models.TextField(max_length=1000,
                                   verbose_name="Описание новости")
    creator = models.ForeignKey(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                verbose_name="Пользователь")
    image = ProcessedImageField(
        format='JPEG',
        options={'quality': 90},
        upload_to=upload_to_user_directory,
        processors=[ResizeToFit(width=1024, upscale=False)])
    is_active = models.BooleanField(default=False, verbose_name='Пост активен')
    is_deleted = models.BooleanField(default=False, verbose_name='Пост удален')
    is_private = models.BooleanField(default=False,
                                     verbose_name='Пост приватный')
    content = RichTextUploadingField(
        config_name='default',
        external_plugin_resources=[(
            'youtube',
            '/static/ckeditor_plugins/youtube/youtube/',
            'plugin.js',
        )],
    )

    created = models.DateTimeField(auto_now_add=True,
                                   auto_now=False,
                                   verbose_name="Время публикации")
    votes_off = models.BooleanField(default=False,
                                    verbose_name='Лайки-дизлайки отключены')

    def __str__(self):
        return self.title

    class Meta:
        indexes = (BrinIndex(fields=['created']), )
        verbose_name = "пост"
        verbose_name_plural = "посты"

    def all_visits_count(self):
        from stst.models import NewNumbers

        return NewNumbers.objects.filter(new=self.pk).values('pk').count()

    def likes(self):
        from common.model.votes import NewVotes
        likes = NewVotes.objects.filter(parent=self, vote__gt=0)
        return likes

    def dislikes(self):
        from common.model.votes import NewVotes
        dislikes = NewVotes.objects.filter(parent=self, vote__lt=0)
        return dislikes
コード例 #25
0
def create_image_grid(items,
                      thumb_width=500,
                      thumb_height=500,
                      padding=0,
                      background=(255, 255, 255),
                      resize_to_fill=False):
    """ Greate a grid of images.

   :param items:  iterable of [(row, col, image), ...]
   """

    # adjust so that the top left is (0, 0)
    min_row = min(t[0] for t in items)
    min_col = min(t[1] for t in items)
    items = [(row - min_row, col - min_col, image)
             for (row, col, image) in items]

    # find bottom-right
    nrows = 1 + max(t[0] for t in items)
    ncols = 1 + max(t[1] for t in items)

    # output canvas
    cell_width = thumb_width + padding
    cell_height = thumb_height + padding
    size = (ncols * cell_width, nrows * cell_height)
    print 'Creating image grid...'
    print 'nrows:', nrows
    print 'ncols:', ncols
    print 'size:', size
    out = Image.new(mode='RGB', size=size, color=background)

    # splat images
    filled = np.zeros((nrows, ncols), dtype=np.bool)
    for (row, col, image) in items:
        if filled[row, col]:
            continue
        filled[row, col] = True

        try:
            if isinstance(image, basestring):
                thumb = Image.open(image)
            else:
                thumb = open_image(image)
        except Exception as e:
            print e
            continue

        if resize_to_fill:
            thumb = ResizeToFill(thumb_width, thumb_height).process(thumb)
        else:
            thumb = ResizeToFit(thumb_width, thumb_height).process(thumb)
            thumb = ResizeCanvas(thumb_width, thumb_height,
                                 color=background).process(thumb)

        x = col * cell_width
        y = row * cell_height
        out.paste(thumb, box=(x, y, x + thumb_width, y + thumb_height))

    return out
コード例 #26
0
class IndexConfiguration(SingletonModel):
    def header_imagen_upload_to(instance, filename):
        new_filename = get_image_name(clase='Header', filename=filename)
        return "web/img/index/%s" % new_filename

    def overlay_publicidad_imagen_upload_to(instance, filename):
        new_filename = get_image_name(clase='Overlay', filename=filename)
        return "web/img/index/%s" % new_filename

    header_titulo = models.CharField(max_length=150, default='Aqui el titulo')
    header_text = models.TextField(max_length=150,
                                   default='Aqui la descripción',
                                   null=True,
                                   blank=True)
    header_text_en = models.TextField(max_length=150,
                                      default='Aqui la descripción Ingles',
                                      null=True,
                                      blank=True)
    header_imagen = ProcessedImageField(
        processors=[SmartResize(width=2560, height=1500, upscale=False)],
        format='JPEG',
        options={'quality': 50},
        upload_to=header_imagen_upload_to,
        verbose_name='Imagen Cabezote (2560 x 1500)',
        null=True,
        blank=True)
    header_imagen_normal = ImageSpecField(
        processors=[SmartResize(width=1280, height=750, upscale=False)],
        options={'quality': 50},
        source='header_imagen',
        format='JPEG')
    header_imagen_webp = ImageSpecField(
        processors=[SmartResize(width=1280, height=750, upscale=False)],
        options={'quality': 50},
        source='header_imagen',
        format='WEBP')
    header_imagen_cell = ImageSpecField(
        source='header_imagen',
        processors=[SmartResize(width=412, height=660, upscale=False)],
        format='JPEG')
    header_imagen_cell_webp = ImageSpecField(
        source='header_imagen',
        processors=[SmartResize(width=412, height=660, upscale=False)],
        format='WEBP')
    overlay_publicidad = ProcessedImageField(
        processors=[ResizeToFit(width=1024, height=768, upscale=False)],
        format='JPEG',
        options={'quality': 70},
        upload_to=overlay_publicidad_imagen_upload_to,
        verbose_name='Imagen Overlay Publicidad (1024 x 768)',
        null=True,
        blank=True)
    overlay_url = models.URLField(blank=True, null=True)

    def __unicode__(self):
        return "Index"

    class Meta:
        verbose_name = "Index"
コード例 #27
0
class Image(SyncableFileModel):
    image = ProcessedImageField(
        upload_to='images',
        format='JPEG',
        options={'quality': 60},
        processors=[ResizeToFit(width=2000, height=2000, upscale=False)])

    syncable_file_fields = ['image']
コード例 #28
0
class Band(UpdateDataVersionMixin, models.Model):
    name = models.CharField(null=False, verbose_name='Nombre', max_length=240)
    tag = models.ForeignKey(Tag, related_name="band_tag")
    genre = models.CharField(null=True, blank=True, verbose_name='etiqueta', max_length=240)
    profile_image = ProcessedImageField(null=True, blank=True, upload_to=RandomFileName('band/'),
                                        processors=[ResizeToFit(512, 512, upscale=False)], format='JPEG',
                                        verbose_name='Imagen principal')
    band_image = ProcessedImageField(null=True, blank=True, upload_to=RandomFileName('band/'),
                                     processors=[ResizeToFit(1200, 600, upscale=False)], format='JPEG',
                                     verbose_name='Imagen de cabecera')
    profile_thumbnail = ImageSpecField(source='profile_image',
                                       processors=[ResizeToFill(150, 150, upscale=False)],
                                       format='JPEG',
                                       options={'quality': 70})
    city = models.CharField(null=True, blank=True, verbose_name='Ciudad', max_length=140)
    num_members = models.IntegerField(null=True, blank=True, default=1)
    description = models.TextField(null=True, blank=True, verbose_name='Descripción')
    embed_code = models.TextField(null=True, blank=True,
                                  verbose_name='Códido embed (enlace o iframe) para escucha (Bandcamp, Soundcloud, Spotify...)')
    embed_media = models.TextField(null=True, blank=True,
                                   verbose_name='Códido embed (enlace o iframe) de vídeo (Youtube, Vimeo...)')

    facebook_link = models.CharField(null=True, blank=True, verbose_name='Página de Facebook', max_length=250)
    youtube_link = models.CharField(null=True, blank=True, verbose_name='Canal de Youtube', max_length=250)
    twitter_link = models.CharField(null=True, blank=True, verbose_name='Perfil de Twitter', max_length=250)
    bandcamp_link = models.CharField(null=True, blank=True, verbose_name='Página de BandCamp', max_length=250)
    presskit_link = models.CharField(null=True, blank=True, verbose_name='Presskit', max_length=250)
    webpage_link = models.CharField(null=True, blank=True, verbose_name='Página web', max_length=250)
    spotify_link = models.CharField(null=True, blank=True, verbose_name='Perfil de Spotify', max_length=250)
    instagram_link = models.CharField(null=True, blank=True, verbose_name='Perfil de Instagram', max_length=250)

    lineup_order = models.IntegerField(default=3, verbose_name='Línea de cartel (1, 2 o 3)')
    lineup_secondary_order = models.IntegerField(default=1, verbose_name='Orden en linea de cartel')

    archived = models.BooleanField(default=False, verbose_name='Archivada')
    archive_year = models.IntegerField(verbose_name='Año', null=True, blank=True)

    objects = ArchivedManager()

    class Meta:
        verbose_name = 'Banda'
        verbose_name_plural = 'Bandas'
        ordering = ['lineup_order', 'lineup_secondary_order']

    def __unicode__(self):
        return self.name
コード例 #29
0
def upload(request):
    """
    이미지를 전송받고 리사이징 및 초보적인 투명화를 진행
    유저에거 컨펌 받기 위해 사진 두 장(원본 리사이즈드, 투명화)의 참조 경로를 리턴함
    """
    if 'image' in request.FILES:
        userfile = request.FILES['image']
        filename = userfile._name

        # 디렉토리가 없으면 생성
        if not os.path.exists(settings.CLOTHES_ROOT):
            os.makedirs(settings.CLOTHES_ROOT)
        if not os.path.exists(settings.CLOTHES_ROOT_TMP):
            os.makedirs(settings.CLOTHES_ROOT_TMP)

        # 임시 파일명 생성
        uuid_list = str(uuid.uuid4()).split('-')
        prefix = uuid_list[0] + '-' + uuid_list[4]
        temp_file = prefix + filename[filename.rindex('.') - 1:]
        temp_file_png = \
            temp_file[0:temp_file.rindex('.')] + '-resized.png'

        # 원본 저장
        fp = open(os.path.join(settings.CLOTHES_ROOT_TMP, temp_file), 'wb')
        for chunk in userfile.chunks():
            fp.write(chunk)
        fp.close()

        # 스마트폰 카메라로 찍은 경우 특정 orientation 에서 이미지가 돌아가는 문제 수정
        source = Image.open(os.path.join(settings.CLOTHES_ROOT_TMP, temp_file))
        if source._getexif() != None:
            exif = dict((ExifTags.TAGS[k], v) \
                for k, v in source._getexif().items() if k in ExifTags.TAGS)
            if 'Orientation' in list(exif.keys()):
                source = source.rotate(-90, expand=True) \
                    if exif['Orientation'] == 6 \
                    else source

        # 임시 리사이즈 및 저장
        processor = ResizeToFit(width=250, height=250)
        target = processor.process(source)
        target.save(os.path.join(settings.CLOTHES_ROOT_TMP, temp_file_png))

        # 초보적 배경 제거
        if source.mode == "RGBA" or "transparency" in source.info:
            mod_file_png = temp_file_png
        else:
            mod_file_png = removebg(settings.CLOTHES_ROOT_TMP, temp_file_png)

        json_data = json.dumps({'org': temp_file_png, 'mod': mod_file_png})

        # processor = Thumbnail(width=150, height=150)
        # source = Image.open(os.path.join(settings.CLOTHES_ROOT_TMP, temp_file))
        # target = processor.process(source)

        return HttpResponse(json_data, content_type="application/json")

    return HttpResponse('Failed to Upload File')
コード例 #30
0
def test_resizetofit():
    # First create an image with aspect ratio 2:1...
    img = Image.new('RGB', (200, 100))

    # ...then resize it to fit within a 100x100 canvas.
    img = ResizeToFit(100, 100).process(img)

    # Assert that the image has maintained the aspect ratio.
    eq_(img.size, (100, 50))