소스 검색

Merge branch 'dev' of http://192.168.136.99:3000/SERVER/AnsjerServer into zjz

 Conflicts:
	Controller/Cloudsum.py
zjz 4 년 전
부모
커밋
affaae746a

+ 5 - 0
Ansjer/config.py

@@ -68,6 +68,11 @@ OSS_STS_ACCESS_KEY = 'LTAIyMkGfEdogyL9'
 OSS_STS_ACCESS_SECRET = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
 OSS_STS_ACCESS_SECRET = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
 OSS_ROLE_ARN = 'acs:ram::1901342792446414:role/stsoss'
 OSS_ROLE_ARN = 'acs:ram::1901342792446414:role/stsoss'
 
 
+# aws api key
+AWS_ACCESS_KEY_ID = ['AKIA2MMWBR4DSFG67DTG','AKIA2E67UIMD45Y3HL53']  #0国内, 1国外
+AWS_SECRET_ACCESS_KEY = ['aI9gxcAKPmiGgPy9axrtFKzjYGbvpuytEX4xWweL','ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw']
+AWS_ARN = ['arn:aws-cn:s3','arn:aws:s3']
+
 # 不同环境配置
 # 不同环境配置
 if SERVER_TYPE == 'Ansjer.local_settings':
 if SERVER_TYPE == 'Ansjer.local_settings':
     from Ansjer.config_local import *
     from Ansjer.config_local import *

+ 0 - 2
Ansjer/urls.py

@@ -266,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),
 
 
 
 

+ 365 - 253
Controller/CloudStorage.py

@@ -12,10 +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
 
 
+import apns2
 import boto3
 import boto3
+import jpush
 import oss2
 import oss2
 import paypalrestsdk
 import paypalrestsdk
 import threading
 import threading
@@ -27,11 +31,12 @@ 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
+    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
+    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -96,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
@@ -253,11 +263,11 @@ class CloudStorageView(View):
         bucket_name = vh_qs[0]['bucket__bucket']
         bucket_name = vh_qs[0]['bucket__bucket']
         print(bucket__region)
         print(bucket__region)
         print(bucket_name)
         print(bucket_name)
-        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-        aws_secret_access_key = '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'
+
+
         session = Session(
         session = Session(
-            aws_access_key_id=aws_access_key_id,
-            aws_secret_access_key=aws_secret_access_key,
+            aws_access_key_id=AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]],
+            aws_secret_access_key = AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]],
             region_name=bucket__region
             region_name=bucket__region
         )
         )
         '''
         '''
@@ -329,142 +339,77 @@ class CloudStorageView(View):
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                           "bucket__region", "endTime").order_by('addTime')[:1]
                           "bucket__region", "endTime").order_by('addTime')[:1]
         if ubqs.exists():
         if ubqs.exists():
