first commit

This commit is contained in:
aminhashemi92 2025-08-10 07:44:23 +03:30
commit b71ea45681
898 changed files with 138202 additions and 0 deletions

195
_helpers/utils.py Normal file
View file

@ -0,0 +1,195 @@
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 + 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)
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"