some improve
This commit is contained in:
1 parent
fa73a734a0
commit
2e5d0bcdd3
17 files changed
+1512
-226
No files matched your search
@@ -11,9 +11,10 @@ from django.utils import timezone
|
||||
from persiantools.jdatetime import JalaliDate
|
||||
|
||||
from ..models import Action, Customer
|
||||
from ..sms.triggers import notify_visit_scheduled
|
||||
from ..sms.triggers import notify_install_scheduled, notify_visit_scheduled
|
||||
from ..visit_policy import (REASON_CANCEL, REASON_CREATE, REASON_EDIT,
|
||||
ActionDeleteError, as_aware, clear_visit_hold,
|
||||
ActionDeleteError, as_aware,
|
||||
cancel_pending_sms_for_action, clear_visit_hold,
|
||||
default_hold_until, normalize_finish_datetime,
|
||||
normalize_hold_until, refresh_last_bazdid,
|
||||
set_visit_hold, soft_delete_action,
|
||||
@@ -159,6 +160,45 @@ def _apply_visit_hold(customer_obj, payload, *, status, is_new, force_hold=False
|
||||
return result
|
||||
|
||||
|
||||
# نگاشت «نوع اقدام → (تریگر پیامک، نوع پیامک)». تنها منبعِ تصمیم است تا مسیر
|
||||
# «ایجاد» و «ویرایش» هرگز واگرا نشوند (باگ قبلی: ویرایش تریگر را صدا نمیزد).
|
||||
_ACTION_EVENT_SMS = {
|
||||
Action.ActionType.BAZDID: (notify_visit_scheduled, 'visit_created'),
|
||||
Action.ActionType.NASB: (notify_install_scheduled, 'install_created'),
|
||||
}
|
||||
|
||||
|
||||
def _sync_action_event_sms(customer, action, *, previous_type=None, user=None):
|
||||
"""همراستاسازی پیامک رویدادی با نوع اقدام (مشترکِ ایجاد و ویرایش).
|
||||
|
||||
* نوع جدید **رویدادی** است (بازدید/نصب):
|
||||
- اگر نوع عوض شده باشد (یا رکورد تازه باشد) ⇒ تریگر همان نوع صدا زده
|
||||
میشود. تکرار ممکن نیست: کلید یکتاسازی ``{sms_type}:{action.pk}`` است.
|
||||
- اگر نوع همان بوده باشد (ویرایش عادی متن/تاریخ) ⇒ هیچ پیامکی ساخته
|
||||
نمیشود، پس ویرایشهای پیاپی اسپم تولید نمیکنند.
|
||||
* نوع جدید **غیررویدادی** است ولی قبلاً رویدادی بود ⇒ پیامک معلقِ همان رکورد
|
||||
لغو میشود (کاربر عملاً بازدید/نصب را پس گرفته است).
|
||||
|
||||
خروجی: تعداد پیامکهای ساختهشده.
|
||||
"""
|
||||
current = _ACTION_EVENT_SMS.get(action.actionType)
|
||||
previous = _ACTION_EVENT_SMS.get(previous_type) if previous_type else None
|
||||
|
||||
# نوع رویدادی عوض شده (بازدید ↔ نصب) ⇒ پیامک معلقِ نوع قبلی همین رکورد لغو شود،
|
||||
# وگرنه هر دو پیامک در صف میمانند.
|
||||
if previous is not None and previous_type != action.actionType:
|
||||
cancel_pending_sms_for_action(
|
||||
customer, action_id=action.pk, sms_type=previous[1],
|
||||
)
|
||||
|
||||
if current is None:
|
||||
# نوع جدید رویدادی نیست؛ اگر قبلاً بود، پیامکش همین بالا لغو شد.
|
||||
return 0
|
||||
if previous_type == action.actionType:
|
||||
return 0 # ویرایش عادی همان نوع ⇒ پیامک تازهای لازم نیست
|
||||
return current[0](customer, action, created_by=user)
|
||||
|
||||
|
||||
def _jalali_day(value):
|
||||
"""تاریخ شمسی روز (به وقت محلی) برای پیامهای کاربر."""
|
||||
if value is None:
|
||||
@@ -232,9 +272,8 @@ def customerNewAction(request ,c_id):
|
||||
)
|
||||
_report_hold_result(request, hold_result)
|
||||
|
||||
# پیامک «بازدید شما برای تاریخ … ثبت شد» فقط برای اقدام از نوع بازدید.
|
||||
if newAction.actionType == Action.ActionType.BAZDID:
|
||||
notify_visit_scheduled(customer_obj, newAction, created_by=request.user)
|
||||
# پیامک «بازدید/نصب شما برای تاریخ … ثبت شد» (برای اقدام از نوع بازدید یا نصب).
|
||||
_sync_action_event_sms(customer_obj, newAction, user=request.user)
|
||||
|
||||
return redirect('/panel/customer/'+str(c_id)+'/action')
|
||||
|
||||
@@ -270,6 +309,9 @@ def customerEditAction(request ,c_id, action_id):
|
||||
customer_obj = Customer.objects.get(id=int(c_id))
|
||||
newAction = Action.objects.get(id=action_id)
|
||||
was_done = newAction.status == Action.Status.FINISH
|
||||
# نوع **قبلی** رکورد (پیش از بازنویسی) — برای تشخیص گذار «غیربازدید → بازدید»
|
||||
# و برعکس. اگر بعد از ``save()`` خوانده شود، همیشه مقدار جدید است.
|
||||
previous_type = newAction.actionType
|
||||
|
||||
newAction.actionType = payload['actionType']
|
||||
newAction.actionDateTime = payload['actionDateTime']
|
||||
@@ -297,6 +339,15 @@ def customerEditAction(request ,c_id, action_id):
|
||||
)
|
||||
_report_hold_result(request, hold_result)
|
||||
|
||||
# پیامک «بازدید/نصب شما برای تاریخ … ثبت شد».
|
||||
# فقط *گذار* نوع اقدام بررسی میشود، نه هر ویرایش (جزئیات در
|
||||
# ``_sync_action_event_sms``):
|
||||
# * غیررویدادی → بازدید/نصب ⇒ تریگر همان نوع صدا زده میشود.
|
||||
# * بازدید/نصب → نوع دیگر ⇒ پیامک معلقِ همان رکورد لغو میشود.
|
||||
_sync_action_event_sms(
|
||||
customer_obj, newAction, previous_type=previous_type, user=request.user,
|
||||
)
|
||||
|
||||
#return redirect('/panel/customer/'+str(c_id)+'/action')
|
||||
return redirect(request.META.get('HTTP_REFERER', 'redirect_if_referer_not_found'))
|
||||
|
||||
|
||||
Reference in new issue
Block a user