AppCampaignController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. import time
  2. import pytz
  3. import json
  4. from datetime import datetime
  5. from Model.models import AppAdvertiseCampaign, DeviceTypeModel, CountryModel
  6. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
  7. AWS_SES_ACCESS_REGION, UNUSED_SERIAL_REDIS_LIST
  8. from django.core.paginator import Paginator
  9. from django.views import View
  10. from django.db.models import Prefetch
  11. from django.utils import timezone
  12. from Object.AWS.AmazonS3Util import AmazonS3Util
  13. from Object.ResponseObject import ResponseObject
  14. class AppCampaignView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. request_dict = request.GET
  19. return self.validation(request_dict, request, operation)
  20. def post(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. request_dict = request.POST
  24. return self.validation(request_dict, request, operation)
  25. def validation(self, request_dict, request, operation):
  26. language = request_dict.get('language', 'en')
  27. response = ResponseObject(language, 'pc')
  28. if operation == 'getCampaignList': # 获取广告活动列表
  29. return self.get_campaign_list(request_dict, response)
  30. elif operation == 'addCampaign': # 添加广告活动
  31. return self.add_campaign(request, request_dict, response)
  32. elif operation == 'updateCampaign': # 更新广告活动
  33. return self.update_campaign(request, request_dict, response)
  34. elif operation == 'deleteCampaign': # 删除广告活动
  35. return self.delete_campaign(request_dict, response)
  36. elif operation == 'switchCampaign': # 广告活动开关
  37. return self.switch_campaign(request_dict, response)
  38. elif operation == 'recordUserBehavior':
  39. return self.record_user_behavior(request_dict, response)
  40. elif operation == 'appGetCampaigns':
  41. return self.app_get_campaigns(request_dict, response)
  42. else:
  43. return response.json(404)
  44. def get_campaign_list(self, request_dict, response):
  45. """
  46. 查询广告活动列表
  47. @param request_dict: 请求参数
  48. @param response: 响应对象
  49. @return: 响应对象包含广告活动列表
  50. """
  51. campaign_name = request_dict.get('campaign_name', None)
  52. campaign_country = request_dict.get('campaign_country', None)
  53. status = request_dict.get('status', None)
  54. pageNo = request_dict.get('pageNo', 1)
  55. pageSize = request_dict.get('pageSize', 20)
  56. # 连接并获取国家和设备类型
  57. country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('country_name'), to_attr='country_list')
  58. device_type_prefetch = Prefetch('device_type', queryset=DeviceTypeModel.objects.only('name'), to_attr='device_type_list')
  59. app_advertise_campaign_qs = AppAdvertiseCampaign.objects.prefetch_related(country_prefetch, device_type_prefetch)
  60. # 过滤
  61. if campaign_name:
  62. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(campaign_name=campaign_name)
  63. if status:
  64. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(status=status)
  65. if campaign_country:
  66. campaign_country_list = campaign_country.split(',')
  67. app_advertise_campaign_qs = app_advertise_campaign_qs.filter(country__country_name__in=campaign_country_list)
  68. # 分页
  69. paginator = Paginator(app_advertise_campaign_qs.order_by('id'), pageSize)
  70. campaigns = paginator.page(pageNo)
  71. # Construct response data with country names and device types
  72. campaign_list = []
  73. for campaign in campaigns.object_list:
  74. campaign_data = {
  75. 'id': campaign.id,
  76. 'image_url': 'https://ansjerfilemanager.s3.amazonaws.com/app/campaign/' + campaign.image_url,
  77. 'campaign_name': campaign.campaign_name,
  78. 'campaign_url': campaign.campaign_url,
  79. 'campaign_type': campaign.campaign_type,
  80. 'status': campaign.status,
  81. 'campaign_start_date': campaign.campaign_start_date,
  82. 'campaign_end_date': campaign.campaign_end_date,
  83. 'campaign_show_stime': campaign.campaign_show_stime,
  84. 'campaign_show_etime': campaign.campaign_show_etime,
  85. 'countries': str([country.country_name for country in campaign.country_list]),
  86. 'device_types': str([device.name for device in campaign.device_type_list]),
  87. }
  88. campaign_list.append(campaign_data)
  89. data = {
  90. 'list': campaign_list,
  91. 'total': paginator.count,
  92. }
  93. return response.json(0, data)
  94. def add_campaign(self, request, request_dict, response):
  95. """
  96. 添加新的广告活动
  97. @param request_dict: 包含所有请求参数的字典
  98. @param response: 响应对象
  99. @return: 响应对象
  100. """
  101. file = request.FILES.get('posterFile', None)
  102. campaign_name = request_dict.get('campaign_name', None)
  103. campaign_url = request_dict.get('campaign_url', None)
  104. campaign_type = request_dict.get('campaign_type', None)
  105. device_type_names = json.loads(request_dict.get('device_type_list', None)) # 设备类型名称列表
  106. country_name_list = json.loads(request_dict.get('country_name_list', None)) # 地区列表
  107. campaign_start_time = request_dict.get('campaign_start_time', None)
  108. campaign_end_time = request_dict.get('campaign_end_time', None)
  109. campaign_show_stime = request_dict.get('campaign_show_stime', 0)
  110. campaign_show_etime = request_dict.get('campaign_show_etime', 86400)
  111. if not all([campaign_name, campaign_type, device_type_names, campaign_url,
  112. country_name_list, campaign_start_time, campaign_end_time, file]):
  113. return response.json(444)
  114. fileName = file.name
  115. try:
  116. # 保存图片到存储桶
  117. bucket_name = 'ansjerfilemanager'
  118. file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(fileName)
  119. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
  120. # 地址:https://ansjerfilemanager.s3.amazonaws.com/app/campaign/OpenScreenAdvertise/XXX.jpg
  121. s3.upload_file_obj(
  122. bucket_name,
  123. file_key,
  124. file,
  125. {'ContentType': file.content_type, 'ACL': 'public-read'})
  126. # 创建 AppAdvertiseCampaign 实例
  127. new_campaign = AppAdvertiseCampaign.objects.create(
  128. image_url="OpenScreenAdvertise/" + fileName,
  129. campaign_name=campaign_name,
  130. campaign_url=campaign_url,
  131. campaign_type=campaign_type,
  132. status=1,
  133. campaign_start_date=campaign_start_time,
  134. campaign_end_date=campaign_end_time,
  135. campaign_show_stime=campaign_show_stime,
  136. campaign_show_etime=campaign_show_etime,
  137. create_time=int(time.time()),
  138. update_time=int(time.time()),
  139. )
  140. # 根据名称查找 DeviceTypeModel 的实例并建立关系
  141. device_type_instances = DeviceTypeModel.objects.filter(name__in=device_type_names)
  142. for device_type_instance in device_type_instances:
  143. new_campaign.device_type.add(device_type_instance)
  144. # 根据 ID 关联 CountryModel 实例
  145. country_instances = CountryModel.objects.filter(country_name__in=country_name_list)
  146. for country_instance in country_instances:
  147. new_campaign.country.add(country_instance)
  148. except Exception as e:
  149. return response.json(174)
  150. return response.json(0)
  151. def update_campaign(self, request, request_dict, response):
  152. campaign_id = request_dict.get('id', None)
  153. file = request.FILES.get('posterFile', None)
  154. campaign_name = request_dict.get('campaign_name', None)
  155. campaign_url = request_dict.get('campaign_url', None)
  156. campaign_type = request_dict.get('campaign_type', None)
  157. device_type_names = json.loads(request_dict.get('device_type_list', None)) # 设备类型名称列表
  158. country_name_list = json.loads(request_dict.get('country_name_list', None)) # 地区列表
  159. campaign_start_time = request_dict.get('campaign_start_time', None)
  160. campaign_end_time = request_dict.get('campaign_end_time', None)
  161. campaign_show_stime = request_dict.get('campaign_show_stime', None)
  162. campaign_show_etime = request_dict.get('campaign_show_etime', None)
  163. if not campaign_id:
  164. return response.json(444)
  165. try:
  166. campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
  167. if file is not None:
  168. # 删除存储桶原来的图片
  169. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
  170. bucket_name = 'ansjerfilemanager'
  171. if campaign.image_url:
  172. old_file_key = campaign.image_url.split('/')[-1]
  173. s3.delete_obj(bucket_name, old_file_key)
  174. # 添加新的图片
  175. file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(file.name)
  176. s3.upload_file_obj(
  177. bucket_name,
  178. file_key,
  179. file,
  180. {'ContentType': file.content_type, 'ACL': 'public-read'}
  181. )
  182. campaign.image_url = "OpenScreenAdvertise/" + file.name
  183. if campaign_name is not None:
  184. campaign.campaign_name = campaign_name
  185. if campaign_url is not None:
  186. campaign.campaign_url = campaign_url
  187. if campaign_type is not None:
  188. campaign.campaign_type = campaign_type
  189. if campaign_start_time is not None:
  190. campaign.campaign_start_date = campaign_start_time
  191. if campaign_end_time is not None:
  192. campaign.campaign_end_date = campaign_end_time
  193. if campaign_show_stime is not None:
  194. campaign.campaign_show_stime = campaign_show_stime
  195. if campaign_show_etime is not None:
  196. campaign.campaign_show_etime = campaign_show_etime
  197. # 更新多对多字段 - 设备类型
  198. if device_type_names:
  199. device_types = DeviceTypeModel.objects.filter(name__in=device_type_names)
  200. campaign.device_type.set(device_types)
  201. # 更新多对多字段 - 国家/地区
  202. if country_name_list:
  203. countries = CountryModel.objects.filter(country_name__in=country_name_list)
  204. campaign.country.set(countries)
  205. campaign.update_time = int(time.time())
  206. # 保存更新
  207. campaign.save()
  208. except Exception as e:
  209. return response.json(177)
  210. return response.json(0)
  211. def switch_campaign(self, request_dict, response):
  212. campaign_id = request_dict.get('id')
  213. status = request_dict.get('status')
  214. if not campaign_id:
  215. return response.json(444)
  216. try:
  217. campaign = AppAdvertiseCampaign.objects.get(pk=campaign_id)
  218. # 更新字段
  219. campaign.status = status
  220. campaign.update_time = int(time.time())
  221. # 保存更改
  222. campaign.save()
  223. return response.json(0)
  224. except Exception as e:
  225. return response.json(444)
  226. def delete_campaign(self, request_dict, response):
  227. campaign_id = request_dict.get('id')
  228. if not campaign_id:
  229. return response.json(444)
  230. try:
  231. campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
  232. campaign.device_type.clear()
  233. campaign.country.clear()
  234. campaign.delete()
  235. return response.json(0)
  236. except Exception as e:
  237. return response.json(444)
  238. def app_get_campaigns(self, request_dict, response):
  239. """
  240. APP获取广告活动列表
  241. @param request_dict: 请求参数
  242. @param response: 响应对象
  243. @return: 响应对象
  244. """
  245. user_regin = request_dict.get('user_regin','china')
  246. user_timezone = request_dict.get('user_timezone','America/New_York')
  247. # 通过地区查询数据
  248. app_advertise_campaign_qs = AppAdvertiseCampaign.objects.filter(
  249. campaign_region=user_regin,
  250. campaign_status=1,
  251. ).values('image_url', 'campaign_name', 'campaign_type', 'campaign_start_time', 'campaign_end_time')
  252. #返回 图片、开始时间、结束时间、广告名称、广告类型
  253. user_tz = pytz.timezone(user_timezone)
  254. campaigns_list = []
  255. # 调整时区返回时间
  256. for campaign in app_advertise_campaign_qs:
  257. # 将时间戳转换为UTC的datetime对象
  258. start_utc_time = datetime.utcfromtimestamp(int(campaign['campaign_start_time'])).replace(tzinfo=pytz.utc)
  259. end_utc_time = datetime.utcfromtimestamp(int(campaign['campaign_end_time'])).replace(tzinfo=pytz.utc)
  260. # 将UTC时间转换为用户的时区
  261. campaign['campaign_start_time'] = start_utc_time.astimezone(user_tz).strftime('%Y-%m-%d %H:%M:%S')
  262. campaign['campaign_end_time'] = end_utc_time.astimezone(user_tz).strftime('%Y-%m-%d %H:%M:%S')
  263. campaigns_list.append(campaign)
  264. return response.json(0,{
  265. 'campaigns': campaigns_list
  266. })
  267. def record_user_behavior(self, request_dict, response):
  268. """
  269. 记录用户行为
  270. @param request_dict: 请求参数
  271. @param response: 响应对象
  272. @return: 响应对象
  273. """
  274. pass