Esempio n. 1
0
 async def show_articles_by_category_title(self, category_title, query_id):
     # products = [product for product in Product.objects(category=Category.objects(title=category_title).get())]
     # session.add(Category(title=category_title))
     # session.commit()
     # category = session.query(Category).filter_by(title=category_title).all()
     # session.add(Product(category=category))
     # session.commit()
     # products = [product for product in session.query(Product).filter_by(category=session.query(Product).filter_by(category=category).first())]
     category = session.query(Category).filter_by(title=category_title).first()
     products = session.query(Product).filter_by(category=category.id).all()
     # products = [product for product in products]
     await self.show_products_inline(products, query_id)
Esempio n. 2
0
    def get_cart_by_user(user, archived_id=None):
        if archived_id:
            # query_res = Cart.objects(user=user, id=archived_id, is_archived=True)
            query_res = session.query(Cart).filter_by(user=user.telegram_id, id=archived_id, is_archived=True)
            return query_res.first() if query_res else None

        # query_res = Cart.objects(user=user, is_archived=False)
        query_res = session.query(Cart).filter_by(user=user.telegram_id, is_archived=False).first()
        # return query_res.first() if query_res else Cart.objects.create(user=user)
        if query_res:
                return query_res
        else:
                session.add(Cart(user=user.telegram_id))
                session.commit()
                return session.query(Cart).filter_by(user=user.telegram_id, is_archived=False).first()
Esempio n. 3
0
    async def show_categories(self, data, message):
        kb = InlineKeyboardMarkup()
        title_text = ' | Категории:'
        # category = Category.objects.get(id=data)
        category = session.query(Category).filter_by(id=data).first()
        buttons = []

        if category.sub_categories:
            buttons = []
            for cat in category.sub_categories:
                if cat.sub_categories:
                    buttons.append(InlineKeyboardButton(text=cat.title, callback_data=str(cat.id)))
                    continue
                buttons.append(
                    InlineKeyboardButton(text=cat.title,
                                         switch_inline_query_current_chat='category_' + str(cat.title)))

        if not category.is_root:
            buttons.append(InlineKeyboardButton(text='<<< Назад', callback_data=str(category.parent.id)))
        buttons.append(InlineKeyboardButton(text='^ В начало', callback_data=START_KB['categories']))
        kb.add(*buttons)

        if not category.sub_categories:
            title_text = ' | Товары:'
            await self.show_products_inline(category.get_products(), message.chat.id)
            await self._bot.delete_message(message.chat.id, message.message_id)
            await self._bot.send_message(message.chat.id, category.title + title_text, reply_markup=kb)
            return

        await self._bot.edit_message_text(category.title + title_text,
                                          message_id=message.message_id,
                                          chat_id=message.chat.id,
                                          reply_markup=kb)
Esempio n. 4
0
    async def order_history_inline(self, query):
        user_id = str(query.from_user.id)
        # get carts with is_archived = True
        user = await BotService.get_user_by_telegram_id(query.from_user.id)
        # cart_query = Cart.objects(user=user, is_archived=True)
        cart_query = session.query(Cart).filter_by(user=user.telegram_id, is_archived=True)
        if not cart_query:
            return await self._bot.send_message(user_id, "No archived carts found")

        carts = [cart for cart in cart_query]
        results = []
        for i, cart in enumerate(carts):
            temp_res = InlineQueryResultArticle(
                id=i + 1,
                title=f'DATE: {cart.archive_date.strftime(self.datetime_fmt)}',
                description=f'TOTAL: {cart.get_total_str()}',
                input_message_content=InputTextMessageContent(
                    disable_web_page_preview=False,
                    message_text=await self.get_bill_text(cart.get_cart_products_freq_dict(),
                                                          cart.get_total_str(),
                                                          cart.archive_date)
                ),
            )
            results.append(temp_res)
        if results:
            await self._bot.answer_inline_query(query.id, results, cache_time=0)
