5.4 KiB
Observation Model Fixes
Overview
Fixed critical issues in the Observation model to align with the system's tenant isolation architecture and improve parity with the Complaint model.
Issues Fixed
1. Missing Hospital ForeignKey (Critical)
Problem: The Observation model lacked a hospital field, breaking tenant isolation.
Impact:
- Cannot filter observations by hospital
- Cannot track which hospital owns the observation
- Prevents proper routing in multi-hospital environment
- Breaks the tenant isolation pattern used throughout the system
Solution:
- Added
hospitalForeignKey toorganizations.Hospital - Field is required for new observations
- Added database index for efficient filtering by hospital and status
2. Missing Staff ForeignKey
Problem: Observations couldn't track which staff member was mentioned in the report.
Solution:
- Added optional
staffForeignKey toorganizations.Staff - Enables AI-matching similar to Complaint model
- Useful for tracking observations about specific staff members
3. Missing Source Tracking
Problem: No way to track how observations were submitted.
Solution:
- Added
sourcefield with choices:staff_portal- Staff Portal (default)web_form- Web Formmobile_app- Mobile Appemail- Emailcall_center- Call Centerother- Other
Model Changes
Added Fields to Observation Model
hospital = models.ForeignKey(
'organizations.Hospital',
on_delete=models.CASCADE,
related_name='observations',
help_text="Hospital where observation was made"
)
staff = models.ForeignKey(
'organizations.Staff',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='observations',
help_text="Staff member mentioned in observation"
)
source = models.CharField(
max_length=50,
choices=[
('staff_portal', 'Staff Portal'),
('web_form', 'Web Form'),
('mobile_app', 'Mobile App'),
('email', 'Email'),
('call_center', 'Call Center'),
('other', 'Other'),
],
default='staff_portal',
help_text="How the observation was submitted"
)
Added Database Indexes
models.Index(fields=['hospital', 'status', '-created_at'])
Migration Strategy
Migration 0002_add_missing_fields.py
- Adds
hospital,staff, andsourcefields - Initially makes
hospitalnullable to support existing data - Since there are 0 existing observations, no data migration needed
Future Migration
After deployment, a follow-up migration can make hospital required if needed:
migrations.AlterField(
model_name='observation',
name='hospital',
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name='observations',
to='organizations.hospital'
),
)
Why Not Unify with Complaints?
Despite similarities, the models should remain separate:
Key Differences
| Aspect | Complaint | Observation |
|---|---|---|
| Purpose | Patient-reported issues | Staff-reported issues |
| Reporter | Patient FK (required) | Anonymous or staff ID |
| Workflow | Open → In Progress → Resolved → Closed | New → Triaged → Assigned → In Progress → Resolved → Closed (plus REJECTED, DUPLICATE) |
| SLA | Response time SLAs with tracking | Triage timeline, not response time |
| Tracking | Reference number (optional) | Tracking code (required, OBS-XXXXXX) |
| Location | No location field | Location text field |
| Incident Time | No separate field | Incident datetime field |
| Triage | No triage fields | Triage tracking (triaged_by, triaged_at) |
| Resolution Survey | Links to SurveyInstance | No resolution survey |
| Encounter ID | Links to patient encounters | No encounter tracking |
Different Business Logic
- Complaints: Customer service workflow, satisfaction surveys, SLA escalation
- Observations: Safety/quality workflow, triage process, anonymous reporting
Different Stakeholders
- Complaints: Patient experience teams, call center
- Observations: Quality teams, safety officers, clinical governance
Next Steps
-
Run Migration:
python manage.py migrate observations -
Update Forms: Ensure observation forms include hospital selection
- Public observation form
- Staff portal observation form
- Admin observation form
-
Update Views: Add hospital filtering to observation list views
-
Update APIs: Include hospital field in observation APIs
-
Update Templates: Display hospital information in observation detail views
-
Consider AI Integration: Add staff name extraction similar to complaints
- Use
apps.core.ai_service.extract_person_name() - Match extracted names to Staff records
- Populate
stafffield automatically
- Use
Files Modified
-
apps/observations/models.py
- Added
hospitalForeignKey - Added
staffForeignKey - Added
sourcefield - Added hospital status index
- Added
-
apps/observations/migrations/0002_add_missing_fields.py
- Migration to add new fields
Backwards Compatibility
- Migration makes
hospitalinitially nullable - Model code enforces
hospitalas required for new records - Existing code without hospital selection will work but with validation errors for new observations
- Consider updating form validation to ensure hospital is always provided