-            if ubqs[0]["bucket__mold"] == 0:
-                # 阿里云 oss sts
-                oc_qs = OssCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if oc_qs.exists():
-                    endTime = int(oc_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(oc_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
+            # 亚马逊 s3 sts
+            sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
+                values("addTime", "data")
+            if sts_qs.exists():
+                endTime = int(sts_qs[0]["addTime"]) + 3500
+                if endTime > now_time:
+                    print(endTime)
+                    print(now_time)
+                    res = json.loads(sts_qs[0]["data"])
+                    return JsonResponse(status=200, data=res)
                 # 套餐id
                 # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                access_key_id = OSS_STS_ACCESS_KEY
-                access_key_secret = OSS_STS_ACCESS_SECRET
-                region_id = ubqs[0]['bucket__region']
-                role_arn = OSS_ROLE_ARN
-                clt = client.AcsClient(access_key_id, access_key_secret, region_id)
-                req = AssumeRoleRequest.AssumeRoleRequest()
-                # 设置返回值格式为JSON。
-                req.set_accept_format('json')
-                req.set_RoleArn(role_arn)
-                req.set_RoleSessionName(uid + '_' + channel)
-                req.set_DurationSeconds(3600)
-                Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*". \
-                    format(bucket_name=bucket_name, uid_channel=storage)
-                print(Resource_access)
-                policys = {
-                    "Version": "1",
-                    "Statement": [
-                        {
-                            "Action": ["oss:PutObject", "oss:DeleteObject", ],
-                            "Resource": [Resource_access],
-                            "Effect": "Allow",
-                            "Condition": {
-                                "IpAddress": {"acs:SourceIp": ip}
-                                # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
-                                # "IpAddress": {"acs:SourceIp": "*"}
-                            }
-                        }
-                    ]
-                }
-                req.set_Policy(Policy=json.dumps(policys))
-                body = clt.do_action(req)
-                # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
-                token = json.loads(body.decode('utf-8'))
-                print(token)
-                res = {
-                    'AccessKeyId': token['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': token['Credentials']['AccessKeySecret'],
-                    'SecurityToken': token['Credentials']['SecurityToken'],
-                    'Expiration': token['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': token['AssumedRoleUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip}
-                if oc_qs.exists():
-                    oc_qs.update(data=json.dumps(res), addTime=now_time)
-                else:
-                    OssCrdModel.objects.create \
-                        (uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
-                return JsonResponse(status=200, data=res)
-            elif ubqs[0]["bucket__mold"] == 1:
-                # 亚马逊 s3 sts
-                sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if sts_qs.exists():
-                    endTime = int(sts_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(sts_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
-                    # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                region_id = ubqs[0]['bucket__region']
-
-                ###############
-                REGION_NAME = region_id
-                boto3_sts = boto3.client(
-                    'sts',
-                    aws_access_key_id='AKIA2E67UIMD45Y3HL53',
-                    aws_secret_access_key='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',
-                    region_name=REGION_NAME
-                )
-                print('--------2--test')
-                print(REGION_NAME)
-                Policy = {
-                    "Version": "2012-10-17",
-                    "Statement": [
-                        {
-                            "Effect": "Allow",
-                            "Action": "s3:*",
-                            "Resource": ["arn:aws:s3:::{bucket_name}/{uid_channel}*".
-                                             format(bucket_name=bucket_name, uid_channel=storage)]
-                        }
-                    ]
-                }
-                print(Policy)
-                response = boto3_sts.get_federation_token(
-                    Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
-                    Policy=json.dumps(Policy),
-                    DurationSeconds=7200
-                )
-                ###############
-                res = {
-                    'AccessKeyId': response['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': response['Credentials']['SecretAccessKey'],
-                    'SessionToken': response['Credentials']['SessionToken'],
-                    'Expiration': response['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': response['FederatedUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip,
-                }
-                if sts_qs.exists():
-                    sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
-                else:
-                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
-                                               addTime=now_time, type=1)
-                return JsonResponse(status=200, data=res)
-            else:
-                res = {'code': 404, 'msg': 'data not exists!'}
+            storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+            bucket_name = ubqs[0]['bucket__bucket']
+            endpoint = ubqs[0]['bucket__endpoint']
+            region_id = ubqs[0]['bucket__region']
+
+            try:
+                aws_access_key_id = AWS_ACCESS_KEY_ID[ubqs[0]["bucket__mold"]]
+                aws_secret_access_key = AWS_SECRET_ACCESS_KEY[ubqs[0]["bucket__mold"]]
+                aws_arn = AWS_ARN[ubqs[0]["bucket__mold"]]
+            except:
+                res = {'code': 404, 'msg': 'mold not exists!'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+
+            ###############
+            boto3_sts = boto3.client(
+                'sts',
+                aws_access_key_id=aws_access_key_id,
+                aws_secret_access_key=aws_secret_access_key,
+                region_name=region_id
+            )
+            Policy = {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Action": "s3:*",
+                        "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                    }
+                ]
+            }
+            response = boto3_sts.get_federation_token(
+                Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
+                Policy=json.dumps(Policy),
+                DurationSeconds=7200
+            )
+            ##############
+            res = {
+                'AccessKeyId': response['Credentials']['AccessKeyId'],
+                'AccessKeySecret': response['Credentials']['SecretAccessKey'],
+                'SessionToken': response['Credentials']['SessionToken'],
+                'Expiration': response['Credentials']['Expiration'],
+                'expire': '3600',
+                'endpoint': endpoint,
+                'bucket_name': bucket_name,
+                'arn': response['FederatedUser']['Arn'],
+                'code': 0,
+                'storage': storage,
+                'endTime': ubqs[0]['endTime'],
+                'ip': ip,
+            }
+            if sts_qs.exists():
+                sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
+            else:
+                StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
+                                           addTime=now_time, type=1)
+            return JsonResponse(status=200, data=res)
+            # else:
+            #     res = {'code': 404, 'msg': 'data not exists!'}
+            #     return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
 
 
@@ -481,19 +426,17 @@ class CloudStorageView(View):
         if dv_qs[0]['vodPrimaryUserID'] != userID:
         if dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(10034)
             return response.json(10034)
         now_time = int(time.time())
         now_time = int(time.time())
-        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).order_by('addTime')
+        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).values('bucket_id').order_by('addTime')
         if not bv_qs.exists():
         if not bv_qs.exists():
             return response.json(10030)
             return response.json(10030)
         vh_qs = VodHlsModel.objects.filter \
         vh_qs = VodHlsModel.objects.filter \
-            (uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \
+            (uid=uid, channel=channel, endTime__gte=now_time,time__range=(startTime, endTime), bucket_id=bv_qs[0]['bucket_id']). \
             values("id", "time", "sec", "bucket__bucket", "fg", "bucket__endpoint", "bucket__region", "bucket__mold")
             values("id", "time", "sec", "bucket__bucket", "fg", "bucket__endpoint", "bucket__region", "bucket__mold")
         vod_play_list = []
         vod_play_list = []
-
         if not vh_qs.exists():
         if not vh_qs.exists():
             return response.json(0, vod_play_list)
             return response.json(0, vod_play_list)
-
-        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-        aws_secret_access_key = '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'
+        aws_access_key_id = AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]]
+        aws_secret_access_key = AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]]
         session = Session(
         session = Session(
             aws_access_key_id=aws_access_key_id,
             aws_access_key_id=aws_access_key_id,
             aws_secret_access_key=aws_secret_access_key,
             aws_secret_access_key=aws_secret_access_key,
@@ -505,57 +448,29 @@ class CloudStorageView(View):
             bucket__mold = vod["bucket__mold"]
             bucket__mold = vod["bucket__mold"]
             bucket_name = vod["bucket__bucket"]
             bucket_name = vod["bucket__bucket"]
             endpoint = vod["bucket__endpoint"]
             endpoint = vod["bucket__endpoint"]
-            # bucket__region = vod["bucket__region"]
-            if bucket__mold == 0:
-                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
-                urllst = url.split('?')
-                url_start = urllib.parse.unquote(urllst[0])
-                url_end = urllst[1]
-                vod_play_url = '{url_start}?{url_end}'. \
-                    format(url_start=url_start, url_end=url_end)
-                thumb = bucket.sign_url('GET', ts, 3600,
-                                        params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
-                vod_play_list.append({'name': vod['time'], 'sign_url': vod_play_url,
-                                      'thumb': thumb, 'sec': vod['sec'], 'vod_id': vod['id']})
-            elif bucket__mold == 1:
-
-                # aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-                # aws_secret_access_key = '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'
-                # session = Session(
-                #     aws_access_key_id=aws_access_key_id,
-                #     aws_secret_access_key=aws_secret_access_key,
-                #     region_name=bucket__region
-                # )
-                # conn = session.client('s3')
-
-                thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                response_url = conn.generate_presigned_url(
-                    'get_object',
-                    Params={
-                        'Bucket': bucket_name,
-                        'Key': thumbspng
-                    },
-                    ExpiresIn=3600
-                )
-                vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
-                          'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
-                    format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
-                ts_num = int(vod['fg']) & 0xf
-                vod_play_list.append({
-                    'name': vod['time'],
-                    'sign_url': vod_url,
-                    'thumb': response_url,
-                    'sec': vod['sec'],
-                    'ts_num': ts_num,
-                    'vod_id': vod['id']
-                }),
+            bucket__region = vod["bucket__region"]
+            thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
+                format(uid=uid, channel=channel, time=vod['time'])
+            response_url = conn.generate_presigned_url(
+                'get_object',
+                Params={
+                    'Bucket': bucket_name,
+                    'Key': thumbspng
+                },
+                ExpiresIn=3600
+            )
+            vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
+                      'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
+                format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
+            ts_num = int(vod['fg']) & 0xf
+            vod_play_list.append({
+                'name': vod['time'],
+                'sign_url': vod_url,
+                'thumb': response_url,
+                'sec': vod['sec'],
+                'ts_num': ts_num,
+                'vod_id': vod['id']
+            }),
         return response.json(0, vod_play_list)
         return response.json(0, vod_play_list)
 
 
     def do_store_playlist(self, request_dict, response):
     def do_store_playlist(self, request_dict, response):
@@ -585,44 +500,25 @@ class CloudStorageView(View):
             bucket_id = ub_qs_data['bucket__id']
             bucket_id = ub_qs_data['bucket__id']
             end_time = int(storeTime) + store_day * 86400
             end_time = int(storeTime) + store_day * 86400
             if ub_qs_data['status'] == 1:
             if ub_qs_data['status'] == 1:
-                if ub_qs_data["bucket__mold"] == 0:
-                    oss_crd_qs = OssCrdModel.objects.filter(uid=UID, channel=channel)
-                    if oss_crd_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                elif ub_qs_data['bucket__mold'] == 1:
-                    sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
-                        values("addTime", "data")
-                    if sts_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            fg=fg,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
+                sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
+                    values("addTime", "data")
+                if sts_qs.exists():
+                    VodHlsModel.objects.create(
+                        uid=UID,
+                        channel=channel,
+                        time=storeTime,
+                        endTime=end_time,
+                        bucket_id=bucket_id,
+                        fg=fg,
+                        sec=sec,
+                    )
+                    res = {'code': 0, 'msg': '存储成功'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
+                else:
+                    res = {'code': 404, 'msg': '设备未购买'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
             else:
             else:
                 res = {'code': 404, 'msg': '设备未开启'}
                 res = {'code': 404, 'msg': '设备未开启'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
@@ -830,8 +726,11 @@ class CloudStorageView(View):
         response = ResponseObject()
         response = ResponseObject()
         data = request.POST.dict()
         data = request.POST.dict()
         logger = logging.getLogger('log')
         logger = logging.getLogger('log')
-        try:
 
 
+        try:
+            passback_params = data["passback_params"]
+            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
+            lang = parmap["lang"]
             signature = data["sign"]
             signature = data["sign"]
             data.pop('sign')
             data.pop('sign')
             orderID = data['out_trade_no']
             orderID = data['out_trade_no']
@@ -890,6 +789,8 @@ 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']
+                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)
@@ -903,6 +804,7 @@ class CloudStorageView(View):
         paymentId = request_dict.get('paymentId', None)
         paymentId = request_dict.get('paymentId', None)
         PayerID = request_dict.get('PayerID', None)
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         orderID = request_dict.get('orderID', None)
+        lang = request_dict.get('lang', None)
 
 
         try:
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
@@ -963,6 +865,8 @@ 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']
+            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)
@@ -983,6 +887,9 @@ class CloudStorageView(View):
             pay = WechatPayObject()
             pay = WechatPayObject()
             data = pay.weixinpay_call_back(request.body)
             data = pay.weixinpay_call_back(request.body)
 
 
+            attach = data["attach"]
+            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
+            lang = parmap["lang"]
             trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL
             trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL
             out_trade_no = data['out_trade_no']  # 商户订单号
             out_trade_no = data['out_trade_no']  # 商户订单号
             order_qs = Order_Model.objects.filter(orderID=out_trade_no, status=0)
             order_qs = Order_Model.objects.filter(orderID=out_trade_no, status=0)
@@ -1036,6 +943,8 @@ 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']
+                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:
@@ -1054,6 +963,7 @@ class CloudStorageView(View):
         pay_type = int(request_dict.get('pay_type', None))
         pay_type = int(request_dict.get('pay_type', None))
         rank = request_dict.get('rank', None)
         rank = request_dict.get('rank', None)
         is_select_discount = request_dict.get('is_select_discount', 0)
         is_select_discount = request_dict.get('is_select_discount', 0)
+        lang = request_dict.get('lang', 0)
         if not uid or not channel or not pay_type or not rank:
         if not uid or not channel or not pay_type or not rank:
             return response.json(444)
             return response.json(444)
         dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values(
         dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values(
@@ -1099,10 +1009,10 @@ class CloudStorageView(View):
 
 
         orderID = CommonService.createOrderID()
         orderID = CommonService.createOrderID()
         if pay_type == 1:
         if pay_type == 1:
-            call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}". \
-                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
-            #call_sub_url = "http://binbin.uicp.vip/cloudstorage/dopaypalcallback?orderID={orderID}".format(
-                 #SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}&lang={lang}". \
+                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID, lang=lang)
+            # call_sub_url = "http://binbin.uicp.vip/cloudstorage/dopaypalcallback?orderID={orderID}".format(
+            # SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
             call_clc_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             call_clc_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
             paypalrestsdk.configure(PAYPAL_CRD)
             paypalrestsdk.configure(PAYPAL_CRD)
             payment = paypalrestsdk.Payment({
             payment = paypalrestsdk.Payment({
@@ -1110,6 +1020,8 @@ class CloudStorageView(View):
                 "payer": {"payment_method": "paypal"},
                 "payer": {"payment_method": "paypal"},
                 "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
                 "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
                 "transactions": [{
                 "transactions": [{
+                    "item_list": {"items": [
+                        {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
                     "amount": {"total": price, "currency": currency},
                     "amount": {"total": price, "currency": currency},
                     "description": content}]})
                     "description": content}]})
             if payment.create():
             if payment.create():
@@ -1151,10 +1063,12 @@ class CloudStorageView(View):
                     notify_url="{SERVER_DOMAIN_SSL}cloudstorage/doalicallback".format(
                     notify_url="{SERVER_DOMAIN_SSL}cloudstorage/doalicallback".format(
                         SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
                         SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
                     quit_url="{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN),
                     quit_url="{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN),
+                    passback_params=quote("lang="+lang)
                     # return_url="http://192.168.136.40/cloudstorage/payOK",
                     # return_url="http://192.168.136.40/cloudstorage/payOK",
                     # notify_url="http://192.168.136.40/cloudstorage/aliPayCallback"
                     # notify_url="http://192.168.136.40/cloudstorage/aliPayCallback"
                 )
                 )
 
 
+
             except Exception as e:
             except Exception as e:
                 print(repr(e))
                 print(repr(e))
                 return response.json(10, repr(e))
                 return response.json(10, repr(e))
@@ -1169,6 +1083,7 @@ class CloudStorageView(View):
                                                pay_url=redirectUrl, isSelectDiscounts=is_select_discount,
                                                pay_url=redirectUrl, isSelectDiscounts=is_select_discount,
                                                commodity_code=commodity_code, commodity_type=commodity_type,
                                                commodity_code=commodity_code, commodity_type=commodity_type,
                                                rank_id=rank)
                                                rank_id=rank)
+
                     return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                     return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
                                                           'result': {"redirectUrl": redirectUrl, "orderID": orderID},
                                                           'result': {"redirectUrl": redirectUrl, "orderID": orderID},
                                                           'error_code': 0})
                                                           'error_code': 0})
@@ -1182,14 +1097,13 @@ class CloudStorageView(View):
             # 获取参数
             # 获取参数
             response = ResponseObject()
             response = ResponseObject()
 
 
-            parameter_dict = pay.get_parameter(orderID, content, float(price) * 100, ip, notify_url)
+            parameter_dict = pay.get_parameter(orderID, content, float(price) * 100, ip, notify_url, quote("lang="+lang))
             print('parameter_dict', parameter_dict)
             print('parameter_dict', parameter_dict)
             # parameter_dict 参数中获取MWEB_URL 调转页面在路径后面添加redirect_url
             # parameter_dict 参数中获取MWEB_URL 调转页面在路径后面添加redirect_url
             # 统一调用接口
             # 统一调用接口
             response = pay.re_finall(orderid=orderID)
             response = pay.re_finall(orderid=orderID)
             if not response:
             if not response:
                 return response.json(10, '生成订单错误.')
                 return response.json(10, '生成订单错误.')
-
             # 回调函数
             # 回调函数
             Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
             Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
                                        desc=content, payType=pay_type, payTime=nowTime,
                                        desc=content, payType=pay_type, payTime=nowTime,
@@ -1214,9 +1128,9 @@ class CloudStorageView(View):
         if cdk != None and pay_type == 11:
         if cdk != None and pay_type == 11:
             cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
             cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
             if not cdk_qs.exists():
             if not cdk_qs.exists():
-                return response.json(10, '无效激活码')
+                return response.json(10040)
             if cdk_qs[0]['is_activate'] == 1:
             if cdk_qs[0]['is_activate'] == 1:
-                return response.json(10, '激活码已被使用过')
+                return response.json(10039)
             rank = cdk_qs[0]['rank__id']
             rank = cdk_qs[0]['rank__id']
             commodity_code = cdk_qs[0]['rank__commodity_code']
             commodity_code = cdk_qs[0]['rank__commodity_code']
 
 
@@ -1368,23 +1282,221 @@ class CloudStorageView(View):
         if switch_commodity_id:
         if switch_commodity_id:
             # 切换设备套餐关联
             # 切换设备套餐关联
             using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
             using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
-                                                                                                        "endTime",
-                                                                                                        "bucket__content").order_by(
-                'addTime')
-
+                                                                                                        "endTime","bucket__content","addTime").order_by('addTime')
             if not using_uid_bucket.exists():
             if not using_uid_bucket.exists():
                 return response.json(10030)
                 return response.json(10030)
-
-            if int(using_uid_bucket[0]['id']) == int(switch_commodity_id):
+            useing_uid_bucket_id = using_uid_bucket[0]['id']
+            useing_uid_bucket_addTime = using_uid_bucket[0]['addTime']
+            if int(useing_uid_bucket_id) == int(switch_commodity_id):
                 return response.json(10032)
                 return response.json(10032)
 
 
-            # UID_Bucket.objects.filter(id=switch_commodity_id).update(is_use=1)  #更新转移的云存套餐为使用中
-            UID_Bucket.objects.filter(id=using_uid_bucket[0]['id']).delete()  # 删除原来使用中的云存套餐
+            UID_Bucket.objects.filter(id=switch_commodity_id).update(addTime=useing_uid_bucket_addTime)#更新转移的云存套餐为使用中
+            UID_Bucket.objects.filter(id=useing_uid_bucket_id).delete()  # 删除原来使用中的云存套餐
             VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表
             VodHlsModel.objects.filter(uid=uid).delete()  # 删除播放列表
             StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
             StsCrdModel.objects.filter(uid=uid).delete()  # 删除sts记录
             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):
+        try:
+            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('出去了')
+        except Exception as e:
+            return repr(e)
+    # 云存到期续费提醒   提前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
+
+
 
 
 # 删除过期云存播放列表
 # 删除过期云存播放列表
 def deleteVodHls(request):
 def deleteVodHls(request):
@@ -1423,4 +1535,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)
+    return response.json(0)

+ 6 - 4
Controller/CloudTest.py

@@ -80,8 +80,10 @@ class cloudTestView(View):
             vodPrimaryMaster = newUserName
             vodPrimaryMaster = newUserName
 
 
             with transaction.atomic():
             with transaction.atomic():
-                # 更新设备信息
-                old_deviceInfo_qs.update(userID=newUserID, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
+                # 更新旧设备userID
+                old_deviceInfo_qs.update(userID=newUserID)
+                # 更新所有设备主用户信息
+                Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
         except Exception as e:
         except Exception as e:
             # print(e)
             # print(e)
@@ -134,8 +136,8 @@ class cloudTestView(View):
                 return response.json(10014)
                 return response.json(10014)
 
 
             with transaction.atomic():
             with transaction.atomic():
-                # 更新设备主用户信息
-                new_deviceInfo_qs.update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
+                # 更新所有设备主用户信息
+                Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                 # vod_uid_bucket表更新uid
                 # vod_uid_bucket表更新uid
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
                 old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
                 UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid)
                 UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid)

+ 63 - 126
Controller/Cloudsum.py

@@ -1,37 +1,34 @@
-from Model.models import Order_Model, UID_Bucket, UserExModel, App_Info, Device_User
+from Model.models import Order_Model,UID_Bucket,UserExModel,App_Info
 from django.http import JsonResponse
 from django.http import JsonResponse
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from django.views import View
 from django.views import View
+from Service.ModelService import Device_User,ModelService
+from django.db.models import Count, Sum
 
 
-from django.utils.decorators import method_decorator
-from django.views.generic import TemplateView
-from django.views.decorators.csrf import csrf_exempt
-from Service.ModelService import ModelService
-class Cloudsum(TemplateView):
-    @method_decorator(csrf_exempt)
-    def dispatch(self, *args, **kwargs):
-        return super(Cloudsum, self).dispatch(*args, **kwargs)
+class Cloudsum(View):
+    def dispatch(self, requset, *args, **kwargs):
+        return super(Cloudsum, self).dispatch(requset, *args, **kwargs)
 
 
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
-        return self.validation(request_dict=request.GET)
+        return self.validation(request.GET, request, operation)
 
 
     def post(self, request, *args, **kwargs):
     def post(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
-        return self.validation(request_dict=request.POST)
+        return self.validation(request.POST, request, operation)
 
 
-    def validation(self, request_dict, *args, **kwargs):
+    def validation(self, request_dict, request, operation):
         response = ResponseObject()
         response = ResponseObject()
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
         tko = TokenObject(token)
         tko = TokenObject(token)
         response.lang = tko.lang
         response.lang = tko.lang
+        userID = tko.userID
+        print('userID:', userID)
         if tko.code != 0:
         if tko.code != 0:
             return response.json(tko.code)
             return response.json(tko.code)
-        userID = tko.userID
-        operation = request_dict.get('operation', None)
-        print("userID",userID)
-        print('operation:', operation)
         if userID is None or operation is None:
         if userID is None or operation is None:
             return response.json(444, 'operation')
             return response.json(444, 'operation')
         if operation == 'cloudservicesum':
         if operation == 'cloudservicesum':
@@ -39,140 +36,80 @@ class Cloudsum(TemplateView):
         if operation == 'userappversion':
         if operation == 'userappversion':
             return self.userappversion(userID, response)
             return self.userappversion(userID, response)
         if operation == 'usercount':
         if operation == 'usercount':
-            return self.usercount(userID, response)
+            return self.usercount(userID, request_dict, response)
+        if operation == 'usercloud':
+            return self.usercloud(userID, response)
 
 
     # 类型:用户手机
     # 类型:用户手机
     # 统计用户手机型号  已有
     # 统计用户手机型号  已有
-    # 统计某段时间内新用户的增长数
+    # 统计某段时间内新用户的增长数
     # 统计一天用户打开zosi app的频率   已有
     # 统计一天用户打开zosi app的频率   已有
     # 统计用户下载zosi app数,卸载人数
     # 统计用户下载zosi app数,卸载人数
     # 统计用户使用zosi app的版本√
     # 统计用户使用zosi app的版本√
+
+    # 统计用户使用zosi app的版本以及使用zosi app不同版本的用户数量
     def userappversion(self, userID, response):
     def userappversion(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        version = UserExModel.objects.values_list('appBundleId').order_by('appBundleId').distinct()
-        res = App_Info.objects.filter(appBundleId__in=version).values_list('appBundleId','newAppversion')
-        return response.json(0, dict(res))
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+        res = UserExModel.objects.extra(tables=['App_Info'],
+                                        select={'appname':'App_Info.appName',
+                                                'appversion':'App_Info.newAppversion'},
+                                        where=["user_ex.appBundleId=app_Info.appBundleId"]).\
+            values('appBundleId','appname','appversion').annotate(dates=Count('appBundleId')).order_by()
+        print(res.query)
+        print(res)
+        return response.json(0, list(res))
+
+    # 统计某段时间内新用户的增长数
+    def usercount(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        # 优化代码
+        # usercountyear = request_dict.get('usercountyear', None)
+        # if usercountyear == None:
+        #     return response.json(444)
+        # usercountyear = int(usercountyear)
+        # count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"},
+        #                                   where=["data_joined between '%s-01-01' and '%s-01-01' "],
+        #                                   params=[usercountyear, usercountyear+1]).values(
+        #     'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
+        count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"},).values(
+            'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
+        print(count.query)
+        return response.json(0, list(count))
 
 
     # 类型:云存服务统计
     # 类型:云存服务统计
     # 统计开通云存的设备有多少台√
     # 统计开通云存的设备有多少台√
     # 统计未支付,支付成功的订单√
     # 统计未支付,支付成功的订单√
-    # 统计开通云存的增长率
+    # 统计开通云存的增长率    (每个月开通云存的总数)√
     # 统计已开通云存的各套餐总数√
     # 统计已开通云存的各套餐总数√
     # 统计已支付的订单总金额√
     # 统计已支付的订单总金额√
     def cloudservicesum(self, userID, response):
     def cloudservicesum(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        from django.db.models import Sum
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
         uid_cloud = UID_Bucket.objects.values('uid').distinct().count()
         uid_cloud = UID_Bucket.objects.values('uid').distinct().count()
-        pay_0 = Order_Model.objects.filter(status='0').count()
-        pay_1 = Order_Model.objects.filter(status='1').count()
-        money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        print(type(money))
-        print(money)
         cloud_sum = UID_Bucket.objects.all().count()
         cloud_sum = UID_Bucket.objects.all().count()
-        data_dict = {
-            "开通云存的设备数": uid_cloud,
-            "未支付的订单数": pay_0,
-            "已支付的订单数": pay_1,
-            "已支付的订单总金额": money['price__sum'],
-            "已开通云存的各套餐总数": cloud_sum,
-        }
-        return response.json(0, data_dict)
-
-    def usercount(self, userID, response):
-        from django.db.models import Count
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        count1 = Device_User.objects.extra(select={'year': 'year(data_joined)', 'month': 'month(data_joined)'}).values('year','month').annotate(用户合计=Count('data_joined')).order_by()
-        #print(count1)
-        return response.json(0, list(count1))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class Cloudsum_test(View):
-    def dispatch(self, requset, *args, **kwargs):
-        return super(Cloudsum_test, self).dispatch(requset, *args, **kwargs)
-
-    def get(self, request, *args, **kwargs):
-        operation = kwargs.get('operation')
-        request.encoding = 'utf-8'
-        return self.validation(request.GET, request, operation)
-
-    def post(self, request, *args, **kwargs):
-        operation = kwargs.get('operation')
-        print('operation:',operation)
-        request.encoding = 'utf-8'
-        return self.validation(request.POST, request, operation)
-
-    def validation(self, request_dict, request, operation):
-        response = ResponseObject()
-        token = request_dict.get('token', None)
-        tko = TokenObject(token)
-        response.lang = tko.lang
-        userID = tko.userID
-        print('userID:',userID)
-        if tko.code != 0:
-            return response.json(tko.code)
-        if userID is None or operation is None:
-            return response.json(444, 'operation')
-        if operation == 'cloudservicesum':
-            return self.cloudservicesum(userID, response)
-
-    def cloudservicesum(self, userID, response):
-        # own_permission = ModelService.check_perm(userID=userID, permID=30)
-        # if own_permission is not True:
-        #     return response.json(404)
-        from django.db.models import Sum
-        uid_cloud = UID_Bucket.objects.values('uid').distinct().count()
         pay_0 = Order_Model.objects.filter(status='0').count()
         pay_0 = Order_Model.objects.filter(status='0').count()
         pay_1 = Order_Model.objects.filter(status='1').count()
         pay_1 = Order_Model.objects.filter(status='1').count()
         money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
         money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        cloud_sum = UID_Bucket.objects.all().count()
         data_dict = {
         data_dict = {
             "开通云存的设备数": uid_cloud,
             "开通云存的设备数": uid_cloud,
-            "未支付的订单数": pay_0,
-            "已支付的订单数": pay_1,
-            "已支付的订单总金额": money['price__sum'],
             "已开通云存的各套餐总数": cloud_sum,
             "已开通云存的各套餐总数": cloud_sum,
-        }
-        return response.json(0, data_dict)
-
-
-
-
-
-def test(request):
-        from django.db.models import Sum
-        pay_0 = Order_Model.objects.filter(status='0').count()
-        pay_1 = Order_Model.objects.filter(status='1').count()
-        money = Order_Model.objects.filter(status='1').aggregate(Sum('price'))
-        print(pay_0)
-        print(money['price__sum'])
-        data_dict = {
             "未支付的订单数": pay_0,
             "未支付的订单数": pay_0,
             "已支付的订单数": pay_1,
             "已支付的订单数": pay_1,
             "已支付的订单总金额": money['price__sum'],
             "已支付的订单总金额": money['price__sum'],
         }
         }
-        return JsonResponse(data_dict, json_dumps_params={'ensure_ascii':False},safe=False)
-
-
-
-
-
-
+        return response.json(0, data_dict)
 
 
+    # 每个月开通云存的总数
+    def usercloud(self, userID, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+        a = Order_Model.objects.extra(select={'dates': "FROM_UNIXTIME(addTime,'%%Y-%%m')"}).values(
+            'dates').filter(status=1).annotate(开通云存合计=Count('addTime')).order_by('dates')
+        return response.json(0, list(a))

+ 51 - 5
Controller/EquipmentManager.py

@@ -363,6 +363,8 @@ def addInterface(request):
     View_Password = request_dict.get('View_Password', '')
     View_Password = request_dict.get('View_Password', '')
     Type = request_dict.get('Type', None)
     Type = request_dict.get('Type', None)
     ChannelIndex = request_dict.get('ChannelIndex', None)
     ChannelIndex = request_dict.get('ChannelIndex', None)
+    isCheckMainUser = request_dict.get('isCheckMainUser', None)
+    isMainUserExists = False
     if all([UID, NickName, View_Account, Type, ChannelIndex]):
     if all([UID, NickName, View_Account, Type, ChannelIndex]):
         tko = TokenObject(token)
         tko = TokenObject(token)
         response.lang = tko.lang
         response.lang = tko.lang
@@ -383,10 +385,10 @@ def addInterface(request):
                     asy.start()
                     asy.start()
                     return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                     return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                 pass
                 pass
-                # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
-                # # 判断是否有已绑定用户
-                # if is_bind:
-                #     return response.json(15)
+
+                pk = CommonService.getUserID(getUser=False)
+
+
 
 
                 userName = Device_User.objects.get(userID=userID).username
                 userName = Device_User.objects.get(userID=userID).username
                 main_exist = Device_Info.objects.filter(UID=UID)
                 main_exist = Device_Info.objects.filter(UID=UID)
@@ -397,7 +399,47 @@ def addInterface(request):
                     vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                     vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                     vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
                     vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
 
 
-                pk = CommonService.getUserID(getUser=False)
+                is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID')
+                # 判断是否有已绑定用户
+                isvodPrimaryUserID = ''
+
+                for forbind in is_bind:
+                    if forbind['vodPrimaryUserID'] != '':
+                        isvodPrimaryUserID = forbind['vodPrimaryUserID']
+
+                # 判断是否有已绑定用户
+                if is_bind and isCheckMainUser == '1' and isvodPrimaryUserID != userID and isvodPrimaryUserID != '':
+                    res = {
+                        'id': pk,
+                        'userID': userID,
+                        'NickName': NickName,
+                        'UID': UID,
+                        'View_Account': View_Account,
+                        'View_Password': View_Password,
+                        'ChannelIndex': ChannelIndex,
+                        'Type': Type,
+                        'isShare': False,
+                        'primaryUserID': '',
+                        'primaryMaster': '',
+                        'vodPrimaryUserID': vodPrimaryUserID,
+                        'vodPrimaryMaster': vodPrimaryMaster,
+                        'data_joined': '',
+                        'version': '',
+                        'isVod': 0,
+                        'isExist': 1,
+                        'userID__userEmail': ''
+                    }
+                    res['vod'] = [
+                        {
+                            "status": 1,
+                            "channel": ChannelIndex,
+                            "endTime": '',
+                            "bucket__content": '',
+                            "uid": UID
+                        }
+                    ]
+                    res['isMainUserExists'] = 1
+                    return response.json(0, res)
 
 
                 try:
                 try:
                     # 判断是否有用户绑定
                     # 判断是否有用户绑定
@@ -420,6 +462,8 @@ def addInterface(request):
                                              NickName=NickName, View_Account=View_Account,
                                              NickName=NickName, View_Account=View_Account,
                                              View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                                              View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                     userDevice.save()
                     userDevice.save()
+                    Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
+                                                               vodPrimaryMaster=vodPrimaryMaster)
                     # redisObj = RedisObject(db=8)
                     # redisObj = RedisObject(db=8)
                     # redisObj.del_data(key='uid_qs_' + userID)
                     # redisObj.del_data(key='uid_qs_' + userID)
                 except Exception as e:
                 except Exception as e:
@@ -437,6 +481,8 @@ def addInterface(request):
                         values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                         values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                     res = dvql[0]
                     res = dvql[0]
                     res['vod'] = list(ubqs)
                     res['vod'] = list(ubqs)
+                    if isMainUserExists:
+                        res['isMainUserExists'] = 1
                     return response.json(0, res)
                     return response.json(0, res)
 
 
 
 

+ 131 - 5
Controller/EquipmentManagerV2.py

@@ -8,7 +8,7 @@ from django.db.models import Q
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
-from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
+from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel, UidChannelSetModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
@@ -207,7 +207,133 @@ class EquipmentManagerV2(View):
 
 
     def do_query_reset(self, userID, request_dict, response):
     def do_query_reset(self, userID, request_dict, response):
         dvqs = Device_Info.objects.filter(userID_id=userID, isExist=2)
         dvqs = Device_Info.objects.filter(userID_id=userID, isExist=2)
-        dvql = dvqs.values \
-            ('id', 'NickName', 'UID', 'ChannelIndex', 'Type', 'isShare')
-        res = CommonService.qs_to_list(dvql)
-        return response.json(0, res)
+        dvql = dvqs.values('id', 'userID', 'NickName', 'UID', 'View_Account',
+                           'View_Password', 'ChannelIndex', 'Type', 'isShare',
+                           'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID', 'vodPrimaryMaster',
+                           'userID__userEmail',
+                           'version', 'isVod', 'isExist', 'NotificationMode')
+        dvls = CommonService.qs_to_list(dvql)
+        uid_list = []
+        for dvl in dvls:
+            if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
+                dvl['isPrimaryUser'] = 1
+            else:
+                dvl['isPrimaryUser'] = 0
+
+            uid_list.append(dvl['UID'])
+
+        ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
+            values('bucket__content', 'status', 'channel', 'endTime', 'uid')
+        upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
+        auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+        bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+        nowTime = int(time.time())
+        data = []
+        # 设备拓展信息表
+        us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('id', 'uid', 'version', 'nickname', 'ucode',
+                                                                    'detect_status', 'detect_group',
+                                                                    'detect_interval',
+                                                                    'region_alexa', 'is_alexa', 'deviceModel',
+                                                                    'TimeZone', 'TimeStatus', 'SpaceUsable',
+                                                                    'SpaceSum', 'MirrorType', 'RecordType',
+                                                                    'OutdoorModel', 'WIFIName', 'isDetector',
+                                                                    'DetectorRank')
+        uv_dict = {}
+        for us in us_qs:
+            uv_dict[us['uid']] = {
+                'version': us['version'],
+                'nickname': us['nickname'],
+                'ucode': us['ucode'],
+                'detect_interval': us['detect_interval'],
+                'detect_group': us['detect_group'],
+                'detect_status': us['detect_status'],
+                'region_alexa': us['region_alexa'],
+                'is_alexa': us['is_alexa'],
+                'deviceModel': us['deviceModel'],
+                'TimeZone': us['TimeZone'],
+                'TimeStatus': us['TimeStatus'],
+                'SpaceUsable': us['SpaceUsable'],
+                'SpaceSum': us['SpaceSum'],
+                'MirrorType': us['MirrorType'],
+                'RecordType': us['RecordType'],
+                'OutdoorModel': us['OutdoorModel'],
+                'WIFIName': us['WIFIName'],
+                'isDetector': us['isDetector'],
+                'DetectorRank': us['DetectorRank']
+            }
+            # 从uid_channel里面取出通道配置信息
+            ucs_qs = UidChannelSetModel.objects.filter(uid__id=us['id']).values('channel', 'pir_audio', 'mic_audio',
+                                                                                'battery_status', 'battery_level',
+                                                                                'sleep_status', 'sleep_time',
+                                                                                'light_night_model',
+                                                                                'light_alarm_type',
+                                                                                'light_alarm_level',
+                                                                                'light_alarm_man_en',
+                                                                                'light_alarm_vol',
+                                                                                'light_long_light'
+                                                                                )
+            channels = []
+            for ucs in ucs_qs:
+                channels_dict = {
+                    'channel': ucs['channel'],
+                    'pir_audio': ucs['pir_audio'],
+                    'mic_audio': ucs['mic_audio'],
+                    'battery_status': ucs['battery_status'],
+                    'battery_level': ucs['battery_level'],
+                    'sleep_status': ucs['sleep_status'],
+                    'sleep_time': ucs['sleep_time'],
+                    'light_night_model': ucs['light_night_model'],
+                    'light_alarm_type': ucs['light_alarm_type'],
+                    'light_alarm_level': ucs['light_alarm_level'],
+                    'light_alarm_man_en': ucs['light_alarm_man_en'],
+                    'light_alarm_vol': ucs['light_alarm_vol'],
+                    'light_long_light': ucs['light_long_light']
+                }
+                channels.append(channels_dict)
+            uv_dict[us['uid']]['channels'] = channels
+
+        for p in dvls:
+            p['vod'] = []
+            for dm in ubqs:
+                if p['UID'] == dm['uid']:
+                    if dm['endTime'] > nowTime:
+                        p['vod'].append(dm)
+            p['preview'] = []
+            for up in upqs:
+                if p['UID'] == up['uid']:
+                    obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
+                    img_sign = bucket.sign_url('GET', obj, 300)
+                    p['preview'].append(img_sign)
+            p_uid = p['UID']
+            if p_uid in uv_dict:
+                # 设备版本号
+                p['uid_version'] = uv_dict[p_uid]['version']
+                p['ucode'] = uv_dict[p_uid]['ucode']
+                p['detect_interval'] = uv_dict[p_uid]['detect_interval']
+                p['detect_status'] = uv_dict[p_uid]['detect_status']
+                p['detect_group'] = uv_dict[p_uid]['detect_group']
+                p['region_alexa'] = uv_dict[p_uid]['region_alexa']
+                p['is_alexa'] = uv_dict[p_uid]['is_alexa']
+                p['deviceModel'] = uv_dict[p_uid]['deviceModel']
+                p['TimeZone'] = uv_dict[p_uid]['TimeZone']
+                p['TimeStatus'] = uv_dict[p_uid]['TimeStatus']
+                p['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']
+                p['SpaceSum'] = uv_dict[p_uid]['SpaceSum']
+                p['MirrorType'] = uv_dict[p_uid]['MirrorType']
+                p['RecordType'] = uv_dict[p_uid]['RecordType']
+                p['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']
+                p['WIFIName'] = uv_dict[p_uid]['WIFIName']
+                p['isDetector'] = uv_dict[p_uid]['isDetector']
+                p['DetectorRank'] = uv_dict[p_uid]['DetectorRank']
+                p['channels'] = uv_dict[p_uid]['channels']
+                # 设备昵称 调用影子信息昵称,先阶段不可
+                if uv_dict[p_uid]['nickname']:
+                    p['NickName'] = uv_dict[p_uid]['nickname']
+            else:
+                # 设备版本号
+                p['uid_version'] = ''
+                p['ucode'] = ''
+            data.append(p)
+        result = data
+
+        return response.json(0, result)

+ 59 - 10
Controller/EquipmentManagerV3.py

@@ -67,7 +67,8 @@ class EquipmentManagerV3(View):
         View_Password = self.decode_pwd(View_Password)
         View_Password = self.decode_pwd(View_Password)
         Type = request_dict.get('Type', None)
         Type = request_dict.get('Type', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
-
+        isCheckMainUser = request_dict.get('isCheckMainUser', None)
+        isMainUserExists = False
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
             tko = TokenObject(token)
             tko = TokenObject(token)
             response.lang = tko.lang
             response.lang = tko.lang
@@ -87,10 +88,11 @@ class EquipmentManagerV3(View):
                                                args=(CommonService.get_ip_address(request), userID, 'addV3'))
                                                args=(CommonService.get_ip_address(request), userID, 'addV3'))
                         asy.start()
                         asy.start()
                         return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                         return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
-                    # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
-                    # # 判断是否有已绑定用户
-                    # if is_bind:
-                    #     return response.json(15)
+
+                    pk = CommonService.getUserID(getUser=False)
+
+
+
 
 
                     userName = Device_User.objects.get(userID=userID).username
                     userName = Device_User.objects.get(userID=userID).username
                     main_exist = Device_Info.objects.filter(UID=UID)
                     main_exist = Device_Info.objects.filter(UID=UID)
@@ -101,7 +103,46 @@ class EquipmentManagerV3(View):
                         vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                         vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
                         vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
                         vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
 
 
-                    pk = CommonService.getUserID(getUser=False)
+                    is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'vodPrimaryUserID')
+                    isvodPrimaryUserID = ''
+
+                    for forbind in is_bind:
+                        if forbind['vodPrimaryUserID'] != '':
+                            isvodPrimaryUserID = forbind['vodPrimaryUserID']
+
+                    # 判断是否有已绑定用户
+                    if is_bind and isCheckMainUser == '1' and isvodPrimaryUserID != userID and isvodPrimaryUserID != '':
+                        res = {
+                            'id': pk,
+                            'userID': userID,
+                            'NickName': NickName,
+                            'UID': UID,
+                            'View_Account': View_Account,
+                            'View_Password': View_Password,
+                            'ChannelIndex': ChannelIndex,
+                            'Type': Type,
+                            'isShare': False,
+                            'primaryUserID': '',
+                            'primaryMaster': '',
+                            'vodPrimaryUserID': vodPrimaryUserID,
+                            'vodPrimaryMaster': vodPrimaryMaster,
+                            'data_joined': '',
+                            'version': '',
+                            'isVod': 0,
+                            'isExist': 1,
+                            'userID__userEmail': ''
+                        }
+                        res['vod'] = [
+                            {
+                                "status": 1,
+                                "channel": ChannelIndex,
+                                "endTime": '',
+                                "bucket__content": '',
+                                "uid": UID
+                            }
+                        ]
+                        res['isMainUserExists'] = 1
+                        return response.json(0, res)
 
 
                     try:
                     try:
                         # 判断是否有用户绑定
                         # 判断是否有用户绑定
@@ -125,6 +166,8 @@ class EquipmentManagerV3(View):
                                                  View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
                                                  View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
                                                  vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                                                  vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                         userDevice.save()
                         userDevice.save()
+                        Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
+                                                                       vodPrimaryMaster=vodPrimaryMaster)
 
 
                         if not us_qs.exists():
                         if not us_qs.exists():
                             us_qs = UidSetModel.objects.filter(uid=UID)
                             us_qs = UidSetModel.objects.filter(uid=UID)
@@ -152,6 +195,7 @@ class EquipmentManagerV3(View):
                             values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                             values('bucket__content', 'status', 'channel', 'endTime', 'uid')
                         res = dvql[0]
                         res = dvql[0]
                         res['vod'] = list(ubqs)
                         res['vod'] = list(ubqs)
+
                         return response.json(0, res)
                         return response.json(0, res)
 
 
                 else:
                 else:
@@ -593,7 +637,12 @@ class EquipmentManagerV3(View):
         return password
         return password
 
 
     def do_mainUserDevice(self, request_dict, response):
     def do_mainUserDevice(self, request_dict, response):
-        vodPrimaryUserID = request_dict.get('vodPrimaryUserID')
-        qs = Device_User.objects.filter(userID=vodPrimaryUserID).values('NickName', 'username', 'userEmail', 'phone')
-        dvql = CommonService.qs_to_list(qs)
-        return response.json(0, dvql)
+        UID = request_dict.get('UID')
+        dvq = Device_Info.objects.filter(UID=UID)
+        dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
+        qs = {}
+        if dvq.exists():
+            qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']).values('userID', 'NickName', 'username', 'userEmail', 'phone')
+            qs = CommonService.qs_to_list(qs)
+
+        return response.json(0, qs)

+ 11 - 12
Controller/MealManage.py

@@ -127,9 +127,11 @@ class MealManage(View):
         line = int(request_dict.get('line', None))
         line = int(request_dict.get('line', None))
         if page is None or line is None:
         if page is None or line is None:
             return response.json(444)
             return response.json(444)
+
         qs = Store_Meal.objects.values("id", "title", "price", "content", "day", "add_time", "update_time", "currency"
         qs = Store_Meal.objects.values("id", "title", "price", "content", "day", "add_time", "update_time", "currency"
-                                       , "bucket_id", "bucket__bucket", "bucket__area", "commodity_type", "commodity_code",
-                                       "bucket__storeDay", "virtual_price", "is_discounts", "discount_price", "discount_content", "expire", "symbol")
+                                       , "bucket_id", "commodity_type", "commodity_code", "virtual_price", "is_discounts"
+                                       , "discount_price", "discount_content", "expire", "symbol"
+                                       , "bucket__bucket", "bucket__area", "bucket__storeDay")
         res = {}
         res = {}
         if qs.exists():
         if qs.exists():
             ql = list(qs)
             ql = list(qs)
@@ -137,16 +139,13 @@ class MealManage(View):
             from itertools import groupby
             from itertools import groupby
             ql.sort(key=itemgetter('bucket__area'))
             ql.sort(key=itemgetter('bucket__area'))
             ql=CommonService.qs_to_list(ql[(page - 1) * line:page * line])
             ql=CommonService.qs_to_list(ql[(page - 1) * line:page * line])
-            for area, items in groupby(ql, key=itemgetter('bucket__area')):
-                items_list = list(items)
-                for key, val in enumerate(items_list):
-                    pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id", "payment")
-                    items_list[key]['pay_type'] = list(pay_types)
-
-
-                res['count'] = len(ql)
-                res['data'] = items_list
-
+            # for area, items in groupby(ql, key=itemgetter('bucket__area')):
+            items_list = list(ql)
+            for key, val in enumerate(items_list):
+                pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id", "payment")
+                items_list[key]['pay_type'] = list(pay_types)
+        res['count'] = len(ql)
+        res['data'] = items_list
         return response.json(0, res)
         return response.json(0, res)
 
 
     def update(self, request_dict, userID, response):
     def update(self, request_dict, userID, response):

+ 16 - 15
Controller/VoicePromptController.py

@@ -145,14 +145,18 @@ class VoicePromptView(View):
                 uid = voice_qs[0].uid
                 uid = voice_qs[0].uid
                 device_qs = Device_Info.objects.filter(UID=uid, userID=userID)
                 device_qs = Device_Info.objects.filter(UID=uid, userID=userID)
                 if device_qs.exists():
                 if device_qs.exists():
+                    channel = voice_qs[0].channel
+                    filename = voice_qs[0].filename
                     voice_qs.delete()
                     voice_qs.delete()
-                    # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                    # bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
-                    # obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=voice_qs[0].channel) + voice_qs[0].filename
-                    # bucket.delete_object(obj)
+                    auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                    bucket = oss2.Bucket(auth, 'http://oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
+                    obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=channel) + filename
+                    bucket.delete_object(obj)
                     return response.json(0)
                     return response.json(0)
                 else:
                 else:
                     return response.json(404)
                     return response.json(404)
+            else:
+                return response.json(173)
         else:
         else:
             return response.json(444)
             return response.json(444)
 
 
@@ -172,14 +176,16 @@ class VoicePromptView(View):
                 'voice_status': 0,
                 'voice_status': 0,
                 'voice_mute': 0
                 'voice_mute': 0
             }
             }