Esempio n. 5
0
 def listar(self):
     try:
         servidores = session.query(servermodel).all()
         for s in servidores:
             print s.id, ' - ', s.nome, ' - ' , s.descricao
     except Exception as e:
         print 'Falhou ao listar: ', e
Esempio n. 6
0
    async def get_user_by_telegram_id(telegram_id):
        if type(telegram_id) != str:
            telegram_id = str(telegram_id)
        if not telegram_id:
            return None

        # return User.objects(telegram_id=telegram_id).first()
        return session.query(User).filter_by(telegram_id=telegram_id).first()
Esempio n. 7
0
 async def get_bill_text(self, products_dict, cart_total, archived_date):
     if not products_dict:
         return ""
     bill = f"""
             ORDER TIME: {archived_date.strftime(BotService.datetime_fmt)}
             TOTAL: {cart_total}
             ##########################"""
     for product, count in products_dict.items():
         product = session.query(Product).filter_by(id=product).first()
         qty = session.query(CartProduct).filter_by(cart=products_dict[product.id].cart, product=product.id).all()
         bill += f"""
             TITLE: {product.title}
             QTY: {len(qty)}
             PRICE: {product.get_price_str()}
             TOTAL: {product.get_total_str(len(qty))}
             --------------------------"""
     return bill
Esempio n. 8
0
    async def show_promo_products(self, message):
        await self._bot.delete_message(message.chat.id, message.message_id)
        # promo_products_query = Product.objects.filter(discount_price__exists=True)
        promo_products_query = session.query(Product).filter(Product.discount_price.isnot(None))

        if promo_products_query.count() == 0:
            return await self._bot.send_message(message.chat.id, 'No discount products found')
        promo_products = []
        [promo_products.append(promo_product) for promo_product in promo_products_query]
        await self.show_products(promo_products, message.chat.id)
Esempio n. 9
0
 def remove(self):
     try:
         user = session.query(UserModel) \
             .filter(UserModel.nome == self.nome) \
             .first()
         session.delete(user)
         session.commit()
     except Exception as e:
         session.rollback()
         print 'Falhou ao remover usuario: ', e
Esempio n. 10
0
    async def process_inline(self, query):
        data = query.query
        if not data:
            return

        # query_set = Product.objects(title__contains=data)
        data = Product.title.ilike('%' + str(data) + '%')
        query_set = session.query(Product).filter(data)
        if query_set.count() == 0:
            return
        products = [product for product in query_set]
        await self.show_products_inline(products, query.id)
Esempio n. 11
0
    async def cart_actions(self, call):
        action = call.data.split('_')[1]

        if action == 'nothing':
            return

        user_id = str(call.message.chat.id)
        user = await BotService.get_user_by_telegram_id(call.from_user.id)
        cart = self.get_cart_by_user(user)

        if cart.is_archived:
            return await self._bot.answer_callback_query(call.id, show_alert=False,
                                                         text=f"This cart is already archived")

        if action == 'drop':
            cart.remove_all_from_cart()
            return await self._bot.answer_callback_query(call.id, text=f"✔ All products removed from cart")

        product_id = str(call.data.split('_')[2])
        # product = Product.objects(id=product_id).get()
        product = session.query(Product).filter_by(id=product_id).first()

        if action == 'remove':
            cart.remove_product_from_cart(product)
            await self._bot.delete_message(user_id, message_id=call.message.message_id)
            return

        reply_markup = call.message['reply_markup']
        rp_t = reply_markup['inline_keyboard'][0][1]['text']

        if action == 'increase':
            if product.in_stock == int(rp_t):
                return await self._bot.answer_callback_query(call.id, show_alert=True,
                                                             text=f"MAX STOCK ITEMS REACHED for {product.title}")
            cart.add_product_to_cart(product)
            rp_t = str(int(rp_t) + 1)

        if action == 'decrease':
            if cart.get_product_qty(product) == 0:
                return
            cart.delete_product_from_cart(product)
            rp_t = str(int(rp_t) - 1)
            if rp_t == '0':
                await self._bot.delete_message(user_id, message_id=call.message.message_id)
                return
        reply_markup['inline_keyboard'][0][1]['text'] = rp_t
        cart_prod_text = f'{product.title}\n' \
                         f'Price: {product.get_price_str()}\n' \
                         f'Total: {product.get_total_str(int(rp_t))}\n'

        await self._bot.edit_message_text(text=cart_prod_text, chat_id=user_id, message_id=call.message.message_id,
                                          reply_markup=reply_markup)
