TimeAlbumController.py 11 KB

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