# coding=utf-8 from PIL import Image from django.db import models from django.conf import settings from django.utils import timezone from utils.file_operation import UploadFile, DeleteFile, DownloadFace class ImagesManager(models.Manager): def employee_addnew(self, user, type, file): return self._addnew(user, type, file) def _addnew(self, user, type, file): width = None height = None path = ImagesManager.calculatePath(type, user.id) modify_size = ImagesManager.canModifySize(type) filename = UploadFile(file, path) fullname = "%s/%s" % (settings.MEDIA_ROOT, filename) try: img = Image.open(fullname) width, height = img.size # 缩略图压缩宽或高最大200 if modify_size and (width > 200 or height > 200): if width > height: size = (200, int(height * 200 / width)) elif width < height: size = (int(width * 200 / height), 200) else: size = (200, 200) img = img.resize(size, Image.ANTIALIAS) img.save(fullname) width, height = img.size except: pass instance = self.model( user=user, type=type, name=file.name, picture=filename, width=width, height=height, create_time=timezone.now() ) instance.save() return instance @staticmethod def calculatePath(type, user_id): path_map = { Images.USEDVEHICLE_FILE: usedvehicle_file, Images.USEDVEHICLE_THUMBNAIL: usedvehicle_thumbnail_file, Images.PRODUCT_COVER: product_cover, Images.PRODUCT_FILE: product_file, Images.ACTIVITY_COVER: activity_cover, Images.VEHICLE_SERIES_THUMBNAIL: vehicle_cover, Images.VEHICLE_MODEL_THUMBNAIL: vehicle_cover, Images.CUSTOMER_FACE: customer_face_file, Images.SHOP_FILE: shop_file, Images.VEHICLE_LICENSE: vehicle_license, Images.DRIVE_LICENSE_FRONT: vehicle_license, Images.DRIVE_LICENSE_BACK: vehicle_license, } return path_map[type] + str(user_id) + '/' @staticmethod def canModifySize(type): modify_size = False can_modify_list = [ Images.USEDVEHICLE_THUMBNAIL ] if type in can_modify_list: modify_size = True return modify_size usedvehicle_file = "usedvehicle/detail/" usedvehicle_thumbnail_file = "usedvehicle/" product_file = "product/file/" product_cover = "product/" vehicle_cover = "vehicle/" activity_cover = "activity/" customer_face_file = 'customer/face/' shop_file = 'store/' vehicle_license = 'customer/vehicle/' class Images(models.Model): USEDVEHICLE_FILE = 1 USEDVEHICLE_THUMBNAIL = 2 PRODUCT_COVER = 3 PRODUCT_FILE = 4 ACTIVITY_COVER = 5 VEHICLE_SERIES_THUMBNAIL = 6 VEHICLE_MODEL_THUMBNAIL = 7 CUSTOMER_FACE = 8 SHOP_FILE = 9 VEHICLE_LICENSE = 10 DRIVE_LICENSE_FRONT = 11 DRIVE_LICENSE_BACK = 12 TYPE_CHOICES = ( (USEDVEHICLE_FILE, u'二手车图片'), (USEDVEHICLE_THUMBNAIL, u'二手车缩略图'), (PRODUCT_COVER, u'商品封面图'), (PRODUCT_FILE, u'商品图片'), (ACTIVITY_COVER, u'活动封面图'), (VEHICLE_SERIES_THUMBNAIL, u'车系展示图'), (VEHICLE_MODEL_THUMBNAIL, u'车型展示图'), (CUSTOMER_FACE, u'客户头像'), (SHOP_FILE, u'门店图片'), (VEHICLE_LICENSE, u'行驶证'), (DRIVE_LICENSE_FRONT, u'驾驶证正面'), (DRIVE_LICENSE_BACK, u'驾驶证反面'), ) user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT) type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型") name = models.CharField(verbose_name=u'图片名', max_length=250) picture = models.CharField(verbose_name=u'图片路径', max_length=250) width = models.IntegerField(verbose_name=u"图片宽度") height = models.IntegerField(verbose_name=u"图片高度") create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False) objects = ImagesManager() class Meta: db_table = 'images' verbose_name = u'图片' ordering = ['-create_time'] index_together = ( 'type', 'create_time', ) default_permissions = () def del_images(self): picture = self.picture self.delete() DeleteFile(picture) def get_path(self): return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture) @staticmethod def downLoadFace(customer, url): save_path = customer_face_file + str(customer.user.id) + '/' filename = DownloadFace(url, save_path, 'jpg') name = filename.split('/')[-1] fullname = "%s/%s" % (settings.MEDIA_ROOT, filename) width = None height = None try: img = Image.open(fullname) width, height = img.size except: pass instance = Images.objects.create( user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename, width=width, height=height, create_time=timezone.now() ) instance.save() return instance