Skip to content

Commit c1d0c6b

Browse files
committed
get tests passing
1 parent 5d178c4 commit c1d0c6b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1992
-686
lines changed

content.html

Lines changed: 1156 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from fastapi import FastAPI
1+
from fastapi import FastAPI, Request
2+
from fastapi.middleware.cors import CORSMiddleware
23

34
from findthatpostcode.blueprints import (
45
addtocsv,
@@ -11,15 +12,56 @@
1112
search,
1213
tools,
1314
)
15+
from findthatpostcode.controllers.areas import area_types_count
16+
from findthatpostcode.db import ElasticsearchDep
17+
from findthatpostcode.utils import templates
1418

1519
app = FastAPI()
1620

21+
app.add_middleware(
22+
CORSMiddleware,
23+
allow_origins=["*"],
24+
allow_credentials=True,
25+
allow_methods=["*"],
26+
allow_headers=["*"],
27+
expose_headers=["Content-Disposition"],
28+
)
29+
30+
31+
@app.get("/")
32+
def index(es: ElasticsearchDep, request: Request):
33+
return templates.TemplateResponse(
34+
request=request,
35+
name="index.html.j2",
36+
context={"result": area_types_count(es)},
37+
media_type="text/html",
38+
)
39+
40+
41+
@app.get("/robots.txt")
42+
def robots(request: Request):
43+
return templates.TemplateResponse(
44+
request=request,
45+
name="robots.txt",
46+
media_type="text/plain",
47+
)
48+
49+
50+
@app.get("/about")
51+
def about(request: Request):
52+
return templates.TemplateResponse(
53+
request=request,
54+
name="about.html.j2",
55+
media_type="text/html",
56+
)
57+
58+
1759
app.include_router(areas.bp)
1860
app.include_router(addtocsv.bp)
1961
app.include_router(areatypes.bp)
2062
app.include_router(places.bp)
2163
app.include_router(points.bp)
22-
# app.include_router(postcodes.bp)
23-
# app.include_router(reconcile.bp)
24-
# app.include_router(search.bp)
25-
# app.include_router(tools.bp)
64+
app.include_router(postcodes.bp)
65+
app.include_router(reconcile.bp)
66+
app.include_router(search.bp)
67+
app.include_router(tools.bp)

findthatpostcode/blueprints/addtocsv.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import tempfile
44
from typing import Annotated
55

6-
from fastapi import APIRouter, Form, UploadFile
6+
from fastapi import APIRouter, Form, Request, UploadFile
77

88
from findthatpostcode.blueprints.areas import CSVResponse
99
from findthatpostcode.blueprints.process_csv import process_csv
@@ -20,14 +20,18 @@
2020

2121

2222
@bp.get("/")
23-
def addtocsv(es: ElasticsearchDep):
23+
def addtocsv(es: ElasticsearchDep, request: Request):
2424
ats = area_types_count(es)
2525
return templates.TemplateResponse(
26-
"addtocsv.html.j2",
27-
result=ats,
28-
basic_fields=BASIC_UPLOAD_FIELDS,
29-
stats_fields=STATS_FIELDS,
30-
default_fields=DEFAULT_UPLOAD_FIELDS,
26+
request=request,
27+
name="addtocsv.html.j2",
28+
context={
29+
"result": ats,
30+
"basic_fields": BASIC_UPLOAD_FIELDS,
31+
"stats_fields": STATS_FIELDS,
32+
"default_fields": DEFAULT_UPLOAD_FIELDS,
33+
},
34+
media_type="text/html",
3135
)
3236

3337

findthatpostcode/blueprints/areas.py

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from findthatpostcode.blueprints.utils import return_result
99
from findthatpostcode.controllers.areas import Area, get_all_areas
10-
from findthatpostcode.db import ElasticsearchDep
10+
from findthatpostcode.db import ElasticsearchDep, S3Dep
1111
from findthatpostcode.utils import CSVResponse, templates
1212

1313
bp = APIRouter(prefix="/areas")
@@ -16,9 +16,10 @@
1616
@bp.get("/search")
1717
@bp.get("/search.<filetype>")
1818
def area_search(request: Request, filetype="json", q: str | None = None):
19-
return RedirectResponse(
20-
request.url_for("search.search_index", q=q), status_code=301
21-
)
19+
redirect_url = request.url_for("search_index")
20+
if q:
21+
redirect_url = redirect_url.include_query_params(q=q)
22+
return RedirectResponse(redirect_url, status_code=301)
2223

