Esempio n. 1
0
def action_catalog_category(query, data):
    user = get_user(query.from_user.id, session)
    category_id = data['id']

    if category_id is None:
        product_ids = session.query(
            UserProduct.product_id).filter_by(user_id=user.id).distinct()
        products = session.query(Product).filter(
            Product.id.in_(product_ids), Product.catalog_category_ids == '{}')

        for product in products:
            query.message.reply_html(get_product_card(product),
                                     reply_markup=get_product_markup(
                                         user.id, product))

    else:
        rows = get_catalog(session, user.id, data['level'], category_id)

        if len(rows) < 2:
            product_ids = session.query(
                UserProduct.product_id).filter_by(user_id=user.id).distinct()
            products = session.query(Product).filter(
                Product.id.in_(product_ids),
                Product.catalog_category_ids.any(category_id))
            for product in products:
                query.message.reply_html(get_product_card(product),
                                         reply_markup=get_product_markup(
                                             user.id, product))

        else:
            return query.message.reply_html(
                '🗂️ Категории:', reply_markup=get_catalog_markup(rows))
Esempio n. 2
0
def products_list(update, context, user, products):
    products = list(products)

    if not products:
        update.message.reply_text('Список пуст')

    for product in products:
        update.message.reply_html(get_product_card(product),
                                  reply_markup=get_product_markup(
                                      user.id, product))
Esempio n. 3
0
def action_brand_list(query, data):
    brand_id = data['brand_id']
    user = get_user(query.from_user.id, session)

    products = session.query(Product).filter(
        and_(
            Product.id.in_([
                user_product.product_id for user_product in user.user_products
            ]), Product.brand_id == brand_id))

    for product in products:
        query.message.reply_html(get_product_card(product),
                                 reply_markup=get_product_markup(
                                     user.id, product))
Esempio n. 4
0
def check_prices(context):
    user_product_prices = session.query(UserProductPrice).filter(
        UserProductPrice.status.in_([
            UserProductPrice.STATUS_APPEARED, UserProductPrice.STATUS_UPDATED
        ])).join(
            UserProductSettings, UserProductPrice.user_product_id ==
            UserProductSettings.user_product_id).filter(
                UserProductSettings.is_price_notify == True).all()

    for user_product_price in user_product_prices:
        product = user_product_price.user_product.product
        user_product = user_product_price.user_product

        diff_perc = abs(user_product_price.price_start - user_product_price.
                        price_end) / user_product_price.price_start * 100

        price_icon = get_price_icon(user_product_price.price_end,
                                    user_product_price.price_start)
        cur_price = ProductPrice.format_price_value(
            user_product_price.price_end, product.domain)
        prev_price = ProductPrice.format_price_value(
            user_product_price.price_start, product.domain)

        if prev_price == cur_price:
            price_text = cur_price
        else:
            price_text = f'{prev_price} → {cur_price}'

        text = f'⚠️ Обновилась цена на {product.header}\n\n{price_icon} {price_text}'

        if product.size_list:
            text += '\n' + get_size_list(product)

        reply_markup = get_product_markup(user_product.user.id, product)
        context.job_queue.run_once(notify_user,
                                   1,
                                   context={
                                       'telegram_id':
                                       user_product.user.telegram_id,
                                       'text': text,
                                       'reply_markup': reply_markup
                                   })

        user_product_price.status = UserProductPrice.STATUS_PROCESSED
        user_product_price.price_start = user_product_price.price_end

    session.commit()
Esempio n. 5
0
def action_price_notify(query, data):
    user = get_user(query.from_user.id, session)
    user_product = session.query(UserProduct).filter_by(
        user_id=user.id, product_id=data['product_id']).first()

    if not user_product:
        return

    user_product.settings.is_price_notify = not data['n']
    session.commit()

    if user_product.settings.is_price_notify:
        text = f'🔔 Включены уведомления для {user_product.product.header}'
    else:
        text = f'🔕 Отключены уведомления для {user_product.product.header}'

    return query.message.reply_html(text,
                                    reply_markup=get_product_markup(
                                        user.id, product=user_product.product))
Esempio n. 6
0
def action_prices_history(query, data):
    user = get_user(query.from_user.id, session)

    product = session.query(Product).filter_by(id=data['product_id']).first()
    product_prices = product.prices[:30]

    text = f'📈 Цены на {product.header}\n\n'

    if not product_prices:
        text += 'нет данных'

    for product_price in product_prices:
        price_icon = get_price_icon(product_price.value,
                                    product_price.prev_value)
        price_value = ProductPrice.format_price_value(product_price.value,
                                                      product.domain)

        text += f'{product_price.created_at.date()}  {price_icon} {price_value}\n'

    return query.message.reply_html(text,
                                    reply_markup=get_product_markup(
                                        user.id, product))
Esempio n. 7
0
def message_any(update, context):
    if context.user_data.get('action') == 'search':
        context.user_data['action'] = None
        user = get_user(update.message.from_user.id, session)

        products_ids = session.query(
            UserProduct.product_id).filter_by(user_id=user.id).distinct()

        q = '%' + update.message.text + '%'
        products = session.query(Product)\
            .filter(and_(or_(Product.name.ilike(q), Brand.title.ilike(q)), Product.id.in_(products_ids)))\
            .join(Brand, Product.brand_id == Brand.id)\
            .all()

        if not products:
            update.message.reply_text('Совпадений не найдено')

        for product in products:
            update.message.reply_html(get_product_card(product),
                                      reply_markup=get_product_markup(
                                          user.id, product))
    else:
        return menu.menu_item_select(update, context)