| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | # -*- encoding: utf-8 -*-"""@File    : UserSubscriptionController.py@Time    : 2024/5/21 16:31@Author  : stephen@Email   : zhangdongming@asj6.wecom.work@Software: PyCharm"""import threadingimport timefrom django.http import QueryDictfrom django.views import Viewfrom Model.models import Device_User, CountryModel, UserEmailSubscriptionsfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Object.YotpoCoreObject import YotpoCoreObjectfrom Ansjer.config import LOGGERclass UserSubscriptionControllerView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, request, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, request, operation)    def delete(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        delete = QueryDict(request.body)        if not delete:            delete = request.GET        return self.validation(delete, request, operation)    def put(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        put = QueryDict(request.body)        return self.validation(put, request, operation)    def validation(self, request_dict, request, operation):        response = ResponseObject('cn')        tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))        if tko.code != 0:            return response.json(tko.code)        response.lang = tko.lang        userID = tko.userID        if operation == 'checkSubscriptionStatus':            return self.check_subscription_status(userID, response)        elif operation == 'switchSubscription':            return self.switch_subscription(userID, request_dict, response)        else:            return response.json(414)    @staticmethod    def check_subscription_status(user_id, response):        """        检查订阅状态        @param user_id: str        @param response: 响应        @return: response        """        user_qs = Device_User.objects.filter(userID=user_id)        if not user_qs.exists():            return response.json(104)        user_sub = UserEmailSubscriptions.objects.filter(user_id=user_id).values('status', 'push_sub_status').first()        if not user_sub:            UserEmailSubscriptions.objects.create(user_id=user_id, status=0, push_sub_status=1,                                                  updated_time=int(time.time()), created_time=int(time.time()))            return response.json(0, {"emailSubStatus": 0, 'pushSubStatus': 1})        email_sub_status = 1 if user_sub["status"] == 1 else 0        push_sub_status = 0 if user_sub["push_sub_status"] == 0 else 1        user_sub = {"emailSubStatus": email_sub_status, 'pushSubStatus': push_sub_status}        return response.json(0, user_sub)    def switch_subscription(self, user_id, request_dict, response):        """        邮件订阅开关        @param user_id: str        @param request_dict: dict        @param response        """        user_qs = Device_User.objects.filter(userID=user_id)        email_sub_status = request_dict.get('emailSubStatus', None)        push_sub_status = request_dict.get('pushSubStatus', None)        if not email_sub_status and not push_sub_status:            return response.json(444, "emailSubStatus or pushSubStatus")        if not user_qs.exists():            return response.json(104)        # 用户推送订阅        if push_sub_status:            push_sub_status = int(push_sub_status)            user_sub_qs = UserEmailSubscriptions.objects.filter(user_id=user_id)            if user_sub_qs.exists():                user_sub_qs.update(push_sub_status=push_sub_status)            else:                user = user_qs.values('userEmail', 'phone').first()                push_sub = {                    "user_id": user_id,                    "push_sub_status": push_sub_status,                    "created_time": int(time.time()),                    "updated_time": int(time.time())                }                if user["userEmail"]:                    push_sub["email"] = user["userEmail"]                if user["phone"]:                    push_sub["phone"] = user["phone"]                UserEmailSubscriptions.objects.create(**push_sub)        else:            user_sub = UserEmailSubscriptions.objects.filter(user_id=user_id).values('status',                                                                                     'push_sub_status').first()            if not user_sub:                push_sub_status = 1            else:                push_sub_status = user_sub["push_sub_status"]        if email_sub_status:            # 修改数据库中订阅状态            email_sub_status = int(email_sub_status)            user_sub_qs = UserEmailSubscriptions.objects.filter(user_id=user_id)            # 邮件订阅            if email_sub_status == 1:                subscribers = user_qs.values('NickName', 'userEmail', 'region_country').first()                if not subscribers["userEmail"]:                    LOGGER.info(f'subscribers{user_id}邮箱为空,无法订阅')                    return response.json(183)                if user_sub_qs.exists():                    user_sub_qs.update(email=subscribers["userEmail"], status=1, updated_time=int(time.time()))                else:                    UserEmailSubscriptions.objects.create(user_id=user_id, status=1, email=subscribers["userEmail"],                                                          created_time=int(time.time()), updated_time=int(time.time()))                subscription_thread = threading.Thread(target=self.subscription, args=(subscribers,))                subscription_thread.start()            # 取消订阅            elif email_sub_status == 0:                device_user = Device_User.objects.filter(userID=user_id).values('userEmail').first()                if device_user:                    customer = {                        "email": device_user["userEmail"],                        "first_name": device_user["userEmail"],                        "last_name": "APP",                    }                    yotpo = YotpoCoreObject()                    list_id = 8589406                    subscription_thread = threading.Thread(target=yotpo.close_subscribers, args=(customer, list_id))                    subscription_thread.start()                    if user_sub_qs.exists():                        customer["status"] = "unsubscription"                        user_sub_qs.update(email=device_user["userEmail"], status=0, sub_result=customer)        else:            user_sub = UserEmailSubscriptions.objects.filter(user_id=user_id).values('status').first()            if not user_sub:                email_sub_status = 0            else:                email_sub_status = user_sub["status"]        return response.json(0, {"emailSubStatus": email_sub_status, "pushSubStatus": push_sub_status})    @staticmethod    def subscription(subscribers):        """        订阅        @param subscribers: dict        @return: boolean        """        yotpo = YotpoCoreObject()        try:            # 查询顾客所在地区            if subscribers["region_country"]:                country = CountryModel.objects.filter(id=subscribers["region_country"]).values('country_code').first()                if country:                    country_code = country["country_code"]                else:                    country_code = ''                # 构建顾客订阅格式                customer = {                    "email": subscribers["userEmail"],                    "first_name": subscribers["userEmail"],                    "last_name": "APP",                    'address': {                        "country_code": country_code,                    },                    "custom_properties": {                        "subscription_office": "ZosiApp",                    }                }            else:                customer = {                    "email": subscribers["userEmail"],                    "first_name": subscribers["userEmail"],                    "last_name": "APP",                    "custom_properties": {                        "subscription_office": "ZosiApp",                    }                }            result = yotpo.creat_and_update_customers(customer)            list_id = 8589406            sub_status, sub_result = yotpo.create_subscribers(customer, list_id)            if result and sub_status:                # 创建结果写入数据库                user_sub_qs = UserEmailSubscriptions.objects.filter(email=subscribers["userEmail"])                if user_sub_qs.exists():                    user_sub_qs.update(email=subscribers["userEmail"], status=1, sub_result=sub_result, list_id=list_id,                                       updated_time=int(time.time()))                    LOGGER.info(f'在yotpo创建客户并订阅成功,customer:{customer}')                return True            else:                LOGGER.info(f'在yotpo创建客户并订阅失败,customer:{customer}')            return False        except Exception as e:            LOGGER.error(f'{subscribers["userEmail"]}订阅失败:{e}')            return False
 |