{% extends "admin/change_form.html" %}

{% block content %}
    {{ block.super }}
    <datalist id="university-list">
        {% for name in university_list %}
            <option value="{{ name }}">{{ name }}</option>
        {% endfor %}
    </datalist>
    <datalist id="degree-list">
        {% for name in degree_list %}
            <option value="{{ name }}">{{ name }}</option>
        {% endfor %}
    </datalist>

{% endblock %}

from django.contrib import admin
from .models import Specialty, University, Degree, DoctorsInfo
from .forms import DoctorsInfoForm
from app_medicalCenters.models import MedicalCenterInfo


class BaseAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)


@admin.register(Specialty)
class SpecialtyAdmin(BaseAdmin):
    pass


@admin.register(University)
class UniversityAdmin(BaseAdmin):
    pass


@admin.register(Degree)
class DegreeAdmin(BaseAdmin):
    pass


@admin.register(DoctorsInfo)
class DoctorsInfoAdmin(admin.ModelAdmin):
    form = DoctorsInfoForm
    change_form_template = 'admin/app_doctors/DoctorsInfo/change_form.html'
    list_display = ('get_user_full_name', 'university', 'degree', 'specialties', 'name_medical_centers')
    search_fields = (
        'user__first_name', 'user__last_name', 'specialties',
        'university', 'degree',
    )
    autocomplete_fields = ('user',)
    fields = (
        'user', 'specialties_existing', 'specialties', 'university', 'degree',
        'office_location', 'medical_centers_existing', 'name_medical_centers', 'profile_image',
        'introduction_video', 'resume', 'description',
    )

    def get_extra_context(self, request):
        return {
            'university_list': list(University.objects.values_list('name', flat=True)),
            'degree_list': list(Degree.objects.values_list('name', flat=True)),
            'specialty_list': list(Specialty.objects.values_list('name', flat=True)),
            'name_medical_centers': list(MedicalCenterInfo.objects.values_list('name_medical_center', flat=True)),
        }

    def add_view(self, request, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().add_view(request, form_url, extra_context=extra_context)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().change_view(request, object_id, form_url, extra_context=extra_context)

    def get_user_full_name(self, obj):
        return f"{obj.user.first_name} {obj.user.last_name}"
    get_user_full_name.short_description = 'نام پزشک'

from django import forms
from django_select2.forms import Select2MultipleWidget
from .models import DoctorsInfo, Specialty
from app_medicalCenters.models import MedicalCenterInfo


class DoctorsInfoForm(forms.ModelForm):
    university = forms.CharField(
        label='نام دانشگاه',
        widget=forms.TextInput(attrs={'list': 'university-list'})
    )
    
    degree = forms.CharField(
        label='مقطع تحصیلی',
        widget=forms.TextInput(attrs={'list': 'degree-list'})
    )

    specialties_existing = forms.MultipleChoiceField(
        label='انتخاب گر تخصص',
        choices=[(specialty.name, specialty.name) for specialty in Specialty.objects.all()],
        required=False,
        widget=Select2MultipleWidget
    )

    specialties = forms.CharField(
        label='تخصص‌ها',
        required=False,
        widget=forms.TextInput(attrs={
            'placeholder': 'وارد کردن تخصص'
        }),
    )

    medical_centers_existing = forms.MultipleChoiceField(
        label='انتخاب گر مراکز درمانی',
        choices=[(center.name_medical_center, center.name_medical_center) for center in MedicalCenterInfo.objects.all()],
        required=False,
        widget=Select2MultipleWidget
    )

    name_medical_centers = forms.CharField(
        label='نام مراکز درمانی',
        required=False,
        widget=forms.TextInput(attrs={
            'placeholder': 'وارد کردن نام مراکز درمانی'
        }),
    )

    class Meta:
        model = DoctorsInfo
        fields = '__all__'
        widgets = {
            'specialties': Select2MultipleWidget,
            'medical_centers_existing': Select2MultipleWidget,
        }

    def clean_name_medical_centers(self):
        centers_existing = self.cleaned_data.get('medical_centers_existing', [])
        centers_input = self.cleaned_data.get('name_medical_centers', '').split(',')
        all_centers = [c.strip() for c in centers_existing + centers_input if c.strip()]
        return ', '.join(set(all_centers))

    def clean_specialties(self):
        specialties_existing = self.cleaned_data.get('specialties_existing', [])
        specialties = self.cleaned_data.get('specialties', '').split(',')
        all_specialties = [s.strip() for s in specialties_existing + specialties if s.strip()]
        return ', '.join(set(all_specialties))

    def save(self, commit=True):
        instance = super().save(commit=False)
        instance.name_medical_centers = self.clean_name_medical_centers()
        instance.specialties = self.clean_specialties()
        if commit:
            instance.save()
        return instance

    class Media:
        css = {
            'all': ('app_doctors/css/custom_select2.css',)
        }

from django.db import models
from django.conf import settings
from app_pharmacy.models import MedicinesInfo


class PatientSymptoms(models.Model):
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name="عنوان علائم"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_patient_symptoms'
        verbose_name_plural = 'علائم های بیمار'


class DiseaseInfo(models.Model):
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name="عنوان بیماری"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_disease_info'
        verbose_name_plural = 'اطلاعات بیماری ها'


class Insurance(models.Model):
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name="عنوان بیمه"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_insurance_type'
        verbose_name_plural = 'نوع بیمه درمانی'


class PatientsInfo(models.Model):
    sick = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        verbose_name="بیمار"
    )
    insurance_type = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="نوع بیمه"
    )
    underlying_disease = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name='بیماری زمینه ای'
    )
    drug_sensitivity = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name='حساسیت دارویی'
    )
    
    def __str__(self):
        return f"{self.sick.first_name} {self.sick.last_name}"

    class Meta:
        db_table = 'tbl_patients_info'
        verbose_name_plural = 'اطلاعات بیمار'

        