Esempio n. 12
0
    async def view_root_categories(self, message):
        cats = session.query(Category).filter_by(is_root=True)
        kb = InlineKeyboardMarkup()
        buttons = [InlineKeyboardButton(text=cat.title, callback_data=str(cat.id)) for cat in cats]
        buttons.append(InlineKeyboardButton(text="Поиск товаров по названию", switch_inline_query_current_chat=''))
        kb.add(*buttons)
        if message.from_user.is_bot:
            return await self._bot.edit_message_text('Выберите категорию',
                                                     message_id=message.message_id,
                                                     chat_id=message.chat.id,
                                                     reply_markup=kb)

        await self._bot.send_message(message.chat.id, 'Выберите категорию', reply_markup=kb)
Esempio n. 13
0
 def get(self, login):
     try:
         user = session.query(UserModel) \
                         .filter(UserModel.nome==login) \
                         .first()
         if user:
             self.nome = user.nome
             self.senha = user.senha
             return self
         else:
             return None
     except Exception as e:
         print 'Falhou ao buscar usuario: ', e
Esempio n. 14
0
 def remove(self, nome):
     try:
         servidor = session.query(servermodel) \
                             .filter(servermodel.nome==nome) \
                             .first()
         if servidor:
             d = Docker()
             d.removecontainer(nome)
             session.delete(servidor)
             session.commit()
             print 'Servidor removido com sucesso.'
         else:
             print 'Servidor nao encontrado.'
     except Exception as e:
         session.rollback()
         print 'Falhou ao remover: ', e
Esempio n. 15
0
    async def show_cart(self, message):
        user_id = str(message.chat.id)
        user = await BotService.get_user_by_telegram_id(message.from_user.id)
        user_cart = self.get_cart_by_user(user)
        if not user_cart or user_cart.get_size() == 0:
        # if not user_cart:
            return await self._bot.send_message(user_id, 'No articles yet in cart')

        frequencies = user_cart.get_cart_products() #.item_frequencies('product')
        frequencies = {fre.product: fre for fre in frequencies}
        products_dict = {cart_product.product: cart_product for cart_product in user_cart.get_cart_products()}
        # products_dict = {print(cart_product.product) for cart_product in user_cart.get_cart_products()}
        for key, cart_product in products_dict.items():
            # qty = frequencies[key]
            qty =1 # fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix
            product = session.query(Product).filter_by(id=key).first()
            # cart_prod_text = f'{cart_product.product.title}\n' \
            #                  f'Qty: {cart_product.product.in_stock}\n' \
            #                  f'Price: {cart_product.product.get_price_str()}\n' \
            #                  f'Total: {cart_product.product.get_total_str(qty)}\n'
            cart_prod_text = f'{product.title}\n' \
                             f'Qty: {product.in_stock}\n' \
                             f'Price: {product.get_price_str()}\n' \
                             f'Total: {product.get_total_str(qty)}\n'

            kb = InlineKeyboardMarkup()
            buttons = [
                InlineKeyboardButton(text=u'\U00002796', callback_data='cart_decrease_' + str(key)),
                InlineKeyboardButton(text=str(qty), callback_data='cart_nothing'),
                InlineKeyboardButton(text=u'\U00002795', callback_data='cart_increase_' + str(key)),
                InlineKeyboardButton(text=u'\U0000274C', callback_data='cart_remove_' + str(key))
            ]
            kb.add(*buttons)  # 2795
            await self._bot.send_message(user_id, cart_prod_text, reply_markup=kb)

        kb = InlineKeyboardMarkup()
        kb.add(InlineKeyboardButton(text=f'TOTAL: {user_cart.get_total_str()}', callback_data='total'))
        kb.add(
            InlineKeyboardButton(text='ORDER ' + u'\U00002714', callback_data='order'),
            InlineKeyboardButton(text='REMOVE ALL  ' + u'\U0000274C', callback_data='cart_drop'),
        )

        await self._bot.send_message(user_id, 'Order:', reply_markup=kb)
