Files
khatibi/fix_customer_phones.md
T
2026-10-10 14:21:04 +03:30

5.5 KiB

اصلاح دستی شماره‌های قدیمی مشتریان

چرا؟

فیلد‌های phone1 / phone2 / phone3 در مدل Customer از نوع CharField هستند و سال‌ها داده در آن‌ها به هر شکلی وارد شده: بدون صفر ابتدایی (9133722815)، ارقام فارسی، فاصله/خط تیره، شمارهٔ ثابت ۸رقمی، یا کلاهی متن آزاد (نام، تاریخ نصب، «معرف …»).

هدف: هرچه در فیلد شماره هست پاک‌سازی شود، موبایل به شکل استاندارد 09xxxxxxxxx در بیاید، و هیچ متنی از سیستم حذف نشود — متن‌های برداشته‌شده در فیلد Customer.notes (توضیحات) می‌مانند و در پنل، ستون سمت راست صفحهٔ مشتری نمایش داده می‌شوند.

این کار یک‌بار لازم است. دستور idempotent است؛ اجرای دوباره‌اش هیچ تغییری ایجاد نمی‌کند و یادداشتی را تکرار نمی‌کند.

قاعدهٔ پاک‌سازی

ورودی (نمونه) نتیجه
9133722815 09133722815 (و اصل متن در توضیحات)
۰۹۱۳۳۷۲۲۸۱۵ 09133722815 (و اصل متن در توضیحات)
0913-372-2815 09133722815 (و اصل متن در توضیحات)
57322182/9130261671 09130261671 (کل متن اصلی در توضیحات)
57387608 (ثابت ۸رقمی) دست‌نخورده
اعظمی (متن آزاد) خالی؛ اعظمی در توضیحات
0 (تکهٔ بی‌معنی) خالی؛ 0 در توضیحات

خلاصه: هرچیزی که در مقدار جدید نمی‌ماند، بی‌کم‌وکاست در notes ثبت می‌شود.

اجرای دستور

دستور منیجمنت: fix_customer_phones

۱) اول «شبیه‌سازی» — بدون هیچ تغییری

فقط گزارش می‌دهد چه چیزی تغییر می‌کند. قبل از هر اجرای واقعی این را بزنید.

از WSL:

cd /mnt/d/projects/khatibi
.venv/Scripts/python.exe manage.py fix_customer_phones --dry-run

از ویندوز (PowerShell / CMD):

cd D:\projects\khatibi
.venv\Scripts\python.exe manage.py fix_customer_phones --dry-run

خروجی نمونه:

شبیه‌سازی (بدون تغییر): 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.

۲) اجرای واقعی

.venv/Scripts/python.exe manage.py fix_customer_phones

خروجی نمونه:

پاک‌سازی انجام شد: 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.

۳) اجرای دوباره برای اطمینان (اختیاری)

دوباره بزنید؛ باید صفر باشد:

پاک‌سازی انجام شد: 0 مشتری، 0 فیلد اصلاح شد، 0 یادداشت ثبت شد.

اجرا روی سرور اصلی (production)

دستور برای همین کار نوشته شده: روی دیتابیس production هم بی‌خطر است.

cd /path/to/khatibi            # مسیر پروژه روی سرور
source .venv/bin/activate      # یا مسیر venv سرور
python manage.py fix_customer_phones --dry-run   # اول شبیه‌سازی
python manage.py fix_customer_phones             # سپس اجرا

توصیهٔ مهم: پیش از اجرای واقعی روی production یک بکاپ از دیتابیس بگیرید (دستور sqlite_db_backup در همین پروژه موجود است). شبیه‌سازی فقط می‌خواند و بی‌خطر است، ولی بکاپ عادت خوبی است.

راه جایگزین: مهاجرت (migration)

هنگام manage.py migrate، مهاجرت 0067_customer_notes هم فیلد notes را می‌سازد و هم همین پاک‌سازی را یک‌بار روی دیتابیس اجرا می‌کند. پس اگر سرور را با migrate به‌روز می‌کنید، لازم نیست دستور را جدا بزنید؛ نتیجه یکی است.

هر دو مسیر به یک پیاده‌سازی مشترک (admin_panel/sms/phone_cleanup.py) تکیه دارند.

مشاهدهٔ نتیجه

پس از اجرا، به /panel/customer/<id> بروید. فیلد توضیحات در ستون سمت راست (کنار نام، آدرس، شماره‌های تماس) متن‌های برداشته‌شده را نشان می‌دهد، با سرصفحهٔ:

— پاک‌سازی خودکار فیلدهای تلفن —
«phone3»: نصب جدید 1401/07/02

این فیلد در حالت «ویرایش» قابل تغییر است و مقدارش ذخیره می‌شود.

نکته‌ها

  • شماره‌های ثابت ۸رقمی طبق تصمیم، دست‌نخورده می‌مانند.
  • جدول PhoneNumber (شماره‌های جدید) دست‌کاری نمی‌شود؛ فقط فیلدهای قدیمی.
  • اگر دستور را با قاعدهٔ قدیمی روی یک دیتابیس اجرا کرده باشید، تکه‌های بی‌معنی (0، 573) که آن زمان بدون یادداشت پاک شده‌اند قابل بازیابی نیستند. روی production که هنوز اجرا نشده، همه‌چیز کامل حفظ می‌شود.