55from findthatpostcode .blueprints .utils import return_result
66from findthatpostcode .controllers .postcodes import Postcode
77from findthatpostcode .db import get_db
8- from findthatpostcode .metadata import STATS_FIELDS
8+ from findthatpostcode .metadata import (
9+ OAC11_CODE ,
10+ RU11IND_CODES ,
11+ RUC21_CODES ,
12+ STATS_FIELDS ,
13+ )
914
1015bp = Blueprint ("postcodes" , __name__ , url_prefix = "/postcodes" )
1116
@@ -23,7 +28,7 @@ def postcode_redirect():
2328def get_postcode (postcode , filetype = "json" ):
2429 es = get_db ()
2530 result = Postcode .get_from_es (postcode , es )
26- return return_result (result , filetype , "postcode.html.j2" )
31+ return return_result (result , filetype , "postcode.html.j2" , stats = result . get_stats () )
2732
2833
2934@bp .route ("/hash/<hash>" )
@@ -40,7 +45,7 @@ def multi_hash():
4045 return jsonify ({"data" : get_postcode_by_hash (hashes , fields )})
4146
4247
43- def get_postcode_by_hash (hashes , fields ):
48+ def get_postcode_by_hash (hashes : str | list [ str ] , fields : list [ str ] ):
4449 es = get_db ()
4550
4651 if not isinstance (hashes , list ):
@@ -59,17 +64,19 @@ def get_postcode_by_hash(hashes, fields):
5964 )
6065
6166 name_fields = [i .replace ("_name" , "" ) for i in fields if i .endswith ("_name" )]
62- extra_fields = []
63- stats = [i for i in STATS_FIELDS if i [ 0 ] in fields ]
67+ stats_fields = []
68+ stats = [field for field in STATS_FIELDS if field . id in fields ]
6469 if stats :
65- extra_fields .append ("lsoa11" )
70+ for field in stats :
71+ if field .area not in stats_fields :
72+ stats_fields .append (field .area )
6673
6774 results = list (
6875 scan (
6976 es ,
7077 index = "geo_postcode" ,
7178 query = {"query" : {"bool" : {"should" : query }}},
72- _source_includes = fields + name_fields + extra_fields ,
79+ _source_includes = fields + name_fields + stats_fields ,
7380 )
7481 )
7582 areas = scan (
@@ -81,39 +88,45 @@ def get_postcode_by_hash(hashes, fields):
8188 areanames = {i ["_id" ]: i ["_source" ].get ("name" ) for i in areas }
8289
8390 def get_names (data ):
84- return {
85- i : areanames .get (data .get (i .replace ("_name" , "" )))
86- for i in fields
87- if i .endswith ("_name" )
88- }
89-
90- lsoas = {}
91-
92- def get_stats (data ):
93- lsoa = data .get ("lsoa11" )
94- if not lsoa or not stats or lsoa not in lsoas :
95- return {}
96- return {i [0 ]: dig_get (lsoas [lsoa ], i [3 ]) for i in stats }
91+ names = {}
92+ for i in name_fields :
93+ names [f"{ i } _name" ] = None
94+ if i == "oac11" :
95+ oac_name = OAC11_CODE .get (data .get (i ))
96+ if oac_name :
97+ names [f"{ i } _name" ] = " > " .join (oac_name )
98+ elif i == "ru11ind" :
99+ names [f"{ i } _name" ] = RU11IND_CODES .get (data .get (i ))
100+ elif i == "ruc21" :
101+ names [f"{ i } _name" ] = RUC21_CODES .get (data .get (i ))
102+ else :
103+ names [f"{ i } _name" ] = areanames .get (data .get (i ))
104+ return names
105+
106+ def get_stats (data , lsoas ):
107+ result = {}
108+ for field in stats :
109+ lsoa_code = data .get (field .area )
110+ if not lsoa_code or not stats or lsoa_code not in lsoas :
111+ continue
112+ result [field .id ] = dig_get (lsoas [lsoa_code ], field .location )
113+ return result
97114
98115 if results :
116+ lsoas = {}
99117 if stats :
118+ lsoas_to_get = set ()
119+ for r in results :
120+ for i in stats_fields :
121+ if r .get ("_source" , {}).get (i ):
122+ lsoas_to_get .add (r .get ("_source" , {}).get (i ))
100123 lsoas = {
101124 i ["_id" ]: i ["_source" ]
102125 for i in scan (
103126 es ,
104127 index = "geo_area" ,
105- query = {
106- "query" : {
107- "terms" : {
108- "_id" : [
109- r .get ("_source" , {}).get ("lsoa11" )
110- for r in results
111- if r .get ("_source" , {}).get ("lsoa11" )
112- ]
113- }
114- }
115- },
116- _source_includes = [i [3 ] for i in stats ],
128+ query = {"query" : {"terms" : {"_id" : list (lsoas_to_get )}}},
129+ _source_includes = [i .location for i in stats ],
117130 )
118131 }
119132
@@ -122,7 +135,7 @@ def get_stats(data):
122135 "id" : r ["_id" ],
123136 ** r ["_source" ],
124137 ** get_names (r ["_source" ]),
125- ** get_stats (r ["_source" ]),
138+ ** get_stats (r ["_source" ], lsoas ),
126139 }
127140 for r in results
128141 ]
0 commit comments