1206 lines
48 KiB
Python
1206 lines
48 KiB
Python
# Generated by Django 5.2.7 on 2025-10-27 10:50
|
|
|
|
import django.contrib.auth.models
|
|
import django.contrib.auth.validators
|
|
import django.db.models.deletion
|
|
import django.utils.timezone
|
|
import phonenumber_field.modelfields
|
|
import simple_history.models
|
|
import uuid
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("auth", "0012_alter_user_first_name_max_length"),
|
|
("contenttypes", "0002_remove_content_type_name"),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="Patient",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"mrn",
|
|
models.CharField(
|
|
editable=False, max_length=20, unique=True, verbose_name="MRN"
|
|
),
|
|
),
|
|
(
|
|
"national_id",
|
|
models.CharField(blank=True, max_length=20, verbose_name="National ID"),
|
|
),
|
|
(
|
|
"first_name_en",
|
|
models.CharField(max_length=100, verbose_name="First Name (English)"),
|
|
),
|
|
(
|
|
"father_name_en",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Father Name (English)"
|
|
),
|
|
),
|
|
(
|
|
"grandfather_name_en",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Grandfather Name (English)"
|
|
),
|
|
),
|
|
(
|
|
"last_name_en",
|
|
models.CharField(max_length=100, verbose_name="Last Name (English)"),
|
|
),
|
|
(
|
|
"first_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="First Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"father_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Father Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"grandfather_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Grandfather Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"last_name_ar",
|
|
models.CharField(blank=True, max_length=100, verbose_name="Last Name (Arabic)"),
|
|
),
|
|
("date_of_birth", models.DateField(verbose_name="Date of Birth")),
|
|
(
|
|
"sex",
|
|
models.CharField(
|
|
choices=[("M", "Male"), ("F", "Female")], max_length=1, verbose_name="Sex"
|
|
),
|
|
),
|
|
(
|
|
"phone",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Phone Number"
|
|
),
|
|
),
|
|
("email", models.EmailField(blank=True, max_length=254, verbose_name="Email")),
|
|
(
|
|
"caregiver_name",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Caregiver Name"),
|
|
),
|
|
(
|
|
"caregiver_phone",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Caregiver Phone"
|
|
),
|
|
),
|
|
(
|
|
"caregiver_relationship",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Caregiver Relationship"
|
|
),
|
|
),
|
|
("address", models.TextField(blank=True, verbose_name="Address")),
|
|
("city", models.CharField(blank=True, max_length=100, verbose_name="City")),
|
|
(
|
|
"postal_code",
|
|
models.CharField(blank=True, max_length=20, verbose_name="Postal Code"),
|
|
),
|
|
(
|
|
"emergency_contact",
|
|
models.TextField(blank=True, verbose_name="Emergency Contact"),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Patient",
|
|
"verbose_name_plural": "Patients",
|
|
"ordering": ["-created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Tenant",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("name", models.CharField(max_length=200, verbose_name="Name")),
|
|
("code", models.CharField(max_length=50, unique=True, verbose_name="Code")),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
("settings", models.JSONField(blank=True, default=dict, verbose_name="Settings")),
|
|
],
|
|
options={
|
|
"verbose_name": "Tenant",
|
|
"verbose_name_plural": "Tenants",
|
|
"ordering": ["name"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="User",
|
|
fields=[
|
|
("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(
|
|
error_messages={"unique": "A user with that username already exists."},
|
|
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
|
|
max_length=150,
|
|
unique=True,
|
|
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
|
|
verbose_name="username",
|
|
),
|
|
),
|
|
(
|
|
"first_name",
|
|
models.CharField(blank=True, max_length=150, verbose_name="first name"),
|
|
),
|
|
(
|
|
"last_name",
|
|
models.CharField(blank=True, max_length=150, verbose_name="last name"),
|
|
),
|
|
(
|
|
"email",
|
|
models.EmailField(blank=True, max_length=254, verbose_name="email address"),
|
|
),
|
|
(
|
|
"is_staff",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Designates whether the user can log into this admin site.",
|
|
verbose_name="staff status",
|
|
),
|
|
),
|
|
(
|
|
"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",
|
|
),
|
|
),
|
|
(
|
|
"date_joined",
|
|
models.DateTimeField(
|
|
default=django.utils.timezone.now, verbose_name="date joined"
|
|
),
|
|
),
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"role",
|
|
models.CharField(
|
|
choices=[
|
|
("ADMIN", "Administrator"),
|
|
("DOCTOR", "Doctor"),
|
|
("NURSE", "Nurse"),
|
|
("OT", "Occupational Therapist"),
|
|
("SLP", "Speech-Language Pathologist"),
|
|
("ABA", "ABA Therapist"),
|
|
("FRONT_DESK", "Front Desk"),
|
|
("FINANCE", "Finance"),
|
|
],
|
|
default="FRONT_DESK",
|
|
max_length=20,
|
|
verbose_name="Role",
|
|
),
|
|
),
|
|
(
|
|
"phone_number",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Phone Number"
|
|
),
|
|
),
|
|
(
|
|
"employee_id",
|
|
models.CharField(blank=True, max_length=50, verbose_name="Employee ID"),
|
|
),
|
|
(
|
|
"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",
|
|
),
|
|
),
|
|
(
|
|
"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",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="users",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "User",
|
|
"verbose_name_plural": "Users",
|
|
"ordering": ["last_name", "first_name"],
|
|
},
|
|
managers=[
|
|
("objects", django.contrib.auth.models.UserManager()),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name="File",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"file_number",
|
|
models.CharField(
|
|
editable=False, max_length=20, unique=True, verbose_name="File Number"
|
|
),
|
|
),
|
|
("opened_date", models.DateField(auto_now_add=True, verbose_name="Opened Date")),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("ACTIVE", "Active"),
|
|
("CLOSED", "Closed"),
|
|
("ARCHIVED", "Archived"),
|
|
],
|
|
default="ACTIVE",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.OneToOneField(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="file",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "File",
|
|
"verbose_name_plural": "Files",
|
|
"ordering": ["-opened_date"],
|
|
},
|
|
),
|
|
migrations.AddField(
|
|
model_name="patient",
|
|
name="tenant",
|
|
field=models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
migrations.CreateModel(
|
|
name="HistoricalUser",
|
|
fields=[
|
|
("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(
|
|
db_index=True,
|
|
error_messages={"unique": "A user with that username already exists."},
|
|
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
|
|
max_length=150,
|
|
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
|
|
verbose_name="username",
|
|
),
|
|
),
|
|
(
|
|
"first_name",
|
|
models.CharField(blank=True, max_length=150, verbose_name="first name"),
|
|
),
|
|
(
|
|
"last_name",
|
|
models.CharField(blank=True, max_length=150, verbose_name="last name"),
|
|
),
|
|
(
|
|
"email",
|
|
models.EmailField(blank=True, max_length=254, verbose_name="email address"),
|
|
),
|
|
(
|
|
"is_staff",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Designates whether the user can log into this admin site.",
|
|
verbose_name="staff status",
|
|
),
|
|
),
|
|
(
|
|
"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",
|
|
),
|
|
),
|
|
(
|
|
"date_joined",
|
|
models.DateTimeField(
|
|
default=django.utils.timezone.now, verbose_name="date joined"
|
|
),
|
|
),
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
db_index=True, default=uuid.uuid4, editable=False, verbose_name="ID"
|
|
),
|
|
),
|
|
(
|
|
"role",
|
|
models.CharField(
|
|
choices=[
|
|
("ADMIN", "Administrator"),
|
|
("DOCTOR", "Doctor"),
|
|
("NURSE", "Nurse"),
|
|
("OT", "Occupational Therapist"),
|
|
("SLP", "Speech-Language Pathologist"),
|
|
("ABA", "ABA Therapist"),
|
|
("FRONT_DESK", "Front Desk"),
|
|
("FINANCE", "Finance"),
|
|
],
|
|
default="FRONT_DESK",
|
|
max_length=20,
|
|
verbose_name="Role",
|
|
),
|
|
),
|
|
(
|
|
"phone_number",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Phone Number"
|
|
),
|
|
),
|
|
(
|
|
"employee_id",
|
|
models.CharField(blank=True, max_length=50, verbose_name="Employee ID"),
|
|
),
|
|
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
|
("history_date", models.DateTimeField(db_index=True)),
|
|
("history_change_reason", models.CharField(max_length=100, null=True)),
|
|
(
|
|
"history_type",
|
|
models.CharField(
|
|
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
|
|
),
|
|
),
|
|
(
|
|
"history_user",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="+",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "historical User",
|
|
"verbose_name_plural": "historical Users",
|
|
"ordering": ("-history_date", "-history_id"),
|
|
"get_latest_by": ("history_date", "history_id"),
|
|
},
|
|
bases=(simple_history.models.HistoricalChanges, models.Model),
|
|
),
|
|
migrations.CreateModel(
|
|
name="HistoricalPatient",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
db_index=True, default=uuid.uuid4, editable=False, verbose_name="ID"
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Created At"),
|
|
),
|
|
(
|
|
"updated_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Updated At"),
|
|
),
|
|
(
|
|
"mrn",
|
|
models.CharField(
|
|
db_index=True, editable=False, max_length=20, verbose_name="MRN"
|
|
),
|
|
),
|
|
(
|
|
"national_id",
|
|
models.CharField(blank=True, max_length=20, verbose_name="National ID"),
|
|
),
|
|
(
|
|
"first_name_en",
|
|
models.CharField(max_length=100, verbose_name="First Name (English)"),
|
|
),
|
|
(
|
|
"father_name_en",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Father Name (English)"
|
|
),
|
|
),
|
|
(
|
|
"grandfather_name_en",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Grandfather Name (English)"
|
|
),
|
|
),
|
|
(
|
|
"last_name_en",
|
|
models.CharField(max_length=100, verbose_name="Last Name (English)"),
|
|
),
|
|
(
|
|
"first_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="First Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"father_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Father Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"grandfather_name_ar",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Grandfather Name (Arabic)"
|
|
),
|
|
),
|
|
(
|
|
"last_name_ar",
|
|
models.CharField(blank=True, max_length=100, verbose_name="Last Name (Arabic)"),
|
|
),
|
|
("date_of_birth", models.DateField(verbose_name="Date of Birth")),
|
|
(
|
|
"sex",
|
|
models.CharField(
|
|
choices=[("M", "Male"), ("F", "Female")], max_length=1, verbose_name="Sex"
|
|
),
|
|
),
|
|
(
|
|
"phone",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Phone Number"
|
|
),
|
|
),
|
|
("email", models.EmailField(blank=True, max_length=254, verbose_name="Email")),
|
|
(
|
|
"caregiver_name",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Caregiver Name"),
|
|
),
|
|
(
|
|
"caregiver_phone",
|
|
phonenumber_field.modelfields.PhoneNumberField(
|
|
blank=True, max_length=128, region=None, verbose_name="Caregiver Phone"
|
|
),
|
|
),
|
|
(
|
|
"caregiver_relationship",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Caregiver Relationship"
|
|
),
|
|
),
|
|
("address", models.TextField(blank=True, verbose_name="Address")),
|
|
("city", models.CharField(blank=True, max_length=100, verbose_name="City")),
|
|
(
|
|
"postal_code",
|
|
models.CharField(blank=True, max_length=20, verbose_name="Postal Code"),
|
|
),
|
|
(
|
|
"emergency_contact",
|
|
models.TextField(blank=True, verbose_name="Emergency Contact"),
|
|
),
|
|
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
|
("history_date", models.DateTimeField(db_index=True)),
|
|
("history_change_reason", models.CharField(max_length=100, null=True)),
|
|
(
|
|
"history_type",
|
|
models.CharField(
|
|
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
|
|
),
|
|
),
|
|
(
|
|
"history_user",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="+",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "historical Patient",
|
|
"verbose_name_plural": "historical Patients",
|
|
"ordering": ("-history_date", "-history_id"),
|
|
"get_latest_by": ("history_date", "history_id"),
|
|
},
|
|
bases=(simple_history.models.HistoricalChanges, models.Model),
|
|
),
|
|
migrations.CreateModel(
|
|
name="HistoricalConsent",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
db_index=True, default=uuid.uuid4, editable=False, verbose_name="ID"
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Created At"),
|
|
),
|
|
(
|
|
"updated_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Updated At"),
|
|
),
|
|
(
|
|
"consent_type",
|
|
models.CharField(
|
|
choices=[
|
|
("GENERAL_TREATMENT", "General Treatment"),
|
|
("SERVICE_SPECIFIC", "Service Specific"),
|
|
("PHOTO_VIDEO", "Photo/Video"),
|
|
("DATA_SHARING", "Data Sharing"),
|
|
],
|
|
max_length=30,
|
|
verbose_name="Consent Type",
|
|
),
|
|
),
|
|
("content_text", models.TextField(verbose_name="Content Text")),
|
|
(
|
|
"signed_by_name",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Signed By Name"),
|
|
),
|
|
(
|
|
"signed_by_relationship",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Relationship to Patient"
|
|
),
|
|
),
|
|
(
|
|
"signed_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Signed At"),
|
|
),
|
|
(
|
|
"signature_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("DRAWN", "Drawn"),
|
|
("TYPED", "Typed"),
|
|
("UPLOADED", "Uploaded"),
|
|
("EXTERNAL", "External Provider"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Signature Method",
|
|
),
|
|
),
|
|
(
|
|
"signature_image",
|
|
models.TextField(
|
|
blank=True, max_length=100, null=True, verbose_name="Signature Image"
|
|
),
|
|
),
|
|
(
|
|
"signature_hash",
|
|
models.CharField(blank=True, max_length=64, verbose_name="Signature Hash"),
|
|
),
|
|
(
|
|
"signed_ip",
|
|
models.GenericIPAddressField(
|
|
blank=True, null=True, verbose_name="Signed IP Address"
|
|
),
|
|
),
|
|
(
|
|
"signed_user_agent",
|
|
models.TextField(blank=True, verbose_name="Signed User Agent"),
|
|
),
|
|
("version", models.PositiveIntegerField(default=1, verbose_name="Version")),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
|
("history_date", models.DateTimeField(db_index=True)),
|
|
("history_change_reason", models.CharField(max_length=100, null=True)),
|
|
(
|
|
"history_type",
|
|
models.CharField(
|
|
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
|
|
),
|
|
),
|
|
(
|
|
"history_user",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="+",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "historical Consent",
|
|
"verbose_name_plural": "historical Consents",
|
|
"ordering": ("-history_date", "-history_id"),
|
|
"get_latest_by": ("history_date", "history_id"),
|
|
},
|
|
bases=(simple_history.models.HistoricalChanges, models.Model),
|
|
),
|
|
migrations.CreateModel(
|
|
name="Consent",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"consent_type",
|
|
models.CharField(
|
|
choices=[
|
|
("GENERAL_TREATMENT", "General Treatment"),
|
|
("SERVICE_SPECIFIC", "Service Specific"),
|
|
("PHOTO_VIDEO", "Photo/Video"),
|
|
("DATA_SHARING", "Data Sharing"),
|
|
],
|
|
max_length=30,
|
|
verbose_name="Consent Type",
|
|
),
|
|
),
|
|
("content_text", models.TextField(verbose_name="Content Text")),
|
|
(
|
|
"signed_by_name",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Signed By Name"),
|
|
),
|
|
(
|
|
"signed_by_relationship",
|
|
models.CharField(
|
|
blank=True, max_length=100, verbose_name="Relationship to Patient"
|
|
),
|
|
),
|
|
(
|
|
"signed_at",
|
|
models.DateTimeField(blank=True, null=True, verbose_name="Signed At"),
|
|
),
|
|
(
|
|
"signature_method",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("DRAWN", "Drawn"),
|
|
("TYPED", "Typed"),
|
|
("UPLOADED", "Uploaded"),
|
|
("EXTERNAL", "External Provider"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Signature Method",
|
|
),
|
|
),
|
|
(
|
|
"signature_image",
|
|
models.ImageField(
|
|
blank=True,
|
|
null=True,
|
|
upload_to="consents/signatures/",
|
|
verbose_name="Signature Image",
|
|
),
|
|
),
|
|
(
|
|
"signature_hash",
|
|
models.CharField(blank=True, max_length=64, verbose_name="Signature Hash"),
|
|
),
|
|
(
|
|
"signed_ip",
|
|
models.GenericIPAddressField(
|
|
blank=True, null=True, verbose_name="Signed IP Address"
|
|
),
|
|
),
|
|
(
|
|
"signed_user_agent",
|
|
models.TextField(blank=True, verbose_name="Signed User Agent"),
|
|
),
|
|
("version", models.PositiveIntegerField(default=1, verbose_name="Version")),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="consents",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Consent",
|
|
"verbose_name_plural": "Consents",
|
|
"ordering": ["-created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Clinic",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("name_en", models.CharField(max_length=200, verbose_name="Name (English)")),
|
|
(
|
|
"name_ar",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Name (Arabic)"),
|
|
),
|
|
(
|
|
"specialty",
|
|
models.CharField(
|
|
choices=[
|
|
("MEDICAL", "Medical"),
|
|
("NURSING", "Nursing"),
|
|
("ABA", "ABA Therapy"),
|
|
("OT", "Occupational Therapy"),
|
|
("SLP", "Speech-Language Pathology"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Specialty",
|
|
),
|
|
),
|
|
("code", models.CharField(max_length=50, verbose_name="Code")),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Clinic",
|
|
"verbose_name_plural": "Clinics",
|
|
"ordering": ["name_en"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="AuditLog",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("object_id", models.UUIDField(blank=True, null=True, verbose_name="Object ID")),
|
|
(
|
|
"action",
|
|
models.CharField(
|
|
choices=[
|
|
("CREATE", "Create"),
|
|
("UPDATE", "Update"),
|
|
("DELETE", "Delete"),
|
|
("VIEW", "View"),
|
|
("EXPORT", "Export"),
|
|
("PRINT", "Print"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Action",
|
|
),
|
|
),
|
|
("timestamp", models.DateTimeField(auto_now_add=True, verbose_name="Timestamp")),
|
|
("changes", models.JSONField(blank=True, default=dict, verbose_name="Changes")),
|
|
(
|
|
"ip_address",
|
|
models.GenericIPAddressField(blank=True, null=True, verbose_name="IP Address"),
|
|
),
|
|
(
|
|
"content_type",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
to="contenttypes.contenttype",
|
|
verbose_name="Content Type",
|
|
),
|
|
),
|
|
(
|
|
"user",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="audit_logs",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="User",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Audit Log",
|
|
"verbose_name_plural": "Audit Logs",
|
|
"ordering": ["-timestamp"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Attachment",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("object_id", models.UUIDField(verbose_name="Object ID")),
|
|
("file", models.FileField(upload_to="attachments/%Y/%m/%d/", verbose_name="File")),
|
|
(
|
|
"file_type",
|
|
models.CharField(
|
|
choices=[
|
|
("PDF", "PDF"),
|
|
("IMAGE", "Image"),
|
|
("DOCUMENT", "Document"),
|
|
("OTHER", "Other"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="File Type",
|
|
),
|
|
),
|
|
("description", models.TextField(blank=True, verbose_name="Description")),
|
|
(
|
|
"content_type",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
to="contenttypes.contenttype",
|
|
verbose_name="Content Type",
|
|
),
|
|
),
|
|
(
|
|
"uploaded_by",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="uploaded_attachments",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Uploaded By",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Attachment",
|
|
"verbose_name_plural": "Attachments",
|
|
"ordering": ["-created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="SubFile",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"sub_file_number",
|
|
models.CharField(max_length=20, verbose_name="Sub-File Number"),
|
|
),
|
|
("opened_date", models.DateField(auto_now_add=True, verbose_name="Opened Date")),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[("ACTIVE", "Active"), ("CLOSED", "Closed")],
|
|
default="ACTIVE",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"assigned_provider",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="assigned_subfiles",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Assigned Provider",
|
|
),
|
|
),
|
|
(
|
|
"clinic",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="subfiles",
|
|
to="core.clinic",
|
|
verbose_name="Clinic",
|
|
),
|
|
),
|
|
(
|
|
"file",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="subfiles",
|
|
to="core.file",
|
|
verbose_name="File",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Sub-File",
|
|
"verbose_name_plural": "Sub-Files",
|
|
"ordering": ["-opened_date"],
|
|
"unique_together": {("file", "clinic")},
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="patient",
|
|
index=models.Index(fields=["mrn"], name="core_patien_mrn_bf2689_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="patient",
|
|
index=models.Index(fields=["national_id"], name="core_patien_nationa_914a52_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="patient",
|
|
index=models.Index(
|
|
fields=["tenant", "created_at"], name="core_patien_tenant__444b99_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="file",
|
|
index=models.Index(fields=["file_number"], name="core_file_file_nu_1ef7fc_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="file",
|
|
index=models.Index(fields=["patient"], name="core_file_patient_e15715_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="consent",
|
|
index=models.Index(
|
|
fields=["patient", "consent_type"], name="core_consen_patient_53785b_idx"
|
|
),
|
|
),
|
|
migrations.AlterUniqueTogether(
|
|
name="clinic",
|
|
unique_together={("tenant", "code")},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="auditlog",
|
|
index=models.Index(
|
|
fields=["content_type", "object_id"], name="core_auditl_content_fec0c4_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="auditlog",
|
|
index=models.Index(fields=["user", "timestamp"], name="core_auditl_user_id_7b678c_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="auditlog",
|
|
index=models.Index(
|
|
fields=["action", "timestamp"], name="core_auditl_action_096de0_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="attachment",
|
|
index=models.Index(
|
|
fields=["content_type", "object_id"], name="core_attach_content_d3cac2_idx"
|
|
),
|
|
),
|
|
]
|