|
# -*- 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_=None, file_path=None, prefix='img', ext='jpeg', watermark=False, thumbnail=False):
# Photo
file_ = file_ or default_storage.open(file_path)
# Ext
ext = os.path.splitext(file_.name)[-1] or ext
# Photo MD5
photo_md5 = calculate_md5(file_)
# Photo UUID Get or Create
photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=photo_md5)
# 无水印
if not photo.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_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
)
if watermark:
watermark_wrap(
os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
settings.WATERMARK_LOGO,
os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/')
)
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_md5': photo_md5,
'photo_path': photo.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,
})
|