"""پیام‌های نتیجهٔ عملیات پنل پیامک. جایگزین flash message جنگو است: پیام‌های جنگو در session ذخیره می‌شوند و اگر قالب مقصد آن‌ها را رندر نکند، تا صفحهٔ بعدِ دارای بلوک پیام «سرگردان» می‌مانند و بی‌ربط به عملیات ظاهر می‌شوند. این‌جا پیام با یک کد در querystring (``?notice=``) رد و بدل می‌شود؛ چون کد فقط روی همان URL وجود دارد، پیام هم فقط همان‌جا دیده می‌شود و هیچ‌جا سرگردان نمی‌ماند. مقدار ``{placeholder}`` در متن از پارامترهای querystring پر می‌شود (نبودِ پارامتر ⇒ رشتهٔ خالی). """ from collections import defaultdict # کد → (شدت، متن). شدت به کلاس Bulma نگاشت می‌شود. NOTICES = { # --- تنظیمات و ارسال آزمایشی --- "test_sent": ("success", "پیامک آزمایشی در صف ارسال قرار گرفت."), "settings_saved": ("success", "تنظیمات سامانه پیامک ذخیره شد."), # --- قالب‌ها --- "tpl_saved": ("success", "قالب «{title}» ذخیره شد."), "tpl_bad_timing": ("error", "مقدار زمان‌بندی باید یک عدد صحیح باشد."), # --- مشتری --- "customer_sms_saved": ("success", "تنظیم پیامک مشتری به‌روزرسانی شد."), "primary_updated": ("success", "شمارهٔ اصلی پیامک به‌روزرسانی شد."), "primary_not_found": ("error", "شماره موردنظر برای این مشتری یافت نشد."), "custom_queued": ("success", "پیامک سفارشی در صف ارسال قرار گرفت."), "custom_empty": ("error", "متن پیامک خالی است."), "custom_no_phone": ("error", "شماره اصلی معتبری برای این مشتری یافت نشد."), # --- صف --- "approved": ("success", "پیامک تأیید شد و برای ارسال در صف قرار گرفت."), "not_pending": ("warning", "این پیامک در وضعیت «در انتظار تأیید» نیست."), "deleted": ("success", "پیامک از صف حذف شد."), "bulk_approved_all": ("success", "{count} پیامک تأیید شد و برای ارسال در صف قرار گرفت."), "bulk_approved": ("success", "{count} پیامک تأیید شد."), "bulk_deleted": ("success", "{count} پیامک از صف حذف شد."), "invalid_action": ("error", "اقدام نامعتبر است."), "queue_emptied": ("success", "کل صف خالی شد ({count} پیامک حذف شد)."), "retried": ("success", "پیامک برای ارسال مجدد تأیید شد."), } _KIND_CLASSES = { "success": "is-success", "error": "is-danger", "warning": "is-warning", "info": "is-info", } def resolve(request): """کد ``?notice=`` را به متن/کلاس قابل رندر در قالب تبدیل می‌کند.""" get = getattr(request, "GET", None) or {} entry = NOTICES.get((get.get("notice") or "").strip()) if not entry: return {} kind, text = entry return { "notice_text": text.format_map(defaultdict(str, get)), "notice_kind": _KIND_CLASSES.get(kind, "is-info"), }