TimeAlbumController.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import time
  2. from datetime import datetime
  3. import oss2
  4. import boto3
  5. import botocore.client
  6. from django.core.paginator import Paginator
  7. from django.db.models import Value
  8. from django.db.models.functions import Coalesce
  9. from django.views import View
  10. from obs import ObsClient
  11. from Ansjer.pushconfig import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  12. from Ansjer.config import HUAWEICLOUD_AK, HUAWEICLOUD_SK, HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_PUSH_BUKET, \
  13. AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVER_TYPE, CONFIG_EUR, CONFIG_US
  14. from Object.RedisObject import RedisObject
  15. from Object.ResponseObject import ResponseObject
  16. from Object.OCIObjectStorage import OCIObjectStorage
  17. from Roomumy.models import TimeAlbum, AlbumMedia, TimeDiary, DiaryAlbumMediaRelation
  18. from Service.CommonService import CommonService
  19. from Controller.DetectControllerV2 import DetectControllerViewV2
  20. class TimeAlbumView(View):
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.GET, request, operation)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.POST, request, operation)
  29. def validation(self, request_dict, request, operation):
  30. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  31. if token_code != 0:
  32. return response.json(token_code)
  33. if operation == 'getAlbumPic': # 查询相册列表
  34. return self.get_album_pic(user_id, request_dict, response)
  35. elif operation == 'getTimeDiary': # 获取时光日记列表
  36. return self.get_time_diary(user_id, request_dict, response)
  37. elif operation == 'picLiked': # 喜欢图片
  38. return self.pic_liked(user_id, request_dict, response)
  39. else:
  40. return response.json(414)
  41. def get_album_pic(self, user_id, request_dict, response):
  42. device_id = request_dict.get('deviceId', None)
  43. start_time = request_dict.get('startTime', None)
  44. end_time = request_dict.get('endTime', None)
  45. page = request_dict.get('page', 1) # 当前页码,默认为1
  46. page_size = request_dict.get('pageSize', 10) # 每页显示的记录数,默认为10
  47. # 检查是否提供了uid,如果没有提供返回错误
  48. if device_id is None:
  49. return response.json(444)
  50. try:
  51. # 查询TimeAlbum表,按uid过滤,且如果提供了album_date,则进一步按album_date过滤
  52. time_album_qs = TimeAlbum.objects.filter(device_id=device_id).order_by('-album_date')
  53. if start_time and end_time:
  54. time_album_qs = time_album_qs.filter(album_date__gte=start_time, album_date__lte=end_time)
  55. # 如果没有找到符合条件的TimeAlbum记录,返回错误
  56. if not time_album_qs.exists():
  57. return response.json(0, {})
  58. # 对TimeAlbum结果进行分页
  59. paginator = Paginator(time_album_qs, page_size)
  60. time_albums = paginator.page(page) # 获取当前页的数据
  61. time_album_list = []
  62. # 对每个TimeAlbum,查询相关的AlbumMedia
  63. for time_album in time_albums:
  64. # 查询与当前time_album_id关联的AlbumMedia记录
  65. time_album_info = []
  66. album_media_qs = AlbumMedia.objects.filter(time_album_id=time_album.id).values('id', 'device_id', 'channel',
  67. 'event_time', 'status',
  68. 'storage_location')
  69. if album_media_qs.exists():
  70. for album_media in album_media_qs:
  71. storage_location = album_media['storage_location']
  72. uid = album_media['device_id']
  73. channel = album_media['channel']
  74. event_time = album_media['event_time']
  75. image = self.media_url(storage_location, uid, channel, event_time)
  76. # 判断是否加入时光日记
  77. liked_status = 0
  78. if DiaryAlbumMediaRelation.objects.filter(
  79. album_media_id=album_media['id'],
  80. diary__user_id=user_id
  81. ).exists():
  82. liked_status = 1
  83. time_album_info.append({
  84. 'picId': album_media['id'],
  85. 'image': image,
  86. 'likedStatus': liked_status,
  87. })
  88. time_album_list.append({
  89. 'albumDate': time_album.album_date,
  90. 'albumTitle': time_album.album_title,
  91. 'info': time_album_info
  92. })
  93. # 返回分页结果和数据
  94. return response.json(0, {
  95. 'data': time_album_list,
  96. 'total': paginator.count, # 总记录数
  97. })
  98. except Exception as e:
  99. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  100. def get_time_diary(self, user_id, request_dict, response):
  101. start_time = request_dict.get('startTime', None)
  102. end_time = request_dict.get('endTime', None)
  103. page = int(request_dict.get('page', 1))
  104. page_size = int(request_dict.get('pageSize', 10))
  105. try:
  106. # 基础查询
  107. time_diary_qs = TimeDiary.objects.filter(user_id=user_id).order_by('-diary_date')
  108. # 时间范围过滤
  109. if start_time and end_time:
  110. time_diary_qs = time_diary_qs.filter(diary_date__gte=start_time, diary_date__lte=end_time)
  111. # 分页
  112. paginator = Paginator(time_diary_qs, page_size)
  113. diaries_page = paginator.get_page(page)
  114. diary_data_list = []
  115. for diary in diaries_page:
  116. # 通过中间表获取关联的图片
  117. relations = DiaryAlbumMediaRelation.objects.filter(diary=diary).select_related('album_media')
  118. media_list = []
  119. for relation in relations:
  120. media = relation.album_media
  121. media_list.append({
  122. 'picId': media.id,
  123. 'likeStatus': 1,
  124. 'image': self.media_url(media.storage_location, media.device_id, media.channel,
  125. media.event_time)
  126. })
  127. diary_data_list.append({
  128. 'diary_date': diary.diary_date,
  129. 'info': media_list
  130. })
  131. return response.json(0, {
  132. 'data': diary_data_list,
  133. 'total': paginator.count,
  134. })
  135. except Exception as e:
  136. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  137. @staticmethod
  138. def pic_liked(user_id, request_dict, response):
  139. pic_id = request_dict.get('picId', None)
  140. liked_status = request_dict.get('likedStatus', None)
  141. if not all([pic_id, liked_status]):
  142. return response.json(444)
  143. liked_status = int(liked_status)
  144. try:
  145. album_media = AlbumMedia.objects.filter(id=pic_id).first()
  146. if not album_media:
  147. return response.json(404, 'pic not found')
  148. # 获取相册的日期
  149. time_diary_qs = AlbumMedia.objects.filter(id=pic_id).values('time_album_id', 'event_time', 'status')
  150. if not time_diary_qs.exists():
  151. return response.json(173)
  152. event_time = time_diary_qs[0]['event_time']
  153. dt = datetime.fromtimestamp(event_time)
  154. dt_zero = datetime(dt.year, dt.month, dt.day)
  155. diary_date = int(dt_zero.timestamp())
  156. # 查找或创建用户今天的 TimeDiary
  157. time_diary, created = TimeDiary.objects.get_or_create(
  158. user_id=user_id,
  159. diary_date=diary_date,
  160. defaults={
  161. 'created_time': int(time.time()),
  162. 'updated_time': int(time.time())
  163. }
  164. )
  165. if liked_status == 1:
  166. # 添加到 TimeDiary(中间表中插入)
  167. DiaryAlbumMediaRelation.objects.get_or_create(
  168. diary=time_diary,
  169. album_media=album_media,
  170. defaults={
  171. 'created_time': int(time.time()),
  172. 'updated_time': int(time.time())
  173. }
  174. )
  175. time_diary_qs.update(status=2)
  176. elif liked_status == 0:
  177. # 从中间表移除
  178. DiaryAlbumMediaRelation.objects.filter(diary=time_diary, album_media=album_media).delete()
  179. if DiaryAlbumMediaRelation.objects.filter(diary=time_diary).count() == 0:
  180. time_diary.delete()
  181. if not DiaryAlbumMediaRelation.objects.filter(album_media=album_media).exists():
  182. time_diary_qs.update(status=1)
  183. return response.json(0)
  184. except Exception as e:
  185. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  186. @staticmethod
  187. def media_url(storage_location, uid, channel, event_time):
  188. obj_name = f'roomumy/albumMedia/{uid}/{channel}/{event_time}.jpg'
  189. obs_client = ObsClient(
  190. access_key_id=HUAWEICLOUD_AK, secret_access_key=HUAWEICLOUD_SK, server=HUAWEICLOUD_OBS_SERVER)
  191. create_res = obs_client.createSignedUrl(
  192. method='GET', bucketName="asj-app", objectKey=obj_name, expires=600)
  193. media_url = create_res.signedUrl
  194. return media_url