add support for querying buying listings as well as by max price
This commit is contained in:
parent
ba4a95825b
commit
69d15e9a16
5 changed files with 95 additions and 31 deletions
|
|
@ -4,6 +4,7 @@ from models.listing import (
|
|||
BuyListing,
|
||||
FurnishType,
|
||||
Listing as modelListing,
|
||||
ListingType,
|
||||
QueryParameters,
|
||||
RentListing,
|
||||
)
|
||||
|
|
@ -32,12 +33,19 @@ class ListingRepository:
|
|||
"""
|
||||
only_ids = only_ids or []
|
||||
|
||||
query = select(
|
||||
RentListing
|
||||
) # TODO: one nice day I will think of a way to query both rent and buy
|
||||
model = RentListing # if no query params, default to renting listings
|
||||
if query_parameters:
|
||||
model = (
|
||||
RentListing
|
||||
if query_parameters.listing_type == ListingType.RENT
|
||||
else BuyListing
|
||||
# else RentListing
|
||||
)
|
||||
|
||||
query = select(model)
|
||||
if only_ids:
|
||||
query = query.where(RentListing.id.in_(only_ids)) # type: ignore
|
||||
query = self._add_where_from_query_parameters(query, query_parameters)
|
||||
query = query.where(model.id.in_(only_ids)) # type: ignore
|
||||
query = self._add_where_from_query_parameters(query, model, query_parameters)
|
||||
if limit:
|
||||
query = query.limit(limit)
|
||||
|
||||
|
|
@ -47,34 +55,31 @@ class ListingRepository:
|
|||
|
||||
def _add_where_from_query_parameters(
|
||||
self,
|
||||
query: SelectOfScalar[RentListing],
|
||||
query: SelectOfScalar[Listing],
|
||||
model: type[Listing],
|
||||
query_parameters: QueryParameters | None = None,
|
||||
) -> SelectOfScalar[RentListing]:
|
||||
) -> SelectOfScalar[Listing]:
|
||||
if query_parameters is None:
|
||||
return query
|
||||
query = query.where(
|
||||
RentListing.number_of_bedrooms.between(
|
||||
model.number_of_bedrooms.between(
|
||||
query_parameters.min_bedrooms, query_parameters.max_bedrooms
|
||||
),
|
||||
RentListing.price.between(
|
||||
query_parameters.min_price, query_parameters.max_price
|
||||
),
|
||||
model.price.between(query_parameters.min_price, query_parameters.max_price),
|
||||
)
|
||||
if query_parameters.min_sqm is not None:
|
||||
query = query.where(RentListing.square_meters >= query_parameters.min_sqm)
|
||||
query = query.where(model.square_meters >= query_parameters.min_sqm)
|
||||
if query_parameters.furnish_types:
|
||||
query = query.where(
|
||||
RentListing.furnish_type.in_(query_parameters.furnish_types)
|
||||
)
|
||||
query = query.where(model.furnish_type.in_(query_parameters.furnish_types))
|
||||
if query_parameters.let_date_available_from is not None:
|
||||
query = query.where(
|
||||
RentListing.available_from >= query_parameters.let_date_available_from
|
||||
model.available_from >= query_parameters.let_date_available_from
|
||||
)
|
||||
if query_parameters.last_seen_days is not None:
|
||||
last_seen_threshold = datetime.now() - timedelta(
|
||||
days=query_parameters.last_seen_days
|
||||
)
|
||||
query = query.where(RentListing.last_seen >= last_seen_threshold)
|
||||
query = query.where(model.last_seen >= last_seen_threshold)
|
||||
return query
|
||||
|
||||
async def upsert_listings(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue