Browse Source

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer into ghl

guanhailong 2 years ago
parent
commit
5f91be69e0

+ 50 - 12
Controller/AWS/KVSController.py

@@ -9,6 +9,7 @@ import time
 import uuid
 import datetime
 
+from django.http import HttpResponse
 from django.views import View
 
 from Model.models import KVS, Device_User, Device_Info
@@ -33,9 +34,9 @@ class UserRelatedView(View):
     def validation(self, request_dict, operation, request):
         response = ResponseObject()
         if operation == 'generate-qr-code':  # 网页生成二维码
-            return self.generate_qr_code(request_dict, response)
+            return self.generate_qr_code(response)
         elif operation == 'web-login':  # 网页登录
-            return self.web_login(request_dict, request, response)
+            return self.web_login(request_dict, response)
         elif operation == 'confirm-login':  # app确认登录
             return self.confirm_login(request_dict, response)
         else:
@@ -47,12 +48,12 @@ class UserRelatedView(View):
             response.lang = tko.lang
             user_id = tko.userID
             if operation == 'get-device':  # 获取设备列表
-                return self.get_device(request_dict, response, user_id)
+                return self.get_device(response, user_id)
             else:
                 return response.json(404)
 
     @staticmethod
-    def generate_qr_code(request_dict, response):
+    def generate_qr_code(response):
         """
         网页生成二维码
         @param request_dict: 请求参数
@@ -74,7 +75,7 @@ class UserRelatedView(View):
             return response.json(500)
 
     @staticmethod
-    def web_login(request_dict, request, response):
+    def web_login(request_dict, response):
         """
         网页登录
         @param request_dict: 请求参数
@@ -144,10 +145,9 @@ class UserRelatedView(View):
             return response.json(500)
 
     @staticmethod
-    def get_device(request_dict, response, user_id):
+    def get_device(response, user_id):
         """
         获取设备列表
-        @param request_dict: 请求参数
         @param response: 响应对象
         @param user_id: 用户id
         @return: response
@@ -177,18 +177,18 @@ class KVSView(View):
             return self.create_media(request_dict, response)
         elif operation == 'update-data-retention':  # 修改视频流数据保留时间
             return self.update_data_retention(request_dict, response)
-        elif operation == 'get-hls-midea':  # 获取视频播放地址
-            return self.get_hls_midea_url(request_dict, response)
         else:
-            tko = TokenObject(
-                request.META.get('HTTP_AUTHORIZATION'),
-                returntpye='pc')
+            tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
             if tko.code != 0:
                 return response.json(tko.code)
             response.lang = tko.lang
             user_id = tko.userID
             if operation == 'get-device-midea-list':  # 获取设备列表
                 return self.get_device_midea_list(request_dict, response)
+            elif operation == 'get-hls-midea':  # 获取视频播放地址
+                return self.get_hls_midea_url(request_dict, response)
+            elif operation == 'download-clip':  # 获取视频播放地址
+                return self.download_clip(request_dict, response)
             else:
                 return response.json(404)
 
@@ -346,3 +346,41 @@ class KVSView(View):
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    @staticmethod
+    def download_clip(request_dict, response):
+        """
+        获取视频播放地址
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict startTime: 开始时间
+        @request_dict endTime: 结束时间
+        @param response: 响应对象
+        @return: response
+        """
+        serial_number = request_dict.get('serial_number', None)
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        if not all([serial_number, start_time, end_time]):
+            return response.json(444)
+        start_time = datetime.datetime.fromtimestamp(int(start_time)) - datetime.timedelta(hours=8)
+        end_time = datetime.datetime.fromtimestamp(int(end_time)) - datetime.timedelta(hours=8)
+        try:
+            # kvs_qs = KVS.objects.filter(stream_name=serial_number)
+            # if not kvs_qs.exists():
+            #     return response.json(174)
+            kinesis_video_obj = AmazonKVAMObject(
+                aws_access_key_id='AKIA2E67UIMD45Y3HL53',
+                secret_access_key='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',
+                region_name='us-east-1',
+                stream_name=serial_number,
+                api_name='GET_CLIP'
+            )
+            clip_obj = kinesis_video_obj.get_clip(serial_number, start_time, end_time)
+            res = HttpResponse(clip_obj.read())
+            res["content_type"] = "application/octet-stream"
+            res["Content-Disposition"] = "attachment;filename=video.mp4"
+            return res
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 116 - 61
Controller/AiController.py

@@ -230,7 +230,8 @@ class AiView(View):
             redisObj.del_data(key=redis_key)
             return response.json(474)
 
-    def do_create_pay_order(self, request_dict, request, user_id, response):
+    @classmethod
+    def do_create_pay_order(cls, request_dict, request, user_id, response):
         """
         创建支付订单
         @param request_dict: 请求数据
