You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
431 lines
16 KiB
431 lines
16 KiB
# Generated by Django 4.2.27 on 2026-01-22 10:48
|
|
|
|
import dj_language.field
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
import django.db.models.deletion
|
|
import phonenumber_field.modelfields
|
|
import utils.validators
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("dj_language", "0002_auto_20220120_1344"),
|
|
("auth", "0012_alter_user_first_name_max_length"),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="User",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("password", models.CharField(max_length=128, verbose_name="password")),
|
|
(
|
|
"last_login",
|
|
models.DateTimeField(
|
|
blank=True, null=True, verbose_name="last login"
|
|
),
|
|
),
|
|
(
|
|
"is_superuser",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Designates that this user has all permissions without explicitly assigning them.",
|
|
verbose_name="superuser status",
|
|
),
|
|
),
|
|
(
|
|
"username",
|
|
models.CharField(
|
|
blank=True, max_length=150, null=True, unique=True
|
|
),
|
|
),
|
|
(
|
|
"email",
|
|
models.EmailField(
|
|
blank=True,
|
|
help_text="Enter the user's email address.",
|
|
max_length=254,
|
|
null=True,
|
|
unique=True,
|
|
verbose_name="Email Address",
|
|
),
|
|
),
|
|
(
|
|
"fullname",
|
|
models.CharField(
|
|
blank=True,
|
|
help_text="Enter the full name of the user.",
|
|
max_length=255,
|
|
null=True,
|
|
verbose_name="Full Name",
|
|
),
|
|
),
|
|
(
|
|
"birthdate",
|
|
models.DateField(blank=True, null=True, verbose_name="birthdate"),
|
|
),
|
|
(
|
|
"avatar",
|
|
models.ImageField(
|
|
blank=True,
|
|
max_length=512,
|
|
null=True,
|
|
upload_to="users/avatars/%Y/%m/",
|
|
),
|
|
),
|
|
(
|
|
"phone_number",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True,
|
|
help_text="e.g., +49 151 12345678",
|
|
max_length=128,
|
|
null=True,
|
|
region=None,
|
|
validators=[utils.validators.validate_possible_number],
|
|
verbose_name="Phone Number",
|
|
),
|
|
),
|
|
(
|
|
"gender",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[("male", "Male"), ("female", "Female")],
|
|
help_text="Select the user's gender.",
|
|
max_length=20,
|
|
null=True,
|
|
verbose_name="Gender",
|
|
),
|
|
),
|
|
(
|
|
"user_type",
|
|
models.CharField(
|
|
choices=[
|
|
("professor", "Professor"),
|
|
("client", "Client"),
|
|
("student", "Student"),
|
|
("admin", "Admin"),
|
|
("super_admin", "Super Admin"),
|
|
],
|
|
default="client",
|
|
help_text="Type of the user.",
|
|
max_length=20,
|
|
verbose_name="User Type",
|
|
),
|
|
),
|
|
(
|
|
"date_joined",
|
|
models.DateTimeField(
|
|
auto_now_add=True,
|
|
help_text="The date and time the user registered.",
|
|
verbose_name="Date Joined",
|
|
),
|
|
),
|
|
(
|
|
"city",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="City"
|
|
),
|
|
),
|
|
(
|
|
"country",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="country"
|
|
),
|
|
),
|
|
(
|
|
"device_id",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="device id"
|
|
),
|
|
),
|
|
(
|
|
"device_os",
|
|
models.CharField(
|
|
choices=[
|
|
("android", "android"),
|
|
("apple", "apple"),
|
|
("web", "web"),
|
|
],
|
|
max_length=16,
|
|
null=True,
|
|
),
|
|
),
|
|
(
|
|
"user_agent",
|
|
models.TextField(blank=True, null=True, verbose_name="user agent"),
|
|
),
|
|
(
|
|
"client_ip",
|
|
models.TextField(blank=True, null=True, verbose_name="client ip"),
|
|
),
|
|
("fcm", models.CharField(blank=True, max_length=512, null=True)),
|
|
(
|
|
"slug",
|
|
models.SlugField(
|
|
blank=True, max_length=255, null=True, unique=True
|
|
),
|
|
),
|
|
(
|
|
"experience_years",
|
|
models.PositiveIntegerField(
|
|
default=0, verbose_name="Experience years"
|
|
),
|
|
),
|
|
("is_staff", models.BooleanField(default=False)),
|
|
(
|
|
"is_active",
|
|
models.BooleanField(
|
|
default=True,
|
|
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
|
|
verbose_name="Active",
|
|
),
|
|
),
|
|
("deleted_at", models.DateTimeField(blank=True, null=True)),
|
|
("info", models.TextField(blank=True, null=True, verbose_name="Info")),
|
|
("skill", models.CharField(blank=True, max_length=512, null=True)),
|
|
(
|
|
"groups",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
|
|
related_name="user_set",
|
|
related_query_name="user",
|
|
to="auth.group",
|
|
verbose_name="groups",
|
|
),
|
|
),
|
|
(
|
|
"language",
|
|
dj_language.field.LanguageField(
|
|
default=69,
|
|
limit_choices_to={"status": True},
|
|
null=True,
|
|
on_delete=django.db.models.deletion.PROTECT,
|
|
related_name="+",
|
|
to="dj_language.language",
|
|
verbose_name="language",
|
|
),
|
|
),
|
|
(
|
|
"user_permissions",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Specific permissions for this user.",
|
|
related_name="user_set",
|
|
related_query_name="user",
|
|
to="auth.permission",
|
|
verbose_name="user permissions",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "All Users",
|
|
"verbose_name_plural": "All Users",
|
|
"ordering": ("-id",),
|
|
"unique_together": {("email",)},
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Notification",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("title", models.CharField(max_length=255, verbose_name="title")),
|
|
("message", models.TextField(max_length=512, verbose_name="message")),
|
|
("is_read", models.BooleanField(default=False, verbose_name="is read")),
|
|
(
|
|
"service",
|
|
models.CharField(
|
|
choices=[("imam-javad", "Imam Javad"), ("doboodi", "Doboodi")],
|
|
default="imam-javad",
|
|
max_length=20,
|
|
verbose_name="service",
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(
|
|
auto_now_add=True, null=True, verbose_name="created at"
|
|
),
|
|
),
|
|
(
|
|
"updated_at",
|
|
models.DateTimeField(
|
|
auto_now=True, null=True, verbose_name="updated at"
|
|
),
|
|
),
|
|
(
|
|
"user",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="notifications",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="user",
|
|
),
|
|
),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name="LoginHistory",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("lat", models.FloatField(blank=True, null=True, verbose_name="lat")),
|
|
("lon", models.FloatField(blank=True, null=True, verbose_name="lon")),
|
|
(
|
|
"country",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="country"
|
|
),
|
|
),
|
|
(
|
|
"city",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="city"
|
|
),
|
|
),
|
|
("ip", models.CharField(max_length=255, null=True)),
|
|
("timezone", models.CharField(blank=True, max_length=100, null=True)),
|
|
(
|
|
"user_agent",
|
|
models.TextField(blank=True, null=True, verbose_name="user agent"),
|
|
),
|
|
("device_os", models.CharField(blank=True, max_length=16, null=True)),
|
|
("at_time", models.DateTimeField(auto_now_add=True)),
|
|
(
|
|
"user",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="login_history",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name="LocationHistory",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("lat", models.FloatField(verbose_name="lat")),
|
|
("lon", models.FloatField(verbose_name="lon")),
|
|
(
|
|
"country",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="country"
|
|
),
|
|
),
|
|
(
|
|
"city",
|
|
models.CharField(
|
|
blank=True, max_length=255, null=True, verbose_name="city"
|
|
),
|
|
),
|
|
("selected_manually", models.BooleanField(blank=True, null=True)),
|
|
("ip", models.CharField(blank=True, max_length=255, null=True)),
|
|
("timezone", models.CharField(blank=True, max_length=60, null=True)),
|
|
("at_time", models.DateTimeField(auto_now_add=True)),
|
|
(
|
|
"user",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="location_history",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name="AdminUser",
|
|
fields=[],
|
|
options={
|
|
"verbose_name": "Admin User",
|
|
"verbose_name_plural": "Admin Users",
|
|
"proxy": True,
|
|
"indexes": [],
|
|
"constraints": [],
|
|
},
|
|
bases=("account.user",),
|
|
),
|
|
migrations.CreateModel(
|
|
name="ClientUser",
|
|
fields=[],
|
|
options={
|
|
"verbose_name": "user",
|
|
"verbose_name_plural": "users",
|
|
"ordering": ("-id",),
|
|
"proxy": True,
|
|
"indexes": [],
|
|
"constraints": [],
|
|
},
|
|
bases=("account.user",),
|
|
),
|
|
migrations.CreateModel(
|
|
name="ProfessorUser",
|
|
fields=[],
|
|
options={
|
|
"verbose_name": "Professor User",
|
|
"verbose_name_plural": "Professor Users",
|
|
"proxy": True,
|
|
"indexes": [],
|
|
"constraints": [],
|
|
},
|
|
bases=("account.user",),
|
|
),
|
|
migrations.CreateModel(
|
|
name="StudentUser",
|
|
fields=[],
|
|
options={
|
|
"verbose_name": "Student User",
|
|
"verbose_name_plural": "Student Users",
|
|
"proxy": True,
|
|
"indexes": [],
|
|
"constraints": [],
|
|
},
|
|
bases=("account.user",),
|
|
),
|
|
migrations.CreateModel(
|
|
name="SuperAdminUser",
|
|
fields=[],
|
|
options={
|
|
"verbose_name": "Super Admin User",
|
|
"verbose_name_plural": "Super Admin Users",
|
|
"proxy": True,
|
|
"indexes": [],
|
|
"constraints": [],
|
|
},
|
|
bases=("account.user",),
|
|
),
|
|
]
|