|
@@ -30,13 +30,16 @@ from aliyunsdkcore import client
|
|
|
from aliyunsdksts.request.v20150401 import AssumeRoleRequest
|
|
|
from boto3.session import Session
|
|
|
from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
|
|
|
+from django.db import transaction
|
|
|
from django.views.generic.base import View
|
|
|
+import jwt
|
|
|
from pyfcm import FCMNotification
|
|
|
|
|
|
from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
|
|
|
- SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, JPUSH_CONFIG
|
|
|
+ SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, \
|
|
|
+ JPUSH_CONFIG, FCM_CONFIG, OAUTH_ACCESS_TOKEN_SECRET
|
|
|
from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
|
|
|
- ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel
|
|
|
+ ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, Unused_Uid_Meal
|
|
|
from Object.AliPayObject import AliPayObject
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
from Object.TokenObject import TokenObject
|
|
@@ -44,7 +47,7 @@ from Object.UidTokenObject import UidTokenObject
|
|
|
from Service.CommonService import CommonService
|
|
|
from Object.m3u8generate import PlaylistGenerator
|
|
|
from Object.WechatPayObject import WechatPayObject
|
|
|
-from django.db.models import Q
|
|
|
+from django.db.models import Q, F
|
|
|
|
|
|
from Service.ModelService import ModelService
|
|
|
|
|
@@ -94,6 +97,9 @@ class CloudStorageView(View):
|
|
|
elif operation == 'getsignsts':
|
|
|
ip = CommonService.get_ip_address(request)
|
|
|
return self.do_get_sign_sts(request_dict, ip, response)
|
|
|
+ elif operation == 'testgetsignsts':
|
|
|
+ ip = CommonService.get_ip_address(request)
|
|
|
+ return self.do_test_get_sign_sts(request_dict, ip, response)
|
|
|
# return self.do_get_sign_sts_test(request_dict, ip, response)
|
|
|
elif operation == 'storeplaylist':
|
|
|
return self.do_store_playlist(request_dict, response)
|
|
@@ -202,14 +208,15 @@ class CloudStorageView(View):
|
|
|
def do_commodity_list(self, request_dict, userID, response):
|
|
|
mold = request_dict.get('mold', None)
|
|
|
uid = request_dict.get('uid', None)
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
qs = Store_Meal.objects
|
|
|
eq = ExperienceContextModel.objects.filter(uid=uid, experience_type=0).values('id')
|
|
|
# userqs = Device_User.objects.filter(userID=userID).values('is_experience')
|
|
|
|
|
|
if mold:
|
|
|
- qs = qs.filter(bucket__mold=mold)
|
|
|
+ qs = qs.filter(bucket__mold=mold,lang__lang=lang)
|
|
|
else:
|
|
|
- qs = qs.all()
|
|
|
+ qs = qs.filter(lang__lang=lang)
|
|
|
|
|
|
if eq:
|
|
|
qs = qs.filter(~Q(pay_type='10'))
|
|
@@ -217,6 +224,7 @@ class CloudStorageView(View):
|
|
|
qs = qs.filter(pay_type='10')
|
|
|
|
|
|
qs = qs.filter(~Q(pay_type='11')) # 过滤不显示激活码套餐
|
|
|
+ qs = qs.annotate(title=F('lang__title'),content=F('lang__content'),discount_content=F('lang__discount_content'))
|
|
|
qs = qs.values("id", "title", "content", "price", "day", "currency", "bucket__storeDay",
|
|
|
"bucket__bucket", "bucket__area", "commodity_code",
|
|
|
"commodity_type", "is_discounts", "virtual_price", "expire",
|
|
@@ -250,6 +258,7 @@ class CloudStorageView(View):
|
|
|
|
|
|
def do_sign_play_m3u8(self, request_dict, response):
|
|
|
uid = request_dict.get('uid', None)
|
|
|
+ uid = jwt.decode(uid, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
|
|
|
channel = request_dict.get('channel', None)
|
|
|
storeTime = request_dict.get('time', None)
|
|
|
now_time = int(time.time())
|
|
@@ -343,7 +352,7 @@ class CloudStorageView(View):
|
|
|
sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
values("addTime", "data")
|
|
|
if sts_qs.exists():
|
|
|
- endTime = int(sts_qs[0]["addTime"]) + 3500
|
|
|
+ endTime = int(sts_qs[0]["addTime"]) + 800
|
|
|
if endTime > now_time:
|
|
|
print(endTime)
|
|
|
print(now_time)
|
|
@@ -384,7 +393,95 @@ class CloudStorageView(View):
|
|
|
response = boto3_sts.get_federation_token(
|
|
|
Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
|
|
|
Policy=json.dumps(Policy),
|
|
|
- DurationSeconds=7200
|
|
|
+ DurationSeconds=900
|
|
|
+ )
|
|
|
+ ##############
|
|
|
+ res = {
|
|
|
+ 'AccessKeyId': response['Credentials']['AccessKeyId'],
|
|
|
+ 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
|
|
|
+ 'SessionToken': response['Credentials']['SessionToken'],
|
|
|
+ 'Expiration': response['Credentials']['Expiration'],
|
|
|
+ 'expire': 900,
|
|
|
+ 'endpoint': endpoint,
|
|
|
+ 'bucket_name': bucket_name,
|
|
|
+ 'arn': response['FederatedUser']['Arn'],
|
|
|
+ 'code': 0,
|
|
|
+ 'storage': storage,
|
|
|
+ 'endTime': ubqs[0]['endTime'],
|
|
|
+ 'ip': ip,
|
|
|
+ 'region': region_id,
|
|
|
+ 'bucket_mold':ubqs[0]['bucket__mold']
|
|
|
+ }
|
|
|
+ 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!'}
|
|
|
+ return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
+
|
|
|
+ def do_test_get_sign_sts(self, request_dict, ip, response):
|
|
|
+ uidToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJYS1daU0M1RkNKWVQxOUI3MTExQSIsImNoYW5uZWwiOjF9.YvBCETPrKknw7B-RU3Mij-WJLKf46KGrDQvZMMN7dQk'
|
|
|
+ reset = request_dict.get('reset', 0)
|
|
|
+ utko = UidTokenObject(uidToken)
|
|
|
+ if utko.flag is False:
|
|
|
+ return response.json(444, 'uidToken')
|
|
|
+ uid = utko.UID
|
|
|
+ channel = utko.channel
|
|
|
+ now_time = int(time.time())
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
|
|
|
+ values("bucket__mold", "bucket__bucket", "bucket__endpoint",
|
|
|
+ "bucket__region", "endTime").order_by('addTime')[:1]
|
|
|
+ if ubqs.exists():
|
|
|
+ # 亚马逊 s3 sts
|
|
|
+ sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
+ values("addTime", "data")
|
|
|
+ if sts_qs.exists():
|
|
|
+ endTime = int(sts_qs[0]["addTime"]) + 800
|
|
|
+ if reset == '0' and endTime > now_time:
|
|
|
+ print(endTime)
|
|
|
+ print(now_time)
|
|
|
+ res = json.loads(sts_qs[0]["data"])
|
|
|
+ return JsonResponse(status=200, data=res)
|
|
|
+ # 套餐id
|
|
|
+ storage = '{uid}/test/'.format(uid=uid)
|
|
|
+ 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")
|
|
|
+
|
|
|
+ ###############
|
|
|
+ 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=900
|
|
|
)
|
|
|
##############
|
|
|
res = {
|
|
@@ -392,7 +489,7 @@ class CloudStorageView(View):
|
|
|
'AccessKeySecret': response['Credentials']['SecretAccessKey'],
|
|
|
'SessionToken': response['Credentials']['SessionToken'],
|
|
|
'Expiration': response['Credentials']['Expiration'],
|
|
|
- 'expire': '3600',
|
|
|
+ 'expire': 900,
|
|
|
'endpoint': endpoint,
|
|
|
'bucket_name': bucket_name,
|
|
|
'arn': response['FederatedUser']['Arn'],
|
|
@@ -400,6 +497,8 @@ class CloudStorageView(View):
|
|
|
'storage': storage,
|
|
|
'endTime': ubqs[0]['endTime'],
|
|
|
'ip': ip,
|
|
|
+ 'region': region_id,
|
|
|
+ 'bucket_mold':ubqs[0]['bucket__mold']
|
|
|
}
|
|
|
if sts_qs.exists():
|
|
|
sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
|
|
@@ -461,7 +560,7 @@ class CloudStorageView(View):
|
|
|
)
|
|
|
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'])
|
|
|
+ format(server_domain=SERVER_DOMAIN, uid=TokenObject().encryption(data={'uid': uid}), channel=channel, time=vod['time'])
|
|
|
ts_num = int(vod['fg']) & 0xf
|
|
|
vod_play_list.append({
|
|
|
'name': vod['time'],
|
|
@@ -536,7 +635,7 @@ class CloudStorageView(View):
|
|
|
.values('vodPrimaryUserID')
|
|
|
if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
return response.json(12)
|
|
|
- ubqs = UID_Bucket.objects.filter(channel=channel, uid=uid).order_by('addTime')
|
|
|
+ ubqs = UID_Bucket.objects.filter(channel=channel, uid=uid)
|
|
|
if not ubqs.exists():
|
|
|
return response.json(10030)
|
|
|
now_time = int(time.time())
|
|
@@ -635,13 +734,27 @@ class CloudStorageView(View):
|
|
|
def do_pay_ok(self, request_dict):
|
|
|
response = HttpResponse()
|
|
|
paytype = request_dict.get('paytype', None)
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
+
|
|
|
showtitle = "支付成功"
|
|
|
- if paytype == "10":
|
|
|
+ if paytype == "10" :
|
|
|
showtitle = "成功体验云存"
|
|
|
|
|
|
if paytype == "11":
|
|
|
showtitle = "兑换成功"
|
|
|
+
|
|
|
+ wancheng = '完成'
|
|
|
+ if lang != 'cn':
|
|
|
+ showtitle = "Payment successful"
|
|
|
+ if paytype == "10":
|
|
|
+ showtitle = "Successful experience of cloud storage"
|
|
|
+
|
|
|
+ if paytype == "11":
|
|
|
+ showtitle = "Successful exchange"
|
|
|
+
|
|
|
+ wancheng = 'complete'
|
|
|
response.content = '''
|
|
|
+
|
|
|
<html>
|
|
|
<head>
|
|
|
<!--浏览器不缓存-->
|
|
@@ -705,7 +818,7 @@ class CloudStorageView(View):
|
|
|
</div>
|
|
|
<center class="bottom">
|
|
|
<div class="bottom_div" onclick="payOKButton()">
|
|
|
- 完成
|
|
|
+ '''+wancheng+'''
|
|
|
</div>
|
|
|
</center>
|
|
|
<script src="//hm.baidu.com/hm.js?eaa57ca47dacb4ad4f5a257001a3457c"></script><script> // 点击付款成功按钮
|
|
@@ -722,11 +835,9 @@ class CloudStorageView(View):
|
|
|
return response
|
|
|
|
|
|
def do_pay_by_ali_callback(self, request):
|
|
|
-
|
|
|
response = ResponseObject()
|
|
|
data = request.POST.dict()
|
|
|
- logger = logging.getLogger('log')
|
|
|
-
|
|
|
+ # logger = logging.getLogger('log')
|
|
|
try:
|
|
|
passback_params = data["passback_params"]
|
|
|
parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
|
|
@@ -752,52 +863,64 @@ class CloudStorageView(View):
|
|
|
UID = order_list[0]['UID']
|
|
|
channel = order_list[0]['channel']
|
|
|
rank = order_list[0]['rank']
|
|
|
+
|
|
|
smqs = Store_Meal.objects.filter(id=rank). \
|
|
|
values("day", "bucket_id", "bucket__storeDay", "expire")
|
|
|
bucketId = smqs[0]['bucket_id']
|
|
|
-
|
|
|
if not smqs.exists():
|
|
|
return response.json(173)
|
|
|
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
|
|
|
+ "endTime", "use_status")
|
|
|
expire = smqs[0]['expire']
|
|
|
-
|
|
|
if order_list[0]['isSelectDiscounts'] == 1:
|
|
|
expire = smqs[0]['expire'] * 2
|
|
|
- if ubqs.exists():
|
|
|
- ubq = ubqs[0]
|
|
|
- endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
-
|
|
|
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
- endTime=endTime, updateTime=nowTime)
|
|
|
- logger.info('5')
|
|
|
- uid_bucket_id = ubq['id']
|
|
|
- else:
|
|
|
- endTime = CommonService.calcMonthLater(expire)
|
|
|
- ub_cqs = UID_Bucket.objects.create \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
- updateTime=nowTime)
|
|
|
- uid_bucket_id = ub_cqs.id
|
|
|
-
|
|
|
- dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
- if dvq.exists():
|
|
|
- dvq_set_update_dict = {
|
|
|
- 'vodPrimaryUserID': userid,
|
|
|
- 'vodPrimaryMaster': username
|
|
|
- }
|
|
|
- dvq.update(**dvq_set_update_dict)
|
|
|
-
|
|
|
- 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)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
+ with transaction.atomic():
|
|
|
+ if ubqs.exists():
|
|
|
+ ubq = ubqs[0]
|
|
|
+ if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId: #套餐使用中并且相同套餐叠加过期时间
|
|
|
+ endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
+ endTime=endTime, updateTime=nowTime)
|
|
|
+ else: #已过期或者不相同的套餐加入未使用的关联套餐表
|
|
|
+ has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
|
|
|
+ nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
|
|
|
+ if has_unused.exists():
|
|
|
+ Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
|
|
|
+ else:
|
|
|
+ Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
|
|
|
+ expire=smqs[0]['expire'],bucket_id=bucketId)
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
|
|
|
+ uid_bucket_id = ubq['id']
|
|
|
+ else:
|
|
|
+ endTime = CommonService.calcMonthLater(expire)
|
|
|
+ ub_cqs = UID_Bucket.objects.create \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
+ updateTime=nowTime,use_status=1)
|
|
|
+ uid_bucket_id = ub_cqs.id
|
|
|
+
|
|
|
+ dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
+ if dvq.exists():
|
|
|
+ dvq_set_update_dict = {
|
|
|
+ 'vodPrimaryUserID': userid,
|
|
|
+ 'vodPrimaryMaster': username
|
|
|
+ }
|
|
|
+ dvq.update(**dvq_set_update_dict)
|
|
|
+
|
|
|
+ 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)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ return HttpResponseRedirect(red_url)
|
|
|
return response.json(0, signature)
|
|
|
except Exception as e:
|
|
|
if order_qs:
|
|
|
order_qs.update(status=10)
|
|
|
red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
return HttpResponseRedirect(red_url)
|
|
|
|
|
|
def do_pay_by_paypal_callback(self, request_dict, response):
|
|
@@ -805,12 +928,13 @@ class CloudStorageView(View):
|
|
|
PayerID = request_dict.get('PayerID', None)
|
|
|
orderID = request_dict.get('orderID', None)
|
|
|
lang = request_dict.get('lang', None)
|
|
|
-
|
|
|
try:
|
|
|
order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
|
|
|
|
|
|
if not orderID:
|
|
|
red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
return HttpResponseRedirect(red_url)
|
|
|
# else:
|
|
|
# order_qs.update(status=9)
|
|
@@ -821,6 +945,8 @@ class CloudStorageView(View):
|
|
|
print(payres)
|
|
|
if not payres:
|
|
|
red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
return HttpResponseRedirect(red_url)
|
|
|
print("Payment execute successfully")
|
|
|
|
|
@@ -839,54 +965,69 @@ class CloudStorageView(View):
|
|
|
if not smqs.exists():
|
|
|
return response.json(173)
|
|
|
# ##
|
|
|
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
|
|
|
+ "endTime", "use_status")
|
|
|
expire = smqs[0]['expire']
|
|
|
+
|
|
|
if order_list[0]['isSelectDiscounts'] == 1:
|
|
|
expire = smqs[0]['expire'] * 2
|
|
|
- if ubqs.exists():
|
|
|
- ubq = ubqs[0]
|
|
|
- endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
- endTime=endTime, updateTime=nowTime)
|
|
|
- uid_bucket_id = ubq['id']
|
|
|
- else:
|
|
|
- endTime = CommonService.calcMonthLater(expire)
|
|
|
- ub_cqs = UID_Bucket.objects.create \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
|
|
|
- uid_bucket_id = ub_cqs.id
|
|
|
-
|
|
|
- dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
- if dvq.exists():
|
|
|
- dvq_set_update_dict = {
|
|
|
- 'vodPrimaryUserID': userid,
|
|
|
- 'vodPrimaryMaster': username
|
|
|
- }
|
|
|
- dvq.update(**dvq_set_update_dict)
|
|
|
- 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)
|
|
|
+ with transaction.atomic():
|
|
|
+ if ubqs.exists():
|
|
|
+ ubq = ubqs[0]
|
|
|
+ if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId: #套餐使用中并且相同套餐叠加过期时间
|
|
|
+ endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
+ endTime=endTime, updateTime=nowTime)
|
|
|
+ else: #已过期或者不相同的套餐加入未使用的关联套餐表
|
|
|
+ has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
|
|
|
+ nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
|
|
|
+ if has_unused.exists():
|
|
|
+ Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
|
|
|
+ else:
|
|
|
+ Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
|
|
|
+ expire=smqs[0]['expire'],bucket_id=bucketId)
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
|
|
|
+ uid_bucket_id = ubq['id']
|
|
|
+ else:
|
|
|
+ endTime = CommonService.calcMonthLater(expire)
|
|
|
+ ub_cqs = UID_Bucket.objects.create \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
+ updateTime=nowTime,use_status=1)
|
|
|
+ uid_bucket_id = ub_cqs.id
|
|
|
|
|
|
- # return response.json(0)
|
|
|
- red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
+ dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
+ if dvq.exists():
|
|
|
+ dvq_set_update_dict = {
|
|
|
+ 'vodPrimaryUserID': userid,
|
|
|
+ 'vodPrimaryMaster': username
|
|
|
+ }
|
|
|
+ dvq.update(**dvq_set_update_dict)
|
|
|
+ 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)
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+
|
|
|
+ return HttpResponseRedirect(red_url)
|
|
|
except Exception as e:
|
|
|
print(repr(e))
|
|
|
if order_qs:
|
|
|
order_qs.update(status=10)
|
|
|
-
|
|
|
red_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ red_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
return HttpResponseRedirect(red_url)
|
|
|
|
|
|
def do_pay_by_wechat_callback(self, request, response):
|
|
|
|
|
|
logger = logging.getLogger('log')
|
|
|
-
|
|
|
try:
|
|
|
pay = WechatPayObject()
|
|
|
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"]
|
|
@@ -916,45 +1057,53 @@ class CloudStorageView(View):
|
|
|
if not smqs.exists():
|
|
|
return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '套餐不存在'}))
|
|
|
# ##
|
|
|
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay",
|
|
|
+ "bucket__region", "endTime", "use_status")
|
|
|
expire = smqs[0]['expire']
|
|
|
if order_list[0]['isSelectDiscounts'] == 1:
|
|
|
expire = smqs[0]['expire'] * 2
|
|
|
- if ubqs.exists():
|
|
|
- ubq = ubqs[0]
|
|
|
- endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
- endTime=endTime, updateTime=nowTime)
|
|
|
- uid_bucket_id = ubq['id']
|
|
|
- else:
|
|
|
- endTime = CommonService.calcMonthLater(expire)
|
|
|
- ub_cqs = UID_Bucket.objects.create \
|
|
|
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
- updateTime=nowTime)
|
|
|
- uid_bucket_id = ub_cqs.id
|
|
|
-
|
|
|
- dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
- if dvq.exists():
|
|
|
- dvq_set_update_dict = {
|
|
|
- 'vodPrimaryUserID': userid,
|
|
|
- 'vodPrimaryMaster': username
|
|
|
- }
|
|
|
- dvq.update(**dvq_set_update_dict)
|
|
|
- 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'}))
|
|
|
-
|
|
|
+ with transaction.atomic():
|
|
|
+ if ubqs.exists():
|
|
|
+ ubq = ubqs[0]
|
|
|
+ if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId: #套餐使用中并且相同套餐叠加过期时间
|
|
|
+ endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId,
|
|
|
+ endTime=endTime, updateTime=nowTime)
|
|
|
+ else: #已过期或者不相同的套餐加入未使用的关联套餐表
|
|
|
+ has_unused = Unused_Uid_Meal.objects.filter(uid=UID, bucket_id=bucketId).values("id")
|
|
|
+ nums = 2 if order_list[0]['isSelectDiscounts'] == 1 else 1
|
|
|
+ if has_unused.exists():
|
|
|
+ Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
|
|
|
+ else:
|
|
|
+ Unused_Uid_Meal.objects.create(uid=UID,channel=channel,addTime=nowTime,num=nums,
|
|
|
+ expire=smqs[0]['expire'],bucket_id=bucketId)
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
|
|
|
+ uid_bucket_id = ubq['id']
|
|
|
+ else:
|
|
|
+ endTime = CommonService.calcMonthLater(expire)
|
|
|
+ ub_cqs = UID_Bucket.objects.create \
|
|
|
+ (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
+ updateTime=nowTime,use_status=1)
|
|
|
+ uid_bucket_id = ub_cqs.id
|
|
|
+
|
|
|
+ dvq = Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
+ if dvq.exists():
|
|
|
+ dvq_set_update_dict = {
|
|
|
+ 'vodPrimaryUserID': userid,
|
|
|
+ 'vodPrimaryMaster': username
|
|
|
+ }
|
|
|
+ dvq.update(**dvq_set_update_dict)
|
|
|
+ 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'}))
|
|
|
else:
|
|
|
order_qs.update(status=10)
|
|
|
return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '参数格式校验错误'}))
|
|
|
-
|
|
|
except Exception as e:
|
|
|
if order_qs:
|
|
|
order_qs.update(status=10)
|
|
|
-
|
|
|
return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
|
|
|
|
|
|
def do_create_pay_order(self, request_dict, userID, ip, response):
|
|
@@ -986,9 +1135,9 @@ class CloudStorageView(View):
|
|
|
|
|
|
# if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
# return response.json(10033)
|
|
|
- smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type). \
|
|
|
- values('currency', 'price', 'content', 'day',
|
|
|
- 'commodity_type', 'title', 'content',
|
|
|
+ smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang). \
|
|
|
+ values('currency', 'price', 'lang__content', 'day',
|
|
|
+ 'commodity_type', 'lang__title',
|
|
|
'expire', 'commodity_code', 'discount_price')
|
|
|
if not smqs.exists():
|
|
|
return response.json(173)
|
|
@@ -996,7 +1145,7 @@ class CloudStorageView(View):
|
|
|
price = smqs[0]['price']
|
|
|
if is_select_discount == '1':
|
|
|
price = float(smqs[0]['price']) + float(smqs[0]['discount_price'])
|
|
|
- content = smqs[0]['content']
|
|
|
+ content = smqs[0]['lang__content']
|
|
|
day = smqs[0]['day']
|
|
|
commodity_code = smqs[0]['commodity_code']
|
|
|
commodity_type = smqs[0]['commodity_type']
|
|
@@ -1009,11 +1158,15 @@ class CloudStorageView(View):
|
|
|
|
|
|
orderID = CommonService.createOrderID()
|
|
|
if pay_type == 1:
|
|
|
+
|
|
|
+ cal_url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ if lang != 'cn':
|
|
|
+ cal_url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
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 = cal_url
|
|
|
paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
payment = paypalrestsdk.Payment({
|
|
|
"intent": "sale",
|
|
@@ -1046,7 +1199,7 @@ class CloudStorageView(View):
|
|
|
try:
|
|
|
aliPayObj = AliPayObject()
|
|
|
alipay = aliPayObj.conf()
|
|
|
- subject = smqs[0]['title'] + smqs[0]['content']
|
|
|
+ subject = smqs[0]['lang__title'] + smqs[0]['lang__content']
|
|
|
# biz_content = {
|
|
|
# "subject": subject,
|
|
|
# "out_trade_no": orderID,
|
|
@@ -1124,7 +1277,7 @@ class CloudStorageView(View):
|
|
|
pay_type = int(request_dict.get('pay_type', None))
|
|
|
rank = request_dict.get('rank', None)
|
|
|
cdk = request_dict.get('cdk', None)
|
|
|
-
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
if cdk != None and pay_type == 11:
|
|
|
cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
|
|
|
if not cdk_qs.exists():
|
|
@@ -1152,63 +1305,86 @@ class CloudStorageView(View):
|
|
|
|
|
|
orderID = CommonService.createOrderID()
|
|
|
nowTime = int(time.time())
|
|
|
- smqs = Store_Meal.objects.filter(id=rank). \
|
|
|
- values("day", "bucket_id", "bucket__storeDay", "expire", 'content', 'price', 'currency', 'commodity_type')
|
|
|
+ smqs = Store_Meal.objects.filter(id=rank,lang__lang=lang). \
|
|
|
+ values("day", "bucket_id", "bucket__storeDay", "expire", 'lang__content', 'price', 'currency', 'commodity_type')
|
|
|
if not smqs.exists():
|
|
|
return response.json(173)
|
|
|
bucketId = smqs[0]['bucket_id']
|
|
|
# ##
|
|
|
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=uid, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
|
|
|
+ "endTime", "use_status")
|
|
|
expire = smqs[0]['expire']
|
|
|
- if ubqs.exists():
|
|
|
- ubq = ubqs[0]
|
|
|
- endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
- (uid=uid, channel=channel, bucket_id=bucketId,
|
|
|
- endTime=endTime, updateTime=nowTime)
|
|
|
- uid_bucket_id = ubq['id']
|
|
|
- else:
|
|
|
- endTime = CommonService.calcMonthLater(expire)
|
|
|
- ub_cqs = UID_Bucket.objects.create \
|
|
|
- (uid=uid, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
|
|
|
- uid_bucket_id = ub_cqs.id
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
- desc=smqs[0]['content'], payType=pay_type, payTime=nowTime,
|
|
|
- price=smqs[0]['price'], currency=smqs[0]['currency'], addTime=nowTime,
|
|
|
- updTime=nowTime,
|
|
|
- pay_url="体验版",
|
|
|
- commodity_code=commodity_code, commodity_type=smqs[0]['commodity_type'],
|
|
|
- rank_id=rank, status=1, uid_bucket_id=uid_bucket_id)
|
|
|
-
|
|
|
- duq = Device_User.objects.filter(userID=userID).values('username')
|
|
|
- dvq = Device_Info.objects.filter(UID=uid, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
- if dvq.exists():
|
|
|
- dvq_set_update_dict = {
|
|
|
- 'vodPrimaryUserID': userID,
|
|
|
- 'vodPrimaryMaster': duq[0]['username']
|
|
|
- }
|
|
|
- dvq.update(**dvq_set_update_dict)
|
|
|
-
|
|
|
- # return response.json(0)
|
|
|
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- if pay_type == 10:
|
|
|
- ExperienceContextModel.objects.create(
|
|
|
- experience_type=0,
|
|
|
- uid=uid,
|
|
|
- do_time=nowTime
|
|
|
- )
|
|
|
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=10".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ try:
|
|
|
+ with transaction.atomic():
|
|
|
+ if ubqs.exists():
|
|
|
+ ubq = ubqs[0]
|
|
|
+ if ubq['use_status'] == 1 and ubq['bucket_id'] == bucketId: #套餐使用中并且相同套餐叠加过期时间
|
|
|
+ endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update \
|
|
|
+ (uid=uid, channel=channel, bucket_id=bucketId,
|
|
|
+ endTime=endTime, updateTime=nowTime)
|
|
|
+ else: #已过期或者不相同的套餐加入未使用的关联套餐表
|
|
|
+ has_unused = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucketId).values("id")
|
|
|
+ nums = 1
|
|
|
+ if has_unused.exists():
|
|
|
+ Unused_Uid_Meal.objects.filter(id=has_unused[0]['id']).update(num=F('num') + nums)
|
|
|
+ else:
|
|
|
+ Unused_Uid_Meal.objects.create(uid=uid,channel=channel,addTime=nowTime,num=nums,
|
|
|
+ expire=smqs[0]['expire'],bucket_id=bucketId)
|
|
|
+ UID_Bucket.objects.filter(id=ubq['id']).update(has_unused=1)
|
|
|
+ uid_bucket_id = ubq['id']
|
|
|
+ else:
|
|
|
+ endTime = CommonService.calcMonthLater(expire)
|
|
|
+ ub_cqs = UID_Bucket.objects.create \
|
|
|
+ (uid=uid, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime,
|
|
|
+ updateTime=nowTime,use_status=1)
|
|
|
+ uid_bucket_id = ub_cqs.id
|
|
|
+ Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
+ desc=smqs[0]['lang__content'], payType=pay_type, payTime=nowTime,
|
|
|
+ price=smqs[0]['price'], currency=smqs[0]['currency'], addTime=nowTime,
|
|
|
+ updTime=nowTime,
|
|
|
+ pay_url="体验版",
|
|
|
+ commodity_code=commodity_code, commodity_type=smqs[0]['commodity_type'],
|
|
|
+ rank_id=rank, status=1, uid_bucket_id=uid_bucket_id)
|
|
|
+
|
|
|
+ duq = Device_User.objects.filter(userID=userID).values('username')
|
|
|
+ dvq = Device_Info.objects.filter(UID=uid, vodPrimaryUserID='', vodPrimaryMaster='')
|
|
|
+
|
|
|
|
|
|
- if pay_type == 11:
|
|
|
- update_dict = {}
|
|
|
- update_dict['is_activate'] = 1
|
|
|
- update_dict['order'] = orderID
|
|
|
- CDKcontextModel.objects.filter(cdk=cdk).update(**update_dict)
|
|
|
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=11".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
|
|
|
- result = returnurl
|
|
|
- return response.json(0, result)
|
|
|
+ if dvq.exists():
|
|
|
+ dvq_set_update_dict = {
|
|
|
+ 'vodPrimaryUserID': userID,
|
|
|
+ 'vodPrimaryMaster': duq[0]['username']
|
|
|
+ }
|
|
|
+ dvq.update(**dvq_set_update_dict)
|
|
|
+
|
|
|
+ sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
|
|
|
+ # return response.json(0)
|
|
|
+ returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?lang={lang}".format(SERVER_DOMAIN=SERVER_DOMAIN,lang=lang)
|
|
|
+ if pay_type == 10:
|
|
|
+ ExperienceContextModel.objects.create(
|
|
|
+ experience_type=0,
|
|
|
+ uid=uid,
|
|
|
+ do_time=nowTime
|
|
|
+ )
|
|
|
+ returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=10&lang={lang}".format(SERVER_DOMAIN=SERVER_DOMAIN,lang=lang)
|
|
|
+ sys_msg_text_list = ['成功体验云存', 'Successful experience of cloud storage']
|
|
|
+
|
|
|
+ if pay_type == 11:
|
|
|
+ update_dict = {}
|
|
|
+ update_dict['is_activate'] = 1
|
|
|
+ update_dict['order'] = orderID
|
|
|
+ CDKcontextModel.objects.filter(cdk=cdk).update(**update_dict)
|
|
|
+ returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=11&lang={lang}".format(SERVER_DOMAIN=SERVER_DOMAIN,lang=lang)
|
|
|
+ sys_msg_text_list = ['成功兑换云存', 'Successful exchange of cloud storage']
|
|
|
+
|
|
|
+
|
|
|
+ self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list)
|
|
|
+ result = returnurl
|
|
|
+ return response.json(0, result)
|
|
|
+ except Exception:
|
|
|
+ return response.json(474)
|
|
|
# red_url =
|
|
|
# return JsonResponse(status=200, data={'red_url': red_url})
|
|
|
|
|
@@ -1255,21 +1431,47 @@ class CloudStorageView(View):
|
|
|
# 设备关联套餐列表
|
|
|
def device_commodity(self, request_dict, userID, response):
|
|
|
uid = request_dict.get('uid', None)
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1) \
|
|
|
.values('vodPrimaryUserID')
|
|
|
if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
return response.json(12)
|
|
|
now_time = int(time.time())
|
|
|
- uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time).values("id", "uid", "endTime",
|
|
|
- "bucket__content").order_by(
|
|
|
- 'addTime')
|
|
|
- if not uid_bucket.exists():
|
|
|
+ bucket_id_list = []
|
|
|
+ store_list = []
|
|
|
+ uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time).values("id", "uid","bucket__content",
|
|
|
+ "use_status","endTime","has_unused","bucket__id")
|
|
|
+ if not uid_bucket:
|
|
|
return response.json(10030)
|
|
|
- for index, value in enumerate(uid_bucket):
|
|
|
- value['is_use'] = 0
|
|
|
- if index == 0:
|
|
|
- value['is_use'] = 1
|
|
|
- return response.json(0, list(uid_bucket))
|
|
|
+ uid_bucket[0]['storage'] = 0
|
|
|
+ has_unused = uid_bucket[0]['has_unused']
|
|
|
+ del uid_bucket[0]['has_unused']
|
|
|
+ store_list.append(uid_bucket[0])
|
|
|
+ bucket_id_list.append(uid_bucket[0]['bucket__id'])
|
|
|
+ if has_unused == 1:
|
|
|
+ unuseds = Unused_Uid_Meal.objects.filter(uid=uid).annotate(unused_id=F('id')) \
|
|
|
+ .values("unused_id","uid","bucket__content","num","bucket__id","expire")
|
|
|
+ for ub in unuseds:
|
|
|
+ storage_time = ub['num'] * ub['expire']
|
|
|
+ storage = "{storage_time}个月".format(storage_time=storage_time)
|
|
|
+ unused_dict = {
|
|
|
+ "id":ub['unused_id'],
|
|
|
+ "uid":ub['uid'],
|
|
|
+ "bucket__content":ub['bucket__content'],
|
|
|
+ "use_status":0,
|
|
|
+ "endTime":0,
|
|
|
+ "bucket__id":ub['bucket__id'],
|
|
|
+ "storage":storage,
|
|
|
+ }
|
|
|
+ store_list.append(unused_dict)
|
|
|
+ bucket_id_list.append(ub['bucket__id'])
|
|
|
+ smqs = Store_Meal.objects.filter(bucket__id__in=bucket_id_list, lang__lang=lang).values('lang__lang','bucket__id','lang__title')
|
|
|
+ for index, value in enumerate(store_list):
|
|
|
+ for sm in smqs:
|
|
|
+ if value['bucket__id'] == sm['bucket__id']:
|
|
|
+ value['bucket__content'] = sm['lang__title']
|
|
|
+
|
|
|
+ return response.json(0, list(store_list))
|
|
|
|
|
|
# 提前使用设备关联套餐
|
|
|
def switch_device_commodity(self, request_dict, userID, response):
|
|
@@ -1278,22 +1480,29 @@ class CloudStorageView(View):
|
|
|
.values('vodPrimaryUserID')
|
|
|
if not dv_qs.exists() or dv_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
return response.json(12)
|
|
|
- switch_commodity_id = request_dict.get('switch_commodity_id', None)
|
|
|
- if switch_commodity_id:
|
|
|
+ unused_id = request_dict.get('switch_commodity_id', None)
|
|
|
+ if unused_id:
|
|
|
# 切换设备套餐关联
|
|
|
- using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
|
|
|
- "endTime","bucket__content","addTime").order_by('addTime')
|
|
|
- if not using_uid_bucket.exists():
|
|
|
+ using_uid_bucket = UID_Bucket.objects.filter(uid=uid,has_unused=1).values("id", "uid", "endTime",
|
|
|
+ "bucket__content","addTime")
|
|
|
+ unuseds = Unused_Uid_Meal.objects.filter(id=unused_id).values("id","uid","channel","addTime","expire",
|
|
|
+ "num","bucket_id")
|
|
|
+ if not unuseds.exists() or not using_uid_bucket.exists():
|
|
|
return response.json(10030)
|
|
|
- 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)
|
|
|
-
|
|
|
- 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() # 删除播放列表
|
|
|
- StsCrdModel.objects.filter(uid=uid).delete() # 删除sts记录
|
|
|
+ unused = unuseds[0]
|
|
|
+ nowTime = int(time.time())
|
|
|
+ try:
|
|
|
+ with transaction.atomic():
|
|
|
+ count_unused = Unused_Uid_Meal.objects.filter(uid=uid).count()
|
|
|
+ has_unused = 1 if count_unused>1 else 0
|
|
|
+ endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
|
|
|
+ UID_Bucket.objects.filter(uid=uid).update(channel=unused['channel'],endTime=endTime,bucket_id=unused['bucket_id']
|
|
|
+ ,updateTime=nowTime,use_status=1, has_unused=has_unused)
|
|
|
+ Unused_Uid_Meal.objects.filter(id=unused_id).delete()
|
|
|
+ StsCrdModel.objects.filter(uid=uid).delete() # 删除sts记录
|
|
|
+ VodHlsModel.objects.filter(uid=uid).delete() # 删除播放列表,后期数据量多时应该考虑延后删除
|
|
|
+ except Exception:
|
|
|
+ return response.json(474)
|
|
|
return response.json(0)
|
|
|
return response.json(444)
|
|
|
|
|
@@ -1318,7 +1527,7 @@ class CloudStorageView(View):
|
|
|
except Exception as e:
|
|
|
return repr(e)
|
|
|
# 云存到期续费提醒 提前1天
|
|
|
- def do_vod_msg_end(self):
|
|
|
+ def do_vod_msg_end(self, request_dict):
|
|
|
response = ResponseObject()
|
|
|
now_time = int(time.time())
|
|
|
|
|
@@ -1390,19 +1599,7 @@ class CloudStorageView(View):
|
|
|
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',
|
|
|
- }
|
|
|
+ package_title_config = FCM_CONFIG[appBundleId]
|
|
|
if appBundleId in package_title_config.keys():
|
|
|
msg_title = package_title_config[appBundleId] + '(' + nickname + ')'
|
|
|
else:
|
|
@@ -1447,17 +1644,6 @@ class CloudStorageView(View):
|
|
|
|
|
|
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'
|
|
@@ -1528,11 +1714,38 @@ def deleteVodHls(request):
|
|
|
return response.json(0)
|
|
|
|
|
|
|
|
|
-# 删除过期云存关联套餐
|
|
|
-def deleteExpiredUidBucket(request):
|
|
|
+# 更新过期云存关联套餐
|
|
|
+def updateExpiredUidBucket(request):
|
|
|
response = ResponseObject()
|
|
|
now_time = int(time.time())
|
|
|
expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
|
|
|
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)).update(use_status=2) # 更新过期云存关联套餐状态
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+# 如果云存关联套餐过期,更新未使用的关联套餐
|
|
|
+def updateUnusedUidBucket(request):
|
|
|
+ response = ResponseObject()
|
|
|
+ now_time = int(time.time())
|
|
|
+ expired_uid_buckets = UID_Bucket.objects.filter(endTime__lte=now_time,has_unused=1).values("id","uid")[0:1000]
|
|
|
+ for expired_uid_bucket in expired_uid_buckets:
|
|
|
+ unuseds = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).values("id","uid","channel","addTime","expire",
|
|
|
+ "num","bucket_id","userID_id").order_by('addTime')[0:1]
|
|
|
+ if not unuseds.exists():
|
|
|
+ continue
|
|
|
+ unused = unuseds[0]
|
|
|
+ try:
|
|
|
+ with transaction.atomic():
|
|
|
+ count_unused = Unused_Uid_Meal.objects.filter(uid=expired_uid_bucket['uid']).count()
|
|
|
+ has_unused = 1 if count_unused>1 else 0
|
|
|
+ endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
|
|
|
+ UID_Bucket.objects.filter(uid=expired_uid_bucket['uid']).update(channel=unused['channel'],endTime=endTime,bucket_id=unused['bucket_id']
|
|
|
+ ,updateTime=now_time,use_status=1,userID_id=unused['userID_id'],
|
|
|
+ has_unused=has_unused)
|
|
|
+ Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
|
|
|
+ StsCrdModel.objects.filter(uid=expired_uid_bucket['uid']).delete() # 删除sts记录
|
|
|
+ VodHlsModel.objects.filter(uid=expired_uid_bucket['uid']).delete() # 删除播放列表,后期数据量多时应该考虑延后删除
|
|
|
+ except Exception:
|
|
|
+ continue
|
|
|
+ # UID_Bucket.objects.filter(id__in=list(id_list)).update(use_status=2) # 更新过期云存关联套餐状态
|
|
|
return response.json(0)
|