@@ -271,22 +272,22 @@ class AiView(View):
             else:
                 store_meal_name = '未知套餐'
 
-            nowTime = int(time.time())
-            orderID = CommonService.createOrderID()
+            now_time = int(time.time())
             price = round(float(price), 2)
+            order_id = CommonService.createOrderID()
 
             order_dict = {
-                'orderID': orderID,
+                'orderID': order_id,
                 'UID': uid,
                 'channel': channel,
                 'userID_id': user_id,
                 'desc': content,
                 'payType': pay_type,
-                'payTime': nowTime,
+                'payTime': now_time,
                 'price': price,
                 'currency': currency,
-                'addTime': nowTime,
-                'updTime': nowTime,
+                'addTime': now_time,
+                'updTime': now_time,
                 'ai_rank_id': rank,
                 'rank_id': 1,
                 'order_type': 1,
@@ -295,21 +296,33 @@ class AiView(View):
 
             # 创建订单数据和返回支付回调链接
             if pay_type == 1:  # PayPal支付
-                order_dict['paymentID'], order_dict['pay_url'] = self.create_paypal_payment(lang, orderID, price,
-                                                                                            currency, content, response)
-                res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
-            elif pay_type == 2:  # 支付宝
-                order_dict['pay_url'] = self.create_alipay_payment(lang, orderID, price, title, content, response)
-                res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
+                res_dict = cls.create_paypal_payment(lang, order_id, price, currency, content)
+                if not res_dict:
+                    return response.json(10, 'create ai order failed')
+                order_dict['paymentID'], order_dict['pay_url'] = res_dict['payment_id'], res_dict['pay_url']
+                res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url']}
+
+            elif pay_type == 2:  # 支付宝支付
+                res_dict = cls.create_alipay_payment(lang, order_id, price, title, content)
+                if not res_dict:
+                    return response.json(10, 'create ai order failed')
+                order_dict['pay_url'] = res_dict['pay_url']
+                res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url']}
+
             elif pay_type == 3:  # 微信支付
                 ip = CommonService.get_ip_address(request)
-                order_dict['pay_url'], sign_params = self.create_wechat_payment(lang, orderID, price, ip, content,
-                                                                                response)
-                res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID, 'result': sign_params}
+                res_dict = cls.create_wechat_payment(lang, order_id, price, ip, content)
+                if not res_dict:
+                    return response.json(10, 'create ai order failed')
+                order_dict['pay_url'], sign_params = res_dict['pay_url'], res_dict['sign_params']
+                res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url'], 'result': sign_params}
+
             else:
                 return response.json(444, {'param': 'pay_type'})
+
             Order_Model.objects.create(**order_dict)
             return response.json(0, res_data)
+
         except Exception as e:
             return response.json(500, repr(e))
 
@@ -573,57 +586,99 @@ class AiView(View):
             return response.json(500, repr(e))
 
     @staticmethod
-    def create_paypal_payment(lang, orderID, price, currency, content, response):
+    def create_paypal_payment(lang, order_id, price, currency, content):
+        """
+        创建PayPal支付
+        @param lang: 语言
+        @param order_id: 订单id
+        @param price: 价格
+        @param currency: 货币
+        @param content: 内容
+        @return: pay_dict
+        """
         cancel_url = CommonService.get_payment_status_url(lang, 'fail')
