accession
Sample collection, barcoding, batching, and sample lifecycle management
Accession App Architecture
Domain Responsibility
What This App Owns
- Sample lifecycle - Collection, storage, tracking
- Barcoding - Sample identification
- Batching - Sample grouping for processing
- Accession patterns - Lab-specific numbering
- Sample racks - Physical storage management
What It Depends On
core/- BaseModel, utilitiesadmin/- Labs, departments, testsfinance/- Billing for sample context
What Should NOT Be Added Here
- Device interfacing (belongs in
interfacing/) - Report generation (belongs in
report/) - Patient demographics (belongs in
patient/)
Model-Centric Design (Fat Models)
Key Models
| Model | Responsibility | Key Fields | Cross-App Relations |
|---|---|---|---|
Sample | Sample type master | name, code, container_type | admin.AllTests |
CollectedSample | Collected instance | barcode, status, collected_at | finance.Billing |
Batches | Sample grouping | batch_number, status | Sample |
SampleBatches | Batch-sample relation | batch_id, sample_id | |
AccessionPatterns | Numbering rules | pattern, current_sequence | admin.Labs |
SampleRack | Physical storage | rack_number, position | CollectedSample |
Business Logic in Models
Sample (accession/models/sample.py) - 339 lines
Key Methods:
| Method | Purpose |
|---|---|
prepare_sample_barcode_data() | Generate barcode labels |
filter_dict() | Filter sample attributes |
CollectedSample (accession/models/collected_sample.py)
Status Transitions:
| Status | Meaning |
|---|---|
COLLECTED | Sample taken from patient |
RECEIVED | Arrived at lab |
IN_PROGRESS | Being processed |
COMPLETED | Testing done |
REJECTED | Quality issue |
Why Fat Model Style Here
Sample lifecycle is critical for:
- Chain of custody tracking
- Barcode uniqueness
- Batch processing workflow
All logic in models ensures consistent tracking.
Data Access Patterns
Sample Lookup
# accession/models/collected_sample.py
CollectedSample.objects.filter(
labId_id=lab_id,
barcode=barcode
).select_related(
"sample",
"billing"
)Batch Processing
# Get samples in batch
SampleBatches.objects.filter(
batch_id=batch_id
).select_related(
"collected_sample",
"collected_sample__billing"
)API Layer (Wiring)
Endpoint Map
| Endpoint | View | Purpose |
|---|---|---|
GET /accession/samples | SampleListView | List samples |
POST /accession/collect | CollectView | Record collection |
POST /accession/batch | BatchView | Create batch |
GET /accession/barcode/{id} | BarcodeView | Generate barcode |
Safe Extension Guide
Adding New Sample Status
- Add to status choices
- Update state transition logic
- Add to activity logging
Patterns to Follow
- Track all sample movements
- Atomic batch operations
- Validate barcode uniqueness
File Map
| File | Purpose |
|---|---|
| accession/models/sample.py | Sample master (339 lines) |
| accession/models/collected_sample.py | Collected samples |
| accession/models/batches.py | Batch management |
| accession/models/sample_rack.py | Physical storage |
| accession/models/accession_patterns.py | Numbering rules |
| accession/views/ | API views |