flpolprojects commited on
Commit
9425d2e
·
verified ·
1 Parent(s): 5a87e81

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +171 -56
app.py CHANGED
@@ -153,65 +153,120 @@ def catalog():
153
 
154
  @app.route('/admin', methods=['GET', 'POST'])
155
  def admin():
 
156
  if request.method == 'POST':
157
- name = request.form.get('name')
158
- price = request.form.get('price')
159
- description = request.form.get('description')
160
- photo = request.files.get('photo')
161
-
162
- logging.debug(f"Полученные данные из формы: name={name}, price={price}, description={description}")
163
-
164
- photo_filename = None
165
- if photo and photo.filename:
166
- photo_filename = secure_filename(photo.filename)
167
- # Сохраняем файл временно в папку uploads
168
- uploads_dir = 'uploads'
169
- os.makedirs(uploads_dir, exist_ok=True)
170
- temp_path = os.path.join(uploads_dir, photo_filename)
171
- photo.save(temp_path)
172
-
173
- # Загружаем фото в репозиторий в папку "photos"
174
- try:
175
- api = HfApi()
176
- api.upload_file(
177
- path_or_fileobj=temp_path,
178
- path_in_repo=f"photos/{photo_filename}",
179
- repo_id=REPO_ID,
180
- repo_type="dataset",
181
- token=HF_TOKEN_WRITE,
182
- commit_message=f"Добавлено фото для товара {name} {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
183
- )
184
- logging.info("Фото успешно загружено в репозиторий.")
185
- except Exception as e:
186
- logging.error(f"Ошибка при загрузке фото: {e}")
187
- return f"Ошибка при загрузке фото: {e}", 500
188
- finally:
189
- # Удаляем временный файл
190
- os.remove(temp_path)
191
-
192
- if name and price and description:
193
- try:
194
- price = float(price.replace(',', '.'))
195
- except ValueError:
196
- logging.error("Ошибка: Цена должна быть числом.")
197
- return "Ошибка: Цена должна быть числом.", 400
198
-
199
- products = load_data()
200
- product_entry = {
201
- 'name': name,
202
- 'price': price,
203
- 'description': description
204
- }
205
- if photo_filename:
206
- product_entry['photo'] = photo_filename
 
 
207
 
208
- products.append(product_entry)
 
 
 
 
 
 
 
 
 
209
 
210
- try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  save_data(products)
212
- except Exception as e:
213
- return f"Ошибка при сохранении данных: {e}", 500
214
 
 
 
 
 
215
  return redirect(url_for('admin'))
216
 
217
  admin_html = '''
@@ -236,6 +291,7 @@ def admin():
236
  border: 1px solid #ddd;
237
  border-radius: 5px;
238
  max-width: 400px;
 
239
  }
240
  label {
241
  display: block;
@@ -261,11 +317,29 @@ def admin():
261
  button:hover {
262
  background-color: #218838;
263
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  </style>
265
  </head>
266
  <body>
267
  <h1>Добавление товара</h1>
268
  <form method="POST" enctype="multipart/form-data">
 
269
  <label for="name">Название товара:</label>
270
  <input type="text" id="name" name="name" required>
271
 
@@ -292,10 +366,51 @@ def admin():
292
  <button type="submit">Скачать базу данных</button>
293
  </form>
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  </body>
296
  </html>
297
  '''
298
- return render_template_string(admin_html)
299
 
300
  @app.route('/backup', methods=['POST'])
301
  def backup():
@@ -322,4 +437,4 @@ if __name__ == '__main__':
322
  # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
323
  # Например: save_data([])
324
 
325
- app.run(debug=True, host='0.0.0.0', port=7860)
 
153
 
154
  @app.route('/admin', methods=['GET', 'POST'])
155
  def admin():
156
+ products = load_data()
157
  if request.method == 'POST':
158
+ action = request.form.get('action')
159
+
160
+ if action == 'add':
161
+ name = request.form.get('name')
162
+ price = request.form.get('price')
163
+ description = request.form.get('description')
164
+ photo = request.files.get('photo')
165
+
166
+ logging.debug(f"Полученные данные из формы: name={name}, price={price}, description={description}")
167
+
168
+ photo_filename = None
169
+ if photo and photo.filename:
170
+ photo_filename = secure_filename(photo.filename)
171
+ # Сохраняем файл временно в папку uploads
172
+ uploads_dir = 'uploads'
173
+ os.makedirs(uploads_dir, exist_ok=True)
174
+ temp_path = os.path.join(uploads_dir, photo_filename)
175
+ photo.save(temp_path)
176
+
177
+ # Загружаем фото в репозиторий в папку "photos"
178
+ try:
179
+ api = HfApi()
180
+ api.upload_file(
181
+ path_or_fileobj=temp_path,
182
+ path_in_repo=f"photos/{photo_filename}",
183
+ repo_id=REPO_ID,
184
+ repo_type="dataset",
185
+ token=HF_TOKEN_WRITE,
186
+ commit_message=f"Добавлено фото для товара {name} {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
187
+ )
188
+ logging.info("Фото успешно загружено в репозиторий.")
189
+ except Exception as e:
190
+ logging.error(f"Ошибка при загрузке фото: {e}")
191
+ return f"Ошибка при загрузке фото: {e}", 500
192
+ finally:
193
+ # Удаляем временный файл
194
+ os.remove(temp_path)
195
+
196
+ if name and price and description:
197
+ try:
198
+ price = float(price.replace(',', '.'))
199
+ except ValueError:
200
+ logging.error("Ошибка: Цена должна быть числом.")
201
+ return "Ошибка: Цена должна быть числом.", 400
202
+
203
+ product_entry = {
204
+ 'name': name,
205
+ 'price': price,
206
+ 'description': description
207
+ }
208
+ if photo_filename:
209
+ product_entry['photo'] = photo_filename
210
 
