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, NameSlugModel from common.consts import UserRoles, BANK_CHOICES 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' ) ] ) bank_name = models.CharField( max_length=255, choices=BANK_CHOICES, null=True, verbose_name="نام بانک", blank=True ) 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"") pic_tag.short_description = "تصویر" class Company(NameSlugModel): logo = models.ImageField( upload_to='companies/logos', null=True, blank=True, verbose_name='لوگوی شرکت' ) signature = models.ImageField( upload_to='companies/signatures', null=True, blank=True, verbose_name='امضای شرکت' ) address = models.TextField( null=True, blank=True, verbose_name='آدرس' ) phone = models.CharField( max_length=11, null=True, blank=True, verbose_name='شماره تماس' ) broker = models.OneToOneField( Broker, on_delete=models.SET_NULL, verbose_name="کارگزار", null=True, blank=True, related_name='company' ) 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' ) ] ) sheba_number = models.CharField( max_length=30, null=True, verbose_name="شماره شبا", blank=True, ) bank_name = models.CharField( max_length=255, choices=BANK_CHOICES, null=True, verbose_name="نام بانک", blank=True ) branch_name = models.CharField( max_length=255, null=True, verbose_name="شعبه بانک", blank=True ) class Meta: verbose_name = 'شرکت' verbose_name_plural = 'شرکت‌ها' def __str__(self): return self.name