Files
Rasadyar_Marzaki/authentication/models.py

549 lines
21 KiB
Python
Raw Normal View History

2026-01-18 11:45:53 +03:30
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)