RandomZ / create_mock_survey.py
StormShadow308's picture
fix: apply all bug fixes and improvements (embeddings, cache, postprocess, frontend, tests)
7d37f11
Raw
History Blame Contribute Delete
20.4 kB
"""Generate a mock RICS Level 3 Building Survey report as a .docx file.
Run: python create_mock_survey.py
Output: mock_survey_42_victoria_road.docx
"""
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
def add_heading(doc: Document, text: str, level: int) -> None:
doc.add_heading(text, level=level)
def add_body(doc: Document, text: str) -> None:
p = doc.add_paragraph(text)
p.style = doc.styles["Normal"]
def add_bullet(doc: Document, text: str) -> None:
doc.add_paragraph(text, style="List Bullet")
def add_table(doc: Document, headers: list[str], rows: list[list[str]]) -> None:
table = doc.add_table(rows=1, cols=len(headers))
table.style = "Table Grid"
hdr_cells = table.rows[0].cells
for i, h in enumerate(headers):
hdr_cells[i].text = h
for run in hdr_cells[i].paragraphs[0].runs:
run.bold = True
for row_data in rows:
row_cells = table.add_row().cells
for i, val in enumerate(row_data):
row_cells[i].text = val
def build() -> None:
doc = Document()
# ── Cover ────────────────────────────────────────────────────────────────
title = doc.add_paragraph("RICS LEVEL 3 BUILDING SURVEY REPORT")
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
title.runs[0].bold = True
title.runs[0].font.size = Pt(16)
doc.add_paragraph("Property Address: 42 Victoria Road, Kensington, London W8 5RD").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Date of Inspection: 12 February 2026").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Prepared by: J. Hartley MRICS, Hartley & Partners Surveyors").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Report Reference: HP-2026-0214-W8").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_page_break()
# ── Section A: Description of the Property ────────────────────────────
add_heading(doc, "SECTION A β€” DESCRIPTION OF THE PROPERTY", 1)
add_heading(doc, "A1. General Description", 2)
add_body(doc,
"The subject property is a mid-terraced Victorian townhouse of traditional "
"brick construction arranged over four storeys including a lower ground floor "
"basement. The property was constructed circa 1887 and has a gross internal "
"floor area of approximately 287 square metres (3,089 sq ft). It is currently "
"configured as a five-bedroom single-family dwelling."
)
add_heading(doc, "A2. Location and Setting", 2)
add_body(doc,
"The property is situated within a predominantly residential conservation area "
"in the Royal Borough of Kensington and Chelsea. Victoria Road is a tree-lined "
"street with direct access to Kensington High Street approximately 350 metres to "
"the south. The local amenity provision is excellent. The property is within "
"London Flood Zone 1 (low probability) according to the Environment Agency "
"flood map for planning."
)
add_heading(doc, "A3. Weather at Time of Inspection", 2)
add_body(doc,
"The inspection was carried out in dry, overcast conditions with an ambient "
"temperature of approximately 8Β°C. Ground conditions were damp following recent "
"rainfall. No snow or ice was present. The conditions were suitable for a full "
"external inspection."
)
add_heading(doc, "A4. Tenure and Occupation", 2)
add_body(doc,
"The property is understood to be held freehold, subject to verification by "
"the client's legal adviser. At the time of inspection the property was vacant "
"and unfurnished, having been recently vacated by the previous occupants. "
"Access to all rooms and roof spaces was available."
)
doc.add_page_break()
# ── Section B: Condition Ratings ──────────────────────────────────────
add_heading(doc, "SECTION B β€” CONDITION RATINGS", 1)
add_body(doc,
"Elements are rated using the standard RICS three-point condition rating scale: "
"Condition Rating 1 (no repair currently needed), Condition Rating 2 (defects that "
"need repairing or replacing but are not considered serious), and Condition Rating 3 "
"(serious defects that must be repaired urgently and/or that need specialist "
"investigation)."
)
# B1
add_heading(doc, "B1 β€” Chimney Stacks", 2)
add_body(doc,
"There are two rendered brick chimney stacks serving the main house, both "
"visible from ground level and from the flat roof of the rear addition. The "
"front stack serving the main reception rooms has significant spalling to the "
"render coat on its south-facing face. The mortar pointing to the brick courses "
"immediately below the flaunching is heavily eroded with individual joints recessed "
"by 10–15 mm. The lead flaunching to the front stack is cracked and lifting along "
"the ridge apex, creating a direct ingress risk. The rear stack appears more "
"recently repointed and is in a better condition, though the chimney pots are "
"unflued and should be capped."
)
add_bullet(doc, "Front stack render: spalling on south face, approximately 0.4 mΒ² area affected")
add_bullet(doc, "Flaunching: cracked and lifting β€” immediate repair required")
add_bullet(doc, "Mortar joints below flaunching: eroded 10–15 mm β€” repoint required")
add_bullet(doc, "Rear chimney pots: unflued β€” capping recommended")
add_body(doc, "Condition Rating: 3 (front stack) / 2 (rear stack)")
# B2
add_heading(doc, "B2 β€” Roof Coverings", 2)
add_body(doc,
"The main roof is a traditional pitched arrangement covered with original "
"Welsh slate tiles. Approximately 15% of the slates on the north-facing rear "
"slope are cracked, slipping or missing, having been temporarily repaired with "
"mortar fillets which are now failing. The main south slope is in a better "
"condition with isolated slipped slates noted. The valley gutters are lined in "
"lead (code 5) and appear serviceable although minor pitting was observed. "
"The rear flat roof addition is covered in a single-ply membrane (TPO) installed "
"approximately six years ago according to the vendor's information; it appears in "
"satisfactory condition with no obvious blistering or delamination."
)
add_bullet(doc, "North slope: approx. 15% of Welsh slates cracked, slipping or missing")
add_bullet(doc, "Mortar fillet repairs failing on north slope")
add_bullet(doc, "South slope: isolated slipped slates β€” monitor and repair")
add_bullet(doc, "Lead valley gutters: code 5 lead, serviceable, minor pitting noted")
add_bullet(doc, "Rear flat roof TPO membrane: approximately 6 years old, satisfactory condition")
add_body(doc, "Condition Rating: 3 (north slope) / 2 (south slope and valleys) / 1 (flat roof)")
# B3
add_heading(doc, "B3 β€” Rainwater Fittings", 2)
add_body(doc,
"The rainwater goods to the principal elevation are cast iron, consistent with "
"the age of the building. Several sections of the front parapet gutter show "
"active signs of leakage at the joints, evidenced by staining to the brickwork "
"below. The downpipes discharging at ground floor level appear to discharge "
"directly into the basement lightwell drainage channel. The rear rainwater "
"goods are UPVC and are in a generally satisfactory condition."
)
add_bullet(doc, "Front parapet gutter: cast iron, leaking joints β€” staining to brickwork below")
add_bullet(doc, "Basement lightwell drainage: shared connection with downpipes, verify capacity")
add_bullet(doc, "Rear UPVC goods: satisfactory condition")
add_body(doc, "Condition Rating: 3 (front parapet gutter) / 1 (rear)")
# B4
add_heading(doc, "B4 β€” Main Walls", 2)
add_body(doc,
"The external walls to the principal and side elevations are of solid London "
"stock brick construction approximately 340 mm thick (one brick solid). The "
"brickwork is generally in a satisfactory condition. An area of stepped diagonal "
"cracking has been observed to the south-east corner at first-floor level, "
"consistent with differential settlement, likely attributable to the shallow "
"foundations and proximity of a large London plane tree approximately 4.5 metres "
"from the building line. The cracking is dormant with weathered edges and a "
"maximum width of 4 mm. A structural engineer's opinion should be sought prior "
"to exchange. No cavity wall exists; a thermal upgrade would require internal "
"insulation."
)
add_bullet(doc, "Construction: solid London stock brick, approximately 340 mm thick")
add_bullet(doc, "Diagonal stepped cracking: south-east corner, first-floor level, max 4 mm width")
add_bullet(doc, "Cracking appears dormant β€” structural engineer's inspection recommended")
add_bullet(doc, "Tree: London plane at approx. 4.5 m from building, risk to foundations")
add_bullet(doc, "No cavity wall β€” thermal upgrade via internal insulation only")
add_body(doc, "Condition Rating: 3 (cracked area) / 1 (remainder)")
# B5
add_heading(doc, "B5 β€” Windows", 2)
add_body(doc,
"The windows to the principal elevation are traditional sliding sash, "
"double-glazed with hardwood frames in a painted finish. Several sashes to the "
"upper floors show signs of failed glazing units (misting between panes). The "
"painted finish is peeling and requires redecoration. Ground floor windows have "
"been fitted with secondary glazing. Rear windows are a mixture of original "
"sash and later UPVC casement. All windows have been confirmed as meeting the "
"Building Regulations Part L requirements for the relevant period."
)
add_bullet(doc, "Front sash windows: double-glazed hardwood β€” failed IGUs on floors 2 and 3")
add_bullet(doc, "Paintwork: peeling, full redecoration cycle needed")
add_bullet(doc, "Ground floor: secondary glazing fitted, serviceable")
add_bullet(doc, "Rear: mixed original sash and UPVC casement, generally satisfactory")
add_body(doc, "Condition Rating: 2")
# B6
add_heading(doc, "B6 β€” External Doors", 2)
add_body(doc,
"The principal entrance door is a six-panel hardwood door with decorative "
"fanlight above. The door frame shows minor rot at the bottom rail. The "
"draught-proofing strips are absent. The rear external door is a solid timber "
"door in fair condition; the threshold has dropped slightly causing a draught gap."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ── Section C: Services ────────────────────────────────────────────────
add_heading(doc, "SECTION C β€” SERVICES", 1)
add_body(doc,
"The services were not tested as part of this survey. The following observations "
"are visual only and an independent specialist inspection of each service "
"installation is recommended."
)
add_heading(doc, "C1 β€” Electricity", 2)
add_body(doc,
"The property is served by a single-phase 100A supply. The consumer unit is "
"located in the basement utility room and contains a mix of MCBs and older "
"rewireable fuses, indicating a partial rewire has been carried out. The wiring "
"throughout appears to be a mixture of vintage rubber-insulated cable and more "
"recent PVC twin-and-earth. An Electrical Installation Condition Report (EICR) "
"should be obtained prior to exchange, as the installation is unlikely to achieve "
"a satisfactory certificate in its current state."
)
add_body(doc, "Condition Rating: 3 β€” EICR urgently required")
add_heading(doc, "C2 β€” Gas and Heating", 2)
add_body(doc,
"Central heating is provided by a Viessmann Vitodens 200-W condensing boiler "
"installed in 2019 and still within its manufacturer's ten-year warranty period. "
"The system is a pressurised sealed system serving 22 radiators and a "
"180-litre unvented hot water cylinder. A Gas Safe registered engineer should "
"issue a current Landlord Gas Safety Record (CP12) and service the boiler annually."
)
add_bullet(doc, "Boiler: Viessmann Vitodens 200-W (2019), condensing, within warranty")
add_bullet(doc, "System: pressurised sealed, 22 radiators")
add_bullet(doc, "Hot water: 180-litre unvented cylinder")
add_body(doc, "Condition Rating: 1")
add_heading(doc, "C3 β€” Water and Drainage", 2)
add_body(doc,
"The property is connected to the public mains water supply via a 22 mm copper "
"service pipe. The internal pipework is a mix of copper and modern push-fit plastic. "
"Visible pipework to the basement shows minor evidence of previous leakage at "
"compression joints, evidenced by verdigris staining. Drainage is via the public "
"sewer. A CCTV drain survey is recommended given the age of the property."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ── Section D: Grounds ─────────────────────────────────────────────────
add_heading(doc, "SECTION D β€” GROUNDS (INCLUDING GARAGES AND OUTBUILDINGS)", 1)
add_heading(doc, "D1 β€” Garage", 2)
add_body(doc,
"A detached single garage is located to the rear of the property, accessed via "
"a shared rear service lane. The garage is of brick construction with a corrugated "
"asbestos cement roof. The asbestos cement panels are in a brittle condition and "
"several are cracked. A licensed asbestos contractor should be engaged to survey "
"and safely remove the roof coverings before any works are undertaken."
)
add_bullet(doc, "Garage roof: corrugated asbestos cement β€” brittle, cracked panels")
add_bullet(doc, "Licensed asbestos removal required before any roof works")
add_body(doc, "Condition Rating: 3")
add_heading(doc, "D2 β€” Garden and Boundaries", 2)
add_body(doc,
"The rear garden extends to approximately 18 metres in depth and 7 metres in "
"width. The London plane tree referenced in Section B4 is located adjacent to "
"the south boundary. An arborist's report should be obtained to assess its "
"root system and structural integrity. The boundary walls are of brick, "
"approximately 1.8 metres in height, and are in generally fair condition "
"with localised repointing required."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ── Section E: Energy Efficiency ──────────────────────────────────────
add_heading(doc, "SECTION E β€” ENERGY EFFICIENCY", 1)
add_body(doc,
"The property has a current Energy Performance Certificate (EPC) rating of "
"band D (score 58), issued on 14 March 2023 and valid for ten years. Given "
"the solid brick construction and original sash windows, significant heat loss "
"occurs through the walls and fenestration. The following energy improvement "
"measures are recommended:"
)
add_bullet(doc, "Internal wall insulation (IWI) to all external walls: estimated cost Β£35,000–£50,000")
add_bullet(doc, "Secondary or replacement double glazing to remaining single-glazed sashes")
add_bullet(doc, "Loft insulation increase to 270 mm mineral wool")
add_bullet(doc, "Smart thermostatic radiator valves throughout")
add_body(doc,
"With the above measures implemented the property could realistically achieve "
"an EPC band B. Under the proposed MEES regulations, residential properties "
"will require a minimum EPC band C by 2030 for new tenancies."
)
doc.add_page_break()
# ── Summary Cost Table ─────────────────────────────────────────────────
add_heading(doc, "APPENDIX 1 β€” SUMMARY ESTIMATED REPAIR COSTS", 1)
add_body(doc,
"The following costs are indicative only, based on current market rates for "
"central London. Firm quotations should be obtained from suitably qualified "
"contractors prior to exchange of contracts."
)
add_table(doc,
headers=["Item", "Priority", "Estimated Cost (Β£)"],
rows=[
["Front chimney stack β€” flaunching and repoint", "Immediate", "3,500–5,500"],
["North roof slope β€” re-slate (approx. 15%)", "Immediate", "12,000–18,000"],
["Front parapet gutter β€” re-lead and repoint", "Urgent", "6,000–9,000"],
["Structural engineer β€” crack investigation", "Urgent", "800–1,500"],
["Full rewire (EICR-led)", "Urgent", "18,000–28,000"],
["Garage asbestos roof removal and replacement", "Urgent", "4,000–7,000"],
["Window redecoration and failed IGU replacement", "Within 12 months", "8,000–14,000"],
["Rear chimney pot capping", "Within 12 months", "600–900"],
["Arborist report and tree management", "Within 12 months", "500–1,200"],
["CCTV drain survey", "Before exchange", "400–700"],
["Internal wall insulation (optional upgrade)", "Recommended", "35,000–50,000"],
]
)
add_body(doc, "Total indicative repair costs (essential items): Β£53,300 – Β£84,800")
add_body(doc, "Total indicative costs (including IWI upgrade): Β£88,300 – Β£134,800")
doc.add_page_break()
# ── Legal Matters ──────────────────────────────────────────────────────
add_heading(doc, "APPENDIX 2 β€” LEGAL AND STATUTORY MATTERS TO INVESTIGATE", 1)
add_bullet(doc, "Planning history: confirm no unauthorized works, especially to rear addition")
add_bullet(doc, "Building Regulations: obtain completion certificates for rear extension (circa 2004)")
add_bullet(doc, "Party Wall Act: confirm agreements in place for previous work to south boundary")
add_bullet(doc, "Tree Preservation Order: verify whether London plane tree is subject to TPO")
add_bullet(doc, "Listed Building status: property not listed but within Edwardes Square conservation area")
add_bullet(doc, "Restrictive covenants: to be reported on by client's solicitors")
# ── Limitations ────────────────────────────────────────────────────────
add_heading(doc, "APPENDIX 3 β€” LIMITATIONS OF THIS REPORT", 1)
add_body(doc,
"This report is prepared in accordance with the RICS Home Survey Standard (2019) "
"and the current edition of the RICS Building Survey specification. It is based "
"solely on a visual inspection of accessible elements of the property on the "
"date stated and does not include any opening up, testing of services, or "
"investigation of concealed areas. The report should be read in its entirety. "
"It is prepared for the exclusive use of the named client and Hartley & Partners "
"accepts no responsibility to any third party."
)
out_path = "mock_survey_42_victoria_road.docx"
doc.save(out_path)
print(f"Saved: {out_path}")
if __name__ == "__main__":
build()