Răsfoiți Sursa

Merge branch 'dev' into lang

lang 4 ani în urmă
părinte
comite
078cf029df
2 a modificat fișierele cu 211 adăugiri și 26 ștergeri
  1. 0 5
      Ansjer/urls.py
  2. 211 21
      Controller/CloudStorage.py

+ 0 - 5
Ansjer/urls.py

@@ -257,9 +257,6 @@ urlpatterns = [
     # cdk(云存新增功能测试)
     # cdk(云存新增功能测试)
     url(r'^cloudTest/(?P<operation>.*)$', CloudTest.cloudTestView.as_view()),
     url(r'^cloudTest/(?P<operation>.*)$', CloudTest.cloudTestView.as_view()),
 
 
-    #云存操作系统消息
-    path('cv/vodMsgNotice', CloudStorage.do_vod_msg_Notice),
-
     # app 设备消息模板
     # app 设备消息模板
     # 路由加参数参考
     # 路由加参数参考
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
@@ -269,8 +266,6 @@ urlpatterns = [
     #url(r'^test/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
     #url(r'^test/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
     url(r'^Cloudsum$', Cloudsum.Cloudsum.as_view()),
     url(r'^Cloudsum$', Cloudsum.Cloudsum.as_view()),
 
 
-
-
     re_path('(?P<path>.*)', LogManager.errorPath),
     re_path('(?P<path>.*)', LogManager.errorPath),
 
 
 
 

+ 211 - 21
Controller/CloudStorage.py

@@ -12,11 +12,14 @@
 @Contact: chanjunkai@163.com
 @Contact: chanjunkai@163.com
 """
 """
 import json
 import json
+import os
 import time
 import time
 import urllib
 import urllib
 from urllib.parse import quote, parse_qs, unquote
 from urllib.parse import quote, parse_qs, unquote
 
 
+import apns2
 import boto3
 import boto3
+import jpush
 import oss2
 import oss2
 import paypalrestsdk
 import paypalrestsdk
 import threading
 import threading
@@ -28,9 +31,10 @@ from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from boto3.session import Session
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 from django.views.generic.base import View
+from pyfcm import FCMNotification
 
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
-    SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN
+    SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, JPUSH_CONFIG
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
@@ -97,6 +101,11 @@ class CloudStorageView(View):
             return self.do_sign_play_m3u8(request_dict, response)
             return self.do_sign_play_m3u8(request_dict, response)
         elif operation == 'payOK':
         elif operation == 'payOK':
             return self.do_pay_ok(request_dict)
             return self.do_pay_ok(request_dict)
+        elif operation == 'vodMsgEnd':
+            return self.do_vod_msg_end(request_dict)
+        elif operation == 'vodMsgNotice':
+            return self.do_vod_msg_Notice(request_dict)
+
         else:
         else:
             token = request_dict.get('token', None)
             token = request_dict.get('token', None)
             # 设备主键uid
             # 设备主键uid
@@ -781,7 +790,7 @@ class CloudStorageView(View):
 
 
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
                 sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
-                do_vod_msg_Notice(request , UID, userid, lang, sys_msg_text_list)
+                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                 red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
                 red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
                 return HttpResponseRedirect(red_url)
                 return HttpResponseRedirect(red_url)
             return response.json(0, signature)
             return response.json(0, signature)
@@ -857,7 +866,7 @@ class CloudStorageView(View):
                 dvq.update(**dvq_set_update_dict)
                 dvq.update(**dvq_set_update_dict)
             order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
             order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
             sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
             sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
-            do_vod_msg_Notice(request_dict, UID, userid, lang, sys_msg_text_list)
+            self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
 
 
             # return response.json(0)
             # return response.json(0)
             red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
@@ -935,7 +944,7 @@ class CloudStorageView(View):
                     dvq.update(**dvq_set_update_dict)
                     dvq.update(**dvq_set_update_dict)
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
                 sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
-                do_vod_msg_Notice(request, UID, userid, lang, sys_msg_text_list)
+                self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                 return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
                 return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
 
 
             else:
             else:
@@ -1288,6 +1297,203 @@ class CloudStorageView(View):
             return response.json(0)
             return response.json(0)
         return response.json(444)
         return response.json(444)
 
 
+    # 云存操作系统消息
+    def do_vod_msg_Notice(self, uid, channel, userID, lang, sys_msg_text_list):
+        logger = logging.getLogger('log')
+        logger.info('进来了')
+        # user = Device_User.objects.get(userID = userID)
+        # lang = user.language;
+        if lang == 'cn':
+            sys_msg_text = sys_msg_text_list[0]
+        else:
+            sys_msg_text = sys_msg_text_list[1]
+        nowTime = int(time.time())
+        create_data = {'userID_id': userID, 'msg': sys_msg_text, 'addTime': nowTime,
+                       'updTime': nowTime, 'uid': uid, 'eventType': 0}
+        SysMsgModel.objects.create(**create_data)
+        self.pushApp(nowTime, uid, channel, sys_msg_text)
+
+        logger.info('出去了')
+
+    # 云存到期续费提醒   提前1天
+    def do_vod_msg_end(self):
+        response = ResponseObject()
+        now_time = int(time.time())
+
+        list = UID_Bucket.objects.filter(Q(endTime__lte=(now_time - 3600 * 24)) & Q(endTime__gt=now_time)).values('id',
+                                                                                                                  'uid',
+                                                                                                                  'bucket__area','channel')
+
+        uq_list = []
+        ids = []
+        for ub in list:
+            ids.append(ub['id'])
+
+        oqlist = Order_Model.objects.filter(uid_bucket_id__in=ids).values('userID_id', 'uid_bucket_id')
+
+        for ub in list:
+            for oo in oqlist:
+                if ub['id'] == oo['uid_bucket_id']:
+                    if ub['bucket__area'] == 'cn':
+                        sys_msg_text = "云存即将过期,请您注意!"
+                    else:
+                        sys_msg_text = "Cloud storage is about to expire, please pay attention!"
+                    uq_list.append(SysMsgModel(
+                        userID_id=oo['userID_id'],
+                        addTime=now_time,
+                        updTime=now_time,
+                        uid=ub['uid'],
+                        eventType=0,
+                        msg=sys_msg_text,
+                        status=0
+                    ))
+                    self.pushApp(now_time, ub['uid'], ub['channel'], sys_msg_text)
+
+        SysMsgModel.objects.bulk_create(uq_list)
+
+
+        return response.json(0)
+
+    def pushApp(self, nowTime, uid, channel, sys_msg_text):
+        n_time = nowTime
+
+        kwag_args = {
+            'uid': uid,
+            'channel': channel,
+            'event_type': 0,
+            'n_time': n_time
+        }
+
+        # 从数据库查询出来
+        uid_push_qs = UidPushModel.objects.filter(uid_set__uid=uid, uid_set__detect_status=1). \
+            values('token_val', 'app_type', 'appBundleId', 'm_code',
+                   'push_type', 'userID_id', 'userID__NickName',
+                   'lang', 'm_code', 'tz', 'uid_set__nickname', 'uid_set__detect_interval', 'uid_set__detect_group',
+                   'uid_set__channel')
+        print(uid_push_qs)
+        # 新建一个list接收数据
+        redis_list = []
+        # 把数据库数据追加进redis_list
+        for qs in uid_push_qs:
+            redis_list.append(qs)
+
+        nickname = redis_list[0]['uid_set__nickname']
+
+        for up in redis_list:
+            push_type = up['push_type']
+            appBundleId = up['appBundleId']
+            token_val = up['token_val']
+            lang = up['lang']
+            tz = up['tz']
+            if tz is None or tz == '':
+                tz = 0
+
+            package_title_config = {
+                'com.ansjer.customizedd_a': 'DVS',
+                'com.ansjer.zccloud_a': 'ZosiSmart',
+                'com.ansjer.zccloud_ab': '周视',
+                'com.ansjer.adcloud_a': 'ADCloud',
+                'com.ansjer.adcloud_ab': 'ADCloud',
+                'com.ansjer.accloud_a': 'ACCloud',
+                'com.ansjer.loocamccloud_a': 'Loocam',
+                'com.ansjer.loocamdcloud_a': 'Anlapus',
+                'com.ansjer.customizedb_a': 'COCOONHD',
+                'com.ansjer.customizeda_a': 'Guardian365',
+                'com.ansjer.customizedc_a': 'PatrolSecure',
+            }
+            if appBundleId in package_title_config.keys():
+                msg_title = package_title_config[appBundleId] + '(' + nickname + ')'
+            else:
+                msg_title = nickname
+
+            # 发送内容
+            msg_text = sys_msg_text
+            kwag_args['appBundleId'] = appBundleId
+            kwag_args['token_val'] = token_val
+            kwag_args['msg_title'] = msg_title
+            kwag_args['msg_text'] = msg_text
+            push_server_status = 0
+            # 推送
+            if push_type == 0:  # ios apns
+
+                try:
+                    cli = apns2.APNSClient(mode=APNS_MODE,
+                                           client_cert=os.path.join(BASE_DIR,
+                                                                    APNS_CONFIG[appBundleId]['pem_path']))
+
+                    push_data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                                 "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1",
+                                 "channel": channel}
+                    alert = apns2.PayloadAlert(body=msg_text, title=msg_title)
+                    payload = apns2.Payload(alert=alert, custom=push_data)
+
+                    # return uid, channel, appBundleId, str(token_val), event_type, n_time, msg_title,msg_text
+                    n = apns2.Notification(payload=payload, priority=apns2.PRIORITY_LOW)
+                    res = cli.push(n=n, device_token=token_val, topic=appBundleId)
+                    print(res.status_code)
+                    if res.status_code == 200:
+                        return res.status_code
+                    else:
+                        print('apns push fail')
+                        print(res.reason)
+                        return res.status_code
+                except (ValueError, ArithmeticError):
+                    return 'The program has a numeric format exception, one of the arithmetic exceptions'
+                except Exception as e:
+                    print(repr(e))
+                    return repr(e)
+
+            elif push_type == 1:  # android gcm
+                try:
+                    FCM_CONFIG = {
+                        'com.ansjer.zccloud_a': 'AAAAb9YP3rk:APA91bHu8u-CTpcd0g6lKPo0WNVqCi8jZub1cPPbSAY9AucT1HxlF65ZDUko9iG8q2ch17bwu9YWHpK1xI1gHSRXCslLvZlXEmHZC0AG3JKg15XuUvlFKACIajUFV-pOeGRT8tM6-31I',
+                        'com.ansjer.loocamccloud_a': 'AAAAb9YP3rk:APA91bFCgd-kbVmpK4EVpfdHH_PJZQCYTkOGnTZdIuBWEz2r7aMRsJYHOH3sB-rwcbaRWgnufTyjX9nGQxb6KxQbWVk4ah_H-M3IqGh6Mb60WQQAuR33V6g_Jes5pGL6ViuIxGHqVMaR',
+                        'com.ansjer.loocamdcloud_a': 'AAAAb9YP3rk:APA91bGw2I2KMD4i-5T7nZO_wB8kuAOuqgyqe5rxmY-W5qkpYEx9IL2IfmC_qf6B_xOyjIDDSjckvMo-RauN__SEoxvAkis7042GRkoKpw7cjZ_H8lC-d50PC0GclPzccrOGFusyKbFY',
+                        'com.ansjer.customizedb_a': 'AAAAb9YP3rk:APA91bE7kI4vcm-9h_CJNFlOZfc-xwP4Btn6AnjOrwoKV6fgYN7fdarkO76sYxVZiAbDnxsFfOJyP7vQfwyan6mdjuyD5iHdt_XgO22VqniC0vA1V4GJiCS8Tp7LxIX8JVKZl9I_Powt',
+                        'com.ansjer.customizeda_a': 'AAAAb9YP3rk:APA91bF0HzizVWDc6dKzobY9fsaKDK4veqkOZehDXshVXs8pEEvNWjR_YWbhP60wsRYCHCal8fWN5cECVOWNMMzDsfU88Ty2AUl8S5FtZsmeDTkoGntQOswBr8Ln7Fm_LAp1VqTf9CpM',
+                        'com.ansjer.customizedd_a': 'AAAAb9YP3rk:APA91bHkxOozJWBrlv3eNT0PgwosYENI9aM4Zuzd418cX-iKkpa1zFNC5MkNDKApx1KH4fhmAfaJ6IMRZ0nj5GIxCpstDYCaZWwgC7-etqfSxG5JAq8LOwJx0o_1tUZqwjIic8ztsg0o',
+                        'com.ansjer.adcloud_a': 'AAAAb9YP3rk:APA91bFm06w8b9OKQ0gz0iaWFuRqRIkvgAz6z7Gp3dBU_X-LNGJQd1hc1QR2W7QzBglF8SHtERA45a2lbdLRa5qv7hxfd6W_sJLBK7dA8jklsOQBvy505oUzTwMKWy4TwH-exps9KrhO',
+                        'com.ansjer.accloud_a': 'AAAAb9YP3rk:APA91bFm06w8b9OKQ0gz0iaWFuRqRIkvgAz6z7Gp3dBU_X-LNGJQd1hc1QR2W7QzBglF8SHtERA45a2lbdLRa5qv7hxfd6W_sJLBK7dA8jklsOQBvy505oUzTwMKWy4TwH-exps9KrhO',
+                        'com.ansjer.zccloud_ab': 'AAAAb9YP3rk:APA91bHu8u-CTpcd0g6lKPo0WNVqCi8jZub1cPPbSAY9AucT1HxlF65ZDUko9iG8q2ch17bwu9YWHpK1xI1gHSRXCslLvZlXEmHZC0AG3JKg15XuUvlFKACIajUFV-pOeGRT8tM6-31I',
+                    }
+                    serverKey = FCM_CONFIG[appBundleId]
+                except Exception as e:
+                    return 'serverKey abnormal'
+                push_service = FCMNotification(api_key=serverKey)
+                data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                        "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1", "channel": channel}
+                result = push_service.notify_single_device(registration_id=token_val, message_title=msg_title,
+                                                           message_body=msg_text, data_message=data,
+                                                           extra_kwargs={
+                                                               'default_vibrate_timings': True,
+                                                               'default_sound': True,
+                                                               'default_light_settings': True
+                                                           })
+                print('fcm push ing')
+                print(result)
+                return result
+            elif push_type == 2:  # android jpush
+                print('do_jpush')
+                app_key = JPUSH_CONFIG[appBundleId]['Key']
+                master_secret = JPUSH_CONFIG[appBundleId]['Secret']
+                # 此处换成各自的app_key和master_secre
+                _jpush = jpush.JPush(app_key, master_secret)
+                push = _jpush.create_push()
+                # if you set the logging level to "DEBUG",it will show the debug logging.
+                # _jpush.set_logging("DEBUG")
+                # push.audience = jpush.all_
+                push.audience = jpush.registration_id(token_val)
+                push_data = {"alert": "Motion ", "event_time": n_time, "event_type": 0, "msg": "",
+                             "received_at": n_time, "sound": "sound.aif", "uid": uid, "zpush": "1", "channel": channel}
+                android = jpush.android(alert=msg_text, priority=1, style=1, alert_type=7,
+                                        big_text=msg_text, title=msg_title,
+                                        extras=push_data)
+                push.notification = jpush.notification(android=android)
+                push.platform = jpush.all_
+                res = push.send()
+                print(res)
+                return res.status_code
+
 
 
 
 
 # 删除过期云存播放列表
 # 删除过期云存播放列表