from django.db import models
from multiselectfield import MultiSelectField
from django.conf import settings
from app_medicalCenters.models import MedicalCenterInfo



class Specialty(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="تخصص"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_specialties'
        verbose_name_plural = 'تخصص‌های پزشکی'


class University(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نام دانشگاه"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_universities'
        verbose_name_plural = 'دانشگاه‌های پزشکی'


class Degree(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="مقطع تحصیلی"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_degrees'
        verbose_name_plural = 'مدارج تحصیلی'


class DoctorsInfo(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE, 
        verbose_name="کاربر"
    )
    specialties = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="تخصص‌ها"
    )
    university = models.CharField(
        max_length=255,
        blank=True, 
        null=True, 
        verbose_name="فارغ‌التحصیل"
    )
    degree = models.CharField(
        max_length=255,
        blank=True,
        null=True, 
        verbose_name="مدرک تحصیلی"
    )
    profile_image = models.ImageField(
        upload_to='app_doctors/profile_image/', 
        blank=True, 
        null=True, 
        verbose_name='تصویر پروفایل پزشک'
    )
    introduction_video = models.FileField(
        upload_to='app_doctors/introduction_video/', 
        blank=True, 
        null=True,
        verbose_name='ویدیو معرفی پزشک'
    )
    office_location = models.CharField(
        max_length=15, 
        blank=True, 
        null=True, 
        verbose_name='لوکیشن مطب'
    )
    resume = models.TextField(
        blank=True, 
        null=True, 
        verbose_name='رزومه'
    )
    description = models.TextField(
        blank=True, 
        null=True, 
        verbose_name='توضیحات'
    )
    name_medical_centers = models.CharField(
        max_length=255,
        blank=True, 
        null=True,
        verbose_name="فعالیت در مراکز درمانی"
    )
    

    def __str__(self):
        return f"{self.user.first_name} {self.user.last_name}"

    class Meta:
        db_table = 'tbl_doctor_info'
        verbose_name_plural = 'اطلاعات پزشک'


class DoctorsDatabase(models.Model):
    medical_id = models.CharField(
        max_length=40, 
        primary_key=True, 
        verbose_name="شماره نظام پزشکی"
    )
    first_name = models.CharField(
        max_length=30, 
        blank=True, 
        null=True, 
        verbose_name="نام"
    )
    last_name = models.CharField(
        max_length=50, 
        blank=True, 
        null=True, 
        verbose_name="نام خانوادگی"
    )
    specialtie = models.CharField(
        max_length=255, 
        blank=True, 
        null=True, 
        verbose_name="تخصص"
    )
    city = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        verbose_name="شهر"
    )
    degree = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        verbose_name="مدرک تحصیلی"
    )

    def __str__(self):
        return f"{self.first_name} {self.last_name} نظام پزشکی: {self.medical_id}"

    class Meta:
        db_table = 'tbl_doctor_database'
        verbose_name_plural = 'پایگاه داده پزشکان'

با توجه به کد بالا فیلدهای موجود در کد زیر رو هم  مطابق قیلد متناظرشون  اصلاج کن و کد forms , admin, chang_forms زو بهم بده

patient به شکل university در لیست نمایش داده بشه با این تقاوت که علاوع بر نام و نام خانوادگی بیمار، کد ملی بیمار نیز نمایش داده شود

