Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 70 additions & 16 deletions application/blueprints/datamanager/controllers/preview.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,64 @@
logger = logging.getLogger(__name__)


def _build_entity_organisation_summary(new_entities, authoritative, pipeline_summary):
"""
Build entity-organisation CSV preview context - only relevant when new
entities were actually created; otherwise there is nothing to map.

Returns (entity_org_table_params, has_entity_org, entity_org_warning,
entity_org_overlap_info, entity_org_error_warning)
"""
entity_org_table_params = None
has_entity_org = False
entity_org_warning = None
entity_org_overlap_info = None
entity_org_error_warning = None

if not new_entities:
return (
entity_org_table_params,
has_entity_org,
entity_org_warning,
entity_org_overlap_info,
entity_org_error_warning,
)

if not authoritative:
entity_org_warning = "Non-authoritative data being submitted"
return (
entity_org_table_params,
has_entity_org,
entity_org_warning,
entity_org_overlap_info,
entity_org_error_warning,
)

entity_organisation_data = pipeline_summary.get("entity-organisation") or []
if entity_organisation_data:
entry = entity_organisation_data[0]
if entry.get("overlap"):
entity_org_overlap_info = "Entity org already exists - no action needed"
elif entry.get("error"):
entity_org_error_warning = (
"An error occurred creating the entity-organisation csv, "
"please re-run if you believe this is required"
)
else:
(
entity_org_table_params,
has_entity_org,
) = build_entity_organisation_csv(entity_organisation_data)

return (
entity_org_table_params,
has_entity_org,
entity_org_warning,
entity_org_overlap_info,
entity_org_error_warning,
)


def _load_json_list(value: str | None) -> list:
if not value:
return []
Expand Down Expand Up @@ -191,23 +249,17 @@ def handle_entities_preview(request_id, req):
}
)

# Build entity-organisation CSV preview (only for authoritative data)
# Build entity-organisation CSV preview
authoritative = params.get("authoritative", False)
entity_org_table_params = None
has_entity_org = False
entity_org_warning = None

if authoritative:
entity_organisation_data = pipeline_summary.get("entity-organisation") or []
if entity_organisation_data:
(
entity_org_table_params,
has_entity_org,
) = build_entity_organisation_csv(entity_organisation_data)
else:
entity_org_warning = (
"This must be manually created currently for non-authoritative data"
)
(
entity_org_table_params,
has_entity_org,
entity_org_warning,
entity_org_overlap_info,
entity_org_error_warning,
) = _build_entity_organisation_summary(
new_entities, authoritative, pipeline_summary
)

return render_template(
"datamanager/entities_preview.html",
Expand All @@ -232,6 +284,8 @@ def handle_entities_preview(request_id, req):
entity_org_table_params=entity_org_table_params,
has_entity_org=has_entity_org,
entity_org_warning=entity_org_warning,
entity_org_overlap_info=entity_org_overlap_info,
entity_org_error_warning=entity_org_error_warning,
)


Expand Down
2 changes: 1 addition & 1 deletion application/blueprints/datamanager/services/github-add.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ The workflow fetches request data from:
{ASYNC_API_BASE_URL}/requests/{request_id}
```

**Default base URL:** `http://development-pub-async-api-lb-69142969.eu-west-2.elb.amazonaws.com`
**Default base URL:** `https://pub-async.development.planning.data.gov.uk`

To override, set the `ASYNC_API_BASE_URL` repository variable in GitHub Settings > Secrets and variables > Actions > Variables.

Expand Down
14 changes: 12 additions & 2 deletions application/templates/datamanager/entities_preview.html
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ <h3 class="govuk-heading-s">column.csv (new mappings)</h3>
{% endif %}