@@ -1327,20 +1533,4 @@ def deleteExpiredUidBucket(request):
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
     id_list = expired_uid_bucket.values_list("id", flat=True)
     id_list = expired_uid_bucket.values_list("id", flat=True)
     UID_Bucket.objects.filter(id__in=list(id_list)).delete()  # 删除过期云存关联套餐, 后续是否考虑用软删除
     UID_Bucket.objects.filter(id__in=list(id_list)).delete()  # 删除过期云存关联套餐, 后续是否考虑用软删除
-    return response.json(0)
-
-# 云存操作系统消息
-def do_vod_msg_Notice(request, uid , userID , lang, sys_msg_text_list):
-    logger = logging.getLogger('log')
-    logger.info('进来了')
-    # user = Device_User.objects.get(userID = userID)
-    # lang = user.language;
-    if lang == 'cn':
-        sys_msg_text = sys_msg_text_list[0]
-    else:
-        sys_msg_text = sys_msg_text_list[1]
-    nowTime = int(time.time())
-    create_data = {'userID_id': userID, 'msg': sys_msg_text, 'addTime': nowTime,
-                   'updTime': nowTime, 'uid': uid, 'eventType': 0}
-    SysMsgModel.objects.create(**create_data)
-    logger.info('出去了')
+    return response.json(0)