from datetime import datetime from django.db.models import Value, When, Case from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.exceptions import APIException from rest_framework.response import Response from apps.jqr.models import JqrHookUser, JqrExternalQun, JqrSendnewusermsgrecord, JqrSendmsgrecordinfo, JqrExternalUser, \ JqrExternalFollowUser from apps.jqr.parsers import WechatContentParser from apps.jqr.renderers import WechatPublicContentRenderer from apps.jqr.serializers import WechatPublicTokenSerializer, WechatEncryptSerializer, HeartBeatSerializer, \ TbMessageModelSerializer from apps.qc.models import QcCorpinfo from utils.base_viewsets import BaseViewSet from utils.exceptions import CustomProjectException from utils.response import ApiResponse class WechatWorkerViewSet(viewsets.GenericViewSet): @action(methods=['GET'], detail=False, serializer_class=WechatPublicTokenSerializer, url_path=r'callback/(?P\w+)', ) def verify(self, request, path, *args, **kwargs): # if not settings.DEBUG: # params = request.query_params # # cbtest.xbtool.cn # url = f'https://46i859447w.yicp.fun/event/callback/{path}' # res = requests.get(url, params=params) # data = res.text # return Response(data=int(data)) [business, corpid, agentid, uid] = path.split('_') corp = QcCorpinfo.objects.get(corpid=corpid, agentid=agentid, uid=uid) context = self.get_serializer_context() context['corp'] = corp serializer = self.get_serializer(data=request.query_params, context=context) serializer.is_valid(raise_exception=True) enchostr = serializer.data.get('echostr') return Response(data=int(enchostr)) # return Response(data=enchostr) @verify.mapping.post def message(self, request, path, *args, **kwargs): # if not settings.DEBUG: # data = request.data # # cbtest.xbtool.cn # renderer = WechatPublicContentRenderer() # data = renderer.render(data) # url = f'https://46i859447w.yicp.fun/event/callback/{path}' # res = requests.post(url, data=data, headers={'Content-Type': 'text/xml'}) # return Response(data=res.json()) [business, corpid, agentid, uid] = path.split('_') corp = QcCorpinfo.objects.get(corpid=corpid, agentid=agentid, uid=uid) context = self.get_serializer_context() context['corp'] = corp serializer = WechatEncryptSerializer(data=request.data, context=context) serializer.is_valid(raise_exception=True) serializer.save() return Response(data=serializer.data) def get_parsers(self): if self.request.method == 'POST': return [WechatContentParser()] return super().get_parsers() def get_renderers(self): if self.request.method == 'POST': return [WechatPublicContentRenderer()] return super().get_renderers() class HookClientController(BaseViewSet): permission_classes = [] authentication_classes = [] serializer_class = { 'heartbeat': HeartBeatSerializer, 'pushmsg': TbMessageModelSerializer, } @action(methods=['post'], detail=False, url_path='client/heartbeat') def heartbeat(self, request, *args, **kwargs): corpid = request.query_params.get('corpid', None) userid = request.query_params.get('userid', None) if not corpid or not userid: raise CustomProjectException('请选择企业和接粉号 ') serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return ApiResponse() @action(methods=['post'], detail=False, url_path='client/pushmsg') def pushmsg(self, request, *args, **kwargs): corpid = request.query_params.get('corpid', None) userid = request.query_params.get('userid', None) if not corpid or not userid: raise CustomProjectException('请选择企业和接粉号 ') data = { **request.data, 'corpid': corpid, 'userid': userid } serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) serializer.save() return ApiResponse() @action(methods=['get'], detail=False, url_path='usersend/getnonvid') def novide(self, request, *args, **kwargs): corpid = request.query_params.get('corpid', None) userid = request.query_params.get('userid', None) if not corpid or not userid: raise CustomProjectException('请选择企业和接粉号 ') external_userids = JqrExternalFollowUser.objects.filter(corpid=corpid, userid=userid).values_list( 'external_userid', flat=True) external_users = JqrExternalUser.objects.filter(vid__isnull=True, corpid=corpid, external_userid__in=external_userids).all().values_list( 'external_userid', flat=True) quns = JqrExternalQun.objects.filter(vid__isnull=True, corpid=corpid, owner=userid).all().values_list('chat_id', flat=True) return ApiResponse(data={ 'external_users': external_users, 'quns': quns, }) @action(methods=['post'], detail=False, url_path='usersend/setvid') def setvid(self, request, *args, **kwargs): data = request.data corpid = request.query_params.get('corpid', None) userid = request.query_params.get('userid', None) if not corpid or not userid: raise CustomProjectException('请选择企业和接粉号 ') external_users = data.get('external_users', []) for external_user in external_users: JqrExternalUser.objects.filter(corpid=corpid, external_userid=external_user).update(vid=external_user.get('vid'), utime=datetime.now()) quns = data.get('quns', []) for qun in quns: JqrExternalQun.objects.filter(corpid=corpid, chat_id=qun.get('chat_id')).update(vid=qun.get('vid'), utime=datetime.now()) return ApiResponse() @action(methods=['post'], detail=False, url_path='usersend/updatestatus') def updatestatus(self, request, *args, **kwargs): data = request.data sendnewusermsgrecord = data.get('sendnewusermsgrecord', []) sendnewusermsgrecord = [JqrSendnewusermsgrecord(**sendnewusermsgrecord, utime=datetime.now()) for sendnewusermsgrecord in sendnewusermsgrecord] JqrSendnewusermsgrecord.objects.bulk_update(sendnewusermsgrecord, fields=['sendstate', 'utime']) sendmsgrecordinfo = data.get('sendmsgrecordinfo', []) sendmsgrecordinfo = [JqrSendmsgrecordinfo(**sendmsgrecordinfo, utime=datetime.now()) for sendmsgrecordinfo in sendmsgrecordinfo] JqrSendmsgrecordinfo.objects.bulk_update(sendmsgrecordinfo, fields=['sendstate', 'utime']) return ApiResponse()