Version: 16.0.0 (Docker, linux/amd64) · Endpoint: POST /api/v1/norm-expansion/norms/
Creating a norm via the API fails with HTTP 500 and — more importantly — the transaction
is rolled back, so the norm is not persisted even though it was created in the session.
Backend log:
pydantic_core._pydantic_core.ValidationError: 1 validation error for NormResponse
Error extracting attribute: MissingGreenlet: greenlet_spawn has not been called;
can't call await_only() here. Was IO attempted in an unexpected place?
input_value=<ProductionNorm sc-mo-038 (m2)>
This looks like the same class of bug fixed for budgets in v16.0.0 (response
serialization triggering a lazy load under async SQLAlchemy → session.refresh()
before serializing). Reproduced with a minimal body:
{"work_key": "sc-mo-038", "name": "Test norm", "unit": "m2",
"category": "Test", "labor_hours_per_unit": 1.5, "notes": "test", "is_active": true}
Result: 500 + SELECT count(*) FROM oe_norm_expansion_norm WHERE work_key='sc-mo-038' → 0.
Note: machine_hours_per_unit also has a NOT NULL constraint in the DB while the API
schema marks it nullable — sending null fails with an IntegrityError; 0 works.
Workaround we used: direct SQL insert. Happy to test a fix.
Version: 16.0.0 (Docker, linux/amd64) · Endpoint:
POST /api/v1/norm-expansion/norms/Creating a norm via the API fails with HTTP 500 and — more importantly — the transaction
is rolled back, so the norm is not persisted even though it was created in the session.
Backend log:
This looks like the same class of bug fixed for budgets in v16.0.0 (response
serialization triggering a lazy load under async SQLAlchemy →
session.refresh()before serializing). Reproduced with a minimal body:
{"work_key": "sc-mo-038", "name": "Test norm", "unit": "m2", "category": "Test", "labor_hours_per_unit": 1.5, "notes": "test", "is_active": true}Result: 500 +
SELECT count(*) FROM oe_norm_expansion_norm WHERE work_key='sc-mo-038'→ 0.Note:
machine_hours_per_unitalso has a NOT NULL constraint in the DB while the APIschema marks it nullable — sending
nullfails with an IntegrityError;0works.Workaround we used: direct SQL insert. Happy to test a fix.