Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -146,11 +146,24 @@ async def show_products_in_category(callback_query: types.CallbackQuery):
|
|
| 146 |
|
| 147 |
async def send_product_batch(products_batch):
|
| 148 |
for product in products_batch:
|
| 149 |
-
photo_url = f"https://huggingface.co/datasets/{REPO_ID}/resolve/main/photos/{product['photo']}" if product.get('photo') else None
|
| 150 |
caption = f"🏷 {product['name']} - {product['price']} сом\nОписание: {product['description']}\n/id: {product['id']}"
|
|
|
|
| 151 |
try:
|
| 152 |
-
if
|
| 153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
else:
|
| 155 |
await bot.send_message(callback_query.from_user.id, caption, reply_markup=get_product_keyboard(product['id']))
|
| 156 |
except Exception as e:
|
|
@@ -186,10 +199,29 @@ async def show_cart(message: types.Message):
|
|
| 186 |
builder.button(text="Оформить заказ", callback_data=f"complete_{user_id}")
|
| 187 |
await message.answer(response, reply_markup=builder.as_markup())
|
| 188 |
|
|
|
|
| 189 |
@dp.callback_query(F.data.startswith("add_"))
|
| 190 |
-
async def
|
| 191 |
try:
|
| 192 |
product_id = int(callback_query.data.split('_')[1])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 193 |
product = next((p for p in data['products'] if p['id'] == product_id), None)
|
| 194 |
if product:
|
| 195 |
user_id = callback_query.from_user.id
|
|
@@ -197,11 +229,13 @@ async def add_to_cart(callback_query: types.CallbackQuery):
|
|
| 197 |
if not cart:
|
| 198 |
cart = {'user_id': user_id, 'items': [], 'date': datetime.now().isoformat()}
|
| 199 |
data['orders'].append(cart)
|
| 200 |
-
cart['items'].append({'product_id': product_id, 'quantity':
|
| 201 |
save_data(data)
|
| 202 |
await bot.answer_callback_query(callback_query.id, "Товар добавлен в корзину!")
|
|
|
|
|
|
|
| 203 |
except Exception as e:
|
| 204 |
-
logger.error(f"Ошибка при добавлении
|
| 205 |
await bot.answer_callback_query(callback_query.id, "Ошибка")
|
| 206 |
|
| 207 |
@dp.callback_query(F.data.startswith("complete_"))
|
|
@@ -354,7 +388,8 @@ admin_html = """
|
|
| 354 |
<option value="{{ category.id }}">{{ category.name }}</option>
|
| 355 |
{% endfor %}
|
| 356 |
</select>
|
| 357 |
-
|
|
|
|
| 358 |
<button type="submit">Добавить товар</button>
|
| 359 |
</form>
|
| 360 |
<h3>Существующие товары</h3>
|
|
@@ -363,8 +398,10 @@ admin_html = """
|
|
| 363 |
<div class="item">
|
| 364 |
{{ product.name }} - {{ product.price }} сом<br>
|
| 365 |
{{ product.description }}<br>
|
| 366 |
-
{% if product.
|
| 367 |
-
|
|
|
|
|
|
|
| 368 |
{% endif %}
|
| 369 |
<button onclick="deleteProduct({{ product.id }})">Удалить</button>
|
| 370 |
</div>
|
|
@@ -439,24 +476,28 @@ def add_product():
|
|
| 439 |
price = float(request.form['price'])
|
| 440 |
description = request.form['description']
|
| 441 |
category_id = int(request.form['category_id'])
|
| 442 |
-
|
| 443 |
product_id = max((p['id'] for p in data['products']), default=0) + 1
|
| 444 |
|
| 445 |
-
|
| 446 |
-
if
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 460 |
|
| 461 |
data['products'].append({
|
| 462 |
'id': product_id,
|
|
@@ -464,7 +505,7 @@ def add_product():
|
|
| 464 |
'price': price,
|
| 465 |
'description': description,
|
| 466 |
'category_id': category_id,
|
| 467 |
-
'
|
| 468 |
})
|
| 469 |
save_data(data)
|
| 470 |
update_event.set()
|
|
|
|
| 146 |
|
| 147 |
async def send_product_batch(products_batch):
|
| 148 |
for product in products_batch:
|
|
|
|
| 149 |
caption = f"🏷 {product['name']} - {product['price']} сом\nОписание: {product['description']}\n/id: {product['id']}"
|
| 150 |
+
photos = product.get('photos', [])
|
| 151 |
try:
|
| 152 |
+
if photos:
|
| 153 |
+
if len(photos) == 1:
|
| 154 |
+
photo_url = f"https://huggingface.co/datasets/{REPO_ID}/resolve/main/photos/{photos[0]}"
|
| 155 |
+
await bot.send_photo(chat_id=callback_query.from_user.id, photo=photo_url, caption=caption, reply_markup=get_product_keyboard(product['id']))
|
| 156 |
+
else:
|
| 157 |
+
media_group = []
|
| 158 |
+
for idx, photo in enumerate(photos):
|
| 159 |
+
photo_url = f"https://huggingface.co/datasets/{REPO_ID}/resolve/main/photos/{photo}"
|
| 160 |
+
if idx == 0:
|
| 161 |
+
media_group.append(types.InputMediaPhoto(media=photo_url, caption=caption))
|
| 162 |
+
else:
|
| 163 |
+
media_group.append(types.InputMediaPhoto(media=photo_url))
|
| 164 |
+
await bot.send_media_group(chat_id=callback_query.from_user.id, media=media_group)
|
| 165 |
+
# После отправки медиа-группы дополнительно отправляем клавиатуру
|
| 166 |
+
await bot.send_message(callback_query.from_user.id, "Выберите действие:", reply_markup=get_product_keyboard(product['id']))
|
| 167 |
else:
|
| 168 |
await bot.send_message(callback_query.from_user.id, caption, reply_markup=get_product_keyboard(product['id']))
|
| 169 |
except Exception as e:
|
|
|
|
| 199 |
builder.button(text="Оформить заказ", callback_data=f"complete_{user_id}")
|
| 200 |
await message.answer(response, reply_markup=builder.as_markup())
|
| 201 |
|
| 202 |
+
# Первый этап: после нажатия кнопки "Добавить в корзину" предлагается выбрать количество
|
| 203 |
@dp.callback_query(F.data.startswith("add_"))
|
| 204 |
+
async def choose_quantity(callback_query: types.CallbackQuery):
|
| 205 |
try:
|
| 206 |
product_id = int(callback_query.data.split('_')[1])
|
| 207 |
+
builder = InlineKeyboardBuilder()
|
| 208 |
+
# Предлагаем выбрать количество от 1 до 10
|
| 209 |
+
for i in range(1, 11):
|
| 210 |
+
builder.button(text=str(i), callback_data=f"confirm_{product_id}_{i}")
|
| 211 |
+
builder.adjust(5)
|
| 212 |
+
await bot.send_message(callback_query.from_user.id, "Выберите количество:", reply_markup=builder.as_markup())
|
| 213 |
+
await bot.answer_callback_query(callback_query.id)
|
| 214 |
+
except Exception as e:
|
| 215 |
+
logger.error(f"Ошибка при выборе количества: {e}")
|
| 216 |
+
await bot.answer_callback_query(callback_query.id, "Ошибка")
|
| 217 |
+
|
| 218 |
+
# Второй этап: подтверждение добавления товара в корзину с выбранным количеством
|
| 219 |
+
@dp.callback_query(F.data.startswith("confirm_"))
|
| 220 |
+
async def confirm_add_to_cart(callback_query: types.CallbackQuery):
|
| 221 |
+
try:
|
| 222 |
+
parts = callback_query.data.split('_')
|
| 223 |
+
product_id = int(parts[1])
|
| 224 |
+
quantity = int(parts[2])
|
| 225 |
product = next((p for p in data['products'] if p['id'] == product_id), None)
|
| 226 |
if product:
|
| 227 |
user_id = callback_query.from_user.id
|
|
|
|
| 229 |
if not cart:
|
| 230 |
cart = {'user_id': user_id, 'items': [], 'date': datetime.now().isoformat()}
|
| 231 |
data['orders'].append(cart)
|
| 232 |
+
cart['items'].append({'product_id': product_id, 'quantity': quantity})
|
| 233 |
save_data(data)
|
| 234 |
await bot.answer_callback_query(callback_query.id, "Товар добавлен в корзину!")
|
| 235 |
+
else:
|
| 236 |
+
await bot.answer_callback_query(callback_query.id, "Товар не найден")
|
| 237 |
except Exception as e:
|
| 238 |
+
logger.error(f"Ошибка при добавлении товара с количеством: {e}")
|
| 239 |
await bot.answer_callback_query(callback_query.id, "Ошибка")
|
| 240 |
|
| 241 |
@dp.callback_query(F.data.startswith("complete_"))
|
|
|
|
| 388 |
<option value="{{ category.id }}">{{ category.name }}</option>
|
| 389 |
{% endfor %}
|
| 390 |
</select>
|
| 391 |
+
<!-- Разрешаем загрузку нескольких фото -->
|
| 392 |
+
<input type="file" name="photo" accept="image/*" multiple>
|
| 393 |
<button type="submit">Добавить товар</button>
|
| 394 |
</form>
|
| 395 |
<h3>Существующие товары</h3>
|
|
|
|
| 398 |
<div class="item">
|
| 399 |
{{ product.name }} - {{ product.price }} сом<br>
|
| 400 |
{{ product.description }}<br>
|
| 401 |
+
{% if product.photos and product.photos|length > 0 %}
|
| 402 |
+
{% for photo in product.photos %}
|
| 403 |
+
<img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ photo }}" alt="{{ product.name }}">
|
| 404 |
+
{% endfor %}
|
| 405 |
{% endif %}
|
| 406 |
<button onclick="deleteProduct({{ product.id }})">Удалить</button>
|
| 407 |
</div>
|
|
|
|
| 476 |
price = float(request.form['price'])
|
| 477 |
description = request.form['description']
|
| 478 |
category_id = int(request.form['category_id'])
|
| 479 |
+
photos = request.files.getlist('photo')
|
| 480 |
product_id = max((p['id'] for p in data['products']), default=0) + 1
|
| 481 |
|
| 482 |
+
photos_filenames = []
|
| 483 |
+
if photos:
|
| 484 |
+
# Обрабатываем до 3 фото
|
| 485 |
+
for photo in photos[:3]:
|
| 486 |
+
if photo and photo.filename:
|
| 487 |
+
photo_filename = secure_filename(photo.filename)
|
| 488 |
+
temp_path = os.path.join(".", photo_filename)
|
| 489 |
+
photo.save(temp_path)
|
| 490 |
+
api = HfApi()
|
| 491 |
+
api.upload_file(
|
| 492 |
+
path_or_fileobj=temp_path,
|
| 493 |
+
path_in_repo=f"photos/{photo_filename}",
|
| 494 |
+
repo_id=REPO_ID,
|
| 495 |
+
repo_type="dataset",
|
| 496 |
+
token=HF_TOKEN_WRITE,
|
| 497 |
+
commit_message=f"Добавлено фото для товара {name}"
|
| 498 |
+
)
|
| 499 |
+
os.remove(temp_path)
|
| 500 |
+
photos_filenames.append(photo_filename)
|
| 501 |
|
| 502 |
data['products'].append({
|
| 503 |
'id': product_id,
|
|
|
|
| 505 |
'price': price,
|
| 506 |
'description': description,
|
| 507 |
'category_id': category_id,
|
| 508 |
+
'photos': photos_filenames
|
| 509 |
})
|
| 510 |
save_data(data)
|
| 511 |
update_event.set()
|