+            enter_voice_id = 0
+            leave_voice_id = 0
             if channel_qs.exists():
             if channel_qs.exists():
                 channel_qs = channel_qs.values('voice_prompt_enter', 'voice_prompt_leave', 'voice_prompt_status',
                 channel_qs = channel_qs.values('voice_prompt_enter', 'voice_prompt_leave', 'voice_prompt_status',
                                                'voice_prompt_intelligent_mute', 'voice_start_x', 'voice_start_y',
                                                'voice_prompt_intelligent_mute', 'voice_start_x', 'voice_start_y',
                                                'voice_end_x', 'voice_end_y', 'voice_start_time', 'voice_end_time',
                                                'voice_end_x', 'voice_end_y', 'voice_start_time', 'voice_end_time',
                                                'voice_repeat_day', 'voice_direction')
                                                'voice_repeat_day', 'voice_direction')
                 print(channel_qs)
                 print(channel_qs)
-                res['enter_voice'] = int(channel_qs[0]['voice_prompt_enter'])
-                res['leave_voice'] = int(channel_qs[0]['voice_prompt_leave'])
+                enter_voice_id = int(channel_qs[0]['voice_prompt_enter'])
+                leave_voice_id = int(channel_qs[0]['voice_prompt_leave'])
                 res['voice_status'] = channel_qs[0]['voice_prompt_status']
                 res['voice_status'] = channel_qs[0]['voice_prompt_status']
                 res['voice_mute'] = channel_qs[0]['voice_prompt_intelligent_mute']
                 res['voice_mute'] = channel_qs[0]['voice_prompt_intelligent_mute']
                 res['start_x'] = channel_qs[0]['voice_start_x']
                 res['start_x'] = channel_qs[0]['voice_start_x']
