|
@@ -10,7 +10,7 @@ from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_
|
|
|
from django.core.paginator import Paginator
|
|
|
from django.views import View
|
|
|
from django.db.models import Prefetch
|
|
|
-from django.utils import timezone
|
|
|
+from django.db.models import Q
|
|
|
|
|
|
from Object.AWS.AmazonS3Util import AmazonS3Util
|
|
|
from Object.ResponseObject import ResponseObject
|
|
@@ -60,6 +60,7 @@ class AppCampaignView(View):
|
|
|
status = request_dict.get('status', None)
|
|
|
pageNo = request_dict.get('pageNo', 1)
|
|
|
pageSize = request_dict.get('pageSize', 20)
|
|
|
+ unknown_country = 0
|
|
|
|
|
|
# 连接并获取国家和设备类型
|
|
|
country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('country_name'), to_attr='country_list')
|
|
@@ -73,8 +74,9 @@ class AppCampaignView(View):
|
|
|
app_advertise_campaign_qs = app_advertise_campaign_qs.filter(status=status)
|
|
|
if campaign_country:
|
|
|
campaign_country_list = campaign_country.split(',')
|
|
|
- app_advertise_campaign_qs = app_advertise_campaign_qs.filter(country__country_name__in=campaign_country_list)
|
|
|
-
|
|
|
+ if "未知地区" in campaign_country_list:
|
|
|
+ unknown_country = 1
|
|
|
+ app_advertise_campaign_qs = app_advertise_campaign_qs.filter(Q(country__country_name__in=campaign_country_list) | Q(unknown_country=unknown_country)).distinct()
|
|
|
# 分页
|
|
|
paginator = Paginator(app_advertise_campaign_qs.order_by('id'), pageSize)
|
|
|
campaigns = paginator.page(pageNo)
|
|
@@ -82,6 +84,15 @@ class AppCampaignView(View):
|
|
|
# Construct response data with country names and device types
|
|
|
campaign_list = []
|
|
|
for campaign in campaigns.object_list:
|
|
|
+ if campaign.unknown_country == 0:
|
|
|
+ countries = ",".join([country.country_name for country in campaign.country_list])
|
|
|
+ else:
|
|
|
+ country_list = campaign.country_list
|
|
|
+ country_names = []
|
|
|
+ for country in country_list:
|
|
|
+ country_names.append(country.country_name)
|
|
|
+ country_names.append("未知地区")
|
|
|
+ countries = ",".join(country_names)
|
|
|
campaign_data = {
|
|
|
'id': campaign.id,
|
|
|
'image_url': 'https://ansjerfilemanager.s3.amazonaws.com/app/campaign/' + campaign.image_url,
|
|
@@ -93,7 +104,7 @@ class AppCampaignView(View):
|
|
|
'campaign_end_date': campaign.campaign_end_date,
|
|
|
'campaign_show_stime': campaign.campaign_show_stime,
|
|
|
'campaign_show_etime': campaign.campaign_show_etime,
|
|
|
- 'countries': ",".join([country.country_name for country in campaign.country_list]),
|
|
|
+ 'countries': countries,
|
|
|
'device_types': ",".join([device.name for device in campaign.device_type_list]),
|
|
|
}
|
|
|
campaign_list.append(campaign_data)
|
|
@@ -127,11 +138,19 @@ class AppCampaignView(View):
|
|
|
country_name_list, campaign_start_time, campaign_end_time, file]):
|
|
|
return response.json(444)
|
|
|
|
|
|
+ # 针对特殊地区的处理,写的确实烂,别骂了
|
|
|
+ unknown_country = 0
|
|
|
+ if "未知地区" in country_name_list:
|
|
|
+ unknown_country = 1
|
|
|
+ country_name_list.remove("未知地区")
|
|
|
+
|
|
|
fileName = file.name
|
|
|
try:
|
|
|
+ create_time = int(time.time())
|
|
|
+ update_time = int(time.time())
|
|
|
# 保存图片到存储桶
|
|
|
bucket_name = 'ansjerfilemanager'
|
|
|
- file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(fileName)
|
|
|
+ file_key = f'app/campaign/OpenScreenAdvertise/{update_time}_{fileName}'
|
|
|
s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
|
|
|
# 地址:https://ansjerfilemanager.s3.amazonaws.com/app/campaign/OpenScreenAdvertise/XXX.jpg
|
|
|
s3.upload_file_obj(
|
|
@@ -139,20 +158,20 @@ class AppCampaignView(View):
|
|
|
file_key,
|
|
|
file,
|
|
|
{'ContentType': file.content_type, 'ACL': 'public-read'})
|
|
|
-
|
|
|
# 创建 AppAdvertiseCampaign 实例
|
|
|
new_campaign = AppAdvertiseCampaign.objects.create(
|
|
|
- image_url="OpenScreenAdvertise/" + fileName,
|
|
|
+ image_url=f"OpenScreenAdvertise/{update_time}_{fileName}",
|
|
|
campaign_name=campaign_name,
|
|
|
campaign_url=campaign_url,
|
|
|
campaign_type=campaign_type,
|
|
|
status=1,
|
|
|
+ unknown_country=unknown_country,
|
|
|
campaign_start_date=campaign_start_time,
|
|
|
campaign_end_date=campaign_end_time,
|
|
|
campaign_show_stime=campaign_show_stime,
|
|
|
campaign_show_etime=campaign_show_etime,
|
|
|
- create_time=int(time.time()),
|
|
|
- update_time=int(time.time()),
|
|
|
+ create_time=create_time,
|
|
|
+ update_time=update_time,
|
|
|
)
|
|
|
|
|
|
# 根据名称查找 DeviceTypeModel 的实例并建立关系
|
|
@@ -184,8 +203,16 @@ class AppCampaignView(View):
|
|
|
campaign_show_etime = request_dict.get('campaign_show_etime', None)
|
|
|
if not campaign_id:
|
|
|
return response.json(444)
|
|
|
+
|
|
|
try:
|
|
|
+ update_time = int(time.time())
|
|
|
campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
|
|
|
+ if country_name_list is not None:
|
|
|
+ if "未知地区" in country_name_list:
|
|
|
+ campaign.unknown_country = 1
|
|
|
+ country_name_list.remove("未知地区")
|
|
|
+ else:
|
|
|
+ campaign.unknown_country = 0
|
|
|
if file is not None:
|
|
|
# 删除存储桶原来的图片
|
|
|
s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
|
|
@@ -194,14 +221,14 @@ class AppCampaignView(View):
|
|
|
old_file_key = campaign.image_url.split('/')[-1]
|
|
|
s3.delete_obj(bucket_name, old_file_key)
|
|
|
# 添加新的图片
|
|
|
- file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(file.name)
|
|
|
+ file_key = f'app/campaign/OpenScreenAdvertise/{update_time}_{file.name}'
|
|
|
s3.upload_file_obj(
|
|
|
bucket_name,
|
|
|
file_key,
|
|
|
file,
|
|
|
{'ContentType': file.content_type, 'ACL': 'public-read'}
|
|
|
)
|
|
|
- campaign.image_url = "OpenScreenAdvertise/" + file.name
|
|
|
+ campaign.image_url = f'OpenScreenAdvertise/{update_time}_{file.name}'
|
|
|
if campaign_name is not None:
|
|
|
campaign.campaign_name = campaign_name
|
|
|
if campaign_url is not None:
|
|
@@ -227,7 +254,7 @@ class AppCampaignView(View):
|
|
|
countries = CountryModel.objects.filter(country_name__in=country_name_list)
|
|
|
campaign.country.set(countries)
|
|
|
|
|
|
- campaign.update_time = int(time.time())
|
|
|
+ campaign.update_time = update_time
|
|
|
|
|
|
# 保存更新
|
|
|
campaign.save()
|
|
@@ -272,17 +299,17 @@ class AppCampaignView(View):
|
|
|
@param response: 响应对象
|
|
|
@return: 响应对象
|
|
|
"""
|
|
|
- user_regin = request_dict.get('user_regin','china')
|
|
|
- user_timezone = request_dict.get('user_timezone','America/New_York')
|
|
|
-
|
|
|
- # 通过地区查询数据
|
|
|
- app_advertise_campaign_qs = AppAdvertiseCampaign.objects.filter(
|
|
|
- campaign_region=user_regin,
|
|
|
- campaign_status=1,
|
|
|
- ).values('image_url', 'campaign_name', 'campaign_type', 'campaign_start_time', 'campaign_end_time')
|
|
|
+ tz = request_dict.get('时区','tz')
|
|
|
|
|
|
- #返回 图片、开始时间、结束时间、广告名称、广告类型
|
|
|
- user_tz = pytz.timezone(user_timezone)
|
|
|
+ country_prefetch = Prefetch('country', queryset=CountryModel.objects.only('country_name'), to_attr='country_list')
|
|
|
+ device_type_prefetch = Prefetch('device_type', queryset=DeviceTypeModel.objects.only('name'), to_attr='device_type_list')
|
|
|
+ app_advertise_campaign_qs = AppAdvertiseCampaign.objects.prefetch_related(country_prefetch, device_type_prefetch)
|
|
|
+ app_advertise_campaign_qs = (app_advertise_campaign_qs.objects.filter(status=1,)
|
|
|
+ .values('image_url', 'campaign_name', 'campaign_type',
|
|
|
+ 'campaign_start_time', 'campaign_end_time',
|
|
|
+ 'campaign_show_stime', 'campaign_show_etime',
|
|
|
+ ))
|
|
|
+ #返回 广告名称、广告类型、开始时间、结束时间、广告图片、活动链接
|
|
|
campaigns_list = []
|
|
|
|
|
|
# 调整时区返回时间
|
|
@@ -290,11 +317,6 @@ class AppCampaignView(View):
|
|
|
# 将时间戳转换为UTC的datetime对象
|
|
|
start_utc_time = datetime.utcfromtimestamp(int(campaign['campaign_start_time'])).replace(tzinfo=pytz.utc)
|
|
|
end_utc_time = datetime.utcfromtimestamp(int(campaign['campaign_end_time'])).replace(tzinfo=pytz.utc)
|
|
|
-
|
|
|
- # 将UTC时间转换为用户的时区
|
|
|
- campaign['campaign_start_time'] = start_utc_time.astimezone(user_tz).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
- campaign['campaign_end_time'] = end_utc_time.astimezone(user_tz).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
-
|
|
|
campaigns_list.append(campaign)
|
|
|
|
|
|
return response.json(0,{
|