152 lines
4.2 KiB
Python
152 lines
4.2 KiB
Python
"""
|
||
小程序/微信系统配置 — 优先读数据库 XcxSysPeizhi,空则回退 settings.py(兼容旧部署)。
|
||
"""
|
||
import logging
|
||
|
||
from decimal import Decimal
|
||
|
||
from django.conf import settings
|
||
from django.core.cache import cache
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
_CACHE_KEY = 'xcx_sys_peizhi_row_v1'
|
||
_CACHE_TTL = 120
|
||
|
||
|
||
def clear_xcx_sys_peizhi_cache():
|
||
cache.delete(_CACHE_KEY)
|
||
|
||
|
||
def _load_row():
|
||
cached = cache.get(_CACHE_KEY)
|
||
if cached is not _CACHE_NONE and cached is not None:
|
||
return cached
|
||
try:
|
||
from peizhi.models import XcxSysPeizhi
|
||
row = XcxSysPeizhi.objects.first()
|
||
except Exception as e:
|
||
logger.warning('读取 XcxSysPeizhi 失败,使用 settings 回退: %s', e)
|
||
row = None
|
||
cache.set(_CACHE_KEY, row if row else _CACHE_NONE, _CACHE_TTL)
|
||
return row if row else None
|
||
|
||
|
||
_CACHE_NONE = object()
|
||
|
||
|
||
def _val(db_attr, settings_attr, default=None):
|
||
row = _load_row()
|
||
if row is not None:
|
||
v = getattr(row, db_attr, None)
|
||
if v is not None and v != '':
|
||
return v
|
||
if settings_attr:
|
||
v = getattr(settings, settings_attr, default)
|
||
return v if v is not None and v != '' else default
|
||
return default
|
||
|
||
|
||
class WxConfig:
|
||
"""微信/小程序配置代理(属性名与 settings 保持一致,便于渐进替换)"""
|
||
|
||
@property
|
||
def WEIXIN_APPID(self):
|
||
return _val('weixin_appid', 'WEIXIN_APPID', '')
|
||
|
||
@property
|
||
def WEIXIN_SECRET(self):
|
||
return _val('weixin_secret', 'WEIXIN_SECRET', '')
|
||
|
||
@property
|
||
def WEIXIN_OFFICIAL_APPID(self):
|
||
return _val('weixin_official_appid', 'WEIXIN_OFFICIAL_APPID', '')
|
||
|
||
@property
|
||
def WEIXIN_OFFICIAL_SECRET(self):
|
||
return _val('weixin_official_secret', 'WEIXIN_OFFICIAL_SECRET', '')
|
||
|
||
@property
|
||
def WEIXIN_OFFICIAL_TOKEN(self):
|
||
return _val('weixin_official_token', 'WEIXIN_OFFICIAL_TOKEN', '')
|
||
|
||
@property
|
||
def WEIXIN_OFFICIAL_ENCODING_AES_KEY(self):
|
||
return _val('weixin_official_encoding_aes_key', 'WEIXIN_OFFICIAL_ENCODING_AES_KEY', '')
|
||
|
||
@property
|
||
def WEIXIN_TEMPLATE_ID(self):
|
||
return _val('weixin_template_id', 'WEIXIN_TEMPLATE_ID', '')
|
||
|
||
@property
|
||
def WEIXIN_TEMPLATE_MAX_PER_MINUTE(self):
|
||
return _val('weixin_template_max_per_minute', 'WEIXIN_TEMPLATE_MAX_PER_MINUTE', 950)
|
||
|
||
@property
|
||
def WEIXIN_TEMPLATE_BATCH_SIZE(self):
|
||
return _val('weixin_template_batch_size', 'WEIXIN_TEMPLATE_BATCH_SIZE', 100)
|
||
|
||
@property
|
||
def WEIXIN_BROADCAST_ENABLED(self):
|
||
row = _load_row()
|
||
if row is not None:
|
||
return bool(row.weixin_broadcast_enabled)
|
||
return getattr(settings, 'WEIXIN_BROADCAST_ENABLED', True)
|
||
|
||
@property
|
||
def WEIXIN_BROADCAST_WORKERS(self):
|
||
return _val('weixin_broadcast_workers', 'WEIXIN_BROADCAST_WORKERS', 30)
|
||
|
||
@property
|
||
def WEIXIN_MCHID(self):
|
||
return _val('weixin_mchid', 'WEIXIN_MCHID', '')
|
||
|
||
@property
|
||
def WEIXIN_SHANGHUMIYAO(self):
|
||
return _val('weixin_shanghu_miyao', 'WEIXIN_SHANGHUMIYAO', '')
|
||
|
||
@property
|
||
def WEIXIN_NOTIFY_URL(self):
|
||
return _val('weixin_notify_url', 'WEIXIN_NOTIFY_URL', '')
|
||
|
||
@property
|
||
def WEIXIN_CERT_PATH(self):
|
||
return _val('weixin_cert_path', 'WEIXIN_CERT_PATH', '')
|
||
|
||
@property
|
||
def WEIXIN_KEY_PATH(self):
|
||
return _val('weixin_key_path', 'WEIXIN_KEY_PATH', '')
|
||
|
||
@property
|
||
def NOTIFY_BASE_URL(self):
|
||
return _val('notify_base_url', None, 'https://wenhe.nmslb.com/hqhd').rstrip('/')
|
||
|
||
@property
|
||
def SHANGPIN_SHENHE_MODE(self):
|
||
row = _load_row()
|
||
if row is not None and row.shangpin_shenhe_mode in (1, 2):
|
||
return int(row.shangpin_shenhe_mode)
|
||
return 2
|
||
|
||
@property
|
||
def SHANGJIA_PAIFA_JIAGE_MIN(self):
|
||
row = _load_row()
|
||
if row is not None and row.shangjia_paifa_jiage_min is not None:
|
||
return row.shangjia_paifa_jiage_min
|
||
return Decimal('10')
|
||
|
||
@property
|
||
def SHANGJIA_PAIFA_JIAGE_MAX(self):
|
||
row = _load_row()
|
||
if row is not None and row.shangjia_paifa_jiage_max is not None:
|
||
return row.shangjia_paifa_jiage_max
|
||
return Decimal('10000')
|
||
|
||
|
||
wx_cfg = WxConfig()
|
||
|
||
|
||
def get_shangpin_shenhe_zhuangtai():
|
||
"""点单页商品接口筛选 shenhezhuangtai:1=正常,2=审核专用"""
|
||
return wx_cfg.SHANGPIN_SHENHE_MODE
|