@@ -210,12 +216,12 @@ class VoicePromptView(View):
                     del system['filename']
                     del system['filename']
                     if system['type'] == 0:
                     if system['type'] == 0:
                         enter_systems.append(system)
                         enter_systems.append(system)
-                        if res['enter_voice'] == system['id']:
+                        if enter_voice_id == system['id']:
                             res['enter_voice'] = system
                             res['enter_voice'] = system
 
 
                     elif system['type'] == 1:
                     elif system['type'] == 1:
                         leave_systems.append(system)
                         leave_systems.append(system)
-                        if res['leave_voice'] == system['id']:
+                        if leave_voice_id == system['id']:
                             res['leave_voice'] = system
                             res['leave_voice'] = system
 
 
             if voice_qs.exists():
             if voice_qs.exists():
@@ -229,18 +235,13 @@ class VoicePromptView(View):
                     del voice['filename']
                     del voice['filename']
                     if voice['type'] == 0:
                     if voice['type'] == 0:
                         enter_customs.append(voice)
                         enter_customs.append(voice)
-                        if res['enter_voice'] == voice['id']:
+                        if enter_voice_id == voice['id']:
                             res['enter_voice'] = voice
                             res['enter_voice'] = voice
                     elif voice['type'] == 1:
                     elif voice['type'] == 1:
                         leave_customs.append(voice)
                         leave_customs.append(voice)
-                        if res['leave_voice'] == voice['id']:
+                        if leave_voice_id == voice['id']:
                             res['leave_voice'] = voice
                             res['leave_voice'] = voice
 
 
-            if res['leave_voice'] == 0:
-                res['leave_voice'] = {}
-            if res['enter_voice'] == 0:
-                res['enter_voice'] = {}
-
             res['system']['enter'] = enter_systems
             res['system']['enter'] = enter_systems
             res['system']['leave'] = leave_systems
             res['system']['leave'] = leave_systems
             res['custom']['enter'] = enter_customs
             res['custom']['enter'] = enter_customs

+ 4 - 4
Model/models.py

@@ -772,12 +772,12 @@ class UidChannelSetModel(models.Model):
     voice_prompt_leave = models.IntegerField(default=0, verbose_name='离开铃声id')
     voice_prompt_leave = models.IntegerField(default=0, verbose_name='离开铃声id')
     voice_prompt_intelligent_mute = models.SmallIntegerField(default=0, verbose_name='智能静音。0:关闭,1:开启')
     voice_prompt_intelligent_mute = models.SmallIntegerField(default=0, verbose_name='智能静音。0:关闭,1:开启')
     voice_start_x = models.FloatField(default=0, verbose_name='起始坐标的x')
     voice_start_x = models.FloatField(default=0, verbose_name='起始坐标的x')
