CampaignController.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. import time
  2. import json
  3. from Model.models import AppAdvertiseCampaign, DeviceTypeModel, CountryModel, OpenScreenCampaign, UserSetStatus, \
  4. Device_User, RegionRestriction
  5. from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVER_TYPE, LOGGER
  6. from django.core.paginator import Paginator
  7. from django.views import View
  8. from django.db.models import Prefetch
  9. from django.db.models import Q, F
  10. from Object.AWS.AmazonS3Util import AmazonS3Util
  11. from Object.ResponseObject import ResponseObject
  12. from Object.TokenObject import TokenObject
  13. class CampaignView(View):
  14. def get(self, request, *args, **kwargs):
  15. request.encoding = 'utf-8'
  16. operation = kwargs.get('operation')
  17. request_dict = request.GET
  18. return self.validation(request_dict, request, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. request_dict = request.POST
  23. return self.validation(request_dict, request, operation)
  24. def validation(self, request_dict, request, operation):
  25. language = request_dict.get('language', 'en')
  26. response = ResponseObject(language, 'pc')
  27. if operation == 'getCountryList':
  28. return self.get_country_list(response)
  29. elif operation == 'getUserSetStatusList': # 获取用户设置广告状态列表
  30. return self.get_user_set_status_list(request_dict, response)
  31. else:
  32. tko = TokenObject(
  33. request.META.get('HTTP_AUTHORIZATION'),
  34. returntpye='pc')
  35. if tko.code != 0:
  36. return response.json(tko.code)
  37. response.lang = tko.lang
  38. if operation == 'getCampaignList': # 获取广告活动列表
  39. return self.get_campaign_list(request_dict, response)
  40. elif operation == 'addCampaign': # 添加广告活动
  41. return self.add_campaign(request, request_dict, response)
  42. elif operation == 'updateCampaign': # 更新广告活动
  43. return self.update_campaign(request, request_dict, response)
  44. elif operation == 'deleteCampaign': # 删除广告活动
  45. return self.delete_campaign(request_dict, response)
  46. elif operation == 'switchCampaign': # 广告活动开关
  47. return self.switch_campaign(request_dict, response)
  48. elif operation == 'getUserBehaviorLog': # 获取用户行为日志
  49. return self.get_user_behavior_log(request_dict, response)
  50. elif operation == 'setStatus':
  51. return self.set_status(request_dict, response)
  52. else:
  53. return response.json(414)
  54. def get_campaign_list(self, request_dict, response):
  55. """
  56. 查询广告活动列表
  57. @param request_dict: 请求参数
  58. @param response: 响应对象
  59. @return: 响应对象包含广告活动列表
  60. """
  61. campaign_name = request_dict.get('campaign_name', None)
  62. campaign_country = request_dict.get('campaign_country', None)
  63. status = request_dict.get('status', None)
  64. pageNo = request_dict.get('pageNo', 1)
  65. pageSize = request_dict.get('pageSize', 20)
  66. unknown_country = 0
  67. try:
  68. # 连接并获取国家
  69. country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('country_name'),
  70. to_attr='country_list')
  71. app_advertise_campaign_qs = AppAdvertiseCampaign.objects.prefetch_related(country_prefetch)
  72. # 过滤
  73. if campaign_name:
  74. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(campaign_name=campaign_name)
  75. if status:
  76. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(status=status)
  77. if campaign_country:
  78. campaign_country_list = campaign_country.split(',')
  79. if "未知地区" in campaign_country_list:
  80. unknown_country = 1
  81. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(
  82. Q(country__country_name__in=campaign_country_list) | Q(unknown_country=unknown_country)).distinct()
  83. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(~Q(status=2))
  84. # 分页
  85. paginator = Paginator(app_advertise_campaign_qs.order_by('id'), pageSize)
  86. campaigns = paginator.page(pageNo)
  87. # 添加设备名和地区返回
  88. campaign_list = []
  89. for campaign in campaigns.object_list:
  90. if campaign.unknown_country == 0:
  91. countries = ",".join([country.country_name for country in campaign.country_list])
  92. else:
  93. country_list = campaign.country_list
  94. country_names = []
  95. for country in country_list:
  96. country_names.append(country.country_name)
  97. country_names.append("未知地区")
  98. countries = ",".join(country_names)
  99. s3_url, _, _ = self.s3_server()
  100. # 轮播图处理
  101. banner_campaign_list = campaign.banner_campaign
  102. for banner_campaign in banner_campaign_list:
  103. banner_campaign["image"] = s3_url + banner_campaign["image"]
  104. banner_campaign_dict = {str(index): banner_campaign_list for index, banner_campaign_list in
  105. enumerate(banner_campaign_list, start=1)}
  106. campaign_data = {
  107. 'id': campaign.id,
  108. 'image_url': s3_url + campaign.image_url,
  109. 'pad_image_url': s3_url + campaign.pad_image_url,
  110. 'banner_campaign': banner_campaign_dict,
  111. 'campaign_name': campaign.campaign_name,
  112. 'campaign_url': campaign.campaign_url,
  113. 'campaign_type': campaign.campaign_type,
  114. 'status': campaign.status,
  115. 'campaign_start_date': campaign.campaign_start_date,
  116. 'campaign_end_date': campaign.campaign_end_date,
  117. 'campaign_show_stime': campaign.campaign_show_stime,
  118. 'campaign_show_etime': campaign.campaign_show_etime,
  119. 'app_bundle_type': campaign.app_bundle_type,
  120. 'countries': countries,
  121. 'device_types': campaign.device_type,
  122. 'ex_device_types': campaign.ex_device_type
  123. }
  124. if campaign.image_url == "":
  125. del campaign_data['image_url']
  126. del campaign_data['campaign_url']
  127. del campaign_data['pad_image_url']
  128. campaign_list.append(campaign_data)
  129. data = {
  130. 'list': campaign_list,
  131. 'total': paginator.count,
  132. }
  133. return response.json(0, data)
  134. except Exception as e:
  135. print(e)
  136. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  137. def add_campaign(self, request, request_dict, response):
  138. """
  139. 添加新的广告活动
  140. @param request: 包含文件信息
  141. @param request_dict: 包含所有请求参数的字典
  142. @param response: 响应对象
  143. @return: 响应对象
  144. """
  145. try:
  146. campaign_name = request_dict.get('campaign_name', None)
  147. campaign_url = request_dict.get('campaign_url', "")
  148. status = request_dict.get('status', 2)
  149. campaign_start_time = request_dict.get('campaign_start_time', None)
  150. campaign_end_time = request_dict.get('campaign_end_time', None)
  151. campaign_show_stime = request_dict.get('campaign_show_stime', 0)
  152. campaign_show_etime = request_dict.get('campaign_show_etime', 86399)
  153. app_bundle_type = request_dict.get('app_bundle_type', None)
  154. poster_file = request.FILES.get('posterFile', None)
  155. poster_pad_file = request.FILES.get('posterPadFile', None)
  156. banner_files = request.FILES.getlist('bannerFiles', None)
  157. banner_fields = json.loads(request_dict.get('banner_fields', "[]")) # 轮播字段
  158. device_type_names = json.loads(request_dict.get('device_type_list', "[]")) # 设备类型名称列表
  159. ex_device_type_names = json.loads(request_dict.get('ex_device_type_list', "[]"))
  160. country_name_list = json.loads(request_dict.get('country_name_list', "[]")) # 地区列表
  161. required_fields = [campaign_name, campaign_start_time, campaign_end_time, app_bundle_type]
  162. list_fields = [country_name_list]
  163. # 检查基本字段是否为None
  164. if any(field is None for field in required_fields):
  165. return response.json(444)
  166. # 检查列表类型的字段是否为空
  167. if any(not field for field in list_fields):
  168. return response.json(444)
  169. # 确保至少提供了一个文件
  170. if not poster_file and not banner_files:
  171. return response.json(444)
  172. # 不包含设备和包含设备不能重复
  173. if device_type_names and ex_device_type_names:
  174. intersection = list(set(device_type_names).intersection(set(ex_device_type_names)))
  175. if intersection:
  176. return response.json(10, "设备包含和设备不包含不能重复")
  177. # 针对特殊地区的处理,表没设计好用这个处理挽救一下
  178. unknown_country = 0
  179. if "未知地区" in country_name_list:
  180. unknown_country = 1
  181. country_name_list.remove("未知地区")
  182. # 上传文件到S3
  183. banner_image_urls = self.upload_files_to_s3(banner_files,
  184. "BannerAdvertise") if banner_files is not None else []
  185. poster_image_url = self.upload_files_to_s3(poster_file,
  186. "OpenScreenAdvertise")[0] if poster_file is not None else ""
  187. pad_image_url = self.upload_files_to_s3(poster_file,
  188. "OpenScreenAdvertise")[0] if poster_pad_file is not None else ""
  189. campaign_type = []
  190. if poster_image_url != "":
  191. campaign_type.append(1)
  192. if banner_image_urls:
  193. campaign_type.append(2)
  194. banner_campaign = [{"image": image_url, "url": cam_field["url"], "tag": int(cam_field["tag"])}
  195. for image_url, cam_field in zip(banner_image_urls, banner_fields)]
  196. else:
  197. banner_campaign = []
  198. create_time = int(time.time())
  199. update_time = int(time.time())
  200. # 创建 AppAdvertiseCampaign 实例
  201. new_campaign = AppAdvertiseCampaign.objects.create(
  202. image_url=poster_image_url,
  203. pad_image_url=pad_image_url,
  204. campaign_name=campaign_name,
  205. campaign_url=campaign_url,
  206. banner_campaign=banner_campaign,
  207. campaign_type=campaign_type,
  208. status=status,
  209. unknown_country=unknown_country,
  210. app_bundle_type=app_bundle_type,
  211. campaign_start_date=campaign_start_time,
  212. campaign_end_date=campaign_end_time,
  213. campaign_show_stime=campaign_show_stime,
  214. campaign_show_etime=campaign_show_etime,
  215. create_time=create_time,
  216. update_time=update_time,
  217. ex_device_type=ex_device_type_names,
  218. device_type=device_type_names
  219. )
  220. # 根据 ID 关联 CountryModel 实例
  221. country_instances = CountryModel.objects.filter(country_name__in=country_name_list)
  222. for country_instance in country_instances:
  223. new_campaign.country.add(country_instance)
  224. return response.json(0)
  225. except Exception as e:
  226. print(e)
  227. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  228. def update_campaign(self, request, request_dict, response):
  229. """
  230. 更新广告活动
  231. @param request: 包含文件信息
  232. @param request_dict: 包含所有请求参数的字典
  233. @param response: 响应对象
  234. @return: 响应对象
  235. """
  236. try:
  237. campaign_id = request_dict.get('id', None)
  238. campaign_name = request_dict.get('campaign_name', None)
  239. campaign_url = request_dict.get('campaign_url', None)
  240. campaign_start_time = request_dict.get('campaign_start_time', None)
  241. campaign_end_time = request_dict.get('campaign_end_time', None)
  242. campaign_show_stime = request_dict.get('campaign_show_stime', None)
  243. campaign_show_etime = request_dict.get('campaign_show_etime', None)
  244. app_bundle_type = request_dict.get('app_bundle_type', None)
  245. device_type_names = json.loads(request_dict.get('device_type_list', "[]")) # 设备类型名称列表
  246. ex_device_type_names = json.loads(request_dict.get('ex_device_type_list', "[]"))
  247. country_name_list = json.loads(request_dict.get('country_name_list', "[]")) # 地区列表
  248. poster_file = request.FILES.get('posterFile', None)
  249. poster_pad_file = request.FILES.get('posterPadFile', None)
  250. # 更改轮播图广告图片
  251. sort_files = json.loads(request_dict.get('sort_files', "[]"))
  252. banner_files = request.FILES.getlist('bannerFiles', None)
  253. # 更改轮播图 字段
  254. sort_urls = json.loads(request_dict.get('sort_url', "[]"))
  255. banner_fields = json.loads(request_dict.get('banner_fields', "[]"))
  256. # 删除轮播图广告
  257. sort_banner_del = json.loads(request_dict.get('sort_banner_del', "[]"))
  258. poster_del = request_dict.get('poster_del', None)
  259. if not campaign_id:
  260. return response.json(444)
  261. update_time = int(time.time())
  262. campaign = AppAdvertiseCampaign.objects.filter(pk=campaign_id).first()
  263. # 未知地区特殊处理
  264. if country_name_list is not None:
  265. if "未知地区" in country_name_list:
  266. campaign.unknown_country = 1
  267. country_name_list.remove("未知地区")
  268. else:
  269. campaign.unknown_country = 0
  270. # 开屏广告图片
  271. if poster_file is not None:
  272. self.del_file_to_s3(campaign.image_url)
  273. poster_image_url = self.upload_files_to_s3(poster_file,
  274. "OpenScreenAdvertise")[0]
  275. campaign.image_url = poster_image_url
  276. if 1 not in campaign.campaign_type:
  277. campaign.campaign_type.append(1)
  278. # 开屏海报pad图片
  279. if poster_pad_file is not None:
  280. self.del_file_to_s3(campaign.pad_image_url)
  281. pad_image_url = self.upload_files_to_s3(poster_pad_file,
  282. "OpenScreenAdvertise")[0]
  283. campaign.pad_image_url = pad_image_url
  284. # 不包含设备和包含设备不能重复
  285. if device_type_names and ex_device_type_names:
  286. intersection = list(set(device_type_names).intersection(set(ex_device_type_names)))
  287. if intersection:
  288. return response.json(10, "设备包含和设备不包含不能重复")
  289. # 更改轮播广告图片
  290. if banner_files:
  291. for sort in sort_files:
  292. if sort <= len(campaign.banner_campaign):
  293. old_image = campaign.banner_campaign[sort - 1]["image"]
  294. self.del_file_to_s3(old_image)
  295. else:
  296. campaign.banner_campaign.append({})
  297. if sort not in sort_urls:
  298. return response.json(10, "图片需要和链接对应")
  299. banner_image_urls = self.upload_files_to_s3(banner_files, "BannerAdvertise")
  300. image_num = 0
  301. for sort in sort_files:
  302. campaign.banner_campaign[sort - 1]["image"] = banner_image_urls[image_num]
  303. image_num = image_num + 1
  304. if 2 not in campaign.campaign_type:
  305. campaign.campaign_type.append(2)
  306. # 更改轮播广告链接
  307. if banner_fields:
  308. url_num = 0
  309. for sort in sort_urls:
  310. if sort > len(campaign.banner_campaign):
  311. campaign.banner_campaign.append({})
  312. if sort not in sort_files:
  313. return response.json(10, "图片需要和链接对应")
  314. campaign.banner_campaign[sort - 1]["url"] = banner_fields[url_num]["url"]
  315. campaign.banner_campaign[sort - 1]["tag"] = banner_fields[url_num]["tag"]
  316. url_num = url_num + 1
  317. # 添加删除轮播图列表
  318. if sort_banner_del:
  319. sort_banner_del.sort(reverse=True)
  320. for sort in sort_banner_del:
  321. if sort <= len(campaign.banner_campaign):
  322. self.del_file_to_s3(campaign.banner_campaign[sort - 1]["image"])
  323. campaign.banner_campaign.pop(sort - 1)
  324. if not campaign.banner_campaign:
  325. campaign.campaign_type.remove(2)
  326. # 删除开屏
  327. if poster_del is not None:
  328. campaign.campaign_url = ""
  329. self.del_file_to_s3(campaign.image_url)
  330. self.del_file_to_s3(campaign.pad_image_url)
  331. campaign.image_url = ""
  332. campaign.pad_image_url = ""
  333. campaign.campaign_type.remove(1)
  334. if not campaign.campaign_type:
  335. campaign.status = 2
  336. # 常规字段
  337. if campaign_name is not None:
  338. campaign.campaign_name = campaign_name
  339. if campaign_url is not None:
  340. campaign.campaign_url = campaign_url
  341. if app_bundle_type is not None:
  342. campaign.app_bundle_type = app_bundle_type
  343. if campaign_start_time is not None:
  344. campaign.campaign_start_date = campaign_start_time
  345. if campaign_end_time is not None:
  346. campaign.campaign_end_date = campaign_end_time
  347. if campaign_show_stime is not None:
  348. campaign.campaign_show_stime = campaign_show_stime
  349. if campaign_show_etime is not None:
  350. campaign.campaign_show_etime = campaign_show_etime
  351. if campaign_show_etime is not None:
  352. campaign.campaign_show_etime = campaign_show_etime
  353. if device_type_names is not None:
  354. campaign.device_type = device_type_names
  355. if ex_device_type_names is not None:
  356. campaign.ex_device_type = ex_device_type_names
  357. # 更新多对多字段 - 国家/地区
  358. if country_name_list:
  359. countries = CountryModel.objects.filter(country_name__in=country_name_list)
  360. campaign.country.set(countries)
  361. campaign.update_time = update_time
  362. # 保存更新
  363. campaign.save()
  364. return response.json(0)
  365. except Exception as e:
  366. print(e)
  367. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  368. def delete_campaign(self, request_dict, response):
  369. """
  370. 删除广告活动
  371. @param request_dict: 包含所有请求参数的字典
  372. @param response: 响应对象
  373. @return: 响应对象
  374. """
  375. campaign_id = request_dict.get('id')
  376. if not campaign_id:
  377. return response.json(444)
  378. try:
  379. campaign = AppAdvertiseCampaign.objects.get(pk=campaign_id)
  380. if campaign.image_url != "":
  381. self.del_file_to_s3(campaign.image_url)
  382. self.del_file_to_s3(campaign.pad_image_url)
  383. if campaign.banner_campaign:
  384. banner_campaign_list = []
  385. for banner_campaign in campaign.banner_campaign:
  386. banner = banner_campaign["image"]
  387. banner_campaign_list.append(banner)
  388. self.del_file_to_s3(banner_campaign_list)
  389. # 清除多对多关系
  390. campaign.country.clear()
  391. # 保留在广告表中
  392. campaign.status = 2
  393. campaign.update_time = int(time.time())
  394. campaign.save()
  395. return response.json(0)
  396. except Exception as e:
  397. print(e)
  398. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  399. def switch_campaign(self, request_dict, response):
  400. """
  401. 广告活动 开启/关闭
  402. @param request_dict: 包含所有请求参数的字典
  403. @param response: 响应对象
  404. @return: 响应对象
  405. """
  406. campaign_id = request_dict.get('id')
  407. status = request_dict.get('status')
  408. if not all([campaign_id, status]):
  409. return response.json(444)
  410. try:
  411. AppAdvertiseCampaign.objects.filter(pk=campaign_id).update(status=status, update_time=int(time.time()))
  412. return response.json(0)
  413. except Exception as e:
  414. print(e)
  415. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  416. def get_user_behavior_log(self, request_dict, response):
  417. """
  418. 记录日志
  419. @param request_dict: dict
  420. @param response:
  421. @return:
  422. """
  423. campaign_ids = json.loads(request_dict.get('campaign_id', '[]'))
  424. start_time = request_dict.get('start_time', None)
  425. end_time = request_dict.get('end_time', None)
  426. if not all([start_time, end_time]):
  427. return response.json(444)
  428. try:
  429. open_screen_campaign_qs = OpenScreenCampaign.objects.filter(
  430. update_time__range=[int(start_time), int(end_time)])
  431. if campaign_ids:
  432. open_screen_campaign_qs = open_screen_campaign_qs.filter(
  433. campaign_id__in=campaign_ids, campaign_id__status__in=[0, 1],
  434. campaign_id__campaign_type__contains=[1]
  435. )
  436. open_screen_campaign_qs = (open_screen_campaign_qs.
  437. select_related('campaign_id').
  438. values('id', 'user_id', 'status', 'update_time', 'create_time',
  439. 'campaign_id', 'campaign_id__campaign_name', 'campaign_id__campaign_type',
  440. 'campaign_id__status',
  441. 'campaign_id__campaign_start_date', 'campaign_id__campaign_end_date',
  442. 'campaign_id__campaign_show_stime', 'campaign_id__campaign_show_etime'))
  443. if not open_screen_campaign_qs.exists():
  444. return response.json(0, {'list': []})
  445. campaigns_list = []
  446. for campaign in open_screen_campaign_qs:
  447. renamed_campaign = {
  448. 'id': campaign['id'],
  449. 'user_id': campaign['user_id'],
  450. 'status': campaign['status'],
  451. 'update_time': campaign['update_time'],
  452. 'create_time': campaign['create_time'],
  453. 'campaign_id': campaign['campaign_id'],
  454. 'campaign_name': campaign['campaign_id__campaign_name'],
  455. 'campaign_type': 1,
  456. 'campaign_status': campaign['campaign_id__status'],
  457. 'start_date': campaign['campaign_id__campaign_start_date'],
  458. 'end_date': campaign['campaign_id__campaign_end_date'],
  459. 'start_time': campaign['campaign_id__campaign_show_stime'],
  460. 'end_time': campaign['campaign_id__campaign_show_etime']
  461. }
  462. campaigns_list.append(renamed_campaign)
  463. return response.json(0, {'list': campaigns_list})
  464. except Exception as e:
  465. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  466. def get_country_list(self, response):
  467. """
  468. 获取国家列表
  469. @param response:
  470. @return:
  471. """
  472. try:
  473. if SERVER_TYPE == 'Ansjer.us_config.formal_settings':
  474. region_api = 'https://www.dvema.com/'
  475. elif SERVER_TYPE == 'Ansjer.eur_config.formal_settings':
  476. region_api = 'https://api.zositeche.com/'
  477. elif SERVER_TYPE == 'Ansjer.cn_config.formal_settings':
  478. region_api = 'https://www.zositechc.cn/'
  479. else:
  480. region_api = 'https://test.zositechc.cn/'
  481. country_qs = CountryModel.objects.filter(region__api=region_api).values('country_name')
  482. if not country_qs.exists():
  483. return response.json(173)
  484. country_list = []
  485. for country in country_qs:
  486. country_list.append(country['country_name'])
  487. return response.json(0, {'list': country_list})
  488. except Exception as e:
  489. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  490. @staticmethod
  491. def upload_files_to_s3(files, path_prefix):
  492. """
  493. 广告图片文件上传到S3存储桶
  494. @param files: 文件 request.FILES获取
  495. @param path_prefix: 存储路径
  496. @return image_urls: 列表
  497. """
  498. try:
  499. _, regin, AWS_SES_ACCESS_REGION = CampaignView.s3_server()
  500. # 确保files是一个列表,统一处理单个文件和多个文件
  501. if not isinstance(files, list):
  502. files = [files]
  503. image_urls = []
  504. bucket_name = "ansjerfilemanager"
  505. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[regin], AWS_SECRET_ACCESS_KEY[regin], AWS_SES_ACCESS_REGION)
  506. for file in files:
  507. timestamp = int(time.time())
  508. file_key = f'app/campaign/{path_prefix}/{timestamp}_{file.name}'
  509. s3.upload_file_obj(bucket_name, file_key, file,
  510. {'ContentType': file.content_type, 'ACL': 'public-read'})
  511. image_urls.append(f"{path_prefix}/{timestamp}_{file.name}")
  512. return image_urls
  513. except Exception as e:
  514. LOGGER.info('存储桶添加异常:error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  515. return None
  516. @staticmethod
  517. def del_file_to_s3(path_list):
  518. """
  519. S3存储桶 删除文件
  520. @param path_list: 单一字符串或者列表
  521. @return
  522. """
  523. try:
  524. _, regin, AWS_SES_ACCESS_REGION = CampaignView.s3_server()
  525. if not isinstance(path_list, list):
  526. path_list = [path_list]
  527. for path in path_list:
  528. # 删除存储桶原来的图片
  529. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[regin], AWS_SECRET_ACCESS_KEY[regin], AWS_SES_ACCESS_REGION)
  530. bucket_name = 'ansjerfilemanager'
  531. s3.delete_obj(bucket_name, f"app/campaign/{path}")
  532. except Exception as e:
  533. LOGGER.info('存储桶删除异常:error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  534. @staticmethod
  535. def s3_server():
  536. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  537. s3_url = "https://ansjerfilemanager.s3.cn-northwest-1.amazonaws.com.cn/app/campaign/"
  538. regin = 0
  539. AWS_SES_ACCESS_REGION = "cn-northwest-1"
  540. else:
  541. s3_url = "https://ansjerfilemanager.s3.amazonaws.com/app/campaign/"
  542. regin = 1
  543. AWS_SES_ACCESS_REGION = 'us-east-1'
  544. return s3_url, regin, AWS_SES_ACCESS_REGION
  545. @staticmethod
  546. def set_status(request_dict, response):
  547. """
  548. 编辑状态
  549. """
  550. try:
  551. user_status_id = request_dict.get("userSetId", None)
  552. username = request_dict.get("username", None)
  553. status = request_dict.get("status", None)
  554. now_time = int(time.time())
  555. if user_status_id and status:
  556. UserSetStatus.objects.filter(pk=user_status_id).update(status=status)
  557. elif username:
  558. region_restriction = RegionRestriction.objects.filter(statusName="splashAdSwitchStatus").first()
  559. status = region_restriction.default_status if region_restriction else None
  560. user = Device_User.objects.filter(
  561. Q(userID=username) | Q(userEmail=username) | Q(phone=username) | Q(username=username)).first()
  562. if user:
  563. if UserSetStatus.objects.filter(user_id=user.userID, region_restriction_id=region_restriction).exists():
  564. return response.json(174)
  565. UserSetStatus.objects.create(user_id=user.userID, status=status,
  566. region_restriction_id=region_restriction,
  567. created_time=now_time, updated_time=now_time)
  568. else:
  569. return response.json(173)
  570. else:
  571. return response.json(444)
  572. return response.json(0)
  573. except Exception as e:
  574. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  575. @staticmethod
  576. def get_user_set_status_list(request_dict, response):
  577. """
  578. 获取状态列表
  579. """
  580. try:
  581. user_id = request_dict.get("userID", None)
  582. email = request_dict.get("email", None)
  583. phone = request_dict.get("phone", None)
  584. username = request_dict.get("username", None)
  585. page = int(request_dict.get("page", 1))
  586. page_size = int(request_dict.get("pageSize", 10))
  587. region_restriction = RegionRestriction.objects.filter(statusName="splashAdSwitchStatus").first()
  588. user_set_qs = UserSetStatus.objects.filter(region_restriction_id=region_restriction)
  589. if user_id:
  590. user_set_qs = user_set_qs.filter(user_id=user_id)
  591. if email:
  592. user = Device_User.objects.filter(userEmail=email).first()
  593. if user:
  594. user_set_qs = user_set_qs.filter(user_id=user.userID)
  595. if phone:
  596. user = Device_User.objects.filter(phone=phone).first()
  597. if user:
  598. user_set_qs = user_set_qs.filter(user_id=user.userID)
  599. if username:
  600. user = Device_User.objects.filter(username=username).first()
  601. if user:
  602. user_set_qs = user_set_qs.filter(user_id=user.userID)
  603. if not user_set_qs.exists():
  604. return response.json(0, {'list': [], 'total': 0})
  605. total_count = user_set_qs.count()
  606. user_set_paginated = user_set_qs[(page - 1) * page_size:page * page_size]
  607. user_set_list = []
  608. for user_set in user_set_paginated:
  609. status_name = user_set.region_restriction_id.statusName
  610. user = Device_User.objects.filter(userID=user_set.user_id).first()
  611. user_set_list.append({
  612. 'userSetId': user_set.id,
  613. 'userID': user_set.user_id,
  614. 'statusName': status_name,
  615. 'setStatus': user_set.status,
  616. 'username': user.username,
  617. 'phone': user.phone,
  618. 'email': user.userEmail,
  619. 'createdTime': user_set.created_time,
  620. 'updatedTime': user_set.updated_time,
  621. })
  622. return response.json(0, {
  623. 'list': user_set_list,
  624. 'total': total_count,
  625. })
  626. except Exception as e:
  627. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))