add status explanation note

this allow to handle OBS statuses, also done in this commit
This commit is contained in:
Mateusz Konieczny 2022-11-13 09:01:34 +01:00
parent dffa4e244b
commit 9512d30c28
4 changed files with 18 additions and 11 deletions

View File

@ -3,7 +3,7 @@ import db from '../../../db';
export async function getBuildingPlanningDataById(id: number) { export async function getBuildingPlanningDataById(id: number) {
try { try {
return await db.any( return await db.any(
'SELECT building_properties.uprn, building_properties.building_id, planning_data.description, planning_data.status, planning_data.status_before_aliasing, planning_data.uprn, planning_data.planning_application_id, planning_application_link, to_char(planning_data.registered_with_local_authority_date, \'YYYY-MM-DD\') AS registered_with_local_authority_date, to_char(planning_data.decision_date, \'YYYY-MM-DD\') AS decision_date, to_char(planning_data.last_synced_date, \'YYYY-MM-DD\') AS last_synced_date, planning_data.data_source, planning_data.data_source_link \ 'SELECT building_properties.uprn, building_properties.building_id, planning_data.description, planning_data.status, planning_data.status_before_aliasing, planning_data.status_explanation_note, planning_data.uprn, planning_data.planning_application_id, planning_application_link, to_char(planning_data.registered_with_local_authority_date, \'YYYY-MM-DD\') AS registered_with_local_authority_date, to_char(planning_data.decision_date, \'YYYY-MM-DD\') AS decision_date, to_char(planning_data.last_synced_date, \'YYYY-MM-DD\') AS last_synced_date, planning_data.data_source, planning_data.data_source_link \
FROM building_properties \ FROM building_properties \
INNER JOIN planning_data ON \ INNER JOIN planning_data ON \
building_properties.uprn = planning_data.uprn WHERE building_id = $1', building_properties.uprn = planning_data.uprn WHERE building_id = $1',

View File

@ -103,6 +103,7 @@ const PlanningDataOfficialDataEntry: React.FC<PlanningDataOfficialDataEntryProps
statusBeforeAliasing={item["status_before_aliasing"]} statusBeforeAliasing={item["status_before_aliasing"]}
status={item["status"]} status={item["status"]}
/></div> /></div>
{item["status_explanation_note"] ? <div><b>Explanation</b>: {item["status_explanation_note"]}</div> : <></>}
<div><b>Planning application ID:</b> {ShowIfAvailable(item["planning_application_id"])}</div> <div><b>Planning application ID:</b> {ShowIfAvailable(item["planning_application_id"])}</div>
<div><b>Date registered by the planning authority (validation date)</b>: {ShowIfAvailable(item["registered_with_local_authority_date"])}</div> <div><b>Date registered by the planning authority (validation date)</b>: {ShowIfAvailable(item["registered_with_local_authority_date"])}</div>
<div><b>Decision date</b>: {ShowIfAvailable(item["decision_date"])}</div> <div><b>Decision date</b>: {ShowIfAvailable(item["decision_date"])}</div>

View File

@ -43,7 +43,9 @@ def load_data_into_database(cursor, data):
last_synced_date = parse_date_string_into_date_object(entry['_source']['last_synced']) last_synced_date = parse_date_string_into_date_object(entry['_source']['last_synced'])
uprn = entry['_source']['uprn'] uprn = entry['_source']['uprn']
status_before_aliasing = entry['_source']['status'] status_before_aliasing = entry['_source']['status']
status = process_status(status_before_aliasing, decision_date) status_info = process_status(status_before_aliasing, decision_date)
status = status_info["status"]
status_explanation_note = status_info["status_explanation_note"]
planning_url = obtain_entry_link(entry['_source']['url_planning_app'], application_id) planning_url = obtain_entry_link(entry['_source']['url_planning_app'], application_id)
if uprn == None: if uprn == None:
continue continue
@ -62,6 +64,7 @@ def load_data_into_database(cursor, data):
"uprn": uprn, "uprn": uprn,
"status": status, "status": status,
"status_before_aliasing": status_before_aliasing, "status_before_aliasing": status_before_aliasing,
"status_explanation_note": status_explanation_note,
"data_source": "Greater London Authority's Planning London DataHub", "data_source": "Greater London Authority's Planning London DataHub",
"data_source_link": None "data_source_link": None
} }
@ -163,9 +166,9 @@ def insert_entry(cursor, e):
if e["application_url"] != None: if e["application_url"] != None:
application_url = e["application_url"] application_url = e["application_url"]
cursor.execute('''INSERT INTO cursor.execute('''INSERT INTO
planning_data (planning_application_id, planning_application_link, description, registered_with_local_authority_date, days_since_registration_cached, decision_date, days_since_decision_date_cached, last_synced_date, status, status_before_aliasing, data_source, data_source_link, uprn) planning_data (planning_application_id, planning_application_link, description, registered_with_local_authority_date, days_since_registration_cached, decision_date, days_since_decision_date_cached, last_synced_date, status, status_before_aliasing, status_explanation_note, data_source, data_source_link, uprn)
VALUES VALUES
(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
''', ( ''', (
e["application_id"], e["application_id"],
application_url, e["description"], application_url, e["description"],
@ -176,6 +179,7 @@ def insert_entry(cursor, e):
date_object_into_date_string(e["last_synced_date"]), date_object_into_date_string(e["last_synced_date"]),
e["status"], e["status"],
e["status_before_aliasing"], e["status_before_aliasing"],
e["status_explanation_note"],
e["data_source"], e["data_source"],
e["data_source_link"], e["data_source_link"],
e["uprn"]) e["uprn"])
@ -263,10 +267,6 @@ def obtain_entry_link(provided_link, application_id):
def process_status(status, decision_date): def process_status(status, decision_date):
status_length_limit = 50 # see migrations/034.planning_livestream_data.up.sql status_length_limit = 50 # see migrations/034.planning_livestream_data.up.sql
if len(status) > status_length_limit:
print("Status was too long and was skipped:", status)
return None
"""return None if status is invalid"""
if status in ["Application Under Consideration", "Application Received"]: if status in ["Application Under Consideration", "Application Received"]:
if decision_date == None: if decision_date == None:
status = "Submitted" status = "Submitted"
@ -280,12 +280,17 @@ def process_status(status, decision_date):
status = "Unknown" status = "Unknown"
if status in ["Lapsed"]: if status in ["Lapsed"]:
status = "Withdrawn" status = "Withdrawn"
if len(status) > status_length_limit:
print("Status was too long and was skipped:", status)
return {"status": "Processing failed", "status_explanation_note": "status was unusally long and it was imposible to save it"}
if (status in ["Submitted", "Approved", "Rejected", "Appeal In Progress", "Withdrawn", "Unknown"]): if (status in ["Submitted", "Approved", "Rejected", "Appeal In Progress", "Withdrawn", "Unknown"]):
return status return {"status": status, "status_explanation_note": None}
if status in ["No Objection to Proposal (OBS only)", "Objection Raised to Proposal (OBS only)"]:
return {"status": "Approved", "status_explanation_note": "preapproved application, local authority is unable to reject it"}
print("Unexpected status " + status) print("Unexpected status " + status)
if status not in ["No Objection to Proposal (OBS only)", "Objection Raised to Proposal (OBS only)", "Not Required", "SECS", "Comment Issued", "ALL DECISIONS ISSUED", "Closed", "Declined to Determine"]: if status not in ["Not Required", "SECS", "Comment Issued", "ALL DECISIONS ISSUED", "Closed", "Declined to Determine"]:
print("New unexpected status " + status) print("New unexpected status " + status)
return status return {"status": status, "status_explanation_note": None}
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -13,6 +13,7 @@ CREATE TABLE IF NOT EXISTS planning_data (
last_synced_date date, last_synced_date date,
status VARCHAR(50), status VARCHAR(50),
status_before_aliasing VARCHAR(50), status_before_aliasing VARCHAR(50),
status_explanation_note VARCHAR(250),
data_source VARCHAR(70), data_source VARCHAR(70),
data_source_link VARCHAR(150), data_source_link VARCHAR(150),
uprn bigint uprn bigint