-    voice_start_y = models.FloatField(default=0, verbose_name='起始坐标的y')
-    voice_end_x = models.FloatField(default=0, verbose_name='结束坐标的x')
-    voice_end_y = models.FloatField(default=0, verbose_name='结束坐标的y')
+    voice_start_y = models.FloatField(default=18, verbose_name='起始坐标的y')
+    voice_end_x = models.FloatField(default=44, verbose_name='结束坐标的x')
+    voice_end_y = models.FloatField(default=18, verbose_name='结束坐标的y')
     voice_start_time = models.IntegerField(default=0, verbose_name='语音执行的起始时间')
     voice_start_time = models.IntegerField(default=0, verbose_name='语音执行的起始时间')
     voice_end_time = models.IntegerField(default=0, verbose_name='语音执行的结束时间')
     voice_end_time = models.IntegerField(default=0, verbose_name='语音执行的结束时间')
-    voice_repeat_day = models.IntegerField(default=0, verbose_name='语音执行的日期,周几')
+    voice_repeat_day = models.IntegerField(default=127, verbose_name='语音执行的日期,周几')
     voice_direction = models.IntegerField(default=0, verbose_name='语音方向。')
     voice_direction = models.IntegerField(default=0, verbose_name='语音方向。')
 
 
     class Meta:
     class Meta:

