123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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):
-
- file_ = file_ or default_storage.open(file_path)
-
- ext = os.path.splitext(file_.name)[-1] or ext
-
- photo_md5 = calculate_md5(file_)
-
- 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:
- if settings.WATERMARK_OR_NOT:
- photo_watermark_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
- watermark_wrap(
- os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
- settings.WATERMARK_LOGO_PATH,
- os.path.join(settings.MEDIA_ROOT, photo_watermark_path).replace('\\', '/')
- )
- photo.photo_watermark_path = photo_watermark_path
- else:
- photo.photo_watermark_path = photo_path
- photo.save()
-
- if thumbnail:
- if not photo.photo_thumbnail_path:
-
- 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:
-
- 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 and settings.WATERMARK_OR_NOT:
- watermark_wrap(
- os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
- settings.WATERMARK_LOGO_PATH,
- 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,
- })
|