HH/apps/physicians/forms.py
2026-04-09 13:46:34 +03:00

159 lines
4.9 KiB
Python

"""
Physicians Forms
Forms for doctor rating imports and filtering.
"""
from django import forms
from apps.organizations.models import Hospital
from apps.core.form_mixins import HospitalFieldMixin
class DoctorRatingImportForm(HospitalFieldMixin, forms.Form):
"""
Form for importing doctor ratings from CSV.
Hospital field visibility:
- PX Admins: See dropdown with all hospitals
- Others: Hidden field, auto-set to user's hospital
"""
hospital = forms.ModelChoiceField(
queryset=Hospital.objects.filter(status="active"),
label="Hospital",
help_text="Select the hospital these ratings belong to",
)
csv_file = forms.FileField(
label="CSV File",
help_text="Upload the Doctor Rating Report CSV file",
widget=forms.FileInput(attrs={"accept": ".csv"}),
)
skip_header_rows = forms.IntegerField(
label="Skip Header Rows",
initial=6,
min_value=0,
max_value=20,
help_text="Number of rows to skip before the column headers (Doctor Rating Report typically has 6 header rows)",
)
def clean_csv_file(self):
csv_file = self.cleaned_data["csv_file"]
# Check file extension
if not csv_file.name.endswith(".csv"):
raise forms.ValidationError("File must be a CSV file (.csv extension)")
# Check file size (max 10MB)
if csv_file.size > 10 * 1024 * 1024:
raise forms.ValidationError("File size must be less than 10MB")
return csv_file
class DoctorRatingFetchForm(HospitalFieldMixin, forms.Form):
"""
Form for fetching doctor ratings from HIS API by date range.
Hospital field visibility:
- PX Admins: See dropdown with all hospitals
- Others: Hidden field, auto-set to user's hospital
"""
hospital = forms.ModelChoiceField(
queryset=Hospital.objects.filter(status="active"),
label="Hospital",
help_text="Select the hospital for tracking the import job",
)
from_date = forms.DateField(
label="From Date",
widget=forms.DateInput(
attrs={
"type": "date",
"class": "w-full px-4 py-2.5 border border-slate-200 rounded-xl text-sm focus:ring-2 focus:ring-navy/20 focus:border-navy outline-none transition",
}
),
help_text="Start date for fetching ratings",
)
to_date = forms.DateField(
label="To Date",
widget=forms.DateInput(
attrs={
"type": "date",
"class": "w-full px-4 py-2.5 border border-slate-200 rounded-xl text-sm focus:ring-2 focus:ring-navy/20 focus:border-navy outline-none transition",
}
),
help_text="End date for fetching ratings",
)
def clean(self):
cleaned_data = super().clean()
from_date = cleaned_data.get("from_date")
to_date = cleaned_data.get("to_date")
if from_date and to_date and from_date > to_date:
raise forms.ValidationError("From date must be before or equal to to date.")
return cleaned_data
class DoctorRatingFilterForm(forms.Form):
"""
Form for filtering individual doctor ratings.
"""
hospital = forms.ModelChoiceField(
queryset=Hospital.objects.filter(status="active"), required=False, label="Hospital"
)
doctor_id = forms.CharField(
required=False, label="Doctor ID", widget=forms.TextInput(attrs={"placeholder": "e.g., 10738"})
)
doctor_name = forms.CharField(
required=False, label="Doctor Name", widget=forms.TextInput(attrs={"placeholder": "Search by doctor name"})
)
rating_min = forms.IntegerField(
required=False,
min_value=1,
max_value=5,
label="Min Rating",
widget=forms.NumberInput(attrs={"placeholder": "1-5"}),
)
rating_max = forms.IntegerField(
required=False,
min_value=1,
max_value=5,
label="Max Rating",
widget=forms.NumberInput(attrs={"placeholder": "1-5"}),
)
date_from = forms.DateField(required=False, label="From Date", widget=forms.DateInput(attrs={"type": "date"}))
date_to = forms.DateField(required=False, label="To Date", widget=forms.DateInput(attrs={"type": "date"}))
source = forms.ChoiceField(
required=False,
label="Source",
choices=[("", "All Sources")]
+ [("his_api", "HIS API"), ("csv_import", "CSV Import"), ("manual", "Manual Entry")],
)
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
# Filter hospital choices based on user role
if user.is_px_admin():
self.fields["hospital"].queryset = Hospital.objects.filter(status="active")
elif user.hospital:
self.fields["hospital"].queryset = Hospital.objects.filter(id=user.hospital.id)
self.fields["hospital"].initial = user.hospital
else:
self.fields["hospital"].queryset = Hospital.objects.none()