拍爱

lensman_views.py 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import os
  4. import shortuuid
  5. from curtail_uuid import CurtailUUID
  6. from django.conf import settings
  7. from django.contrib.auth.hashers import check_password
  8. from django.core.files.storage import default_storage
  9. from logit import logit
  10. from TimeConvert import TimeConvert as tc
  11. from account.models import LensmanInfo, UserInfo
  12. from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo
  13. from photo.models import PhotosInfo
  14. from utils.error.errno_utils import LensmanStatusCode, UserStatusCode
  15. from utils.error.response_utils import response
  16. from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info
  17. from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
  18. from utils.thumbnail_utils import make_thumbnail
  19. from utils.watermark_utils import watermark_wrap
  20. r = settings.REDIS_CACHE
  21. @logit
  22. def lensman_submit_api(request):
  23. """
  24. 摄影师信息提交
  25. :param request:
  26. :return:
  27. """
  28. unionid = request.POST.get('unionid', '')
  29. openid = request.POST.get('openid', '')
  30. phone = request.POST.get('phone', '')
  31. if LensmanInfo.objects.filter(phone=phone).exclude(unionid=unionid).exists():
  32. return response(LensmanStatusCode.LENSMAN_PHONE_ALREADY_EXISTS)
  33. fields = {
  34. 'name': request.POST.get('name', ''),
  35. 'sex': int(request.POST.get('sex', 1)),
  36. 'phone': phone,
  37. 'location': request.POST.get('location', ''),
  38. 'user_status': LensmanInfo.UNVERIFIED,
  39. }
  40. lensman, created = LensmanInfo.objects.get_or_create(unionid=unionid, defaults=fields)
  41. # 状态为 UNVERIFIED 的允许修改, 其他需要登录摄影师 APP 进行信息的修改
  42. if lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]:
  43. return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED)
  44. if not created:
  45. for key, value in fields.iteritems():
  46. setattr(lensman, key, value)
  47. lensman.save()
  48. return response(200, 'Submit Success', u'提交成功', {})
  49. @logit
  50. def lensman_login_api(request):
  51. """
  52. 摄影师登录
  53. :param request:
  54. :return:
  55. """
  56. username = request.POST.get('username', '')
  57. password = request.POST.get('password', '')
  58. try:
  59. lensman = LensmanInfo.objects.get(username=username)
  60. except LensmanInfo.DoesNotExist:
  61. return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
  62. if not check_password(password, lensman.encryption):
  63. return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)
  64. try:
  65. user = UserInfo.objects.get(user_id=lensman.lensman_id)
  66. except UserInfo.DoesNotExist:
  67. return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
  68. return response(200, 'Login Success', u'登录成功', user.data)
  69. @logit
  70. def lensman_wx_authorize_api(request):
  71. unionid = request.POST.get('unionid', '')
  72. openid = request.POST.get('openid', '')
  73. sex = request.POST.get('sex', 0)
  74. nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
  75. avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
  76. country = request.POST.get('country', '')
  77. province = request.POST.get('province', '')
  78. city = request.POST.get('city', '')
  79. # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息
  80. try:
  81. user = UserInfo.objects.get(unionid=unionid)
  82. except UserInfo.DoesNotExist:
  83. return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
  84. if user.user_status != UserInfo.ACTIVATED:
  85. return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED)
  86. user.openid = openid
  87. user.sex = sex
  88. user.nickname = nickname
  89. user.avatar = avatar
  90. user.country = country
  91. user.province = province
  92. user.city = city
  93. user.save()
  94. return response(200, 'Lensman Login Success', u'摄影师登录成功', user.data)
  95. @logit
  96. def lensman_photo_upload_api(request):
  97. """
  98. 摄影师照片上传
  99. :param request:
  100. :return:
  101. """
  102. user_id = lensman_id = request.POST.get('user_id', '')
  103. nickname = request.POST.get('nickname', '')
  104. session_id = request.POST.get('session_id', '')
  105. photo_id = request.POST.get('photo_id', '')
  106. photo = request.FILES.get('photo', '')
  107. current_id = int(request.POST.get('current_id', -1))
  108. # 用户校验
  109. try:
  110. user = UserInfo.objects.get(user_id=user_id)
  111. except UserInfo.DoesNotExist:
  112. return response(UserStatusCode.USER_NOT_FOUND)
  113. # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
  114. group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={
  115. 'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
  116. 'admin_id': user_id,
  117. 'group_name': user.final_nickname,
  118. 'group_default_avatar': 0,
  119. })
  120. group_id = group.group_id
  121. # Redis 群组数据缓存
  122. group_info = set_group_info(group) if group_created else get_group_info(group_id)
  123. # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建
  124. group_user_current_id = -1
  125. group_user, group_user_created = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
  126. # 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
  127. 'current_id': group_user_current_id, # 通过扫描 session_id 二维码进群的用户,默认可以查看该群组所有照片
  128. 'nickname': nickname or user.final_nickname,
  129. 'avatar': user.avatar,
  130. 'admin': group_created,
  131. 'user_status': GroupUserInfo.PASSED,
  132. 'passed_at': tc.utc_datetime(),
  133. })
  134. if not group_user_created:
  135. group_user.current_id = group_user_current_id
  136. group_user.user_status = GroupUserInfo.PASSED
  137. group_user.save()
  138. # Redis 群组用户数据缓存
  139. group_users = set_group_users_info(group) if group_user_created else get_group_users_info(group_id, user_id)
  140. if photo:
  141. # 写 PhotosInfo 表
  142. _, extension = os.path.splitext(photo.name)
  143. extension = extension or 'jpeg'
  144. m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
  145. if default_storage.exists(m_photo_path):
  146. default_storage.delete(m_photo_path)
  147. default_storage.save(m_photo_path, photo)
  148. p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
  149. watermark_wrap(
  150. os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
  151. settings.WATERMARK_LOGO,
  152. os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/')
  153. )
  154. photo, created = PhotosInfo.objects.get_or_create(
  155. lensman_id=lensman_id,
  156. session_id=session_id,
  157. photo_id=photo_id,
  158. p_photo_path=p_photo_path,
  159. m_photo_path=m_photo_path,
  160. )
  161. # 写 GroupPhotoInfo 表
  162. photo_path = photo.p_photo_path
  163. photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
  164. photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
  165. # 群组照片缩略图生成
  166. # 双列: 540, 40-50K
  167. photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(
  168. os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
  169. os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
  170. settings.THUMBNAIL_MAX_WIDTH
  171. )
  172. # 单列: 1080, xx-100K
  173. photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(
  174. os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
  175. os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
  176. settings.THUMBNAIL_MAX_WIDTH2
  177. )
  178. # 群组照片记录创建
  179. group_photo = GroupPhotoInfo.objects.create(
  180. group_id=group_id,
  181. user_id=user_id,
  182. nickname=user.final_nickname,
  183. avatar=user.avatar,
  184. photo_path=photo_path,
  185. photo_w=photo_w,
  186. photo_h=photo_h,
  187. photo_thumbnail_path=photo_thumbnail_path,
  188. photo_thumbnail_w=photo_thumbnail_w,
  189. photo_thumbnail_h=photo_thumbnail_h,
  190. photo_thumbnail2_path=photo_thumbnail2_path,
  191. photo_thumbnail2_w=photo_thumbnail2_w,
  192. photo_thumbnail2_h=photo_thumbnail2_h,
  193. photo_from=GroupPhotoInfo.SESSION_GROUP,
  194. session_id=photo.session_id,
  195. lensman_id=photo.lensman_id,
  196. lensman_photo_id=photo.photo_id,
  197. )
  198. # 设置群组最后一张照片PK
  199. r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
  200. # 获取从 current_id 到 now 的群组照片列表
  201. group_photos = GroupPhotoInfo.objects.filter(
  202. group_id=group_id,
  203. status=True,
  204. pk__gt=max(current_id, group_user.current_id),
  205. ).order_by(
  206. '-pk'
  207. )
  208. latest_photo = group_photos.first()
  209. return response(200, 'Lensman Upload Photo Success', u'摄影师照片上传成功', {
  210. 'group_id': group_id,
  211. 'current_id': latest_photo and latest_photo.pk or current_id,
  212. 'photos': [photo.photo_info(user_id) for photo in group_photos],
  213. })