AiController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2018/12/5 9:30
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: cloudstorage.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import base64
  15. import json
  16. import os
  17. import time
  18. import urllib
  19. from urllib.parse import quote, parse_qs, unquote
  20. import apns2
  21. import boto3
  22. import jpush
  23. import oss2
  24. import paypalrestsdk
  25. import threading
  26. import calendar
  27. import datetime
  28. import logging
  29. import sys
  30. from aliyunsdkcore import client
  31. from aliyunsdksts.request.v20150401 import AssumeRoleRequest
  32. from boto3.session import Session
  33. from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
  34. from django.db import transaction
  35. from django.views.generic.base import View
  36. import jwt
  37. from pyfcm import FCMNotification
  38. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
  39. SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, \
  40. JPUSH_CONFIG, FCM_CONFIG, OAUTH_ACCESS_TOKEN_SECRET
  41. from Controller.CheckUserData import DataValid
  42. from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
  43. ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, \
  44. Unused_Uid_Meal, UIDMainUser, UserModel, PromotionRuleModel, VideoPlaybackTimeModel, CloudLogModel, CouponModel, AiStoreMeal, AiService
  45. from Object.AWS.S3Email import S3Email
  46. from Object.AliPayObject import AliPayObject
  47. from Object.AliSmsObject import AliSmsObject
  48. from Object.RedisObject import RedisObject
  49. from Object.ResponseObject import ResponseObject
  50. from Object.TokenObject import TokenObject
  51. from Object.UidTokenObject import UidTokenObject
  52. from Service.CommonService import CommonService
  53. from Object.m3u8generate import PlaylistGenerator
  54. from Object.WechatPayObject import WechatPayObject
  55. from django.db.models import Q, F, Count
  56. from Controller.PaymentCycle import Paypal
  57. from decimal import Decimal
  58. from Ansjer.config import SERVER_TYPE
  59. from Service.ModelService import ModelService
  60. # AI服务
  61. class AiView(View):
  62. def get(self, request, *args, **kwargs):
  63. request.encoding = 'utf-8'
  64. operation = kwargs.get('operation')
  65. return self.validation(request.GET, request, operation)
  66. def post(self, request, *args, **kwargs):
  67. request.encoding = 'utf-8'
  68. operation = kwargs.get('operation')
  69. return self.validation(request.POST, request, operation)
  70. def validation(self, request_dict, request, operation):
  71. response = ResponseObject()
  72. if operation is None:
  73. return response.json(444, 'error path')
  74. elif operation == 'dopaypalcallback': # paypal支付回调
  75. return self.do_pay_by_paypal_callback(request_dict, response)
  76. else:
  77. token = request_dict.get('token', None)
  78. # 设备主键uid
  79. tko = TokenObject(token)
  80. response.lang = tko.lang
  81. if tko.code != 0:
  82. return response.json(tko.code)
  83. userID = tko.userID
  84. if operation == 'createpayorder': # 创建支付订单
  85. ip = CommonService.get_ip_address(request)
  86. return self.do_create_pay_order(request_dict, userID, ip, response)
  87. elif operation == 'changeaistatus': # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
  88. return self.do_change_ai_status(userID, request_dict, response)
  89. elif operation == 'commoditylist': # 修改云存状态,传送两个url,即getsignsts接口和storeplaylist接口
  90. return self.do_commodity_list(userID, request_dict, response)
  91. else:
  92. return response.json(414)
  93. def do_change_ai_status(self, userID, request_dict, response):
  94. token_val = request_dict.get('token_val', None)
  95. appBundleId = request_dict.get('appBundleId', None)
  96. app_type = request_dict.get('app_type', None)
  97. push_type = request_dict.get('push_type', None)
  98. status = request_dict.get('status', None)
  99. m_code = request_dict.get('m_code', None)
  100. uid = request_dict.get('uid', None)
  101. # 设备语言
  102. lang = request_dict.get('lang', 'en')
  103. tz = request_dict.get('tz', '0')
  104. # 消息提醒功能新增
  105. # 如果传空上来,就默认为0
  106. if tz == '':
  107. tz = 0
  108. else:
  109. tz = tz.replace("GMT", "")
  110. detect_group = request_dict.get('detect_group', None)
  111. interval = request_dict.get('interval', None)
  112. if not status:
  113. return response.json(444, 'status')
  114. # 关闭推送
  115. if not all([appBundleId, app_type, token_val, uid, m_code]):
  116. return response.json(444, 'appBundleId,app_type,token_val,uid,m_code')
  117. # 判断推送类型对应key是否存在
  118. print('push_type:', push_type)
  119. if push_type == '0':
  120. if appBundleId not in APNS_CONFIG.keys():
  121. return response.json(904)
  122. elif push_type == '1':
  123. if appBundleId not in FCM_CONFIG.keys():
  124. return response.json(904)
  125. elif push_type == '2':
  126. if appBundleId not in JPUSH_CONFIG.keys():
  127. return response.json(904)
  128. else:
  129. return response.json(173)
  130. dvqs = Device_Info.objects.filter(userID_id=userID, UID=uid)
  131. status = int(status)
  132. # 获取用户区域
  133. # ip = self.ip
  134. # ipInfo = CommonService.getIpIpInfo(ip=ip, lang='EN')
  135. # area = ipInfo['country_name']
  136. # if area == 'China':
  137. # DETECT_PUSH_DOMAIN = 'cn.push.dvema.com'
  138. # else:
  139. # DETECT_PUSH_DOMAIN = 'en.push.dvema.com'
  140. nowTime = int(time.time())
  141. if dvqs.exists():
  142. # 修改状态
  143. dvqs.update(NotificationMode=status)
  144. uid_set_qs = UidSetModel.objects.filter(uid=uid)
  145. # uid配置信息是否存在
  146. if uid_set_qs.exists():
  147. uid_set_id = uid_set_qs[0].id
  148. qs_data = {
  149. 'detect_status': status,
  150. 'updTime': nowTime,
  151. }
  152. if interval:
  153. qs_data['detect_interval'] = int(interval)
  154. if detect_group:
  155. qs_data['detect_group'] = detect_group
  156. print(qs_data)
  157. uid_set_qs.update(**qs_data)
  158. else:
  159. qs_data = {
  160. 'uid': uid,
  161. 'addTime': nowTime,
  162. 'updTime': nowTime,
  163. 'detect_status': status,
  164. }
  165. if interval:
  166. qs_data['detect_interval'] = int(interval)
  167. if detect_group:
  168. qs_data['detect_group'] = detect_group
  169. # 添加设备配置
  170. uid_set_qs = UidSetModel.objects.create(**qs_data)
  171. uid_set_id = uid_set_qs.id
  172. if status == 0:
  173. UidPushModel.objects.filter(uid_set__uid=uid).delete()
  174. # 状态为0的时候删除redis缓存数据
  175. self.do_delete_redis(uid)
  176. return response.json(0)
  177. elif status == 1:
  178. uid_push_qs = UidPushModel.objects.filter(userID_id=userID, m_code=m_code, uid_set__uid=uid)
  179. if uid_push_qs.exists():
  180. uid_push_update_dict = {
  181. 'appBundleId': appBundleId,
  182. 'app_type': app_type,
  183. 'push_type': push_type,
  184. 'token_val': token_val,
  185. 'updTime': nowTime,
  186. 'lang': lang,
  187. 'tz': tz
  188. }
  189. uid_push_qs.update(**uid_push_update_dict)
  190. else:
  191. # uid_set_id = uid_set_qs[0].id
  192. uid_push_create_dict = {
  193. 'uid_set_id': uid_set_id,
  194. 'userID_id': userID,
  195. 'appBundleId': appBundleId,
  196. 'app_type': app_type,
  197. 'push_type': push_type,
  198. 'token_val': token_val,
  199. 'm_code': m_code,
  200. 'addTime': nowTime,
  201. 'updTime': nowTime,
  202. 'lang': lang,
  203. 'tz': tz
  204. }
  205. # 绑定设备推送
  206. UidPushModel.objects.create(**uid_push_create_dict)
  207. if interval:
  208. self.do_delete_redis(uid, int(interval))
  209. else:
  210. self.do_delete_redis(uid)
  211. # utko = UidTokenObject()
  212. # # right
  213. # utko.generate(data={'uid': uid})
  214. etkObj = ETkObject(etk='')
  215. etk = etkObj.encrypt(uid)
  216. detectUrl = "{DETECT_PUSH_DOMAIN}notify/push?etk={etk}". \
  217. format(etk=etk, DETECT_PUSH_DOMAIN=DETECT_PUSH_DOMAIN)
  218. return response.json(0, {'detectUrl': detectUrl})
  219. else:
  220. return response.json(14)
  221. def do_commodity_list(self, userID, request_dict, response): # 查询套餐列表
  222. uid = request_dict.get('uid', None)
  223. lang = request_dict.get('lang', 'en')
  224. nowTime = int(time.time())
  225. # DVR/NVR设备暂不返回云存套餐列表
  226. device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
  227. if device_info_qs.exists():
  228. return response.json(0)
  229. qs = AiStoreMeal.objects
  230. qs = qs.filter(is_show=1) #过滤隐藏套餐
  231. qs = qs.annotate(ai_meal_id=F('id'))
  232. qs = qs.values("ai_meal_id", "title", "content", "price", "effective_day", "currency",
  233. "virtual_price", "symbol", "pay_type")
  234. if qs.exists():
  235. res = list(qs)
  236. for key, val in enumerate(res):
  237. pay_types = Pay_Type.objects.filter(aistoremeal=res[key]['ai_meal_id']).values("id", "payment")
  238. res[key]['pay_type'] = list(pay_types)
  239. result = {
  240. 'meals': res,
  241. }
  242. return response.json(0, result)
  243. else:
  244. return response.json(0)
  245. def do_create_pay_order(self, request_dict, userID, ip, response):
  246. uid = request_dict.get('uid', None)
  247. channel = request_dict.get('channel', None)
  248. pay_type = int(request_dict.get('pay_type', 1))
  249. ai_meal_id = request_dict.get('ai_meal_id', None)
  250. lang = request_dict.get('lang', 'en')
  251. if not uid or not channel or not pay_type or not ai_meal_id:
  252. return response.json(444)
  253. # dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values(
  254. # 'vodPrimaryUserID',
  255. # 'vodPrimaryMaster')
  256. # if not dv_qs.exists():
  257. # return response.json(12)
  258. # dvq = Device_Info.objects.filter(UID=uid)
  259. # dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
  260. # if dvq.exists():
  261. # if dvq[0]['vodPrimaryUserID'] != userID:
  262. # return response.json(10033)
  263. nowTime = int(time.time())
  264. smqs = AiStoreMeal.objects.filter(id=ai_meal_id, pay_type=pay_type, is_show=1). \
  265. values('currency', 'price', 'content', 'effective_day', 'title')
  266. if not smqs.exists():
  267. return response.json(173)
  268. currency = smqs[0]['currency']
  269. price = smqs[0]['price']
  270. content = smqs[0]['content']
  271. day = smqs[0]['effective_day']
  272. orderID = CommonService.createOrderID()
  273. price = float(price)
  274. price = round(price, 2)
  275. if pay_type == 1:
  276. #正常扣款
  277. cal_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
  278. if lang != 'cn':
  279. cal_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
  280. call_sub_url = "{SERVER_DOMAIN_SSL}cloudstorage/dopaypalcallback?orderID={orderID}&lang={lang}". \
  281. format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL, orderID=orderID, lang=lang)
  282. # call_sub_url = "http://binbin.uicp.vip/cloudstorage/dopaypalcallback?orderID={orderID}".format(
  283. # SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL, orderID=orderID)
  284. Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
  285. desc=content, payType=pay_type, payTime=nowTime,
  286. price=price, currency=currency, addTime=nowTime, updTime=nowTime,
  287. pay_url='', commodity_code='', commodity_type=1,
  288. ai_rank_id=ai_meal_id, rank_id=1, order_type=1)
  289. has = AiService.objects.filter(uid=uid, channel=channel, use_status=1)
  290. if has.exists():
  291. use_status = 0
  292. else:
  293. use_status = 1
  294. # return response.json(0)
  295. AiService.objects.create(orders_id=orderID, uid=uid, channel=channel, status=0,
  296. endTime=nowTime+(day*86400), addTime=nowTime, updateTime=nowTime,
  297. use_status=use_status, detect_type='1')
  298. return response.json(0, {"orderID": orderID})
  299. return response.json(10, 'generate_order_false')