doctor به شکل university با این تفاوت که علاوه بر نام و نام خلنوادگی پزشک شماره نظام پزشکی پزشمک هم نمایش داده بشه در لیست 

symptoms. مانند specialties نوشته بشه و دادهاشو از مدل PatientSymptoms بگیره 
doctors_diagnosis مانند specialties نوشته بشه و داده هاشو از DiseaseInfo بگیره 
medical_tests مانند specialties نوشته بشه و دادهاشو از MedicalTestTypes بگیره 
medical_imaging مانند specialties نوشته بشه و داده هاشو از specialties بگیره 

from django.contrib import admin
from django.db import models
from app_patients.models import PatientsInfo, DiseaseInfo, PatientSymptoms
from app_doctors.models import DoctorsInfo
from app_pharmacy.models import MedicinesInfo
from app_laboratory.models import MedicalTestTypes
from app_medicalImaging.models import PhotographyTypes

class PrescribedMedicationDetail(models.Model):
    appointment = models.ForeignKey(
        'PatientsAppointment',
        on_delete=models.CASCADE,
        related_name='medication_details',
        verbose_name="مراجعه"
    )
    medication = models.ForeignKey(
        MedicinesInfo,
        on_delete=models.CASCADE,
        verbose_name="دارو"
    )
    dosage = models.CharField(
        max_length=255,
        verbose_name="دوز مصرف"
    )
    duration = models.CharField(
        max_length=255,
        verbose_name="دوره مصرف"
    )
    additional_instructions = models.TextField(
        blank=True,
        null=True,
        verbose_name="توضیحات تکمیلی"
    )

    class Meta:
        db_table = 'tbl_prescribed_medication_detail'
        verbose_name_plural = 'جزئیات داروهای تجویز شده'

class PatientsAppointment(models.Model):
    patient = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="بیمار"
    )
    doctor = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="پزشک معالج"
    )
    appointment_date = models.DateTimeField(
        auto_now_add=True,
        verbose_name="تاریخ مراجعه"
    )
    symptoms = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="علائم بیمار"
    )
    doctors_diagnosis = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="تشخیص پزشک"
    )
    medical_tests = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="آزمایشات تجویز شده"
    )
    medical_imaging = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="تصویربرداری های تجویز شده"
    )

    doctor_description = models.TextField(
        blank=True,
        null=True,
        verbose_name = 'توضیحات'
    )


    class Meta:
        db_table = 'tbl_patient_appointment'
        verbose_name_plural = 'مراجعات بیمار'







from django.db import models
from multiselectfield import MultiSelectField
from django.conf import settings
from app_medicalCenters.models import MedicalCenterInfo



