|
@@ -0,0 +1,223 @@
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
+"""
|
|
|
+@File : UserSubscriptionController.py
|
|
|
+@Time : 2024/5/21 16:31
|
|
|
+@Author : stephen
|
|
|
+@Email : zhangdongming@asj6.wecom.work
|
|
|
+@Software: PyCharm
|
|
|
+"""
|
|
|
+import threading
|
|
|
+import time
|
|
|
+
|
|
|
+from django.http import QueryDict
|
|
|
+from django.views import View
|
|
|
+
|
|
|
+from Model.models import Device_User, CountryModel, UserEmailSubscriptions
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Object.YotpoCoreObject import YotpoCoreObject
|
|
|
+from Ansjer.config import LOGGER
|
|
|
+
|
|
|
+
|
|
|
+class 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
|