拍爱

storage_utils.py 3.6KB

    # -*- coding: utf-8 -*- import os import shortuuid from django.conf import settings from django.core.files.storage import default_storage from django.db import transaction from filemd5 import calculate_md5 from photo.models import PhotoUUIDInfo from utils.thumbnail_utils import make_thumbnail from utils.watermark_utils import watermark_wrap class DotDict(dict): """ dot.notation access to dictionary attributes """ def __getattr__(self, attr): return self.get(attr) __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ @transaction.atomic def file_save(file_, prefix='img', ext='jpeg', watermark=False, thumbnail=False): ext = os.path.splitext(file_.name)[-1] or ext photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=calculate_md5(file_)) photo_path = photo.photo_path if not photo_path: photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext) if default_storage.exists(photo_path): default_storage.delete(photo_path) default_storage.save(photo_path, file_) photo.photo_path = photo_path photo.save() if watermark: if not photo.photo_watermark_path: photo_watermark_path = 'photo/{}{}'.format(shortuuid.uuid(), ext) watermark_wrap( os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'), settings.WATERMARK_LOGO, os.path.join(settings.MEDIA_ROOT, photo_watermark_path).replace('\\', '/') ) photo.photo_watermark_path photo.save() if thumbnail: if not photo.photo_thumbnail_path: # 双列: 540, 40-50K photo_thumbnail_path = photo_path.replace('.', '_thumbnail.') photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail( os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'), os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'), settings.THUMBNAIL_MAX_WIDTH ) photo.photo_w = photo_w photo.photo_h = photo_h photo.photo_thumbnail_path = photo_thumbnail_path photo.photo_thumbnail_w = photo_thumbnail_w photo.photo_thumbnail_h = photo_thumbnail_h if not photo.photo_thumbnail2_path: # 单列: 1080, xx-100K photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.') photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail( os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'), os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'), settings.THUMBNAIL_MAX_WIDTH2 ) photo.photo_w = photo_w photo.photo_h = photo_h photo.photo_thumbnail2_path = photo_thumbnail2_path photo.photo_thumbnail2_w = photo_thumbnail2_w photo.photo_thumbnail2_h = photo_thumbnail2_h photo.save() return DotDict({ 'ext': ext, 'photo_path': photo_path, 'photo_w': photo.photo_w, 'photo_h': photo.photo_h, 'photo_watermark_path': photo.photo_watermark_path, 'photo_thumbnail_path': photo.photo_thumbnail_path, 'photo_thumbnail_w': photo.photo_thumbnail_w, 'photo_thumbnail_h': photo.photo_thumbnail_h, 'photo_thumbnail2_path': photo.photo_thumbnail2_path, 'photo_thumbnail2_w': photo.photo_thumbnail2_w, 'photo_thumbnail2_h': photo.photo_thumbnail2_h, })