linhaohong преди 1 година
родител
ревизия
7eb9f785c0
променени са 2 файла, в които са добавени 341 реда и са изтрити 0 реда
  1. 322 0
      Controller/AppCampaignController.py
  2. 19 0
      Model/models.py

+ 322 - 0
Controller/AppCampaignController.py

@@ -0,0 +1,322 @@
+import time
+import pytz
+import json
+from datetime import datetime
+
+from Model.models import AppAdvertiseCampaign, DeviceTypeModel, CountryModel
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
+    AWS_SES_ACCESS_REGION, UNUSED_SERIAL_REDIS_LIST
+
+from django.core.paginator import Paginator
+from django.views import View
+from django.db.models import Prefetch
+from django.utils import timezone
+
+from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.ResponseObject import ResponseObject
+
+class AppCampaignView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.GET
+        return self.validation(request_dict, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.POST
+        return self.validation(request_dict, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        if operation == 'getCampaignList':  # 获取广告活动列表
+            return self.get_campaign_list(request_dict, response)
+        elif operation == 'addCampaign': # 添加广告活动
+            return self.add_campaign(request, request_dict, response)
+        elif operation == 'updateCampaign': # 更新广告活动
+            return self.update_campaign(request, request_dict, response)
+        elif operation == 'deleteCampaign': # 删除广告活动
+            return self.delete_campaign(request_dict, response)
+        elif operation == 'switchCampaign': # 广告活动开关
+            return self.switch_campaign(request_dict, response)
+        elif operation == 'recordUserBehavior':
+            return self.record_user_behavior(request_dict, response)
+        elif operation == 'appGetCampaigns':
+            return self.app_get_campaigns(request_dict, response)
+        else:
+            return response.json(404)
+
+    def get_campaign_list(self, request_dict, response):
+        """
+        查询广告活动列表
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @return: 响应对象包含广告活动列表
+        """
+        campaign_name = request_dict.get('campaign_name', None)
+        campaign_country = request_dict.get('campaign_country', None)
+        status = request_dict.get('status', None)
+        pageNo = request_dict.get('pageNo', 1)
+        pageSize = request_dict.get('pageSize', 20)
+
+        # 连接并获取国家和设备类型
+        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)
+
+        # 过滤
+        if campaign_name:
+            app_advertise_campaign_qs = app_advertise_campaign_qs.filter(campaign_name=campaign_name)
+        if status:
+            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)
+
+        # 分页
+        paginator = Paginator(app_advertise_campaign_qs.order_by('id'), pageSize)
+        campaigns = paginator.page(pageNo)
+
+        # Construct response data with country names and device types
+        campaign_list = []
+        for campaign in campaigns.object_list:
+            campaign_data = {
+                'id': campaign.id,
+                'image_url': 'https://ansjerfilemanager.s3.amazonaws.com/app/campaign/' + campaign.image_url,
+                'campaign_name': campaign.campaign_name,
+                'campaign_type': campaign.campaign_type,
+                'status': campaign.status,
+                'campaign_start_date': campaign.campaign_start_date,
+                'campaign_end_date': campaign.campaign_end_date,
+                'campaign_show_stime': campaign.campaign_show_stime,
+                'campaign_show_etime': campaign.campaign_show_etime,
+                'countries': [country.country_name for country in campaign.country_list],
+                'device_types': [device.name for device in campaign.device_type_list],
+            }
+            campaign_list.append(campaign_data)
+
+        data = {
+            'list': campaign_list,
+            'total': paginator.count,
+        }
+
+        return response.json(0, data)
+
+    def add_campaign(self, request, request_dict, response):
+        """
+        添加新的广告活动
+        @param request_dict: 包含所有请求参数的字典
+        @param response: 响应对象
+        @return: 响应对象
+        """
+        file = request.FILES.get('posterFile', None)
+        campaign_name = request_dict.get('campaign_name', None)
+        campaign_type = request_dict.get('campaign_type', None)
+        device_type_names = json.loads(request_dict.get('device_type_list', None))  # 设备类型名称列表
+        country_name_list = json.loads(request_dict.get('country_name_list', None))  # 地区列表
+        campaign_start_time = request_dict.get('campaign_start_time', None)
+        campaign_end_time = request_dict.get('campaign_end_time', None)
+        campaign_show_stime = request_dict.get('campaign_show_stime', 0)
+        campaign_show_etime = request_dict.get('campaign_show_etime', 86400)
+
+        if not all([campaign_name, campaign_type, device_type_names,
+                    country_name_list, campaign_start_time, campaign_end_time, file]):
+            return response.json(444)
+
+        fileName = file.name
+        try:
+            # 保存图片到存储桶
+            bucket_name = 'ansjerfilemanager'
+            file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(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(
+                bucket_name,
+                file_key,
+                file,
+                {'ContentType': file.content_type, 'ACL': 'public-read'})
+
+            # 创建 AppAdvertiseCampaign 实例
+            new_campaign = AppAdvertiseCampaign.objects.create(
+                image_url="OpenScreenAdvertise/" + fileName,
+                campaign_name=campaign_name,
+                campaign_type=campaign_type,
+                status=1,
+                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()),
+            )
+
+            # 根据名称查找 DeviceTypeModel 的实例并建立关系
+            device_type_instances = DeviceTypeModel.objects.filter(name__in=device_type_names)
+            for device_type_instance in device_type_instances:
+                new_campaign.device_type.add(device_type_instance)
+
+            # 根据 ID 关联 CountryModel 实例
+            country_instances = CountryModel.objects.filter(country_name__in=country_name_list)
+            for country_instance in country_instances:
+                new_campaign.country.add(country_instance)
+
+        except Exception as e:
+            return response.json(174)
+
+        return response.json(0)
+
+    def update_campaign(self, request, request_dict, response):
+        campaign_id = request_dict.get('id', None)
+        file = request.FILES.get('posterFile', None)
+        campaign_name = request_dict.get('campaign_name', None)
+        campaign_type = request_dict.get('campaign_type', None)
+        device_type_names = json.loads(request_dict.get('device_type_list', None))  # 设备类型名称列表
+        country_name_list = json.loads(request_dict.get('country_name_list', None))  # 地区列表
+        campaign_start_time = request_dict.get('campaign_start_time', None)
+        campaign_end_time = request_dict.get('campaign_end_time', None)
+        campaign_show_stime = request_dict.get('campaign_show_stime', None)
+        campaign_show_etime = request_dict.get('campaign_show_etime', None)
+        if not campaign_id:
+            return response.json(444)
+        try:
+            campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
+            if file is not None:
+                # 删除存储桶原来的图片
+                s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
+                bucket_name = 'ansjerfilemanager'
+                if campaign.image_url:
+                    old_file_key = campaign.image_url.split('/')[-1]
+                    s3.delete_obj(bucket_name, old_file_key)
+                # 添加新的图片
+                file_key = 'app/campaign/OpenScreenAdvertise/{}'.format(file.name)
+                s3.upload_file_obj(
+                    bucket_name,
+                    file_key,
+                    file,
+                    {'ContentType': file.content_type, 'ACL': 'public-read'}
+                )
+                campaign.image_url = "OpenScreenAdvertise/" + file.name
+            if campaign_name is not None:
+                campaign.campaign_name = campaign_name
+            if campaign_type is not None:
+                campaign.campaign_type = campaign_type
+            if campaign_start_time is not None:
+                campaign.campaign_start_date = campaign_start_time
+            if campaign_end_time is not None:
+                campaign.campaign_end_date = campaign_end_time
+            if campaign_show_stime is not None:
+                campaign.campaign_show_stime = campaign_show_stime
+            if campaign_show_etime is not None:
+                campaign.campaign_show_etime = campaign_show_etime
+
+            # 更新多对多字段 - 设备类型
+            if device_type_names:
+                device_types = DeviceTypeModel.objects.filter(name__in=device_type_names)
+                campaign.device_type.set(device_types)
+
+            # 更新多对多字段 - 国家/地区
+            if country_name_list:
+                countries = CountryModel.objects.filter(country_name__in=country_name_list)
+                campaign.country.set(countries)
+
+            campaign.update_time = int(time.time())
+
+            # 保存更新
+            campaign.save()
+        except Exception as e:
+            return response.json(177)
+
+        return response.json(0)
+
+    def switch_campaign(self, request_dict, response):
+        campaign_id = request_dict.get('id')
+        status = request_dict.get('status')
+        if not campaign_id:
+            return response.json(444)
+        try:
+            campaign = AppAdvertiseCampaign.objects.get(pk=campaign_id)
+            # 更新字段
+            campaign.status = status
+            campaign.update_time = int(time.time())
+            # 保存更改
+            campaign.save()
+            return response.json(0)
+        except Exception as e:
+            return response.json(444)
+
+    def delete_campaign(self, request_dict, response):
+        campaign_id = request_dict.get('id')
+        if not campaign_id:
+            return response.json(444)
+        try:
+            campaign = AppAdvertiseCampaign.objects.get(id=campaign_id)
+            campaign.device_type.clear()
+            campaign.country.clear()
+            campaign.delete()
+            return response.json(0)
+        except Exception as e:
+            return response.json(444)
+
+    def app_get_campaigns(self, request_dict, response):
+        """
+        APP获取广告活动列表
+        @param request_dict: 请求参数
+        @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')
+
+        #返回 图片、开始时间、结束时间、广告名称、广告类型
+        user_tz = pytz.timezone(user_timezone)
+        campaigns_list = []
+
+        # 调整时区返回时间
+        for campaign in app_advertise_campaign_qs:
+            # 将时间戳转换为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,{
+            'campaigns': campaigns_list
+        })
+
+    def record_user_behavior(self, request_dict, response):
+        """
+        记录用户行为
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @return: 响应对象
+        """
+        pass
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 19 - 0
Model/models.py

@@ -4460,3 +4460,22 @@ class DailyReconciliation(models.Model):
     class Meta:
         db_table = 'daily_reconciliation'
         verbose_name = 'paypal每日对账'
+
+class AppAdvertiseCampaign(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    image_url = models.CharField(default='', max_length=256, verbose_name='广告图片url')
+    campaign_name = models.CharField(default='', max_length=32, verbose_name='广告名称')
+    campaign_type = models.SmallIntegerField(default=1,verbose_name='广告类型') # 1:开屏广告
+    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='广告地区')
+    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='当天广告起始时间')
+    campaign_show_etime = models.IntegerField(default=0, verbose_name='当天广告结束时间')
+    create_time = models.IntegerField(default=0, verbose_name='广告创建时间')
+    update_time = models.IntegerField(default=0, verbose_name='广告更新时间')
+
+    class Meta:
+        db_table = 'app_advertise_campaign'
+        verbose_name = 'App广告活动表'