Пример #1
0
    def test_from_url(self):
        """Test to check if creating a product by url works as intended"""
        # Create a product by url - needs a network connection
        my_p = Product.from_url(self.p.url)

        self.assertEqual(type(my_p), Product)

        self.assertEqual(my_p.id, self.p.entity_id)
        self.assertEqual(my_p.name, self.p.name)
        self.assertEqual(my_p.url, self.p.url)

        # The price obviously can't be checked by a precise value
        self.assertEqual(type(my_p.price), float)
        self.assertGreater(my_p.price, 0.1)

        # Make sure that wrong urls lead to exceptions
        with self.assertRaises(InvalidWishlistURLException):
            failed_p = Product.from_url("http://example.com")
Пример #2
0
def add_entity(update, context):
    msg = update.message
    text = update.message.text
    t_user = update.effective_user

    logger.info("Adding new entity for user '{}'".format(t_user.id))

    reply_markup = InlineKeyboardMarkup([[cancel_button]])
    user = User(user_id=t_user.id, first_name=t_user.first_name, last_name=t_user.last_name, username=t_user.username, lang_code=t_user.language_code)
    core.add_user_if_new(user)

    try:
        entity_type = core.get_type_by_url(text)
        url = core.get_e_url(text, entity_type)
        logger.info("Valid URL for new entity is '{}'".format(url))
    except InvalidURLException:
        logger.warning("Invalid url '{}' sent by user {}!".format(text, t_user))
        msg.reply_text(text="Die URL ist ungültig!", reply_markup=reply_markup)
        return

    try:
        if entity_type == EntityType.WISHLIST:
            entity = Wishlist.from_url(url)
        elif entity_type == EntityType.PRODUCT:
            entity = Product.from_url(url)
        else:
            raise ValueError("EntityType '{}' not found!".format(entity_type))
    except HTTPError as e:
        logger.error(e)
        if e.response.status_code == 403:
            msg.reply_text(text="Die URL ist nicht öffentlich einsehbar, daher wurde kein neuer Preisagent erstellt!")
        elif e.response.status_code == 429:
            msg.reply_text(text="Entschuldige, ich bin temporär bei Geizhals blockiert und kann keine Preise auslesen. Bitte probiere es später noch einmal.")
    except (ValueError, Exception) as e:
        # Raised when price could not be parsed
        logger.error(e)
        msg.reply_text(text="Name oder Preis konnte nicht ausgelesen werden! Preisagent wurde nicht erstellt!")
    else:
        core.add_entity_if_new(entity)

        try:
            logger.debug("Subscribing to entity.")
            core.subscribe_entity(user, entity)
            entity_data = EntityType.get_type_article_name(entity_type)
            msg.reply_html("Preisagent für {article} {type} {link_name} erstellt! Aktueller Preis: {price}".format(
                article=entity_data.get("article"),
                type=entity_data.get("name"),
                link_name=link(entity.url, entity.name),
                price=bold(price(entity.price, signed=False))),
                disable_web_page_preview=True)
            context.user_data["state"] = State.IDLE
        except AlreadySubscribedException:
            logger.debug("User already subscribed!")
            msg.reply_text("Du hast bereits einen Preisagenten für diese URL! Bitte sende mir eine andere URL.",
                           reply_markup=InlineKeyboardMarkup([[cancel_button]]))
Пример #3
0
def add_product(bot, update):
    text = update.message.text
    user = update.message.from_user

    logger.info("Adding new product for user '{}'".format(user.id))

    reply_markup = InlineKeyboardMarkup([[cancel_button]])

    add_user_if_new(user)

    try:
        url = get_p_url(text)
        logger.info("Valid URL for new product is '{}'".format(url))
    except InvalidURLException:
        logger.warning("Invalid url '{}' sent by user {}!".format(text, user))
        bot.sendMessage(chat_id=user.id,
                        text="Die URL ist ungültig!",
                        reply_markup=reply_markup)
        return

    try:
        product = Product.from_url(url)
    except HTTPError as e:
        logger.error(e)
        if e.code == 403:
            bot.sendMessage(
                chat_id=user.id,
                text=
                "Das Produkt ist nicht zugänglich! Preisagent wurde nicht erstellt!"
            )
        elif e.code == 429:
            bot.sendMessage(
                chat_id=user.id,
                text=
                "Entschuldige, ich bin temporär bei Geizhals blockiert und kann keine Preise auslesen. Bitte probiere es später noch einmal."
            )
    except ValueError as valueError:
        # Raised when price could not be parsed
        logger.error(valueError)
        bot.sendMessage(
            chat_id=user.id,
            text=
            "Name oder Preis konnte nicht ausgelesen werden! Preisagent wurde nicht erstellt!"
        )
    except Exception as e:
        logger.error(e)
        bot.sendMessage(
            chat_id=user.id,
            text=
            "Name oder Preis konnte nicht ausgelesen werden! Wunschliste nicht erstellt!"
        )
    else:
        add_product_if_new(product)

        try:
            logger.debug("Subscribing to product.")
            subscribe_entity(user, product)
            bot.sendMessage(
                user.id,
                "Preisagent für das Produkt {link_name} erstellt! Aktueller Preis: {price}"
                .format(link_name=link(product.url, product.name),
                        price=bold(price(product.price, signed=False))),
                parse_mode="HTML",
                disable_web_page_preview=True)
            rm_state(user.id)
        except AlreadySubscribedException:
            logger.debug("User already subscribed!")
            bot.sendMessage(
                user.id,
                "Du hast bereits einen Preisagenten für dieses Produkt! Bitte sende mir eine andere URL.",
                reply_markup=InlineKeyboardMarkup([[cancel_button]]))