models.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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, employee, type, file):
  9. return self._addnew(employee.user, type, file)
  10. def customer_addnew(self, customer, type, file):
  11. return self._addnew(customer.user, type, file)
  12. def _addnew(self, user, type, file):
  13. width = None
  14. height = None
  15. path = ImagesManager.calculatePath(type, user.id)
  16. modify_size = ImagesManager.canModifySize(type)
  17. filename = UploadFile(file, path)
  18. fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
  19. try:
  20. img = Image.open(fullname)
  21. width, height = img.size
  22. # 缩略图压缩宽或高最大200
  23. if modify_size and (width > 200 or height > 200):
  24. if width > height:
  25. size = (200, int(height * 200 / width))
  26. elif width < height:
  27. size = (int(width * 200 / height), 200)
  28. else:
  29. size = (200, 200)
  30. img = img.resize(size, Image.ANTIALIAS)
  31. img.save(fullname)
  32. width, height = img.size
  33. except:
  34. pass
  35. instance = self.model(
  36. user=user,
  37. type=type,
  38. name=file.name,
  39. picture=filename,
  40. width=width,
  41. height=height,
  42. create_time=timezone.now()
  43. )
  44. instance.save()
  45. return instance
  46. @staticmethod
  47. def calculatePath(type, user_id):
  48. path_map = {
  49. Images.PACKAGE_FILE: package_detail_file,
  50. Images.PACKAGE_THUMBNAIL_FILE: package_thumbnail_file,
  51. Images.PACKAGE_PLAYBILL_FILE: package_playbill_file,
  52. Images.POSTER_FILE: poster_file,
  53. Images.SALES_ADVISOR_FACE: sales_advisor_face_file,
  54. Images.SALES_ADVISOR_CODE: sales_advisor_code_file,
  55. Images.SHOP_FILE: shop_file,
  56. Images.VEHICLE_SERIES_THUMBNAIL: vehicle_series_thumbnail_file,
  57. Images.VEHICLE_MODEL_THUMBNAIL: vehicle_model_thumbnail_file,
  58. Images.VEHICLE_MODEL_PLAYBILL: vehicle_model_playbill_file,
  59. Images.VEHICLE_IMAGES: vehicle_model_detail_file,
  60. Images.VEHICLE_MODEL_IMAGES: vehicle_detail_file,
  61. Images.CUSTOMER_FACE: customer_face_file,
  62. Images.ACTIVITY_PLAYBILL_FILE: activity_playbill_file,
  63. }
  64. return path_map[type] + str(user_id) + '/'
  65. @staticmethod
  66. def canModifySize(type):
  67. modify_size = False
  68. can_modify_list = [
  69. Images.PACKAGE_THUMBNAIL_FILE,
  70. Images.SALES_ADVISOR_FACE,
  71. Images.SALES_ADVISOR_CODE,
  72. Images.SHOP_FILE,
  73. Images.VEHICLE_SERIES_THUMBNAIL,
  74. Images.VEHICLE_MODEL_THUMBNAIL,
  75. ]
  76. if type in can_modify_list:
  77. modify_size = True
  78. return modify_size
  79. package_detail_file = "package/detail/"
  80. package_thumbnail_file = "package/thumbnail/"
  81. package_playbill_file = "package/playbill/"
  82. poster_file = 'poster/'
  83. sales_advisor_face_file = "sales_advisor/face/"
  84. sales_advisor_code_file = "sales_advisor/code/"
  85. shop_file = "shop/"
  86. vehicle_series_thumbnail_file = 'vehicle_series/'
  87. vehicle_model_thumbnail_file = 'vehicle_model/thumbnail/'
  88. vehicle_model_playbill_file = 'vehicle_model/playbill/'
  89. vehicle_model_detail_file = 'vehicle_model/detail/'
  90. vehicle_detail_file = 'vehicle/detail/'
  91. customer_face_file = 'customer/face/'
  92. activity_playbill_file = 'activity/playbill/'
  93. class Images(models.Model):
  94. PACKAGE_FILE = 1
  95. PACKAGE_THUMBNAIL_FILE = 2
  96. PACKAGE_PLAYBILL_FILE = 3
  97. POSTER_FILE = 4
  98. SALES_ADVISOR_FACE = 5
  99. SALES_ADVISOR_CODE = 6
  100. SHOP_FILE = 7
  101. VEHICLE_SERIES_THUMBNAIL = 8
  102. VEHICLE_MODEL_THUMBNAIL = 9
  103. VEHICLE_MODEL_PLAYBILL = 10
  104. VEHICLE_IMAGES = 11
  105. VEHICLE_MODEL_IMAGES = 12
  106. CUSTOMER_FACE = 13
  107. ACTIVITY_PLAYBILL_FILE= 14
  108. TYPE_CHOICES = (
  109. (PACKAGE_FILE, u'商品图片'),
  110. (PACKAGE_THUMBNAIL_FILE, u'商品缩略图'),
  111. (PACKAGE_PLAYBILL_FILE, u'商品海报'),
  112. (POSTER_FILE, u'广告图片'),
  113. (SALES_ADVISOR_FACE, u'销售顾问头像'),
  114. (SALES_ADVISOR_CODE, u'销售顾问二维码'),
  115. (SHOP_FILE, u'门店图片'),
  116. (VEHICLE_SERIES_THUMBNAIL, u'车系缩略图'),
  117. (VEHICLE_MODEL_THUMBNAIL, u'车型缩略图'),
  118. (VEHICLE_MODEL_PLAYBILL, u'车型海报'),
  119. (VEHICLE_IMAGES, u'整车图片'),
  120. (VEHICLE_MODEL_IMAGES, u'车型图片'),
  121. (CUSTOMER_FACE, u'客户头像'),
  122. (ACTIVITY_PLAYBILL_FILE, u'活动封面'),
  123. )
  124. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
  125. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  126. name = models.CharField(verbose_name=u'图片名', max_length=250)
  127. picture = models.CharField(verbose_name=u'图片路径', max_length=250)
  128. width = models.IntegerField(verbose_name=u"图片宽度")
  129. height = models.IntegerField(verbose_name=u"图片高度")
  130. create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
  131. objects = ImagesManager()
  132. class Meta:
  133. db_table = "images"
  134. verbose_name = u'图片'
  135. ordering = ['-create_time']
  136. index_together = (
  137. 'type',
  138. 'create_time',
  139. )
  140. default_permissions = ()
  141. def del_images(self):
  142. picture = self.picture
  143. self.delete()
  144. DeleteFile(picture)
  145. def get_path(self):
  146. return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture)
  147. @staticmethod
  148. def downLoadFace(customer, url):
  149. save_path = customer_face_file + str(customer.user.id) + '/'
  150. filename = DownloadFace(url, save_path, 'jpg')
  151. name = filename.split('/')[-1]
  152. fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
  153. width = None
  154. height = None
  155. try:
  156. img = Image.open(fullname)
  157. width, height = img.size
  158. except:
  159. pass
  160. instance = Images.objects.create(
  161. tenant=customer.tenant, user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename,
  162. width=width, height=height, create_time=timezone.now()
  163. )
  164. instance.save()
  165. return instance