TimeAlbumController.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import time
  2. import oss2
  3. import boto3
  4. import botocore.client
  5. from django.core.paginator import Paginator
  6. from django.db.models import Value
  7. from django.db.models.functions import Coalesce
  8. from django.views import View
  9. from obs import ObsClient
  10. from Ansjer.pushconfig import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  11. from Ansjer.config import HUAWEICLOUD_AK, HUAWEICLOUD_SK, HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_PUSH_BUKET, \
  12. AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVER_TYPE, CONFIG_EUR, CONFIG_US
  13. from Object.RedisObject import RedisObject
  14. from Object.ResponseObject import ResponseObject
  15. from Object.OCIObjectStorage import OCIObjectStorage
  16. from Roomumy.models import TimeAlbum, AlbumMedia, TimeDiary
  17. from Service.CommonService import CommonService
  18. from Controller.DetectControllerV2 import DetectControllerViewV2
  19. class TimeAlbumView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  30. if token_code != 0:
  31. return response.json(token_code)
  32. if operation == 'getAlbumPic': # 查询相册列表
  33. return self.get_album_pic(request_dict, response)
  34. elif operation == 'getTimeDiary': # 获取时光日记列表
  35. return self.get_time_diary(user_id, request_dict, response)
  36. elif operation == 'picLiked': # 喜欢图片
  37. return self.pic_liked(user_id, request_dict, response)
  38. else:
  39. return response.json(414)
  40. def get_album_pic(self, request_dict, response):
  41. uid = request_dict.get('uid', None)
  42. start_time = request_dict.get('startTime', None)
  43. end_time = request_dict.get('endTime', None)
  44. page = request_dict.get('page', 1) # 当前页码,默认为1
  45. page_size = request_dict.get('pageSize', 10) # 每页显示的记录数,默认为10
  46. # 检查是否提供了uid,如果没有提供返回错误
  47. if uid is None:
  48. return response.json(444)
  49. try:
  50. # 查询TimeAlbum表,按uid过滤,且如果提供了album_date,则进一步按album_date过滤
  51. time_album_qs = TimeAlbum.objects.filter(uid=uid).order_by('-album_date')
  52. if start_time and end_time:
  53. time_album_qs = time_album_qs.filter(album_date__gt=start_time, album_date__lt=end_time)
  54. # 如果没有找到符合条件的TimeAlbum记录,返回错误
  55. if not time_album_qs.exists():
  56. return response.json(0, {})
  57. # 对TimeAlbum结果进行分页
  58. paginator = Paginator(time_album_qs, page_size)
  59. time_albums = paginator.page(page) # 获取当前页的数据
  60. time_album_list = []
  61. # 对每个TimeAlbum,查询相关的AlbumMedia
  62. for time_album in time_albums:
  63. # 查询与当前time_album_id关联的AlbumMedia记录
  64. time_album_info = []
  65. album_media_qs = AlbumMedia.objects.filter(time_album_id=time_album.id).values('id', 'image', 'video',
  66. 'thumbnail', 'status',
  67. 'storage_location',
  68. 'time_diary__liked_status')
  69. if album_media_qs.exists():
  70. for album_media in album_media_qs:
  71. thumbnail = self.media_url(album_media['storage_location'], album_media['thumbnail'], uid) if \
  72. album_media['thumbnail'] else ""
  73. image = self.media_url(album_media['storage_location'], album_media['image'], uid) if \
  74. album_media['image'] else ""
  75. video = self.media_url(album_media['storage_location'], album_media['video'], uid) if \
  76. album_media['video'] else ""
  77. # 判断是否喜欢图片
  78. if album_media['status'] == 1:
  79. liked_status = 0
  80. else:
  81. liked_status = album_media['time_diary__liked_status'] if album_media[
  82. 'time_diary__liked_status'] else 0
  83. time_album_info.append({
  84. 'picId': album_media['id'],
  85. 'image': image,
  86. 'video': video,
  87. 'thumbnail': thumbnail,
  88. 'likedStatus': liked_status,
  89. })
  90. time_album_list.append({
  91. 'albumDate': time_album.album_date,
  92. 'albumTitle': time_album.album_title,
  93. 'info': time_album_info
  94. })
  95. # 返回分页结果和数据
  96. return response.json(0, {
  97. 'data': time_album_list,
  98. 'total': paginator.count, # 总记录数
  99. })
  100. except Exception as e:
  101. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  102. def get_time_diary(self, user_id, request_dict, response):
  103. start_time = request_dict.get('startTime', None)
  104. end_time = request_dict.get('endTime', None)
  105. page = request_dict.get('page', 1) # 当前页码,默认为1
  106. page_size = request_dict.get('pageSize', 10) # 每页显示的记录数,默认为10
  107. try:
  108. # 查询TimeAlbum表,按uid过滤,且如果提供了album_date,则进一步按album_date过滤
  109. time_album_qs = TimeAlbum.objects.filter(user_id=user_id).order_by('-album_date')
  110. if start_time and end_time:
  111. time_album_qs = time_album_qs.filter(album_date__gt=start_time, album_date__lt=end_time)
  112. # 如果没有找到符合条件的TimeAlbum记录,返回错误
  113. if not time_album_qs.exists():
  114. return response.json(0, {})
  115. # 对TimeAlbum结果进行分页
  116. paginator = Paginator(time_album_qs, page_size)
  117. time_albums = paginator.page(page) # 获取当前页的数据
  118. time_album_list = []
  119. # 对每个TimeAlbum,查询相关的AlbumMedia
  120. for time_album in time_albums:
  121. # 查询与当前time_album_id关联的AlbumMedia记录
  122. time_album_info = []
  123. album_media_qs = AlbumMedia.objects.filter(time_album_id=time_album.id, time_diary__liked_status=1)
  124. if album_media_qs.exists():
  125. uid = time_album.uid
  126. for album_media in album_media_qs.values('id', 'image', 'video', 'thumbnail', 'status',
  127. 'storage_location', 'time_diary__liked_status'):
  128. thumbnail = self.media_url(album_media['storage_location'], album_media['thumbnail'], uid) if \
  129. album_media['thumbnail'] else ""
  130. image = self.media_url(album_media['storage_location'], album_media['image'], uid) if \
  131. album_media['image'] else ""
  132. video = self.media_url(album_media['storage_location'], album_media['video'], uid) if \
  133. album_media['video'] else ""
  134. time_album_info.append({
  135. 'picId': album_media['id'],
  136. 'image': image,
  137. 'video': video,
  138. 'thumbnail': thumbnail,
  139. 'likedStatus': album_media['time_diary__liked_status'],
  140. })
  141. time_album_list.append({
  142. 'albumDate': time_album.album_date,
  143. 'info': time_album_info
  144. })
  145. # 返回分页结果和数据
  146. return response.json(0, {
  147. 'data': time_album_list,
  148. 'total': paginator.count, # 总记录数
  149. })
  150. except Exception as e:
  151. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  152. @staticmethod
  153. def pic_liked(user_id, request_dict, response):
  154. pic_id = request_dict.get('picId', None)
  155. liked_status = request_dict.get('likedStatus', None)
  156. if not all([pic_id, liked_status]):
  157. return response.json(444)
  158. liked_status = int(liked_status)
  159. try:
  160. now_time = int(time.time())
  161. album_media = AlbumMedia.objects.filter(id=pic_id).first()
  162. if not album_media:
  163. return response.json(173)
  164. if album_media.time_diary_id:
  165. time_diary_qs = TimeDiary.objects.filter(id=album_media.time_diary_id)
  166. if time_diary_qs.exists():
  167. time_diary_qs.update(liked_status=liked_status)
  168. else:
  169. album_media.time_diary = TimeDiary.objects.create(user_id=user_id, liked_status=liked_status)
  170. else:
  171. album_media.time_diary = TimeDiary.objects.create(user_id=user_id, liked_status=liked_status)
  172. # 更新 album_media
  173. album_media.status = 2
  174. album_media.updated_time = now_time
  175. album_media.save()
  176. return response.json(0)
  177. except Exception as e:
  178. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  179. @staticmethod
  180. def media_url(storage_location, obj_name, uid=""):
  181. if storage_location == 1: # 阿里云oss
  182. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  183. oss_img_bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')
  184. media_url = oss_img_bucket.sign_url('GET', obj_name, 300)
  185. elif storage_location == 2:
  186. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  187. region = 2
  188. else:
  189. region = 1
  190. params = {'Key': obj_name}
  191. if region == 1: # 国外AWS
  192. aws_s3 = boto3.client(
  193. 's3',
  194. aws_access_key_id=AWS_ACCESS_KEY_ID[1],
  195. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
  196. config=botocore.client.Config(signature_version='s3v4'),
  197. region_name='us-east-1'
  198. )
  199. params['Bucket'] = 'foreignpush'
  200. media_url = aws_s3.generate_presigned_url(
  201. 'get_object', Params=params, ExpiresIn=300)
  202. else: # 国内AWS
  203. aws_s3_cn = boto3.client(
  204. 's3',
  205. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  206. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  207. config=botocore.client.Config(signature_version='s3v4'),
  208. region_name='cn-northwest-1'
  209. )
  210. params['Bucket'] = 'push'
  211. media_url = aws_s3_cn.generate_presigned_url(
  212. 'get_object', Params=params, ExpiresIn=300)
  213. elif storage_location in [3, 4]: # 国外OCI云
  214. prefix_name = obj_name
  215. oci_eur = OCIObjectStorage(CONFIG_EUR)
  216. oci_us = OCIObjectStorage(CONFIG_US)
  217. oci = oci_eur if storage_location == 4 else oci_us
  218. redis_obj = RedisObject(3)
  219. media_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)
  220. if media_url:
  221. media_url = media_url + obj_name
  222. elif storage_location == 5: # 华为云
  223. obs_client = ObsClient(
  224. access_key_id=HUAWEICLOUD_AK, secret_access_key=HUAWEICLOUD_SK, server=HUAWEICLOUD_OBS_SERVER)
  225. create_res = obs_client.createSignedUrl(
  226. method='GET', bucketName=HUAWEICLOUD_PUSH_BUKET, objectKey=obj_name, expires=300)
  227. media_url = create_res.signedUrl
  228. else:
  229. media_url = ''
  230. return media_url