HH/apps/organizations/forms.py
2026-01-12 12:19:19 +03:00

162 lines
5.6 KiB
Python

"""
Forms for Organizations app
"""
from django import forms
from .models import Department, Hospital, Organization, Patient, Staff
class StaffForm(forms.ModelForm):
"""Form for creating and updating Staff"""
class Meta:
model = Staff
fields = [
'first_name', 'last_name', 'first_name_ar', 'last_name_ar',
'staff_type', 'job_title', 'license_number', 'specialization',
'employee_id', 'email', 'hospital', 'department', 'status'
]
widgets = {
'first_name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter first name'
}),
'last_name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter last name'
}),
'first_name_ar': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'الاسم الأول',
'dir': 'rtl'
}),
'last_name_ar': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'اسم العائلة',
'dir': 'rtl'
}),
'staff_type': forms.Select(attrs={
'class': 'form-select'
}),
'job_title': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter job title'
}),
'license_number': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter license number'
}),
'specialization': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter specialization'
}),
'employee_id': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter employee ID'
}),
'email': forms.EmailInput(attrs={
'class': 'form-control',
'placeholder': 'Enter email address'
}),
'hospital': forms.Select(attrs={
'class': 'form-select'
}),
'department': forms.Select(attrs={
'class': 'form-select'
}),
'status': forms.Select(attrs={
'class': 'form-select'
}),
}
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
# Filter hospitals based on user role
if user and not user.is_px_admin() and user.hospital:
self.fields['hospital'].queryset = Hospital.objects.filter(id=user.hospital.id)
self.fields['hospital'].initial = user.hospital
self.fields['hospital'].widget.attrs['readonly'] = True
# Filter departments based on selected hospital
if self.instance and self.instance.pk:
# Updating existing staff - filter by their hospital
if self.instance.hospital:
self.fields['department'].queryset = Department.objects.filter(hospital=self.instance.hospital)
else:
self.fields['department'].queryset = Department.objects.none()
elif user and user.hospital:
# Creating new staff - filter by user's hospital
self.fields['department'].queryset = Department.objects.filter(hospital=user.hospital)
else:
self.fields['department'].queryset = Department.objects.none()
def clean_employee_id(self):
"""Validate that employee_id is unique"""
employee_id = self.cleaned_data.get('employee_id')
# Skip validation if this is an update and employee_id hasn't changed
if self.instance.pk and self.instance.employee_id == employee_id:
return employee_id
# Check if employee_id already exists
if Staff.objects.filter(employee_id=employee_id).exists():
raise forms.ValidationError("A staff member with this Employee ID already exists.")
return employee_id
def clean_email(self):
"""Clean email field"""
email = self.cleaned_data.get('email')
if email:
return email.lower().strip()
return email
class OrganizationForm(forms.ModelForm):
"""Form for creating and updating Organization"""
class Meta:
model = Organization
fields = [
'name', 'name_ar', 'code', 'address', 'city',
'phone', 'email', 'website', 'license_number', 'status', 'logo'
]
class HospitalForm(forms.ModelForm):
"""Form for creating and updating Hospital"""
class Meta:
model = Hospital
fields = [
'organization', 'name', 'name_ar', 'code',
'address', 'city', 'phone', 'email',
'license_number', 'capacity', 'status'
]
class DepartmentForm(forms.ModelForm):
"""Form for creating and updating Department"""
class Meta:
model = Department
fields = [
'hospital', 'name', 'name_ar', 'code',
'parent', 'manager', 'phone', 'email',
'location', 'status'
]
class PatientForm(forms.ModelForm):
"""Form for creating and updating Patient"""
class Meta:
model = Patient
fields = [
'mrn', 'national_id', 'first_name', 'last_name',
'first_name_ar', 'last_name_ar', 'date_of_birth',
'gender', 'phone', 'email', 'address', 'city',
'primary_hospital', 'status'
]