utils.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2017 jianglin
  5. # File Name: utils.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2017-03-13 13:40:38 (CST)
  9. # Last Update:星期四 2017-3-30 13:55:7 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import current_app
  14. from datetime import datetime, timedelta
  15. from hashlib import sha512
  16. from io import BytesIO
  17. from PIL import Image as ImagePIL
  18. def gen_order_by(query_dict=dict(), keys=[], date_key=True):
  19. keys.append('id')
  20. if date_key:
  21. keys += ['created_at', 'updated_at']
  22. order_by = ['id']
  23. descent = query_dict.pop('orderby', None)
  24. if descent is not None:
  25. descent = descent.split(',')
  26. descent = list(set(keys) & set(descent))
  27. order_by = ['-%s' % i for i in descent]
  28. return tuple(order_by)
  29. def gen_filter_date(query_dict=dict(),
  30. date_key='created_at',
  31. date_format='%Y-%m-%d'):
  32. '''raise 时间格式错误'''
  33. filter_dict = {}
  34. start_date = query_dict.pop('start_date', None)
  35. end_date = query_dict.pop('end_date', None)
  36. if start_date is not None:
  37. start_date = datetime.strptime(start_date, date_format)
  38. key = '%s__gte' % date_key
  39. filter_dict.update(**{key: start_date})
  40. if end_date is not None:
  41. end_date = datetime.strptime(end_date, date_format)
  42. key = '%s__lte' % date_key
  43. filter_dict.update(**{key: end_date + timedelta(days=1)})
  44. if (start_date and end_date) and (start_date > end_date):
  45. raise ValueError
  46. return filter_dict
  47. def gen_filter_dict(query_dict=dict(), keys=[], equal_key=[], user=None):
  48. filter_dict = {}
  49. keys = list(set(keys) & set(query_dict.keys()))
  50. for k in keys:
  51. if k in equal_key:
  52. filter_dict.update(**{k: query_dict[k]})
  53. else:
  54. new_k = '%s__contains' % k
  55. filter_dict.update(**{new_k: query_dict[k]})
  56. if user is not None and user.is_authenticated:
  57. filter_dict.update(user__id=user.id)
  58. return filter_dict
  59. def gen_hash(image):
  60. sha = sha512()
  61. # while True:
  62. # data = f.read(block_size)
  63. # if not data:
  64. # break
  65. # sha1.update(data)
  66. sha.update(image.read())
  67. return sha.hexdigest()
  68. def file_is_allowed(filename):
  69. e = current_app.config['UPLOAD_ALLOWED_EXTENSIONS']
  70. return '.' in filename and filename.rsplit('.', 1)[1].lower() in e
  71. def gen_thumb_image(path, width=0, height=0, filetype='JPEG'):
  72. '''
  73. 生成缩略图
  74. '''
  75. width = min(1024, width)
  76. height = min(1024, height)
  77. img = ImagePIL.open(path)
  78. if width and not height:
  79. height = float(width) / img.size[0] * img.size[1]
  80. if not width and height:
  81. width = float(height) / img.size[1] * img.size[0]
  82. stream = BytesIO()
  83. img.thumbnail((width, height), ImagePIL.ANTIALIAS)
  84. img.save(stream, format=filetype, optimize=True)
  85. return stream