models.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # coding=utf-8
  2. from PIL import Image
  3. from django.db import models
  4. from django.conf import settings
  5. from django.utils import timezone
  6. from utils.file_operation import UploadFile, DeleteFile, DownloadFace
  7. class ImagesManager(models.Manager):
  8. def employee_addnew(self, user, type, file):
  9. return self._addnew(user, type, file)
  10. def _addnew(self, user, type, file):
  11. width = None
  12. height = None
  13. path = ImagesManager.calculatePath(type, user.id)
  14. modify_size = ImagesManager.canModifySize(type)
  15. filename = UploadFile(file, path)
  16. fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
  17. try:
  18. img = Image.open(fullname)
  19. width, height = img.size
  20. # 缩略图压缩宽或高最大200
  21. if modify_size and (width > 200 or height > 200):
  22. if width > height:
  23. size = (200, int(height * 200 / width))
  24. elif width < height:
  25. size = (int(width * 200 / height), 200)
  26. else:
  27. size = (200, 200)
  28. img = img.resize(size, Image.ANTIALIAS)
  29. img.save(fullname)
  30. width, height = img.size
  31. except:
  32. pass
  33. instance = self.model(
  34. user=user,
  35. type=type,
  36. name=file.name,
  37. picture=filename,
  38. width=width,
  39. height=height,
  40. create_time=timezone.now()
  41. )
  42. instance.save()
  43. return instance
  44. @staticmethod
  45. def calculatePath(type, user_id):
  46. path_map = {
  47. Images.USEDVEHICLE_FILE: usedvehicle_file,
  48. Images.USEDVEHICLE_THUMBNAIL: usedvehicle_thumbnail_file,
  49. Images.PRODUCT_COVER: product_cover,
  50. Images.PRODUCT_FILE: product_file,
  51. Images.ACTIVITY_COVER: activity_cover,
  52. Images.VEHICLE_SERIES_THUMBNAIL: vehicle_cover,
  53. Images.VEHICLE_MODEL_THUMBNAIL: vehicle_cover,
  54. Images.CUSTOMER_FACE: customer_face_file,
  55. Images.SHOP_FILE: shop_file,
  56. Images.VEHICLE_LICENSE: vehicle_license,
  57. Images.DRIVE_LICENSE_FRONT: vehicle_license,
  58. Images.DRIVE_LICENSE_BACK: vehicle_license,
  59. }
  60. return path_map[type] + str(user_id) + '/'
  61. @staticmethod
  62. def canModifySize(type):
  63. modify_size = False
  64. can_modify_list = [
  65. Images.USEDVEHICLE_THUMBNAIL
  66. ]
  67. if type in can_modify_list:
  68. modify_size = True
  69. return modify_size
  70. usedvehicle_file = "usedvehicle/detail/"
  71. usedvehicle_thumbnail_file = "usedvehicle/"
  72. product_file = "product/file/"
  73. product_cover = "product/"
  74. vehicle_cover = "vehicle/"
  75. activity_cover = "activity/"
  76. customer_face_file = 'customer/face/'
  77. shop_file = 'store/'
  78. vehicle_license = 'customer/vehicle/'
  79. class Images(models.Model):
  80. USEDVEHICLE_FILE = 1
  81. USEDVEHICLE_THUMBNAIL = 2
  82. PRODUCT_COVER = 3
  83. PRODUCT_FILE = 4
  84. ACTIVITY_COVER = 5
  85. VEHICLE_SERIES_THUMBNAIL = 6
  86. VEHICLE_MODEL_THUMBNAIL = 7
  87. CUSTOMER_FACE = 8
  88. SHOP_FILE = 9
  89. VEHICLE_LICENSE = 10
  90. DRIVE_LICENSE_FRONT = 11
  91. DRIVE_LICENSE_BACK = 12
  92. TYPE_CHOICES = (
  93. (USEDVEHICLE_FILE, u'二手车图片'),
  94. (USEDVEHICLE_THUMBNAIL, u'二手车缩略图'),
  95. (PRODUCT_COVER, u'商品封面图'),
  96. (PRODUCT_FILE, u'商品图片'),
  97. (ACTIVITY_COVER, u'活动封面图'),
  98. (VEHICLE_SERIES_THUMBNAIL, u'车系展示图'),
  99. (VEHICLE_MODEL_THUMBNAIL, u'车型展示图'),
  100. (CUSTOMER_FACE, u'客户头像'),
  101. (SHOP_FILE, u'门店图片'),
  102. (VEHICLE_LICENSE, u'行驶证'),
  103. (DRIVE_LICENSE_FRONT, u'驾驶证正面'),
  104. (DRIVE_LICENSE_BACK, u'驾驶证反面'),
  105. )
  106. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
  107. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  108. name = models.CharField(verbose_name=u'图片名', max_length=250)
  109. picture = models.CharField(verbose_name=u'图片路径', max_length=250)
  110. width = models.IntegerField(verbose_name=u"图片宽度")
  111. height = models.IntegerField(verbose_name=u"图片高度")
  112. create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
  113. objects = ImagesManager()
  114. class Meta:
  115. db_table = 'images'
  116. verbose_name = u'图片'
  117. ordering = ['-create_time']
  118. index_together = (
  119. 'type',
  120. 'create_time',
  121. )
  122. default_permissions = ()
  123. def del_images(self):
  124. picture = self.picture
  125. self.delete()
  126. DeleteFile(picture)
  127. def get_path(self):
  128. return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture)
  129. @staticmethod
  130. def downLoadFace(customer, url):
  131. save_path = customer_face_file + str(customer.user.id) + '/'
  132. filename = DownloadFace(url, save_path, 'jpg')
  133. name = filename.split('/')[-1]
  134. fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
  135. width = None
  136. height = None
  137. try:
  138. img = Image.open(fullname)
  139. width, height = img.size
  140. except:
  141. pass
  142. instance = Images.objects.create(
  143. user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename,
  144. width=width, height=height, create_time=timezone.now()
  145. )
  146. instance.save()
  147. return instance