keyword = models.BooleanField(default=True, verbose_name='关键字回复开关')
This commit is contained in:
parent
ca57c36756
commit
059e56e5ce
|
@ -50,8 +50,7 @@ class JqrHookUser(models.Model):
|
||||||
time_qun = models.BooleanField(default=True, verbose_name='定时群聊开关')
|
time_qun = models.BooleanField(default=True, verbose_name='定时群聊开关')
|
||||||
time_private = models.BooleanField(default=True, verbose_name='定时私聊开关')
|
time_private = models.BooleanField(default=True, verbose_name='定时私聊开关')
|
||||||
time_quan = models.BooleanField(default=True, verbose_name='定时朋友圈开关')
|
time_quan = models.BooleanField(default=True, verbose_name='定时朋友圈开关')
|
||||||
hook_time = models.DateTimeField(
|
keyword = models.BooleanField(default=True, verbose_name='关键字回复开关')
|
||||||
null=True, blank=True, verbose_name='hook时间')
|
|
||||||
utime = models.DateTimeField(verbose_name='更新时间', null=True, blank=True)
|
utime = models.DateTimeField(verbose_name='更新时间', null=True, blank=True)
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=255, verbose_name='用户名', null=True, blank=True)
|
max_length=255, verbose_name='用户名', null=True, blank=True)
|
||||||
|
@ -69,6 +68,9 @@ class JqrHookUser(models.Model):
|
||||||
verbose_name='对外展示信息', null=True, blank=True)
|
verbose_name='对外展示信息', null=True, blank=True)
|
||||||
qrcode = models.CharField(
|
qrcode = models.CharField(
|
||||||
max_length=255, verbose_name='二维码', null=True, blank=True)
|
max_length=255, verbose_name='二维码', null=True, blank=True)
|
||||||
|
hook_starttime = models.DateTimeField(null=True, verbose_name="hook最近一次启动时间", blank=True)
|
||||||
|
hook_wstime = models.DateTimeField(null=True, verbose_name="hook最近一次websocket首发消息时间", blank=True)
|
||||||
|
hook_connecttime = models.DateTimeField(null=True, verbose_name="hook最近一次通信时间", blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('corpid', 'userid', 'vid')
|
unique_together = ('corpid', 'userid', 'vid')
|
||||||
|
|
|
@ -2,9 +2,11 @@ import base64
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from apps.jqr.models import JqrHookUser
|
||||||
from apps.jqr.tasks import save_add_contact, delete_add_contact, edit_add_contact
|
from apps.jqr.tasks import save_add_contact, delete_add_contact, edit_add_contact
|
||||||
from libs.weworkapi.callback.WXBizMsgCrypt3 import WXBizMsgCrypt, Prpcrypt
|
from libs.weworkapi.callback.WXBizMsgCrypt3 import WXBizMsgCrypt, Prpcrypt
|
||||||
from utils.tools import sha1_encoder, get_attribute, camel_to_snake
|
from utils.tools import sha1_encoder, get_attribute, camel_to_snake
|
||||||
|
from utils.base_serializer import BaseSerializer
|
||||||
import xml.etree.cElementTree as ET
|
import xml.etree.cElementTree as ET
|
||||||
|
|
||||||
|
|
||||||
|
@ -153,3 +155,11 @@ class WechatEncryptSerializer(serializers.Serializer):
|
||||||
"""
|
"""
|
||||||
print('客户群解散事件')
|
print('客户群解散事件')
|
||||||
print(data)
|
print(data)
|
||||||
|
|
||||||
|
|
||||||
|
class HeartBeatSerializer(BaseSerializer):
|
||||||
|
HookStartData = serializers.DateTimeField(source='')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = JqrHookUser
|
||||||
|
fields = '__all__'
|
||||||
|
|
|
@ -40,9 +40,12 @@ def save_add_contact(data, corpinfo, *args, **kwargs):
|
||||||
qrcodeid = data.get('qrcodeid')
|
qrcodeid = data.get('qrcodeid')
|
||||||
if qrcodeid:
|
if qrcodeid:
|
||||||
check_qrcode.delay(qrcodeid, userid, corpinfo)
|
check_qrcode.delay(qrcodeid, userid, corpinfo)
|
||||||
tag_remark_contact.delay(qrcodeid, userid, externaluserid, corpinfo)
|
|
||||||
alarm_userid_by_qrcodeid.delay(qrcodeid)
|
alarm_userid_by_qrcodeid.delay(qrcodeid)
|
||||||
edit_add_contact.delay(data, corpinfo, *args, **kwargs)
|
# 打标签备注
|
||||||
|
tag_remark_contact(qrcodeid, userid, externaluserid, corpinfo)
|
||||||
|
# 修复客户关系
|
||||||
|
edit_add_contact(data, corpinfo, *args, **kwargs)
|
||||||
|
# TODO 请求API 发送消息
|
||||||
|
|
||||||
|
|
||||||
@shared_task(name='edit_add_contact', queue='contact')
|
@shared_task(name='edit_add_contact', queue='contact')
|
||||||
|
|
|
@ -3,5 +3,6 @@ from . import views
|
||||||
|
|
||||||
router = SimpleRouter(trailing_slash=False)
|
router = SimpleRouter(trailing_slash=False)
|
||||||
router.register('event', views.WechatWorkerViewSet, basename='wechat-worker')
|
router.register('event', views.WechatWorkerViewSet, basename='wechat-worker')
|
||||||
|
router.register('hook/client', views.HookClientController, basename='hook-client')
|
||||||
|
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
|
|
|
@ -8,6 +8,7 @@ from apps.jqr.parsers import WechatContentParser
|
||||||
from apps.jqr.renderers import WechatPublicContentRenderer
|
from apps.jqr.renderers import WechatPublicContentRenderer
|
||||||
from apps.jqr.serializers import WechatPublicTokenSerializer, WechatEncryptSerializer
|
from apps.jqr.serializers import WechatPublicTokenSerializer, WechatEncryptSerializer
|
||||||
from apps.qc.models import QcCorpinfo
|
from apps.qc.models import QcCorpinfo
|
||||||
|
from utils.base_viewsets import BaseViewSet
|
||||||
|
|
||||||
|
|
||||||
class WechatWorkerViewSet(viewsets.GenericViewSet):
|
class WechatWorkerViewSet(viewsets.GenericViewSet):
|
||||||
|
@ -61,3 +62,16 @@ class WechatWorkerViewSet(viewsets.GenericViewSet):
|
||||||
if self.request.method == 'POST':
|
if self.request.method == 'POST':
|
||||||
return [WechatPublicContentRenderer()]
|
return [WechatPublicContentRenderer()]
|
||||||
return super().get_renderers()
|
return super().get_renderers()
|
||||||
|
|
||||||
|
|
||||||
|
class HookClientController(BaseViewSet):
|
||||||
|
permission_classes = []
|
||||||
|
authentication_classes = []
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=False, url_path='heartbeat')
|
||||||
|
def heartbeat(self, request, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=False, url_path='pushmsg')
|
||||||
|
def pushmsg(self, request, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class SystemConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'apps.system'
|
|
@ -0,0 +1,76 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentType(models.IntegerChoices):
|
||||||
|
YFD = 1, '云发单'
|
||||||
|
JFJC = 2, '接粉检测'
|
||||||
|
ALIVE_ACTIVITY_PAGE = 3, '活动单页(活)'
|
||||||
|
DEAD_ACTIVITY_PAGE = 4, '活动单页(死)'
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentActivityType(models.IntegerChoices):
|
||||||
|
ELM = 1, 'elm'
|
||||||
|
ALIPAY = 2, '支付宝'
|
||||||
|
COMPLAINT_PAGE = 3, '投诉页'
|
||||||
|
|
||||||
|
|
||||||
|
class ActivityType(models.IntegerChoices):
|
||||||
|
ELM = 1, 'elm赏金'
|
||||||
|
ALIPAY = 2, '支付宝'
|
||||||
|
COMPLAINT_PAGE = 3, '投诉页'
|
||||||
|
MIDDLE_PAGE = 4, '中间页'
|
||||||
|
|
||||||
|
|
||||||
|
class ActivityLinkType(models.IntegerChoices):
|
||||||
|
DEAD = 0, '死链接'
|
||||||
|
ALIVE = 1, '活链接'
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorizationPlatformType(models.IntegerChoices):
|
||||||
|
# ALIPAY = 1, '支付宝'
|
||||||
|
ELM = 2, '饿了么'
|
||||||
|
MT = 3, '美团'
|
||||||
|
TB = 4, '淘宝'
|
||||||
|
PDD = 5, '拼多多'
|
||||||
|
JD = 6, '京东'
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorizationType(models.IntegerChoices):
|
||||||
|
COOKIE = 1, '插件模拟登录'
|
||||||
|
APP_SECRET = 2, 'app_secret'
|
||||||
|
AUTHORIZATION = 3, '账号授权'
|
||||||
|
|
||||||
|
|
||||||
|
class DomainBusinessType(models.IntegerChoices):
|
||||||
|
SHORT_CHAIN = 1, '短链'
|
||||||
|
LANDING_PAGE = 2, '落地页'
|
||||||
|
QUICK_CODE = 3, '快码'
|
||||||
|
|
||||||
|
|
||||||
|
class DomainType(models.IntegerChoices):
|
||||||
|
QUICK_CODE = 1, '快码'
|
||||||
|
SELF_BIND = 2, '自己绑定'
|
||||||
|
QUICK_STATION = 3, '快站'
|
||||||
|
|
||||||
|
|
||||||
|
class QuickCodeCreateMethodType(models.IntegerChoices):
|
||||||
|
PROGRAM = 1, '程序生成'
|
||||||
|
MANUAL = 2, '人工生成'
|
||||||
|
MANUAL_COPY = 3, '手动复制'
|
||||||
|
|
||||||
|
|
||||||
|
class QuickCodeType(models.IntegerChoices):
|
||||||
|
OFFICIAL = 1, '官方'
|
||||||
|
PRIVATE = 2, '自己'
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorizationCookieCheckResultChoices(models.IntegerChoices):
|
||||||
|
FAIL = 0, '检测失败'
|
||||||
|
SUCCESS = 1, '检测成功'
|
||||||
|
|
||||||
|
|
||||||
|
class DbEnum(models.TextChoices):
|
||||||
|
XBTOOL = 'xbtool', '小程序工具'
|
||||||
|
HDY = 'hdy', '活动页'
|
||||||
|
QWHM = 'qwhm', '企微活码'
|
||||||
|
QWJQR = 'qwjqr', '企微机器人'
|
|
@ -0,0 +1,240 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from .choices import *
|
||||||
|
from apps.user.models import User
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentRecord(models.Model):
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='payment_records')
|
||||||
|
pay_type = models.IntegerField(
|
||||||
|
choices=PaymentType.choices, verbose_name="付费类型")
|
||||||
|
activity_type = models.IntegerField(
|
||||||
|
choices=PaymentActivityType.choices, verbose_name="活动类型")
|
||||||
|
pay_amount = models.IntegerField(verbose_name="付费金额")
|
||||||
|
pay_time = models.DateTimeField(verbose_name="付费时间")
|
||||||
|
expire_time = models.DateTimeField(verbose_name="到期时间")
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = "py_payment_record"
|
||||||
|
verbose_name = "付费记录"
|
||||||
|
verbose_name_plural = verbose_name
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
|
class Activity(models.Model):
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='activities',
|
||||||
|
db_index=True)
|
||||||
|
template = models.ForeignKey('Activity',
|
||||||
|
on_delete=models.DO_NOTHING, verbose_name="模板", db_constraint=False,
|
||||||
|
related_name='children', null=True, blank=True)
|
||||||
|
title = models.CharField(max_length=100, verbose_name="标题")
|
||||||
|
remark = models.TextField(verbose_name="备注", null=True, blank=True)
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
pv = models.IntegerField(verbose_name="pv", default=0)
|
||||||
|
# business_domain = models.ForeignKey('Domain', to_field='domain', db_constraint=False, on_delete=models.DO_NOTHING,
|
||||||
|
# verbose_name='业务域名', related_name='business_activities', null=True,
|
||||||
|
# blank=True,
|
||||||
|
# db_column='business_domain')
|
||||||
|
# short_chain_domain = models.ForeignKey('Domain', to_field='domain', db_constraint=False,
|
||||||
|
# on_delete=models.DO_NOTHING, null=True, blank=True,
|
||||||
|
# verbose_name='短链域名', related_name='short_chain_activities',
|
||||||
|
# db_column='short_chain_domain')
|
||||||
|
domain = models.ForeignKey('Domain', db_constraint=False, on_delete=models.DO_NOTHING,
|
||||||
|
verbose_name='业务域名', related_name='activities', null=True, blank=True)
|
||||||
|
business_domain = models.CharField(
|
||||||
|
max_length=100, verbose_name="业务域名", null=True, blank=True)
|
||||||
|
short_chain_domain = models.CharField(
|
||||||
|
max_length=100, verbose_name="短链域名", null=True, blank=True)
|
||||||
|
activity_type = models.IntegerField(choices=ActivityType.choices,
|
||||||
|
verbose_name="活动类型")
|
||||||
|
link_type = models.IntegerField(choices=ActivityLinkType.choices,
|
||||||
|
verbose_name="链接类型")
|
||||||
|
is_top = models.BooleanField(default=False, verbose_name="是否置顶")
|
||||||
|
create_json = models.JSONField(
|
||||||
|
verbose_name="创建json", null=True, blank=True)
|
||||||
|
request_json = models.JSONField(
|
||||||
|
verbose_name="请求json", null=True, blank=True)
|
||||||
|
response_json = models.JSONField(
|
||||||
|
verbose_name="响应json", null=True, blank=True)
|
||||||
|
platform_id = models.IntegerField(
|
||||||
|
verbose_name="平台id", null=True, blank=True)
|
||||||
|
is_quick_code = models.BooleanField(default=False, verbose_name="是否是快码")
|
||||||
|
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
|
||||||
|
corpid = models.CharField(max_length=32, verbose_name="企业微信corpid", null=True, blank=True)
|
||||||
|
externaluserid = models.CharField(
|
||||||
|
max_length=32, verbose_name="外部联系人id", null=True, blank=True)
|
||||||
|
tklexpiretime = models.DateTimeField(
|
||||||
|
verbose_name="淘口令过期时间", null=True, blank=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_activity'
|
||||||
|
verbose_name = '活动表'
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
def add_activity_history(self):
|
||||||
|
activity_history = ActivityHistory()
|
||||||
|
activity_history.activity = self
|
||||||
|
for field in self._meta.fields:
|
||||||
|
if field.name in ['id']:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if hasattr(activity_history, field.name):
|
||||||
|
setattr(activity_history, field.name, getattr(self, field.name))
|
||||||
|
activity_history.save()
|
||||||
|
|
||||||
|
|
||||||
|
class ActivityHistory(models.Model):
|
||||||
|
activity = models.ForeignKey('Activity',
|
||||||
|
on_delete=models.DO_NOTHING, verbose_name="活动", db_constraint=False,
|
||||||
|
related_name='history')
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='history_activities',
|
||||||
|
db_index=True)
|
||||||
|
template = models.ForeignKey('Activity',
|
||||||
|
on_delete=models.DO_NOTHING, verbose_name="模板", db_constraint=False,
|
||||||
|
related_name='history_templates', null=True, blank=True)
|
||||||
|
title = models.CharField(max_length=100, verbose_name="标题")
|
||||||
|
remark = models.TextField(verbose_name="备注", null=True, blank=True)
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
pv = models.IntegerField(verbose_name="pv", default=0)
|
||||||
|
domain = models.ForeignKey('Domain', db_constraint=False, on_delete=models.DO_NOTHING,
|
||||||
|
verbose_name='业务域名', related_name='history_activities', null=True, blank=True)
|
||||||
|
business_domain = models.CharField(
|
||||||
|
max_length=100, verbose_name="业务域名", null=True, blank=True)
|
||||||
|
short_chain_domain = models.CharField(
|
||||||
|
max_length=100, verbose_name="短链域名", null=True, blank=True)
|
||||||
|
activity_type = models.IntegerField(choices=ActivityType.choices,
|
||||||
|
verbose_name="活动类型")
|
||||||
|
link_type = models.IntegerField(choices=ActivityLinkType.choices,
|
||||||
|
verbose_name="链接类型")
|
||||||
|
is_top = models.BooleanField(default=False, verbose_name="是否置顶")
|
||||||
|
create_json = models.JSONField(
|
||||||
|
verbose_name="创建json", null=True, blank=True)
|
||||||
|
request_json = models.JSONField(
|
||||||
|
verbose_name="请求json", null=True, blank=True)
|
||||||
|
response_json = models.JSONField(
|
||||||
|
verbose_name="响应json", null=True, blank=True)
|
||||||
|
platform_id = models.IntegerField(
|
||||||
|
verbose_name="平台id", null=True, blank=True)
|
||||||
|
is_quick_code = models.BooleanField(default=False, verbose_name="是否是快码")
|
||||||
|
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_activity_history'
|
||||||
|
verbose_name = '历史表'
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
|
class Domain(models.Model):
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='domains',
|
||||||
|
db_index=True
|
||||||
|
)
|
||||||
|
domain = models.CharField(
|
||||||
|
max_length=100, verbose_name="域名", null=True, blank=True)
|
||||||
|
business_type = models.IntegerField(
|
||||||
|
verbose_name="业务类型", choices=DomainBusinessType.choices)
|
||||||
|
is_system = models.BooleanField(verbose_name="是否是系统", default=False)
|
||||||
|
domain_type = models.IntegerField(
|
||||||
|
verbose_name="域名类型", choices=DomainType.choices)
|
||||||
|
app_key = models.CharField(
|
||||||
|
max_length=100, verbose_name="app_key", null=True, blank=True)
|
||||||
|
secret = models.CharField(
|
||||||
|
max_length=100, verbose_name="secret", null=True, blank=True)
|
||||||
|
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_domain'
|
||||||
|
verbose_name = '域名表'
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
|
class Authorization(models.Model):
|
||||||
|
name = models.CharField(max_length=100, verbose_name="名称")
|
||||||
|
remark = models.TextField(verbose_name="备注", blank=True, null=True)
|
||||||
|
cookie_key = models.CharField(
|
||||||
|
verbose_name="cookie key", max_length=32, null=True, blank=True, default=lambda: uuid.uuid4().hex)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='authorizations',
|
||||||
|
db_index=True)
|
||||||
|
platform_type = models.IntegerField(
|
||||||
|
verbose_name="平台类型", choices=AuthorizationPlatformType.choices)
|
||||||
|
uid = models.CharField(
|
||||||
|
max_length=100, verbose_name="平台uid", null=True, blank=True)
|
||||||
|
# authorization_type = models.IntegerField(
|
||||||
|
# verbose_name="授权类型", choices=AuthorizationType.choices)
|
||||||
|
account = models.CharField(
|
||||||
|
max_length=100, verbose_name="账号", null=True, blank=True)
|
||||||
|
password = models.CharField(
|
||||||
|
max_length=100, verbose_name="密码", null=True, blank=True)
|
||||||
|
app_key_secret_info = models.JSONField(
|
||||||
|
null=True, blank=True, verbose_name="app_key_secret授权信息")
|
||||||
|
cookie_info = models.JSONField(
|
||||||
|
null=True, blank=True, verbose_name="cookie授权信息")
|
||||||
|
auth_info = models.JSONField(null=True, blank=True, verbose_name="授权信息")
|
||||||
|
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
cookie_update_time = models.DateTimeField(
|
||||||
|
null=True, blank=True, verbose_name="cookie更新时间")
|
||||||
|
auth_update_time = models.DateTimeField(
|
||||||
|
null=True, blank=True, verbose_name="授权更新时间")
|
||||||
|
app_key_secret_update_time = models.DateTimeField(
|
||||||
|
null=True, blank=True, verbose_name="授权更新时间")
|
||||||
|
cookie_warning_setting = models.IntegerField(verbose_name='cookie报警设置', null=True, blank=True)
|
||||||
|
cookie_check_result = models.IntegerField(verbose_name='cookie检测结果', null=True, blank=True,
|
||||||
|
choices=AuthorizationCookieCheckResultChoices.choices)
|
||||||
|
cookie_check_time = models.DateTimeField(verbose_name='cookie检测时间', null=True, blank=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_authorization'
|
||||||
|
verbose_name = '授权表'
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
|
class ComplaintPageRecord(models.Model):
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False,
|
||||||
|
related_name='complaint_page_records', db_index=True)
|
||||||
|
activity = models.ForeignKey('Activity', on_delete=models.DO_NOTHING,
|
||||||
|
verbose_name="活动", db_constraint=False, related_name='complaint_page_records',
|
||||||
|
db_index=True)
|
||||||
|
info = models.JSONField(null=True, blank=True, verbose_name="投诉信息")
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_complaint_page_record'
|
||||||
|
verbose_name = '投诉页记录'
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
|
class QuickCode(models.Model):
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False,
|
||||||
|
related_name='quick_codes', db_index=True)
|
||||||
|
activity = models.ForeignKey('Activity', on_delete=models.DO_NOTHING,
|
||||||
|
verbose_name="活动", db_constraint=False, related_name='quick_codes',
|
||||||
|
db_index=True)
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
create_method = models.IntegerField(
|
||||||
|
choices=QuickCodeCreateMethodType.choices, default=QuickCodeCreateMethodType.MANUAL, verbose_name="创建方式")
|
||||||
|
quick_code_url = models.CharField(
|
||||||
|
max_length=255, null=True, blank=True, verbose_name="快码url")
|
||||||
|
converted_url = models.CharField(
|
||||||
|
max_length=255, null=True, blank=True, verbose_name="被转链url")
|
||||||
|
quick_code_type = models.IntegerField(
|
||||||
|
choices=QuickCodeType.choices, default=QuickCodeType.OFFICIAL, verbose_name="快码类型")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'py_quick_code'
|
||||||
|
verbose_name = '快码记录'
|
||||||
|
ordering = ['-create_time']
|
|
@ -0,0 +1,6 @@
|
||||||
|
from rest_framework.routers import SimpleRouter
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
router = SimpleRouter(trailing_slash=False)
|
||||||
|
|
||||||
|
urlpatterns = router.urls
|
|
@ -0,0 +1,155 @@
|
||||||
|
import requests
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from apps.system.choices import ActivityType, AuthorizationPlatformType, QuickCodeCreateMethodType, QuickCodeType, \
|
||||||
|
DbEnum
|
||||||
|
from django.core.files.storage import default_storage
|
||||||
|
from datetime import date, datetime
|
||||||
|
from apps.system.models import Authorization, Activity, QuickCode
|
||||||
|
from libs.kz import KZ
|
||||||
|
from libs.topsdk.top import TopUtils
|
||||||
|
from utils.exceptions import CustomProjectException
|
||||||
|
from utils.tools import InviteCode
|
||||||
|
from yzk.settings.constant import MiddlePageConstant
|
||||||
|
|
||||||
|
|
||||||
|
def get_alipay_link_by_bid(bid):
|
||||||
|
return settings.ALIPAY_ACTIVITY_LINK.format(bid)
|
||||||
|
|
||||||
|
|
||||||
|
def get_response_json_by_activity(activity):
|
||||||
|
activity_type = activity.activity_type
|
||||||
|
request_json = activity.request_json
|
||||||
|
data = None
|
||||||
|
if activity_type == ActivityType.ELM:
|
||||||
|
authorization_id = request_json.get('authorization_id')
|
||||||
|
authorization = Authorization.objects.get(
|
||||||
|
pk=authorization_id, platform_type=AuthorizationPlatformType.ELM)
|
||||||
|
app_key_secret_info = authorization.app_key_secret_info
|
||||||
|
appkey = app_key_secret_info.get('appkey')
|
||||||
|
secret = app_key_secret_info.get('secret')
|
||||||
|
pid = request_json.get('pid')
|
||||||
|
sid = request_json.get('sid')
|
||||||
|
activity_id = request_json.get(
|
||||||
|
'activity_id', MiddlePageConstant.ELM_ACTIVITY_ID)
|
||||||
|
top_utils = TopUtils(appkey, secret)
|
||||||
|
response_json = top_utils.get_official_activity(
|
||||||
|
pid, activity_id, sid=sid)
|
||||||
|
activity.response_json = response_json
|
||||||
|
activity.save()
|
||||||
|
data = {
|
||||||
|
'kl': response_json.get('link').get('eleme_word'),
|
||||||
|
'l': response_json.get('link').get('h5_url'),
|
||||||
|
'r': activity.title,
|
||||||
|
}
|
||||||
|
elif activity_type == ActivityType.ALIPAY:
|
||||||
|
bid = request_json.get('bid')
|
||||||
|
data = {
|
||||||
|
'link': get_alipay_link_by_bid(bid)
|
||||||
|
}
|
||||||
|
activity.response_json = data
|
||||||
|
activity.save()
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def get_activity_by_short_chain_key(short_chain_key, select_user=False):
|
||||||
|
activity_id = InviteCode.decode(short_chain_key)
|
||||||
|
queryset = Activity.objects.filter(id=activity_id, is_delete=False)
|
||||||
|
if select_user:
|
||||||
|
queryset = queryset.select_related('user')
|
||||||
|
activity = queryset.first()
|
||||||
|
return activity
|
||||||
|
|
||||||
|
|
||||||
|
def create_quick_code(instance, link, domain=None, create_method=QuickCodeCreateMethodType.PROGRAM):
|
||||||
|
domain = domain or instance.domain
|
||||||
|
if domain is None:
|
||||||
|
return None, None
|
||||||
|
app_key = domain.app_key
|
||||||
|
secret = domain.secret
|
||||||
|
success, quick_code_link = KZ(
|
||||||
|
appkey=app_key, secret=secret).gen_short_link(link, domain=domain)
|
||||||
|
if not success:
|
||||||
|
raise CustomProjectException(detail=quick_code_link)
|
||||||
|
quick_code = None
|
||||||
|
if quick_code_link:
|
||||||
|
quick_code = QuickCode.objects.create(
|
||||||
|
user=instance.user,
|
||||||
|
activity=instance,
|
||||||
|
quick_code_url=quick_code_link,
|
||||||
|
converted_url=link,
|
||||||
|
create_method=create_method,
|
||||||
|
quick_code_type=QuickCodeType.PRIVATE if domain.user_id > 0 else QuickCodeType.OFFICIAL
|
||||||
|
)
|
||||||
|
return quick_code_link, quick_code
|
||||||
|
|
||||||
|
|
||||||
|
def save_files(files, business=None, return_path=False, user_id=0):
|
||||||
|
data = []
|
||||||
|
folder = business or DbEnum.HDY
|
||||||
|
for file in files:
|
||||||
|
fs = default_storage
|
||||||
|
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
|
||||||
|
file_name = f'{folder}/{user_id}/{timestamp}_{file.name}'
|
||||||
|
fs.save(file_name, file)
|
||||||
|
file_url = fs.url(file_name)
|
||||||
|
if return_path:
|
||||||
|
data.append({
|
||||||
|
'path': file_name,
|
||||||
|
'url': file_url,
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
data.append(f'{file_url}')
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def test_authorization(instance: Authorization, field):
|
||||||
|
field_info = getattr(instance, field)
|
||||||
|
if not field_info:
|
||||||
|
return False
|
||||||
|
platform_type = instance.platform_type
|
||||||
|
success = False
|
||||||
|
if platform_type == AuthorizationPlatformType.ELM:
|
||||||
|
if field == 'cookie_info':
|
||||||
|
cookies = []
|
||||||
|
xsrf_token = ''
|
||||||
|
for info in field_info:
|
||||||
|
cookie = f'{info.get("name")}={info.get("value")}'
|
||||||
|
cookies.append(cookie)
|
||||||
|
if info.get('name') == 'XSRF-TOKEN':
|
||||||
|
xsrf_token = info.get('value')
|
||||||
|
cookie = ';'.join(cookies)
|
||||||
|
url = f'https://union.ele.me/user/userinfo?_csrf={xsrf_token}'
|
||||||
|
headers = {
|
||||||
|
'Cookie': cookie,
|
||||||
|
'X-Csrf-Token': xsrf_token,
|
||||||
|
'X-Xsrf-Token': xsrf_token,
|
||||||
|
}
|
||||||
|
res = requests.get(url, headers=headers).json()
|
||||||
|
success = res.get('success') and str(res.get('result', {}).get('userId')) == instance.uid
|
||||||
|
if field == 'app_key_secret_info':
|
||||||
|
appkey = field_info.get('appkey')
|
||||||
|
secret = field_info.get('secret')
|
||||||
|
top_util = TopUtils(appkey=appkey, secret=secret)
|
||||||
|
res = top_util.get_zone_list()
|
||||||
|
success = res is not None
|
||||||
|
elif platform_type == AuthorizationPlatformType.MT:
|
||||||
|
if field == 'cookie_info':
|
||||||
|
cookies = []
|
||||||
|
for info in field_info:
|
||||||
|
cookie = f'{info.get("name")}={info.get("value")}'
|
||||||
|
cookies.append(cookie)
|
||||||
|
cookie = ';'.join(cookies)
|
||||||
|
headers = {
|
||||||
|
'Cookie': cookie,
|
||||||
|
}
|
||||||
|
url = f'https://union.meituan.com/api/account/info'
|
||||||
|
res = requests.get(url, headers=headers)
|
||||||
|
if res.status_code < 400:
|
||||||
|
res = res.json()
|
||||||
|
success = res.get('status') == 0 and str(res.get('data', {}).get('uid')) == instance.uid
|
||||||
|
if field == 'cookie_info':
|
||||||
|
instance.cookie_check_result = int(success)
|
||||||
|
instance.cookie_check_time = datetime.now()
|
||||||
|
instance.save()
|
||||||
|
return success
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class UserConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'apps.user'
|
|
@ -0,0 +1,9 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class UserAccountTypeChoices(models.IntegerChoices):
|
||||||
|
"""
|
||||||
|
用户账号类型
|
||||||
|
"""
|
||||||
|
NORMAL = 1, '普通用户'
|
||||||
|
ADMIN = 2, '管理员'
|
|
@ -0,0 +1,29 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from .choices import *
|
||||||
|
|
||||||
|
|
||||||
|
class User(models.Model):
|
||||||
|
username = models.CharField(max_length=50, verbose_name='用户名', unique=True)
|
||||||
|
nick_name = models.CharField(
|
||||||
|
max_length=50, verbose_name='昵称', null=True, blank=True)
|
||||||
|
password = models.CharField(max_length=255, verbose_name='密码')
|
||||||
|
mobile = models.CharField(max_length=20, verbose_name='手机号', unique=True)
|
||||||
|
desc = models.TextField(null=True, blank=True, verbose_name='简介')
|
||||||
|
account_type = models.IntegerField(
|
||||||
|
default=UserAccountTypeChoices.NORMAL, verbose_name='账号类型')
|
||||||
|
avatar = models.URLField(
|
||||||
|
default='https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640', verbose_name='头像')
|
||||||
|
home_path = models.CharField(
|
||||||
|
max_length=50, verbose_name='登录后跳转的页面', default='/qc/rule')
|
||||||
|
app_secret = models.CharField(default=lambda: uuid.uuid4().hex, editable=False, unique=True, max_length=32,
|
||||||
|
verbose_name='app_secret')
|
||||||
|
is_active = models.BooleanField(default=True, verbose_name='是否激活')
|
||||||
|
last_login = models.DateTimeField(
|
||||||
|
null=True, blank=True, verbose_name='上次登录时间')
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||||
|
update_time = models.DateTimeField(auto_now=True, verbose_name='创建时间')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
db_table = 'pb_user'
|
||||||
|
verbose_name = '用户'
|
|
@ -0,0 +1,6 @@
|
||||||
|
from rest_framework.routers import SimpleRouter
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
router = SimpleRouter(trailing_slash=False)
|
||||||
|
|
||||||
|
urlpatterns = router.urls
|
|
@ -33,7 +33,7 @@ THIRD_PARTY_APPS = [
|
||||||
"rest_framework",
|
"rest_framework",
|
||||||
]
|
]
|
||||||
|
|
||||||
LOCAL_APPS = ["apps.jqr", "apps.qc", "apps.warning"]
|
LOCAL_APPS = ["apps.jqr", "apps.qc", "apps.warning", "apps.user", "apps.system"]
|
||||||
|
|
||||||
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue