import string import random from django.contrib.postgres.fields import ArrayField from django.db import models from django.contrib.auth.models import User, Group from django.conf import settings from datetime import datetime, timezone, time, timedelta from django.utils import timezone import uuid # مدل پایه که تمامی مدل ها در سیستم ازین مدل ارث بری می کنند from general_urls import base_user_gate_way_id class BaseModel(models.Model): key = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) create_date = models.DateTimeField(auto_now_add=True) modify_date = models.DateTimeField(auto_now=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, related_name="%(class)s_createdby", on_delete=models.CASCADE, null=True, blank=True, ) modified_by = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="%(class)s_modifiedby", null=True, blank=True, ) trash = models.BooleanField(default=False) class Meta: abstract = True # مدل استان برای ذخیره استان استفاده میشود class Province(BaseModel): name = models.CharField(max_length=200, null=True) province_id_key = models.IntegerField(null=True) province_number = models.IntegerField(default=0) province_name = models.CharField(max_length=100, null=True) def save(self, *args, **kwargs): super(Province, self).save(*args, **kwargs) # مدل شهرستان برای ذخیره شهرستان استفاده میشود class City(BaseModel): province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name="city_province", null=True ) province_id_foreign_key = models.IntegerField(null=True) city_id_key = models.IntegerField(null=True) name = models.CharField(max_length=200, null=True) product_price = models.FloatField(default=0) province_center = models.BooleanField(default=False) city_number = models.IntegerField(default=0) city_name = models.CharField(max_length=100, null=True) province_number = models.IntegerField(default=0) province_name = models.CharField(max_length=100, null=True) def save(self, *args, **kwargs): super(City, self).save(*args, **kwargs) # مدل زیربخش شهرستان برای ذخیره زیربخش شهرستان استفاده میشود class CityUnit(BaseModel): city = models.ForeignKey( City, on_delete=models.CASCADE, related_name="city_province", null=True ) city_id_foreign_key = models.IntegerField(null=True) city_unit_id_key = models.IntegerField(null=True) name = models.CharField(max_length=200, null=True) city_number = models.IntegerField(default=0) city_name = models.CharField(max_length=100, null=True) province_number = models.IntegerField(default=0) province_name = models.CharField(max_length=100, null=True) def save(self, *args, **kwargs): super(CityUnit, self).save(*args, **kwargs) class PermissionLevel(BaseModel): role = models.ForeignKey( Group, on_delete=models.CASCADE, null=True, related_name='group_permission' ) name = models.CharField(max_length=100, null=True) def save(self, *args, **kwargs): super(PermissionLevel, self).save(*args, **kwargs) # مدل آدرس برای ذخیره آدرس استفاده میشود class SystemAddress(BaseModel): province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name="province_address", null=True ) city = models.ForeignKey( City, on_delete=models.CASCADE, related_name="city_address", null=True ) province_id_foreign_key = models.IntegerField(null=True) city_id_foreign_key = models.IntegerField(null=True) address_id_key = models.IntegerField(null=True) address = models.CharField(max_length=300, null=True) postal_code = models.CharField(max_length=20, default="", null=True) breeding_unique_id = models.CharField(max_length=50, null=True) phone = models.CharField(max_length=20, default="", null=True) phone_type = models.CharField(max_length=20, default="", null=True) no = models.CharField(max_length=5, default="", null=True) floor = models.IntegerField(default=0, null=True) unit = models.IntegerField(default=0, null=True) city_number = models.IntegerField(default=0) city_name = models.CharField(max_length=100, null=True) province_number = models.IntegerField(default=0) province_name = models.CharField(max_length=100, null=True) def save(self, *args, **kwargs): super(SystemAddress, self).save(*args, **kwargs) # مدل آدرس برای ذخیره آدرس استفاده میشود class Address(BaseModel): title = models.CharField(max_length=200, default="", null=True) country = models.CharField(max_length=100, default="", null=True) province = models.CharField(max_length=50, default="", null=True) city = models.CharField(max_length=50, default="", null=True) address = models.CharField(max_length=300, null=True) postal_code = models.CharField(max_length=20, default="", null=True) breeding_unique_id = models.CharField(max_length=50, null=True) phone = models.CharField(max_length=20, default="", null=True) phone_type = models.CharField(max_length=20, default="", null=True) no = models.CharField(max_length=5, default="", null=True) floor = models.IntegerField(default=0, null=True) unit = models.IntegerField(default=0, null=True) def save(self, *args, **kwargs): super(Address, self).save(*args, **kwargs) # مدل اطلاعات بانکی برای ذخیره اطلاعات جساب شخص استفاده میشود class BankCard(BaseModel): name_of_bank_user = models.CharField(max_length=200, null=True) bank_name = models.CharField(max_length=30, null=True) card = models.CharField(max_length=16, null=True) shaba = models.CharField(max_length=100, null=True) account = models.CharField(max_length=50, null=True) user_bank_id_key = models.IntegerField(null=True) province_name = models.CharField(max_length=50, null=True) # state = models.CharField(max_length=30, null=True) class MultiRole(BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="multi_role_users", null=True ) address = models.ForeignKey( Address, on_delete=models.CASCADE, related_name='multi_role_address', null=True ) def save(self, *args, **kwargs): super(MultiRole, self).save(*args, **kwargs) # مدل پروفایل کاربری برای ذخیره پروفایل کاربری شخص استفاده میشود class SystemUserProfile(BaseModel): token = models.CharField(max_length=36, null=True) user_gate_way_id = models.CharField(max_length=6,null=True, unique=True) user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="system_user_profile_user", 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 ) user_django_id_foreign_key = models.IntegerField(null=True) province_id_foreign_key = models.IntegerField(null=True) city_id_foreign_key = models.IntegerField(null=True) system_user_profile_id_key = models.IntegerField(null=True) fullname = models.CharField(max_length=150, null=True) first_name = models.CharField(max_length=200, null=True) last_name = models.CharField(max_length=200, null=True) father_name = models.CharField(max_length=200, null=True) gender = models.CharField(max_length=20, null=True) is_alive = models.BooleanField(null=True) national_code = models.CharField(max_length=20, null=True) national_code_image = models.CharField(max_length=500, null=True) national_id = models.CharField(max_length=20, null=True) mobile = models.CharField(max_length=11, null=True) birthday = models.CharField(max_length=20, null=True) image = models.CharField(max_length=500, null=True) password = models.CharField(max_length=100, null=True) active = models.BooleanField(default=True) state = models.JSONField( default={ "province": "", "city": "", "first_name": "", "last_name": "", "national_code": "", "national_id": "", "mobile": "", "birthday": "", "image": "" } ) access_level = models.ManyToManyField( PermissionLevel, related_name="user_permission_level" ) role = models.ManyToManyField( Group, related_name='user_system_roles' ) base_order = models.BigIntegerField(null=True) city_number = models.IntegerField(default=0) city_name = models.CharField(max_length=100, null=True) province_number = models.IntegerField(default=0) province_name = models.CharField(max_length=100, null=True) unit_name = models.CharField(max_length=500, null=True) unit_national_id = models.CharField(max_length=100, null=True) unit_registration_number = models.CharField(max_length=100, null=True) unit_economical_number = models.CharField(max_length=100, null=True) unit_province = models.CharField(max_length=100, null=True) unit_city = models.CharField(max_length=100, null=True) unit_postal_code = models.CharField(max_length=100, null=True) unit_address = models.TextField(null=True) pos = models.BooleanField(default=True) def save(self, *args, **kwargs): if self.user_gate_way_id is None: while (True): res = ''.join(random.choices(string.ascii_lowercase + string.digits, k=5)) res = base_user_gate_way_id + res if not SystemUserProfile.objects.filter(user_gate_way_id=res).exists(): break self.user_gate_way_id=res super(SystemUserProfile, self).save(*args, **kwargs) # مدل پروفایل کاربری برای ذخیره پروفایل کاربری شخص استفاده میشود class UserProfile(BaseModel): key = models.UUIDField(default=uuid.uuid4, editable=True, null=True) token = models.CharField(max_length=36, default="") app_token = models.CharField(max_length=36, null=True) user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="users", null=True ) company = models.CharField(max_length=30, null=True) address = models.ForeignKey( Address, on_delete=models.CASCADE, related_name='user_address', null=True ) role = models.ForeignKey( Group, on_delete=models.CASCADE, null=True, related_name='user_role' ) user_bank_info = models.ForeignKey( BankCard, on_delete=models.CASCADE, related_name="bank_user", null=True ) fullname = models.CharField(max_length=150, null=True, default="") first_name = models.CharField(max_length=200, null=True, default="") last_name = models.CharField(max_length=200, null=True, default="") natinal_id = models.CharField(max_length=10, null=True, default="") mobile = models.CharField(max_length=11, null=True, default="") birthday = models.CharField(max_length=20, null=True, default="") image = models.CharField(max_length=500, null=True) state = models.CharField(max_length=20, default="register") unit_name = models.CharField(max_length=100, null=True) password = models.CharField(max_length=100, null=True) gis_code = models.CharField(max_length=30, null=True) operating_licence_capacity = models.BigIntegerField(default=0) number_of_halls = models.IntegerField(default=0) tenant = models.BooleanField(null=True) person_type = models.CharField(max_length=10, null=True) economic_code = models.CharField(max_length=30, null=True) system_code = models.CharField(max_length=20, null=True) epidemiological_code = models.CharField(max_length=20, null=True) breeding_unique_id = models.CharField(max_length=20, null=True) total_capacity = models.BigIntegerField(default=0) licence_number = models.CharField(max_length=20, null=True) health_certificate_number = models.CharField(max_length=20, null=True) number_of_requests = models.BigIntegerField(default=0) hatching_date = models.DateTimeField(default=timezone.now()) last_party_date = models.DateTimeField(default=timezone.now()) number_of_incubators = models.BigIntegerField(default=0) herd_age_by_day = models.IntegerField(default=0) herd_age_by_week = models.IntegerField(default=0) number_of_party = models.IntegerField(default=0) communication_type = models.CharField(max_length=30, null=True) cooperative = models.CharField(max_length=50, null=True) date_of_register = models.DateTimeField(default=timezone.now()) unit_status = models.CharField(max_length=20, null=True) samasat_user_code = models.CharField(max_length=20, null=True) base_order = models.BigIntegerField(null=True) incubation_date = models.DateTimeField(null=True) def save(self, *args, **kwargs): # if self.first_name != None and self.last_name != None: # self.fullname = self.first_name + " " + self.last_name super(UserProfile, self).save(*args, **kwargs) # مدل نقاط جغرافیایی برای ذخیره نقاط طولی و عرضی آدرس استفاده میشود class GeoPoint(BaseModel): userprofile = models.ForeignKey( UserProfile, on_delete=models.CASCADE, related_name="geo_user", null=True ) name = models.CharField(max_length=100, null=True) lang = models.CharField(max_length=50, null=True) lat = models.CharField(max_length=50, null=True) class Tenant(BaseModel): userprofile = models.ManyToManyField( UserProfile, related_name="tenant_user", ) fullname = models.CharField(max_length=50, null=True) national_code = models.CharField(max_length=20, null=True) birthday = models.CharField(max_length=50, null=True) rental = models.CharField(max_length=30, null=True) tracking_code = models.CharField(max_length=30, null=True) rent_date_from = models.CharField(max_length=30, null=True) rent_date_to = models.CharField(max_length=30, null=True) class UserMessageType(BaseModel): message_types = ( ("user", "USER"), ("alluser", "AllUSER"), ("group", "GROUP"), ("allgroup", "AllGROUP"), ("usergroup", "UserGroup"), ("province_accept", "ProvinceAccept"), ("province_rejected", "ProvinceRejected"), ("city_operator_accept", "CityOperatorAccept"), ("city_operator_rejected", "CityOperatorRejected"), ("assignment_accepted", "AssignmentAccepted"), ("assignment_rejected", "AssignmentRejected"), ) name = models.CharField(choices=message_types, max_length=50, default="", null=True) def __str__(self) -> str: return self.name def save(self, *args, **kwargs): super(UserMessageType, self).save(*args, **kwargs) pass # مدل پیام کاربر برای ذخیره پیام کاربر استفاده میشود class UserMessage(BaseModel): roles = models.ManyToManyField( Group, blank=True, related_name="user_roles" ) users = models.ManyToManyField( SystemUserProfile, blank=True, related_name="user_message" ) sender = models.ForeignKey( SystemUserProfile, on_delete=models.CASCADE, related_name="message_sender", null=True ) heading = models.CharField(max_length=100, null=True, default="") message = models.TextField(max_length=500, null=True, default="") link_text = models.CharField(max_length=150, null=True) link = models.CharField(max_length=100, null=True) image = models.JSONField(default=dict, null=True) expire = models.DateTimeField(default=datetime.now() + timedelta(hours=1)) time = models.DateTimeField(default=datetime.now()) state = models.CharField(max_length=20, default="pending") message_type = models.ForeignKey( UserMessageType, on_delete=models.CASCADE, null=True, related_name="message_type" ) message_level = models.CharField(max_length=50, null=True) def save(self, *args, **kwargs): super(UserMessage, self).save(*args, **kwargs) class SendingMessageMethod(BaseModel): level = models.CharField(max_length=50, null=True) methods = models.CharField(max_length=150, null=True) def save(self, *args, **kwargs): super(SendingMessageMethod, self).save(*args, **kwargs) class Log(BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="log_user", null=True ) function_name = models.CharField(max_length=200, null=True) duration = models.FloatField(null=True) status = models.IntegerField(null=True) response = models.TextField(null=True) request = models.TextField(null=True) request_body = models.TextField(null=True) response_body = models.TextField(null=True) def save(self, *args, **kwargs): super(Log, self).save(*args, **kwargs) class ExternalTransaction(BaseModel): date = models.DateTimeField(auto_now_add=True) amount = models.BigIntegerField(default=0) amount_with_tax = models.BigIntegerField(default=0) status = models.CharField(max_length=100, default='pending') transaction_type = models.CharField(max_length=100, null=True) type = models.CharField(max_length=100, null=True) payer = models.CharField(max_length=100, null=True) description = models.CharField(max_length=200, default=False) is_complete = models.BooleanField(default=False) message = models.TextField(null=True) saleReferenceId = models.CharField(max_length=100, null=True) refId = models.CharField(max_length=100, null=True) orderId = models.CharField(max_length=100, null=True) cardHolderPan = models.CharField(max_length=100, null=True) receiver_role = models.CharField(max_length=100, null=True) creator_role = models.CharField(max_length=100, null=True) kill_house_user = models.ForeignKey( SystemUserProfile, on_delete=models.CASCADE, null=True, related_name="transaction_kill_house_user" ) chain_company_user = models.ForeignKey( SystemUserProfile, on_delete=models.CASCADE, null=True, related_name="transaction_chain_company_user" ) receiver = models.ForeignKey( SystemUserProfile, on_delete=models.CASCADE, null=True, related_name="receiver_user" ) creator = models.ForeignKey( SystemUserProfile, on_delete=models.CASCADE, null=True, related_name="creator_user" ) union_share = models.BigIntegerField(default=0) company_share = models.BigIntegerField(default=0) guilds_share = models.BigIntegerField(default=0) city_share = models.BigIntegerField(default=0) wallet_share = models.BigIntegerField(default=0) other_share = models.BigIntegerField(default=0) pay_type = models.CharField(max_length=200, null=True) temporary_trash = models.BooleanField(default=False) temporary_deleted = models.BooleanField(default=False) def save(self, *args, **kwargs): super(ExternalTransaction, self).save(*args, **kwargs) class UserMessageSend(BaseModel): user = models.ForeignKey(SystemUserProfile, on_delete=models.CASCADE, null=True) message = models.TextField(null=True) receive_code = models.CharField(max_length=400, null=True) def save(self, *args, **kwargs): super(UserMessageSend, self).save(*args, **kwargs) class Notice(BaseModel): title = models.CharField(max_length=1000, null=True) text = models.TextField(null=True) users = models.JSONField(null=True) read_users = models.JSONField(null=True) unread_users = models.JSONField(null=True) images = models.JSONField(null=True) roles = models.JSONField(null=True) def save(self, *args, **kwargs): super(Notice, self).save(*args, **kwargs) class UserNoticeInfo(BaseModel): notice = models.ForeignKey( Notice, related_name="user_notice", on_delete=models.CASCADE, null=True ) user = models.ForeignKey( SystemUserProfile, related_name="notice_users", on_delete=models.CASCADE, null=True ) seen = models.BooleanField(default=False) def save(self, *args, **kwargs): super(UserNoticeInfo, self).save(*args, **kwargs)