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

172
accounts/models.py Normal file
View file

@ -0,0 +1,172 @@
from django.contrib.auth import get_user_model
from django.db import models
from django.utils.html import format_html
from django.core.validators import RegexValidator
from simple_history.models import HistoricalRecords
from common.models import TagModel, BaseModel
from common.consts import UserRoles
from locations.models import Affairs, Broker, County
# Create your models here.
class Role(TagModel):
class Meta:
verbose_name = "نقش"
verbose_name_plural = "نقش‌ها"
class Profile(BaseModel):
user = models.OneToOneField(
get_user_model(),
null=True,
on_delete=models.CASCADE,
verbose_name="کاربر",
related_name="profile"
)
national_code = models.CharField(
max_length=10,
null=True,
verbose_name="کد ملی",
blank=True,
validators=[
RegexValidator(
regex=r'^\d+$',
message='کد ملی باید فقط شامل اعداد باشد.',
code='invalid_national_code'
)
]
)
address = models.TextField(
null=True,
verbose_name="آدرس",
blank=True
)
card_number = models.CharField(
max_length=16,
null=True,
verbose_name="شماره کارت",
blank=True,
validators=[
RegexValidator(
regex=r'^\d+$',
message='شماره کارت باید فقط شامل اعداد باشد.',
code='invalid_card_number'
)
]
)
account_number = models.CharField(
max_length=20,
null=True,
verbose_name="شماره حساب",
blank=True,
validators=[
RegexValidator(
regex=r'^\d+$',
message='شماره حساب باید فقط شامل اعداد باشد.',
code='invalid_account_number'
)
]
)
phone_number_1 = models.CharField(
max_length=11,
null=True,
verbose_name="شماره تماس ۱",
blank=True
)
phone_number_2 = models.CharField(
max_length=11,
null=True,
verbose_name="شماره تماس ۲",
blank=True
)
pic = models.ImageField(
upload_to="profile_images",
verbose_name="تصویر",
default="../static/sample_images/profile.jpg"
)
roles = models.ManyToManyField(
Role,
verbose_name="نقش‌ها",
blank=True,
related_name="profiles"
)
is_completed = models.BooleanField(
default=False,
verbose_name="پروفایل تکمیل شده"
)
owner = models.ForeignKey(
get_user_model(),
null=True,
on_delete=models.SET_NULL,
verbose_name="ایجاد کننده",
blank=True,
related_name="owned_profiles"
)
affairs = models.ForeignKey(
Affairs,
on_delete=models.SET_NULL,
verbose_name="امور",
null=True,
blank=True
)
county = models.ForeignKey(
County,
on_delete=models.SET_NULL,
verbose_name="شهرستان",
null=True,
blank=True
)
broker = models.ForeignKey(
Broker,
on_delete=models.SET_NULL,
verbose_name="کارگزار",
null=True,
blank=True
)
history = HistoricalRecords()
class Meta:
verbose_name = "پروفایل"
verbose_name_plural = "پروفایل‌ها"
def __str__(self):
return str(self.user)
def first_name(self):
return self.user.first_name
first_name.short_description = "نام"
def last_name(self):
return self.user.last_name
last_name.short_description = "نام خانوادگی"
def fullname(self):
return self.user.get_full_name()
fullname.short_description = "نام و نام خانوادگی"
def roles_str(self):
return ', '.join([role.name for role in self.roles.all()])
roles_str.short_description = "نقش‌ها"
def has_role(self, role: UserRoles):
return self.roles.filter(slug=role.value).exists()
def has_any_of(self, roles: list[UserRoles]):
allowed_roles = [role.value for role in roles]
return len(self.roles.filter(slug__in=allowed_roles)) > 0
def has_none_of(self, roles: list[UserRoles]):
return not self.has_any_of(roles)
def pic_tag(self):
return format_html(f"<img style='width:30px;' src='{self.pic.url}'>")
pic_tag.short_description = "تصویر"