models.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. except:
  29. pass
  30. instance = self.model(
  31. user=user,
  32. type=type,
  33. picture="%s%s" % (settings.MEDIA_URL, filename),
  34. width=width,
  35. height=height,
  36. create_time=timezone.now()
  37. )
  38. instance.save()
  39. return instance
  40. @staticmethod
  41. def calculatePath(type):
  42. path_map = {
  43. Images.COMMODITY_SHOW_IMAGE: commodity_show_image,
  44. Images.COMMODITY_DETAILS_IMAGE: commodity_details_image,
  45. Images.COMMODITY_CAROUSEL_IMAGE: commodity_carousel_image,
  46. }
  47. return path_map[type]
  48. commodity_show_image = "commodity/show/"
  49. commodity_details_image = "commodity/details/"
  50. commodity_carousel_image = "commodity/carousel/"
  51. class Images(models.Model):
  52. COMMODITY_SHOW_IMAGE = 1
  53. COMMODITY_DETAILS_IMAGE = 2
  54. COMMODITY_CAROUSEL_IMAGE = 3
  55. TYPE_CHOICES = (
  56. (COMMODITY_SHOW_IMAGE, u'商品缩略图'),
  57. (COMMODITY_DETAILS_IMAGE, u'商品详情图'),
  58. (COMMODITY_CAROUSEL_IMAGE, u'商品轮播图'),
  59. )
  60. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
  61. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  62. picture = models.CharField(verbose_name=u'图片路径', max_length=250)
  63. width = models.IntegerField(verbose_name=u"图片宽度", blank=True, default=0)
  64. height = models.IntegerField(verbose_name=u"图片高度", blank=True, default=0)
  65. create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
  66. objects = ImagesManager()
  67. class Meta:
  68. db_table = "images"
  69. verbose_name = u'图片'
  70. ordering = ['-create_time']
  71. index_together = (
  72. 'type',
  73. 'create_time',
  74. )
  75. default_permissions = ()
  76. def del_images(self):
  77. picture = self.picture
  78. self.delete()
  79. DeleteFile(picture)
  80. def get_path(self):
  81. return '%s%s' % (settings.SERVER_DOMAIN, self.picture)