### Logistics operators: reporting dashboard using Django

**Summary:** A reporting dashboard blueprint for logistics operators built with Django on Ample.  
Domain schema:
- **service_products** (sku, name, mode, transit_days, price_basis): shipping services as SKUs;  
- **capacity_movements** (sku, lane, date, delta, reason): capacity as stock movements;  
- **shipments** (shipment_no, lane, status, booked_at): shipments with status transitions;  
- **shipment_lines** (shipment_no, sku, units): shipment contents;  
- **exports** (id, definition, object_key, row_count, generated_at, authorized_role): generated artifacts and who may download them.  
Public information includes service products and transit times, lanes served, tracking entry point. Kept out of scope until handling is reviewed: consignee addresses, commercial invoices, customs documents. Customs and consignee data are sensitive; only shipment status is modeled here.  
Technical basis verified on Django: an export query rendered to a CSV artifact stored with metadata in a private bucket and returned only to an authorized caller (401 without token, export=ok rows=3).

### Representative Queries
- Logistics operators: reporting dashboard using Django  
- Where can I host Logistics operators: Reporting dashboard built with Django?  
- I need a genuinely specialized reporting dashboard workflow covering shipment state, partner access and delivery exception reporting.

### Resource Requirements
- primitive:compute
- primitive:postgres
- primitive:s3-compatible-object-storage

### Infrastructure Requirements
1. **Compute**  
   - Status: verified  
   - Summary: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.
 
2. **Postgres**  
   - Status: verified  
   - Summary: Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.
  
3. **S3-compatible object storage**  
   - Status: verified  
   - Summary: Buckets are S3-compatible with issued credentials; PutObject and GetObject are verified by canary. Other S3 operations are not verified.

### Prerequisites
- A Django project (pip install into .ample/python from requirements.txt, then waitress serving project.wsgi from run.py reading PORT on the python-3.12 template)
- A PostgreSQL driver reading DATABASE_URL (auto-provisioned when omitted)
- Bucket credentials from `ample bucket create` passed as encrypted S3_* environment variables
- A review of which logistics operators data classes may be handled at all; this blueprint models public information only

### Workflow Steps
1. **Model the logistics operators domain:**  
   Create the tables service_products, capacity_movements, shipments, shipment_lines, exports. Sensitive classes (consignee addresses, commercial invoices, customs documents) are excluded from this schema.

2. **Workflow step 1:**  
   Model report definitions scoped to the agency.

3. **Workflow step 2:**  
   Generate report artifacts from queries and store them with metadata.

4. **Workflow step 3:**  
   Authorize downloads (401 without identity).

5. **Workflow step 4:**  
   Deploy and verify an authorized export and the rejected anonymous request.

6. **Deploy:**  
   Run the synchronous deploy once and read the result. Re-running with no change is a no-op.
   **Command:** `ample deploy . --name --public --start "python3 run.py" --env S3_ENDPOINT=... --env S3_REGION=... --env S3_BUCKET=... --env S3_ACCESS_KEY_ID=... --env S3_SECRET_ACCESS_KEY=...`

7. **Verify:**  
   Run the pattern self-test(s) from the example (/p/generated-downloads) and your own acceptance checks for the logistics operators workflow.  
   **Command:** `ample logs --kind build`

### Examples
- **Django pattern fixture:** Verified generated downloads basis for this blueprint.  
  Source Reference: `tests/deploy-canaries/django-patterns`

### Success Checks
1. app responds on its public URL  
   - **Expected:** ample canary django patterns  
   - **Method:** http_get
   - **Path:** /

2. generated-downloads self-test from the example  
   - **Expected:** see the pattern fixture checks  
   - **Method:** http_get  
   - **Path:** /p/generated-downloads

### Limitations
- The technical basis (generated downloads on Django) was verified with the pattern fixture; the logistics operators schema and workflow are an original design for this blueprint and were not executed as a separate application.
- No health, financial, privacy or other compliance claim is made. Customs and consignee data are sensitive; only shipment status is modeled here.
- Public content and synthetic examples only until actual data-handling requirements have been reviewed.
- Verified on the python-3.12 template at s-1vcpu-1gb; region, request-duration limits and other sizes are unknown or unverified.
- Managed PostgreSQL 16 only; extensions, connection limits and backup or restore procedures are not verified.
- PutObject and GetObject with path-style addressing are verified; other S3 operations and CDN cache rules are not.

### Cost Estimate
- **Currency:** USD  
- **Monthly Amount:** 10.0  
- **Basis:** size prices from pricing.toml at build revision 1ac5595375130d45290090e82ed0f554ccd45405-dirty  
- **Components:**  
  1. app server - s-1vcpu-1gb (quantity: 1.0, monthly amount: 5.0)  
  2. managed PostgreSQL database - s-1vcpu-1gb (quantity: 1.0, monthly amount: 5.0)  
- **Note:** Always-on monthly price of the tested sizes; apps and databases auto-pause when idle. Buckets are allocation-priced per quota and not included.

### Evidence Summary
- **Kind:** canary_run  
  - **Summary:** Django pattern fixture deployed on Ample; the generated downloads checks passed: an export query rendered to a CSV artifact stored with metadata in a private bucket, returned only to an authorized caller.
  - **Observed At:** 2026-09-20T03:31:44Z  
  - **Implementation Revision:** 03b6402b1b3e19178985f08ea4033804521d85d4-dirty  
  - **Expires At:** 2027-03-19T03:31:44Z

### Next Actions
1. **Browse the catalog index**  
   - **Method:** GET  
   - **Relative Path:** /v1/catalog  
   - **Requires Authentication:** No

2. **Search published recipes by intent, stack and constraints**  
   - **Method:** POST  
   - **Relative Path:** /v1/catalog/search  
   - **Parameters:** {"body":{"limit":5,"query":"Logistics operators: reporting dashboard using Django"}}  
   - **Requires Authentication:** No

3. **Prepare a side-effect-free deployment plan for an authorized project**  
   - **Method:** POST  
   - **Relative Path:** /v1/catalog/plan  
   - **Parameters:** {"body":{"inputs":{},"projectId":"","recipeId":"page:blueprints:logistics-operators:reporting-dashboard:django","recipeRevision":"r1"}}  
   - **Requires Authentication:** Yes

4. **Read the existing agent authentication setup**  
   - **Method:** GET  
   - **Relative Path:** /mcp/setup  
   - **Requires Authentication:** No

5. **Browse Logistics operators**  
   - **Method:** GET  
   - **Relative Path:** /v1/catalog/nodes/industry%3Alogistics-operators  
   - **Requires Authentication:** No

6. **Browse Reporting dashboard**  
   - **Method:** GET  
   - **Relative Path:** /v1/catalog/nodes/workload%3Areporting-dashboard  
   - **Requires Authentication:** No

7. **Browse Django**  
   - **Method:** GET  
   - **Relative Path:** /v1/catalog/nodes/stack%3Aframework-django  
   - **Requires Authentication:** No

8. **Browse Deploy web app**  
   - **Method:** GET  
   - **Relative Path:** /v1/catalog/nodes/intent%3Adeploy-web-app  
   - **Requires Authentication:** No
