flpolprojects commited on
Commit
ae1e5cc
·
verified ·
1 Parent(s): 7de5373

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -26
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 photo_url:
153
- await bot.send_photo(chat_id=callback_query.from_user.id, photo=photo_url, caption=caption, reply_markup=get_product_keyboard(product['id']))
 
 
 
 
 
 
 
 
 
 
 
 
 
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 add_to_cart(callback_query: types.CallbackQuery):
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': 1})
201
  save_data(data)
202
  await bot.answer_callback_query(callback_query.id, "Товар добавлен в корзину!")
 
 
203
  except Exception as e:
204
- logger.error(f"Ошибка при добавлении в корзину: {e}")
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
- <input type="file" name="photo" accept="image/*">
 
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.photo %}
367
- <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product.photo }}" alt="{{ product.name }}">
 
 
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
- photo = request.files.get('photo')
443
  product_id = max((p['id'] for p in data['products']), default=0) + 1
444
 
445
- photo_filename = None
446
- if photo and photo.filename:
447
- photo_filename = secure_filename(photo.filename)
448
- temp_path = os.path.join(".", photo_filename)
449
- photo.save(temp_path)
450
- api = HfApi()
451
- api.upload_file(
452
- path_or_fileobj=temp_path,
453
- path_in_repo=f"photos/{photo_filename}",
454
- repo_id=REPO_ID,
455
- repo_type="dataset",
456
- token=HF_TOKEN_WRITE,
457
- commit_message=f"Добавлено фото для товара {name}"
458
- )
459
- os.remove(temp_path)
 
 
 
 
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
- 'photo': photo_filename
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()