Review of Hatrix42 PR

This commit is contained in:
Lucas Verney 2017-10-29 03:05:35 +01:00
parent 9c55904f59
commit 6b82af6b85
2 changed files with 54 additions and 10 deletions

View File

@ -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"]

View File

@ -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,