Summary
A set of fixes to align the Python runtime with the other runtimes (Java, TypeScript, .NET) for functional equivalence and cross-runtime consistency.
Contracts Service
Timestamp format (contract_event_handler.py)
create_contract: replaced datetime.now().strftime("%d/%m/%Y %H:%M:%S") with datetime.now(timezone.utc).isoformat() for both contract_created and contract_last_modified_on
update_contract: replaced datetime.now().strftime(...) with datetime.now(timezone.utc).isoformat()
- Format change: custom
DD/MM/YYYY HH:MM:SS → ISO 8601 YYYY-MM-DDTHH:MM:SS.ffffff+00:00
- Uses the non-deprecated timezone-aware API (
timezone.utc) instead of datetime.utcnow()
DynamoDB attribute name (contract_event_handler.py)
update_contract: changed UpdateExpression from "set contract_status=:t, modified_date=:m" to "set contract_status=:t, contract_last_modified_on=:m"
- This corrects a bug where
update_contract wrote to a non-existent modified_date attribute instead of the correct contract_last_modified_on attribute used in create_contract
Observability metrics (contract_event_handler.py)
- Added
metrics.add_metric(name="ContractCreated", unit=MetricUnit.Count, value=1) to create_contract success path
Approvals Service
Per-invocation timestamp (contract_status_changed_event_handler.py)
- Removed module-level
now = datetime.now() and current_date variable assignments
- Moved timestamp computation inside the handler function body to ensure each invocation captures its own execution time rather than the container initialisation time
Environment variable error type (contract_status_changed_event_handler.py)
- Replaced
raise InternalServerError(...) with raise EnvironmentError(...) for both SERVICE_NAMESPACE and CONTRACT_STATUS_TABLE missing variable checks
- Removed the now-unused
InternalServerError import from aws_lambda_powertools.event_handler.exceptions
Web Service
Evaluation result validation (publication_evaluation_event_handler.py)
- Added validation guard: only updates DynamoDB when
evaluation_result is "APPROVED" or "DECLINED" (case-insensitive)
- Logs a warning and returns without writing to DynamoDB for any other value
Metric name correction (publication_evaluation_event_handler.py)
- Removed duplicate
metrics.add_metric(name="PropertiesAdded", ...) call
- Retained
metrics.add_metric(name="PropertiesApproved", ...) as the single metric for this path
Summary
A set of fixes to align the Python runtime with the other runtimes (Java, TypeScript, .NET) for functional equivalence and cross-runtime consistency.
Contracts Service
Timestamp format (
contract_event_handler.py)create_contract: replaceddatetime.now().strftime("%d/%m/%Y %H:%M:%S")withdatetime.now(timezone.utc).isoformat()for bothcontract_createdandcontract_last_modified_onupdate_contract: replaceddatetime.now().strftime(...)withdatetime.now(timezone.utc).isoformat()DD/MM/YYYY HH:MM:SS→ ISO 8601YYYY-MM-DDTHH:MM:SS.ffffff+00:00timezone.utc) instead ofdatetime.utcnow()DynamoDB attribute name (
contract_event_handler.py)update_contract: changedUpdateExpressionfrom"set contract_status=:t, modified_date=:m"to"set contract_status=:t, contract_last_modified_on=:m"update_contractwrote to a non-existentmodified_dateattribute instead of the correctcontract_last_modified_onattribute used increate_contractObservability metrics (
contract_event_handler.py)metrics.add_metric(name="ContractCreated", unit=MetricUnit.Count, value=1)tocreate_contractsuccess pathApprovals Service
Per-invocation timestamp (
contract_status_changed_event_handler.py)now = datetime.now()andcurrent_datevariable assignmentsEnvironment variable error type (
contract_status_changed_event_handler.py)raise InternalServerError(...)withraise EnvironmentError(...)for bothSERVICE_NAMESPACEandCONTRACT_STATUS_TABLEmissing variable checksInternalServerErrorimport fromaws_lambda_powertools.event_handler.exceptionsWeb Service
Evaluation result validation (
publication_evaluation_event_handler.py)evaluation_resultis"APPROVED"or"DECLINED"(case-insensitive)Metric name correction (
publication_evaluation_event_handler.py)metrics.add_metric(name="PropertiesAdded", ...)callmetrics.add_metric(name="PropertiesApproved", ...)as the single metric for this path