فهرست منبع

新增未知地区以及亚马逊存储桶保存逻辑

linhaohong 1 سال پیش
والد
کامیت
7a358a3606
2فایلهای تغییر یافته به همراه50 افزوده شده و 27 حذف شده
  1. 49 27
      Controller/AppCampaignController.py
  2. 1 0
      Model/models.py

+ 49 - 27
Controller/AppCampaignController.py

@@ -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,{

+ 1 - 0
Model/models.py

@@ -4471,6 +4471,7 @@ class AppAdvertiseCampaign(models.Model):
     device_type = models.ManyToManyField(to="DeviceTypeModel", verbose_name='设备类型')
     status = models.SmallIntegerField(default=0, verbose_name='广告状态')  # 0:关闭 1:开启 2:删除
     country = models.ManyToManyField(to="CountryModel", verbose_name='广告地区')
+    unknown_country = models.SmallIntegerField(default=0, verbose_name='未知地区')  # 0表示不包括 1表示包括
     campaign_start_date = models.IntegerField(default=0, verbose_name='广告开始日期')
     campaign_end_date = models.IntegerField(default=0, verbose_name='广告结束日期')
     campaign_show_stime = models.IntegerField(default=0, verbose_name='当天广告起始时间')