143 lines
6.6 KiB
Python
143 lines
6.6 KiB
Python
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<path>\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):
|
|
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):
|
|
serializer = self.get_serializer(data=request.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()
|