class Specialty(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="تخصص"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_specialties'
        verbose_name_plural = 'تخصص‌های پزشکی'


class University(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نام دانشگاه"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_universities'
        verbose_name_plural = 'دانشگاه‌های پزشکی'


class Degree(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="مقطع تحصیلی"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_doctor_degrees'
        verbose_name_plural = 'مدارج تحصیلی'


class DoctorsInfo(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE, 
        verbose_name="کاربر"
    )
    medical_id = models.CharField(
        max_length=255,
        blank=True, 
        null=True,
        verbose_name="کد نظام پزشکی"
    )
    specialties = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="تخصص‌ها"
    )
    university = models.CharField(
        max_length=255,
        blank=True, 
        null=True, 
        verbose_name="فارغ‌التحصیل"
    )
    degree = models.CharField(
        max_length=255,
        blank=True,
        null=True, 
        verbose_name="مدرک تحصیلی"
    )
    profile_image = models.ImageField(
        upload_to='app_doctors/profile_image/', 
        blank=True, 
        null=True, 
        verbose_name='تصویر پروفایل پزشک'
    )
    introduction_video = models.FileField(
        upload_to='app_doctors/introduction_video/', 
        blank=True, 
        null=True,
        verbose_name='ویدیو معرفی پزشک'
    )
    office_location = models.CharField(
        max_length=15, 
        blank=True, 
        null=True, 
        verbose_name='لوکیشن مطب'
    )
    resume = models.TextField(
        blank=True, 
        null=True, 
        verbose_name='رزومه'
    )
    description = models.TextField(
        blank=True, 
        null=True, 
        verbose_name='توضیحات'
    )
    name_medical_centers = models.CharField(
        max_length=255,
        blank=True, 
        null=True,
        verbose_name="فعالیت در مراکز درمانی"
    )
   
    

    def __str__(self):
        return f"{self.user.first_name} {self.user.last_name}"

    class Meta:
        db_table = 'tbl_doctor_info'
        verbose_name_plural = 'اطلاعات پزشک'


class DoctorsDatabase(models.Model):
    medical_id = models.CharField(
        max_length=40, 
        primary_key=True, 
        verbose_name="شماره نظام پزشکی"
    )
    first_name = models.CharField(
        max_length=30, 
        blank=True, 
        null=True, 
        verbose_name="نام"
    )
    last_name = models.CharField(
        max_length=50, 
        blank=True, 
        null=True, 
        verbose_name="نام خانوادگی"
    )
    specialtie = models.CharField(
        max_length=255, 
        blank=True, 
        null=True, 
        verbose_name="تخصص"
    )
    city = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        verbose_name="شهر"
    )
    degree = models.CharField(
        max_length=100, 
        blank=True, 
        null=True, 
        verbose_name="مدرک تحصیلی"
    )

    def __str__(self):
        return f"{self.first_name} {self.last_name} نظام پزشکی: {self.medical_id}"

    class Meta:
        db_table = 'tbl_doctor_database'
        verbose_name_plural = 'پایگاه داده پزشکان'

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
import uuid
import random
import string
from datetime import timedelta
from app_account.msg_sender import send_otp


# region ==> Custom User Model
class CustomUser(AbstractUser):
    
    class GenderChoices(models.TextChoices):
        MALE = 'male', "مرد"
        FEMALE = 'female', "زن"
        OTHER = 'other', "دیگر"

    username = models.CharField(
        max_length=10, 
        unique=True, 
        verbose_name='کد ملی'
    )
    first_name = models.CharField(
        max_length=20, 
        blank=True, 
        null=True, 
        verbose_name='نام'
    )
    last_name = models.CharField(
        max_length=40, 
        blank=True, 
        null=True, 
        verbose_name='نام خانوادگی'
    )
    phone_number = models.CharField(
        max_length=11, 
        blank=True, 
        null=True,
        verbose_name='شماره همراه'
    )
    gender = models.CharField(
        max_length=6, 
        blank=True, 
        null=True, 
        choices=GenderChoices.choices, 
        verbose_name='جنسیت'
    )
    birth_date = models.DateField(
        blank=True, 
        null=True, 
        verbose_name='تاریخ تولد'
    )

    def __str__(self) -> str:
        return f"{self.first_name} {self.last_name}"

    class Meta:
        db_table = 'tbl_user_info'
        verbose_name_plural = 'مشخصات کاربران'
# endregion
from django.db import models

class MedicalTestTypes(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="عنوان آزمایش"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_medical_test_types'
        verbose_name_plural = 'انواع آزمایشات پزشکی'

from django.db import models

class PhotographyTypes(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="عنوان تصویربرداری"
    )

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_photography_types'
        verbose_name_plural = 'انواع تصویربرداری های پزشکی'

from django.contrib import admin
from khayyam import JalaliDate
from django_jalali.admin.filters import JDateFieldListFilter
import django_jalali.admin as jadmin
from .models import PrescribedMedicationDetail, PatientsAppointment

@admin.register(PatientsAppointment)
class PatientsAppointmentAdmin(admin.ModelAdmin):
    raw_id_fields = ('sick', 'doctor',)
    filter_horizontal = ('symptoms', 'doctors_diagnosis', 'medical_tests', 'medical_imaging')

    # توابع کمکی برای دریافت نام کامل بیمار و پزشک
    def get_sick_full_name(self, obj):
        return f"{obj.sick.sick.first_name} {obj.sick.sick.last_name}"
    get_sick_full_name.short_description = 'نام بیمار'

    def get_doctor_full_name(self, obj):
        if obj.doctor:
            return f"{obj.doctor.user.first_name} {obj.doctor.user.last_name}"
        return "پزشک ناشناخته"
    get_doctor_full_name.short_description = 'نام پزشک'

    def get_jalali_date(self, obj):
        return JalaliDate(obj.appointment_date).strftime('%Y/%m/%d')
    get_jalali_date.short_description = 'تاریخ شمسی'

    list_display = ('get_sick_full_name', 'get_doctor_full_name', 'get_jalali_date')
    list_display_links = ('get_sick_full_name', 'get_doctor_full_name')

    class PrescribedMedicationDetailInline(admin.TabularInline):
        model = PrescribedMedicationDetail
        extra = 1 

    inlines = [PrescribedMedicationDetailInline]

    class Media:
        js = ('app_healthFile/js/update_doctor_name.js',)  

لطفا حواست باش برای بقیه تنظیماتی که زدم تغیراتی ایجاد نشه که بهم بریزه