IcloudManagementController.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. from django.db.models import F, Q, Sum
  5. from django.views.generic.base import View
  6. from Model.models import Lang, ICloudStoreMeal, AiService, Order_Model, Device_User, CountryModel, UidSetModel, \
  7. Device_Info, VodBucketModel, IcloudUseDetails, IcloudService, IcloudStorageRecord
  8. from Object.AWS.AmazonS3Util import AmazonS3Util
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. from Service.CommonService import CommonService
  12. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN, AWS_ACCESS_KEY_ID, \
  13. AWS_SECRET_ACCESS_KEY, SERVER_DOMAIN_SSL, OAUTH_ACCESS_TOKEN_SECRET
  14. class IcloudServeView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. return self.validation(request.GET, request, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.POST, request, operation)
  23. def validation(self, request_dict, request, operation):
  24. language = request_dict.get('language', 'en')
  25. response = ResponseObject(language, 'pc')
  26. if operation == 'xxx': # 不认证token接口
  27. pass
  28. else:
  29. tko = TokenObject(
  30. request.META.get('HTTP_AUTHORIZATION'),
  31. returntpye='pc')
  32. if tko.code != 0:
  33. return response.json(tko.code)
  34. response.lang = tko.lang
  35. user_id = tko.userID
  36. # icloud套餐信息相关
  37. if operation == 'getIcloudStoreMealList':
  38. return self.get_icloud_store_meal_list(request_dict, response)
  39. elif operation == 'addOrEditIcloudStoreMeal':
  40. return self.add_or_edit_icloud_store_meal(request_dict, response)
  41. elif operation == 'getBucket':
  42. return self.get_bucket(request_dict, response)
  43. elif operation == 'deleteMeal':
  44. return self.delete_meal(request_dict, response)
  45. # icloud套餐语言相关
  46. elif operation == 'getMealLang':
  47. return self.get_meal_lang(request_dict, response)
  48. elif operation == 'addOrEditLang':
  49. return self.add_or_edit_lang(request_dict, response)
  50. elif operation == 'deleteLang':
  51. return self.delete_lang(request_dict, response)
  52. # 用户云盘信息
  53. elif operation == 'getUserIcloudInfo':
  54. return self.get_user_icloud_info(request_dict, response)
  55. elif operation == 'resetIcloud':
  56. return self.reset_icloud(request_dict, response)
  57. # 云盘订单信息
  58. elif operation == 'getIcloudOrder':
  59. return self.get_icloud_order(request_dict, response)
  60. else:
  61. return response.json(404)
  62. @staticmethod
  63. def get_icloud_store_meal_list(request_dict, response):
  64. is_select = request_dict.get('isSelect', None)
  65. page = request_dict.get('pageNo', None)
  66. line = request_dict.get('pageSize', None)
  67. if is_select:
  68. # 获取套餐ID作为选项
  69. icloud_meal_qs = ICloudStoreMeal.objects.filter().values('id')
  70. return response.json(0, {'list': CommonService.qs_to_list(icloud_meal_qs)})
  71. if not all([page, line]):
  72. return response.json(444)
  73. page = int(page)
  74. line = int(line)
  75. try:
  76. icloud_meal_qs = ICloudStoreMeal.objects.values()
  77. total = icloud_meal_qs.count()
  78. icloud_meals = icloud_meal_qs[(page - 1) * line:page * line]
  79. icloud_meal_list = []
  80. for icloud_meal in icloud_meals:
  81. # 获取支付方式列表
  82. pay_type_list = list(
  83. ICloudStoreMeal.objects.filter(id=icloud_meal['id']).values('pay_type__id', 'pay_type__payment'))
  84. # 获取存储桶信息
  85. vod_bucket_qs = VodBucketModel.objects.filter(id=icloud_meal['bucket_id']).values('bucket')
  86. if not vod_bucket_qs.exists():
  87. return response.json(173)
  88. # 组织响应数据
  89. icloud_meal_list.append({
  90. 'IcloudMealID': icloud_meal['id'],
  91. 'price': icloud_meal['price'],
  92. 'symbol': icloud_meal['symbol'],
  93. 'currency': icloud_meal['currency'],
  94. 'is_show': icloud_meal['is_show'],
  95. 'is_delete': icloud_meal['is_delete'],
  96. 'expire': icloud_meal['expire'],
  97. 'pay_type': pay_type_list,
  98. 'size': icloud_meal['size'],
  99. 'bucket': vod_bucket_qs[0]['bucket'],
  100. 'addTime': icloud_meal['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  101. 'updTime': icloud_meal['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  102. })
  103. return response.json(0, {'list': icloud_meal_list, 'total': total})
  104. except Exception as e:
  105. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  106. @staticmethod
  107. def add_or_edit_icloud_store_meal(request_dict, response):
  108. # 添加/编辑套餐
  109. meal_id = request_dict.get('IcloudMealID', None)
  110. expire = int(request_dict.get('expire', None))
  111. price = request_dict.get('price', None)
  112. currency = request_dict.get('currency', None)
  113. symbol = request_dict.get('symbol', None)
  114. pay_type = request_dict.get('pay_type', None)
  115. is_show = int(request_dict.get('is_show', 1))
  116. is_delete = int(request_dict.get('is_delete', 0))
  117. size = float(request_dict.get('size', None))
  118. is_edit = request_dict.get('isEdit', None)
  119. bucket_id = request_dict.get('bucket_id', None)
  120. if not all([expire, price, currency, symbol, pay_type, size, bucket_id]):
  121. return response.json(444)
  122. pay_type = pay_type.split(',')
  123. try:
  124. icloud_store_meal_data = {
  125. 'expire': expire,
  126. 'price': price,
  127. 'currency': currency,
  128. 'symbol': symbol,
  129. 'is_show': is_show,
  130. 'size': size,
  131. 'is_delete': is_delete,
  132. 'bucket_id': bucket_id
  133. }
  134. if is_edit:
  135. if not meal_id:
  136. return response.json(444)
  137. ICloudStoreMeal.objects.filter(id=meal_id).update(**icloud_store_meal_data)
  138. ICloudStoreMeal.objects.get(id=meal_id).pay_type.set(pay_type)
  139. else:
  140. icloud_meal_qs = ICloudStoreMeal.objects.create(**icloud_store_meal_data)
  141. icloud_meal_qs.pay_type.set(pay_type)
  142. return response.json(0)
  143. except Exception as e:
  144. print(e)
  145. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  146. @staticmethod
  147. def get_bucket(request_dict, response):
  148. try:
  149. bucket_qs = VodBucketModel.objects.all().values('id', 'bucket')
  150. return response.json(0, list(bucket_qs))
  151. except Exception as e:
  152. print(e)
  153. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  154. @staticmethod
  155. def delete_meal(request_dict, response):
  156. meal_id = request_dict.get('meal_id', None)
  157. status = request_dict.get('status', None)
  158. if not meal_id:
  159. return response.json(444)
  160. ICloudStoreMeal.objects.filter(id=meal_id).update(is_delete=status)
  161. return response.json(0)
  162. @staticmethod
  163. def get_meal_lang(request_dict, response):
  164. is_select = request_dict.get('isSelect', None)
  165. meal_id = request_dict.get('mealId', None)
  166. page = request_dict.get('pageNo', None)
  167. line = request_dict.get('pageSize', None)
  168. if not all([page, line]):
  169. return response.json(444)
  170. lang = Lang.objects.filter(type=3)
  171. page = int(page)
  172. line = int(line)
  173. total = lang.count()
  174. if is_select:
  175. lang = ICloudStoreMeal.objects.values('id', 'lang__title')
  176. else:
  177. if meal_id:
  178. lang = lang.filter(icloudstoremeal__id=meal_id).values('icloudstoremeal__id', 'id', 'lang', 'title',
  179. 'content')
  180. total = lang.count()
  181. else:
  182. lang = lang.values('icloudstoremeal__id', 'id', 'lang', 'title', 'content')[
  183. (page - 1) * line:page * line]
  184. return response.json(0, {'langList': list(lang), 'total': total})
  185. @staticmethod
  186. def add_or_edit_lang(request_dict, response):
  187. lang_id = request_dict.get('lang_id', None)
  188. meal_id = request_dict.get('meal_id', None)
  189. lang = request_dict.get('lang', 'en')
  190. title = request_dict.get('title', None)
  191. content = request_dict.get('content', None)
  192. try:
  193. icloud_meal_qs = ICloudStoreMeal.objects.get(id=meal_id)
  194. if not icloud_meal_qs:
  195. return response.json(173)
  196. if lang_id:
  197. Lang.objects.filter(id=lang_id).update(lang=lang, title=title, content=content)
  198. else:
  199. lang_qs = Lang.objects.filter(lang=lang, title=title, content=content, type=3)
  200. if not lang_qs.exists():
  201. Lang.objects.create(lang=lang, title=title, content=content, type=3)
  202. lang_qs = Lang.objects.filter(lang=lang, title=title, content=content, type=3)
  203. icloud_meal_qs.lang.add(*lang_qs)
  204. return response.json(0)
  205. except Exception as e:
  206. return response.json(500)
  207. @staticmethod
  208. def delete_lang(request_dict, response):
  209. lang_id = request_dict.get('lang_id', None)
  210. meal_id = request_dict.get('meal_id', None)
  211. if not all([lang_id, meal_id]):
  212. return response.json(444)
  213. try:
  214. lang = Lang.objects.filter(id=lang_id)
  215. icloud_meal_qs = ICloudStoreMeal.objects.get(id=meal_id)
  216. icloud_meal_qs.lang.remove(*lang)
  217. lang.delete()
  218. return response.json(0)
  219. except Exception as e:
  220. return response.json(500)
  221. @staticmethod
  222. def get_user_icloud_info(request_dict, response):
  223. user_id = request_dict.get('user_id', None)
  224. page = request_dict.get('pageNo', None)
  225. line = request_dict.get('pageSize', None)
  226. if not all([page, line]):
  227. return response.json(444)
  228. now_time = int(time.time())
  229. page = int(page)
  230. line = int(line)
  231. try:
  232. icloud_user_qs = IcloudUseDetails.objects.all()
  233. if user_id:
  234. icloud_user_qs = icloud_user_qs.filter(user_id=user_id)
  235. icloud_user_qs = icloud_user_qs.values('use_size', 'user_id', 'detect_status', 'bucket_id',
  236. 'id')
  237. total = icloud_user_qs.count()
  238. icloud_user_qs = icloud_user_qs[(page - 1) * line:page * line]
  239. for item in icloud_user_qs:
  240. use_details_id = item['id']
  241. user_id = item['user_id']
  242. bucket_id = item['bucket_id']
  243. user_qs = Device_User.objects.filter(userID=user_id).values('username')
  244. item['username'] = user_qs[0]['username']
  245. bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket')
  246. item['bucket_name'] = bucket_qs[0]['bucket']
  247. all_size = IcloudService.objects.filter(Q(use_details_id=use_details_id), Q(use_status=0),
  248. Q(end_time__gt=now_time) | Q(end_time=0)).values(
  249. 'size').aggregate(total_size=Sum('size'))['total_size']
  250. item['all_size'] = float(all_size * 1024) if all_size else 0 # 转换单位为MB
  251. return response.json(0, {'list': list(icloud_user_qs), 'total': total})
  252. except Exception as e:
  253. return response.json(500)
  254. @staticmethod
  255. def reset_icloud(request_dict, response):
  256. use_details_id = request_dict.get('id', None)
  257. if not all([use_details_id]):
  258. return response.json(444)
  259. try:
  260. icloud_use_qs = IcloudUseDetails.objects.filter(id=use_details_id).values('user_id', 'bucket_id')
  261. user_id = icloud_use_qs[0]['user_id']
  262. bucket_id = icloud_use_qs[0]['bucket_id']
  263. bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket', 'region', 'mold')
  264. if not bucket_qs.exists():
  265. return response.json(173)
  266. bucket_name = bucket_qs[0]['bucket']
  267. bucket_region = bucket_qs[0]['region']
  268. mold = bucket_qs[0]['mold']
  269. s3_obj = AmazonS3Util(
  270. AWS_ACCESS_KEY_ID[mold],
  271. AWS_SECRET_ACCESS_KEY[mold],
  272. bucket_region
  273. )
  274. object_list = s3_obj.get_object_list(bucket_name, user_id)
  275. for obj in object_list:
  276. s3_obj.delete_obj(bucket_name, obj['Key'])
  277. IcloudStorageRecord.objects.filter(user_id=user_id).delete()
  278. icloud_use_qs.update(use_size=0)
  279. return response.json(0)
  280. except Exception as e:
  281. return response.json(500)
  282. @staticmethod
  283. def get_icloud_order(request_dict, response):
  284. page = request_dict.get('pageNo', None)
  285. line = request_dict.get('pageSize', None)
  286. order_id = request_dict.get('order_id', None)
  287. username = request_dict.get('username', None)
  288. pay_type = request_dict.get('pay_type', None)
  289. status = request_dict.get('status', None)
  290. time_range = request_dict.get('time_range', None)
  291. trade_no = request_dict.get('trade_no', None)
  292. if not all([page, line]):
  293. return response.json(444)
  294. page = int(page)
  295. line = int(line)
  296. try:
  297. order_qs = Order_Model.objects.filter(order_type=4)
  298. if order_id:
  299. order_qs = order_qs.filter(orderID=order_id)
  300. if username:
  301. order_qs = order_qs.filter(userID__username=username)
  302. if pay_type:
  303. order_qs = order_qs.filter(payType=pay_type)
  304. if status:
  305. order_qs = order_qs.filter(status=status)
  306. if time_range:
  307. start_time, end_time = time_range.split(',')
  308. order_qs = order_qs.filter(addTime__gte=start_time, addTime__lte=end_time)
  309. if trade_no:
  310. order_qs = order_qs.filter(trade_no=trade_no)
  311. count = order_qs.count()
  312. order_qs = order_qs.values('orderID', 'trade_no', 'userID__username', 'price', 'status', 'payType', 'desc',
  313. 'unify_combo_id', 'paypal', 'refunded_amount', 'addTime', 'updTime')[
  314. (page - 1) * line:page * line]
  315. order_list = []
  316. for item in order_qs:
  317. icloud_dict = {
  318. 'order_id': item['orderID'],
  319. 'trade_no': item['trade_no'],
  320. 'username': item['userID__username'],
  321. 'price': item['price'],
  322. 'status': item['status'],
  323. 'pay_type': item['payType'],
  324. 'refunded_amount': item['refunded_amount'],
  325. 'add_time': item['addTime'],
  326. 'upd_time': item['updTime'],
  327. }
  328. icloud_meal_qs = ICloudStoreMeal.objects.filter(id=item['unify_combo_id']).values('expire', 'size')
  329. icloud_dict['expire'] = icloud_meal_qs[0]['expire'] if icloud_meal_qs.exists() else ''
  330. icloud_dict['size'] = icloud_meal_qs[0]['size'] if icloud_meal_qs.exists() else ''
  331. icloud_dict['paypal'] = item['paypal'] if item['paypal'] else ''
  332. order_list.append(icloud_dict)
  333. return response.json(0, {'list': order_list, 'total': count})
  334. except Exception as e:
  335. return response.json(500)