50 lines
1.6 KiB
Python
50 lines
1.6 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_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
|