ServicesCrelio AppArchitectureApp Modules

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, utilities
  • admin/ - Labs, departments, tests
  • finance/ - 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

ModelResponsibilityKey FieldsCross-App Relations
SampleSample type mastername, code, container_typeadmin.AllTests
CollectedSampleCollected instancebarcode, status, collected_atfinance.Billing
BatchesSample groupingbatch_number, statusSample
SampleBatchesBatch-sample relationbatch_id, sample_id
AccessionPatternsNumbering rulespattern, current_sequenceadmin.Labs
SampleRackPhysical storagerack_number, positionCollectedSample

Business Logic in Models

Sample (accession/models/sample.py) - 339 lines

Key Methods:

MethodPurpose
prepare_sample_barcode_data()Generate barcode labels
filter_dict()Filter sample attributes

CollectedSample (accession/models/collected_sample.py)

Status Transitions:

StatusMeaning
COLLECTEDSample taken from patient
RECEIVEDArrived at lab
IN_PROGRESSBeing processed
COMPLETEDTesting done
REJECTEDQuality issue

Why Fat Model Style Here

Sample lifecycle is critical for:

  1. Chain of custody tracking
  2. Barcode uniqueness
  3. 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

EndpointViewPurpose
GET /accession/samplesSampleListViewList samples
POST /accession/collectCollectViewRecord collection
POST /accession/batchBatchViewCreate batch
GET /accession/barcode/{id}BarcodeViewGenerate barcode

Safe Extension Guide

Adding New Sample Status

  1. Add to status choices
  2. Update state transition logic
  3. Add to activity logging

Patterns to Follow

  • Track all sample movements
  • Atomic batch operations
  • Validate barcode uniqueness

File Map

On this page