-        call_sub_url = "{}AiService/doPayPalCallBack?orderID={}&lang={}".format(SERVER_DOMAIN_SSL, orderID, lang)
-
-        paypalrestsdk.configure(PAYPAL_CRD)
-        payment = paypalrestsdk.Payment({
-            "intent": "sale",
-            "payer": {"payment_method": "paypal"},
-            "redirect_urls": {"return_url": call_sub_url, "cancel_url": cancel_url},
-            "transactions": [{
-                "item_list": {"items": [
-                    {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
-                "amount": {"total": price, "currency": currency},
-                "description": content}]})
-        if not payment.create():  # 创建失败
-            return response.json(10, payment.error)
-        paymentID = payment['id']  # 获取paymentID
-        for link in payment.links:
-            if link.rel == "approval_url":
-                pay_url = str(link.href)
-                return paymentID, pay_url
-        return response.json(10, 'create_ai_order_failed')
+        call_sub_url = "{}AiService/doPayPalCallBack?orderID={}&lang={}".format(SERVER_DOMAIN_SSL, order_id, lang)
+
+        try:
+            paypalrestsdk.configure(PAYPAL_CRD)
+            payment = paypalrestsdk.Payment({
+                "intent": "sale",
+                "payer": {"payment_method": "paypal"},
+                "redirect_urls": {"return_url": call_sub_url, "cancel_url": cancel_url},
+                "transactions": [{
+                    "item_list": {"items": [
+                        {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
+                    "amount": {"total": price, "currency": currency},
+                    "description": content}]})
+
+            pay_dict = {}
+            if not payment.create():  # 创建失败
+                return pay_dict
+            payment_id = payment['id']  # 获取payment id
+            for link in payment.links:
+                if link.rel == "approval_url":
+                    pay_url = str(link.href)
+                    pay_dict['payment_id'] = payment_id
+                    pay_dict['pay_url'] = pay_url
+                    return pay_dict
+            return pay_dict
+        except Exception as e:
+            print(e)
+            return {}
 
     @staticmethod
-    def create_alipay_payment(lang, orderID, price, title, content, response):
-        aliPayObj = AliPayObject()
-        alipay = aliPayObj.conf()
-        subject = title + content
-        order_string = alipay.api_alipay_trade_wap_pay(
-            out_trade_no=orderID,
-            total_amount=price,
-            subject=subject,
-            return_url="{}web/paid2/success.html".format(SERVER_DOMAIN_SSL),
-            notify_url="{}AiService/doAlipayCallBack".format(SERVER_DOMAIN_SSL),
-            quit_url="{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL),
-            passback_params=quote("lang=" + lang)
-        )
-        if not order_string:
-            return response.json(10, '生成订单错误.')
-        return aliPayObj.alipay_prefix + order_string
+    def create_alipay_payment(lang, order_id, price, title, content):
+        """
+        创建支付宝支付
+        @param lang: 语言
+        @param order_id: 订单id
+        @param price: 价格
+        @param title: 标题
+        @param content: 内容
+        @return: pay_dict
+        """
+        try:
+            aliPayObj = AliPayObject()
+            alipay = aliPayObj.conf()
+            subject = title + content
+            order_string = alipay.api_alipay_trade_wap_pay(
+                out_trade_no=order_id,
+                total_amount=price,
+                subject=subject,
+                return_url="{}web/paid2/success.html".format(SERVER_DOMAIN_SSL),
+                notify_url="{}AiService/doAlipayCallBack".format(SERVER_DOMAIN_SSL),
+                quit_url="{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL),
+                passback_params=quote("lang=" + lang)
+            )
+            if not order_string:
+                return {}
+            return {'pay_url': aliPayObj.alipay_prefix + order_string}
+        except Exception as e:
+            print(e)
+            return {}
 
     @staticmethod
-    def create_wechat_payment(lang, orderID, price, ip, content, response):
-        pay = WechatPayObject()
+    def create_wechat_payment(lang, order_id, price, ip, content):
+        """
+        创建微信支付
+        @param lang: 语言
+        @param order_id: 订单id
+        @param price: 价格
+        @param ip: ip
+        @param content: 内容
+        @return: pay_dict
+        """
         pay_url = "{}AiService/doWechatCallBack".format(SERVER_DOMAIN_SSL)
-        # 统一调用接口
-        pay.get_parameter(orderID, content, float(price) * 100, ip, pay_url, quote("lang=" + lang))
-        sign_params = pay.re_finall(orderid=orderID)
-        if not sign_params:
-            return response.json(10, '生成订单错误.')
-        return pay_url, sign_params
+        try:
+            pay = WechatPayObject()
+            pay.get_parameter(order_id, content, float(price) * 100, ip, pay_url, quote("lang=" + lang))
+            sign_params = pay.re_finall(orderid=order_id)
+            if not sign_params:
+                return {}
+            return {'pay_url': pay_url, 'sign_params': sign_params}
+        except Exception as e:
+            print(e)
+            return {}
 
     def do_pay_by_paypal_callback(self, request_dict, response):
         logger = logging.getLogger('info')

+ 3 - 2
Controller/Surveys/CloudStorageController.py

@@ -150,6 +150,7 @@ class CloudStorageView(View):
 
     @classmethod
     def answer_save(cls, userId, ip, request_dict, response):
+        logger = logging.getLogger('info')
         try:
             ipInfo = CommonService.getIpIpInfo(ip, "CN")
             country_name = ipInfo['country_name']
@@ -181,8 +182,8 @@ class CloudStorageView(View):
                     cls.cloud_vob_operate_log_save(status=1, userId=userId)
             return response.json(0)
         except Exception as e:
-            print(e)
-            return response.json(500, repr(e))
+            logger.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(200, repr(e))
 
     @classmethod
     def entrance_cloud_storage_icon(cls, userID, request_dict, response):

+ 61 - 49
Controller/UserManger.py

@@ -1,6 +1,3 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-import logging
 import os
 import traceback
 
@@ -8,15 +5,14 @@ import boto3
 import botocore
 from botocore import client
 import simplejson as json
-from django.core.files.storage import FileSystemStorage
 from django.http import HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import TemplateView, View
 
-from Ansjer.config import BASE_DIR, SERVER_TYPE, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET
+from Ansjer.config import BASE_DIR, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET
 from Ansjer.config import SERVER_DOMAIN
-from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel
+from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel, LanguageModel
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -24,7 +20,6 @@ from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 
 
-# http://192.168.136.40:8077/account/showUserMore?token=test
 class showUserMoreView(TemplateView):
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
@@ -32,63 +27,80 @@ class showUserMoreView(TemplateView):
 
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
-        token = request.POST.get('token', None)
-
-        return self.ValidationError(token)
+        return self.validation(request.POST)
 
     def get(self, request, *args, **kwargs):
         request.encoding = 'gb2312'
-        token = request.GET.get('token', None)
+        return self.validation(request.GET)
 
-        return self.ValidationError(token)
-
-    def ValidationError(self, token):
+    def validation(self, request_dict):
         response = ResponseObject()
+        token = request_dict.get('token', None)
+        lang = request_dict.get('lang', 'en')
+
         tko = TokenObject(token)
         response.lang = tko.lang
         if tko.code != 0:
             return response.json(tko.code)
-        userID = tko.userID
-        if not userID:
+        user_id = tko.userID
+        if not user_id:
             return response.json(104)
-        return self.showUserMore(userID, response)
 
-    def showUserMore(self, userID, response):
-        User = Device_User.objects.filter(userID=userID)
-        if not User.exists():
+        return self.show_user_more(user_id, lang, response)
+
+    @staticmethod
+    def show_user_more(user_id, lang, response):
+        """
+        获取用户完整信息
+        @param user_id: 用户id
+        @param lang: 语言
+        @param response: 响应
+        @return: response
+        """
+        device_user_qs = Device_User.objects.filter(userID=user_id)
+        if not device_user_qs.exists():
             return response.json(104)
-        sqlDict = CommonService.qs_to_dict(User)
-        for k, v in enumerate(sqlDict["datas"]):
-            sqlDict['datas'][k]['fields'].pop('password')
-            userIconPath = sqlDict['datas'][k]['fields']['userIconPath']
-            region_status = sqlDict['datas'][k]['fields']['region_status']
-            if userIconPath:
-                if userIconPath.find('static/') != -1:
-                    userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
-                    userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
-                    sqlDict['datas'][k]['fields']['userIconUrl'] = userIconUrl
-
-            # 确认地区字段
-            sqlDict['datas'][k]['fields']['region_status'] = 1 if region_status else 0
-
-            if len(v['fields']['role']):
-                roleName = ModelService.getRole(rid=v['fields']['role'][0])
-                sqlDict["datas"][k]['fields']['rolename'] = roleName
-            region_country = sqlDict["datas"][k]['fields']['region_country']
-            if not region_country == 0:
-                country_qs = CountryLanguageModel.objects.filter(country_id=region_country).values(
-                    'country__region__api')
-                sqlDict["datas"][k]['fields']['api'] = country_qs[0]['country__region__api']
-            else:
-                sqlDict["datas"][k]['fields']['api'] = ''
+        try:
+            sqlDict = CommonService.qs_to_dict(device_user_qs)
+            for k, v in enumerate(sqlDict["datas"]):
+                sqlDict['datas'][k]['fields'].pop('password')
+                userIconPath = sqlDict['datas'][k]['fields']['userIconPath']
+                region_status = sqlDict['datas'][k]['fields']['region_status']
+                if userIconPath:
+                    if userIconPath.find('static/') != -1:
+                        userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
+                        userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
+                        sqlDict['datas'][k]['fields']['userIconUrl'] = userIconUrl
+
+                # 确认地区字段和当前地区
+                sqlDict['datas'][k]['fields']['region_status'] = 1 if region_status else 0
+                sqlDict['datas'][k]['fields']['region'] = ''
+                if region_status:
+                    region_country = sqlDict['datas'][k]['fields']['region_country']
+                    language_qs = LanguageModel.objects.filter(lang=lang).values('id')
+                    region_qs = CountryLanguageModel.objects.filter(country_id=region_country,
+                                                                    language_id=language_qs[0]['id']).values('country_name')
+                    sqlDict['datas'][k]['fields']['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
+
+                if len(v['fields']['role']):
+                    roleName = ModelService.getRole(rid=v['fields']['role'][0])
+                    sqlDict["datas"][k]['fields']['rolename'] = roleName
+                region_country = sqlDict["datas"][k]['fields']['region_country']
+                if not region_country == 0:
+                    country_qs = CountryLanguageModel.objects.filter(country_id=region_country).values(
+                        'country__region__api')
+                    sqlDict["datas"][k]['fields']['api'] = country_qs[0]['country__region__api']
+                else:
+                    sqlDict["datas"][k]['fields']['api'] = ''
 
-        # 增加oauth2关联数据
-        ua_qs = UserOauth2Model.objects.filter(userID_id=userID).values_list('authType', flat=True)
-        sqlDict["oauth2"] = list(ua_qs)
-        return response.json(0, sqlDict)
+            # 增加oauth2关联数据
+            ua_qs = UserOauth2Model.objects.filter(userID_id=user_id).values_list('authType', flat=True)
+            sqlDict['oauth2'] = list(ua_qs)
+            return response.json(0, sqlDict)
+        except Exception as e:
+            return response.json(500, repr(e))
 
 
-# http://192.168.136.40:8077/account/perfectUserInfo?token=test&content={"NickName":"333"}
 class perfectUserInfoView(TemplateView):
     # 完善个人信息
     @method_decorator(csrf_exempt)

+ 22 - 0
Object/AWS/AmazonKinesisVideoUtil.py

@@ -162,3 +162,25 @@ class AmazonKVAMObject:
                     return image['ImageContent']
         except Exception as e:
             return ''
+
+    def get_clip(self, stream_name, start_time, end_time):
+        """
+        获取视频流片段封面图片
+        @param stream_name: 视频流名称
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @return HLSStreamingSessionURL: 视频流片段列表信息
+        """
+        try:
+            clip = self.kvam_client_coon.get_clip(StreamName=stream_name,
+                                               ClipFragmentSelector={
+                                                   'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
+                                                   'TimestampRange': {
+                                                       'StartTimestamp': start_time,
+                                                       'EndTimestamp': end_time
+                                                   }
+                                               })['Payload']
+
+            return clip
+        except Exception as e:
+            return ''