models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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
  7. class ImagesManager(models.Manager):
  8. def _addnew(self, user, type, file, size=None):
  9. width = None
  10. height = None
  11. path = ImagesManager.calculatePath(type)
  12. filename = UploadFile(file, path)
  13. fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
  14. try:
  15. img = Image.open(fullname)
  16. width, height = img.size
  17. # 缩略图压缩宽或高最大200
  18. # if width > 200 or height > 200:
  19. # if width > height:
  20. # size = (200, int(height * 200 / width))
  21. # elif width < height:
  22. # size = (int(width * 200 / height), 200)
  23. # else:
  24. # size = (200, 200)
  25. # img = img.resize(size, Image.ANTIALIAS)
  26. # img.save(fullname)
  27. # width, height = img.size
  28. if width > 1440:
  29. img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
  30. img.save(fullname)
  31. width, height = img.size
  32. except:
  33. pass
  34. instance = self.model(
  35. user=user,
  36. type=type,
  37. picture="%s%s" % (settings.MEDIA_URL, 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):
  46. path_map = {
  47. Images.COMMODITY_SHOW_IMAGE: commodity_show_image,
  48. Images.COMMODITY_DETAILS_IMAGE: commodity_details_image,
  49. Images.COMMODITY_CAROUSEL_IMAGE: commodity_carousel_image,
  50. }
  51. return path_map[type]
  52. commodity_show_image = "commodity/show/"
  53. commodity_details_image = "commodity/details/"
  54. commodity_carousel_image = "commodity/carousel/"
  55. class Images(models.Model):
  56. COMMODITY_SHOW_IMAGE = 1
  57. COMMODITY_DETAILS_IMAGE = 2
  58. COMMODITY_CAROUSEL_IMAGE = 3
  59. TYPE_CHOICES = (
  60. (COMMODITY_SHOW_IMAGE, u'商品缩略图'),
  61. (COMMODITY_DETAILS_IMAGE, u'商品详情图'),
  62. (COMMODITY_CAROUSEL_IMAGE, u'商品轮播图'),
  63. )
  64. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
  65. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  66. picture = models.CharField(verbose_name=u'图片路径', max_length=250)
  67. width = models.IntegerField(verbose_name=u"图片宽度", blank=True, default=0)
  68. height = models.IntegerField(verbose_name=u"图片高度", blank=True, default=0)
  69. create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
  70. objects = ImagesManager()
  71. class Meta:
  72. db_table = "images"
  73. verbose_name = u'图片'
  74. ordering = ['-create_time']
  75. index_together = (
  76. 'type',
  77. 'create_time',
  78. )
  79. default_permissions = ()
  80. def del_images(self):
  81. picture = self.picture
  82. self.delete()
  83. DeleteFile(picture)
  84. def get_path(self):
  85. return '%s%s' % (settings.SERVER_DOMAIN, self.picture)