Skip to content

Commit 2c0953c

Browse files
Merge pull request #46 from NHSDigital/release_v061
build: upgrade werkzeug to 3.1.5 to mitigate vuln & lock poetry to 2.2.1 fix: issue with si filename handling when the filename contains special chars fix: included submission status (with additional processing failure check) in error report population to reduce chance of incorrect status fix: ensure that captured errors during business rule evaluation are being captured and logged bump: version 0.6.0 → 0.6.1
2 parents ee33dec + 93e59ca commit 2c0953c

12 files changed

Lines changed: 122 additions & 222 deletions

File tree

.mise.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[tools]
22
python="3.11"
3-
poetry="2.2"
3+
poetry="2.2.1"
44
java="liberica-1.8.0"

.tool-versions

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
python 3.11.14
2-
poetry 2.2.0
2+
poetry 2.2.1
33
java liberica-1.8.0

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## v0.6.1 (2026-02-19)
2+
3+
### Fix
4+
5+
- ensure that captured errors during business rule evaluation are being captured and logged
6+
- included submission status (with additional processing failure check) in error report population to reduce chance of incorrect status
7+
- issue with si filename handling when the filename contains special chars
8+
19
## v0.6.0 (2026-02-16)
210

311
### Feat

poetry.lock

Lines changed: 7 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "nhs_dve"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
description = "`nhs data validation engine` is a framework used to validate data"
55
authors = ["NHS England <england.contactus@nhs.net>"]
66
readme = "README.md"
@@ -51,7 +51,7 @@ faker = "18.11.1"
5151
behave = "1.3.3"
5252
coverage = "7.11.0"
5353
moto = {extras = ["s3"], version = "4.0.13"}
54-
Werkzeug = "3.0.6" # Dependency of moto which needs 3.0.6 for security vuln mitigation
54+
Werkzeug = "3.1.5"
5555
pytest = "8.4.2"
5656
pytest-lazy-fixtures = "1.4.0" # switched from https://github.com/TvoroG/pytest-lazy-fixture as it's no longer supported
5757
xlsx2csv = "0.8.2"

src/dve/core_engine/backends/base/rules.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def _step_metadata_to_location(step_metadata: "AbstractStep") -> str:
172172

173173
def _handle_rule_error(self, error: Exception, config: AbstractStep) -> Messages:
174174
"""Log an error and create appropriate error messages."""
175-
return render_error(error, self._step_metadata_to_location(config))
175+
return render_error(error, self._step_metadata_to_location(config), self.logger)
176176

177177
def evaluate(self, entities, *, config: AbstractStep) -> tuple[Messages, StageSuccessful]:
178178
"""Evaluate a step definition, applying it to the entities."""
@@ -411,7 +411,7 @@ def apply_sync_filters(
411411
CriticalProcessingError(
412412
"Issue occurred while applying filter logic",
413413
messages=[
414-
msg.error_message
414+
msg.error_message # type: ignore
415415
for msg in temp_messages
416416
if msg.error_message
417417
],
@@ -439,7 +439,10 @@ def apply_sync_filters(
439439
[
440440
CriticalProcessingError(
441441
"Issue occurred while generating FeedbackMessages",
442-
[msg.error_message for msg in temp_messages],
442+
messages=[
443+
msg.error_message # type: ignore
444+
for msg in temp_messages
445+
],
443446
)
444447
],
445448
)
@@ -467,7 +470,10 @@ def apply_sync_filters(
467470
[
468471
CriticalProcessingError(
469472
"Issue occurred while generating FeedbackMessages",
470-
[msg.error_message for msg in temp_messages],
473+
messages=[
474+
msg.error_message # type: ignore
475+
for msg in temp_messages
476+
],
471477
)
472478
],
473479
)
@@ -505,7 +511,9 @@ def apply_sync_filters(
505511
[
506512
CriticalProcessingError(
507513
"Issue occurred while filtering error records",
508-
[msg.error_message for msg in temp_messages],
514+
messages=[
515+
msg.error_message for msg in temp_messages # type: ignore
516+
],
509517
)
510518
],
511519
)
@@ -533,7 +541,10 @@ def apply_sync_filters(
533541
[
534542
CriticalProcessingError(
535543
"Issue occurred while generating FeedbackMessages",
536-
[msg.error_message for msg in temp_messages],
544+
messages=[
545+
msg.error_message # type: ignore
546+
for msg in temp_messages
547+
],
537548
)
538549
],
539550
)
@@ -592,7 +603,9 @@ def apply_rules(
592603
[
593604
CriticalProcessingError(
594605
"Issue occurred while applying pre filter steps",
595-
[msg.error_message for msg in stage_messages],
606+
messages=[
607+
msg.error_message for msg in stage_messages # type: ignore
608+
],
596609
)
597610
],
598611
)
@@ -644,7 +657,9 @@ def apply_rules(
644657
[
645658
CriticalProcessingError(
646659
"Issue occurred while applying post filter steps",
647-
[msg.error_message for msg in stage_messages],
660+
messages=[
661+
msg.error_message for msg in stage_messages # type: ignore
662+
],
648663
)
649664
],
650665
)

src/dve/core_engine/models.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import os
99
import uuid
1010
from collections.abc import MutableMapping
11-
from pathlib import Path, PurePath
11+
from pathlib import Path
1212
from typing import Any, Optional
1313

1414
from pydantic import UUID4, BaseModel, Field, FilePath, root_validator, validator
@@ -64,16 +64,9 @@ class SubmissionInfo(AuditRecord):
6464
datetime_received: Optional[dt.datetime] = None # type: ignore
6565
"""The datetime the file was received."""
6666

67-
@validator("file_name")
68-
def _ensure_metadata_extension_removed(cls, filename): # pylint: disable=no-self-argument
69-
path = PurePath(filename)
70-
return path.stem
71-
7267
@validator("file_extension")
7368
def _ensure_just_file_stem(cls, extension: str): # pylint: disable=no-self-argument
74-
if "." in extension:
75-
return extension.split(".")[-1]
76-
return extension
69+
return extension.rsplit(".", 1)[-1]
7770

7871
@property
7972
def file_name_with_ext(self):

src/dve/pipeline/pipeline.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
dump_feedback_errors,
2121
dump_processing_errors,
2222
get_feedback_errors_uri,
23+
get_processing_errors_uri,
2324
load_feedback_messages,
2425
)
2526
from dve.core_engine.backends.base.auditing import BaseAuditingManager
@@ -769,6 +770,13 @@ def error_report(
769770
"error_report", submission_info.submission_id
770771
)
771772

773+
if not submission_status.processing_failed:
774+
submission_status.processing_failed = fh.get_resource_exists(
775+
get_processing_errors_uri(
776+
fh.joinuri(self.processed_files_path, submission_info.submission_id)
777+
)
778+
)
779+
772780
if not self.processed_files_path:
773781
raise AttributeError("processed files path not provided")
774782

@@ -797,6 +805,7 @@ def error_report(
797805
if value is not None and not key.endswith("_updated")
798806
}
799807
summary_items = er.SummaryItems(
808+
submission_status=submission_status,
800809
summary_dict=summary_dict,
801810
row_headings=["Submission Failure", "Warning"],
802811
)

0 commit comments

Comments
 (0)