2324

2425
@bp.get("/names.csv")
@@ -48,60 +49,70 @@ def areas_csv(areas, filename):
4849
return output
4950

5051

51-
@bp.get("/<areacodes>.geojson")
52-
def get_area_boundary(areacodes: str, es: ElasticsearchDep):
52+
@bp.get("/{areacodes}.geojson")
53+
def get_area_boundary(areacodes: str, es: ElasticsearchDep, s3_client: S3Dep):
5354
areacodes = areacodes.split("+")
5455
features = []
5556
for areacode in areacodes:
56-
result = Area.get_from_es(areacode, es, boundary=True, examples_count=0)
57+
result = Area.get_from_es(
58+
areacode, es, boundary=True, examples_count=0, s3_client=s3_client
59+
)
5760
status, r = result.geoJSON()
5861
if status == 200:
5962
features.extend(r.get("features"))
6063
if status != 200:
61-
return JSONResponse(message=r, status_code=status)
62-
return JSONResponse({"type": "FeatureCollection", "features": features})
64+
return JSONResponse(dict(message=r), status_code=status)
65+
return {"type": "FeatureCollection", "features": features}
6366

6467

65-
@bp.get("/<areacode>/children/<areatype>.geojson")
66-
def get_area_children_boundary(areacode: str, areatype: str, es: ElasticsearchDep):
68+
@bp.get("/{areacode}/children/{areatype}.geojson")
69+
def get_area_children_boundary(
70+
areacode: str, areatype: str, es: ElasticsearchDep, s3_client: S3Dep
71+
):
6772
area = Area.get_from_es(areacode, es, boundary=False, examples_count=0)
6873
features = []
6974
errors = {}
7075
for child_area in area.relationships["children"][areatype]:
71-
result = Area.get_from_es(child_area.id, es, boundary=True, examples_count=0)
76+
result = Area.get_from_es(
77+
child_area.id, es, boundary=True, examples_count=0, s3_client=s3_client
78+
)
7279
status, r = result.geoJSON()
7380
if status == 200:
7481
features.extend(r.get("features"))
7582
else:
7683
errors[child_area.id] = r
7784
if not features:
78-
return JSONResponse(message=errors, status_code=status)
79-
return JSONResponse({"type": "FeatureCollection", "features": features})
85+
return JSONResponse(dict(message=errors), status_code=status)
86+
return {"type": "FeatureCollection", "features": features}
8087

8188

82-
@bp.route("/<areacode>")
83-
@bp.route("/<areacode>.<filetype>")
89+
@bp.get("/{areacode}")
90+
@bp.get("/{areacode}.{filetype}")
8491
def get_area(
8592
areacode: str,
93+
request: Request,
8694
filetype: str = "json",
8795
es: ElasticsearchDep = None,
96+
s3_client: S3Dep = None,
8897
child: str | None = None,
8998
):
9099
result = Area.get_from_es(
91100
areacode,
92101
es,
93102
boundary=(filetype == "geojson"),
94103
examples_count=(0 if filetype == "geojson" else 5),
104+
s3_client=s3_client,
95105
)
96106

97107
if filetype == "geojson":
98108
status, r = result.geoJSON()
99109
if status != 200:
100110
return JSONResponse(message=r, status_code=status)
101-
return JSONResponse(r)
111+
return r
102112

103113
return return_result(
104114
result,
115+
request,
105116
filetype,
106117
"area.html.j2",
107118
child=child,
@@ -113,6 +124,11 @@ def get_area(
113124
)
114125

115126

116-
@bp.route("/<areacodes>/map")
117-
def get_area_map(areacodes):
118-
return templates.TemplateResponse("area_map.html.j2", {"areacodes": areacodes})
127+
@bp.get("/{areacodes}/map")
128+
def get_area_map(request: Request, areacodes):
129+
return templates.TemplateResponse(
130+
request=request,
131+
name="area_map.html.j2",
132+
context={"areacodes": areacodes},
133+
media_type="text/html",
134+
)

findthatpostcode/blueprints/areatypes.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,49 @@
88
get_all_areas,
99
)
1010
from findthatpostcode.controllers.controller import Pagination
11-
from findthatpostcode.db import get_db
11+
from findthatpostcode.db import ElasticsearchDep
1212
from findthatpostcode.utils import templates
1313

1414
bp = APIRouter(prefix="/areatypes")
1515

1616

