"""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")