sms
This commit is contained in:
1 parent
250cdbab7f
commit
5c6069c3ef
87 files changed
+29209
-3697
No files matched your search
@@ -0,0 +1,121 @@
|
||||
# اصلاح دستی شمارههای قدیمی مشتریان
|
||||
|
||||
## چرا؟
|
||||
|
||||
فیلدهای `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 که هنوز اجرا نشده، همهچیز کامل حفظ میشود.
|
||||
Reference in new issue
Block a user