shafafiyat/_helpers/utils.py
2025-10-09 16:17:01 +03:30

313 lines
No EOL
8.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import os
import uuid
from django.core.validators import RegexValidator
from django.utils import timezone
from django.utils.text import slugify
from . import jalali
__jmonths = [
"فروردین", "اردیبهشت", "خرداد",
"تیر", "مرداد", "شهریور",
"مهر", "آبان", "آذر",
"دی", "بهمن", "اسفند",
]
def persian_numbers_converter(mystr):
numbers = {
"0": "۰",
"1": "۱",
"2": "۲",
"3": "۳",
"4": "۴",
"5": "۵",
"6": "۶",
"7": "۷",
"8": "۸",
"9": "۹",
}
for e, p in numbers.items():
mystr = mystr.replace(e, p)
return mystr
def jalali_converter(time):
try:
time = timezone.localtime(time)
except:
time = time
time_to_str = "{},{},{}".format(time.year, time.month, time.day)
time_to_tuple = jalali.Gregorian(time_to_str).persian_tuple()
time_to_list = list(time_to_tuple)
for index, month in enumerate(__jmonths):
if time_to_list[1] == index + 1:
time_to_list[1] = month
break
output = "{} {} {}, ساعت {}:{}".format(
time_to_list[2],
time_to_list[1],
time_to_list[0],
time.hour,
time.minute,
)
return persian_numbers_converter(output)
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def jalali_converter21(time):
time = timezone.localtime(time)
year, month, day = jalali.Gregorian(time.strftime("%Y-%m-%d")).persian_tuple()[:3]
hour, minute = time.strftime("%H:%M").split(':')
return f"{day} {__jmonths[month - 1]} {year}, ساعت {hour}:{minute}"
def jalali_converter2(time):
try:
time = timezone.localdate(time)
except:
time = time
time_to_str = "{},{},{}".format(time.year, time.month, time.day)
time_to_tuple = jalali.Gregorian(time_to_str).persian_tuple()
time_to_list = list(time_to_tuple)
for index, month in enumerate(__jmonths):
if time_to_list[1] == index + 1:
time_to_list[1] = month
break
output = "{} {} {}".format(
time_to_list[2],
time_to_list[1],
time_to_list[0],
)
return persian_numbers_converter(output)
def gregorian_converter(time):
time_to_list = time.split('/')
time_to_str = "{},{},{}".format(time_to_list[0], time_to_list[1], time_to_list[2])
return jalali.Persian(time_to_str).gregorian_string()
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def persian_converter(time):
time = time + datetime.timedelta(days=1)
time_to_str = "{},{},{}".format(time.year, time.month, time.day)
time_to_tuple = jalali.Gregorian(time_to_str).persian_tuple()
time_to_list = list(time_to_tuple)
return time_to_list
def persian_converter2(time):
time_to_str = "{},{},{}".format(time.year, time.month, time.day)
time_to_tuple = jalali.Gregorian(time_to_str).persian_tuple()
time_to_list = list(time_to_tuple)
for index, month in enumerate(__jmonths):
if time_to_list[1] == index + 1:
time_to_list[1] = month
break
output = "{} {} {}".format(
time_to_list[2],
time_to_list[1],
time_to_list[0],
)
return persian_numbers_converter(output)
def persian_converter3(time):
time = time
time_to_str = "{},{},{}".format(time.year, time.month, time.day)
time_to_tuple = jalali.Gregorian(time_to_str).persian_tuple()
time_to_list = list(time_to_tuple)
time_to_list = [str(item) for item in time_to_list]
return '/'.join(time_to_list)
def delete_file(path):
""" Deletes file from filesystem. """
if os.path.isfile(path):
os.remove(path)
def get_phone_number_validator():
return RegexValidator(
regex=r'^[0]{1}[9]{1}[0-9]{9}',
message='مقدار وارد شده صحیح نمی‌باشد',
)
def generate_unique_slug(text: str) -> str:
"""
Generates a unique slug from received text
"""
slug = slugify(text)
unique_id = str(uuid.uuid4())[:8]
unique_slug = f"{slug}-{unique_id}"
return unique_slug
def normalize_size(size: int) -> str:
"""
Normalizes file or volume sizes and returns it with the proper suffix,
showing the decimal only if it's non-zero.
"""
size = float(size)
if size < 1024:
return f"{int(size)} B" if size.is_integer() else f"{size:.1f} B"
elif size < 1024 * 1024:
size_kb = size / 1024
return f"{int(size_kb)} KB" if size_kb.is_integer() else f"{size_kb:.1f} KB"
elif size < 1024 * 1024 * 1024:
size_mb = size / (1024 * 1024)
return f"{int(size_mb)} MB" if size_mb.is_integer() else f"{size_mb:.1f} MB"
else:
size_gb = size / (1024 * 1024 * 1024)
return f"{int(size_gb)} GB" if size_gb.is_integer() else f"{size_gb:.1f} GB"
def number_to_persian_words(number):
"""
تبدیل عدد به حروف فارسی
مثال: 12345 -> دوازده هزار و سیصد و چهل و پنج
"""
try:
# تبدیل به عدد صحیح (در صورت نیاز)
from decimal import Decimal
if isinstance(number, Decimal):
number = int(number)
elif isinstance(number, float):
number = int(number)
elif isinstance(number, str):
number = int(float(number.replace(',', '')))
if number == 0:
return "صفر"
if number < 0:
return "منفی " + number_to_persian_words(abs(number))
# اعداد یک رقمی
ones = [
"", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه"
]
# اعداد ده تا نوزده
teens = [
"ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده",
"شانزده", "هفده", "هجده", "نوزده"
]
# اعداد بیست تا نود
tens = [
"", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود"
]
# اعداد صد تا نهصد
hundreds = [
"", "یکصد", "دویست", "سیصد", "چهارصد", "پانصد",
"ششصد", "هفتصد", "هشتصد", "نهصد"
]
# مراتب بزرگتر
scale = [
"", "هزار", "میلیون", "میلیارد", "بیلیون", "بیلیارد"
]
def convert_group(num):
"""تبدیل گروه سه رقمی به حروف"""
if num == 0:
return ""
result = []
# صدها
h = num // 100
if h > 0:
result.append(hundreds[h])
# دهگان و یکان
remainder = num % 100
if remainder >= 10 and remainder < 20:
# اعداد 10 تا 19
result.append(teens[remainder - 10])
else:
# دهگان
t = remainder // 10
if t > 0:
result.append(tens[t])
# یکان
o = remainder % 10
if o > 0:
result.append(ones[o])
return " و ".join(result)
# تقسیم عدد به گروه‌های سه رقمی
groups = []
scale_index = 0
while number > 0:
group = number % 1000
if group != 0:
group_text = convert_group(group)
if scale_index > 0:
group_text += " " + scale[scale_index]
groups.append(group_text)
number //= 1000
scale_index += 1
# معکوس کردن و ترکیب گروه‌ها
groups.reverse()
result = " و ".join(groups)
return result
except Exception:
return ""
def amount_to_persian_words(amount):
"""
تبدیل مبلغ به حروف فارسی با واحد ریال
مثال: 12345 -> دوازده هزار و سیصد و چهل و پنج ریال
"""
try:
words = number_to_persian_words(amount)
if words:
return words + " ریال"
return ""
except Exception:
return ""