44 lines
1.8 KiB
Python
44 lines
1.8 KiB
Python
"""Provider کنسول برای تست/دیباگ؛ پیامک واقعی ارسال نمیکند."""
|
|
import logging
|
|
import sys
|
|
|
|
from django.conf import settings
|
|
|
|
from .base import SMSProvider, SMSResult, webotp_message
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def console_write(text):
|
|
"""چاپ روی کنسول بهگونهای که **هرگز** استثنا پرت نکند.
|
|
|
|
وظیفهٔ provider ارسال است، نه نمایش. کنسول ویندوز (cp1252) فارسی را کدگذاری
|
|
نمیکند و ``print`` مستقیم باعث ``UnicodeEncodeError`` میشد؛ چون فراخوانیکننده
|
|
(worker) هر استثنا را «ارسال ناموفق» میفهمد، یک خطای نمایشی پیامک را در صف
|
|
``failed`` میگذاشت. پس اول تلاش میکنیم متن کامل را بنویسیم، و اگر کنسول
|
|
توانش را نداشت نسخهٔ ASCII-شده را مینویسیم.
|
|
"""
|
|
for payload in (text, text.encode("ascii", "replace").decode("ascii")):
|
|
try:
|
|
sys.stdout.write(payload + "\n")
|
|
sys.stdout.flush()
|
|
return
|
|
except (UnicodeEncodeError, ValueError, OSError):
|
|
continue
|
|
|
|
|
|
class ConsoleSMSProvider(SMSProvider):
|
|
def __init__(self, config=None):
|
|
self.config = config
|
|
|
|
def send_otp(self, mobile, code):
|
|
if settings.DEBUG:
|
|
console_write(f"[DEV OTP] {mobile}: {webotp_message(code)}")
|
|
return SMSResult(True, provider_code="console")
|
|
|
|
def send_message(self, mobile, message):
|
|
logger.info("[DEV SMS] destination=***%s message=%s", (mobile or "")[-4:], message)
|
|
if settings.DEBUG:
|
|
console_write(f"[DEV SMS] {mobile}: {message}")
|
|
return SMSResult(True, provider_code="console")
|