Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -951,7 +951,7 @@ def product_detail(index):
|
|
| 951 |
@app.route('/admin', methods=['GET', 'POST'])
|
| 952 |
def admin():
|
| 953 |
data = load_data()
|
| 954 |
-
products = data.get('products', [])
|
| 955 |
categories = data.get('categories', [])
|
| 956 |
|
| 957 |
if request.method == 'POST':
|
|
@@ -1047,18 +1047,12 @@ def admin():
|
|
| 1047 |
return redirect(url_for('admin'))
|
| 1048 |
|
| 1049 |
elif action == 'edit':
|
| 1050 |
-
|
| 1051 |
-
|
| 1052 |
-
|
| 1053 |
-
|
| 1054 |
-
|
| 1055 |
-
|
| 1056 |
-
if p.get('added_at') == product_id:
|
| 1057 |
-
product_to_edit = p
|
| 1058 |
-
break
|
| 1059 |
-
|
| 1060 |
-
if not product_to_edit:
|
| 1061 |
-
return "Ошибка: Товар с ID '{product_id}' не найден для редактирования.", 404
|
| 1062 |
|
| 1063 |
name = request.form.get('name', '').strip()
|
| 1064 |
price_str = request.form.get('price', '').strip()
|
|
@@ -1077,7 +1071,7 @@ def admin():
|
|
| 1077 |
except ValueError:
|
| 1078 |
return "Ошибка: Неверный формат цены. Используйте число (например, 150 или 150.50).", 400
|
| 1079 |
|
| 1080 |
-
new_photos_list =
|
| 1081 |
|
| 1082 |
if photos_files and any(f.filename for f in photos_files):
|
| 1083 |
new_photos_list = []
|
|
@@ -1110,30 +1104,26 @@ def admin():
|
|
| 1110 |
except OSError as e:
|
| 1111 |
logging.error(f"Ошибка при удалении временного файла {temp_path} при редактировании: {e}")
|
| 1112 |
|
| 1113 |
-
|
| 1114 |
-
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
|
| 1119 |
|
| 1120 |
save_data({'products': products, 'categories': categories})
|
| 1121 |
return redirect(url_for('admin'))
|
| 1122 |
|
| 1123 |
elif action == 'delete':
|
| 1124 |
-
product_id = request.form.get('product_id')
|
| 1125 |
-
if not product_id:
|
| 1126 |
-
return "Ошибка: ID товара не передан для удаления.", 400
|
| 1127 |
-
|
| 1128 |
-
original_length = len(products)
|
| 1129 |
-
products[:] = [p for p in products if p.get('added_at') != product_id]
|
| 1130 |
-
|
| 1131 |
-
if len(products) == original_length:
|
| 1132 |
-
logging.warning(f"Товар с ID '{product_id}' для удаления не найден.")
|
| 1133 |
-
return "Ошибка: Товар для удаления не найден.", 404
|
| 1134 |
-
|
| 1135 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1136 |
save_data({'products': products, 'categories': categories})
|
|
|
|
|
|
|
| 1137 |
except Exception as e:
|
| 1138 |
logging.error(f"Ошибка при удалении товара: {e}")
|
| 1139 |
return "Ошибка при удалении товара", 500
|
|
@@ -1442,7 +1432,6 @@ def admin():
|
|
| 1442 |
padding: 0;
|
| 1443 |
margin: 0;
|
| 1444 |
box-shadow: none;
|
| 1445 |
-
display: flex;
|
| 1446 |
}
|
| 1447 |
.button-group button,
|
| 1448 |
.button-group summary {
|
|
@@ -1565,8 +1554,7 @@ def admin():
|
|
| 1565 |
|
| 1566 |
<h2>Список товаров</h2>
|
| 1567 |
<div class="product-list">
|
| 1568 |
-
{%
|
| 1569 |
-
{% for product in sorted_admin_products %}
|
| 1570 |
<div class="product-item">
|
| 1571 |
<h3>{{ product['name'] }}</h3>
|
| 1572 |
<p><strong>Категория:</strong> {{ product.get('category', 'Без категории') }}</p>
|
|
@@ -1590,7 +1578,7 @@ def admin():
|
|
| 1590 |
<summary><i class="fas fa-edit"></i> Редактировать</summary>
|
| 1591 |
<form method="POST" enctype="multipart/form-data" class="edit-form">
|
| 1592 |
<input type="hidden" name="action" value="edit">
|
| 1593 |
-
<input type="hidden" name="
|
| 1594 |
<label for="edit-name-{{ loop.index0 }}">Название:</label>
|
| 1595 |
<input type="text" id="edit-name-{{ loop.index0 }}" name="name" value="{{ product['name'] }}" required>
|
| 1596 |
<label for="edit-price-{{ loop.index0 }}">Цена (с):</label>
|
|
@@ -1629,7 +1617,7 @@ def admin():
|
|
| 1629 |
</details>
|
| 1630 |
<form method="POST" onsubmit="return confirm('Вы уверены, что хотите удалить товар \'{{ product['name'] }}\'?');">
|
| 1631 |
<input type="hidden" name="action" value="delete">
|
| 1632 |
-
<input type="hidden" name="
|
| 1633 |
<button type="submit" class="delete-button"><i class="fas fa-trash-alt"></i> Удалить товар</button>
|
| 1634 |
</form>
|
| 1635 |
</div>
|
|
|
|
| 951 |
@app.route('/admin', methods=['GET', 'POST'])
|
| 952 |
def admin():
|
| 953 |
data = load_data()
|
| 954 |
+
products = sorted(data.get('products', []), key=lambda p: p.get('added_at', ''), reverse=True)
|
| 955 |
categories = data.get('categories', [])
|
| 956 |
|
| 957 |
if request.method == 'POST':
|
|
|
|
| 1047 |
return redirect(url_for('admin'))
|
| 1048 |
|
| 1049 |
elif action == 'edit':
|
| 1050 |
+
try:
|
| 1051 |
+
index = int(request.form.get('index'))
|
| 1052 |
+
if not 0 <= index < len(products):
|
| 1053 |
+
return "Ошибка: Неверный индекс товара для редактирования.", 400
|
| 1054 |
+
except (ValueError, TypeError):
|
| 1055 |
+
return "Ошибка: Неверный индекс товара.", 400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1056 |
|
| 1057 |
name = request.form.get('name', '').strip()
|
| 1058 |
price_str = request.form.get('price', '').strip()
|
|
|
|
| 1071 |
except ValueError:
|
| 1072 |
return "Ошибка: Неверный формат цены. Используйте число (например, 150 или 150.50).", 400
|
| 1073 |
|
| 1074 |
+
new_photos_list = products[index].get('photos', [])
|
| 1075 |
|
| 1076 |
if photos_files and any(f.filename for f in photos_files):
|
| 1077 |
new_photos_list = []
|
|
|
|
| 1104 |
except OSError as e:
|
| 1105 |
logging.error(f"Ошибка при удалении временного файла {temp_path} при редактировании: {e}")
|
| 1106 |
|
| 1107 |
+
products[index]['name'] = name
|
| 1108 |
+
products[index]['price'] = price_float
|
| 1109 |
+
products[index]['description'] = description
|
| 1110 |
+
products[index]['category'] = category if category in categories else 'Без категории'
|
| 1111 |
+
products[index]['photos'] = new_photos_list
|
| 1112 |
+
products[index]['colors'] = colors
|
| 1113 |
|
| 1114 |
save_data({'products': products, 'categories': categories})
|
| 1115 |
return redirect(url_for('admin'))
|
| 1116 |
|
| 1117 |
elif action == 'delete':
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1118 |
try:
|
| 1119 |
+
index = int(request.form.get('index'))
|
| 1120 |
+
if not 0 <= index < len(products):
|
| 1121 |
+
return "Ошибка: Неверный индекс товара для удаления.", 400
|
| 1122 |
+
|
| 1123 |
+
del products[index]
|
| 1124 |
save_data({'products': products, 'categories': categories})
|
| 1125 |
+
except (ValueError, TypeError):
|
| 1126 |
+
return "Ошибка: Неверный индекс товара.", 400
|
| 1127 |
except Exception as e:
|
| 1128 |
logging.error(f"Ошибка при удалении товара: {e}")
|
| 1129 |
return "Ошибка при удалении товара", 500
|
|
|
|
| 1432 |
padding: 0;
|
| 1433 |
margin: 0;
|
| 1434 |
box-shadow: none;
|
|
|
|
| 1435 |
}
|
| 1436 |
.button-group button,
|
| 1437 |
.button-group summary {
|
|
|
|
| 1554 |
|
| 1555 |
<h2>Список товаров</h2>
|
| 1556 |
<div class="product-list">
|
| 1557 |
+
{% for product in products %}
|
|
|
|
| 1558 |
<div class="product-item">
|
| 1559 |
<h3>{{ product['name'] }}</h3>
|
| 1560 |
<p><strong>Категория:</strong> {{ product.get('category', 'Без категории') }}</p>
|
|
|
|
| 1578 |
<summary><i class="fas fa-edit"></i> Редактировать</summary>
|
| 1579 |
<form method="POST" enctype="multipart/form-data" class="edit-form">
|
| 1580 |
<input type="hidden" name="action" value="edit">
|
| 1581 |
+
<input type="hidden" name="index" value="{{ loop.index0 }}">
|
| 1582 |
<label for="edit-name-{{ loop.index0 }}">Название:</label>
|
| 1583 |
<input type="text" id="edit-name-{{ loop.index0 }}" name="name" value="{{ product['name'] }}" required>
|
| 1584 |
<label for="edit-price-{{ loop.index0 }}">Цена (с):</label>
|
|
|
|
| 1617 |
</details>
|
| 1618 |
<form method="POST" onsubmit="return confirm('Вы уверены, что хотите удалить товар \'{{ product['name'] }}\'?');">
|
| 1619 |
<input type="hidden" name="action" value="delete">
|
| 1620 |
+
<input type="hidden" name="index" value="{{ loop.index0 }}">
|
| 1621 |
<button type="submit" class="delete-button"><i class="fas fa-trash-alt"></i> Удалить товар</button>
|
| 1622 |
</form>
|
| 1623 |
</div>
|