From 94ebd0f61413c18bd19f2db0faaba698d3e20d55 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Thu, 19 Feb 2026 22:55:38 +0000 Subject: [PATCH] Small clean up --- docker-compose.yml | 1 + finder/constants.py | 16 ++++++++-------- frontend/src/lib/consts.ts | 2 +- frontend/src/lib/external-search.ts | 3 +-- pipeline/transform/merge.py | 2 ++ pipeline/transform/price_estimation/utils.py | 2 +- server-rs/src/features.rs | 6 +++--- server-rs/src/main.rs | 1 - server-rs/src/parsing/filters.rs | 8 ++++---- server-rs/src/routes/ai_filters.rs | 2 +- 10 files changed, 22 insertions(+), 21 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5211f46..9c58ae6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -100,6 +100,7 @@ services: environment: PB_ADMIN_EMAIL: *pb-email PB_ADMIN_PASSWORD: *pb-password + PB_TRUSTED_PROXY: server healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8090/api/health"] interval: 10s diff --git a/finder/constants.py b/finder/constants.py index 04003aa..17d45a4 100644 --- a/finder/constants.py +++ b/finder/constants.py @@ -14,7 +14,7 @@ SEED = 42 # Schedule: hour of day (UTC) to auto-run scrape. Set to -1 to disable. SCHEDULE_HOUR = int(os.environ.get("SCHEDULE_HOUR", "3")) # Whether to run a scrape immediately on startup -RUN_ON_STARTUP = os.environ.get("RUN_ON_STARTUP", "true").lower() in ("1", "true", "yes") +RUN_ON_STARTUP = False TYPEAHEAD_URL = "https://los.rightmove.co.uk/typeahead" SEARCH_URL = "https://www.rightmove.co.uk/api/property-search/listing/search" @@ -26,12 +26,12 @@ PROPERTY_TYPE_MAP = { "Terraced": "Terraced", "End of Terrace": "Terraced", "Mid Terrace": "Terraced", - "Flat": "Flat", - "Maisonette": "Flat", - "Studio": "Flat", - "Apartment": "Flat", - "Penthouse": "Flat", - "Ground Flat": "Flat", + "Flat": "Flats/Maisonettes", + "Maisonette": "Flats/Maisonettes", + "Studio": "Flats/Maisonettes", + "Apartment": "Flats/Maisonettes", + "Penthouse": "Flats/Maisonettes", + "Ground Flat": "Flats/Maisonettes", "Detached Bungalow": "Detached", "Semi-Detached Bungalow": "Semi-Detached", "Town House": "Terraced", @@ -49,7 +49,7 @@ PROPERTY_TYPE_MAP = { "Coach House": "Other", "Character Property": "Other", "Cluster House": "Other", - "Retirement Property": "Flat", + "Retirement Property": "Flats/Maisonettes", "Plot": "Other", "Garages": "Other", "Mews": "Terraced", diff --git a/frontend/src/lib/consts.ts b/frontend/src/lib/consts.ts index 2625075..d5f25ee 100644 --- a/frontend/src/lib/consts.ts +++ b/frontend/src/lib/consts.ts @@ -149,7 +149,7 @@ export const STACKED_ENUM_GROUPS: Record< label: 'Property type', feature: 'Property type', components: ['Property type'], - valueOrder: ['Detached', 'Semi-Detached', 'Terraced', 'Flat'], + valueOrder: ['Detached', 'Semi-Detached', 'Terraced', 'Flats/Maisonettes'], valueColors: ['#8b5cf6', '#3b82f6', '#14b8a6', '#f59e0b'], }, { diff --git a/frontend/src/lib/external-search.ts b/frontend/src/lib/external-search.ts index 8d49680..6c08787 100644 --- a/frontend/src/lib/external-search.ts +++ b/frontend/src/lib/external-search.ts @@ -21,8 +21,7 @@ const PROPERTY_TYPE_MAP: Record< 'End-Terrace': { rightmove: 'terraced', onthemarket: 'terraced', zoopla: 'terraced' }, 'Enclosed Mid-Terrace': { rightmove: 'terraced', onthemarket: 'terraced', zoopla: 'terraced' }, 'Enclosed End-Terrace': { rightmove: 'terraced', onthemarket: 'terraced', zoopla: 'terraced' }, - Flat: { rightmove: 'flat', onthemarket: 'flats', zoopla: 'flat' }, - Maisonette: { rightmove: 'flat', onthemarket: 'flats', zoopla: 'flat' }, + 'Flats/Maisonettes': { rightmove: 'flat', onthemarket: 'flats', zoopla: 'flat' }, Bungalow: { rightmove: 'bungalow', onthemarket: 'bungalow', zoopla: 'bungalow' }, 'Park home': { rightmove: 'park-home', onthemarket: 'property', zoopla: '' }, }; diff --git a/pipeline/transform/merge.py b/pipeline/transform/merge.py index 8efacba..002e371 100644 --- a/pipeline/transform/merge.py +++ b/pipeline/transform/merge.py @@ -265,6 +265,8 @@ def _build( .when(has_epc) .then(pl.col("epc_property_type")) .otherwise(pl.col("pp_property_type")) + # Unify EPC's "Flat"/"Maisonette" with price-paid's "Flats/Maisonettes" + .replace({"Flat": "Flats/Maisonettes", "Maisonette": "Flats/Maisonettes"}) .alias("property_type") ) diff --git a/pipeline/transform/price_estimation/utils.py b/pipeline/transform/price_estimation/utils.py index a4fa3e9..830a4e8 100644 --- a/pipeline/transform/price_estimation/utils.py +++ b/pipeline/transform/price_estimation/utils.py @@ -18,7 +18,7 @@ TERRACE_TYPES = [ "Enclosed End-Terrace", "Terraced", ] -FLAT_TYPES = ["Flats/Maisonettes", "Flat", "Maisonette"] +FLAT_TYPES = ["Flats/Maisonettes"] TYPE_GROUPS = ["Detached", "Semi-Detached", "Terraced", "Flats", "Bungalow"] SHRINKAGE_K = 50 diff --git a/server-rs/src/features.rs b/server-rs/src/features.rs index cb5ecf9..a2d1f5b 100644 --- a/server-rs/src/features.rs +++ b/server-rs/src/features.rs @@ -944,9 +944,9 @@ pub static ENUM_FEATURE_GROUPS: &[EnumFeatureGroup] = &[ }, EnumFeatureConfig { name: "Property type", - order: Some(&["Detached", "Semi-Detached", "Terraced", "Flat"]), - description: "Type of property: detached, semi-detached, terraced, or flat", - detail: "From HM Land Registry Price Paid data. The broad property type classification: Detached, Semi-Detached, Terraced, or Flat/Maisonette.", + order: Some(&["Detached", "Semi-Detached", "Terraced", "Flats/Maisonettes"]), + description: "Type of property: detached, semi-detached, terraced, or flat/maisonette", + detail: "From HM Land Registry Price Paid data. The broad property type classification: Detached, Semi-Detached, Terraced, or Flats/Maisonettes.", source: "price-paid", }, EnumFeatureConfig { diff --git a/server-rs/src/main.rs b/server-rs/src/main.rs index 4b52d91..09b9ea6 100644 --- a/server-rs/src/main.rs +++ b/server-rs/src/main.rs @@ -329,7 +329,6 @@ async fn main() -> anyhow::Result<()> { &cli.google_oauth_client_secret, ) .await?; - info!( "Ollama configured: {} (model: {})", cli.ollama_url, cli.ollama_model diff --git a/server-rs/src/parsing/filters.rs b/server-rs/src/parsing/filters.rs index 3d4e23b..11500d4 100644 --- a/server-rs/src/parsing/filters.rs +++ b/server-rs/src/parsing/filters.rs @@ -145,7 +145,7 @@ mod tests { "Detached".into(), "Semi".into(), "Terraced".into(), - "Flat".into(), + "Flats/Maisonettes".into(), ], ); map @@ -273,7 +273,7 @@ mod tests { #[test] fn parse_enum_with_unknown_value() { let (_numeric, enums) = parse_filters( - Some("Type:Detached|Unknown|Flat"), + Some("Type:Detached|Unknown|Flats/Maisonettes"), &extended_feature_map(), &extended_enum_values(), ) @@ -281,14 +281,14 @@ mod tests { assert_eq!(enums.len(), 1); assert!(enums[0].allowed.contains(&(0.0_f32).to_bits())); // Detached - assert!(enums[0].allowed.contains(&(3.0_f32).to_bits())); // Flat + assert!(enums[0].allowed.contains(&(3.0_f32).to_bits())); // Flats/Maisonettes assert_eq!(enums[0].allowed.len(), 2); } #[test] fn parse_filter_with_whitespace() { let (numeric, enums) = parse_filters( - Some("Price : 100000 : 500000 , Type : Detached | Flat"), + Some("Price : 100000 : 500000 , Type : Detached | Flats/Maisonettes"), &extended_feature_map(), &extended_enum_values(), ) diff --git a/server-rs/src/routes/ai_filters.rs b/server-rs/src/routes/ai_filters.rs index 3f0534a..9c5692a 100644 --- a/server-rs/src/routes/ai_filters.rs +++ b/server-rs/src/routes/ai_filters.rs @@ -171,7 +171,7 @@ pub fn build_system_prompt(features: &FeaturesResponse) -> String { {\"name\": \"Last known price\", \"bound\": \"max\", \"value\": 300000}, \ {\"name\": \"Number of bedrooms & living rooms\", \"bound\": \"min\", \"value\": 4}, \ {\"name\": \"Max available download speed (Mbps)\", \"bound\": \"min\", \"value\": 100}], \ - \"enum_filters\": [{\"name\": \"Property type\", \"values\": [\"Flat\"]}], \ + \"enum_filters\": [{\"name\": \"Property type\", \"values\": [\"Flats/Maisonettes\"]}], \ \"notes\": \"No filter for: beach proximity\"}" .to_string(), );