68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
"""توابع و ابزارهای مشترک لایهٔ ویوها."""
|
|
import datetime
|
|
import logging
|
|
|
|
from django.utils import timezone
|
|
from persiantools.jdatetime import JalaliDate
|
|
from persiantools import digits
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class InventoryException(Exception):
|
|
"""خطای اختصاصی برای کنترل موجودی انبار"""
|
|
pass
|
|
|
|
|
|
def _safe_int(value, default=0):
|
|
"""تابع امن برای تبدیل مقادیر دریافتی از جاوااسکریپت به عدد"""
|
|
if value is None:
|
|
return default
|
|
try:
|
|
clean_val = str(value).strip()
|
|
return int(clean_val) if clean_val else default
|
|
except (ValueError, TypeError):
|
|
return default
|
|
|
|
|
|
def _parse_jalali_date(date_str):
|
|
"""تبدیل امن تاریخ ارسالی از pDatepicker به میلادی"""
|
|
if not date_str or not str(date_str).strip():
|
|
return None
|
|
try:
|
|
clean_date = digits.fa_to_en(digits.ar_to_fa(str(date_str).strip()))
|
|
y, m, d = map(int, clean_date.split("/"))
|
|
return JalaliDate(y, m, d).to_gregorian()
|
|
except Exception as e:
|
|
logger.warning(f"Error parsing Jalali date '{date_str}': {e}")
|
|
return None
|
|
|
|
|
|
def _parse_phone_rows(request):
|
|
"""آرایههای شمارهٔ فرم مشتری را به ردیفهای معتبر تبدیل میکند.
|
|
|
|
خروجی یک سهگانه است: ردیفهای آمادهٔ ذخیره، آرایهٔ خام شمارهها، و ایندکس ردیفهای
|
|
«اصلی». ایندکسها عمداً نسبت به *آرایهٔ خام* برگردانده میشوند نه ردیفهای فیلترشده؛
|
|
وگرنه حذف ردیفهای خالی، ایندکسها را جابهجا میکرد و تیک «اصلی» به شمارهٔ اشتباه میخورد.
|
|
"""
|
|
titles = request.POST.getlist('phone_titles')
|
|
phones = request.POST.getlist('phones')
|
|
primary = {int(i) for i in request.POST.getlist('phone_primary') if str(i).isdigit()}
|
|
rows = [
|
|
{'title': title.strip() or 'تلفن', 'phone': phone.strip()}
|
|
for title, phone in zip(titles, phones)
|
|
if phone.strip()
|
|
]
|
|
return rows, phones, primary
|
|
|
|
|
|
def _parse_timestamp(ts_value):
|
|
"""تبدیل یونیکس تایماستمپهای ارسالی از جاوااسکریپت"""
|
|
if not ts_value:
|
|
return None
|
|
try:
|
|
# تبدیل میلیثانیه جاوااسکریپت به ثانیه پایتون
|
|
return datetime.datetime.fromtimestamp(int(ts_value) / 1000.0, tz=timezone.get_current_timezone())
|
|
except (ValueError, TypeError):
|
|
return None
|