Files
Django/jituan/services/invite_guard.py
2026-07-08 18:31:14 +08:00

53 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""邀请码 / 邀请链俱乐部隔离。"""
import logging
from jituan.models import UserWxOpenid
from jituan.services.club_resolver import resolve_club_id_for_wechat_request
from jituan.services.club_user import resolve_invite_party_club
logger = logging.getLogger(__name__)
def _invitee_has_club_binding(user, club_id):
uid = getattr(user, 'UserUID', None)
if not uid or not club_id:
return False
return UserWxOpenid.query.filter(yonghuid=uid, club_id=club_id).exists()
def assert_invite_same_club(request, inviter_user, invitee_user=None):
"""
校验邀请人与被邀请人属于同一俱乐部,且与请求 club 一致。
未归属俱乐部的被邀请人允许在本小程序完成首次注册。
返回 (ok, message)
"""
club_id = resolve_club_id_for_wechat_request(request)
inviter_club = resolve_invite_party_club(inviter_user, club_id)
if inviter_club is None:
# 管事未落库 ClubID/绑定时,以当前小程序为准(星之界扫码邀请常见)
inviter_club = club_id
if inviter_club != club_id:
logger.warning(
'invite_guard 管事俱乐部不符 inviter=%s inviter_club=%s req_club=%s',
getattr(inviter_user, 'UserUID', '?'), inviter_club, club_id,
)
return False, '邀请码不属于当前小程序俱乐部'
if invitee_user is not None:
invitee_club = resolve_invite_party_club(invitee_user, club_id)
if invitee_club is not None and invitee_club != club_id:
# 仅在「管事码也不属于当前小程序」且「用户已绑定别俱乐部 wx」时拒绝
if (
inviter_club != club_id
and _invitee_has_club_binding(invitee_user, invitee_club)
and not _invitee_has_club_binding(invitee_user, club_id)
):
logger.warning(
'invite_guard 被邀请人俱乐部不符 invitee=%s invitee_club=%s req_club=%s',
getattr(invitee_user, 'UserUID', '?'), invitee_club, club_id,
)
return False, '您的账号归属与当前小程序不一致,请使用对应俱乐部小程序'
# 管事码已证明属于当前小程序时,允许老 xq 账号在 xzj 完成注册(注册后写 ClubID
return True, ''