211
+ products.append(product_entry)
212
+ save_data(products)
213
+ return redirect(url_for('admin'))
214
+
215
+ elif action == 'edit':
216
+ index = int(request.form.get('index'))
217
+ name = request.form.get('name')
218
+ price = request.form.get('price')
219
+ description = request.form.get('description')
220
+ photo = request.files.get('photo')
221
 
222
+ photo_filename = None
223
+ if photo and photo.filename:
224
+ photo_filename = secure_filename(photo.filename)
225
+ # Сохраняем файл временно в папку uploads
226
+ uploads_dir = 'uploads'
227
+ os.makedirs(uploads_dir, exist_ok=True)
228
+ temp_path = os.path.join(uploads_dir, photo_filename)
229
+ photo.save(temp_path)
230
+
231
+ # Загружаем фото в репозиторий в папку "photos"
232
+ try:
233
+ api = HfApi()
234
+ api.upload_file(
235
+ path_or_fileobj=temp_path,
236
+ path_in_repo=f"photos/{photo_filename}",
237
+ repo_id=REPO_ID,
238
+ repo_type="dataset",
239
+ token=HF_TOKEN_WRITE,
240
+ commit_message=f"Обновлено фото для товара {name} {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
241
+ )
242
+ logging.info("Фото успешно обновлено в репозитории.")
243
+ except Exception as e:
244
+ logging.error(f"Ошибка при загрузке фото: {e}")
245
+ return f"Ошибка при загрузке фото: {e}", 500
246
+ finally:
247
+ # Удаляем временный файл
248
+ os.remove(temp_path)
249
+
250
+ if name and price and description:
251
+ try:
252
+ price = float(price.replace(',', '.'))
253
+ except ValueError:
254
+ logging.error("Ошибка: Цена должна быть числом.")
255
+ return "Ошибка: Цена должна быть числом.", 400
256
+
257
+ products[index]['name'] = name
258
+ products[index]['price'] = price
259
+ products[index]['description'] = description
260
+ if photo_filename:
261
+ products[index]['photo'] = photo_filename
262
+
263
  save_data(products)
264
+ return redirect(url_for('admin'))
 
265
 
266
+ elif action == 'delete':
267
+ index = int(request.form.get('index'))
268
+ del products[index]
269
+ save_data(products)
270
  return redirect(url_for('admin'))
271
 
272
  admin_html = '''
 
291
  border: 1px solid #ddd;
292
  border-radius: 5px;
293
  max-width: 400px;
294
+ margin-bottom: 20px;
295
  }
296
  label {
297
  display: block;
 
317
  button:hover {
318
  background-color: #218838;
319
  }
320
+ .product-list {
321
+ margin-top: 20px;
322
+ }
323
+ .product-item {
324
+ background-color: #fff;
325
+ border: 1px solid #ddd;
326
+ padding: 15px;
327
+ margin-bottom: 10px;
328
+ border-radius: 5px;
329
+ }
330
+ .edit-form {
331
+ margin-top: 10px;
332
+ padding: 10px;
333
+ border: 1px solid #ddd;
334
+ border-radius: 5px;
335
+ background-color: #f9f9f9;
336
+ }
337
  </style>
338
  </head>
339
  <body>
340
  <h1>Добавление товара</h1>
341
  <form method="POST" enctype="multipart/form-data">
342
+ <input type="hidden" name="action" value="add">
343
  <label for="name">Название товара:</label>
344
  <input type="text" id="name" name="name" required>
345
 
 
366
  <button type="submit">Скачать базу данных</button>
367
  </form>
368
 
369
+ <h2>Список товаров</h2>
370
+ <div class="product-list">
371
+ {% for i, product in enumerate(products) %}
372
+ <div class="product-item">
373
+ <h3>{{ product['name'] }}</h3>
374
+ <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
375
+ <p><strong>Описание:</strong> {{ product['description'] }}</p>
376
+ {% if product.get('photo') %}
377
+ <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}" style="max-width: 100px;">
378
+ {% endif %}
379
+
380
+ <details>
381
+ <summary>Редактировать</summary>
382
+ <form method="POST" enctype="multipart/form-data" class="edit-form">
383
+ <input type="hidden" name="action" value="edit">
384
+ <input type="hidden" name="index" value="{{ i }}">
385
+ <label for="name">Название товара:</label>
386
+ <input type="text" id="name" name="name" value="{{ product['name'] }}" required>
387
+
388
+ <label for="price">Цена:</label>
389
+ <input type="number" id="price" name="price" step="0.01" value="{{ product['price'] }}" required>
390
+
391
+ <label for="description">Описание:</label>
392
+ <textarea id="description" name="description" rows="4" required>{{ product['description'] }}</textarea>
393
+
394
+ <label for="photo">Фотография товара (необязательно):</label>
395
+ <input type="file" id="photo" name="photo" accept="image/*">
396
+
397
+ <button type="submit">Сохранить изменения</button>
398
+ </form>
399
+ </details>
400
+
401
+ <form method="POST">
402
+ <input type="hidden" name="action" value="delete">
403
+ <input type="hidden" name="index" value="{{ i }}">
404
+ <button type="submit">Удалить</button>
405
+ </form>
406
+ </div>
407
+ {% endfor %}
408
+ </div>
409
+
410
  </body>
411
  </html>
412
  '''
413
+ return render_template_string(admin_html, products=products, repo_id=REPO_ID)
414
 
415
  @app.route('/backup', methods=['POST'])
416
  def backup():
 
437
  # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
438
  # Например: save_data([])
439
 
440
+ app.run(debug=True, host='0.0.0.0', port=7860)