def process_eligible_offers(client: Redis, offer_ids: List[int], from_provider_update: bool = False) -> None: offers_to_add = [] offers_to_delete = [] pipeline = client.pipeline() offers = offer_queries.get_offers_by_ids(offer_ids) for offer in offers: offer_exists = check_offer_exists(client=client, offer_id=offer.id) if offer and offer.isBookable: if from_provider_update and offer_exists: offer_details = get_offer_details(client=client, offer_id=offer.id) if offer_details and is_eligible_for_reindexing( offer, offer_details): offers_to_add.append(build_object(offer=offer)) add_to_indexed_offers( pipeline=pipeline, offer_id=offer.id, offer_details=_build_offer_details_to_be_indexed( offer)) else: offers_to_add.append(build_object(offer=offer)) add_to_indexed_offers( pipeline=pipeline, offer_id=offer.id, offer_details=_build_offer_details_to_be_indexed(offer)) else: if offer_exists: offers_to_delete.append(offer.id) if len(offers_to_add) > 0: _process_adding(pipeline=pipeline, client=client, offer_ids=offer_ids, adding_objects=offers_to_add) if len(offers_to_delete) > 0: _process_deleting(client=client, offer_ids_to_delete=offers_to_delete) if not (offers_to_add or offers_to_delete): logger.info("[ALGOLIA] no objects were added nor deleted!")
def test_should_default_coordinates_when_offer_is_numeric(self, app): # Given offerer = create_offerer() venue = create_venue(offerer=offerer, latitude=None, longitude=None) offer = create_offer_with_thing_product(venue=venue, is_digital=True) stock = create_stock(offer=offer) repository.save(stock) # When result = build_object(offer) # Then assert result["_geoloc"]["lat"] == 47.158459 assert result["_geoloc"]["lng"] == 2.409289
def test_should_not_return_event_beginning_datetimes_as_timestamp_when_thing(self, app): # Given offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_thing_product(venue=venue) stock1 = create_stock(offer=offer) stock2 = create_stock(offer=offer) repository.save(stock1, stock2) # When result = build_object(offer) # Then assert result["offer"]["dates"] == []
def test_should_return_a_music_sub_type_when_exists(self, app): # Given offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_thing_product(venue=venue) offer.extraData = {"musicSubType": "fusion"} stock = create_stock(offer=offer) repository.save(stock) # When result = build_object(offer) # Then assert result["offer"]["musicSubType"] == "fusion"
def test_should_return_a_performer_when_exists(self, app): # Given offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_thing_product(venue=venue) offer.extraData = {"performer": "MEFA"} stock = create_stock(offer=offer) repository.save(stock) # When result = build_object(offer) # Then assert result["offer"]["performer"] == "MEFA"
def test_should_return_the_first_stock_price(self, app): # Given offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_thing_product(venue=venue) stock1 = create_stock(offer=offer, price=7) stock2 = create_stock(offer=offer, price=5) stock3 = create_stock(offer=offer, price=10.3) repository.save(stock1, stock2, stock3) # When result = build_object(offer) # Then assert result["offer"]["prices"] == [Decimal("5.00"), Decimal("7.00"), Decimal("10.30")]
def test_should_return_event_beginning_times_in_seconds(self, app): # Given in_three_days_at_eighteen_thirty = datetime.utcnow() + timedelta(days=3) in_four_days_at_eighteen_thirty = datetime.utcnow() + timedelta(days=4) in_five_days_at_twenty_one_thirty = datetime.utcnow() + timedelta(days=5, hours=3, seconds=18) offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_event_product(venue=venue) stock1 = create_stock(beginning_datetime=in_three_days_at_eighteen_thirty, offer=offer) stock2 = create_stock(beginning_datetime=in_five_days_at_twenty_one_thirty, offer=offer) stock3 = create_stock(beginning_datetime=in_four_days_at_eighteen_thirty, offer=offer) repository.save(stock1, stock2, stock3) # When result = build_object(offer) # Then eighteen_thirty_in_seconds = 66600 twenty_one_thirty_in_seconds = 77418 assert sorted(result["offer"]["times"]) == sorted([eighteen_thirty_in_seconds, twenty_one_thirty_in_seconds])
def test_should_return_event_beginning_datetimes_as_timestamp_sorted_from_oldest_to_newest_when_event(self, app): # Given in_three_days = datetime.utcnow() + timedelta(days=3) in_four_days = datetime.utcnow() + timedelta(days=4) in_five_days = datetime.utcnow() + timedelta(days=5) in_ten_days = datetime.utcnow() + timedelta(days=10) offerer = create_offerer() venue = create_venue(offerer=offerer) offer = create_offer_with_event_product(venue=venue) stock1 = create_stock(beginning_datetime=in_four_days, offer=offer) stock2 = create_stock(beginning_datetime=in_three_days, offer=offer) stock3 = create_stock(beginning_datetime=in_ten_days, offer=offer) stock4 = create_stock(beginning_datetime=in_five_days, offer=offer) repository.save(stock1, stock2, stock3, stock4) # When result = build_object(offer) # Then assert result["offer"]["dates"] == [1603011600.0, 1603098000.0, 1603184400.0, 1603616400.0]
def test_should_return_algolia_object_with_two_tags_when_two_criterion(self, app): # Given in_four_days = datetime.utcnow() + timedelta(days=4) offerer = create_offerer(name="Offerer name", idx=1) venue = create_venue( offerer=offerer, city="Paris", idx=2, latitude=48.8638689, longitude=2.3380198, name="Venue name", public_name="Venue public name", ) criterion1 = create_criterion(description="Ma super offre", name="Mon tag associé", score_delta=0) criterion2 = create_criterion(description="Avengers", name="Iron Man mon super héros", score_delta=0) offer = create_offer_with_event_product( venue=venue, description="Un lit sous une rivière", withdrawal_details="A emporter sur place", idx=3, is_active=True, event_name="Event name", event_type=EventType.MUSIQUE, thumb_count=1, date_created=datetime(2020, 1, 1, 10, 0, 0), criteria=[criterion1, criterion2], ) stock1 = create_stock( beginning_datetime=in_four_days, date_created=datetime(2020, 12, 5, 11, 0, 0), offer=offer, price=10, quantity=10, ) repository.save(stock1) humanized_product_id = humanize(offer.product.id) # When result = build_object(offer) # Then assert result == { "objectID": "AM", "offer": { "author": None, "category": "MUSIQUE", "dateCreated": 1577872800.0, "dates": [1603098000.0], "description": "Un lit sous une rivière", "withdrawalDetails": "A emporter sur place", "id": "AM", "isbn": None, "isDuo": False, "isDigital": False, "isEvent": True, "isThing": False, "label": "Concert ou festival", "name": "Event name", "musicSubType": None, "musicType": None, "performer": None, "prices": [Decimal("10.00")], "priceMin": Decimal("10.00"), "priceMax": Decimal("10.00"), "showSubType": None, "showType": None, "speaker": None, "stageDirector": None, "stocksDateCreated": [1607166000.0], "thumbUrl": f"http://localhost/storage/thumbs/products/{humanized_product_id}", "tags": ["Mon tag associé", "Iron Man mon super héros"], "times": [32400], "type": "Écouter", "visa": None, }, "offerer": { "name": "Offerer name", }, "venue": { "city": "Paris", "departementCode": "93", "name": "Venue name", "publicName": "Venue public name", }, "_geoloc": {"lat": 48.86387, "lng": 2.33802}, }