From e7c81d31acdb70bff896672d18c6739428029dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Le=20Garrec=24?= Date: Tue, 24 Oct 2017 17:21:48 +0200 Subject: [PATCH 1/2] Add config option for minimum number of pictures --- flatisfy/config.py | 5 +++++ flatisfy/filters/__init__.py | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/flatisfy/config.py b/flatisfy/config.py index 7f4bc28..1e92378 100644 --- a/flatisfy/config.py +++ b/flatisfy/config.py @@ -34,6 +34,7 @@ DEFAULT_CONFIG = { "cost": (None, None), # (min, max) in currency unit "rooms": (None, None), # (min, max) "bedrooms": (None, None), # (min, max) + "minimum_pictures": None, "time_to": {} # Dict mapping names to {"gps": [lat, lng], # "time": (min, max) } # Time is in seconds @@ -136,6 +137,10 @@ def validate_config(config, check_with_data): assert "type" in constraint assert isinstance(constraint["type"], str) assert constraint["type"].upper() in ["RENT", "SALE", "SHARING"] + + assert "minimum_pictures" in constraint + assert isinstance(constraint["minimum_pictures"], int) + assert constraint["minimum_pictures"] >= 0 assert "house_types" in constraint assert constraint["house_types"] diff --git a/flatisfy/filters/__init__.py b/flatisfy/filters/__init__.py index 0086dde..34c064e 100644 --- a/flatisfy/filters/__init__.py +++ b/flatisfy/filters/__init__.py @@ -67,6 +67,12 @@ def refine_with_housing_criteria(flats_list, constraint): field.capitalize(), flat["id"]) is_ok[i] = is_ok[i] and is_within_interval + # Check number of pictures + print(constraint['minimum_pictures'], len(flat['photos'])) + if not (constraint['minimum_pictures'] <= len(flat['photos'])): + is_ok[i] = False + + return ( [ flat From 6b82af6b85814ed49d46859ff4a09b893d1b6867 Mon Sep 17 00:00:00 2001 From: "Phyks (Lucas Verney)" Date: Sun, 29 Oct 2017 03:05:35 +0100 Subject: [PATCH 2/2] Review of Hatrix42 PR --- flatisfy/config.py | 11 ++++---- flatisfy/filters/__init__.py | 53 ++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/flatisfy/config.py b/flatisfy/config.py index eb3bf91..aa97508 100644 --- a/flatisfy/config.py +++ b/flatisfy/config.py @@ -34,7 +34,7 @@ DEFAULT_CONFIG = { "cost": (None, None), # (min, max) in currency unit "rooms": (None, None), # (min, max) "bedrooms": (None, None), # (min, max) - "minimum_pictures": None, + "minimum_photos": None, "time_to": {} # Dict mapping names to {"gps": [lat, lng], # "time": (min, max) } # Time is in seconds @@ -138,10 +138,11 @@ def validate_config(config, check_with_data): assert "type" in constraint assert isinstance(constraint["type"], str) assert constraint["type"].upper() in ["RENT", "SALE", "SHARING"] - - assert "minimum_pictures" in constraint - assert isinstance(constraint["minimum_pictures"], int) - assert constraint["minimum_pictures"] >= 0 + + assert "minimum_photos" in constraint + if constraint["minimum_photos"]: + assert isinstance(constraint["minimum_photos"], int) + assert constraint["minimum_photos"] >= 0 assert "house_types" in constraint assert constraint["house_types"] diff --git a/flatisfy/filters/__init__.py b/flatisfy/filters/__init__.py index 34c064e..2bbf2f0 100644 --- a/flatisfy/filters/__init__.py +++ b/flatisfy/filters/__init__.py @@ -26,7 +26,6 @@ def refine_with_housing_criteria(flats_list, constraint): :param flats_list: A list of flats dict to filter. :param constraint: The constraint that the ``flats_list`` should satisfy. - :param config: A config dict. :return: A tuple of flats to keep and flats to delete. """ # For each flat, the associated `is_ok` value indicate whether it should be @@ -67,12 +66,51 @@ def refine_with_housing_criteria(flats_list, constraint): field.capitalize(), flat["id"]) is_ok[i] = is_ok[i] and is_within_interval - # Check number of pictures - print(constraint['minimum_pictures'], len(flat['photos'])) - if not (constraint['minimum_pictures'] <= len(flat['photos'])): - is_ok[i] = False + return ( + [ + flat + for i, flat in enumerate(flats_list) + if is_ok[i] + ], + [ + flat + for i, flat in enumerate(flats_list) + if not is_ok[i] + ] + ) +def refine_with_minimum_photos(flats_list, constraint): + """ + Filter a list of flats according to the minimum number of photos criterion. + + .. note :: This has to be done in a separate function and not with the + other criterias as photos are only fetched in the second pass. + + :param flats_list: A list of flats dict to filter. + :param constraint: The constraint that the ``flats_list`` should satisfy. + :return: A tuple of flats to keep and flats to delete. + """ + # For each flat, the associated `is_ok` value indicate whether it should be + # kept or discarded. + is_ok = [True for _ in flats_list] + + for i, flat in enumerate(flats_list): + # Check number of pictures + has_enough_photos = tools.is_within_interval( + flat.get('photos', []), + constraint['minimum_photos'], + None + ) + if not has_enough_photos: + LOGGER.info( + "Flat %s only has %d photos, it should have at least %d.", + flat["id"], + len(flat['photos']), + constraint['minimum_photos'] + ) + is_ok[i] = False + return ( [ flat @@ -86,6 +124,7 @@ def refine_with_housing_criteria(flats_list, constraint): ] ) + @tools.timeit def first_pass(flats_list, constraint, config): """ @@ -163,6 +202,10 @@ def second_pass(flats_list, constraint, config): flats_list, ignored_list = refine_with_housing_criteria(flats_list, constraint) + # Remove return housing posts which do not have enough photos + flats_list, ignored_list = refine_with_minimum_photos(flats_list, + constraint) + return { "new": flats_list, "ignored": ignored_list,