HH/apps/organizations/forms.py
2026-03-15 23:48:45 +03:00

162 lines
6.5 KiB
Python

"""
Organizations forms - Patient, Staff, Department management
"""
from django import forms
from django.utils.translation import gettext_lazy as _
from apps.organizations.models import Patient, Staff, Department, Hospital
from apps.core.form_mixins import HospitalFieldMixin, DepartmentFieldMixin
class PatientForm(forms.ModelForm):
"""Form for creating and editing patients"""
class Meta:
model = Patient
fields = [
"mrn",
"first_name",
"last_name",
"first_name_ar",
"last_name_ar",
"national_id",
"date_of_birth",
"gender",
"phone",
"email",
"address",
"city",
"primary_hospital",
"status",
]
widgets = {
"mrn": forms.TextInput(attrs={"class": "form-control", "placeholder": "e.g., PTN-20240101-123456"}),
"first_name": forms.TextInput(attrs={"class": "form-control", "placeholder": "First name in English"}),
"last_name": forms.TextInput(attrs={"class": "form-control", "placeholder": "Last name in English"}),
"first_name_ar": forms.TextInput(
attrs={"class": "form-control", "placeholder": "الاسم الأول", "dir": "rtl"}
),
"last_name_ar": forms.TextInput(
attrs={"class": "form-control", "placeholder": "اسم العائلة", "dir": "rtl"}
),
"national_id": forms.TextInput(
attrs={"class": "form-control", "placeholder": "National ID / Iqama number"}
),
"date_of_birth": forms.DateInput(attrs={"class": "form-control", "type": "date"}),
"gender": forms.Select(attrs={"class": "form-select"}),
"phone": forms.TextInput(attrs={"class": "form-control", "placeholder": "+966501234567"}),
"email": forms.EmailInput(attrs={"class": "form-control", "placeholder": "patient@example.com"}),
"address": forms.Textarea(attrs={"class": "form-control", "rows": 2, "placeholder": "Street address"}),
"city": forms.TextInput(attrs={"class": "form-control", "placeholder": "City"}),
"primary_hospital": forms.Select(attrs={"class": "form-select"}),
"status": forms.Select(attrs={"class": "form-select"}),
}
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user = user
# Filter hospital choices based on user permissions
if user.hospital and not user.is_px_admin():
self.fields["primary_hospital"].queryset = Hospital.objects.filter(id=user.hospital.id, status="active")
self.fields["primary_hospital"].initial = user.hospital
else:
self.fields["primary_hospital"].queryset = Hospital.objects.filter(status="active")
# Make MRN optional for creation (will auto-generate if empty)
if not self.instance.pk:
self.fields["mrn"].required = False
self.fields["mrn"].help_text = _("Leave blank to auto-generate")
def clean_mrn(self):
"""Validate MRN is unique"""
mrn = self.cleaned_data.get("mrn")
if not mrn:
return mrn
# Check uniqueness (excluding current instance)
queryset = Patient.objects.filter(mrn=mrn)
if self.instance.pk:
queryset = queryset.exclude(pk=self.instance.pk)
if queryset.exists():
raise forms.ValidationError(_("A patient with this MRN already exists."))
return mrn
def clean_phone(self):
"""Normalize phone number"""
phone = self.cleaned_data.get("phone", "")
if phone:
# Remove spaces and dashes
phone = phone.replace(" ", "").replace("-", "")
return phone
def save(self, commit=True):
"""Auto-generate MRN if not provided"""
instance = super().save(commit=False)
if not instance.mrn:
instance.mrn = Patient.generate_mrn()
if commit:
instance.save()
return instance
class StaffForm(HospitalFieldMixin, DepartmentFieldMixin, forms.ModelForm):
"""Form for creating and editing staff"""
class Meta:
model = Staff
fields = [
"employee_id",
"first_name",
"last_name",
"first_name_ar",
"last_name_ar",
"name",
"name_ar",
"staff_type",
"job_title",
"job_title_ar",
"specialization",
"license_number",
"email",
"phone",
"hospital",
"department",
"section_fk",
"subsection_fk",
"report_to",
"is_head",
"gender",
"status",
]
widgets = {
"employee_id": forms.TextInput(attrs={"class": "form-control"}),
"first_name": forms.TextInput(attrs={"class": "form-control"}),
"last_name": forms.TextInput(attrs={"class": "form-control"}),
"first_name_ar": forms.TextInput(attrs={"class": "form-control", "dir": "rtl"}),
"last_name_ar": forms.TextInput(attrs={"class": "form-control", "dir": "rtl"}),
"name": forms.TextInput(attrs={"class": "form-control"}),
"name_ar": forms.TextInput(attrs={"class": "form-control", "dir": "rtl"}),
"staff_type": forms.Select(attrs={"class": "form-select"}),
"job_title": forms.TextInput(attrs={"class": "form-control"}),
"job_title_ar": forms.TextInput(attrs={"class": "form-control", "dir": "rtl"}),
"specialization": forms.TextInput(attrs={"class": "form-control"}),
"license_number": forms.TextInput(attrs={"class": "form-control"}),
"email": forms.EmailInput(attrs={"class": "form-control"}),
"phone": forms.TextInput(attrs={"class": "form-control"}),
"hospital": forms.Select(attrs={"class": "form-select"}),
"department": forms.Select(attrs={"class": "form-select"}),
"section_fk": forms.Select(attrs={"class": "form-select"}),
"subsection_fk": forms.Select(attrs={"class": "form-select"}),
"report_to": forms.Select(attrs={"class": "form-select"}),
"is_head": forms.CheckboxInput(attrs={"class": "form-check-input"}),
"gender": forms.Select(attrs={"class": "form-select"}),
"status": forms.Select(attrs={"class": "form-select"}),
}