CampaignController.py 29 KB

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