Esempio n. 16
0
    async def add_to_cart(self, call):
        user_id = str(call.from_user.id)
        # product = Product.objects.get(id=call.data.split('_')[1])
        product = session.query(Product).filter_by(id=call.data.split('_')[1]).first()
        # if stock = 0 we cannot add this prod to cart
        if product.in_stock == 0:
            return await self._bot.answer_callback_query(call.id, text=f"❌ Product is out of stock")
        user = await BotService.get_user_by_telegram_id(call.from_user.id)
        user_cart = self.get_cart_by_user(user)

        if user_cart.is_archived:
            return await self._bot.answer_callback_query(call.id, show_alert=False,
                                                         text=f"This cart is already archived")

        if await self.check_cart_limit_reached(user_cart, product):
            await self._bot.answer_callback_query(call.id, show_alert=True,
                                                  text=f"MAX STOCK ITEMS REACHED for {product.title}")
            return
        user_cart.add_product_to_cart(product)
        await self._bot.answer_callback_query(call.id, text=f"✔ Added to cart: {product.title}")
Esempio n. 17
0
    async def show_archive(self, message):
        user_id = str(message.chat.id)
        # get carts with is_archived = True
        user = await BotService.get_user_by_telegram_id(message.from_user.id)
        # query = Cart.objects(user=user, is_archived=True)
        query = session.query(Cart).filter_by(user=user.telegram_id, is_archived=True)

        if not query:
            return await self._bot.send_message(user_id, "No archived carts found")

        carts = [cart for cart in query]
        kb = InlineKeyboardMarkup()
        for cart in carts:
            button_text = f'DATE: {cart.archive_date.strftime(BotService.datetime_fmt)} ' \
                          f'TOTAL: {cart.get_total_str()}'

            kb.add(InlineKeyboardButton(button_text, callback_data='archive_' + str(cart.id)))
        if not kb:
            return await self._bot.send_message(user_id, text='No archived orders yet')
        await self._bot.send_message(user_id, text='Orders history:', reply_markup=kb)
Esempio n. 18
0
    def check_user_by_telegram_id(telegram_id, username):
        if type(telegram_id) != str:
            telegram_id = str(telegram_id)
        if not telegram_id:
            return None

        # user = User.objects(telegram_id=telegram_id).first()
        user = session.query(User).filter_by(telegram_id=telegram_id).first()
        if not user:
            # user = User.objects.create(
            #     telegram_id=telegram_id,
            #     username=username if username else 'No user name',
            #     total=0,
            #     creation_date=datetime.now()
            # )
            user = session.add(User(telegram_id=telegram_id,
                                    username=username if username else 'No user name',
                                    total=0,
                                    creation_date=datetime.now()))
            session.commit()
        return user
Esempio n. 19
0
 async def check_cart_limit_reached(self, user_cart, product):
     # count = CartProduct.objects(cart=user_cart, product=str(product.id)).count()
     count = session.query(CartProduct).filter_by(cart=user_cart.id, product=str(product.id)).count()
     if count == product.in_stock:
         return True
     return False
Esempio n. 20
0
 def listall(self):
     try:
         all_users = session.query(UserModel).all()
         return all_users
     except Exception as e:
         print 'Falhou ao listar usuarios: ', e
Esempio n. 21
0
 async def subtract_qty(self, products_dict):
     for product, qty in products_dict.items():
         product = session.query(Product).filter_by(id=product).first()
         qty = len(session.query(CartProduct).filter_by(cart=products_dict[product.id].cart, product=product.id).all())
         product.in_stock -= qty
         product.save()