<!-- Entity Org Summary -->
{% if entity_org_warning or (has_entity_org and entity_org_table_params) %}
{% if entity_org_warning or entity_org_overlap_info or entity_org_error_warning or (has_entity_org and entity_org_table_params) %}
<div class="govuk-!-margin-bottom-6">
<h2 class="govuk-heading-m"><u>Entity Org Summary</u></h2>
<div style="border: 1px solid #b1b4b6; padding: 20px;">
Expand All @@ -148,7 +148,17 @@ <h3 class="govuk-heading-s">entity-organisation.csv</h3>
{{ entity_org_warning }}
</strong>
</div>
{% else %}
{% elif entity_org_overlap_info %}
<div class="govuk-inset-text">
{{ entity_org_overlap_info }}
</div>
{% elif entity_org_error_warning %}
<div class="govuk-error-summary" role="alert">
<strong class="govuk-error-message">
{{ entity_org_error_warning }}
</strong>
</div>
{% elif has_entity_org and entity_org_table_params %}
<div class="app-scrollable-container app-scrollable govuk-!-margin-bottom-2">
{{ table(entity_org_table_params) }}
</div>
Expand Down
4 changes: 2 additions & 2 deletions config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ def get_request_api_endpoint():
mapping = {
"local": "http://localhost:8000",
"development": "https://pub-async.development.planning.data.gov.uk",
"staging": "http://staging-pub-async-api-lb-12493311.eu-west-2.elb.amazonaws.com",
"production": "http://production-pub-async-api-lb-636110663.eu-west-2.elb.amazonaws.com",
"staging": "https://pub-async.staging.planning.data.gov.uk",
"production": "https://pub-async.planning.data.gov.uk",
}

return mapping.get(env, mapping["local"])
126 changes: 126 additions & 0 deletions tests/unit/blueprints/datamanager/controllers/test_preview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
from application.blueprints.datamanager.controllers.preview import (
_build_entity_organisation_summary,
)

NEW_ENTITIES = [{"entity": "10100002", "reference": "REF001"}]


def test_no_new_entities_hides_section():
result = _build_entity_organisation_summary([], True, {"entity-organisation": []})

assert result == (None, False, None, None, None)


def test_non_authoritative_is_informational_only():
"""Non-authoritative just flags the data as such - nothing needs to be created."""
(
table_params,
has_entity_org,
warning,
overlap_info,
error_warning,
) = _build_entity_organisation_summary(
NEW_ENTITIES, False, {"entity-organisation": []}
)

assert table_params is None
assert has_entity_org is False
assert warning == "Non-authoritative data being submitted"
assert overlap_info is None
assert error_warning is None


def test_authoritative_overlap_shows_info_message_only():
"""Overlap is informational, not a warning, and the table is skipped."""
pipeline_summary = {
"entity-organisation": [
{
"dataset": "nature-improvement-area",
"organisation": "government-organisation:PB202",
"overlap": True,
"error": False,
}
]
}

(
table_params,
has_entity_org,
warning,
overlap_info,
error_warning,
) = _build_entity_organisation_summary(NEW_ENTITIES, True, pipeline_summary)

assert has_entity_org is False
assert table_params is None
assert warning is None
assert overlap_info == "Entity org already exists - no action needed"
assert error_warning is None


def test_authoritative_error_shows_error_message_only():
"""Error skips the table too, since there's no trustworthy range to show."""
pipeline_summary = {
"entity-organisation": [
{
"dataset": "nature-improvement-area",
"organisation": "government-organisation:PB202",
"overlap": False,
"error": True,
}
]
}

(
table_params,
has_entity_org,
warning,
overlap_info,
error_warning,
) = _build_entity_organisation_summary(NEW_ENTITIES, True, pipeline_summary)

assert has_entity_org is False
assert table_params is None
assert warning is None
assert overlap_info is None
assert error_warning == (
"An error occurred creating the entity-organisation csv, "
"please re-run if you believe this is required"
)


def test_authoritative_no_overlap_or_error_shows_table():
pipeline_summary = {
"entity-organisation": [
{
"dataset": "nature-improvement-area",
"entity-minimum": 10100002,
"entity-maximum": 10100002,
"organisation": "government-organisation:PB202",
"overlap": False,
"error": False,
}
]
}

(
table_params,
has_entity_org,
warning,
overlap_info,
error_warning,
) = _build_entity_organisation_summary(NEW_ENTITIES, True, pipeline_summary)

assert has_entity_org is True
assert table_params is not None
assert warning is None
assert overlap_info is None
assert error_warning is None


def test_authoritative_no_entity_organisation_data_hides_section():
result = _build_entity_organisation_summary(
NEW_ENTITIES, True, {"entity-organisation": []}
)

assert result == (None, False, None, None, None)
Loading