AppCampaignController.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. import time
  2. import pytz
  3. import json
  4. from datetime import datetime
  5. from datetime import time as Time
  6. from Model.models import AppAdvertiseCampaign, DeviceTypeModel, CountryModel, Device_User, OpenScreenCampaign
  7. from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SERVER_TYPE
  8. from django.core.paginator import Paginator
  9. from django.views import View
  10. from django.db.models import Prefetch
  11. from django.db.models import Q, F
  12. from Object.AWS.AmazonS3Util import AmazonS3Util
  13. from Object.ResponseObject import ResponseObject
  14. from Object.TokenObject import TokenObject
  15. class AppCampaignView(View):
  16. def get(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. operation = kwargs.get('operation')
  19. request_dict = request.GET
  20. return self.validation(request_dict, request, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. request_dict = request.POST
  25. return self.validation(request_dict, request, operation)
  26. def validation(self, request_dict, request, operation):
  27. language = request_dict.get('language', 'en')
  28. response = ResponseObject(language, 'pc')
  29. if operation == 'getCampaignList': # 获取广告活动列表
  30. return self.get_campaign_list(request_dict, response)
  31. elif operation == 'getCountryList': # 查询国家列表
  32. return self.get_country_list(response)
  33. elif operation == 'addCampaign': # 添加广告活动
  34. return self.add_campaign(request, request_dict, response)
  35. elif operation == 'updateCampaign': # 更新广告活动
  36. return self.update_campaign(request, request_dict, response)
  37. elif operation == 'deleteCampaign': # 删除广告活动
  38. return self.delete_campaign(request_dict, response)
  39. elif operation == 'switchCampaign': # 广告活动开关
  40. return self.switch_campaign(request_dict, response)
  41. elif operation == 'appGetCampaigns':
  42. return self.app_get_campaigns(request_dict)
  43. elif operation == 'recordUserBehavior':
  44. return self.record_user_behavior(request_dict)
  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. # 连接并获取国家和设备类型
  63. country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('country_name'),
  64. to_attr='country_list')
  65. device_type_prefetch = Prefetch('device_type', queryset=DeviceTypeModel.objects.only('name'),
  66. to_attr='device_type_list')
  67. app_advertise_campaign_qs = AppAdvertiseCampaign.objects.prefetch_related(country_prefetch,
  68. device_type_prefetch)
  69. # 过滤
  70. if campaign_name:
  71. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(campaign_name=campaign_name)
  72. if status:
  73. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(status=status)
  74. if campaign_country:
  75. campaign_country_list = campaign_country.split(',')
  76. if "未知地区" in campaign_country_list:
  77. unknown_country = 1
  78. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(
  79. Q(country__country_name__in=campaign_country_list) | Q(unknown_country=unknown_country)).distinct()
  80. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(~Q(status=2))
  81. # 分页
  82. paginator = Paginator(app_advertise_campaign_qs.order_by('id'), pageSize)
  83. campaigns = paginator.page(pageNo)
  84. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  85. s3_url = "https://ansjerfilemanager.s3.cn-northwest-1.amazonaws.com.cn/app/campaign/"
  86. else:
  87. s3_url = "https://ansjerfilemanager.s3.amazonaws.com/app/campaign/"
  88. # 添加设备名和地区返回
  89. campaign_list = []
  90. for campaign in campaigns.object_list:
  91. if campaign.unknown_country == 0:
  92. countries = ",".join([country.country_name for country in campaign.country_list])
  93. else:
  94. country_list = campaign.country_list
  95. country_names = []
  96. for country in country_list:
  97. country_names.append(country.country_name)
  98. country_names.append("未知地区")
  99. countries = ",".join(country_names)
  100. campaign_data = {
  101. 'id': campaign.id,
  102. 'image_url': s3_url + campaign.image_url,
  103. 'campaign_name': campaign.campaign_name,
  104. 'campaign_url': campaign.campaign_url,
  105. 'campaign_type': campaign.campaign_type,
  106. 'status': campaign.status,
  107. 'campaign_start_date': campaign.campaign_start_date,
  108. 'campaign_end_date': campaign.campaign_end_date,
  109. 'campaign_show_stime': campaign.campaign_show_stime,
  110. 'campaign_show_etime': campaign.campaign_show_etime,
  111. 'countries': countries,
  112. 'device_types': ",".join([device.name for device in campaign.device_type_list]),
  113. }
  114. campaign_list.append(campaign_data)
  115. data = {
  116. 'list': campaign_list,
  117. 'total': paginator.count,
  118. }
  119. return response.json(0, data)
  120. def add_campaign(self, request, request_dict, response):
  121. """
  122. 添加新的广告活动
  123. @param request_dict: 包含所有请求参数的字典
  124. @param response: 响应对象
  125. @return: 响应对象
  126. """
  127. file = request.FILES.get('posterFile', None)
  128. campaign_name = request_dict.get('campaign_name', None)
  129. campaign_url = request_dict.get('campaign_url', None)
  130. campaign_type = request_dict.get('campaign_type', None)
  131. status = request_dict.get('status', None)
  132. device_type_names = json.loads(request_dict.get('device_type_list', None)) # 设备类型名称列表
  133. country_name_list = json.loads(request_dict.get('country_name_list', None)) # 地区列表
  134. campaign_start_time = request_dict.get('campaign_start_time', None)
  135. campaign_end_time = request_dict.get('campaign_end_time', None)
  136. campaign_show_stime = request_dict.get('campaign_show_stime', 0)
  137. campaign_show_etime = request_dict.get('campaign_show_etime', 86399)
  138. if not all([campaign_name, campaign_type, device_type_names, campaign_url,
  139. country_name_list, campaign_start_time, campaign_end_time, file]):
  140. return response.json(444)
  141. # 针对特殊地区的处理,表没设计好用这个处理挽救一下
  142. unknown_country = 0
  143. if "未知地区" in country_name_list:
  144. unknown_country = 1
  145. country_name_list.remove("未知地区")
  146. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  147. regin = 0
  148. AWS_SES_ACCESS_REGION = "cn-northwest-1"
  149. else:
  150. regin = 1
  151. AWS_SES_ACCESS_REGION = 'us-east-1'
  152. fileName = file.name
  153. try:
  154. create_time = int(time.time())
  155. update_time = int(time.time())
  156. # 保存图片到存储桶
  157. bucket_name = 'ansjerfilemanager'
  158. file_key = f'app/campaign/OpenScreenAdvertise/{update_time}_{fileName}'
  159. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[regin], AWS_SECRET_ACCESS_KEY[regin], AWS_SES_ACCESS_REGION)
  160. # 地址:https://ansjerfilemanager.s3.amazonaws.com/app/campaign/OpenScreenAdvertise/XXX.jpg
  161. s3.upload_file_obj(
  162. bucket_name,
  163. file_key,
  164. file,
  165. {'ContentType': file.content_type, 'ACL': 'public-read'})
  166. # 创建 AppAdvertiseCampaign 实例
  167. new_campaign = AppAdvertiseCampaign.objects.create(
  168. image_url=f"OpenScreenAdvertise/{update_time}_{fileName}",
  169. campaign_name=campaign_name,
  170. campaign_url=campaign_url,
  171. campaign_type=campaign_type,
  172. status=status,
  173. unknown_country=unknown_country,
  174. campaign_start_date=campaign_start_time,
  175. campaign_end_date=campaign_end_time,
  176. campaign_show_stime=campaign_show_stime,
  177. campaign_show_etime=campaign_show_etime,
  178. create_time=create_time,
  179. update_time=update_time,
  180. )
  181. # 根据名称查找 DeviceTypeModel 的实例并建立关系
  182. device_type_instances = DeviceTypeModel.objects.filter(name__in=device_type_names)
  183. for device_type_instance in device_type_instances:
  184. new_campaign.device_type.add(device_type_instance)
  185. # 根据 ID 关联 CountryModel 实例
  186. country_instances = CountryModel.objects.filter(country_name__in=country_name_list)
  187. for country_instance in country_instances:
  188. new_campaign.country.add(country_instance)
  189. except Exception as e:
  190. return response.json(178)
  191. return response.json(0)
  192. def update_campaign(self, request, request_dict, response):
  193. campaign_id = request_dict.get('id', None)
  194. campaign_name = request_dict.get('campaign_name', None)
  195. campaign_url = request_dict.get('campaign_url', None)
  196. campaign_type = request_dict.get('campaign_type', None)
  197. device_type_names = json.loads(request_dict.get('device_type_list', '[]')) # 设备类型名称列表
  198. country_name_list = json.loads(request_dict.get('country_name_list', '[]')) # 地区列表
  199. campaign_start_time = request_dict.get('campaign_start_time', None)
  200. campaign_end_time = request_dict.get('campaign_end_time', None)
  201. campaign_show_stime = request_dict.get('campaign_show_stime', None)
  202. campaign_show_etime = request_dict.get('campaign_show_etime', None)
  203. file = request.FILES.get('posterFile', None)
  204. if not campaign_id:
  205. return response.json(444)
  206. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  207. regin = 0
  208. AWS_SES_ACCESS_REGION = "cn-northwest-1"
  209. else:
  210. regin = 1
  211. AWS_SES_ACCESS_REGION = 'us-east-1'
  212. try:
  213. update_time = int(time.time())
  214. campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
  215. if country_name_list is not None:
  216. if "未知地区" in country_name_list:
  217. campaign.unknown_country = 1
  218. country_name_list.remove("未知地区")
  219. else:
  220. campaign.unknown_country = 0
  221. if file is not None:
  222. # 删除存储桶原来的图片
  223. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[regin], AWS_SECRET_ACCESS_KEY[regin], AWS_SES_ACCESS_REGION)
  224. bucket_name = 'ansjerfilemanager'
  225. if campaign.image_url:
  226. s3.delete_obj(bucket_name, f"app/campaign/{campaign.image_url}")
  227. # 添加新的图片
  228. file_key = f'app/campaign/OpenScreenAdvertise/{update_time}_{file.name}'
  229. s3.upload_file_obj(
  230. bucket_name,
  231. file_key,
  232. file,
  233. {'ContentType': file.content_type, 'ACL': 'public-read'}
  234. )
  235. campaign.image_url = f'OpenScreenAdvertise/{update_time}_{file.name}'
  236. if campaign_name is not None:
  237. campaign.campaign_name = campaign_name
  238. if campaign_url is not None:
  239. campaign.campaign_url = campaign_url
  240. if campaign_type is not None:
  241. campaign.campaign_type = campaign_type
  242. if campaign_start_time is not None:
  243. campaign.campaign_start_date = campaign_start_time
  244. if campaign_end_time is not None:
  245. campaign.campaign_end_date = campaign_end_time
  246. if campaign_show_stime is not None:
  247. campaign.campaign_show_stime = campaign_show_stime
  248. if campaign_show_etime is not None:
  249. campaign.campaign_show_etime = campaign_show_etime
  250. # 更新多对多字段 - 设备类型
  251. if device_type_names:
  252. device_types = DeviceTypeModel.objects.filter(name__in=device_type_names)
  253. campaign.device_type.set(device_types)
  254. # 更新多对多字段 - 国家/地区
  255. if country_name_list:
  256. countries = CountryModel.objects.filter(country_name__in=country_name_list)
  257. campaign.country.set(countries)
  258. campaign.update_time = update_time
  259. # 保存更新
  260. campaign.save()
  261. except Exception as e:
  262. return response.json(177)
  263. return response.json(0)
  264. def switch_campaign(self, request_dict, response):
  265. campaign_id = request_dict.get('id')
  266. status = request_dict.get('status')
  267. if not campaign_id:
  268. return response.json(444)
  269. try:
  270. AppAdvertiseCampaign.objects.filter(pk=campaign_id).update(status=status, update_time=int(time.time()))
  271. return response.json(0)
  272. except Exception as e:
  273. return response.json(444)
  274. def delete_campaign(self, request_dict, response):
  275. campaign_id = request_dict.get('id')
  276. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  277. regin = 0
  278. AWS_SES_ACCESS_REGION = "cn-northwest-1"
  279. else:
  280. regin = 1
  281. AWS_SES_ACCESS_REGION = 'us-east-1'
  282. if not campaign_id:
  283. return response.json(444)
  284. try:
  285. campaign = AppAdvertiseCampaign.objects.get(pk=campaign_id)
  286. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[regin], AWS_SECRET_ACCESS_KEY[regin], AWS_SES_ACCESS_REGION)
  287. bucket_name = 'ansjerfilemanager'
  288. if campaign.image_url:
  289. s3.delete_obj(bucket_name, f"app/campaign/{campaign.image_url}")
  290. # 清除多对多关系
  291. campaign.device_type.clear()
  292. campaign.country.clear()
  293. # 保留在广告表中
  294. campaign.status = 2
  295. campaign.update_time = int(time.time())
  296. campaign.save()
  297. return response.json(0)
  298. except Exception as e:
  299. return response.json(176)
  300. def get_timezone_offset(self, tz):
  301. """
  302. 将 "+8:00" 格式的时区字符串转换为包含分钟偏移的时区。
  303. """
  304. sign = tz[0] # " " 或 "-"
  305. hours, minutes = map(int, tz[1:].split('.')) # 分离小时和分钟
  306. # 计算总分钟数
  307. total_minutes = hours * 60 + minutes
  308. if sign == '-':
  309. total_minutes = -total_minutes
  310. # 使用 pytz.FixedOffset 创建时区
  311. return pytz.FixedOffset(total_minutes)
  312. def app_get_campaigns(cls, request_dict):
  313. """
  314. APP获取广告活动列表
  315. @param request_dict: 请求参数
  316. @param response: 响应对象
  317. @return: 响应对象
  318. """
  319. language = request_dict.get('language', 'en')
  320. tz = request_dict.get('tz', '+0:00')
  321. token = request_dict.get('token', None)
  322. response = ResponseObject(language)
  323. if not token:
  324. return response.json(444)
  325. token = TokenObject(token)
  326. if token.code != 0:
  327. return response.json(token.code)
  328. user_id = token.userID
  329. if SERVER_TYPE == 'Ansjer.cn_config.formal_settings' or SERVER_TYPE == 'Ansjer.cn_config.test_settings':
  330. s3_url = "https://ansjerfilemanager.s3.cn-northwest-1.amazonaws.com.cn/app/campaign/"
  331. else:
  332. s3_url = "https://ansjerfilemanager.s3.amazonaws.com/app/campaign/"
  333. # 当日时间戳区间获取
  334. timezone = cls.get_timezone_offset(tz)
  335. current_date = datetime.now().date()
  336. start_of_day = datetime.combine(current_date, Time.min)
  337. end_of_day = datetime.combine(current_date, Time.max)
  338. start_timestamp = int(start_of_day.timestamp())
  339. end_timestamp = int(end_of_day.timestamp())
  340. open_screen_campaign_qs = OpenScreenCampaign.objects.filter(
  341. user_id=user_id,
  342. create_time__gt=start_timestamp,
  343. create_time__lt=end_timestamp
  344. )
  345. if not open_screen_campaign_qs.exists():
  346. OpenScreenCampaign.objects.create(user_id=user_id,
  347. update_time=int(time.time()),
  348. create_time=int(time.time()))
  349. try:
  350. country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('id'), to_attr='country_list')
  351. device_type_prefetch = Prefetch('device_type', queryset=DeviceTypeModel.objects.only('type'),
  352. to_attr='device_type_list')
  353. app_advertise_campaign_qs = AppAdvertiseCampaign.objects.prefetch_related(country_prefetch,
  354. device_type_prefetch)
  355. device_info_qs = Device_User.objects.filter(userID=user_id).values("region_country").first()
  356. country_id = device_info_qs.get('region_country')
  357. if country_id != 0:
  358. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(country__id=country_id, status=1)
  359. else:
  360. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(status=1, unknown_country=1)
  361. # 返回 广告名称、广告类型、开始时间、结束时间、广告图片、活动链接
  362. campaigns_list = []
  363. for campaign in app_advertise_campaign_qs:
  364. # campaign_end_date = (datetime.utcfromtimestamp(campaign.campaign_end_date) # 日期版本
  365. # .replace(tzinfo=pytz.utc).astimezone(timezone).strftime('%Y-%m-%d'))
  366. # 日期范围
  367. campaigns_start_date = datetime.fromtimestamp(campaign.campaign_start_date, pytz.utc).astimezone(
  368. timezone).replace(hour=0, minute=0, second=0, microsecond=0).timestamp() # 时间戳版本
  369. campaign_end_date = datetime.fromtimestamp(campaign.campaign_end_date, pytz.utc).astimezone(
  370. timezone).replace(hour=0, minute=0, second=0, microsecond=0).timestamp() # 时间戳版本
  371. # 时间范围
  372. campaign_start_firstday = sum(int(x) * 60 ** i for i, x in enumerate(reversed(
  373. datetime.utcfromtimestamp(campaign.campaign_start_date + campaign.campaign_show_stime).replace(
  374. tzinfo=pytz.utc).astimezone(timezone).strftime('%H:%M').split(':')))) * 60 # 秒数版本
  375. campaign_end_firstday = sum(int(x) * 60 ** i for i, x in enumerate(reversed(
  376. datetime.utcfromtimestamp(campaign.campaign_start_date + campaign.campaign_show_etime).replace(
  377. tzinfo=pytz.utc).astimezone(timezone).strftime('%H:%M').split(':')))) * 60 # 秒数版本
  378. # campaign_end_firstday = (
  379. # datetime.utcfromtimestamp(campaign.campaign_start_date + campaign.campaign_show_etime)
  380. # .replace(tzinfo=pytz.utc).astimezone(timezone).strftime('%H:%M')) # 时间版本
  381. campaigns_list.append({
  382. 'campaign_id': campaign.id,
  383. 'image_url': s3_url + campaign.image_url,
  384. 'campaign_url': campaign.campaign_url,
  385. 'campaign_name': campaign.campaign_name,
  386. 'campaign_type': campaign.campaign_type,
  387. 'start_date': campaigns_start_date,
  388. 'end_date': campaign_end_date,
  389. 'start_time': campaign_start_firstday,
  390. 'end_time': campaign_end_firstday,
  391. 'device_types': [device.type for device in campaign.device_type_list],
  392. })
  393. return response.json(0, {
  394. 'interval_time': 86400,
  395. 'campaigns': campaigns_list
  396. })
  397. except Exception as e:
  398. return response.json(173)
  399. def record_user_behavior(cls, request_dict):
  400. """
  401. 记录用户行为
  402. @param request_dict: 请求参数
  403. @param response: 响应对象
  404. @return: 响应对象
  405. """
  406. language = request_dict.get('language', 'en')
  407. status = request_dict.get('status', None) # 1.未跳过 2.已跳过 3.点击广告
  408. campaign_id = request_dict.get('campaign_id', None)
  409. token = request_dict.get('token', None)
  410. response = ResponseObject(language)
  411. if not token:
  412. return response.json(444)
  413. token = TokenObject(token)
  414. if token.code != 0:
  415. return response.json(token.code)
  416. user_id = token.userID
  417. if not all([status, campaign_id]):
  418. return response.json(444)
  419. # 当日时间戳区间获取
  420. current_date = datetime.now().date()
  421. start_of_day = datetime.combine(current_date, Time.min)
  422. end_of_day = datetime.combine(current_date, Time.max)
  423. start_timestamp = int(start_of_day.timestamp())
  424. end_timestamp = int(end_of_day.timestamp())
  425. try:
  426. # 筛选符合条件的记录
  427. open_screen_campaigns = OpenScreenCampaign.objects.filter(
  428. user_id=user_id,
  429. create_time__gt=start_timestamp,
  430. create_time__lt=end_timestamp,
  431. status=0,
  432. )
  433. # 检查是否存在记录
  434. if not open_screen_campaigns.exists():
  435. # 如果不存在,则创建新记录
  436. OpenScreenCampaign.objects.create(
  437. user_id=user_id,
  438. status=status,
  439. campaign_id_id=campaign_id,
  440. create_time=int(time.time()),
  441. update_time=int(time.time())
  442. )
  443. else:
  444. # 如果存在,则更新最新的记录
  445. latest_campaign = open_screen_campaigns.latest("create_time")
  446. latest_campaign.status = status
  447. latest_campaign.campaign_id_id = campaign_id
  448. latest_campaign.update_time = int(time.time())
  449. latest_campaign.save()
  450. except Exception as e:
  451. return response.json(177, {'error': '更新错误'})
  452. return response.json(0)
  453. def get_user_behavior_log(self, request_dict, response):
  454. campaign_ids = request_dict.get('campaign_ids', None)
  455. start_time = request_dict.get('start_time', None)
  456. end_time = request_dict.get('end_time', None)
  457. if not all([start_time, end_time]):
  458. return response.json(444)
  459. try:
  460. open_screen_campaign_qs = OpenScreenCampaign.objects.filter(update_time__range=[int(start_time), int(end_time)])
  461. if campaign_ids is not None:
  462. open_screen_campaign_qs = open_screen_campaign_qs.filter(
  463. Q(campaign_id_id__isnull=True) | Q(campaign_id_id__in=json.loads(campaign_ids)))
  464. open_screen_campaign_qs = open_screen_campaign_qs.select_related('campaign_id').annotate(
  465. campaign_name=F('campaign_id__campaign_name'),
  466. campaign_type=F('campaign_id__campaign_type'),
  467. campaign_status=F('campaign_id__status'),
  468. start_date=F('campaign_id__campaign_start_date'),
  469. end_date=F('campaign_id__campaign_end_date'),
  470. start_time=F('campaign_id__campaign_show_stime'),
  471. end_time=F('campaign_id__campaign_show_etime')
  472. ).values('id', 'user_id', 'status', 'update_time', 'create_time', 'campaign_id', 'campaign_name',
  473. 'campaign_type', 'campaign_status', 'start_date', 'end_date', 'start_time', 'end_time')
  474. if not open_screen_campaign_qs.exists():
  475. return response.json(0, {'list': []})
  476. campaigns_list = list(open_screen_campaign_qs)
  477. return response.json(0, {'list': campaigns_list})
  478. except Exception as e:
  479. return response.json(173)
  480. def get_country_list(self, response):
  481. try:
  482. if SERVER_TYPE == 'Ansjer.us_config.formal_settings':
  483. region_api = 'https://www.dvema.com/'
  484. elif SERVER_TYPE == 'Ansjer.eur_config.formal_settings':
  485. region_api = 'https://api.zositeche.com/'
  486. elif SERVER_TYPE == 'Ansjer.cn_config.formal_settings':
  487. region_api = 'https://www.zositechc.cn/'
  488. else:
  489. region_api = 'https://test.zositechc.cn/'
  490. country_qs = CountryModel.objects.filter(region__api=region_api).values('country_name')
  491. if not country_qs.exists():
  492. return response.json(173)
  493. country_list = []
  494. for country in country_qs:
  495. country_list.append(country['country_name'])
  496. return response.json(0, {'list': country_list})
  497. except Exception as e:
  498. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))