4.8 KiB
Data Browse Monitor
Test-oriented data navigation for AMAR - quickly find which users to log in as for different test scenarios.
Purpose
When working on multiple tickets simultaneously, you need to quickly navigate to users in specific data states:
- New user with no data
- User with pets but no requests
- User with pending payment
- Vet with active requests
- Admin account
This monitor provides at-a-glance views of the database grouped by test-relevant states.
Architecture
Follows pawprint book/larder pattern:
- larder/ contains all data files (schema, views, scenarios)
- main.py generates SQL queries from view definitions
- Two modes: SQL (direct queries) and API (Django backend, placeholder)
Key Concepts
Schema (larder/schema.json)
- AMAR data model with SQL table mappings
- Regular fields (from database columns)
- Computed fields (SQL expressions)
- Support for multiple graph generators
Views (larder/views.json)
- Define what to display and how to group it
- Each view targets an entity (User, PetOwner, Veterinarian, etc.)
- Can group results (e.g., by role, by data state, by availability)
- SQL is generated automatically from view configuration
Scenarios (larder/scenarios.json)
- Test scenarios emerge from actual usage
- Format defined, real scenarios added as needed
- Links scenarios to specific views with filters
Available Views
- users_by_role - All users grouped by USER/VET/ADMIN for quick login selection
- petowners_by_state - Pet owners grouped by data state (has_pets, has_coverage, has_requests, has_turnos)
- vets_by_availability - Vets grouped by availability status (available, busy, very busy, no availability)
- requests_pipeline - Active service requests grouped by state (similar to turnos monitor)
Running Locally
cd /home/mariano/wdir/ama/pawprint/ward/monitor/data_browse
python main.py
# Opens on http://localhost:12020
Or with uvicorn:
uvicorn ward.monitor.data_browse.main:app --port 12020 --reload
Environment Variables
# Database connection (defaults to local dev)
export NEST_NAME=local
export DB_HOST=localhost
export DB_PORT=5433
export DB_NAME=amarback
export DB_USER=mariano
export DB_PASSWORD=""
API Endpoints
GET / # Landing page
GET /view/{view_slug} # View display (HTML)
GET /health # Health check
GET /api/views # List all views (JSON)
GET /api/view/{view_slug} # View data (JSON)
GET /api/schema # Data model schema (JSON)
GET /api/scenarios # Test scenarios (JSON)
Adding New Views
Edit larder/views.json:
{
"name": "my_new_view",
"title": "My New View",
"slug": "my-new-view",
"description": "Description of what this shows",
"mode": "sql",
"entity": "PetOwner",
"group_by": "some_field",
"fields": ["id", "first_name", "last_name", "email"],
"display_fields": {
"id": {"label": "ID", "width": "60px"},
"first_name": {"label": "Name", "width": "120px"}
}
}
The SQL query is automatically generated from:
- Entity definition in
schema.json(table name, columns) - Fields list (regular + computed fields)
- Group by configuration (if specified)
- Filters (if specified)
Adding Computed Fields
Edit larder/schema.json in the entity definition:
"computed": {
"has_pets": {
"description": "Has at least one pet",
"sql": "EXISTS (SELECT 1 FROM mascotas_pet WHERE petowner_id = mascotas_petowner.id AND deleted = false)"
}
}
Computed fields can be used in views just like regular fields.
Adding Test Scenarios
As you identify test patterns, add them to larder/scenarios.json:
{
"name": "User with Pending Payment",
"slug": "user-pending-payment",
"description": "User with accepted request awaiting payment",
"role": "USER",
"entity": "ServiceRequest",
"view": "requests_pipeline",
"filters": {
"state": ["vet_accepted", "in_progress_pay"],
"has_payment": false
},
"test_cases": [
"Payment flow (MercadoPago)",
"Payment reminders",
"Payment timeout"
]
}
Files
data_browse/
├── larder/
│ ├── .larder # Larder marker (book pattern)
│ ├── schema.json # AMAR data model with SQL mappings
│ ├── views.json # View configurations
│ └── scenarios.json # Test scenarios
├── main.py # FastAPI app
├── index.html # Landing page
├── view.html # View display template
└── README.md # This file
Status
Current: SQL mode fully implemented, ready for local testing
Next: Test with local database, refine views based on usage
Future: See workbench/data_browse_roadmap.md