122 lines
5.5 KiB
Markdown
122 lines
5.5 KiB
Markdown
# اصلاح دستی شمارههای قدیمی مشتریان
|
|
|
|
## چرا؟
|
|
|
|
فیلدهای `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:
|
|
|
|
```bash
|
|
cd /mnt/d/projects/khatibi
|
|
.venv/Scripts/python.exe manage.py fix_customer_phones --dry-run
|
|
```
|
|
|
|
از ویندوز (PowerShell / CMD):
|
|
|
|
```bat
|
|
cd D:\projects\khatibi
|
|
.venv\Scripts\python.exe manage.py fix_customer_phones --dry-run
|
|
```
|
|
|
|
خروجی نمونه:
|
|
|
|
```
|
|
شبیهسازی (بدون تغییر): 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.
|
|
```
|
|
|
|
### ۲) اجرای واقعی
|
|
|
|
```bash
|
|
.venv/Scripts/python.exe manage.py fix_customer_phones
|
|
```
|
|
|
|
خروجی نمونه:
|
|
|
|
```
|
|
پاکسازی انجام شد: 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.
|
|
```
|
|
|
|
### ۳) اجرای دوباره برای اطمینان (اختیاری)
|
|
|
|
دوباره بزنید؛ باید صفر باشد:
|
|
|
|
```
|
|
پاکسازی انجام شد: 0 مشتری، 0 فیلد اصلاح شد، 0 یادداشت ثبت شد.
|
|
```
|
|
|
|
## اجرا روی سرور اصلی (production)
|
|
|
|
دستور برای همین کار نوشته شده: روی دیتابیس production هم بیخطر است.
|
|
|
|
```bash
|
|
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 که هنوز اجرا نشده، همهچیز کامل حفظ میشود.
|