Update app.py
Browse files
app.py
CHANGED
|
@@ -27,7 +27,7 @@ def load_data():
|
|
| 27 |
data = json.load(file)
|
| 28 |
logging.info("Данные успешно загружены из JSON")
|
| 29 |
if not isinstance(data, dict) or 'products' not in data or 'categories' not in data:
|
| 30 |
-
return {'products': [], 'categories': []}
|
| 31 |
return data
|
| 32 |
except FileNotFoundError:
|
| 33 |
logging.warning("Локальный файл базы данных не найден после скачивания.")
|
|
@@ -2377,7 +2377,7 @@ def favorites_page():
|
|
| 2377 |
const cartContent = document.getElementById('cartContent');
|
| 2378 |
let total = 0;
|
| 2379 |
|
| 2380 |
-
cartContent.innerHTML = cart.length === 0 ? '<p>Корзина пуста</p>' : cart.map(item => {
|
| 2381 |
const itemTotal = item.price * item.quantity;
|
| 2382 |
total += itemTotal;
|
| 2383 |
return `
|
|
@@ -2836,9 +2836,9 @@ def discounts_page():
|
|
| 2836 |
</div>
|
| 2837 |
<div class="products-grid" id="products-grid">
|
| 2838 |
{% for product in products %}
|
| 2839 |
-
<div class="product"
|
| 2840 |
onclick="openModal({{ loop.index0 }})"
|
| 2841 |
-
data-name="{{ product['name']|lower }}"
|
| 2842 |
data-description="{{ product['description']|lower }}"
|
| 2843 |
data-category="{{ product.get('category', 'Без категории') }}">
|
| 2844 |
<button class="favorite-button" onclick="event.stopPropagation(); toggleFavorite({{ loop.index0 }})">
|
|
@@ -2846,8 +2846,8 @@ def discounts_page():
|
|
| 2846 |
</button>
|
| 2847 |
{% if product.get('photos') and product['photos']|length > 0 %}
|
| 2848 |
<div class="product-image">
|
| 2849 |
-
<img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photos'][0] }}"
|
| 2850 |
-
alt="{{ product['name'] }}"
|
| 2851 |
loading="lazy">
|
| 2852 |
</div>
|
| 2853 |
{% endif %}
|
|
@@ -3277,26 +3277,33 @@ def admin():
|
|
| 3277 |
|
| 3278 |
if request.method == 'POST':
|
| 3279 |
action = request.form.get('action')
|
| 3280 |
-
|
| 3281 |
if action == 'add':
|
| 3282 |
photos = request.files.getlist('photos')
|
| 3283 |
photo_filenames = []
|
| 3284 |
for photo in photos:
|
| 3285 |
if photo and photo.filename:
|
| 3286 |
filename = secure_filename(photo.filename)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3287 |
api = HfApi()
|
| 3288 |
api.upload_file(
|
| 3289 |
-
path_or_fileobj=
|
| 3290 |
path_in_repo=f"photos/{filename}",
|
| 3291 |
repo_id=REPO_ID,
|
| 3292 |
repo_type="dataset",
|
| 3293 |
token=HF_TOKEN_WRITE
|
| 3294 |
)
|
| 3295 |
photo_filenames.append(filename)
|
| 3296 |
-
|
|
|
|
| 3297 |
colors = request.form.getlist('colors')
|
| 3298 |
colors = [color.strip() for color in colors if color.strip()]
|
| 3299 |
-
|
| 3300 |
new_product = {
|
| 3301 |
'name': request.form['name'],
|
| 3302 |
'price': float(request.form['price']),
|
|
@@ -3309,27 +3316,35 @@ def admin():
|
|
| 3309 |
'discount': float(request.form['discount']) if request.form['discount'] else None
|
| 3310 |
}
|
| 3311 |
products.append(new_product)
|
| 3312 |
-
|
| 3313 |
elif action == 'edit':
|
| 3314 |
index = int(request.form['index'])
|
| 3315 |
photos = request.files.getlist('photos')
|
| 3316 |
photo_filenames = products[index].get('photos', []) # Keep existing photos
|
|
|
|
| 3317 |
for photo in photos:
|
| 3318 |
if photo and photo.filename:
|
| 3319 |
filename = secure_filename(photo.filename)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3320 |
api = HfApi()
|
| 3321 |
api.upload_file(
|
| 3322 |
-
path_or_fileobj=
|
| 3323 |
path_in_repo=f"photos/{filename}",
|
| 3324 |
repo_id=REPO_ID,
|
| 3325 |
repo_type="dataset",
|
| 3326 |
token=HF_TOKEN_WRITE
|
| 3327 |
)
|
| 3328 |
photo_filenames.append(filename) # Add new photos
|
| 3329 |
-
|
|
|
|
| 3330 |
colors = request.form.getlist('colors')
|
| 3331 |
colors = [color.strip() for color in colors if color.strip()]
|
| 3332 |
-
|
| 3333 |
products[index] = {
|
| 3334 |
'name': request.form['name'],
|
| 3335 |
'price': float(request.form['price']),
|
|
@@ -3341,7 +3356,7 @@ def admin():
|
|
| 3341 |
'photos': photo_filenames, # Updated photo list
|
| 3342 |
'discount': float(request.form['discount']) if request.form['discount'] else None
|
| 3343 |
}
|
| 3344 |
-
|
| 3345 |
elif action == 'delete':
|
| 3346 |
index = int(request.form['index'])
|
| 3347 |
# Delete photos from Hugging Face Hub before deleting the product
|
|
@@ -3360,12 +3375,12 @@ def admin():
|
|
| 3360 |
logging.error(f"Error deleting photo {photo}: {e}")
|
| 3361 |
products.pop(index)
|
| 3362 |
|
| 3363 |
-
|
| 3364 |
elif action == 'add_category':
|
| 3365 |
category = request.form['category_name'].strip()
|
| 3366 |
if category and category not in categories:
|
| 3367 |
categories.append(category)
|
| 3368 |
-
|
| 3369 |
elif action == 'delete_category':
|
| 3370 |
index = int(request.form['category_index'])
|
| 3371 |
category_to_delete = categories[index]
|
|
@@ -3374,7 +3389,7 @@ def admin():
|
|
| 3374 |
for product in products:
|
| 3375 |
if product.get('category') == category_to_delete:
|
| 3376 |
product['category'] = 'Без категории'
|
| 3377 |
-
|
| 3378 |
save_data({'products': products, 'categories': categories})
|
| 3379 |
return redirect(url_for('admin'))
|
| 3380 |
|
|
@@ -3596,8 +3611,8 @@ def admin():
|
|
| 3596 |
</div>
|
| 3597 |
<div class="product-list" id="product-list">
|
| 3598 |
{% for product in products %}
|
| 3599 |
-
<div class="product-item"
|
| 3600 |
-
data-name="{{ product['name']|lower }}"
|
| 3601 |
data-description="{{ product['description']|lower }}"
|
| 3602 |
data-category="{{ product.get('category', 'Без категории') }}">
|
| 3603 |
<h2>{{ product['name'] }}</h2>
|
|
|
|
| 27 |
data = json.load(file)
|
| 28 |
logging.info("Данные успешно загружены из JSON")
|
| 29 |
if not isinstance(data, dict) or 'products' not in data or 'categories' not in data:
|
| 30 |
+
return {'products': [], 'categories': []}
|
| 31 |
return data
|
| 32 |
except FileNotFoundError:
|
| 33 |
logging.warning("Локальный файл базы данных не найден после скачивания.")
|
|
|
|
| 2377 |
const cartContent = document.getElementById('cartContent');
|
| 2378 |
let total = 0;
|
| 2379 |
|
| 2380 |
+
cartContent.innerHTML = cart.length === 0 ? '<p>Корзина пуста</p>' : cart.map(item => {
|
| 2381 |
const itemTotal = item.price * item.quantity;
|
| 2382 |
total += itemTotal;
|
| 2383 |
return `
|
|
|
|
| 2836 |
</div>
|
| 2837 |
<div class="products-grid" id="products-grid">
|
| 2838 |
{% for product in products %}
|
| 2839 |
+
<div class="product"
|
| 2840 |
onclick="openModal({{ loop.index0 }})"
|
| 2841 |
+
data-name="{{ product['name']|lower }}"
|
| 2842 |
data-description="{{ product['description']|lower }}"
|
| 2843 |
data-category="{{ product.get('category', 'Без категории') }}">
|
| 2844 |
<button class="favorite-button" onclick="event.stopPropagation(); toggleFavorite({{ loop.index0 }})">
|
|
|
|
| 2846 |
</button>
|
| 2847 |
{% if product.get('photos') and product['photos']|length > 0 %}
|
| 2848 |
<div class="product-image">
|
| 2849 |
+
<img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photos'][0] }}"
|
| 2850 |
+
alt="{{ product['name'] }}"
|
| 2851 |
loading="lazy">
|
| 2852 |
</div>
|
| 2853 |
{% endif %}
|
|
|
|
| 3277 |
|
| 3278 |
if request.method == 'POST':
|
| 3279 |
action = request.form.get('action')
|
| 3280 |
+
|
| 3281 |
if action == 'add':
|
| 3282 |
photos = request.files.getlist('photos')
|
| 3283 |
photo_filenames = []
|
| 3284 |
for photo in photos:
|
| 3285 |
if photo and photo.filename:
|
| 3286 |
filename = secure_filename(photo.filename)
|
| 3287 |
+
# Создаем временный файл
|
| 3288 |
+
uploads_dir = "uploads"
|
| 3289 |
+
os.makedirs(uploads_dir, exist_ok=True) # Создаем директорию, если её нет
|
| 3290 |
+
temp_path = os.path.join(uploads_dir, filename)
|
| 3291 |
+
photo.save(temp_path)
|
| 3292 |
+
|
| 3293 |
api = HfApi()
|
| 3294 |
api.upload_file(
|
| 3295 |
+
path_or_fileobj=temp_path, # Передаем путь к временному файлу
|
| 3296 |
path_in_repo=f"photos/{filename}",
|
| 3297 |
repo_id=REPO_ID,
|
| 3298 |
repo_type="dataset",
|
| 3299 |
token=HF_TOKEN_WRITE
|
| 3300 |
)
|
| 3301 |
photo_filenames.append(filename)
|
| 3302 |
+
os.remove(temp_path) # Удаляем временный файл
|
| 3303 |
+
|
| 3304 |
colors = request.form.getlist('colors')
|
| 3305 |
colors = [color.strip() for color in colors if color.strip()]
|
| 3306 |
+
|
| 3307 |
new_product = {
|
| 3308 |
'name': request.form['name'],
|
| 3309 |
'price': float(request.form['price']),
|
|
|
|
| 3316 |
'discount': float(request.form['discount']) if request.form['discount'] else None
|
| 3317 |
}
|
| 3318 |
products.append(new_product)
|
| 3319 |
+
|
| 3320 |
elif action == 'edit':
|
| 3321 |
index = int(request.form['index'])
|
| 3322 |
photos = request.files.getlist('photos')
|
| 3323 |
photo_filenames = products[index].get('photos', []) # Keep existing photos
|
| 3324 |
+
|
| 3325 |
for photo in photos:
|
| 3326 |
if photo and photo.filename:
|
| 3327 |
filename = secure_filename(photo.filename)
|
| 3328 |
+
# Создаем временный файл
|
| 3329 |
+
uploads_dir = "uploads"
|
| 3330 |
+
os.makedirs(uploads_dir, exist_ok=True)
|
| 3331 |
+
temp_path = os.path.join(uploads_dir, filename)
|
| 3332 |
+
photo.save(temp_path)
|
| 3333 |
+
|
| 3334 |
api = HfApi()
|
| 3335 |
api.upload_file(
|
| 3336 |
+
path_or_fileobj=temp_path, # Передаем путь к временному файлу
|
| 3337 |
path_in_repo=f"photos/{filename}",
|
| 3338 |
repo_id=REPO_ID,
|
| 3339 |
repo_type="dataset",
|
| 3340 |
token=HF_TOKEN_WRITE
|
| 3341 |
)
|
| 3342 |
photo_filenames.append(filename) # Add new photos
|
| 3343 |
+
os.remove(temp_path) # Удаляем временный файл
|
| 3344 |
+
|
| 3345 |
colors = request.form.getlist('colors')
|
| 3346 |
colors = [color.strip() for color in colors if color.strip()]
|
| 3347 |
+
|
| 3348 |
products[index] = {
|
| 3349 |
'name': request.form['name'],
|
| 3350 |
'price': float(request.form['price']),
|
|
|
|
| 3356 |
'photos': photo_filenames, # Updated photo list
|
| 3357 |
'discount': float(request.form['discount']) if request.form['discount'] else None
|
| 3358 |
}
|
| 3359 |
+
|
| 3360 |
elif action == 'delete':
|
| 3361 |
index = int(request.form['index'])
|
| 3362 |
# Delete photos from Hugging Face Hub before deleting the product
|
|
|
|
| 3375 |
logging.error(f"Error deleting photo {photo}: {e}")
|
| 3376 |
products.pop(index)
|
| 3377 |
|
| 3378 |
+
|
| 3379 |
elif action == 'add_category':
|
| 3380 |
category = request.form['category_name'].strip()
|
| 3381 |
if category and category not in categories:
|
| 3382 |
categories.append(category)
|
| 3383 |
+
|
| 3384 |
elif action == 'delete_category':
|
| 3385 |
index = int(request.form['category_index'])
|
| 3386 |
category_to_delete = categories[index]
|
|
|
|
| 3389 |
for product in products:
|
| 3390 |
if product.get('category') == category_to_delete:
|
| 3391 |
product['category'] = 'Без категории'
|
| 3392 |
+
|
| 3393 |
save_data({'products': products, 'categories': categories})
|
| 3394 |
return redirect(url_for('admin'))
|
| 3395 |
|
|
|
|
| 3611 |
</div>
|
| 3612 |
<div class="product-list" id="product-list">
|
| 3613 |
{% for product in products %}
|
| 3614 |
+
<div class="product-item"
|
| 3615 |
+
data-name="{{ product['name']|lower }}"
|
| 3616 |
data-description="{{ product['description']|lower }}"
|
| 3617 |
data-category="{{ product.get('category', 'Без категории') }}">
|
| 3618 |
<h2>{{ product['name'] }}</h2>
|