+ 4 - 0
Object/ResponseObject.py

@@ -92,6 +92,8 @@ class ResponseObject(object):
             10036: 'Non device primary users cannot exchange for cloud storage',
             10036: 'Non device primary users cannot exchange for cloud storage',
             10037: 'Non device primary user cannot transfer device',
             10037: 'Non device primary user cannot transfer device',
             10038: 'Non device primary user cannot transfer packages',
             10038: 'Non device primary user cannot transfer packages',
+            10039: 'Activation code has been used',
+            10040: 'Invalid activation code'
         }
         }
         data_cn = {
         data_cn = {
             0: '成功',
             0: '成功',
@@ -178,6 +180,8 @@ class ResponseObject(object):
             10036: '非设备主用户无法兑换云存',
             10036: '非设备主用户无法兑换云存',
             10037: '非设备主用户无法转移设备',
             10037: '非设备主用户无法转移设备',
             10038: '非设备主用户无法转移套餐',
             10038: '非设备主用户无法转移套餐',
+            10039: '激活码已被使用过',
+            10040: '无效激活码'
         }
         }
         if self.lang == 'cn':
         if self.lang == 'cn':
             msg = data_cn
             msg = data_cn

+ 3 - 2
Object/WechatPayObject.py

@@ -23,7 +23,7 @@ class WechatPayObject:
         self.error = None
         self.error = None
         self.params = None
         self.params = None
 
 
-    def get_parameter(self, order_id, body, total_fee, spbill_create_ip, notify_url):
+    def get_parameter(self, order_id, body, total_fee, spbill_create_ip, notify_url, attach):
         self.params = {
         self.params = {
             'appid': self.APPID,  # appid
             'appid': self.APPID,  # appid
             'mch_id': self.MCHID,  # 商户号
             'mch_id': self.MCHID,  # 商户号
@@ -34,7 +34,8 @@ class WechatPayObject:
             'spbill_create_ip': spbill_create_ip,  # 127.0.0.1
             'spbill_create_ip': spbill_create_ip,  # 127.0.0.1
             'trade_type': self.TRADE_TYPE,  # 交易类型
             'trade_type': self.TRADE_TYPE,  # 交易类型
             'notify_url': notify_url,  # 微信支付结果异步通知地址
             'notify_url': notify_url,  # 微信支付结果异步通知地址
-            'receipt': 'Y'
+            'receipt': 'Y',
+            'attach' : attach
         }
         }
         return self.params
         return self.params