1717
@bp.get("/")
18-
def all():
19-
ats = area_types_count(get_db())
20-
return templates.TemplateResponse("areatypes.html.j2", {"result": ats})
18+
def all_areatypes(es: ElasticsearchDep, request: Request):
19+
ats = area_types_count(es)
20+
print(ats)
21+
return templates.TemplateResponse(
22+
request=request,
23+
name="areatypes.html.j2",
24+
context={"result": ats},
25+
media_type="text/html",
26+
)
2127

2228

23-
@bp.get("/<areacode>")
24-
@bp.get("/<areacode>.<filetype>")
25-
def get_areatype(areacode: str, request: Request, filetype: str = "json"):
29+
@bp.get("/{areacode}")
30+
@bp.get("/{areacode}.{filetype}")
31+
def get_areatype(
32+
areacode: str,
33+
request: Request,
34+
es: ElasticsearchDep,
35+
filetype: str = "json",
36+
p: int = 1,
37+
size: int = 25,
38+
):
2639
if filetype == "csv":
27-
areas = get_all_areas(get_db(), areatypes=[areacode.strip().lower()])
40+
areas = get_all_areas(es, areatypes=[areacode.strip().lower()])
2841
return areas_csv(areas, "{}.csv".format(areacode))
29-
result = Areatype.get_from_es(areacode, get_db())
30-
pagination = Pagination(request)
31-
result.get_areas(get_db(), pagination=pagination)
42+
result = Areatype.get_from_es(areacode, es)
43+
pagination = Pagination(p, size=size)
44+
result.get_areas(es, pagination=pagination)
3245

3346
pagination.set_pagination(result.attributes["count_areas"])
3447
nav = {
3548
p: request.url_for(
36-
"areatypes.get_areatype", areacode=areacode, filetype=filetype, **args
37-
)
49+
"get_areatype", areacode=areacode, filetype=filetype
50+
).include_query_params(**args)
3851
if isinstance(args, dict)
3952
else args
4053
for p, args in pagination.pagination.items()
4154
if args
4255
}
43-
return return_result(result, filetype, "areatype.html.j2", nav=nav)
56+
return return_result(result, request, filetype, "areatype.html.j2", nav=nav)

findthatpostcode/blueprints/places.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def nearest(lat: float, lon: float, es: ElasticsearchDep, filetype: str = "json"
3737

3838
@bp.get("/{areacode}")
3939
@bp.get("/{areacode}.{filetype}")
40-
def get_place(areacode: str, es: ElasticsearchDep, filetype: str = "json"):
40+
def get_place(
41+
areacode: str, es: ElasticsearchDep, request: Request, filetype: str = "json"
42+
):
4143
result = Place.get_from_es(areacode, es)
42-
return return_result(result, filetype, "place.html.j2")
44+
return return_result(result, request, filetype, "place.html.j2")

findthatpostcode/blueprints/points.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@
88
bp = APIRouter(prefix="/points")
99

1010

11-
@bp.route("/redirect")
11+
@bp.get("/redirect")
1212
def point_redirect(lat: float, lon: float, request: Request):
1313
return RedirectResponse(
1414
request.url_for(
15-
"points.get", latlon="{},{}.html".format(lat, lon), filetype="html"
15+
"get_point", latlon="{},{}.html".format(lat, lon), filetype="html"
1616
),
1717
code=303,
1818
)
1919

2020

2121
@bp.get("/{latlon}")
22-
def get(latlon, es: ElasticsearchDep):
22+
def get_point(latlon: str, es: ElasticsearchDep, request: Request):
2323
filetype = "json"
2424
if latlon.endswith(".json"):
2525
latlon = latlon[:-5]
@@ -30,13 +30,14 @@ def get(latlon, es: ElasticsearchDep):
3030
result = Point.get_from_es((float(lat), float(lon)), es)
3131
errors = result.get_errors()
3232
if errors:
33-
return_result(result, filetype, "postcode.html.j2")
33+
return_result(result, request, filetype, "postcode.html.j2")
3434
if filetype == "html":
3535
return return_result(
3636
result.relationships["nearest_postcode"],
37+
request,
3738
filetype,
3839
"postcode.html.j2",
3940
point=result,
4041
stats=result.relationships["nearest_postcode"].get_stats(),
4142
)
42-
return return_result(result, filetype, "postcode.html.j2")
43+
return return_result(result, request, filetype, "postcode.html.j2")

0 commit comments

Comments
 (0)