fix: 审核配置缺 club_id 时回落旧表,避免 hqsp 500

服务器未 migrate shop.0004 时不再因 Unknown column 打挂点单商品接口。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-21 03:56:11 +08:00
parent 8e82a8457d
commit 24cb0b88f7

View File

@@ -1,43 +1,107 @@
"""点单端商品展示 / 店铺审核模式:按俱乐部隔离。"""
import logging
from django.db import OperationalError, ProgrammingError
from django.db.utils import DatabaseError
from jituan.constants import CLUB_ID_DEFAULT
from shop.models import DianpuShangpinShenheShezhi
logger = logging.getLogger(__name__)
_SCHEMA_ERRORS = (OperationalError, ProgrammingError, DatabaseError)
def _norm_club_id(club_id):
return (club_id or CLUB_ID_DEFAULT).strip() or CLUB_ID_DEFAULT
def _legacy_row_values(*fields):
"""
表尚未 migrate club_id 时:只查旧列,避免 SELECT club_id 导致 1054。
"""
try:
return DianpuShangpinShenheShezhi.objects.values(*fields).first()
except _SCHEMA_ERRORS:
return None
def get_or_create_shenhe_config(club_id):
"""获取或创建某俱乐部的审核展示配置。"""
cid = _norm_club_id(club_id)
config, _ = DianpuShangpinShenheShezhi.objects.get_or_create(
club_id=cid,
defaults={
'kaiqi_shenhe': False,
'zhi_kan_shenhe': True,
},
)
return config
try:
config, _ = DianpuShangpinShenheShezhi.objects.get_or_create(
club_id=cid,
defaults={
'kaiqi_shenhe': False,
'zhi_kan_shenhe': True,
},
)
return config
except _SCHEMA_ERRORS as exc:
logger.error(
'审核配置表缺 club_id请执行 migrate shop。回落只读旧行。err=%s',
exc,
)
# 尽量读旧全局行;读写接口若 save 仍会失败,需尽快 migrate
try:
obj = DianpuShangpinShenheShezhi.objects.defer('club_id').order_by('id').first()
if obj is not None:
return obj
except _SCHEMA_ERRORS:
pass
# 内存占位,避免后台整页 500
from types import SimpleNamespace
return SimpleNamespace(
id=None,
club_id=cid,
kaiqi_shenhe=False,
zhi_kan_shenhe=True,
save=lambda *a, **k: (_ for _ in ()).throw(
RuntimeError('请先在服务器执行: python manage.py migrate shop')
),
)
def is_zhi_kan_shenhe_enabled(club_id):
"""
未绑店用户是否只看审核专用商品。
无配置时默认 True保持历史行为。
未 migrate club_id 时回落旧表,绝不因缺列导致 /hqsp 500。
"""
config = DianpuShangpinShenheShezhi.query.filter(
club_id=_norm_club_id(club_id)
).first()
if not config:
return True
return bool(getattr(config, 'zhi_kan_shenhe', True))
try:
config = DianpuShangpinShenheShezhi.query.filter(
club_id=_norm_club_id(club_id)
).first()
if not config:
return True
return bool(getattr(config, 'zhi_kan_shenhe', True))
except _SCHEMA_ERRORS as exc:
logger.error(
'is_zhi_kan_shenhe_enabled 缺列回落(请 migrate shop。err=%s',
exc,
)
row = _legacy_row_values('zhi_kan_shenhe')
if not row:
return True
return bool(row.get('zhi_kan_shenhe', True))
def is_kaiqi_shenhe_enabled(club_id):
"""店铺发布商品是否需平台审核。无配置默认 False。"""
config = DianpuShangpinShenheShezhi.query.filter(
club_id=_norm_club_id(club_id)
).first()
if not config:
return False
return bool(config.kaiqi_shenhe)
try:
config = DianpuShangpinShenheShezhi.query.filter(
club_id=_norm_club_id(club_id)
).first()
if not config:
return False
return bool(config.kaiqi_shenhe)
except _SCHEMA_ERRORS as exc:
logger.error(
'is_kaiqi_shenhe_enabled 缺列回落(请 migrate shop。err=%s',
exc,
)
row = _legacy_row_values('kaiqi_shenhe')
if not row:
return False
return bool(row.get('kaiqi_shenhe', False))