Ejemplo n.º 1
0
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!")
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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"] == []
Ejemplo n.º 4
0
    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"
Ejemplo n.º 5
0
    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"
Ejemplo n.º 6
0
    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")]
Ejemplo n.º 7
0
    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])
Ejemplo n.º 8
0
    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]
Ejemplo n.º 9
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},
        }