record the 2026-09-26 Bazaar fix deploy: bdd5aba live, authorize link sent

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-26 22:01:39 +03:30
parent bdd5aba985
commit f6cdfddaa9
4 changed files with 71 additions and 11 deletions

View File

@@ -76,6 +76,27 @@ def send_sms(*, phone: str, message: str) -> None:
می‌زنه، و پاسخ رو اعتبارسنجی می‌کنه. کلیدِ API هیچ‌وقت داخل کد نیست؛
همیشه از env خونده می‌شه (settings.KAVENEGAR_API_KEY).
"""
payload = {'receptor': phone, 'message': message}
if settings.KAVENEGAR_SENDER:
payload['sender'] = settings.KAVENEGAR_SENDER
_kavenegar_post(phone=phone, method='sms/send.json', payload=payload)
def send_verify_lookup(*, phone: str, template: str, token: str) -> None:
"""
ارسال با الگوی تأییدشده‌ی کاوه‌نگار (verify/lookup) — متن را الگوی پنل می‌سازد
و ما فقط token را می‌فرستیم. کاوه‌نگارِ این حساب پیامکِ متنِ آزاد را از خطِ
پیش‌فرض لغو می‌کند (وضعیتِ ۱۳، ۲۰۲۶-۰۹-۲۵) و کدِ ورود را فقط از این راه می‌پذیرد.
token نباید فاصله داشته باشد (قاعده‌ی کاوه‌نگار)؛ کدِ OTP شش رقمِ پیوسته است.
"""
_kavenegar_post(
phone=phone, method='verify/lookup.json',
payload={'receptor': phone, 'template': template, 'token': token},
)
def _kavenegar_post(*, phone: str, method: str, payload: dict) -> None:
"""فراخوانیِ مشترکِ کاوه‌نگار و سنجشِ پاسخ؛ هر شکستی SMSDeliveryError است."""
if not settings.KAVENEGAR_API_KEY:
logger.error(
'SMS misconfigured: KAVENEGAR_API_KEY is not set (phone_suffix=%s)',
@@ -83,13 +104,9 @@ def send_sms(*, phone: str, message: str) -> None:
)
raise SMSDeliveryError('پیکربندیِ سرویسِ پیامک ناقص است.')
payload = {'receptor': phone, 'message': message}
if settings.KAVENEGAR_SENDER:
payload['sender'] = settings.KAVENEGAR_SENDER
try:
response = requests.post(
f'https://api.kavenegar.com/v1/{settings.KAVENEGAR_API_KEY}/sms/send.json',
f'https://api.kavenegar.com/v1/{settings.KAVENEGAR_API_KEY}/{method}',
data=payload,
timeout=5,
)
@@ -146,7 +163,8 @@ def send_otp_sms(*, phone: str, code: str) -> None:
واقعی‌ای نمی‌فرسته — چون در این محیط، RequestOTPView خودِ کد رو در
فیلدِ devOtp پاسخ برمی‌گردونه و SMS واقعی لازم نیست (رفتار قبلی dev
حفظ شده).
- DEBUG=False (production): send_sms صدا زده می‌شه؛ هر SMSDeliveryError
- DEBUG=False (production): اگر KAVENEGAR_OTP_TEMPLATE تنظیم باشد با الگو
(send_verify_lookup)، وگرنه متنِ آزادِ OTP_SMS_TEMPLATE با send_sms؛ هر SMSDeliveryError
به OTPDeliveryError نگاشت می‌شه تا رفتار/نوعِ استثنایی که
RequestOTPView انتظارش رو داره حفظ بمونه (کاربر پاسخ ۵۰۳ صریح
می‌گیره، نه یک success دروغین).
@@ -158,9 +176,11 @@ def send_otp_sms(*, phone: str, code: str) -> None:
)
return
message = settings.OTP_SMS_TEMPLATE.format(code=code)
try:
send_sms(phone=phone, message=message)
if settings.KAVENEGAR_OTP_TEMPLATE:
send_verify_lookup(phone=phone, template=settings.KAVENEGAR_OTP_TEMPLATE, token=code)
else:
send_sms(phone=phone, message=settings.OTP_SMS_TEMPLATE.format(code=code))
except SMSDeliveryError as exc:
raise OTPDeliveryError(str(exc)) from exc