from django.contrib.auth.hashers import make_password from django.contrib.auth.models import ( AbstractUser ) from apps.core.models import BaseModel from django.db import models class User(AbstractUser, BaseModel): mobile = models.CharField(max_length=18) phone = models.CharField(max_length=18, null=True) national_code = models.CharField(max_length=16) birthdate = models.DateTimeField(null=True) nationality = models.CharField(max_length=20, null=True) ownership_types = ( ('N', 'Natural'), ('L', 'Legal') ) ownership = models.CharField( max_length=1, choices=ownership_types, default='N', help_text="N is natural & L is legal" ) address = models.TextField(max_length=1000, null=True) photo = models.CharField(max_length=50, null=True) province = models.ForeignKey( 'Province', on_delete=models.CASCADE, related_name='user_province', null=True ) city = models.ForeignKey( 'City', on_delete=models.CASCADE, related_name='user_city', null=True ) otp_status = models.BooleanField(default=False) is_herd_owner = models.BooleanField(default=False) def __str__(self): return f'{self.username} {self.last_name}-{self.last_login}' def save(self, *args, **kwargs): self.password = make_password(self.password) super(User, self).save(*args, **kwargs) class Province(BaseModel): # noqa name = models.CharField(max_length=50) def __str__(self): return f'{self.name}' def save(self, *args, **kwargs): super(Province, self).save(*args, **kwargs) class City(BaseModel): name = models.CharField(max_length=50) province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name='cities', null=True ) def __str__(self): return f'{self.name}' def save(self, *args, **kwargs): super(City, self).save(*args, **kwargs) class OrganizationType(BaseModel): organization_keys = ( ('J', 'Jihad'), ('U', 'Union'), ('CO', 'Cooperative'), ('CMP', 'Companies') ) key = models.CharField(choices=organization_keys, max_length=3) name = models.CharField(max_length=50, null=True) code = models.IntegerField(default=0) def __str__(self): return f'{self.key}-{self.name}' def save(self, *args, **kwargs): super(OrganizationType, self).save(*args, **kwargs) class Organization(BaseModel): name = models.CharField(max_length=50) type = models.ForeignKey( 'OrganizationType', on_delete=models.CASCADE, related_name="organization_type", null=True ) national_unique_id = models.CharField(max_length=30, default="0", unique=True) activity_fields = ( ('CO', 'Country'), ('PR', 'Province'), ('CI', 'City') ) field_of_activity = models.CharField(max_length=2, choices=activity_fields, default='EM') company_code = models.CharField(max_length=30, default="empty") province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name="province_organization", null=True ) city = models.ForeignKey( 'City', on_delete=models.CASCADE, related_name='city_organization', null=True ) parent_organization = models.ForeignKey( 'Organization', on_delete=models.CASCADE, related_name='parents', null=True ) additional_data = models.JSONField(default=dict) def __str__(self): return f'{self.name}-{self.type}' def save(self, *args, **kwargs): super(Organization, self).save(*args, **kwargs) class BankAccountInformation(BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="bank_information" ) name = models.CharField(max_length=150) card = models.CharField(max_length=25, unique=True) account = models.CharField(max_length=25, unique=True) sheba = models.CharField(max_length=30, unique=True) def __str__(self): return f'{self.name}-{self.card}' def save(self, *args, **kwargs): super(BankAccountInformation, self).save(*args, **kwargs) class BlacklistedAccessToken(models.Model): jti = models.CharField(max_length=255, unique=True) token = models.TextField() user_id = models.IntegerField() blacklisted_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Blacklisted JTI: {self.jti}"