| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 | import timeimport oss2import boto3import botocore.clientfrom django.core.paginator import Paginatorfrom django.db.models import Valuefrom django.db.models.functions import Coalescefrom django.views import Viewfrom obs import ObsClientfrom Ansjer.pushconfig import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEYfrom Ansjer.config import HUAWEICLOUD_AK, HUAWEICLOUD_SK, HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_PUSH_BUKET, \    AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVER_TYPE, CONFIG_EUR, CONFIG_USfrom Object.RedisObject import RedisObjectfrom Object.ResponseObject import ResponseObjectfrom Object.OCIObjectStorage import OCIObjectStoragefrom Roomumy.models import TimeAlbum, AlbumMedia, TimeDiaryfrom Service.CommonService import CommonServicefrom Controller.DetectControllerV2 import DetectControllerViewV2class TimeAlbumView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def validation(self, request_dict, request, operation):        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)        if token_code != 0:            return response.json(token_code)        if operation == 'getAlbumPic':  # 查询相册列表            return self.get_album_pic(request_dict, response)        elif operation == 'getTimeDiary':  # 获取时光日记列表            return self.get_time_diary(user_id, request_dict, response)        elif operation == 'picLiked':  # 喜欢图片            return self.pic_liked(user_id, request_dict, response)        else:            return response.json(414)    def get_album_pic(self, request_dict, response):        uid = request_dict.get('uid', None)        start_time = request_dict.get('startTime', None)        end_time = request_dict.get('endTime', None)        page = request_dict.get('page', 1)  # 当前页码,默认为1        page_size = request_dict.get('pageSize', 10)  # 每页显示的记录数,默认为10        # 检查是否提供了uid,如果没有提供返回错误        if uid is None:            return response.json(444)        try:            # 查询TimeAlbum表,按uid过滤,且如果提供了album_date,则进一步按album_date过滤            time_album_qs = TimeAlbum.objects.filter(uid=uid).order_by('-album_date')            if start_time and end_time:                time_album_qs = time_album_qs.filter(album_date__gt=start_time, album_date__lt=end_time)            # 如果没有找到符合条件的TimeAlbum记录,返回错误            if not time_album_qs.exists():                return response.json(0, {})            # 对TimeAlbum结果进行分页            paginator = Paginator(time_album_qs, page_size)            time_albums = paginator.page(page)  # 获取当前页的数据            time_album_list = []            # 对每个TimeAlbum,查询相关的AlbumMedia            for time_album in time_albums:                # 查询与当前time_album_id关联的AlbumMedia记录                time_album_info = []                album_media_qs = AlbumMedia.objects.filter(time_album_id=time_album.id).values('id', 'image', 'video',                                                                                               'thumbnail', 'status',                                                                                               'storage_location',                                                                                               'time_diary__liked_status')                if album_media_qs.exists():                    for album_media in album_media_qs:                        thumbnail = self.media_url(album_media['storage_location'], album_media['thumbnail'], uid) if \                            album_media['thumbnail'] else ""                        image = self.media_url(album_media['storage_location'], album_media['image'], uid) if \                            album_media['image'] else ""                        video = self.media_url(album_media['storage_location'], album_media['video'], uid) if \                            album_media['video'] else ""                        # 判断是否喜欢图片                        if album_media['status'] == 1:                            liked_status = 0                        else:                            liked_status = album_media['time_diary__liked_status'] if album_media[                                'time_diary__liked_status'] else 0                        time_album_info.append({                            'picId': album_media['id'],                            'image': image,                            'video': video,                            'thumbnail': thumbnail,                            'likedStatus': liked_status,                        })                    time_album_list.append({                        'albumDate': time_album.album_date,                        'albumTitle': time_album.album_title,                        'info': time_album_info                    })            # 返回分页结果和数据            return response.json(0, {                'data': time_album_list,                'total': paginator.count,  # 总记录数            })        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    def get_time_diary(self, user_id, request_dict, response):        start_time = request_dict.get('startTime', None)        end_time = request_dict.get('endTime', None)        page = request_dict.get('page', 1)  # 当前页码,默认为1        page_size = request_dict.get('pageSize', 10)  # 每页显示的记录数,默认为10        try:            # 查询TimeAlbum表,按uid过滤,且如果提供了album_date,则进一步按album_date过滤            time_album_qs = TimeAlbum.objects.filter(user_id=user_id).order_by('-album_date')            if start_time and end_time:                time_album_qs = time_album_qs.filter(album_date__gt=start_time, album_date__lt=end_time)            # 如果没有找到符合条件的TimeAlbum记录,返回错误            if not time_album_qs.exists():                return response.json(0, {})            # 对TimeAlbum结果进行分页            paginator = Paginator(time_album_qs, page_size)            time_albums = paginator.page(page)  # 获取当前页的数据            time_album_list = []            # 对每个TimeAlbum,查询相关的AlbumMedia            for time_album in time_albums:                # 查询与当前time_album_id关联的AlbumMedia记录                time_album_info = []                album_media_qs = AlbumMedia.objects.filter(time_album_id=time_album.id, time_diary__liked_status=1)                if album_media_qs.exists():                    uid = time_album.uid                    for album_media in album_media_qs.values('id', 'image', 'video', 'thumbnail', 'status',                                                             'storage_location', 'time_diary__liked_status'):                        thumbnail = self.media_url(album_media['storage_location'], album_media['thumbnail'], uid) if \                            album_media['thumbnail'] else ""                        image = self.media_url(album_media['storage_location'], album_media['image'], uid) if \                            album_media['image'] else ""                        video = self.media_url(album_media['storage_location'], album_media['video'], uid) if \                            album_media['video'] else ""                        time_album_info.append({                            'picId': album_media['id'],                            'image': image,                            'video': video,                            'thumbnail': thumbnail,                            'likedStatus': album_media['time_diary__liked_status'],                        })                    time_album_list.append({                        'albumDate': time_album.album_date,                        'info': time_album_info                    })            # 返回分页结果和数据            return response.json(0, {                'data': time_album_list,                'total': paginator.count,  # 总记录数            })        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @staticmethod    def pic_liked(user_id, request_dict, response):        pic_id = request_dict.get('picId', None)        liked_status = request_dict.get('likedStatus', None)        if not all([pic_id, liked_status]):            return response.json(444)        liked_status = int(liked_status)        try:            now_time = int(time.time())            album_media = AlbumMedia.objects.filter(id=pic_id).first()            if not album_media:                return response.json(173)            if album_media.time_diary_id:                time_diary_qs = TimeDiary.objects.filter(id=album_media.time_diary_id)                if time_diary_qs.exists():                    time_diary_qs.update(liked_status=liked_status)                else:                    album_media.time_diary = TimeDiary.objects.create(user_id=user_id, liked_status=liked_status)            else:                album_media.time_diary = TimeDiary.objects.create(user_id=user_id, liked_status=liked_status)            # 更新 album_media            album_media.status = 2            album_media.updated_time = now_time            album_media.save()            return response.json(0)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @staticmethod    def media_url(storage_location, obj_name, uid=""):        if storage_location == 1:  # 阿里云oss            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)            oss_img_bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'apg')            media_url = oss_img_bucket.sign_url('GET', obj_name, 300)        elif storage_location == 2:            if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':                region = 2            else:                region = 1            params = {'Key': obj_name}            if region == 1:  # 国外AWS                aws_s3 = boto3.client(                    's3',                    aws_access_key_id=AWS_ACCESS_KEY_ID[1],                    aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],                    config=botocore.client.Config(signature_version='s3v4'),                    region_name='us-east-1'                )                params['Bucket'] = 'foreignpush'                media_url = aws_s3.generate_presigned_url(                    'get_object', Params=params, ExpiresIn=300)            else:  # 国内AWS                aws_s3_cn = boto3.client(                    's3',                    aws_access_key_id=AWS_ACCESS_KEY_ID[0],                    aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],                    config=botocore.client.Config(signature_version='s3v4'),                    region_name='cn-northwest-1'                )                params['Bucket'] = 'push'                media_url = aws_s3_cn.generate_presigned_url(                    'get_object', Params=params, ExpiresIn=300)        elif storage_location in [3, 4]:  # 国外OCI云            prefix_name = obj_name            oci_eur = OCIObjectStorage(CONFIG_EUR)            oci_us = OCIObjectStorage(CONFIG_US)            oci = oci_eur if storage_location == 4 else oci_us            redis_obj = RedisObject(3)            media_url = DetectControllerViewV2.oci_object_url(oci, redis_obj, uid, prefix_name)            if media_url:                media_url = media_url + obj_name        elif storage_location == 5:  # 华为云            obs_client = ObsClient(                access_key_id=HUAWEICLOUD_AK, secret_access_key=HUAWEICLOUD_SK, server=HUAWEICLOUD_OBS_SERVER)            create_res = obs_client.createSignedUrl(                method='GET', bucketName=HUAWEICLOUD_PUSH_BUKET, objectKey=obj_name, expires=300)            media_url = create_res.signedUrl        else:            media_url = ''        return media_url
 |